commit 250f4f4b8f2b09773eef35be24149f67ddae9e87 Author: Kincses Date: Wed Mar 4 02:03:03 2026 +0100 Initial commit: Robot ökoszisztéma v2.0 - Stabilizált jármű és szerviz robotok diff --git a/.env_old b/.env_old new file mode 100755 index 0000000..8d67dc9 --- /dev/null +++ b/.env_old @@ -0,0 +1,114 @@ +COMPOSE_PROJECT_NAME=service_finder + +# --- ADATBÁZIS KAPCSOLAT (Központi) --- +# Itt a 'shared-postgres' nevet használjuk, ami a központi konténer neve +APP_DB_HOST=shared-postgres +APP_DB_PORT=5432 +APP_DB_NAME=service_finder +APP_DB_USER=service_finder_app +# IDE ÍRD AZT A JELSZÓT, amit a pgAdminban/ALTER USER parancsnál adtál a 'service_finder_app'-nak! +APP_DB_PASSWORD='MiskociA74' + +# Ez a legfontosabb sor, ezt használja a Python program: +DATABASE_URL=postgresql+asyncpg://service_finder_app:MiskociA74@shared-postgres:5432/service_finder +# Migrációhoz (néha szinkron driver kell): +MIGRATION_DATABASE_URL=postgresql+asyncpg://service_finder_app:MiskociA74@shared-postgres:5432/service_finder + +# --- ALKALMAZÁS BEÁLLÍTÁSOK --- +ALLOWED_ORIGINS="https://app.profibot.hu,https://dev.profibot.hu,http://localhost:3000" +PYTHONPATH=/app + +# --- MINIO (Fájltárolás) --- +# Ez maradhat helyi konténer, vagy köthetjük a központihoz is, de most hagyjuk a projektben +MINIO_ENDPOINT=minio:9000 +MINIO_ROOT_USER=kincses +MINIO_ROOT_PASSWORD='MiskociA74' +MINIO_ACCESS_KEY=kincses +MINIO_SECRET_KEY='MiskociA74' + +# --- EGYÉB API KULCSOK --- +SENDGRID_API_KEY=SG.SENDGRID_API_KEY=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 +FROM_EMAIL=info@profibot.hu + +# Biztonsági kulcs a tokenekhez (KÖTELEZŐ!) +SECRET_KEY=2dca2ff3bf9b8184e14038d5d08e646b31bd4a5f5ffc7e19d28e294f3bb3760b +_______________________________________________________________ +# ============================================================================== +# 🛠️ INFRASTRUKTÚRA (Docker & Database) +# ============================================================================== +# Adatbázis alapok +POSTGRES_USER=kincses +POSTGRES_PASSWORD='MiskociA74' +POSTGRES_DB=service_finder + +# Kapcsolati URL a Python számára (Központi shared-postgres) +DATABASE_URL=postgresql+asyncpg://service_finder_app:MiskociA74@shared-postgres:5432/service_finder + +# Migrációhoz használt URL (Alembic számára) +MIGRATION_DATABASE_URL=postgresql+asyncpg://service_finder_app:MiskociA74@shared-postgres:5432/service_finder + +# Redis elérés +REDIS_URL=redis://service_finder_redis:6379/0 + +# ============================================================================== +# 🚀 ALKALMAZÁS BEÁLLÍTÁSOK (FastAPI) +# ============================================================================== +ENV=development +DEBUG=True +PYTHONPATH=/app + +# Biztonsági kulcs a JWT tokenekhez (Generálj egy hosszú véletlen sort!) +# Példa generáláshoz: openssl rand -hex 32 +SECRET_KEY='2dca2ff3bf9b8184e14038d5d08e646b31bd4a5f5ffc7e19d28e294f3bb3760b' +ALGORITHM=HS256 + +# CORS: Milyen címekről érhető el az API? (Vesszővel elválasztva) +CORS_ORIGINS=https://app.profibot.hu,https://dev.profibot.hu,http://localhost:3000,http://192.168.100.10:3000 + +# Frontend címe a kiküldött linkekhez (Visszaigazolás, jelszó-visszaállítás) +FRONTEND_BASE_URL=http://192.168.100.10:3000 + +# ============================================================================== +# 📧 EMAIL RENDSZER (SMTP / SendGrid) +# ============================================================================== +# EMAIL_PROVIDER lehet: 'smtp' vagy 'sendgrid' vagy 'disabled' +EMAIL_PROVIDER=sendgrid +EMAILS_FROM_EMAIL=info@profibot.hu +EMAILS_FROM_NAME='Service Finder' + +# SendGrid beállítások +SENDGRID_API_KEY=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 + +# SMTP Fallback (Csak ha az EMAIL_PROVIDER=smtp) +SMTP_HOST=smtp.gmail.com +SMTP_PORT=587 +SMTP_USER=info@profibot.hu +SMTP_PASSWORD='SAJÁT_APP_PASSWORD' + +# ============================================================================== +# 📦 MINIO (Fájltárolás - NAS-ra kivezetve) +# ============================================================================== +MINIO_ENDPOINT=minio:9000 +MINIO_ROOT_USER=kincses +MINIO_ROOT_PASSWORD='MiskociA74' +MINIO_ACCESS_KEY=kincses +MINIO_SECRET_KEY='MiskociA74' + +# --- n8n CONFIG --- +N8N_DB_PASSWORD=MiskociA74 +# Az n8n-en belül a központi DB elérése: +# Host: shared-postgres +# User: service_finder_app + +# --- Frontend --- +FRONTEND_BASE_URL=https://dev.profibot.hu/docs + + + +# Holland autó adatbázis free token +RDW_APP_TOKEN=kSMUn0tvnmoM6TMSegLpFvKI8 + +# gemini service_finder_robot +GEMINI_API_KEY=AIzaSyAaCVNPwf8PCphu_pt6spjAa2OVu8Exug8 + +DeepSeek API key = sk-1871b668aac44b50859ee6c54fe95e21 \ No newline at end of file diff --git a/.git_disabled/COMMIT_EDITMSG b/.git_disabled/COMMIT_EDITMSG new file mode 100755 index 0000000..e6cb440 --- /dev/null +++ b/.git_disabled/COMMIT_EDITMSG @@ -0,0 +1 @@ +Dokumentáció hozzáadva diff --git a/.git_disabled/HEAD b/.git_disabled/HEAD new file mode 100755 index 0000000..b870d82 --- /dev/null +++ b/.git_disabled/HEAD @@ -0,0 +1 @@ +ref: refs/heads/main diff --git a/.git_disabled/ORIG_HEAD b/.git_disabled/ORIG_HEAD new file mode 100755 index 0000000..c4d61b2 --- /dev/null +++ b/.git_disabled/ORIG_HEAD @@ -0,0 +1 @@ +5757754aae85250910996dda70d43bf9fe191e38 diff --git a/.git_disabled/config b/.git_disabled/config new file mode 100755 index 0000000..37b45f8 --- /dev/null +++ b/.git_disabled/config @@ -0,0 +1,14 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[remote "origin"] + url = http://192.168.100.10:3000/kincses/service-finder.git + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "main"] + remote = origin + merge = refs/heads/main +[user] + email = kincses@profibot.hu + name = Kincses diff --git a/.git_disabled/description b/.git_disabled/description new file mode 100755 index 0000000..498b267 --- /dev/null +++ b/.git_disabled/description @@ -0,0 +1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff --git a/.git_disabled/hooks/applypatch-msg.sample b/.git_disabled/hooks/applypatch-msg.sample new file mode 100755 index 0000000..a5d7b84 --- /dev/null +++ b/.git_disabled/hooks/applypatch-msg.sample @@ -0,0 +1,15 @@ +#!/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +commitmsg="$(git rev-parse --git-path hooks/commit-msg)" +test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"} +: diff --git a/.git_disabled/hooks/commit-msg.sample b/.git_disabled/hooks/commit-msg.sample new file mode 100755 index 0000000..b58d118 --- /dev/null +++ b/.git_disabled/hooks/commit-msg.sample @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +} diff --git a/.git_disabled/hooks/fsmonitor-watchman.sample b/.git_disabled/hooks/fsmonitor-watchman.sample new file mode 100755 index 0000000..23e856f --- /dev/null +++ b/.git_disabled/hooks/fsmonitor-watchman.sample @@ -0,0 +1,174 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use IPC::Open2; + +# An example hook script to integrate Watchman +# (https://facebook.github.io/watchman/) with git to speed up detecting +# new and modified files. +# +# The hook is passed a version (currently 2) and last update token +# formatted as a string and outputs to stdout a new update token and +# all files that have been modified since the update token. Paths must +# be relative to the root of the working tree and separated by a single NUL. +# +# To enable this hook, rename this file to "query-watchman" and set +# 'git config core.fsmonitor .git/hooks/query-watchman' +# +my ($version, $last_update_token) = @ARGV; + +# Uncomment for debugging +# print STDERR "$0 $version $last_update_token\n"; + +# Check the hook interface version +if ($version ne 2) { + die "Unsupported query-fsmonitor hook version '$version'.\n" . + "Falling back to scanning...\n"; +} + +my $git_work_tree = get_working_dir(); + +my $retry = 1; + +my $json_pkg; +eval { + require JSON::XS; + $json_pkg = "JSON::XS"; + 1; +} or do { + require JSON::PP; + $json_pkg = "JSON::PP"; +}; + +launch_watchman(); + +sub launch_watchman { + my $o = watchman_query(); + if (is_work_tree_watched($o)) { + output_result($o->{clock}, @{$o->{files}}); + } +} + +sub output_result { + my ($clockid, @files) = @_; + + # Uncomment for debugging watchman output + # open (my $fh, ">", ".git/watchman-output.out"); + # binmode $fh, ":utf8"; + # print $fh "$clockid\n@files\n"; + # close $fh; + + binmode STDOUT, ":utf8"; + print $clockid; + print "\0"; + local $, = "\0"; + print @files; +} + +sub watchman_clock { + my $response = qx/watchman clock "$git_work_tree"/; + die "Failed to get clock id on '$git_work_tree'.\n" . + "Falling back to scanning...\n" if $? != 0; + + return $json_pkg->new->utf8->decode($response); +} + +sub watchman_query { + my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty') + or die "open2() failed: $!\n" . + "Falling back to scanning...\n"; + + # In the query expression below we're asking for names of files that + # changed since $last_update_token but not from the .git folder. + # + # To accomplish this, we're using the "since" generator to use the + # recency index to select candidate nodes and "fields" to limit the + # output to file names only. Then we're using the "expression" term to + # further constrain the results. + my $last_update_line = ""; + if (substr($last_update_token, 0, 1) eq "c") { + $last_update_token = "\"$last_update_token\""; + $last_update_line = qq[\n"since": $last_update_token,]; + } + my $query = <<" END"; + ["query", "$git_work_tree", {$last_update_line + "fields": ["name"], + "expression": ["not", ["dirname", ".git"]] + }] + END + + # Uncomment for debugging the watchman query + # open (my $fh, ">", ".git/watchman-query.json"); + # print $fh $query; + # close $fh; + + print CHLD_IN $query; + close CHLD_IN; + my $response = do {local $/; }; + + # Uncomment for debugging the watch response + # open ($fh, ">", ".git/watchman-response.json"); + # print $fh $response; + # close $fh; + + die "Watchman: command returned no output.\n" . + "Falling back to scanning...\n" if $response eq ""; + die "Watchman: command returned invalid output: $response\n" . + "Falling back to scanning...\n" unless $response =~ /^\{/; + + return $json_pkg->new->utf8->decode($response); +} + +sub is_work_tree_watched { + my ($output) = @_; + my $error = $output->{error}; + if ($retry > 0 and $error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) { + $retry--; + my $response = qx/watchman watch "$git_work_tree"/; + die "Failed to make watchman watch '$git_work_tree'.\n" . + "Falling back to scanning...\n" if $? != 0; + $output = $json_pkg->new->utf8->decode($response); + $error = $output->{error}; + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + # Uncomment for debugging watchman output + # open (my $fh, ">", ".git/watchman-output.out"); + # close $fh; + + # Watchman will always return all files on the first query so + # return the fast "everything is dirty" flag to git and do the + # Watchman query just to get it over with now so we won't pay + # the cost in git to look up each individual file. + my $o = watchman_clock(); + $error = $output->{error}; + + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + output_result($o->{clock}, ("/")); + $last_update_token = $o->{clock}; + + eval { launch_watchman() }; + return 0; + } + + die "Watchman: $error.\n" . + "Falling back to scanning...\n" if $error; + + return 1; +} + +sub get_working_dir { + my $working_dir; + if ($^O =~ 'msys' || $^O =~ 'cygwin') { + $working_dir = Win32::GetCwd(); + $working_dir =~ tr/\\/\//; + } else { + require Cwd; + $working_dir = Cwd::cwd(); + } + + return $working_dir; +} diff --git a/.git_disabled/hooks/post-update.sample b/.git_disabled/hooks/post-update.sample new file mode 100755 index 0000000..ec17ec1 --- /dev/null +++ b/.git_disabled/hooks/post-update.sample @@ -0,0 +1,8 @@ +#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info diff --git a/.git_disabled/hooks/pre-applypatch.sample b/.git_disabled/hooks/pre-applypatch.sample new file mode 100755 index 0000000..4142082 --- /dev/null +++ b/.git_disabled/hooks/pre-applypatch.sample @@ -0,0 +1,14 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +precommit="$(git rev-parse --git-path hooks/pre-commit)" +test -x "$precommit" && exec "$precommit" ${1+"$@"} +: diff --git a/.git_disabled/hooks/pre-commit.sample b/.git_disabled/hooks/pre-commit.sample new file mode 100755 index 0000000..e144712 --- /dev/null +++ b/.git_disabled/hooks/pre-commit.sample @@ -0,0 +1,49 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=$(git hash-object -t tree /dev/null) +fi + +# If you want to allow non-ASCII filenames set this variable to true. +allownonascii=$(git config --type=bool hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ASCII filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + cat <<\EOF +Error: Attempt to add a non-ASCII file name. + +This can cause problems if you want to work with people on other platforms. + +To be portable it is advisable to rename the file. + +If you know what you are doing you can disable this check using: + + git config hooks.allownonascii true +EOF + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against -- diff --git a/.git_disabled/hooks/pre-merge-commit.sample b/.git_disabled/hooks/pre-merge-commit.sample new file mode 100755 index 0000000..399eab1 --- /dev/null +++ b/.git_disabled/hooks/pre-merge-commit.sample @@ -0,0 +1,13 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git merge" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message to +# stderr if it wants to stop the merge commit. +# +# To enable this hook, rename this file to "pre-merge-commit". + +. git-sh-setup +test -x "$GIT_DIR/hooks/pre-commit" && + exec "$GIT_DIR/hooks/pre-commit" +: diff --git a/.git_disabled/hooks/pre-push.sample b/.git_disabled/hooks/pre-push.sample new file mode 100755 index 0000000..4ce688d --- /dev/null +++ b/.git_disabled/hooks/pre-push.sample @@ -0,0 +1,53 @@ +#!/bin/sh + +# An example hook script to verify what is about to be pushed. Called by "git +# push" after it has checked the remote status, but before anything has been +# pushed. If this script exits with a non-zero status nothing will be pushed. +# +# This hook is called with the following parameters: +# +# $1 -- Name of the remote to which the push is being done +# $2 -- URL to which the push is being done +# +# If pushing without using a named remote those arguments will be equal. +# +# Information about the commits which are being pushed is supplied as lines to +# the standard input in the form: +# +# +# +# This sample shows how to prevent push of commits where the log message starts +# with "WIP" (work in progress). + +remote="$1" +url="$2" + +zero=$(git hash-object --stdin &2 "Found WIP commit in $local_ref, not pushing" + exit 1 + fi + fi +done + +exit 0 diff --git a/.git_disabled/hooks/pre-rebase.sample b/.git_disabled/hooks/pre-rebase.sample new file mode 100755 index 0000000..6cbef5c --- /dev/null +++ b/.git_disabled/hooks/pre-rebase.sample @@ -0,0 +1,169 @@ +#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up to date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +<<\DOC_END + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". + +DOC_END diff --git a/.git_disabled/hooks/pre-receive.sample b/.git_disabled/hooks/pre-receive.sample new file mode 100755 index 0000000..a1fd29e --- /dev/null +++ b/.git_disabled/hooks/pre-receive.sample @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to make use of push options. +# The example simply echoes all push options that start with 'echoback=' +# and rejects all pushes when the "reject" push option is used. +# +# To enable this hook, rename this file to "pre-receive". + +if test -n "$GIT_PUSH_OPTION_COUNT" +then + i=0 + while test "$i" -lt "$GIT_PUSH_OPTION_COUNT" + do + eval "value=\$GIT_PUSH_OPTION_$i" + case "$value" in + echoback=*) + echo "echo from the pre-receive-hook: ${value#*=}" >&2 + ;; + reject) + exit 1 + esac + i=$((i + 1)) + done +fi diff --git a/.git_disabled/hooks/prepare-commit-msg.sample b/.git_disabled/hooks/prepare-commit-msg.sample new file mode 100755 index 0000000..10fa14c --- /dev/null +++ b/.git_disabled/hooks/prepare-commit-msg.sample @@ -0,0 +1,42 @@ +#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first one removes the +# "# Please enter the commit message..." help message. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +COMMIT_MSG_FILE=$1 +COMMIT_SOURCE=$2 +SHA1=$3 + +/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE" + +# case "$COMMIT_SOURCE,$SHA1" in +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;; +# *) ;; +# esac + +# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE" +# if test -z "$COMMIT_SOURCE" +# then +# /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE" +# fi diff --git a/.git_disabled/hooks/push-to-checkout.sample b/.git_disabled/hooks/push-to-checkout.sample new file mode 100755 index 0000000..af5a0c0 --- /dev/null +++ b/.git_disabled/hooks/push-to-checkout.sample @@ -0,0 +1,78 @@ +#!/bin/sh + +# An example hook script to update a checked-out tree on a git push. +# +# This hook is invoked by git-receive-pack(1) when it reacts to git +# push and updates reference(s) in its repository, and when the push +# tries to update the branch that is currently checked out and the +# receive.denyCurrentBranch configuration variable is set to +# updateInstead. +# +# By default, such a push is refused if the working tree and the index +# of the remote repository has any difference from the currently +# checked out commit; when both the working tree and the index match +# the current commit, they are updated to match the newly pushed tip +# of the branch. This hook is to be used to override the default +# behaviour; however the code below reimplements the default behaviour +# as a starting point for convenient modification. +# +# The hook receives the commit with which the tip of the current +# branch is going to be updated: +commit=$1 + +# It can exit with a non-zero status to refuse the push (when it does +# so, it must not modify the index or the working tree). +die () { + echo >&2 "$*" + exit 1 +} + +# Or it can make any necessary changes to the working tree and to the +# index to bring them to the desired state when the tip of the current +# branch is updated to the new commit, and exit with a zero status. +# +# For example, the hook can simply run git read-tree -u -m HEAD "$1" +# in order to emulate git fetch that is run in the reverse direction +# with git push, as the two-tree form of git read-tree -u -m is +# essentially the same as git switch or git checkout that switches +# branches while keeping the local changes in the working tree that do +# not interfere with the difference between the branches. + +# The below is a more-or-less exact translation to shell of the C code +# for the default behaviour for git's push-to-checkout hook defined in +# the push_to_deploy() function in builtin/receive-pack.c. +# +# Note that the hook will be executed from the repository directory, +# not from the working tree, so if you want to perform operations on +# the working tree, you will have to adapt your code accordingly, e.g. +# by adding "cd .." or using relative paths. + +if ! git update-index -q --ignore-submodules --refresh +then + die "Up-to-date check failed" +fi + +if ! git diff-files --quiet --ignore-submodules -- +then + die "Working directory has unstaged changes" +fi + +# This is a rough translation of: +# +# head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX +if git cat-file -e HEAD 2>/dev/null +then + head=HEAD +else + head=$(git hash-object -t tree --stdin &2 + exit 1 +} + +unset GIT_DIR GIT_WORK_TREE +cd "$worktree" && + +if grep -q "^diff --git " "$1" +then + validate_patch "$1" +else + validate_cover_letter "$1" +fi && + +if test "$GIT_SENDEMAIL_FILE_COUNTER" = "$GIT_SENDEMAIL_FILE_TOTAL" +then + git config --unset-all sendemail.validateWorktree && + trap 'git worktree remove -ff "$worktree"' EXIT && + validate_series +fi diff --git a/.git_disabled/hooks/update.sample b/.git_disabled/hooks/update.sample new file mode 100755 index 0000000..c4d426b --- /dev/null +++ b/.git_disabled/hooks/update.sample @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to block unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 )" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "usage: $0 " >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --type=bool hooks.allowunannotated) +allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch) +denycreatebranch=$(git config --type=bool hooks.denycreatebranch) +allowdeletetag=$(git config --type=bool hooks.allowdeletetag) +allowmodifytag=$(git config --type=bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero=$(git hash-object --stdin &2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0 diff --git a/.git_disabled/index b/.git_disabled/index new file mode 100644 index 0000000..df27eb5 Binary files /dev/null and b/.git_disabled/index differ diff --git a/.git_disabled/info/exclude b/.git_disabled/info/exclude new file mode 100755 index 0000000..a5196d1 --- /dev/null +++ b/.git_disabled/info/exclude @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff --git a/.git_disabled/logs/HEAD b/.git_disabled/logs/HEAD new file mode 100755 index 0000000..f6e7f39 --- /dev/null +++ b/.git_disabled/logs/HEAD @@ -0,0 +1,34 @@ +0000000000000000000000000000000000000000 a34e5b7976d89ac8c955e777b24bc8cdef2e0391 Kincses 1770148545 +0000 commit (initial): Initial commit - Migrated to Dev environment +a34e5b7976d89ac8c955e777b24bc8cdef2e0391 0000000000000000000000000000000000000000 Kincses 1770148545 +0000 Branch: renamed refs/heads/master to refs/heads/main +0000000000000000000000000000000000000000 a34e5b7976d89ac8c955e777b24bc8cdef2e0391 Kincses 1770148545 +0000 Branch: renamed refs/heads/master to refs/heads/main +a34e5b7976d89ac8c955e777b24bc8cdef2e0391 5dd5692d83891817166fcf3f770eba02e9f1657e Kincses 1770163715 +0000 commit: DOCS: Grand Master Book v1.0 (Gemini V01) hozzáadása +5dd5692d83891817166fcf3f770eba02e9f1657e a57d5333d478638c3b4bad9862eb8888a920a890 Kincses 1770242337 +0000 commit: Save test environment changes +a57d5333d478638c3b4bad9862eb8888a920a890 5d0dc2433cfae4a85c4c6ccc69095e812885607f Kincses 1770250293 +0000 commit: feat: Identity & Company Sync v1.2, Admin hiearchia és Pénzügyi logika véglegesítése +5d0dc2433cfae4a85c4c6ccc69095e812885607f 714de9dd93c89237744ca52850a61b44d06258fa Kincses 1770336857 +0000 commit: Refactor: Auth & Identity System v1.4 +714de9dd93c89237744ca52850a61b44d06258fa 32325b261b369719bfdcb60341dd6d2dae770f56 Kincses 1770411268 +0000 commit: feat: Unified Auth system and SendGrid integration - STABLE v1.0.1 +32325b261b369719bfdcb60341dd6d2dae770f56 cfd1e365e06d850763218cff75ad6f84636e56db Kincses 1770416411 +0000 commit: feat: Step 1 Auth complete - Token generation and email loop verified +cfd1e365e06d850763218cff75ad6f84636e56db 9d06be4f8728b84c85731f39510596a99fc0a495 Kincses 1770417524 +0000 commit: feat: complete auth life-cycle with Step 2 KYC and Private Fleet generation +9d06be4f8728b84c85731f39510596a99fc0a495 8020bbd394f22a93eab2a9b269cc1a4ef79a013e Kincses 1770421381 +0000 commit: feat: complete Tier 2 onboarding - KYC, Private Fleet, and Wallet creation fully functional +8020bbd394f22a93eab2a9b269cc1a4ef79a013e cd171d328906178be065cc5dfca5278ead22158b Kincses 1770426967 +0000 commit: STABLE: KYC and Auth working, before Asset refactor +cd171d328906178be065cc5dfca5278ead22158b cab87069802da9755559ea2fa6c25f301a09a41a Kincses 1770427786 +0000 commit: feat: vehicle catalog system and harvester robot implementation +cab87069802da9755559ea2fa6c25f301a09a41a d3ce60d69be1247d0c87c4c361c5bdde0e11f3c2 Kincses 1770430804 +0000 commit: feat: multi-robot architecture, car-robot rename, and credit-based OCR logic spec +d3ce60d69be1247d0c87c4c361c5bdde0e11f3c2 c59c441a40d5d4c8032164b4018972041909e8e7 Kincses 1770431464 +0000 commit: STABLE: Multi-Robot architecture, Extended Categories (Bus, Trailer), and Admin/RBAC Schema +c59c441a40d5d4c8032164b4018972041909e8e7 7249aa5809859343c9ec543e6d05d479de760ed5 Kincses 1770471766 +0000 commit: FEAT: Corporate onboarding implemented with Tax ID validation (HU) and isolated NAS storage +7249aa5809859343c9ec543e6d05d479de760ed5 e370ca3021d90e26a30817b9ae576b7f111587b1 Kincses 1770475059 +0000 commit: FIX: Import error and enhanced atomized address structure for organizations +e370ca3021d90e26a30817b9ae576b7f111587b1 4e14d57bf6243a5d700d485a7535e524e0a5ca46 Kincses 1770502563 +0000 commit: FEAT: Integrated Document Engine with WebP optimization, Thumbnail generation and Hybrid (NAS/SSD) storage logic +4e14d57bf6243a5d700d485a7535e524e0a5ca46 451900ae1a05b2669439260066e3d3eeaf11f8c8 Kincses 1770567999 +0000 commit: feat: implement hybrid address system and premium search logic +451900ae1a05b2669439260066e3d3eeaf11f8c8 24d35fe0c1761f4ff65e3df8589e96bf89a0d19c Kincses 1770594067 +0000 commit: feat: stabilize KYC, international assets and multi-currency schema +24d35fe0c1761f4ff65e3df8589e96bf89a0d19c e255fea3a52e371d9ba89d22c54dc218fea9ad50 Kincses 1770718845 +0000 commit: feat: implement pivot-currency model, rbac smart tokens & fix circular imports +e255fea3a52e371d9ba89d22c54dc218fea9ad50 425f598fa38598da5113bbd654be36d94801b1cb Kincses 1770757318 +0000 commit: feat: SuperAdmin bootstrap, i18n sync fix and AssetAssignment ORM fix +425f598fa38598da5113bbd654be36d94801b1cb a63e6c8facb0349729a98f1c1b818da985c514ab Kincses 1770757904 +0000 commit: MasterBook update +a63e6c8facb0349729a98f1c1b818da985c514ab 09a0430384cd3d508af0c7c7ca6c9eedd351b6e4 Kincses 1770850058 +0000 commit: feat: Asset Catalog system, PostGIS integration and RobotScout V1 +09a0430384cd3d508af0c7c7ca6c9eedd351b6e4 f38a75a02505d8336fb80f09b15eef476faea5f9 Kincses 1770945334 +0000 commit: feat(robot): hunter v2.7, geocoding support, docker network fix, changelog update +f38a75a02505d8336fb80f09b15eef476faea5f9 bb02d4ed592bed891aaaebef8db8d2945a09015d Kincses 1771083116 +0000 commit: checkpoint: DB baseline reset (v10) with perfect column order for n8n. +bb02d4ed592bed891aaaebef8db8d2945a09015d d574d3297db422057a451c085919942d3645f1f2 Kincses 1771202569 +0000 commit: feat: v1.7 overhaul - identity hash, triple wallet, financial ledger, and security audit system +d574d3297db422057a451c085919942d3645f1f2 2def6b220169f3dc1459cf2a9b742026637cfa30 Kincses 1771291578 +0000 commit: feat(infra): Stabilized Docker env, fixed circular imports, enabled AI Enricher Robot v1.1 +2def6b220169f3dc1459cf2a9b742026637cfa30 b11b9bce87e5f492def4a82cd49733034ef5fd62 Kincses 1771368297 +0000 commit: feat: Robot ecosystem v1.2.6 - Google Search RAG & Master-Merge logic stabilized +b11b9bce87e5f492def4a82cd49733034ef5fd62 5757754aae85250910996dda70d43bf9fe191e38 Kincses 1771373510 +0000 commit: chore: Archive legacy docs and backup files, prepare for codebase cleanup v2.0 +5757754aae85250910996dda70d43bf9fe191e38 5757754aae85250910996dda70d43bf9fe191e38 Kincses 1771836232 +0100 reset: moving to HEAD +5757754aae85250910996dda70d43bf9fe191e38 893f39fa15f363fff9fe8fc6acecfb0c76c236fb Kincses 1771836242 +0100 commit: Cleanup: MB 2.0 Gap Analysis előtti állapot (adatok kizárva) +893f39fa15f363fff9fe8fc6acecfb0c76c236fb 505543330af8a36af7f32fbb7265ef6b1c13f67c Kincses 1772090365 +0100 commit: STABLE: Final schema sync, optimized gitignore +505543330af8a36af7f32fbb7265ef6b1c13f67c bc0d191e9d874a0bfd916a9406930dc57d31a2a2 Kincses 1772410273 +0100 commit: Dokumentáció hozzáadva diff --git a/.git_disabled/logs/refs/heads/main b/.git_disabled/logs/refs/heads/main new file mode 100755 index 0000000..d3555e1 --- /dev/null +++ b/.git_disabled/logs/refs/heads/main @@ -0,0 +1,32 @@ +0000000000000000000000000000000000000000 a34e5b7976d89ac8c955e777b24bc8cdef2e0391 Kincses 1770148545 +0000 commit (initial): Initial commit - Migrated to Dev environment +a34e5b7976d89ac8c955e777b24bc8cdef2e0391 a34e5b7976d89ac8c955e777b24bc8cdef2e0391 Kincses 1770148545 +0000 Branch: renamed refs/heads/master to refs/heads/main +a34e5b7976d89ac8c955e777b24bc8cdef2e0391 5dd5692d83891817166fcf3f770eba02e9f1657e Kincses 1770163715 +0000 commit: DOCS: Grand Master Book v1.0 (Gemini V01) hozzáadása +5dd5692d83891817166fcf3f770eba02e9f1657e a57d5333d478638c3b4bad9862eb8888a920a890 Kincses 1770242337 +0000 commit: Save test environment changes +a57d5333d478638c3b4bad9862eb8888a920a890 5d0dc2433cfae4a85c4c6ccc69095e812885607f Kincses 1770250293 +0000 commit: feat: Identity & Company Sync v1.2, Admin hiearchia és Pénzügyi logika véglegesítése +5d0dc2433cfae4a85c4c6ccc69095e812885607f 714de9dd93c89237744ca52850a61b44d06258fa Kincses 1770336857 +0000 commit: Refactor: Auth & Identity System v1.4 +714de9dd93c89237744ca52850a61b44d06258fa 32325b261b369719bfdcb60341dd6d2dae770f56 Kincses 1770411268 +0000 commit: feat: Unified Auth system and SendGrid integration - STABLE v1.0.1 +32325b261b369719bfdcb60341dd6d2dae770f56 cfd1e365e06d850763218cff75ad6f84636e56db Kincses 1770416411 +0000 commit: feat: Step 1 Auth complete - Token generation and email loop verified +cfd1e365e06d850763218cff75ad6f84636e56db 9d06be4f8728b84c85731f39510596a99fc0a495 Kincses 1770417524 +0000 commit: feat: complete auth life-cycle with Step 2 KYC and Private Fleet generation +9d06be4f8728b84c85731f39510596a99fc0a495 8020bbd394f22a93eab2a9b269cc1a4ef79a013e Kincses 1770421381 +0000 commit: feat: complete Tier 2 onboarding - KYC, Private Fleet, and Wallet creation fully functional +8020bbd394f22a93eab2a9b269cc1a4ef79a013e cd171d328906178be065cc5dfca5278ead22158b Kincses 1770426967 +0000 commit: STABLE: KYC and Auth working, before Asset refactor +cd171d328906178be065cc5dfca5278ead22158b cab87069802da9755559ea2fa6c25f301a09a41a Kincses 1770427786 +0000 commit: feat: vehicle catalog system and harvester robot implementation +cab87069802da9755559ea2fa6c25f301a09a41a d3ce60d69be1247d0c87c4c361c5bdde0e11f3c2 Kincses 1770430804 +0000 commit: feat: multi-robot architecture, car-robot rename, and credit-based OCR logic spec +d3ce60d69be1247d0c87c4c361c5bdde0e11f3c2 c59c441a40d5d4c8032164b4018972041909e8e7 Kincses 1770431464 +0000 commit: STABLE: Multi-Robot architecture, Extended Categories (Bus, Trailer), and Admin/RBAC Schema +c59c441a40d5d4c8032164b4018972041909e8e7 7249aa5809859343c9ec543e6d05d479de760ed5 Kincses 1770471766 +0000 commit: FEAT: Corporate onboarding implemented with Tax ID validation (HU) and isolated NAS storage +7249aa5809859343c9ec543e6d05d479de760ed5 e370ca3021d90e26a30817b9ae576b7f111587b1 Kincses 1770475059 +0000 commit: FIX: Import error and enhanced atomized address structure for organizations +e370ca3021d90e26a30817b9ae576b7f111587b1 4e14d57bf6243a5d700d485a7535e524e0a5ca46 Kincses 1770502563 +0000 commit: FEAT: Integrated Document Engine with WebP optimization, Thumbnail generation and Hybrid (NAS/SSD) storage logic +4e14d57bf6243a5d700d485a7535e524e0a5ca46 451900ae1a05b2669439260066e3d3eeaf11f8c8 Kincses 1770567999 +0000 commit: feat: implement hybrid address system and premium search logic +451900ae1a05b2669439260066e3d3eeaf11f8c8 24d35fe0c1761f4ff65e3df8589e96bf89a0d19c Kincses 1770594067 +0000 commit: feat: stabilize KYC, international assets and multi-currency schema +24d35fe0c1761f4ff65e3df8589e96bf89a0d19c e255fea3a52e371d9ba89d22c54dc218fea9ad50 Kincses 1770718845 +0000 commit: feat: implement pivot-currency model, rbac smart tokens & fix circular imports +e255fea3a52e371d9ba89d22c54dc218fea9ad50 425f598fa38598da5113bbd654be36d94801b1cb Kincses 1770757318 +0000 commit: feat: SuperAdmin bootstrap, i18n sync fix and AssetAssignment ORM fix +425f598fa38598da5113bbd654be36d94801b1cb a63e6c8facb0349729a98f1c1b818da985c514ab Kincses 1770757904 +0000 commit: MasterBook update +a63e6c8facb0349729a98f1c1b818da985c514ab 09a0430384cd3d508af0c7c7ca6c9eedd351b6e4 Kincses 1770850058 +0000 commit: feat: Asset Catalog system, PostGIS integration and RobotScout V1 +09a0430384cd3d508af0c7c7ca6c9eedd351b6e4 f38a75a02505d8336fb80f09b15eef476faea5f9 Kincses 1770945334 +0000 commit: feat(robot): hunter v2.7, geocoding support, docker network fix, changelog update +f38a75a02505d8336fb80f09b15eef476faea5f9 bb02d4ed592bed891aaaebef8db8d2945a09015d Kincses 1771083116 +0000 commit: checkpoint: DB baseline reset (v10) with perfect column order for n8n. +bb02d4ed592bed891aaaebef8db8d2945a09015d d574d3297db422057a451c085919942d3645f1f2 Kincses 1771202569 +0000 commit: feat: v1.7 overhaul - identity hash, triple wallet, financial ledger, and security audit system +d574d3297db422057a451c085919942d3645f1f2 2def6b220169f3dc1459cf2a9b742026637cfa30 Kincses 1771291578 +0000 commit: feat(infra): Stabilized Docker env, fixed circular imports, enabled AI Enricher Robot v1.1 +2def6b220169f3dc1459cf2a9b742026637cfa30 b11b9bce87e5f492def4a82cd49733034ef5fd62 Kincses 1771368297 +0000 commit: feat: Robot ecosystem v1.2.6 - Google Search RAG & Master-Merge logic stabilized +b11b9bce87e5f492def4a82cd49733034ef5fd62 5757754aae85250910996dda70d43bf9fe191e38 Kincses 1771373510 +0000 commit: chore: Archive legacy docs and backup files, prepare for codebase cleanup v2.0 +5757754aae85250910996dda70d43bf9fe191e38 893f39fa15f363fff9fe8fc6acecfb0c76c236fb Kincses 1771836242 +0100 commit: Cleanup: MB 2.0 Gap Analysis előtti állapot (adatok kizárva) +893f39fa15f363fff9fe8fc6acecfb0c76c236fb 505543330af8a36af7f32fbb7265ef6b1c13f67c Kincses 1772090365 +0100 commit: STABLE: Final schema sync, optimized gitignore +505543330af8a36af7f32fbb7265ef6b1c13f67c bc0d191e9d874a0bfd916a9406930dc57d31a2a2 Kincses 1772410273 +0100 commit: Dokumentáció hozzáadva diff --git a/.git_disabled/logs/refs/remotes/origin/main b/.git_disabled/logs/refs/remotes/origin/main new file mode 100755 index 0000000..b868304 --- /dev/null +++ b/.git_disabled/logs/refs/remotes/origin/main @@ -0,0 +1,30 @@ +0000000000000000000000000000000000000000 a34e5b7976d89ac8c955e777b24bc8cdef2e0391 Kincses 1770148864 +0000 update by push +a34e5b7976d89ac8c955e777b24bc8cdef2e0391 5dd5692d83891817166fcf3f770eba02e9f1657e Kincses 1770163724 +0000 update by push +5dd5692d83891817166fcf3f770eba02e9f1657e a57d5333d478638c3b4bad9862eb8888a920a890 Kincses 1770242384 +0000 update by push +a57d5333d478638c3b4bad9862eb8888a920a890 5d0dc2433cfae4a85c4c6ccc69095e812885607f Kincses 1770250300 +0000 update by push +5d0dc2433cfae4a85c4c6ccc69095e812885607f 714de9dd93c89237744ca52850a61b44d06258fa Kincses 1770336894 +0000 update by push +714de9dd93c89237744ca52850a61b44d06258fa 32325b261b369719bfdcb60341dd6d2dae770f56 Kincses 1770411431 +0000 update by push +32325b261b369719bfdcb60341dd6d2dae770f56 cfd1e365e06d850763218cff75ad6f84636e56db Kincses 1770416417 +0000 update by push +cfd1e365e06d850763218cff75ad6f84636e56db 9d06be4f8728b84c85731f39510596a99fc0a495 Kincses 1770417544 +0000 update by push +9d06be4f8728b84c85731f39510596a99fc0a495 8020bbd394f22a93eab2a9b269cc1a4ef79a013e Kincses 1770421388 +0000 update by push +8020bbd394f22a93eab2a9b269cc1a4ef79a013e cab87069802da9755559ea2fa6c25f301a09a41a Kincses 1770427793 +0000 update by push +cab87069802da9755559ea2fa6c25f301a09a41a d3ce60d69be1247d0c87c4c361c5bdde0e11f3c2 Kincses 1770430819 +0000 update by push +d3ce60d69be1247d0c87c4c361c5bdde0e11f3c2 c59c441a40d5d4c8032164b4018972041909e8e7 Kincses 1770431469 +0000 update by push +c59c441a40d5d4c8032164b4018972041909e8e7 7249aa5809859343c9ec543e6d05d479de760ed5 Kincses 1770471772 +0000 update by push +7249aa5809859343c9ec543e6d05d479de760ed5 e370ca3021d90e26a30817b9ae576b7f111587b1 Kincses 1770475065 +0000 update by push +e370ca3021d90e26a30817b9ae576b7f111587b1 4e14d57bf6243a5d700d485a7535e524e0a5ca46 Kincses 1770502569 +0000 update by push +4e14d57bf6243a5d700d485a7535e524e0a5ca46 451900ae1a05b2669439260066e3d3eeaf11f8c8 Kincses 1770568008 +0000 update by push +451900ae1a05b2669439260066e3d3eeaf11f8c8 24d35fe0c1761f4ff65e3df8589e96bf89a0d19c Kincses 1770594087 +0000 update by push +24d35fe0c1761f4ff65e3df8589e96bf89a0d19c e255fea3a52e371d9ba89d22c54dc218fea9ad50 Kincses 1770718938 +0000 update by push +e255fea3a52e371d9ba89d22c54dc218fea9ad50 425f598fa38598da5113bbd654be36d94801b1cb Kincses 1770757336 +0000 update by push +425f598fa38598da5113bbd654be36d94801b1cb a63e6c8facb0349729a98f1c1b818da985c514ab Kincses 1770757918 +0000 update by push +a63e6c8facb0349729a98f1c1b818da985c514ab 09a0430384cd3d508af0c7c7ca6c9eedd351b6e4 Kincses 1770850095 +0000 update by push +09a0430384cd3d508af0c7c7ca6c9eedd351b6e4 f38a75a02505d8336fb80f09b15eef476faea5f9 Kincses 1770945349 +0000 update by push +f38a75a02505d8336fb80f09b15eef476faea5f9 bb02d4ed592bed891aaaebef8db8d2945a09015d Kincses 1771083129 +0000 update by push +bb02d4ed592bed891aaaebef8db8d2945a09015d d574d3297db422057a451c085919942d3645f1f2 Kincses 1771202599 +0000 update by push +d574d3297db422057a451c085919942d3645f1f2 2def6b220169f3dc1459cf2a9b742026637cfa30 Kincses 1771291595 +0000 update by push +2def6b220169f3dc1459cf2a9b742026637cfa30 b11b9bce87e5f492def4a82cd49733034ef5fd62 Kincses 1771368303 +0000 update by push +b11b9bce87e5f492def4a82cd49733034ef5fd62 5757754aae85250910996dda70d43bf9fe191e38 Kincses 1771373531 +0000 update by push +5757754aae85250910996dda70d43bf9fe191e38 893f39fa15f363fff9fe8fc6acecfb0c76c236fb Kincses 1771836255 +0100 update by push +893f39fa15f363fff9fe8fc6acecfb0c76c236fb 505543330af8a36af7f32fbb7265ef6b1c13f67c Kincses 1772090373 +0100 update by push +505543330af8a36af7f32fbb7265ef6b1c13f67c bc0d191e9d874a0bfd916a9406930dc57d31a2a2 Kincses 1772410281 +0100 update by push diff --git a/.git_disabled/objects/00/102f28e42cfb02c37d5311538ccf583bf045ef b/.git_disabled/objects/00/102f28e42cfb02c37d5311538ccf583bf045ef new file mode 100755 index 0000000..fe2ff18 Binary files /dev/null and b/.git_disabled/objects/00/102f28e42cfb02c37d5311538ccf583bf045ef differ diff --git a/.git_disabled/objects/00/2be7d72b1ae542508a7554aebb3e70e8d8558b b/.git_disabled/objects/00/2be7d72b1ae542508a7554aebb3e70e8d8558b new file mode 100755 index 0000000..9aefb65 Binary files /dev/null and b/.git_disabled/objects/00/2be7d72b1ae542508a7554aebb3e70e8d8558b differ diff --git a/.git_disabled/objects/00/60d49c6685bfa8a39ac2524759fc5c2818d108 b/.git_disabled/objects/00/60d49c6685bfa8a39ac2524759fc5c2818d108 new file mode 100755 index 0000000..0073df9 Binary files /dev/null and b/.git_disabled/objects/00/60d49c6685bfa8a39ac2524759fc5c2818d108 differ diff --git a/.git_disabled/objects/00/79c6ccaa16b93ad68b850f71801586890868b2 b/.git_disabled/objects/00/79c6ccaa16b93ad68b850f71801586890868b2 new file mode 100755 index 0000000..c4a6e2f Binary files /dev/null and b/.git_disabled/objects/00/79c6ccaa16b93ad68b850f71801586890868b2 differ diff --git a/.git_disabled/objects/00/87d2ff35ce68b1321371b956115872e661c726 b/.git_disabled/objects/00/87d2ff35ce68b1321371b956115872e661c726 new file mode 100755 index 0000000..7d5d637 Binary files /dev/null and b/.git_disabled/objects/00/87d2ff35ce68b1321371b956115872e661c726 differ diff --git a/.git_disabled/objects/00/9598a86b87ca5f5926ad1908beb62783f17889 b/.git_disabled/objects/00/9598a86b87ca5f5926ad1908beb62783f17889 new file mode 100755 index 0000000..4a4d182 Binary files /dev/null and b/.git_disabled/objects/00/9598a86b87ca5f5926ad1908beb62783f17889 differ diff --git a/.git_disabled/objects/00/9756ed7683d835d12adcbfe3d7bd74d817e94e b/.git_disabled/objects/00/9756ed7683d835d12adcbfe3d7bd74d817e94e new file mode 100755 index 0000000..e915e87 Binary files /dev/null and b/.git_disabled/objects/00/9756ed7683d835d12adcbfe3d7bd74d817e94e differ diff --git a/.git_disabled/objects/00/a655ba87c753cfe95043dfb76ff8a8af87f8c2 b/.git_disabled/objects/00/a655ba87c753cfe95043dfb76ff8a8af87f8c2 new file mode 100755 index 0000000..5d8bd99 Binary files /dev/null and b/.git_disabled/objects/00/a655ba87c753cfe95043dfb76ff8a8af87f8c2 differ diff --git a/.git_disabled/objects/00/b9b874a5aca902e36ea347462238a3e1253930 b/.git_disabled/objects/00/b9b874a5aca902e36ea347462238a3e1253930 new file mode 100755 index 0000000..47546a6 Binary files /dev/null and b/.git_disabled/objects/00/b9b874a5aca902e36ea347462238a3e1253930 differ diff --git a/.git_disabled/objects/00/bc081b4085a164a44570fa41359aa180d04772 b/.git_disabled/objects/00/bc081b4085a164a44570fa41359aa180d04772 new file mode 100755 index 0000000..1df8254 Binary files /dev/null and b/.git_disabled/objects/00/bc081b4085a164a44570fa41359aa180d04772 differ diff --git a/.git_disabled/objects/00/bee41be68d48a67c8da3d8ee0e6953fd82d395 b/.git_disabled/objects/00/bee41be68d48a67c8da3d8ee0e6953fd82d395 new file mode 100755 index 0000000..e605281 Binary files /dev/null and b/.git_disabled/objects/00/bee41be68d48a67c8da3d8ee0e6953fd82d395 differ diff --git a/.git_disabled/objects/00/c698724b2f6152cb15a0d1f07d776144c2e3ad b/.git_disabled/objects/00/c698724b2f6152cb15a0d1f07d776144c2e3ad new file mode 100755 index 0000000..e21f23a Binary files /dev/null and b/.git_disabled/objects/00/c698724b2f6152cb15a0d1f07d776144c2e3ad differ diff --git a/.git_disabled/objects/00/cc515914b50b049f05a4612f452bd54c903e20 b/.git_disabled/objects/00/cc515914b50b049f05a4612f452bd54c903e20 new file mode 100755 index 0000000..217cfba Binary files /dev/null and b/.git_disabled/objects/00/cc515914b50b049f05a4612f452bd54c903e20 differ diff --git a/.git_disabled/objects/00/d826a79faa7325d74cf0323e22718979062f6e b/.git_disabled/objects/00/d826a79faa7325d74cf0323e22718979062f6e new file mode 100755 index 0000000..4ad0c30 Binary files /dev/null and b/.git_disabled/objects/00/d826a79faa7325d74cf0323e22718979062f6e differ diff --git a/.git_disabled/objects/00/e6703c30a27f842dc38442f76bfec24abda727 b/.git_disabled/objects/00/e6703c30a27f842dc38442f76bfec24abda727 new file mode 100755 index 0000000..8a9b71d Binary files /dev/null and b/.git_disabled/objects/00/e6703c30a27f842dc38442f76bfec24abda727 differ diff --git a/.git_disabled/objects/00/e9699a031710ee3f8a9c119fc946ef6e5cfe99 b/.git_disabled/objects/00/e9699a031710ee3f8a9c119fc946ef6e5cfe99 new file mode 100755 index 0000000..5d0a463 Binary files /dev/null and b/.git_disabled/objects/00/e9699a031710ee3f8a9c119fc946ef6e5cfe99 differ diff --git a/.git_disabled/objects/00/ec9b79b077745937b7d6f39af392a4df4b3342 b/.git_disabled/objects/00/ec9b79b077745937b7d6f39af392a4df4b3342 new file mode 100755 index 0000000..64729b2 --- /dev/null +++ b/.git_disabled/objects/00/ec9b79b077745937b7d6f39af392a4df4b3342 @@ -0,0 +1,2 @@ +xU 03ŗ 3Q3"ނ1X"" ID6/&⛲8΢n$XB{鐊V<,*GCc;| + /)p{R Vh^؋ Ӏ4C \ No newline at end of file diff --git a/.git_disabled/objects/01/02c6ef9cdf83d0009581938b9e28c397dd78cb b/.git_disabled/objects/01/02c6ef9cdf83d0009581938b9e28c397dd78cb new file mode 100755 index 0000000..c338219 Binary files /dev/null and b/.git_disabled/objects/01/02c6ef9cdf83d0009581938b9e28c397dd78cb differ diff --git a/.git_disabled/objects/01/18401ee29b2211d9fd37b0e296e3223b14018e b/.git_disabled/objects/01/18401ee29b2211d9fd37b0e296e3223b14018e new file mode 100755 index 0000000..f110a66 Binary files /dev/null and b/.git_disabled/objects/01/18401ee29b2211d9fd37b0e296e3223b14018e differ diff --git a/.git_disabled/objects/01/2cb55a63a0fc3404f8e5e4a2d1ed43f5652d38 b/.git_disabled/objects/01/2cb55a63a0fc3404f8e5e4a2d1ed43f5652d38 new file mode 100755 index 0000000..f555b31 Binary files /dev/null and b/.git_disabled/objects/01/2cb55a63a0fc3404f8e5e4a2d1ed43f5652d38 differ diff --git a/.git_disabled/objects/01/3f33b09be0578fb1e75b3a946154b21a3b04cc b/.git_disabled/objects/01/3f33b09be0578fb1e75b3a946154b21a3b04cc new file mode 100755 index 0000000..5efb877 Binary files /dev/null and b/.git_disabled/objects/01/3f33b09be0578fb1e75b3a946154b21a3b04cc differ diff --git a/.git_disabled/objects/01/42fed728be787db5a58ee320e1dc6feee58e5b b/.git_disabled/objects/01/42fed728be787db5a58ee320e1dc6feee58e5b new file mode 100755 index 0000000..2bce29e Binary files /dev/null and b/.git_disabled/objects/01/42fed728be787db5a58ee320e1dc6feee58e5b differ diff --git a/.git_disabled/objects/01/5ec68e96187c9084d4bbcf55c4ac9da1c83799 b/.git_disabled/objects/01/5ec68e96187c9084d4bbcf55c4ac9da1c83799 new file mode 100755 index 0000000..067f037 Binary files /dev/null and b/.git_disabled/objects/01/5ec68e96187c9084d4bbcf55c4ac9da1c83799 differ diff --git a/.git_disabled/objects/01/680fdacfa57be105331f08c412e32a9e9808cb b/.git_disabled/objects/01/680fdacfa57be105331f08c412e32a9e9808cb new file mode 100755 index 0000000..93710ab Binary files /dev/null and b/.git_disabled/objects/01/680fdacfa57be105331f08c412e32a9e9808cb differ diff --git a/.git_disabled/objects/01/6f33e389d683d59f3af642d38f20d05a52db6b b/.git_disabled/objects/01/6f33e389d683d59f3af642d38f20d05a52db6b new file mode 100755 index 0000000..817f5b6 Binary files /dev/null and b/.git_disabled/objects/01/6f33e389d683d59f3af642d38f20d05a52db6b differ diff --git a/.git_disabled/objects/01/8b6eaa7cb6753d800597fa55c8ce38422968a0 b/.git_disabled/objects/01/8b6eaa7cb6753d800597fa55c8ce38422968a0 new file mode 100755 index 0000000..203ba9c Binary files /dev/null and b/.git_disabled/objects/01/8b6eaa7cb6753d800597fa55c8ce38422968a0 differ diff --git a/.git_disabled/objects/01/8eb28137cdf3345434a174d7ac0505cebf0235 b/.git_disabled/objects/01/8eb28137cdf3345434a174d7ac0505cebf0235 new file mode 100755 index 0000000..8067e83 Binary files /dev/null and b/.git_disabled/objects/01/8eb28137cdf3345434a174d7ac0505cebf0235 differ diff --git a/.git_disabled/objects/01/91f9ec036a3d8e7177cd78b524d0a73d7cd4cc b/.git_disabled/objects/01/91f9ec036a3d8e7177cd78b524d0a73d7cd4cc new file mode 100755 index 0000000..eb42869 Binary files /dev/null and b/.git_disabled/objects/01/91f9ec036a3d8e7177cd78b524d0a73d7cd4cc differ diff --git a/.git_disabled/objects/01/c71fb24038cc9a348681251027dd5857482cb8 b/.git_disabled/objects/01/c71fb24038cc9a348681251027dd5857482cb8 new file mode 100755 index 0000000..6394866 Binary files /dev/null and b/.git_disabled/objects/01/c71fb24038cc9a348681251027dd5857482cb8 differ diff --git a/.git_disabled/objects/01/dd4bdd1bfe40217f86b0113114642d7431677f b/.git_disabled/objects/01/dd4bdd1bfe40217f86b0113114642d7431677f new file mode 100755 index 0000000..dab4222 Binary files /dev/null and b/.git_disabled/objects/01/dd4bdd1bfe40217f86b0113114642d7431677f differ diff --git a/.git_disabled/objects/01/e9984f115ae7c5fd4d90d4ecd600b26db614c7 b/.git_disabled/objects/01/e9984f115ae7c5fd4d90d4ecd600b26db614c7 new file mode 100755 index 0000000..5eb2766 Binary files /dev/null and b/.git_disabled/objects/01/e9984f115ae7c5fd4d90d4ecd600b26db614c7 differ diff --git a/.git_disabled/objects/01/f752e943cc1948f6cf601adc8918bc72180168 b/.git_disabled/objects/01/f752e943cc1948f6cf601adc8918bc72180168 new file mode 100755 index 0000000..5042f0a Binary files /dev/null and b/.git_disabled/objects/01/f752e943cc1948f6cf601adc8918bc72180168 differ diff --git a/.git_disabled/objects/02/225e541fce22d5ce7d46abbbd3854d92048108 b/.git_disabled/objects/02/225e541fce22d5ce7d46abbbd3854d92048108 new file mode 100755 index 0000000..db3b624 Binary files /dev/null and b/.git_disabled/objects/02/225e541fce22d5ce7d46abbbd3854d92048108 differ diff --git a/.git_disabled/objects/02/2cc35be5b98fd338f79ccc3e7f46c2cd1c1ff8 b/.git_disabled/objects/02/2cc35be5b98fd338f79ccc3e7f46c2cd1c1ff8 new file mode 100755 index 0000000..cb83990 Binary files /dev/null and b/.git_disabled/objects/02/2cc35be5b98fd338f79ccc3e7f46c2cd1c1ff8 differ diff --git a/.git_disabled/objects/02/3011eaedd03b272dd196de29f55cf674de62f8 b/.git_disabled/objects/02/3011eaedd03b272dd196de29f55cf674de62f8 new file mode 100755 index 0000000..3d1533b Binary files /dev/null and b/.git_disabled/objects/02/3011eaedd03b272dd196de29f55cf674de62f8 differ diff --git a/.git_disabled/objects/02/3daed9339fe39aa9a4280745ba9df75b3f6ba3 b/.git_disabled/objects/02/3daed9339fe39aa9a4280745ba9df75b3f6ba3 new file mode 100755 index 0000000..8b40c1e Binary files /dev/null and b/.git_disabled/objects/02/3daed9339fe39aa9a4280745ba9df75b3f6ba3 differ diff --git a/.git_disabled/objects/02/4d9515792dc9f4a36e479d835b517b47bcdc27 b/.git_disabled/objects/02/4d9515792dc9f4a36e479d835b517b47bcdc27 new file mode 100755 index 0000000..1678128 Binary files /dev/null and b/.git_disabled/objects/02/4d9515792dc9f4a36e479d835b517b47bcdc27 differ diff --git a/.git_disabled/objects/02/5abca1ce68a556add7541091b8066ce0534246 b/.git_disabled/objects/02/5abca1ce68a556add7541091b8066ce0534246 new file mode 100755 index 0000000..c704549 Binary files /dev/null and b/.git_disabled/objects/02/5abca1ce68a556add7541091b8066ce0534246 differ diff --git a/.git_disabled/objects/02/7241aa74fcaa869c9dcfac2e05f2914a34c891 b/.git_disabled/objects/02/7241aa74fcaa869c9dcfac2e05f2914a34c891 new file mode 100755 index 0000000..7caedf2 Binary files /dev/null and b/.git_disabled/objects/02/7241aa74fcaa869c9dcfac2e05f2914a34c891 differ diff --git a/.git_disabled/objects/02/73c8e4ef28b0bb9d308f2191b49fa30a019eb0 b/.git_disabled/objects/02/73c8e4ef28b0bb9d308f2191b49fa30a019eb0 new file mode 100755 index 0000000..319758a Binary files /dev/null and b/.git_disabled/objects/02/73c8e4ef28b0bb9d308f2191b49fa30a019eb0 differ diff --git a/.git_disabled/objects/02/7c3547d9c76e72200d8db1b030aa4c6d978aa2 b/.git_disabled/objects/02/7c3547d9c76e72200d8db1b030aa4c6d978aa2 new file mode 100755 index 0000000..eede448 --- /dev/null +++ b/.git_disabled/objects/02/7c3547d9c76e72200d8db1b030aa4c6d978aa2 @@ -0,0 +1,4 @@ +xURMk1~@[bhsiE/Vb/4 Cvne +=POVA=J/ -QZW/Lfvu>yy?R+P5^V)bozV) ( F>Bdžo܈mAw9 @s1:t4n֚8wYBfIB<,YF"MF$\TCIͰ6037U=qXnSat6}ix4ӧmΒ^ ;GzlC |Hz Q U5٧[9aSUxZh<<' A,WQZIT0Bu?HNZ*ZBL6 )G,s6ӝ<qQ:|uҮ[4J^{[F7>:+h<PVA\+?WHIM_dIJ˸oiPia%~B>A +6=~{hݵF1f?Aؑ2'SIQ-r3'# usݹ4@~R4Q&kY36 + w g C_L z/3f6oeR?? \ No newline at end of file diff --git a/.git_disabled/objects/02/908cc14b4362f506b7a2ab062b66ffe13461c3 b/.git_disabled/objects/02/908cc14b4362f506b7a2ab062b66ffe13461c3 new file mode 100755 index 0000000..9bc3402 Binary files /dev/null and b/.git_disabled/objects/02/908cc14b4362f506b7a2ab062b66ffe13461c3 differ diff --git a/.git_disabled/objects/02/92f8c44285d18a524d6d536824ff44fe4fe5b6 b/.git_disabled/objects/02/92f8c44285d18a524d6d536824ff44fe4fe5b6 new file mode 100755 index 0000000..6bc24f9 Binary files /dev/null and b/.git_disabled/objects/02/92f8c44285d18a524d6d536824ff44fe4fe5b6 differ diff --git a/.git_disabled/objects/02/930f22002ef9830f6ccaeb422c936517458550 b/.git_disabled/objects/02/930f22002ef9830f6ccaeb422c936517458550 new file mode 100755 index 0000000..230c4f0 Binary files /dev/null and b/.git_disabled/objects/02/930f22002ef9830f6ccaeb422c936517458550 differ diff --git a/.git_disabled/objects/02/9e2fe383878e18d6f7688b1f7f889e666bb28c b/.git_disabled/objects/02/9e2fe383878e18d6f7688b1f7f889e666bb28c new file mode 100755 index 0000000..c1a680e Binary files /dev/null and b/.git_disabled/objects/02/9e2fe383878e18d6f7688b1f7f889e666bb28c differ diff --git a/.git_disabled/objects/02/d718d8268b2770c43b1293a4233edcb62c8cd0 b/.git_disabled/objects/02/d718d8268b2770c43b1293a4233edcb62c8cd0 new file mode 100755 index 0000000..a9bf82b Binary files /dev/null and b/.git_disabled/objects/02/d718d8268b2770c43b1293a4233edcb62c8cd0 differ diff --git a/.git_disabled/objects/02/d99e7f381f10e5ad61a5d220d493d962098cbd b/.git_disabled/objects/02/d99e7f381f10e5ad61a5d220d493d962098cbd new file mode 100755 index 0000000..22ee3f3 Binary files /dev/null and b/.git_disabled/objects/02/d99e7f381f10e5ad61a5d220d493d962098cbd differ diff --git a/.git_disabled/objects/02/f4ea4c90f14bc5f6b56b8e3b544ce16c1bd7ba b/.git_disabled/objects/02/f4ea4c90f14bc5f6b56b8e3b544ce16c1bd7ba new file mode 100755 index 0000000..14787b2 Binary files /dev/null and b/.git_disabled/objects/02/f4ea4c90f14bc5f6b56b8e3b544ce16c1bd7ba differ diff --git a/.git_disabled/objects/02/ff82fd56e3c6fd643222a30625c17d4220addb b/.git_disabled/objects/02/ff82fd56e3c6fd643222a30625c17d4220addb new file mode 100755 index 0000000..be1a491 Binary files /dev/null and b/.git_disabled/objects/02/ff82fd56e3c6fd643222a30625c17d4220addb differ diff --git a/.git_disabled/objects/03/037d9bb762025e97e74c7495fecde9b9ee1a1d b/.git_disabled/objects/03/037d9bb762025e97e74c7495fecde9b9ee1a1d new file mode 100755 index 0000000..209e632 Binary files /dev/null and b/.git_disabled/objects/03/037d9bb762025e97e74c7495fecde9b9ee1a1d differ diff --git a/.git_disabled/objects/03/220f7c2a73b17ae00dc58b429a0ba59e35ad15 b/.git_disabled/objects/03/220f7c2a73b17ae00dc58b429a0ba59e35ad15 new file mode 100755 index 0000000..afe215b Binary files /dev/null and b/.git_disabled/objects/03/220f7c2a73b17ae00dc58b429a0ba59e35ad15 differ diff --git a/.git_disabled/objects/03/245fb4871c3bd44629a254d3aef0a56c968602 b/.git_disabled/objects/03/245fb4871c3bd44629a254d3aef0a56c968602 new file mode 100755 index 0000000..03a422f Binary files /dev/null and b/.git_disabled/objects/03/245fb4871c3bd44629a254d3aef0a56c968602 differ diff --git a/.git_disabled/objects/03/24c49d388d92293dc2c2c4dfe2900e0e7ad83a b/.git_disabled/objects/03/24c49d388d92293dc2c2c4dfe2900e0e7ad83a new file mode 100755 index 0000000..d0b5317 Binary files /dev/null and b/.git_disabled/objects/03/24c49d388d92293dc2c2c4dfe2900e0e7ad83a differ diff --git a/.git_disabled/objects/03/28b646ad74327878655bc63233dcd2959b8df7 b/.git_disabled/objects/03/28b646ad74327878655bc63233dcd2959b8df7 new file mode 100755 index 0000000..fa4227e Binary files /dev/null and b/.git_disabled/objects/03/28b646ad74327878655bc63233dcd2959b8df7 differ diff --git a/.git_disabled/objects/03/380350bb4b50478f0601979bdcf7ddff2d6650 b/.git_disabled/objects/03/380350bb4b50478f0601979bdcf7ddff2d6650 new file mode 100755 index 0000000..6a2f135 Binary files /dev/null and b/.git_disabled/objects/03/380350bb4b50478f0601979bdcf7ddff2d6650 differ diff --git a/.git_disabled/objects/03/44ec0c3702e59b42f16f696c5393c2be91d3b2 b/.git_disabled/objects/03/44ec0c3702e59b42f16f696c5393c2be91d3b2 new file mode 100755 index 0000000..c70ef8c Binary files /dev/null and b/.git_disabled/objects/03/44ec0c3702e59b42f16f696c5393c2be91d3b2 differ diff --git a/.git_disabled/objects/03/5a1a8becdc33cc4dfb21ada030fa3437607847 b/.git_disabled/objects/03/5a1a8becdc33cc4dfb21ada030fa3437607847 new file mode 100755 index 0000000..c154449 Binary files /dev/null and b/.git_disabled/objects/03/5a1a8becdc33cc4dfb21ada030fa3437607847 differ diff --git a/.git_disabled/objects/03/5b7e276e319d57094828a5cd401552a7a4cb1f b/.git_disabled/objects/03/5b7e276e319d57094828a5cd401552a7a4cb1f new file mode 100755 index 0000000..0493be1 Binary files /dev/null and b/.git_disabled/objects/03/5b7e276e319d57094828a5cd401552a7a4cb1f differ diff --git a/.git_disabled/objects/03/7376d51651a5d0c8d421254870be690073e20d b/.git_disabled/objects/03/7376d51651a5d0c8d421254870be690073e20d new file mode 100755 index 0000000..120cd43 Binary files /dev/null and b/.git_disabled/objects/03/7376d51651a5d0c8d421254870be690073e20d differ diff --git a/.git_disabled/objects/03/815d2765954c5412797e9b38bacc172bcb6c67 b/.git_disabled/objects/03/815d2765954c5412797e9b38bacc172bcb6c67 new file mode 100755 index 0000000..ca3a0ff Binary files /dev/null and b/.git_disabled/objects/03/815d2765954c5412797e9b38bacc172bcb6c67 differ diff --git a/.git_disabled/objects/03/83f9d34f8b77d392270d5db4d4f3f476d7cd12 b/.git_disabled/objects/03/83f9d34f8b77d392270d5db4d4f3f476d7cd12 new file mode 100755 index 0000000..cbaddb3 --- /dev/null +++ b/.git_disabled/objects/03/83f9d34f8b77d392270d5db4d4f3f476d7cd12 @@ -0,0 +1,4 @@ +xT09_1 %H+P[¡vUu1ɄXuv;!dI()yfg27p{{M" %7܉0&pYaˆm`l:Ϧ;p ׇ L KUVΈM ֟<=C,$a!Q.-Ɓ[Erekx!*sH|2vӹ f;NRƇ?K2I*mpƔz^lt +> ,4Tbc[jtJH/ +cʊCGz_'͝6_LnYu-6yqm)ة:#:ɭ1b9LȃP FvԱҪHY|:]?/c6x@OoMw0ĹwIw_um$KǠ!v=oE_Flo`44kQl^c`viĕVbA 7kkpW9xl˙eO wk䕆Jmi`@R2{5ާڻD :$]8 +j \ No newline at end of file diff --git a/.git_disabled/objects/03/8915be1125682403e1bcdc6fc7249426c0f94d b/.git_disabled/objects/03/8915be1125682403e1bcdc6fc7249426c0f94d new file mode 100755 index 0000000..59c5a43 Binary files /dev/null and b/.git_disabled/objects/03/8915be1125682403e1bcdc6fc7249426c0f94d differ diff --git a/.git_disabled/objects/03/9a28b051f2b00e65db18115b0bed2cd7f564ea b/.git_disabled/objects/03/9a28b051f2b00e65db18115b0bed2cd7f564ea new file mode 100755 index 0000000..d0cf6ef Binary files /dev/null and b/.git_disabled/objects/03/9a28b051f2b00e65db18115b0bed2cd7f564ea differ diff --git a/.git_disabled/objects/03/a114979d2642e0699fe4f0da10424e5b9714ea b/.git_disabled/objects/03/a114979d2642e0699fe4f0da10424e5b9714ea new file mode 100755 index 0000000..a7e762e Binary files /dev/null and b/.git_disabled/objects/03/a114979d2642e0699fe4f0da10424e5b9714ea differ diff --git a/.git_disabled/objects/03/c164517b1ca5d153012603363bd6645e2a07df b/.git_disabled/objects/03/c164517b1ca5d153012603363bd6645e2a07df new file mode 100755 index 0000000..c9c0769 Binary files /dev/null and b/.git_disabled/objects/03/c164517b1ca5d153012603363bd6645e2a07df differ diff --git a/.git_disabled/objects/03/c9893ffb7743ac009acd7c1089955b91127e13 b/.git_disabled/objects/03/c9893ffb7743ac009acd7c1089955b91127e13 new file mode 100755 index 0000000..595b1b8 Binary files /dev/null and b/.git_disabled/objects/03/c9893ffb7743ac009acd7c1089955b91127e13 differ diff --git a/.git_disabled/objects/03/d8ae0a4617dd74605dd63f56ad1f7523db1935 b/.git_disabled/objects/03/d8ae0a4617dd74605dd63f56ad1f7523db1935 new file mode 100755 index 0000000..3a30eca Binary files /dev/null and b/.git_disabled/objects/03/d8ae0a4617dd74605dd63f56ad1f7523db1935 differ diff --git a/.git_disabled/objects/03/e879d87250b1eb17c7245ca4ac4be144a91886 b/.git_disabled/objects/03/e879d87250b1eb17c7245ca4ac4be144a91886 new file mode 100755 index 0000000..95542c6 Binary files /dev/null and b/.git_disabled/objects/03/e879d87250b1eb17c7245ca4ac4be144a91886 differ diff --git a/.git_disabled/objects/04/05ec3ca82802e01b0ea9e93e7630e7c51eaa7c b/.git_disabled/objects/04/05ec3ca82802e01b0ea9e93e7630e7c51eaa7c new file mode 100755 index 0000000..a05725f Binary files /dev/null and b/.git_disabled/objects/04/05ec3ca82802e01b0ea9e93e7630e7c51eaa7c differ diff --git a/.git_disabled/objects/04/1ecb18ff6393fe8a5a3fcb5f727f4ae42952f7 b/.git_disabled/objects/04/1ecb18ff6393fe8a5a3fcb5f727f4ae42952f7 new file mode 100755 index 0000000..63bafab Binary files /dev/null and b/.git_disabled/objects/04/1ecb18ff6393fe8a5a3fcb5f727f4ae42952f7 differ diff --git a/.git_disabled/objects/04/264e8f20dc874881fd56b4463ace769993deb7 b/.git_disabled/objects/04/264e8f20dc874881fd56b4463ace769993deb7 new file mode 100755 index 0000000..b5ca561 Binary files /dev/null and b/.git_disabled/objects/04/264e8f20dc874881fd56b4463ace769993deb7 differ diff --git a/.git_disabled/objects/04/2c0c606d0392d939ecf349e583b41c48fce3c0 b/.git_disabled/objects/04/2c0c606d0392d939ecf349e583b41c48fce3c0 new file mode 100755 index 0000000..ddb82a6 Binary files /dev/null and b/.git_disabled/objects/04/2c0c606d0392d939ecf349e583b41c48fce3c0 differ diff --git a/.git_disabled/objects/04/2d76162623b32709a399d79a83099f1d6e010f b/.git_disabled/objects/04/2d76162623b32709a399d79a83099f1d6e010f new file mode 100755 index 0000000..a55cb90 --- /dev/null +++ b/.git_disabled/objects/04/2d76162623b32709a399d79a83099f1d6e010f @@ -0,0 +1,5 @@ +xoTsduu @)#@ +uey IcF4Pq׷TFqy2ƻ`&{ t|0]ν Ɍ>2-^l®?o@g'ǣ?!ΥG1@L & b1@L & b1@L & b1@L & ac]SkSԠ:ըJ*SR:RJmjQTUBe*QR*Qb1@L & b1@L & b18vX>5q ūx>.^/KQ<"~?sٹ6+s'$="@ZȞ7~| wbO+3Ol;o'[G \o71F|\᣹|]f>kf܉vg?؏G<& O߉w>x6#O'f~O^?#bٝ;1 ?f+n|E8mOٛs|~?Nl!,~ ~/~ľ.}?}'[__߈g#~[<%Oov;kb=:$+bߟ/}$=*Eﷃb~~~zN_ϊ>#_|+׿_{ľw}?žw}?~!]qV-bߏž7}?nAz_~=XFh*bG+ľ}-^*}=$}Dz-%6S7"17 \ No newline at end of file diff --git a/.git_disabled/objects/04/3454db08a1c72bd0bbda869407ea03c9ef7930 b/.git_disabled/objects/04/3454db08a1c72bd0bbda869407ea03c9ef7930 new file mode 100755 index 0000000..099f323 --- /dev/null +++ b/.git_disabled/objects/04/3454db08a1c72bd0bbda869407ea03c9ef7930 @@ -0,0 +1 @@ +xEOj@9_1M JV㡧eLugٝ }ji潙LǗɞ ;M&֡G='=ȁ{ri!N"GlW}6[ƷhW!tV: Qj[L.~C3+PfA1٦Ir<cy}(y'ANo|N\}fQ9:C!@,k1Ē݉#IT2_1EUZ̖XfKJ!^Dl(za \ No newline at end of file diff --git a/.git_disabled/objects/04/35b5ebcf369b2cc38efc034f2e48de1e69dd42 b/.git_disabled/objects/04/35b5ebcf369b2cc38efc034f2e48de1e69dd42 new file mode 100755 index 0000000..aa77bb5 Binary files /dev/null and b/.git_disabled/objects/04/35b5ebcf369b2cc38efc034f2e48de1e69dd42 differ diff --git a/.git_disabled/objects/04/3af0f1450e1d83829edb9c2d092f50659a6156 b/.git_disabled/objects/04/3af0f1450e1d83829edb9c2d092f50659a6156 new file mode 100755 index 0000000..ff4978b Binary files /dev/null and b/.git_disabled/objects/04/3af0f1450e1d83829edb9c2d092f50659a6156 differ diff --git a/.git_disabled/objects/04/409a0ee28b130c19927b94d69518a49155a9e9 b/.git_disabled/objects/04/409a0ee28b130c19927b94d69518a49155a9e9 new file mode 100755 index 0000000..8c55fc0 Binary files /dev/null and b/.git_disabled/objects/04/409a0ee28b130c19927b94d69518a49155a9e9 differ diff --git a/.git_disabled/objects/04/46eae7c67093317754d23afb3e95267a9aef4c b/.git_disabled/objects/04/46eae7c67093317754d23afb3e95267a9aef4c new file mode 100755 index 0000000..815286a Binary files /dev/null and b/.git_disabled/objects/04/46eae7c67093317754d23afb3e95267a9aef4c differ diff --git a/.git_disabled/objects/04/49c3d9f31c448c6efd4d19de3bc26d3d98a76d b/.git_disabled/objects/04/49c3d9f31c448c6efd4d19de3bc26d3d98a76d new file mode 100755 index 0000000..e022262 Binary files /dev/null and b/.git_disabled/objects/04/49c3d9f31c448c6efd4d19de3bc26d3d98a76d differ diff --git a/.git_disabled/objects/04/73ce52770361fb9f545629bdf8304732944a4e b/.git_disabled/objects/04/73ce52770361fb9f545629bdf8304732944a4e new file mode 100755 index 0000000..f78f01a Binary files /dev/null and b/.git_disabled/objects/04/73ce52770361fb9f545629bdf8304732944a4e differ diff --git a/.git_disabled/objects/04/7baa1c805a1fbfca05673319f926546bdcd635 b/.git_disabled/objects/04/7baa1c805a1fbfca05673319f926546bdcd635 new file mode 100755 index 0000000..fa4fa4a Binary files /dev/null and b/.git_disabled/objects/04/7baa1c805a1fbfca05673319f926546bdcd635 differ diff --git a/.git_disabled/objects/04/9de81608be8d0c6b6f4401d6fc38b1e790e41b b/.git_disabled/objects/04/9de81608be8d0c6b6f4401d6fc38b1e790e41b new file mode 100755 index 0000000..3eb1a28 Binary files /dev/null and b/.git_disabled/objects/04/9de81608be8d0c6b6f4401d6fc38b1e790e41b differ diff --git a/.git_disabled/objects/04/b4c5bd6e860f9020de9d2c59ea112924476e47 b/.git_disabled/objects/04/b4c5bd6e860f9020de9d2c59ea112924476e47 new file mode 100755 index 0000000..5f63c1a Binary files /dev/null and b/.git_disabled/objects/04/b4c5bd6e860f9020de9d2c59ea112924476e47 differ diff --git a/.git_disabled/objects/04/b8240429b303ffd372ace2427762a966dae0a5 b/.git_disabled/objects/04/b8240429b303ffd372ace2427762a966dae0a5 new file mode 100755 index 0000000..a29f788 Binary files /dev/null and b/.git_disabled/objects/04/b8240429b303ffd372ace2427762a966dae0a5 differ diff --git a/.git_disabled/objects/04/b87f0a21131c165f728d5a8f77f4b79597cd0f b/.git_disabled/objects/04/b87f0a21131c165f728d5a8f77f4b79597cd0f new file mode 100755 index 0000000..b28a325 Binary files /dev/null and b/.git_disabled/objects/04/b87f0a21131c165f728d5a8f77f4b79597cd0f differ diff --git a/.git_disabled/objects/04/c0fab7dc8c259f6626a1bcebc5d28ced4fcc57 b/.git_disabled/objects/04/c0fab7dc8c259f6626a1bcebc5d28ced4fcc57 new file mode 100755 index 0000000..04cf27b Binary files /dev/null and b/.git_disabled/objects/04/c0fab7dc8c259f6626a1bcebc5d28ced4fcc57 differ diff --git a/.git_disabled/objects/04/c21d62efaf90a774e906e2ba70e3ae54149cda b/.git_disabled/objects/04/c21d62efaf90a774e906e2ba70e3ae54149cda new file mode 100755 index 0000000..647963d Binary files /dev/null and b/.git_disabled/objects/04/c21d62efaf90a774e906e2ba70e3ae54149cda differ diff --git a/.git_disabled/objects/04/c846ec3cbfc5346419e4ab29bdb854117edb2f b/.git_disabled/objects/04/c846ec3cbfc5346419e4ab29bdb854117edb2f new file mode 100755 index 0000000..f0bdd47 Binary files /dev/null and b/.git_disabled/objects/04/c846ec3cbfc5346419e4ab29bdb854117edb2f differ diff --git a/.git_disabled/objects/04/e5ea6aff6f1b299c9b1ef48b59fe031857a813 b/.git_disabled/objects/04/e5ea6aff6f1b299c9b1ef48b59fe031857a813 new file mode 100755 index 0000000..29f8b38 Binary files /dev/null and b/.git_disabled/objects/04/e5ea6aff6f1b299c9b1ef48b59fe031857a813 differ diff --git a/.git_disabled/objects/05/044300a0fc91e6f08648fcb0373d11b6d9eaa6 b/.git_disabled/objects/05/044300a0fc91e6f08648fcb0373d11b6d9eaa6 new file mode 100755 index 0000000..bbd62dc Binary files /dev/null and b/.git_disabled/objects/05/044300a0fc91e6f08648fcb0373d11b6d9eaa6 differ diff --git a/.git_disabled/objects/05/1398a84286319a1dd8d16fda870656f17cba85 b/.git_disabled/objects/05/1398a84286319a1dd8d16fda870656f17cba85 new file mode 100755 index 0000000..6f90915 Binary files /dev/null and b/.git_disabled/objects/05/1398a84286319a1dd8d16fda870656f17cba85 differ diff --git a/.git_disabled/objects/05/1ae2f91d1b9fe1067c5d6d1d360f98e129aaeb b/.git_disabled/objects/05/1ae2f91d1b9fe1067c5d6d1d360f98e129aaeb new file mode 100755 index 0000000..1ecdd31 Binary files /dev/null and b/.git_disabled/objects/05/1ae2f91d1b9fe1067c5d6d1d360f98e129aaeb differ diff --git a/.git_disabled/objects/05/517c993e74d7649103b8f03001df276c8a8f15 b/.git_disabled/objects/05/517c993e74d7649103b8f03001df276c8a8f15 new file mode 100755 index 0000000..f796489 Binary files /dev/null and b/.git_disabled/objects/05/517c993e74d7649103b8f03001df276c8a8f15 differ diff --git a/.git_disabled/objects/05/5f46ef988554f785f1889076c6063d12ef4d9f b/.git_disabled/objects/05/5f46ef988554f785f1889076c6063d12ef4d9f new file mode 100755 index 0000000..de5e668 Binary files /dev/null and b/.git_disabled/objects/05/5f46ef988554f785f1889076c6063d12ef4d9f differ diff --git a/.git_disabled/objects/05/616d6ec18a22659e73a9b07ded38434f53247e b/.git_disabled/objects/05/616d6ec18a22659e73a9b07ded38434f53247e new file mode 100755 index 0000000..99ef31c Binary files /dev/null and b/.git_disabled/objects/05/616d6ec18a22659e73a9b07ded38434f53247e differ diff --git a/.git_disabled/objects/05/6f4b0097d3126ca99b557b989b45eabd3401bf b/.git_disabled/objects/05/6f4b0097d3126ca99b557b989b45eabd3401bf new file mode 100755 index 0000000..1af9c42 Binary files /dev/null and b/.git_disabled/objects/05/6f4b0097d3126ca99b557b989b45eabd3401bf differ diff --git a/.git_disabled/objects/05/81812bd4b9a1dcd9f9c7afdf64a4aedaedd570 b/.git_disabled/objects/05/81812bd4b9a1dcd9f9c7afdf64a4aedaedd570 new file mode 100755 index 0000000..b194782 Binary files /dev/null and b/.git_disabled/objects/05/81812bd4b9a1dcd9f9c7afdf64a4aedaedd570 differ diff --git a/.git_disabled/objects/05/8617c40982fa9deb804b4046c1bc71809eecdb b/.git_disabled/objects/05/8617c40982fa9deb804b4046c1bc71809eecdb new file mode 100755 index 0000000..ee05fcf Binary files /dev/null and b/.git_disabled/objects/05/8617c40982fa9deb804b4046c1bc71809eecdb differ diff --git a/.git_disabled/objects/05/936921b174e6f91a1e673fc5a3ea9c675f1482 b/.git_disabled/objects/05/936921b174e6f91a1e673fc5a3ea9c675f1482 new file mode 100755 index 0000000..2bc8da0 --- /dev/null +++ b/.git_disabled/objects/05/936921b174e6f91a1e673fc5a3ea9c675f1482 @@ -0,0 +1,3 @@ +xRMO0_1 +]! +i/[Z PO,^I2kR8s cGD9~~oLL߾|=XӂU{mgFVp=mɖpV(BFZTš|΂%Muc-jQ\>j#;iX)ؒ<O1v'w1槐71E03;l k8 =}h$-o}┠R'*4:uol#vvV|kJ"fCC蹯(0~| ˻֡ m0(g p k۫ۙGNh=밒 ؂'IzK]N,0X8)Rmpw1GW:N`#ЏnyG>%;b(r賅/'*δ] \ No newline at end of file diff --git a/.git_disabled/objects/05/99d837711bbcf3de88b6361f226faafb8b58c7 b/.git_disabled/objects/05/99d837711bbcf3de88b6361f226faafb8b58c7 new file mode 100755 index 0000000..7bea094 Binary files /dev/null and b/.git_disabled/objects/05/99d837711bbcf3de88b6361f226faafb8b58c7 differ diff --git a/.git_disabled/objects/05/9d8b6549c3e7981c48249ddd4fd921c884d5be b/.git_disabled/objects/05/9d8b6549c3e7981c48249ddd4fd921c884d5be new file mode 100755 index 0000000..d26dfd0 Binary files /dev/null and b/.git_disabled/objects/05/9d8b6549c3e7981c48249ddd4fd921c884d5be differ diff --git a/.git_disabled/objects/05/a38a7f103c082289cd65f95ace5695bc3a8842 b/.git_disabled/objects/05/a38a7f103c082289cd65f95ace5695bc3a8842 new file mode 100755 index 0000000..9d30e37 Binary files /dev/null and b/.git_disabled/objects/05/a38a7f103c082289cd65f95ace5695bc3a8842 differ diff --git a/.git_disabled/objects/05/b32e65e4bee0b26cb1332f8fdd920faa21dbe4 b/.git_disabled/objects/05/b32e65e4bee0b26cb1332f8fdd920faa21dbe4 new file mode 100755 index 0000000..17b7614 Binary files /dev/null and b/.git_disabled/objects/05/b32e65e4bee0b26cb1332f8fdd920faa21dbe4 differ diff --git a/.git_disabled/objects/05/b81d6815190b7aec948997a075387aa8a8750c b/.git_disabled/objects/05/b81d6815190b7aec948997a075387aa8a8750c new file mode 100755 index 0000000..fad6504 Binary files /dev/null and b/.git_disabled/objects/05/b81d6815190b7aec948997a075387aa8a8750c differ diff --git a/.git_disabled/objects/05/bccbb0ce82e74b741ee2b444c9a02cd7288936 b/.git_disabled/objects/05/bccbb0ce82e74b741ee2b444c9a02cd7288936 new file mode 100755 index 0000000..65a8077 Binary files /dev/null and b/.git_disabled/objects/05/bccbb0ce82e74b741ee2b444c9a02cd7288936 differ diff --git a/.git_disabled/objects/05/d62bfdd4aeaada9259be6a1a8072a216e39500 b/.git_disabled/objects/05/d62bfdd4aeaada9259be6a1a8072a216e39500 new file mode 100755 index 0000000..2f9025e Binary files /dev/null and b/.git_disabled/objects/05/d62bfdd4aeaada9259be6a1a8072a216e39500 differ diff --git a/.git_disabled/objects/06/0ba86c674e7c017bd5e01c4eff98fd449cdbc1 b/.git_disabled/objects/06/0ba86c674e7c017bd5e01c4eff98fd449cdbc1 new file mode 100755 index 0000000..329edc3 Binary files /dev/null and b/.git_disabled/objects/06/0ba86c674e7c017bd5e01c4eff98fd449cdbc1 differ diff --git a/.git_disabled/objects/06/0f4aff4430336449dde3929b1bc90ac2a2c9e0 b/.git_disabled/objects/06/0f4aff4430336449dde3929b1bc90ac2a2c9e0 new file mode 100755 index 0000000..91db934 Binary files /dev/null and b/.git_disabled/objects/06/0f4aff4430336449dde3929b1bc90ac2a2c9e0 differ diff --git a/.git_disabled/objects/06/1f0d7e100b04a338249ae592ead886fa54335e b/.git_disabled/objects/06/1f0d7e100b04a338249ae592ead886fa54335e new file mode 100755 index 0000000..0c3f1a2 Binary files /dev/null and b/.git_disabled/objects/06/1f0d7e100b04a338249ae592ead886fa54335e differ diff --git a/.git_disabled/objects/06/27fc92e3bcb101b1f378434c5ab73e958255cf b/.git_disabled/objects/06/27fc92e3bcb101b1f378434c5ab73e958255cf new file mode 100755 index 0000000..d454dcc Binary files /dev/null and b/.git_disabled/objects/06/27fc92e3bcb101b1f378434c5ab73e958255cf differ diff --git a/.git_disabled/objects/06/297b3bf46ea3a0b01ff389e5eef524a9f08bb0 b/.git_disabled/objects/06/297b3bf46ea3a0b01ff389e5eef524a9f08bb0 new file mode 100755 index 0000000..5d858f8 --- /dev/null +++ b/.git_disabled/objects/06/297b3bf46ea3a0b01ff389e5eef524a9f08bb0 @@ -0,0 +1,4 @@ +xyeeyƿ{fٛYDٚ}G@mm@LpٛaST+1aBhLb4?KD-T9e~CU*UV:]03y9~߹;cOxDךK2xn`^q̂2w1|}@?v:u@ׁ]t:u@ׁ]t:u@ׁ]t:u@ׁX8nԶ?uDg&FiVVKSҤ4!JEkEiNVI˥Ҹ4"myz,mKk5JiDJsOi|i4+H)iRF"m~RKuҴJZ.-ƥi_$Jk2i4&-FiVVKSҤ4!JEڼVKuҴJZ.-ƥi˧5IZ/H+eiLZ(=Ҭ4#IiBQ/mI*iTF-h|i^Z+VJˤ%ҘP{XKYiFZ-MI҄4*iC_ Uri4.H[&iVZ#IK1i47Ҭ4#IiB/mI*iTF-k|i^Z+VJˤ%ҘPOKYiFZ-MI҄4*i_ Uri4.H[&iVZ#IK1i4wƗ6JҌZ& iT*4AZ'MKRi\Lk|i^Z+VJˤ%ҘP/mfi}u:@O{fRz2Z"wvXķw%`ߙ8#q=Pa\H(~J6o)РE[ ݇[g $NO&θoI.-qɹ,q\8y.H|D׉+PP`yM9_gaK~8Ig'NV?3q|a!?/-zn7|\Ky\$8q_8ߓ89#P8z/R>8H"ͪ-,ϯgwȼW\ȳg|\suէs+:imse⵾W_c8yG`yg o +XB_rzw%N$q{jY8yޜ8}xy +-r89ߘ89ON'%N'bZqr89K<&NQStXԿ6qwUEk~wU~WTO.S?"EΉST:Z8ۋ?]TkQ]/]Տ֢~k^ďS:,~ǻ.Hq-b\.G@/TsZ7C=~z]Ŝ}?:1q{7UzL}{*qOESuğ ,}:"r|>-usg!Mk? |;r|<ߎwq^q^G7_yX?8oqg\Ϸ#a~/y[?85yx~9>E>8/DN3pȩ?f~RTyb#8G'N׵.ۢcSHwB=8;VaE3vQ29q^Pϸ^E;άº_"_FuB[{9^wܧp>gŮoׁ_HNm$|i/]-yuh9x}}S"'+ 0x}9y^<^/FN#'׋xӔy%[5OK>^+oo3Ϭ9S5gS%^mE?(B9}TK_>G^9(s5Ϡϑ<>G^ 9yVy\>92qr89O%NC'x\F9yi1fjD5gSNu"s}猜>8g9#?*rϗ?s"}m>Xk8^_|XON7ekVOS>Iտ)~$r}=r}~T|~_X s'\/9?rIc}s~$տ_<ω9W~<'rYo9F[1r=o#ZW:c#:q/YWq_8I?o|_#q=ye%~ވ?oD7"߯/ɟu~GWg~W˪3#My|"Myk/rY_8$|Y7<Y@ߟ8%^m?-տ3/gտ_ȫ@WgT+"W><󥿔?{9=_$ɮgɑ`89KS{ϫ_&XxWu^;kDθ~WO"gg\_?*qa\֗~)?'yQe`y4r@y؏M?DN'i-sx<&EN"'퉓W'ϯsKj36}scC頻<+CyNK'_Oc=yޟ8yޗ8yޛxӔ]yتyrY5Ob}Ӵk85OS?r89 <_@"'9yrɳ2q\8yL><zsT92q8yOO?#yT竧$#q9~?r"SՃ'K"'9r'ϡgcx<~ +c 3!9/` ߨH֮ϤۃYX.avFEXzͤʚ.l>h#8mD!?j/mz~5xY*|K\o7}ٱx){tSpyռ \ No newline at end of file diff --git a/.git_disabled/objects/06/aeaace2f5fc7dba4f14cbab4d13822064f7701 b/.git_disabled/objects/06/aeaace2f5fc7dba4f14cbab4d13822064f7701 new file mode 100755 index 0000000..bbc940f Binary files /dev/null and b/.git_disabled/objects/06/aeaace2f5fc7dba4f14cbab4d13822064f7701 differ diff --git a/.git_disabled/objects/06/b63af2427c62eeb4aed0f1127c7815d5db023f b/.git_disabled/objects/06/b63af2427c62eeb4aed0f1127c7815d5db023f new file mode 100755 index 0000000..98e6232 Binary files /dev/null and b/.git_disabled/objects/06/b63af2427c62eeb4aed0f1127c7815d5db023f differ diff --git a/.git_disabled/objects/06/c599f731c2ccaf100872feec6fb0d88849ddd6 b/.git_disabled/objects/06/c599f731c2ccaf100872feec6fb0d88849ddd6 new file mode 100755 index 0000000..f3b20d8 Binary files /dev/null and b/.git_disabled/objects/06/c599f731c2ccaf100872feec6fb0d88849ddd6 differ diff --git a/.git_disabled/objects/06/ddd60c3138a2b1b5e824f41db9753159d92c1a b/.git_disabled/objects/06/ddd60c3138a2b1b5e824f41db9753159d92c1a new file mode 100755 index 0000000..667375a Binary files /dev/null and b/.git_disabled/objects/06/ddd60c3138a2b1b5e824f41db9753159d92c1a differ diff --git a/.git_disabled/objects/06/ec87d6b9e23bb67772113708e10b9d2357b624 b/.git_disabled/objects/06/ec87d6b9e23bb67772113708e10b9d2357b624 new file mode 100755 index 0000000..b9dc258 Binary files /dev/null and b/.git_disabled/objects/06/ec87d6b9e23bb67772113708e10b9d2357b624 differ diff --git a/.git_disabled/objects/07/02d30068e66b83cbb50d206b5b9091daeb3df2 b/.git_disabled/objects/07/02d30068e66b83cbb50d206b5b9091daeb3df2 new file mode 100755 index 0000000..3f7d2dd Binary files /dev/null and b/.git_disabled/objects/07/02d30068e66b83cbb50d206b5b9091daeb3df2 differ diff --git a/.git_disabled/objects/07/07a4dd6c6316297f51d19ed0bc0b71a9e5a35e b/.git_disabled/objects/07/07a4dd6c6316297f51d19ed0bc0b71a9e5a35e new file mode 100755 index 0000000..38c918e Binary files /dev/null and b/.git_disabled/objects/07/07a4dd6c6316297f51d19ed0bc0b71a9e5a35e differ diff --git a/.git_disabled/objects/07/08508aab7b8824515134e8bccdd0120691e6a8 b/.git_disabled/objects/07/08508aab7b8824515134e8bccdd0120691e6a8 new file mode 100755 index 0000000..f99cd0c Binary files /dev/null and b/.git_disabled/objects/07/08508aab7b8824515134e8bccdd0120691e6a8 differ diff --git a/.git_disabled/objects/07/3f55d321e23d5414fd1aa7d4cb02aecc2b8405 b/.git_disabled/objects/07/3f55d321e23d5414fd1aa7d4cb02aecc2b8405 new file mode 100755 index 0000000..5140008 Binary files /dev/null and b/.git_disabled/objects/07/3f55d321e23d5414fd1aa7d4cb02aecc2b8405 differ diff --git a/.git_disabled/objects/07/489da530c3b5b20e7d67776618245f41e4f936 b/.git_disabled/objects/07/489da530c3b5b20e7d67776618245f41e4f936 new file mode 100755 index 0000000..c95ecd7 Binary files /dev/null and b/.git_disabled/objects/07/489da530c3b5b20e7d67776618245f41e4f936 differ diff --git a/.git_disabled/objects/07/566ee56ff37e277a16d5333b2128414e51cd46 b/.git_disabled/objects/07/566ee56ff37e277a16d5333b2128414e51cd46 new file mode 100755 index 0000000..a98ca2a Binary files /dev/null and b/.git_disabled/objects/07/566ee56ff37e277a16d5333b2128414e51cd46 differ diff --git a/.git_disabled/objects/07/6d6934e37ffafb1a85f924c2fc7508ff8d2227 b/.git_disabled/objects/07/6d6934e37ffafb1a85f924c2fc7508ff8d2227 new file mode 100755 index 0000000..8f91dfc Binary files /dev/null and b/.git_disabled/objects/07/6d6934e37ffafb1a85f924c2fc7508ff8d2227 differ diff --git a/.git_disabled/objects/07/c4fdde193c1105568b6d42421b45f9100c3f19 b/.git_disabled/objects/07/c4fdde193c1105568b6d42421b45f9100c3f19 new file mode 100755 index 0000000..0fffd78 Binary files /dev/null and b/.git_disabled/objects/07/c4fdde193c1105568b6d42421b45f9100c3f19 differ diff --git a/.git_disabled/objects/07/ce30ee47d0e7767e24e76505ba9ab1dd1e96e7 b/.git_disabled/objects/07/ce30ee47d0e7767e24e76505ba9ab1dd1e96e7 new file mode 100755 index 0000000..f31d203 Binary files /dev/null and b/.git_disabled/objects/07/ce30ee47d0e7767e24e76505ba9ab1dd1e96e7 differ diff --git a/.git_disabled/objects/07/daee36b80b06edb7b19d6026d8628a83f7d4b2 b/.git_disabled/objects/07/daee36b80b06edb7b19d6026d8628a83f7d4b2 new file mode 100755 index 0000000..4061862 --- /dev/null +++ b/.git_disabled/objects/07/daee36b80b06edb7b19d6026d8628a83f7d4b2 @@ -0,0 +1 @@ +x+)JMU0d040075UHKL׫LaiT=}'"imW \ No newline at end of file diff --git a/.git_disabled/objects/07/e4aefaca6c9e8726641962910b815a674cb61a b/.git_disabled/objects/07/e4aefaca6c9e8726641962910b815a674cb61a new file mode 100755 index 0000000..514a40b --- /dev/null +++ b/.git_disabled/objects/07/e4aefaca6c9e8726641962910b815a674cb61a @@ -0,0 +1 @@ +x% )͞- BQM!&k;$wBFT(5 nox@JB2aP!CᰡlD^1ڄ%wi 03TxIDnKUtr&p0tN:naJ3)84κ ST` R)̙V-|Ty^Tځs-#ЪsD3bti+"6kB^R)Q +{L綽a /,~Nj46{˿W[gg6n9COdp}vpG,.lv"ɜ+ƲE4M;op%Yh0,G 4(8ZC3UPΛWL42(U-rdtQk LP3 - #>Oe_1ᛣ6 NUΉN9Ƴ-nvg-+C7YgS U}hF>L +-:FbcUcw \ No newline at end of file diff --git a/.git_disabled/objects/09/0fd58487b7ea8176a57024a478435720515486 b/.git_disabled/objects/09/0fd58487b7ea8176a57024a478435720515486 new file mode 100755 index 0000000..9acbe5c Binary files /dev/null and b/.git_disabled/objects/09/0fd58487b7ea8176a57024a478435720515486 differ diff --git a/.git_disabled/objects/09/1f5b53fffa168b881f7254ae1e2d837ad674c1 b/.git_disabled/objects/09/1f5b53fffa168b881f7254ae1e2d837ad674c1 new file mode 100755 index 0000000..c5b592f Binary files /dev/null and b/.git_disabled/objects/09/1f5b53fffa168b881f7254ae1e2d837ad674c1 differ diff --git a/.git_disabled/objects/09/2859555c23a6802d44761f96f5d35a456a7e8b b/.git_disabled/objects/09/2859555c23a6802d44761f96f5d35a456a7e8b new file mode 100755 index 0000000..c5dcc18 Binary files /dev/null and b/.git_disabled/objects/09/2859555c23a6802d44761f96f5d35a456a7e8b differ diff --git a/.git_disabled/objects/09/53b86b10e2d6437df68759c6250c356dc97cb4 b/.git_disabled/objects/09/53b86b10e2d6437df68759c6250c356dc97cb4 new file mode 100755 index 0000000..b1ab80d --- /dev/null +++ b/.git_disabled/objects/09/53b86b10e2d6437df68759c6250c356dc97cb4 @@ -0,0 +1 @@ +xMPN0_)QA-Tc: ؛@O`ɳL祻]n#8ڂd7/A*0,'i5,Ą>fĵ~+ΪwrJ<Kg2?_7璤pz",`-e&/ۓ \ No newline at end of file diff --git a/.git_disabled/objects/0b/c456791cc284c88dec1beda6fba8d89c7bf692 b/.git_disabled/objects/0b/c456791cc284c88dec1beda6fba8d89c7bf692 new file mode 100755 index 0000000..de7ebe4 --- /dev/null +++ b/.git_disabled/objects/0b/c456791cc284c88dec1beda6fba8d89c7bf692 @@ -0,0 +1,3 @@ +xR]k0ݳy3\h! ^ +e+m|mks%#ɤfJn `~q99|1LU Φ/[W#p+V;WkcVȼstM`mjJ&u5jq`b*P'j"[)PY\A\CuM5kk;ɶE(C%tqF/n|r`9*g#^weyW&oUxav57@_˯Q%w+߼[<`z L*zÇ|9 *aGxԔh{JBw^I?j߃X?ZV<8&~`(9铻i4#$!zLdm|KKdhy3FV'O- +G| A]xfy6euF`*ĥəA^048~\ \ No newline at end of file diff --git a/.git_disabled/objects/0b/c7a07c173abc6f62c32448ee545a0093e0e4a6 b/.git_disabled/objects/0b/c7a07c173abc6f62c32448ee545a0093e0e4a6 new file mode 100755 index 0000000..126af68 Binary files /dev/null and b/.git_disabled/objects/0b/c7a07c173abc6f62c32448ee545a0093e0e4a6 differ diff --git a/.git_disabled/objects/0b/d5f7eb13be1cc55efaf2152e8c50f34c487275 b/.git_disabled/objects/0b/d5f7eb13be1cc55efaf2152e8c50f34c487275 new file mode 100755 index 0000000..c574e2f Binary files /dev/null and b/.git_disabled/objects/0b/d5f7eb13be1cc55efaf2152e8c50f34c487275 differ diff --git a/.git_disabled/objects/0b/dfd83c96b8c2e4e97ec933c2fe92cac05c000e b/.git_disabled/objects/0b/dfd83c96b8c2e4e97ec933c2fe92cac05c000e new file mode 100755 index 0000000..5453bc3 Binary files /dev/null and b/.git_disabled/objects/0b/dfd83c96b8c2e4e97ec933c2fe92cac05c000e differ diff --git a/.git_disabled/objects/0c/1b5715bd1e6ef3bfed2ef05af0996d78b810b8 b/.git_disabled/objects/0c/1b5715bd1e6ef3bfed2ef05af0996d78b810b8 new file mode 100755 index 0000000..c329b3c Binary files /dev/null and b/.git_disabled/objects/0c/1b5715bd1e6ef3bfed2ef05af0996d78b810b8 differ diff --git a/.git_disabled/objects/0c/2d335e66e3cc9bc214e3f8b5bcde3784e5d142 b/.git_disabled/objects/0c/2d335e66e3cc9bc214e3f8b5bcde3784e5d142 new file mode 100755 index 0000000..3f70611 Binary files /dev/null and b/.git_disabled/objects/0c/2d335e66e3cc9bc214e3f8b5bcde3784e5d142 differ diff --git a/.git_disabled/objects/0c/45467e53bc35632198550081cb411a52444a34 b/.git_disabled/objects/0c/45467e53bc35632198550081cb411a52444a34 new file mode 100755 index 0000000..ab22fe7 Binary files /dev/null and b/.git_disabled/objects/0c/45467e53bc35632198550081cb411a52444a34 differ diff --git a/.git_disabled/objects/0c/572f36d65dfcab4f4c816ab10d0fbe81f1f2c5 b/.git_disabled/objects/0c/572f36d65dfcab4f4c816ab10d0fbe81f1f2c5 new file mode 100755 index 0000000..4df5a7a Binary files /dev/null and b/.git_disabled/objects/0c/572f36d65dfcab4f4c816ab10d0fbe81f1f2c5 differ diff --git a/.git_disabled/objects/0c/5c80090ed51485ba6038c8c5cb8c2937f3d4cd b/.git_disabled/objects/0c/5c80090ed51485ba6038c8c5cb8c2937f3d4cd new file mode 100755 index 0000000..9d616f0 --- /dev/null +++ b/.git_disabled/objects/0c/5c80090ed51485ba6038c8c5cb8c2937f3d4cd @@ -0,0 +1 @@ +x=A0 9|8;)Qj["mggPJ烸9"2GK|ņ4]O0>8Kqɶ  4 \ No newline at end of file diff --git a/.git_disabled/objects/0c/74bc713694386f95ddb944b9522e63dc921f88 b/.git_disabled/objects/0c/74bc713694386f95ddb944b9522e63dc921f88 new file mode 100755 index 0000000..6807d67 Binary files /dev/null and b/.git_disabled/objects/0c/74bc713694386f95ddb944b9522e63dc921f88 differ diff --git a/.git_disabled/objects/0c/8d2d7b79d06c7aef80853461106a6efde4c6bc b/.git_disabled/objects/0c/8d2d7b79d06c7aef80853461106a6efde4c6bc new file mode 100755 index 0000000..48bcb5a Binary files /dev/null and b/.git_disabled/objects/0c/8d2d7b79d06c7aef80853461106a6efde4c6bc differ diff --git a/.git_disabled/objects/0c/a5639ee156a15a6232c34158f0d2fd45d5b58d b/.git_disabled/objects/0c/a5639ee156a15a6232c34158f0d2fd45d5b58d new file mode 100755 index 0000000..ad7688b Binary files /dev/null and b/.git_disabled/objects/0c/a5639ee156a15a6232c34158f0d2fd45d5b58d differ diff --git a/.git_disabled/objects/0c/a96ddfb580b19413797f41e79f7abcecdd9d79 b/.git_disabled/objects/0c/a96ddfb580b19413797f41e79f7abcecdd9d79 new file mode 100755 index 0000000..69c751a Binary files /dev/null and b/.git_disabled/objects/0c/a96ddfb580b19413797f41e79f7abcecdd9d79 differ diff --git a/.git_disabled/objects/0c/b8281dee2594a1735d37e0282bcd648920814e b/.git_disabled/objects/0c/b8281dee2594a1735d37e0282bcd648920814e new file mode 100755 index 0000000..9e5f125 Binary files /dev/null and b/.git_disabled/objects/0c/b8281dee2594a1735d37e0282bcd648920814e differ diff --git a/.git_disabled/objects/0c/e4ea29137ed2b93f21008428e08dde035b2f7f b/.git_disabled/objects/0c/e4ea29137ed2b93f21008428e08dde035b2f7f new file mode 100755 index 0000000..53d11a2 Binary files /dev/null and b/.git_disabled/objects/0c/e4ea29137ed2b93f21008428e08dde035b2f7f differ diff --git a/.git_disabled/objects/0c/f3158c9ea3d1250ff5c02485f594ef06bb31dd b/.git_disabled/objects/0c/f3158c9ea3d1250ff5c02485f594ef06bb31dd new file mode 100755 index 0000000..a95b7f3 Binary files /dev/null and b/.git_disabled/objects/0c/f3158c9ea3d1250ff5c02485f594ef06bb31dd differ diff --git a/.git_disabled/objects/0d/24def711344ec6f4da2108f7d5c9261eb35f8b b/.git_disabled/objects/0d/24def711344ec6f4da2108f7d5c9261eb35f8b new file mode 100755 index 0000000..ebab329 Binary files /dev/null and b/.git_disabled/objects/0d/24def711344ec6f4da2108f7d5c9261eb35f8b differ diff --git a/.git_disabled/objects/0d/2c602242d4ae79303481f8be7c5a4521ad92de b/.git_disabled/objects/0d/2c602242d4ae79303481f8be7c5a4521ad92de new file mode 100755 index 0000000..515808d --- /dev/null +++ b/.git_disabled/objects/0d/2c602242d4ae79303481f8be7c5a4521ad92de @@ -0,0 +1 @@ +xAn0E)8@T6T"4۲ M6U[5+KL%T=n7#˕u%):>bYskE̤T>ζqaqah`=цG/laGo 4 ]Op J<`Apm`]56<_, ~Mj qVlXϏ uy{vJ,Ems:NaJ6c^*"Bu(}Jp*)-5ΗXe b~q304On'QﯭzЇOĨW%pGo \ No newline at end of file diff --git a/.git_disabled/objects/0d/54d2e2858dc93e8d86410d4a22fd1a55b0438a b/.git_disabled/objects/0d/54d2e2858dc93e8d86410d4a22fd1a55b0438a new file mode 100755 index 0000000..6c14052 Binary files /dev/null and b/.git_disabled/objects/0d/54d2e2858dc93e8d86410d4a22fd1a55b0438a differ diff --git a/.git_disabled/objects/0d/5525568b6bde8699b5a244a68f89a330573910 b/.git_disabled/objects/0d/5525568b6bde8699b5a244a68f89a330573910 new file mode 100755 index 0000000..081a73e Binary files /dev/null and b/.git_disabled/objects/0d/5525568b6bde8699b5a244a68f89a330573910 differ diff --git a/.git_disabled/objects/0d/60d797208ff49b412af80337b5787b442478b9 b/.git_disabled/objects/0d/60d797208ff49b412af80337b5787b442478b9 new file mode 100755 index 0000000..c6fb689 Binary files /dev/null and b/.git_disabled/objects/0d/60d797208ff49b412af80337b5787b442478b9 differ diff --git a/.git_disabled/objects/0d/6ab86b8cff135f9c5ee35bf57358eec6717398 b/.git_disabled/objects/0d/6ab86b8cff135f9c5ee35bf57358eec6717398 new file mode 100755 index 0000000..7f8e37b Binary files /dev/null and b/.git_disabled/objects/0d/6ab86b8cff135f9c5ee35bf57358eec6717398 differ diff --git a/.git_disabled/objects/0d/862c41f90c56f56ab6302805c612bf0771ccf7 b/.git_disabled/objects/0d/862c41f90c56f56ab6302805c612bf0771ccf7 new file mode 100755 index 0000000..23a43b0 --- /dev/null +++ b/.git_disabled/objects/0d/862c41f90c56f56ab6302805c612bf0771ccf7 @@ -0,0 +1,3 @@ +xSMo@_1RHC+LS؎0>DU0];NjW19wucTaw" >?=*AI rƱL0m1H+4JzҌiOMlhf"yL%v: 6؍I7uz}گe&xbddvʈHPc4Q)r`Zm;M`߽7@5SSP>iY{md\G&[ٔR*è[xZoOL?N[ \ No newline at end of file diff --git a/.git_disabled/objects/0d/8ef2780da92bc22132350b11215790a6d3fd39 b/.git_disabled/objects/0d/8ef2780da92bc22132350b11215790a6d3fd39 new file mode 100755 index 0000000..8029b00 Binary files /dev/null and b/.git_disabled/objects/0d/8ef2780da92bc22132350b11215790a6d3fd39 differ diff --git a/.git_disabled/objects/0d/a2b5049fb190a40c676878c1a22dcb3e8dfb88 b/.git_disabled/objects/0d/a2b5049fb190a40c676878c1a22dcb3e8dfb88 new file mode 100755 index 0000000..934c8a1 Binary files /dev/null and b/.git_disabled/objects/0d/a2b5049fb190a40c676878c1a22dcb3e8dfb88 differ diff --git a/.git_disabled/objects/0d/a4f18f31160cafa316af0eb6158f138fbe3eaa b/.git_disabled/objects/0d/a4f18f31160cafa316af0eb6158f138fbe3eaa new file mode 100755 index 0000000..ace0a13 Binary files /dev/null and b/.git_disabled/objects/0d/a4f18f31160cafa316af0eb6158f138fbe3eaa differ diff --git a/.git_disabled/objects/0d/b95417aa8ee6d2de5195a035e54153cd70e825 b/.git_disabled/objects/0d/b95417aa8ee6d2de5195a035e54153cd70e825 new file mode 100755 index 0000000..41a1998 --- /dev/null +++ b/.git_disabled/objects/0d/b95417aa8ee6d2de5195a035e54153cd70e825 @@ -0,0 +1 @@ +x+)JMU026d040075U(J/Iu(/. IIM-)Ogx6M9{wk+qIOD]%@]`?-_VEVYv('秤g0,WWT*)YKG`Pk2JtKK2RJ2K2R}v}w 5l67&DxOg2{)Yxtc=R&(^`<wej-lsPK\nJb^]C1jC-#*cт-+:~R2KR[PٔrqC +8X"|d:ʗ`$/`LV?j zH \ No newline at end of file diff --git a/.git_disabled/objects/0d/ea0e76e041b1cdcf442bc1104676daff6c3fa2 b/.git_disabled/objects/0d/ea0e76e041b1cdcf442bc1104676daff6c3fa2 new file mode 100755 index 0000000..713ce6f --- /dev/null +++ b/.git_disabled/objects/0d/ea0e76e041b1cdcf442bc1104676daff6c3fa2 @@ -0,0 +1,2 @@ +x+)JMU0`040031QHI-(K.,564+LfS^[_5d{mO + \ No newline at end of file diff --git a/.git_disabled/objects/0d/ed2200594c6966c46c41d122b147c00cf876dc b/.git_disabled/objects/0d/ed2200594c6966c46c41d122b147c00cf876dc new file mode 100755 index 0000000..79db0c2 Binary files /dev/null and b/.git_disabled/objects/0d/ed2200594c6966c46c41d122b147c00cf876dc differ diff --git a/.git_disabled/objects/0d/f62568bb8e155fbf25261a95e4442333d290aa b/.git_disabled/objects/0d/f62568bb8e155fbf25261a95e4442333d290aa new file mode 100755 index 0000000..fe53a26 Binary files /dev/null and b/.git_disabled/objects/0d/f62568bb8e155fbf25261a95e4442333d290aa differ diff --git a/.git_disabled/objects/0e/063916e1427b15975912326117420e2b47b936 b/.git_disabled/objects/0e/063916e1427b15975912326117420e2b47b936 new file mode 100755 index 0000000..757c685 Binary files /dev/null and b/.git_disabled/objects/0e/063916e1427b15975912326117420e2b47b936 differ diff --git a/.git_disabled/objects/0e/080e5515d61aa8d1124d5f016ff34d1d783b4b b/.git_disabled/objects/0e/080e5515d61aa8d1124d5f016ff34d1d783b4b new file mode 100755 index 0000000..5173a19 Binary files /dev/null and b/.git_disabled/objects/0e/080e5515d61aa8d1124d5f016ff34d1d783b4b differ diff --git a/.git_disabled/objects/0e/1786c8a19dcb66676c9779465d1cd2a9d238b0 b/.git_disabled/objects/0e/1786c8a19dcb66676c9779465d1cd2a9d238b0 new file mode 100755 index 0000000..a52ad41 Binary files /dev/null and b/.git_disabled/objects/0e/1786c8a19dcb66676c9779465d1cd2a9d238b0 differ diff --git a/.git_disabled/objects/0e/1b382488e06c21288261797178b18b662aed09 b/.git_disabled/objects/0e/1b382488e06c21288261797178b18b662aed09 new file mode 100755 index 0000000..7765e04 Binary files /dev/null and b/.git_disabled/objects/0e/1b382488e06c21288261797178b18b662aed09 differ diff --git a/.git_disabled/objects/0e/1b6bfc9aa7c762137d6174aad13950e603b746 b/.git_disabled/objects/0e/1b6bfc9aa7c762137d6174aad13950e603b746 new file mode 100755 index 0000000..4f3b076 Binary files /dev/null and b/.git_disabled/objects/0e/1b6bfc9aa7c762137d6174aad13950e603b746 differ diff --git a/.git_disabled/objects/0e/304fba118056fa4d9d93ab2f6269166ba95d64 b/.git_disabled/objects/0e/304fba118056fa4d9d93ab2f6269166ba95d64 new file mode 100755 index 0000000..96d4bfd Binary files /dev/null and b/.git_disabled/objects/0e/304fba118056fa4d9d93ab2f6269166ba95d64 differ diff --git a/.git_disabled/objects/0e/3171ee908e1c11f3f40b2b538d0dbb3d850f73 b/.git_disabled/objects/0e/3171ee908e1c11f3f40b2b538d0dbb3d850f73 new file mode 100755 index 0000000..81002e2 Binary files /dev/null and b/.git_disabled/objects/0e/3171ee908e1c11f3f40b2b538d0dbb3d850f73 differ diff --git a/.git_disabled/objects/0e/4b98f41f277f2fc52ff31570b541ccaec5faa1 b/.git_disabled/objects/0e/4b98f41f277f2fc52ff31570b541ccaec5faa1 new file mode 100755 index 0000000..277bf6e Binary files /dev/null and b/.git_disabled/objects/0e/4b98f41f277f2fc52ff31570b541ccaec5faa1 differ diff --git a/.git_disabled/objects/0e/4c5a3c12c596bb35ab58df88a71d2c2bb71404 b/.git_disabled/objects/0e/4c5a3c12c596bb35ab58df88a71d2c2bb71404 new file mode 100755 index 0000000..76b7a71 Binary files /dev/null and b/.git_disabled/objects/0e/4c5a3c12c596bb35ab58df88a71d2c2bb71404 differ diff --git a/.git_disabled/objects/0e/59f48b8947b221c14ed8a227eee97c4fb923bd b/.git_disabled/objects/0e/59f48b8947b221c14ed8a227eee97c4fb923bd new file mode 100755 index 0000000..a4e109e Binary files /dev/null and b/.git_disabled/objects/0e/59f48b8947b221c14ed8a227eee97c4fb923bd differ diff --git a/.git_disabled/objects/0e/71536a1e4a8f3f97ecb5a106d1b4fba616e668 b/.git_disabled/objects/0e/71536a1e4a8f3f97ecb5a106d1b4fba616e668 new file mode 100755 index 0000000..727086f Binary files /dev/null and b/.git_disabled/objects/0e/71536a1e4a8f3f97ecb5a106d1b4fba616e668 differ diff --git a/.git_disabled/objects/0e/7f005d1a4b7f589c9864fe67890897a476eb55 b/.git_disabled/objects/0e/7f005d1a4b7f589c9864fe67890897a476eb55 new file mode 100755 index 0000000..f33d2ea Binary files /dev/null and b/.git_disabled/objects/0e/7f005d1a4b7f589c9864fe67890897a476eb55 differ diff --git a/.git_disabled/objects/0e/856430a9e8581fedf35e3847dc326484106822 b/.git_disabled/objects/0e/856430a9e8581fedf35e3847dc326484106822 new file mode 100755 index 0000000..4e68811 Binary files /dev/null and b/.git_disabled/objects/0e/856430a9e8581fedf35e3847dc326484106822 differ diff --git a/.git_disabled/objects/0e/85803f6c1a6c9c3c98fe0868ca132a3b814d0f b/.git_disabled/objects/0e/85803f6c1a6c9c3c98fe0868ca132a3b814d0f new file mode 100755 index 0000000..2cc1e9f Binary files /dev/null and b/.git_disabled/objects/0e/85803f6c1a6c9c3c98fe0868ca132a3b814d0f differ diff --git a/.git_disabled/objects/0e/8a1946b12bdde87d74e5fffbefd3b1dbbb3359 b/.git_disabled/objects/0e/8a1946b12bdde87d74e5fffbefd3b1dbbb3359 new file mode 100755 index 0000000..a4d5474 --- /dev/null +++ b/.git_disabled/objects/0e/8a1946b12bdde87d74e5fffbefd3b1dbbb3359 @@ -0,0 +1,2 @@ +xITu@ DPTqᢖ.kɲk#T"8M"*Z(B985ЊNtl|6xw&/{s}zy88ŧ@\ . q@\ . q@\ . q@\ . ˖343xWhy<iO{f¿sWĿKy||;0߆4ߊ0߂7ߌ3߄O  + \ No newline at end of file diff --git a/.git_disabled/objects/0e/94abd8d0d7fd55595aa94f03851ce4483fb25f b/.git_disabled/objects/0e/94abd8d0d7fd55595aa94f03851ce4483fb25f new file mode 100755 index 0000000..5f7ad6b Binary files /dev/null and b/.git_disabled/objects/0e/94abd8d0d7fd55595aa94f03851ce4483fb25f differ diff --git a/.git_disabled/objects/0e/bae53850a84c1efbb7b05ca507b086f84e9940 b/.git_disabled/objects/0e/bae53850a84c1efbb7b05ca507b086f84e9940 new file mode 100755 index 0000000..51c3947 Binary files /dev/null and b/.git_disabled/objects/0e/bae53850a84c1efbb7b05ca507b086f84e9940 differ diff --git a/.git_disabled/objects/0e/cfcaf002f90a6d3d9c8c415cc3ef3420fe3d47 b/.git_disabled/objects/0e/cfcaf002f90a6d3d9c8c415cc3ef3420fe3d47 new file mode 100755 index 0000000..c4c9224 Binary files /dev/null and b/.git_disabled/objects/0e/cfcaf002f90a6d3d9c8c415cc3ef3420fe3d47 differ diff --git a/.git_disabled/objects/0e/daddbc17adb7d26af0cb9ae583d4d5d060128c b/.git_disabled/objects/0e/daddbc17adb7d26af0cb9ae583d4d5d060128c new file mode 100755 index 0000000..569d128 Binary files /dev/null and b/.git_disabled/objects/0e/daddbc17adb7d26af0cb9ae583d4d5d060128c differ diff --git a/.git_disabled/objects/0e/ef48e81c8dd63d6ffcc5b396abc2d56d1ae940 b/.git_disabled/objects/0e/ef48e81c8dd63d6ffcc5b396abc2d56d1ae940 new file mode 100755 index 0000000..0185ae3 Binary files /dev/null and b/.git_disabled/objects/0e/ef48e81c8dd63d6ffcc5b396abc2d56d1ae940 differ diff --git a/.git_disabled/objects/0f/1f7bdcee9d0a188310eb866a828d8da4222bea b/.git_disabled/objects/0f/1f7bdcee9d0a188310eb866a828d8da4222bea new file mode 100755 index 0000000..961f295 Binary files /dev/null and b/.git_disabled/objects/0f/1f7bdcee9d0a188310eb866a828d8da4222bea differ diff --git a/.git_disabled/objects/0f/3a59f52d1ec6da8f88d1911aa13d600b687350 b/.git_disabled/objects/0f/3a59f52d1ec6da8f88d1911aa13d600b687350 new file mode 100755 index 0000000..2b05d73 Binary files /dev/null and b/.git_disabled/objects/0f/3a59f52d1ec6da8f88d1911aa13d600b687350 differ diff --git a/.git_disabled/objects/0f/3c3e12bc6b690a1a8d0eae4193f0b31f761bce b/.git_disabled/objects/0f/3c3e12bc6b690a1a8d0eae4193f0b31f761bce new file mode 100755 index 0000000..1641901 Binary files /dev/null and b/.git_disabled/objects/0f/3c3e12bc6b690a1a8d0eae4193f0b31f761bce differ diff --git a/.git_disabled/objects/0f/4032a675a0887688051fcfc66ef684d6900516 b/.git_disabled/objects/0f/4032a675a0887688051fcfc66ef684d6900516 new file mode 100755 index 0000000..e3ad6c8 Binary files /dev/null and b/.git_disabled/objects/0f/4032a675a0887688051fcfc66ef684d6900516 differ diff --git a/.git_disabled/objects/0f/433428613dc2e46d0ad3b1174f7d4d8b3b3839 b/.git_disabled/objects/0f/433428613dc2e46d0ad3b1174f7d4d8b3b3839 new file mode 100755 index 0000000..836a064 Binary files /dev/null and b/.git_disabled/objects/0f/433428613dc2e46d0ad3b1174f7d4d8b3b3839 differ diff --git a/.git_disabled/objects/0f/4a6930a4b162e47cc402c9442d93c3ca517df0 b/.git_disabled/objects/0f/4a6930a4b162e47cc402c9442d93c3ca517df0 new file mode 100755 index 0000000..1be97d4 Binary files /dev/null and b/.git_disabled/objects/0f/4a6930a4b162e47cc402c9442d93c3ca517df0 differ diff --git a/.git_disabled/objects/0f/5876482bae64913ef0c14836868951f240b418 b/.git_disabled/objects/0f/5876482bae64913ef0c14836868951f240b418 new file mode 100755 index 0000000..bbcdbfa Binary files /dev/null and b/.git_disabled/objects/0f/5876482bae64913ef0c14836868951f240b418 differ diff --git a/.git_disabled/objects/0f/5a127f43711833cb66f2ccf82e09048e73d2fa b/.git_disabled/objects/0f/5a127f43711833cb66f2ccf82e09048e73d2fa new file mode 100755 index 0000000..b586791 Binary files /dev/null and b/.git_disabled/objects/0f/5a127f43711833cb66f2ccf82e09048e73d2fa differ diff --git a/.git_disabled/objects/0f/773257aa0228a5e62300a34a87f004e4fb7732 b/.git_disabled/objects/0f/773257aa0228a5e62300a34a87f004e4fb7732 new file mode 100755 index 0000000..a261c66 Binary files /dev/null and b/.git_disabled/objects/0f/773257aa0228a5e62300a34a87f004e4fb7732 differ diff --git a/.git_disabled/objects/0f/8249d307f7e89b5aab66373ea4e46a0d2200d6 b/.git_disabled/objects/0f/8249d307f7e89b5aab66373ea4e46a0d2200d6 new file mode 100755 index 0000000..dabb897 Binary files /dev/null and b/.git_disabled/objects/0f/8249d307f7e89b5aab66373ea4e46a0d2200d6 differ diff --git a/.git_disabled/objects/0f/8d0775f9480b8cb675a9eef1d140afb99d2a3d b/.git_disabled/objects/0f/8d0775f9480b8cb675a9eef1d140afb99d2a3d new file mode 100755 index 0000000..bfb5437 Binary files /dev/null and b/.git_disabled/objects/0f/8d0775f9480b8cb675a9eef1d140afb99d2a3d differ diff --git a/.git_disabled/objects/0f/9bd108640485116e28dc98a692f592fe97bc22 b/.git_disabled/objects/0f/9bd108640485116e28dc98a692f592fe97bc22 new file mode 100755 index 0000000..06dc040 Binary files /dev/null and b/.git_disabled/objects/0f/9bd108640485116e28dc98a692f592fe97bc22 differ diff --git a/.git_disabled/objects/0f/a27df57a3d9145adef8cd405ceec24e31118ed b/.git_disabled/objects/0f/a27df57a3d9145adef8cd405ceec24e31118ed new file mode 100755 index 0000000..e5d7201 Binary files /dev/null and b/.git_disabled/objects/0f/a27df57a3d9145adef8cd405ceec24e31118ed differ diff --git a/.git_disabled/objects/0f/ac85006b8161229b1ad3319c9aadad6110833d b/.git_disabled/objects/0f/ac85006b8161229b1ad3319c9aadad6110833d new file mode 100755 index 0000000..d03a6a0 Binary files /dev/null and b/.git_disabled/objects/0f/ac85006b8161229b1ad3319c9aadad6110833d differ diff --git a/.git_disabled/objects/0f/b852c16682344f532c5ac3a21617cf61e6e997 b/.git_disabled/objects/0f/b852c16682344f532c5ac3a21617cf61e6e997 new file mode 100755 index 0000000..463bf78 --- /dev/null +++ b/.git_disabled/objects/0f/b852c16682344f532c5ac3a21617cf61e6e997 @@ -0,0 +1,2 @@ +xu͊0ɺ6m\ diA_H0H]\y a;A.byC2fĒ[86C +RnD{rZ%VJ#ix_h3DWhAܥMߤ!{0=YN5D(LzD9zX??BBK{Noh$zQj֛N_\ \ No newline at end of file diff --git a/.git_disabled/objects/0f/d7bb8d6fdc3c6b5e244a3ddf0d879a91140105 b/.git_disabled/objects/0f/d7bb8d6fdc3c6b5e244a3ddf0d879a91140105 new file mode 100755 index 0000000..89413cc Binary files /dev/null and b/.git_disabled/objects/0f/d7bb8d6fdc3c6b5e244a3ddf0d879a91140105 differ diff --git a/.git_disabled/objects/0f/e8f2800f08a904457ebf4101e52d00422fa06d b/.git_disabled/objects/0f/e8f2800f08a904457ebf4101e52d00422fa06d new file mode 100755 index 0000000..f54da40 Binary files /dev/null and b/.git_disabled/objects/0f/e8f2800f08a904457ebf4101e52d00422fa06d differ diff --git a/.git_disabled/objects/0f/ef873f7ec6ab4903f1b4b2f09e64c7102f95ef b/.git_disabled/objects/0f/ef873f7ec6ab4903f1b4b2f09e64c7102f95ef new file mode 100755 index 0000000..bfbe92c Binary files /dev/null and b/.git_disabled/objects/0f/ef873f7ec6ab4903f1b4b2f09e64c7102f95ef differ diff --git a/.git_disabled/objects/0f/f301e05201fa6e67db4a98b79414d09151273e b/.git_disabled/objects/0f/f301e05201fa6e67db4a98b79414d09151273e new file mode 100755 index 0000000..d2e33b6 Binary files /dev/null and b/.git_disabled/objects/0f/f301e05201fa6e67db4a98b79414d09151273e differ diff --git a/.git_disabled/objects/0f/f9347c728208a6e65ea863a941bb149c71ec8b b/.git_disabled/objects/0f/f9347c728208a6e65ea863a941bb149c71ec8b new file mode 100755 index 0000000..e3d602d Binary files /dev/null and b/.git_disabled/objects/0f/f9347c728208a6e65ea863a941bb149c71ec8b differ diff --git a/.git_disabled/objects/10/09d4d082e12a5b68ff0dae5a4eda60a4a7c09c b/.git_disabled/objects/10/09d4d082e12a5b68ff0dae5a4eda60a4a7c09c new file mode 100755 index 0000000..f4f2501 Binary files /dev/null and b/.git_disabled/objects/10/09d4d082e12a5b68ff0dae5a4eda60a4a7c09c differ diff --git a/.git_disabled/objects/10/0c560f9953e65e0f5d7a74129b768e2aceb9e4 b/.git_disabled/objects/10/0c560f9953e65e0f5d7a74129b768e2aceb9e4 new file mode 100755 index 0000000..3dae32c Binary files /dev/null and b/.git_disabled/objects/10/0c560f9953e65e0f5d7a74129b768e2aceb9e4 differ diff --git a/.git_disabled/objects/10/20be98e61cb64d948abb547561eea8694ab67a b/.git_disabled/objects/10/20be98e61cb64d948abb547561eea8694ab67a new file mode 100755 index 0000000..d57d9d6 --- /dev/null +++ b/.git_disabled/objects/10/20be98e61cb64d948abb547561eea8694ab67a @@ -0,0 +1,4 @@ +xU=sFM_<65 Oq3: h'j0 q"A8wR,zTȸK:O,(T#pwoo{Äaᛟ@?m j@ZkSB׶UMS}ÅΫkMkP@ Wt$X[B{mH|ׇkg _D#Ei򵫃i(Q kc`_B9 xj/23EdA6< .dc&yR4\D򹺍6a.i| CP7R}yG,*,dR4UĬ E7Wceh5G>-u,;)G TN觅v6`<2:P9$lH$ny U-) !FgO6d + N I)%uKH p^t A"]YP9]E^$c.4kۮuz|fӠao~ߴAݍ=iz멿]6Icl 8C_0AhzEA%OeyqŶ-{iAAuβ~6T,BW)gJ"K斸><-9GZ?8Z!`-/Fa@9?VV˱MgQ͙8A߶LٶHg=) ΘXCABI >1{p4QR_ +95yȀUp1.Wl]FU֚vws1C +fA$Ag{{QM@ \ No newline at end of file diff --git a/.git_disabled/objects/10/38c18da0df1915bbb7b0ba16ae5a284aed086c b/.git_disabled/objects/10/38c18da0df1915bbb7b0ba16ae5a284aed086c new file mode 100755 index 0000000..72e0bf1 Binary files /dev/null and b/.git_disabled/objects/10/38c18da0df1915bbb7b0ba16ae5a284aed086c differ diff --git a/.git_disabled/objects/10/454e1818ec493f2c0e3109625fe549a0422475 b/.git_disabled/objects/10/454e1818ec493f2c0e3109625fe549a0422475 new file mode 100755 index 0000000..0288aa5 Binary files /dev/null and b/.git_disabled/objects/10/454e1818ec493f2c0e3109625fe549a0422475 differ diff --git a/.git_disabled/objects/10/4ecb0e64c90efb142df0ad89e58d99280c1dd4 b/.git_disabled/objects/10/4ecb0e64c90efb142df0ad89e58d99280c1dd4 new file mode 100755 index 0000000..5c96c33 --- /dev/null +++ b/.git_disabled/objects/10/4ecb0e64c90efb142df0ad89e58d99280c1dd4 @@ -0,0 +1 @@ +x+)JMU04e040031QK+cXcsz)&+PVP,Z`o sC4 Y_ʐ#ڲ^Tx('秤'e3옰m-[ZbGC&%gd25tϾSg|YfQp}V\[l4O(pdAJJ sS348 I?v<.M@-N-*K-҅u]}ԯ ~͌l)[P lJ>r܂TOF7X{o'NG&n}b4Pq1\ڼSl^" ZN++bCbkL/{nzԾҜx t t M sVfN߰Bgȅ)+y|1?'?A65)ӃK4e:B,^)~:ztZYGJ+Cd Sr3SK*hb>ہ:`{OA6Fy}pЃ, Cף:{j7u_@᪬O={y]ooGH0xʵ%WxMO(ovn܈d{9R$ +e,b +p i':*BdS$H\Lb'&("]si,2W(1 l!!-J,3Ir& oe1`S.%XƁ5Km^,KZ+ZgIQ\p(cLSQ&mʫAۮvkKH,6,U.z݉Ĥ(| Klj 4\_Q|Գw-1g C}+p[ \ No newline at end of file diff --git a/.git_disabled/objects/10/7dabbe5e69915d9732ed4ef29146f15b2bfdd5 b/.git_disabled/objects/10/7dabbe5e69915d9732ed4ef29146f15b2bfdd5 new file mode 100755 index 0000000..57d0405 Binary files /dev/null and b/.git_disabled/objects/10/7dabbe5e69915d9732ed4ef29146f15b2bfdd5 differ diff --git a/.git_disabled/objects/10/9104f15fd7979a29db13ef13e45eb799812aeb b/.git_disabled/objects/10/9104f15fd7979a29db13ef13e45eb799812aeb new file mode 100755 index 0000000..718d2a1 Binary files /dev/null and b/.git_disabled/objects/10/9104f15fd7979a29db13ef13e45eb799812aeb differ diff --git a/.git_disabled/objects/10/aa7060da78117634200158b3c554cbbf8b851a b/.git_disabled/objects/10/aa7060da78117634200158b3c554cbbf8b851a new file mode 100755 index 0000000..c05be70 Binary files /dev/null and b/.git_disabled/objects/10/aa7060da78117634200158b3c554cbbf8b851a differ diff --git a/.git_disabled/objects/10/bfc3a9ca5063c1c1cd34c48777f4dbfa363661 b/.git_disabled/objects/10/bfc3a9ca5063c1c1cd34c48777f4dbfa363661 new file mode 100755 index 0000000..ee7d8cd Binary files /dev/null and b/.git_disabled/objects/10/bfc3a9ca5063c1c1cd34c48777f4dbfa363661 differ diff --git a/.git_disabled/objects/10/d663f8eedc9704af285d403abd2ccdb632bd96 b/.git_disabled/objects/10/d663f8eedc9704af285d403abd2ccdb632bd96 new file mode 100755 index 0000000..310929e --- /dev/null +++ b/.git_disabled/objects/10/d663f8eedc9704af285d403abd2ccdb632bd96 @@ -0,0 +1 @@ +x} Ю0tE-a0K+X5%h-{yI/T?`f]+{TCSiM>(ʋV\:%? z.W@tp(\Fت@&nry27>nIk]m{kO?m89̩P$,E._&(9'k]r+6{%E19Šk$m \ No newline at end of file diff --git a/.git_disabled/objects/10/d95826a79c15fd6c80bcc5b6503537f06ca2bc b/.git_disabled/objects/10/d95826a79c15fd6c80bcc5b6503537f06ca2bc new file mode 100755 index 0000000..8226c7f Binary files /dev/null and b/.git_disabled/objects/10/d95826a79c15fd6c80bcc5b6503537f06ca2bc differ diff --git a/.git_disabled/objects/10/df115a7b9f975493476da763cc1e26dbd822e5 b/.git_disabled/objects/10/df115a7b9f975493476da763cc1e26dbd822e5 new file mode 100755 index 0000000..f75ab29 Binary files /dev/null and b/.git_disabled/objects/10/df115a7b9f975493476da763cc1e26dbd822e5 differ diff --git a/.git_disabled/objects/10/eff5248aa5ef18955dbf56844ca2b3f4ae087d b/.git_disabled/objects/10/eff5248aa5ef18955dbf56844ca2b3f4ae087d new file mode 100755 index 0000000..3e9565e Binary files /dev/null and b/.git_disabled/objects/10/eff5248aa5ef18955dbf56844ca2b3f4ae087d differ diff --git a/.git_disabled/objects/10/f5a68edf2ee29ff42424c29790113d3a7ce79f b/.git_disabled/objects/10/f5a68edf2ee29ff42424c29790113d3a7ce79f new file mode 100755 index 0000000..b09b838 Binary files /dev/null and b/.git_disabled/objects/10/f5a68edf2ee29ff42424c29790113d3a7ce79f differ diff --git a/.git_disabled/objects/10/f9af37fc96c07741dd35de15481cfd6539ecaa b/.git_disabled/objects/10/f9af37fc96c07741dd35de15481cfd6539ecaa new file mode 100755 index 0000000..087e4ff Binary files /dev/null and b/.git_disabled/objects/10/f9af37fc96c07741dd35de15481cfd6539ecaa differ diff --git a/.git_disabled/objects/11/016301e749297acb67822efc7974ee53c905c6 b/.git_disabled/objects/11/016301e749297acb67822efc7974ee53c905c6 new file mode 100755 index 0000000..1b9cf68 Binary files /dev/null and b/.git_disabled/objects/11/016301e749297acb67822efc7974ee53c905c6 differ diff --git a/.git_disabled/objects/11/07e34ec4d5f23c470acd1a9ccf7275968baa6b b/.git_disabled/objects/11/07e34ec4d5f23c470acd1a9ccf7275968baa6b new file mode 100755 index 0000000..9781a2f Binary files /dev/null and b/.git_disabled/objects/11/07e34ec4d5f23c470acd1a9ccf7275968baa6b differ diff --git a/.git_disabled/objects/11/201efa412dc772ca30ceb534a0409109b14652 b/.git_disabled/objects/11/201efa412dc772ca30ceb534a0409109b14652 new file mode 100755 index 0000000..5a7ca03 Binary files /dev/null and b/.git_disabled/objects/11/201efa412dc772ca30ceb534a0409109b14652 differ diff --git a/.git_disabled/objects/11/2cdc16fa14e963c038fd028e3c61286bd4c51f b/.git_disabled/objects/11/2cdc16fa14e963c038fd028e3c61286bd4c51f new file mode 100755 index 0000000..c4166b1 Binary files /dev/null and b/.git_disabled/objects/11/2cdc16fa14e963c038fd028e3c61286bd4c51f differ diff --git a/.git_disabled/objects/11/493062d9ea585537bb470ba569c6a7abd30a53 b/.git_disabled/objects/11/493062d9ea585537bb470ba569c6a7abd30a53 new file mode 100755 index 0000000..7ac44e3 Binary files /dev/null and b/.git_disabled/objects/11/493062d9ea585537bb470ba569c6a7abd30a53 differ diff --git a/.git_disabled/objects/11/49ccf52cc910229cc6814f3f235f236ae72ac4 b/.git_disabled/objects/11/49ccf52cc910229cc6814f3f235f236ae72ac4 new file mode 100755 index 0000000..59114f6 Binary files /dev/null and b/.git_disabled/objects/11/49ccf52cc910229cc6814f3f235f236ae72ac4 differ diff --git a/.git_disabled/objects/11/51b72d572fe95deb6a5ca66169fa576861b458 b/.git_disabled/objects/11/51b72d572fe95deb6a5ca66169fa576861b458 new file mode 100755 index 0000000..807a628 Binary files /dev/null and b/.git_disabled/objects/11/51b72d572fe95deb6a5ca66169fa576861b458 differ diff --git a/.git_disabled/objects/11/57be9dd5b75cff1f7b1d826ebd6a95575ab8db b/.git_disabled/objects/11/57be9dd5b75cff1f7b1d826ebd6a95575ab8db new file mode 100755 index 0000000..1fe4c7f Binary files /dev/null and b/.git_disabled/objects/11/57be9dd5b75cff1f7b1d826ebd6a95575ab8db differ diff --git a/.git_disabled/objects/11/5cb6125345c79db5a5efaf515ce7155be454c1 b/.git_disabled/objects/11/5cb6125345c79db5a5efaf515ce7155be454c1 new file mode 100755 index 0000000..c14ff39 Binary files /dev/null and b/.git_disabled/objects/11/5cb6125345c79db5a5efaf515ce7155be454c1 differ diff --git a/.git_disabled/objects/11/6a34eed14951ba9fe956c4982f53046a660484 b/.git_disabled/objects/11/6a34eed14951ba9fe956c4982f53046a660484 new file mode 100755 index 0000000..d248c93 Binary files /dev/null and b/.git_disabled/objects/11/6a34eed14951ba9fe956c4982f53046a660484 differ diff --git a/.git_disabled/objects/11/6a90ae7d44a7b0248c4a1bcf5dc3b2bc06b3b9 b/.git_disabled/objects/11/6a90ae7d44a7b0248c4a1bcf5dc3b2bc06b3b9 new file mode 100755 index 0000000..d16f234 Binary files /dev/null and b/.git_disabled/objects/11/6a90ae7d44a7b0248c4a1bcf5dc3b2bc06b3b9 differ diff --git a/.git_disabled/objects/11/6add99776ce06f42c9b37ef5bbdca0ff477e94 b/.git_disabled/objects/11/6add99776ce06f42c9b37ef5bbdca0ff477e94 new file mode 100755 index 0000000..a8f6f8e Binary files /dev/null and b/.git_disabled/objects/11/6add99776ce06f42c9b37ef5bbdca0ff477e94 differ diff --git a/.git_disabled/objects/11/7df4d42e439405d35e905f33fbfb92aec7277d b/.git_disabled/objects/11/7df4d42e439405d35e905f33fbfb92aec7277d new file mode 100755 index 0000000..dfd3e36 Binary files /dev/null and b/.git_disabled/objects/11/7df4d42e439405d35e905f33fbfb92aec7277d differ diff --git a/.git_disabled/objects/11/87b6bf5f03a71b92c5b7cbe870b691aff5ca46 b/.git_disabled/objects/11/87b6bf5f03a71b92c5b7cbe870b691aff5ca46 new file mode 100755 index 0000000..372b1b6 Binary files /dev/null and b/.git_disabled/objects/11/87b6bf5f03a71b92c5b7cbe870b691aff5ca46 differ diff --git a/.git_disabled/objects/11/91f9c0a1c537187ca420ffa2e411055ce1cecb b/.git_disabled/objects/11/91f9c0a1c537187ca420ffa2e411055ce1cecb new file mode 100755 index 0000000..acc6127 Binary files /dev/null and b/.git_disabled/objects/11/91f9c0a1c537187ca420ffa2e411055ce1cecb differ diff --git a/.git_disabled/objects/11/9233114d13e450e9a12194fe2e5092ba5e68c9 b/.git_disabled/objects/11/9233114d13e450e9a12194fe2e5092ba5e68c9 new file mode 100755 index 0000000..c662269 Binary files /dev/null and b/.git_disabled/objects/11/9233114d13e450e9a12194fe2e5092ba5e68c9 differ diff --git a/.git_disabled/objects/11/962ace32be087f137e1a77a1a20a5db2297f1b b/.git_disabled/objects/11/962ace32be087f137e1a77a1a20a5db2297f1b new file mode 100755 index 0000000..c8a7020 Binary files /dev/null and b/.git_disabled/objects/11/962ace32be087f137e1a77a1a20a5db2297f1b differ diff --git a/.git_disabled/objects/11/9739c436aede73c41c1ad3b42c9058efa44626 b/.git_disabled/objects/11/9739c436aede73c41c1ad3b42c9058efa44626 new file mode 100755 index 0000000..53608b9 Binary files /dev/null and b/.git_disabled/objects/11/9739c436aede73c41c1ad3b42c9058efa44626 differ diff --git a/.git_disabled/objects/11/a5433707cc2e57da36ef895bc0ce4e64ba63e7 b/.git_disabled/objects/11/a5433707cc2e57da36ef895bc0ce4e64ba63e7 new file mode 100755 index 0000000..ee421b8 Binary files /dev/null and b/.git_disabled/objects/11/a5433707cc2e57da36ef895bc0ce4e64ba63e7 differ diff --git a/.git_disabled/objects/11/af26b17ffe81b9f2193ddbbcdc64c0ef79e97a b/.git_disabled/objects/11/af26b17ffe81b9f2193ddbbcdc64c0ef79e97a new file mode 100755 index 0000000..a9cb82d Binary files /dev/null and b/.git_disabled/objects/11/af26b17ffe81b9f2193ddbbcdc64c0ef79e97a differ diff --git a/.git_disabled/objects/11/bfa2d3b83ecc548934c6f79678b577ab9c2c10 b/.git_disabled/objects/11/bfa2d3b83ecc548934c6f79678b577ab9c2c10 new file mode 100755 index 0000000..0ddd1f0 Binary files /dev/null and b/.git_disabled/objects/11/bfa2d3b83ecc548934c6f79678b577ab9c2c10 differ diff --git a/.git_disabled/objects/11/c2236cefa791f7fff340d5aeb672f115c9e71c b/.git_disabled/objects/11/c2236cefa791f7fff340d5aeb672f115c9e71c new file mode 100755 index 0000000..c13e6c4 Binary files /dev/null and b/.git_disabled/objects/11/c2236cefa791f7fff340d5aeb672f115c9e71c differ diff --git a/.git_disabled/objects/11/fd2dcd02144a6144d9cadbdd5c0e4329bd6ba8 b/.git_disabled/objects/11/fd2dcd02144a6144d9cadbdd5c0e4329bd6ba8 new file mode 100755 index 0000000..52089cf Binary files /dev/null and b/.git_disabled/objects/11/fd2dcd02144a6144d9cadbdd5c0e4329bd6ba8 differ diff --git a/.git_disabled/objects/12/1c33b3934ea9694b923a1ef2ef9dc5b8dfa845 b/.git_disabled/objects/12/1c33b3934ea9694b923a1ef2ef9dc5b8dfa845 new file mode 100755 index 0000000..767de21 Binary files /dev/null and b/.git_disabled/objects/12/1c33b3934ea9694b923a1ef2ef9dc5b8dfa845 differ diff --git a/.git_disabled/objects/12/1d154cdac859167e632647f90f3dc6a825d37a b/.git_disabled/objects/12/1d154cdac859167e632647f90f3dc6a825d37a new file mode 100755 index 0000000..06bc43b Binary files /dev/null and b/.git_disabled/objects/12/1d154cdac859167e632647f90f3dc6a825d37a differ diff --git a/.git_disabled/objects/12/228d414b6cfed7c39d3781c85c63256a1d7fb5 b/.git_disabled/objects/12/228d414b6cfed7c39d3781c85c63256a1d7fb5 new file mode 100755 index 0000000..80520b6 Binary files /dev/null and b/.git_disabled/objects/12/228d414b6cfed7c39d3781c85c63256a1d7fb5 differ diff --git a/.git_disabled/objects/12/22d27a47fb26304c6fa3d65d4180c1a6beb43f b/.git_disabled/objects/12/22d27a47fb26304c6fa3d65d4180c1a6beb43f new file mode 100755 index 0000000..ed2d76a Binary files /dev/null and b/.git_disabled/objects/12/22d27a47fb26304c6fa3d65d4180c1a6beb43f differ diff --git a/.git_disabled/objects/12/32e0215649af877141866faf961a3daa37695e b/.git_disabled/objects/12/32e0215649af877141866faf961a3daa37695e new file mode 100755 index 0000000..805c93c Binary files /dev/null and b/.git_disabled/objects/12/32e0215649af877141866faf961a3daa37695e differ diff --git a/.git_disabled/objects/12/4c45d0a3c64aaecfaccb6fdaf23f131a9860cb b/.git_disabled/objects/12/4c45d0a3c64aaecfaccb6fdaf23f131a9860cb new file mode 100755 index 0000000..58efea0 Binary files /dev/null and b/.git_disabled/objects/12/4c45d0a3c64aaecfaccb6fdaf23f131a9860cb differ diff --git a/.git_disabled/objects/12/4c4c8dcaf801be5e9d18851743afd0466195aa b/.git_disabled/objects/12/4c4c8dcaf801be5e9d18851743afd0466195aa new file mode 100755 index 0000000..92d92b5 Binary files /dev/null and b/.git_disabled/objects/12/4c4c8dcaf801be5e9d18851743afd0466195aa differ diff --git a/.git_disabled/objects/12/8c5342c81d4986cba6d118a41e402d7b676996 b/.git_disabled/objects/12/8c5342c81d4986cba6d118a41e402d7b676996 new file mode 100755 index 0000000..6abc3b9 Binary files /dev/null and b/.git_disabled/objects/12/8c5342c81d4986cba6d118a41e402d7b676996 differ diff --git a/.git_disabled/objects/12/9382853443b6a37957aef89f52567a34afc8d7 b/.git_disabled/objects/12/9382853443b6a37957aef89f52567a34afc8d7 new file mode 100755 index 0000000..aeb2b26 Binary files /dev/null and b/.git_disabled/objects/12/9382853443b6a37957aef89f52567a34afc8d7 differ diff --git a/.git_disabled/objects/12/b669e2247945092fadcdf98b32d3d0195608a5 b/.git_disabled/objects/12/b669e2247945092fadcdf98b32d3d0195608a5 new file mode 100755 index 0000000..1fe88df Binary files /dev/null and b/.git_disabled/objects/12/b669e2247945092fadcdf98b32d3d0195608a5 differ diff --git a/.git_disabled/objects/12/f248e3f220568345ff964f8318144fc17f2a86 b/.git_disabled/objects/12/f248e3f220568345ff964f8318144fc17f2a86 new file mode 100755 index 0000000..03aaae3 Binary files /dev/null and b/.git_disabled/objects/12/f248e3f220568345ff964f8318144fc17f2a86 differ diff --git a/.git_disabled/objects/12/fda84ed7b58a29861e7497b882bd4e9829f918 b/.git_disabled/objects/12/fda84ed7b58a29861e7497b882bd4e9829f918 new file mode 100755 index 0000000..4d8ecb3 --- /dev/null +++ b/.git_disabled/objects/12/fda84ed7b58a29861e7497b882bd4e9829f918 @@ -0,0 +1,2 @@ +xOj0 _!K;֤0%6(ݹ8RnӘ.{o~)B7 fr=/Ndb)twLMQCDmQ>u$10ep@QCr)˾B7AVvVXauUX+]zᛎپB(tO0)+ϥr]/>#cd"26D +~6g(O-zT \ No newline at end of file diff --git a/.git_disabled/objects/13/174052239df3d1faf59885726effdaa5deb171 b/.git_disabled/objects/13/174052239df3d1faf59885726effdaa5deb171 new file mode 100755 index 0000000..8a082c9 Binary files /dev/null and b/.git_disabled/objects/13/174052239df3d1faf59885726effdaa5deb171 differ diff --git a/.git_disabled/objects/13/2db0df1b87e4d6b4519f362c82b01467d5d2e8 b/.git_disabled/objects/13/2db0df1b87e4d6b4519f362c82b01467d5d2e8 new file mode 100755 index 0000000..0c061eb Binary files /dev/null and b/.git_disabled/objects/13/2db0df1b87e4d6b4519f362c82b01467d5d2e8 differ diff --git a/.git_disabled/objects/13/329c5bd8f4ae0ff6ca6fef6dafeb3c2fc7e3ae b/.git_disabled/objects/13/329c5bd8f4ae0ff6ca6fef6dafeb3c2fc7e3ae new file mode 100755 index 0000000..53cfa8e --- /dev/null +++ b/.git_disabled/objects/13/329c5bd8f4ae0ff6ca6fef6dafeb3c2fc7e3ae @@ -0,0 +1 @@ +x+)JMU06e040075Up,OgQgO~fL~ \ No newline at end of file diff --git a/.git_disabled/objects/13/3a6231a5b53fd2f073799ca1bd07c50abe40ae b/.git_disabled/objects/13/3a6231a5b53fd2f073799ca1bd07c50abe40ae new file mode 100755 index 0000000..0f373ab Binary files /dev/null and b/.git_disabled/objects/13/3a6231a5b53fd2f073799ca1bd07c50abe40ae differ diff --git a/.git_disabled/objects/13/3ae3e98672edbde0ea89f3b1a305456e64eb55 b/.git_disabled/objects/13/3ae3e98672edbde0ea89f3b1a305456e64eb55 new file mode 100755 index 0000000..f5d4ebd Binary files /dev/null and b/.git_disabled/objects/13/3ae3e98672edbde0ea89f3b1a305456e64eb55 differ diff --git a/.git_disabled/objects/13/3d564af5f037ac286b3f645b975374291ded41 b/.git_disabled/objects/13/3d564af5f037ac286b3f645b975374291ded41 new file mode 100755 index 0000000..d36931b Binary files /dev/null and b/.git_disabled/objects/13/3d564af5f037ac286b3f645b975374291ded41 differ diff --git a/.git_disabled/objects/13/69da58d490b1cbc466262e5b70ed15db07aeb4 b/.git_disabled/objects/13/69da58d490b1cbc466262e5b70ed15db07aeb4 new file mode 100755 index 0000000..9ce55a9 Binary files /dev/null and b/.git_disabled/objects/13/69da58d490b1cbc466262e5b70ed15db07aeb4 differ diff --git a/.git_disabled/objects/13/81d24b732aeb44923c8b34fcf2e8a1f9178ee8 b/.git_disabled/objects/13/81d24b732aeb44923c8b34fcf2e8a1f9178ee8 new file mode 100755 index 0000000..59c4686 Binary files /dev/null and b/.git_disabled/objects/13/81d24b732aeb44923c8b34fcf2e8a1f9178ee8 differ diff --git a/.git_disabled/objects/13/84f830a034ef79c8ef35da7e33b78308dc8fd8 b/.git_disabled/objects/13/84f830a034ef79c8ef35da7e33b78308dc8fd8 new file mode 100755 index 0000000..e138c99 Binary files /dev/null and b/.git_disabled/objects/13/84f830a034ef79c8ef35da7e33b78308dc8fd8 differ diff --git a/.git_disabled/objects/13/ac7fc7660e6b997ecc53c94ca9f25c5ae26ac2 b/.git_disabled/objects/13/ac7fc7660e6b997ecc53c94ca9f25c5ae26ac2 new file mode 100755 index 0000000..4741fa1 Binary files /dev/null and b/.git_disabled/objects/13/ac7fc7660e6b997ecc53c94ca9f25c5ae26ac2 differ diff --git a/.git_disabled/objects/13/ad28996e086cddf458dba855b74eda895b5028 b/.git_disabled/objects/13/ad28996e086cddf458dba855b74eda895b5028 new file mode 100755 index 0000000..c0c75cb Binary files /dev/null and b/.git_disabled/objects/13/ad28996e086cddf458dba855b74eda895b5028 differ diff --git a/.git_disabled/objects/13/c10cb289a812b6e09c64979c59e6993d8ee8b2 b/.git_disabled/objects/13/c10cb289a812b6e09c64979c59e6993d8ee8b2 new file mode 100755 index 0000000..f5124af Binary files /dev/null and b/.git_disabled/objects/13/c10cb289a812b6e09c64979c59e6993d8ee8b2 differ diff --git a/.git_disabled/objects/13/d3fa599697228aa8c7333ae98188ee8324f26b b/.git_disabled/objects/13/d3fa599697228aa8c7333ae98188ee8324f26b new file mode 100755 index 0000000..f6b6506 Binary files /dev/null and b/.git_disabled/objects/13/d3fa599697228aa8c7333ae98188ee8324f26b differ diff --git a/.git_disabled/objects/13/e590e41224082cd1e8be26c6d8720c44e304af b/.git_disabled/objects/13/e590e41224082cd1e8be26c6d8720c44e304af new file mode 100755 index 0000000..49c0d81 Binary files /dev/null and b/.git_disabled/objects/13/e590e41224082cd1e8be26c6d8720c44e304af differ diff --git a/.git_disabled/objects/13/f6f47b162b20853f81a42c04a2467685c6eb6f b/.git_disabled/objects/13/f6f47b162b20853f81a42c04a2467685c6eb6f new file mode 100755 index 0000000..d8e9f44 Binary files /dev/null and b/.git_disabled/objects/13/f6f47b162b20853f81a42c04a2467685c6eb6f differ diff --git a/.git_disabled/objects/14/002f61f310008392e8baa97b943ac9163dc02c b/.git_disabled/objects/14/002f61f310008392e8baa97b943ac9163dc02c new file mode 100755 index 0000000..159211e Binary files /dev/null and b/.git_disabled/objects/14/002f61f310008392e8baa97b943ac9163dc02c differ diff --git a/.git_disabled/objects/14/12a2a520e85d4f398c79b77a2ed5a5be740654 b/.git_disabled/objects/14/12a2a520e85d4f398c79b77a2ed5a5be740654 new file mode 100755 index 0000000..39ebf08 Binary files /dev/null and b/.git_disabled/objects/14/12a2a520e85d4f398c79b77a2ed5a5be740654 differ diff --git a/.git_disabled/objects/14/63dbe4d18590a5adb8b07a94fbfd09f6c1a084 b/.git_disabled/objects/14/63dbe4d18590a5adb8b07a94fbfd09f6c1a084 new file mode 100755 index 0000000..71062ab Binary files /dev/null and b/.git_disabled/objects/14/63dbe4d18590a5adb8b07a94fbfd09f6c1a084 differ diff --git a/.git_disabled/objects/14/7835c41694a1b756f299f7988285b92119236e b/.git_disabled/objects/14/7835c41694a1b756f299f7988285b92119236e new file mode 100755 index 0000000..2216a94 Binary files /dev/null and b/.git_disabled/objects/14/7835c41694a1b756f299f7988285b92119236e differ diff --git a/.git_disabled/objects/14/7a8fa333acaf31618d37ba2896e3a5bf5e4d02 b/.git_disabled/objects/14/7a8fa333acaf31618d37ba2896e3a5bf5e4d02 new file mode 100755 index 0000000..c9a8cc4 Binary files /dev/null and b/.git_disabled/objects/14/7a8fa333acaf31618d37ba2896e3a5bf5e4d02 differ diff --git a/.git_disabled/objects/14/ac979f7cb6727d194476821db2925f306834b2 b/.git_disabled/objects/14/ac979f7cb6727d194476821db2925f306834b2 new file mode 100755 index 0000000..c1f4390 Binary files /dev/null and b/.git_disabled/objects/14/ac979f7cb6727d194476821db2925f306834b2 differ diff --git a/.git_disabled/objects/14/c7df2bdf13324e7ea164cbee899889aa2ff527 b/.git_disabled/objects/14/c7df2bdf13324e7ea164cbee899889aa2ff527 new file mode 100755 index 0000000..c545bad --- /dev/null +++ b/.git_disabled/objects/14/c7df2bdf13324e7ea164cbee899889aa2ff527 @@ -0,0 +1,2 @@ +xm1 0`%MmN I,ڻkuhAhq.Fy%sX^ +-R_w%m̍1Rs2!K wj)OuXQ5BMLbOJL G \ No newline at end of file diff --git a/.git_disabled/objects/14/ca7db76737c9caddeef703ce6313deeb751bec b/.git_disabled/objects/14/ca7db76737c9caddeef703ce6313deeb751bec new file mode 100755 index 0000000..fa9753e Binary files /dev/null and b/.git_disabled/objects/14/ca7db76737c9caddeef703ce6313deeb751bec differ diff --git a/.git_disabled/objects/14/ccf1c00fc4a87fc08afc0163aeb748e6c94282 b/.git_disabled/objects/14/ccf1c00fc4a87fc08afc0163aeb748e6c94282 new file mode 100755 index 0000000..83879cc Binary files /dev/null and b/.git_disabled/objects/14/ccf1c00fc4a87fc08afc0163aeb748e6c94282 differ diff --git a/.git_disabled/objects/14/ce975e85ff3fe164b9a3bfd1fa02e02020ab98 b/.git_disabled/objects/14/ce975e85ff3fe164b9a3bfd1fa02e02020ab98 new file mode 100755 index 0000000..cb47af7 Binary files /dev/null and b/.git_disabled/objects/14/ce975e85ff3fe164b9a3bfd1fa02e02020ab98 differ diff --git a/.git_disabled/objects/14/cffc2fb268c60a14c7e2d95d0e406c2b540da6 b/.git_disabled/objects/14/cffc2fb268c60a14c7e2d95d0e406c2b540da6 new file mode 100755 index 0000000..e5c1d66 Binary files /dev/null and b/.git_disabled/objects/14/cffc2fb268c60a14c7e2d95d0e406c2b540da6 differ diff --git a/.git_disabled/objects/14/d73ba37b80585930a0ac71d6ff8b2ea6f46ed3 b/.git_disabled/objects/14/d73ba37b80585930a0ac71d6ff8b2ea6f46ed3 new file mode 100755 index 0000000..46cf879 Binary files /dev/null and b/.git_disabled/objects/14/d73ba37b80585930a0ac71d6ff8b2ea6f46ed3 differ diff --git a/.git_disabled/objects/14/d7778a02ae6e162208db00bb6e177968a20f65 b/.git_disabled/objects/14/d7778a02ae6e162208db00bb6e177968a20f65 new file mode 100755 index 0000000..9232afd Binary files /dev/null and b/.git_disabled/objects/14/d7778a02ae6e162208db00bb6e177968a20f65 differ diff --git a/.git_disabled/objects/14/e9dfb9970306e5e80fb9c2af04a2a32615e537 b/.git_disabled/objects/14/e9dfb9970306e5e80fb9c2af04a2a32615e537 new file mode 100755 index 0000000..ccda39b Binary files /dev/null and b/.git_disabled/objects/14/e9dfb9970306e5e80fb9c2af04a2a32615e537 differ diff --git a/.git_disabled/objects/14/f52414c428c99911bf81d1bd21c1c3314197cd b/.git_disabled/objects/14/f52414c428c99911bf81d1bd21c1c3314197cd new file mode 100755 index 0000000..5307739 Binary files /dev/null and b/.git_disabled/objects/14/f52414c428c99911bf81d1bd21c1c3314197cd differ diff --git a/.git_disabled/objects/14/f7bb0b18495da580d873c8e48a45211c8e84ef b/.git_disabled/objects/14/f7bb0b18495da580d873c8e48a45211c8e84ef new file mode 100755 index 0000000..e6bfe06 --- /dev/null +++ b/.git_disabled/objects/14/f7bb0b18495da580d873c8e48a45211c8e84ef @@ -0,0 +1,8 @@ +x}Tn13_1RdIɒ(A)RnV}2 N6lc& `fgΜqN|#YT/WQzG +Bt%b QiVRiD +F4dhFlϱ!b5<ʴTDʀ +s4P]IEO/FP&İ 4C2tu݄j\$q#AlClWX)ǨfNn^/{ۊ"Gyc +H ˽ +;7<'ܑ>1yyNo"mT@9:v@<""fUjV ]̿QldC{ss7U?K|N/ T)yب)R_IyefG*K'F7M~S'J>69#lvdžA}6Tfe |Nފv/ \ No newline at end of file diff --git a/.git_disabled/objects/15/11959c22b74118c06679739cf9abe2ceeea48c b/.git_disabled/objects/15/11959c22b74118c06679739cf9abe2ceeea48c new file mode 100755 index 0000000..d3f0a53 --- /dev/null +++ b/.git_disabled/objects/15/11959c22b74118c06679739cf9abe2ceeea48c @@ -0,0 +1,2 @@ +x]OKA =xЋEwPbUo[ztgt ̊Sjbu",pSʲu}r ,? ZG u9CoQ?$$G^LtA!) ``lQκfvmk;jh<@&0Osu.XH.]T*4_~VƘIaU4`.B9 0JW+ILЕ6,29 9L˽T kL \ No newline at end of file diff --git a/.git_disabled/objects/15/6dd60f9fbe1f19c1a461421424da5c62a89856 b/.git_disabled/objects/15/6dd60f9fbe1f19c1a461421424da5c62a89856 new file mode 100755 index 0000000..cfda473 Binary files /dev/null and b/.git_disabled/objects/15/6dd60f9fbe1f19c1a461421424da5c62a89856 differ diff --git a/.git_disabled/objects/15/72c2e269079da8aa62d7e23271bd781a6d6dee b/.git_disabled/objects/15/72c2e269079da8aa62d7e23271bd781a6d6dee new file mode 100755 index 0000000..b8a783b Binary files /dev/null and b/.git_disabled/objects/15/72c2e269079da8aa62d7e23271bd781a6d6dee differ diff --git a/.git_disabled/objects/15/8182582f59ddd25bdfe5aaf8235173aa9484b5 b/.git_disabled/objects/15/8182582f59ddd25bdfe5aaf8235173aa9484b5 new file mode 100755 index 0000000..1497554 Binary files /dev/null and b/.git_disabled/objects/15/8182582f59ddd25bdfe5aaf8235173aa9484b5 differ diff --git a/.git_disabled/objects/15/89658c388d2b230997c5b905f6798800b4d404 b/.git_disabled/objects/15/89658c388d2b230997c5b905f6798800b4d404 new file mode 100755 index 0000000..274df1c Binary files /dev/null and b/.git_disabled/objects/15/89658c388d2b230997c5b905f6798800b4d404 differ diff --git a/.git_disabled/objects/15/966ec42c014d6a0198d23e222db64015884d2e b/.git_disabled/objects/15/966ec42c014d6a0198d23e222db64015884d2e new file mode 100755 index 0000000..bb3e6c1 Binary files /dev/null and b/.git_disabled/objects/15/966ec42c014d6a0198d23e222db64015884d2e differ diff --git a/.git_disabled/objects/15/9fe00e5162be08175f7fabb9b9727c4d73dcf1 b/.git_disabled/objects/15/9fe00e5162be08175f7fabb9b9727c4d73dcf1 new file mode 100755 index 0000000..f15685d Binary files /dev/null and b/.git_disabled/objects/15/9fe00e5162be08175f7fabb9b9727c4d73dcf1 differ diff --git a/.git_disabled/objects/15/ae03c47b888e09a6d6652856461c412282c0ea b/.git_disabled/objects/15/ae03c47b888e09a6d6652856461c412282c0ea new file mode 100755 index 0000000..63faa56 Binary files /dev/null and b/.git_disabled/objects/15/ae03c47b888e09a6d6652856461c412282c0ea differ diff --git a/.git_disabled/objects/15/b63d1b4b4bf4120b75d7759121effe6f8b0fcb b/.git_disabled/objects/15/b63d1b4b4bf4120b75d7759121effe6f8b0fcb new file mode 100755 index 0000000..744cee5 Binary files /dev/null and b/.git_disabled/objects/15/b63d1b4b4bf4120b75d7759121effe6f8b0fcb differ diff --git a/.git_disabled/objects/15/cabe6bfb491367524761c99d260ddd29c140b6 b/.git_disabled/objects/15/cabe6bfb491367524761c99d260ddd29c140b6 new file mode 100755 index 0000000..428cb70 Binary files /dev/null and b/.git_disabled/objects/15/cabe6bfb491367524761c99d260ddd29c140b6 differ diff --git a/.git_disabled/objects/15/d3007927548b075a0160605dfd97e304a101a7 b/.git_disabled/objects/15/d3007927548b075a0160605dfd97e304a101a7 new file mode 100755 index 0000000..659efbc Binary files /dev/null and b/.git_disabled/objects/15/d3007927548b075a0160605dfd97e304a101a7 differ diff --git a/.git_disabled/objects/15/d341faec3ab7b3742d45c81914c019556a8dfb b/.git_disabled/objects/15/d341faec3ab7b3742d45c81914c019556a8dfb new file mode 100755 index 0000000..e81098f Binary files /dev/null and b/.git_disabled/objects/15/d341faec3ab7b3742d45c81914c019556a8dfb differ diff --git a/.git_disabled/objects/15/de9e340509b9b32a043371ab1f968e9b0d1df9 b/.git_disabled/objects/15/de9e340509b9b32a043371ab1f968e9b0d1df9 new file mode 100755 index 0000000..b1a4c80 Binary files /dev/null and b/.git_disabled/objects/15/de9e340509b9b32a043371ab1f968e9b0d1df9 differ diff --git a/.git_disabled/objects/15/e3917cb1c77633b3044db34c1062a418795955 b/.git_disabled/objects/15/e3917cb1c77633b3044db34c1062a418795955 new file mode 100755 index 0000000..a09e9f6 Binary files /dev/null and b/.git_disabled/objects/15/e3917cb1c77633b3044db34c1062a418795955 differ diff --git a/.git_disabled/objects/15/e73e51a22d3e2b61bb2241b09d197754f9732e b/.git_disabled/objects/15/e73e51a22d3e2b61bb2241b09d197754f9732e new file mode 100755 index 0000000..08028b2 Binary files /dev/null and b/.git_disabled/objects/15/e73e51a22d3e2b61bb2241b09d197754f9732e differ diff --git a/.git_disabled/objects/15/e7909ea3b432ffdaf1dbfac17770cb4b2ce2b0 b/.git_disabled/objects/15/e7909ea3b432ffdaf1dbfac17770cb4b2ce2b0 new file mode 100755 index 0000000..9ae0e12 Binary files /dev/null and b/.git_disabled/objects/15/e7909ea3b432ffdaf1dbfac17770cb4b2ce2b0 differ diff --git a/.git_disabled/objects/15/fde0bb08a6ab4d86328ff66e7abf889728ae70 b/.git_disabled/objects/15/fde0bb08a6ab4d86328ff66e7abf889728ae70 new file mode 100755 index 0000000..e940e4c Binary files /dev/null and b/.git_disabled/objects/15/fde0bb08a6ab4d86328ff66e7abf889728ae70 differ diff --git a/.git_disabled/objects/16/04e861bd501e3c223febb8e0bd76e5c5d06cdd b/.git_disabled/objects/16/04e861bd501e3c223febb8e0bd76e5c5d06cdd new file mode 100755 index 0000000..9d33591 Binary files /dev/null and b/.git_disabled/objects/16/04e861bd501e3c223febb8e0bd76e5c5d06cdd differ diff --git a/.git_disabled/objects/16/0bb55c26f201cda0a6c627a3575c7620a84c43 b/.git_disabled/objects/16/0bb55c26f201cda0a6c627a3575c7620a84c43 new file mode 100755 index 0000000..fe5183e Binary files /dev/null and b/.git_disabled/objects/16/0bb55c26f201cda0a6c627a3575c7620a84c43 differ diff --git a/.git_disabled/objects/16/113fe73166adc2bfab092f2b88704069ffd61f b/.git_disabled/objects/16/113fe73166adc2bfab092f2b88704069ffd61f new file mode 100755 index 0000000..cf2da26 Binary files /dev/null and b/.git_disabled/objects/16/113fe73166adc2bfab092f2b88704069ffd61f differ diff --git a/.git_disabled/objects/16/445be8fc1b0783ef7a775ad67a7289aa3c44cb b/.git_disabled/objects/16/445be8fc1b0783ef7a775ad67a7289aa3c44cb new file mode 100755 index 0000000..6a95afd Binary files /dev/null and b/.git_disabled/objects/16/445be8fc1b0783ef7a775ad67a7289aa3c44cb differ diff --git a/.git_disabled/objects/16/4aa027cdbf6e512ba7a6686180359b8d43ef4b b/.git_disabled/objects/16/4aa027cdbf6e512ba7a6686180359b8d43ef4b new file mode 100755 index 0000000..b546448 Binary files /dev/null and b/.git_disabled/objects/16/4aa027cdbf6e512ba7a6686180359b8d43ef4b differ diff --git a/.git_disabled/objects/16/51cfcdc30d4474a773871f13a4abc167024b83 b/.git_disabled/objects/16/51cfcdc30d4474a773871f13a4abc167024b83 new file mode 100755 index 0000000..707daa2 Binary files /dev/null and b/.git_disabled/objects/16/51cfcdc30d4474a773871f13a4abc167024b83 differ diff --git a/.git_disabled/objects/16/5a3d89cfcbd2207380999dcbf4e55ff47acb79 b/.git_disabled/objects/16/5a3d89cfcbd2207380999dcbf4e55ff47acb79 new file mode 100755 index 0000000..ecb62a1 Binary files /dev/null and b/.git_disabled/objects/16/5a3d89cfcbd2207380999dcbf4e55ff47acb79 differ diff --git a/.git_disabled/objects/16/6c8fe608f5c83de6002b5508cf374d1041b4d4 b/.git_disabled/objects/16/6c8fe608f5c83de6002b5508cf374d1041b4d4 new file mode 100755 index 0000000..c5821d0 Binary files /dev/null and b/.git_disabled/objects/16/6c8fe608f5c83de6002b5508cf374d1041b4d4 differ diff --git a/.git_disabled/objects/16/7426fa8a9bed93680b9e35c2e8226995a26017 b/.git_disabled/objects/16/7426fa8a9bed93680b9e35c2e8226995a26017 new file mode 100755 index 0000000..f0069b0 Binary files /dev/null and b/.git_disabled/objects/16/7426fa8a9bed93680b9e35c2e8226995a26017 differ diff --git a/.git_disabled/objects/16/761b9ab395c1b8d07307f4f06779f0f3e2a7ad b/.git_disabled/objects/16/761b9ab395c1b8d07307f4f06779f0f3e2a7ad new file mode 100755 index 0000000..f57fb3a Binary files /dev/null and b/.git_disabled/objects/16/761b9ab395c1b8d07307f4f06779f0f3e2a7ad differ diff --git a/.git_disabled/objects/16/899208ca71a890c725eea093951c8c683200d4 b/.git_disabled/objects/16/899208ca71a890c725eea093951c8c683200d4 new file mode 100755 index 0000000..83d904e Binary files /dev/null and b/.git_disabled/objects/16/899208ca71a890c725eea093951c8c683200d4 differ diff --git a/.git_disabled/objects/16/8d26ee34b61e8babec70d1e7ce704270c26ccb b/.git_disabled/objects/16/8d26ee34b61e8babec70d1e7ce704270c26ccb new file mode 100755 index 0000000..55a22bb --- /dev/null +++ b/.git_disabled/objects/16/8d26ee34b61e8babec70d1e7ce704270c26ccb @@ -0,0 +1 @@ +x+)JMU05f040075Up,(MRp,-H+LN,OgdQFϴ:Zn \ No newline at end of file diff --git a/.git_disabled/objects/16/9ef5cc8bf724b8af53f1e7c39dde0c774a62d4 b/.git_disabled/objects/16/9ef5cc8bf724b8af53f1e7c39dde0c774a62d4 new file mode 100755 index 0000000..5168497 Binary files /dev/null and b/.git_disabled/objects/16/9ef5cc8bf724b8af53f1e7c39dde0c774a62d4 differ diff --git a/.git_disabled/objects/16/adc16a1e857396a7ba596c7e2968964e5e6bc0 b/.git_disabled/objects/16/adc16a1e857396a7ba596c7e2968964e5e6bc0 new file mode 100755 index 0000000..06b0c6e Binary files /dev/null and b/.git_disabled/objects/16/adc16a1e857396a7ba596c7e2968964e5e6bc0 differ diff --git a/.git_disabled/objects/16/b2362c8c5c914e0f1d0a69c1f1bcaaf153155c b/.git_disabled/objects/16/b2362c8c5c914e0f1d0a69c1f1bcaaf153155c new file mode 100755 index 0000000..213a1c0 Binary files /dev/null and b/.git_disabled/objects/16/b2362c8c5c914e0f1d0a69c1f1bcaaf153155c differ diff --git a/.git_disabled/objects/16/b9d718198ca82d79a70e1e923a9255fea00ee2 b/.git_disabled/objects/16/b9d718198ca82d79a70e1e923a9255fea00ee2 new file mode 100755 index 0000000..3ff4742 Binary files /dev/null and b/.git_disabled/objects/16/b9d718198ca82d79a70e1e923a9255fea00ee2 differ diff --git a/.git_disabled/objects/16/cff1adc9ca82f716022e85321978dce5588024 b/.git_disabled/objects/16/cff1adc9ca82f716022e85321978dce5588024 new file mode 100755 index 0000000..bbfd7ba Binary files /dev/null and b/.git_disabled/objects/16/cff1adc9ca82f716022e85321978dce5588024 differ diff --git a/.git_disabled/objects/16/fba54ca0c9d4d1b7298c19d0dbfa8a34fab978 b/.git_disabled/objects/16/fba54ca0c9d4d1b7298c19d0dbfa8a34fab978 new file mode 100755 index 0000000..b7f5d18 Binary files /dev/null and b/.git_disabled/objects/16/fba54ca0c9d4d1b7298c19d0dbfa8a34fab978 differ diff --git a/.git_disabled/objects/17/18fb9373312ab2d1084c273fab7ab7c98d4afa b/.git_disabled/objects/17/18fb9373312ab2d1084c273fab7ab7c98d4afa new file mode 100755 index 0000000..7ae473f Binary files /dev/null and b/.git_disabled/objects/17/18fb9373312ab2d1084c273fab7ab7c98d4afa differ diff --git a/.git_disabled/objects/17/25d53140e209856930ebe63471b8cb1b19ea9f b/.git_disabled/objects/17/25d53140e209856930ebe63471b8cb1b19ea9f new file mode 100755 index 0000000..18afe2e Binary files /dev/null and b/.git_disabled/objects/17/25d53140e209856930ebe63471b8cb1b19ea9f differ diff --git a/.git_disabled/objects/17/4ae029bf7c0a8aa330a1f64c1b98a2ac3cfff6 b/.git_disabled/objects/17/4ae029bf7c0a8aa330a1f64c1b98a2ac3cfff6 new file mode 100755 index 0000000..332de4a Binary files /dev/null and b/.git_disabled/objects/17/4ae029bf7c0a8aa330a1f64c1b98a2ac3cfff6 differ diff --git a/.git_disabled/objects/17/613f7e722ef41648e3fa1ac2288e9ddaa4bc40 b/.git_disabled/objects/17/613f7e722ef41648e3fa1ac2288e9ddaa4bc40 new file mode 100755 index 0000000..e9e4db0 --- /dev/null +++ b/.git_disabled/objects/17/613f7e722ef41648e3fa1ac2288e9ddaa4bc40 @@ -0,0 +1,6 @@ +xU$!tKe#bB@(ʸ BX|a\]k}O7}N`[|5ngLwu=|W\VTNSFᳯӥ[OY= j5@M&P j5@M&P j5@M&P j5@MY,ݫ}gݖ-l` +X0)L` -4P{-6,as&0(=Eְ%,`3B'[VaSZh@a X +9` +C N5` 01@q6,as&0(Н?lakX0Lachc-l` +X0)L` -4P;Aְ%,`3BG[VaSZh@a X +9` +C ?lakX0Lachݯ[VaSZh@a XʔZj5@M&P j5@M6KSq +O/?fg0~[Sʅ/~˸K{Ϲמ߱GzF?Q9d?h~=;߁OW:ugWT?*wĞyY/̟hOwړ';ڞw~٧Gs؞cؗ͞>a|ş^Ǔ?(gn{R_QQ'O}3~jGKʕ}?*ra/1^jS)/Irh_d֏c|W2zUS{u~:C9o-ϲ_eW^XL{+2Lϰﱧn߅m>'\Пun8֙==O;OaRP59lןоQy/?Oq5?*c{=/x?KGUՌz{S>?b5jzk=i~zW( 2֭|-7VSw4_ EA O^y(+v>-{=ynOړS﷚/y^cOzޫ>yj?s~'/=Ky~k iWF*zޫ>y}qG_iO'q=yϞ<ؓ51#;h7 A;Ї !pV=|YK=.;(z*Œa:9Lj)шR9pr8<{55[YKYN!:"Մ kvchQnהkeڶK @Ȧ qc +vy2?;713iq!S7C9-f +[ EW=͆B! >U \ No newline at end of file diff --git a/.git_disabled/objects/19/b7c0ed057f19b9a32247b5a4eb8eca97ff2f04 b/.git_disabled/objects/19/b7c0ed057f19b9a32247b5a4eb8eca97ff2f04 new file mode 100755 index 0000000..7429bc5 Binary files /dev/null and b/.git_disabled/objects/19/b7c0ed057f19b9a32247b5a4eb8eca97ff2f04 differ diff --git a/.git_disabled/objects/19/b878917d767d18bef498e0675b667b610ccc34 b/.git_disabled/objects/19/b878917d767d18bef498e0675b667b610ccc34 new file mode 100755 index 0000000..7cf9b04 Binary files /dev/null and b/.git_disabled/objects/19/b878917d767d18bef498e0675b667b610ccc34 differ diff --git a/.git_disabled/objects/19/f6361ec815fdc5503d01e60d09e82c6fc57606 b/.git_disabled/objects/19/f6361ec815fdc5503d01e60d09e82c6fc57606 new file mode 100755 index 0000000..709d9ff Binary files /dev/null and b/.git_disabled/objects/19/f6361ec815fdc5503d01e60d09e82c6fc57606 differ diff --git a/.git_disabled/objects/1a/0597c7efd5cce7ad9f2f152873ea7e142fbc14 b/.git_disabled/objects/1a/0597c7efd5cce7ad9f2f152873ea7e142fbc14 new file mode 100755 index 0000000..3f0a8ce Binary files /dev/null and b/.git_disabled/objects/1a/0597c7efd5cce7ad9f2f152873ea7e142fbc14 differ diff --git a/.git_disabled/objects/1a/0c74d63ad91fc305740ccf499966bfc11dca74 b/.git_disabled/objects/1a/0c74d63ad91fc305740ccf499966bfc11dca74 new file mode 100755 index 0000000..2c97427 Binary files /dev/null and b/.git_disabled/objects/1a/0c74d63ad91fc305740ccf499966bfc11dca74 differ diff --git a/.git_disabled/objects/1a/160125965199a91b39857d2d93f37bde4e17e2 b/.git_disabled/objects/1a/160125965199a91b39857d2d93f37bde4e17e2 new file mode 100755 index 0000000..eac7b55 Binary files /dev/null and b/.git_disabled/objects/1a/160125965199a91b39857d2d93f37bde4e17e2 differ diff --git a/.git_disabled/objects/1a/4c988c690021860cb2966a8034f9f6cff88109 b/.git_disabled/objects/1a/4c988c690021860cb2966a8034f9f6cff88109 new file mode 100755 index 0000000..a386ae3 Binary files /dev/null and b/.git_disabled/objects/1a/4c988c690021860cb2966a8034f9f6cff88109 differ diff --git a/.git_disabled/objects/1a/630edb04f6458d8013da88cf42305533fef6d1 b/.git_disabled/objects/1a/630edb04f6458d8013da88cf42305533fef6d1 new file mode 100755 index 0000000..7629f1f Binary files /dev/null and b/.git_disabled/objects/1a/630edb04f6458d8013da88cf42305533fef6d1 differ diff --git a/.git_disabled/objects/1a/6901b07b8f87ea68218630f1ae4a5deb27654f b/.git_disabled/objects/1a/6901b07b8f87ea68218630f1ae4a5deb27654f new file mode 100755 index 0000000..cbc969b Binary files /dev/null and b/.git_disabled/objects/1a/6901b07b8f87ea68218630f1ae4a5deb27654f differ diff --git a/.git_disabled/objects/1a/6f88bf723fc6feecf77ab3a4db56357b10b782 b/.git_disabled/objects/1a/6f88bf723fc6feecf77ab3a4db56357b10b782 new file mode 100755 index 0000000..1f13d39 Binary files /dev/null and b/.git_disabled/objects/1a/6f88bf723fc6feecf77ab3a4db56357b10b782 differ diff --git a/.git_disabled/objects/1a/7b7850af261ab1f9ef3768a3309219e8c3172a b/.git_disabled/objects/1a/7b7850af261ab1f9ef3768a3309219e8c3172a new file mode 100755 index 0000000..b5cc4d8 Binary files /dev/null and b/.git_disabled/objects/1a/7b7850af261ab1f9ef3768a3309219e8c3172a differ diff --git a/.git_disabled/objects/1a/7c9a48bdfa0a26d70881c85409a494aa5935e2 b/.git_disabled/objects/1a/7c9a48bdfa0a26d70881c85409a494aa5935e2 new file mode 100755 index 0000000..12945eb Binary files /dev/null and b/.git_disabled/objects/1a/7c9a48bdfa0a26d70881c85409a494aa5935e2 differ diff --git a/.git_disabled/objects/1a/8b5ed5d56cc8c06cca5728662b635f18a47749 b/.git_disabled/objects/1a/8b5ed5d56cc8c06cca5728662b635f18a47749 new file mode 100755 index 0000000..b438c4d Binary files /dev/null and b/.git_disabled/objects/1a/8b5ed5d56cc8c06cca5728662b635f18a47749 differ diff --git a/.git_disabled/objects/1a/9039ae891cc7f6648762a96562b85d3254476f b/.git_disabled/objects/1a/9039ae891cc7f6648762a96562b85d3254476f new file mode 100755 index 0000000..cc372c1 Binary files /dev/null and b/.git_disabled/objects/1a/9039ae891cc7f6648762a96562b85d3254476f differ diff --git a/.git_disabled/objects/1a/92575bb83433f3e201dabbeaf7eab45bed9701 b/.git_disabled/objects/1a/92575bb83433f3e201dabbeaf7eab45bed9701 new file mode 100755 index 0000000..ff91fd7 Binary files /dev/null and b/.git_disabled/objects/1a/92575bb83433f3e201dabbeaf7eab45bed9701 differ diff --git a/.git_disabled/objects/1a/97583fde6e240a81a4e122820f6f0ad1ec0c71 b/.git_disabled/objects/1a/97583fde6e240a81a4e122820f6f0ad1ec0c71 new file mode 100755 index 0000000..65050eb --- /dev/null +++ b/.git_disabled/objects/1a/97583fde6e240a81a4e122820f6f0ad1ec0c71 @@ -0,0 +1,4 @@ +xuTM0 y^Z2!b3__J?Fvv J/H鿍لq-=:ރ3rEcN>e;xh;;(SUy% +ey +t~_Gs"@]64r%$Kf$2`[m+ލ"Jp \ No newline at end of file diff --git a/.git_disabled/objects/1a/9e142bfff505e251e1eb2b4ee2756c4d15b2a7 b/.git_disabled/objects/1a/9e142bfff505e251e1eb2b4ee2756c4d15b2a7 new file mode 100755 index 0000000..bd323af Binary files /dev/null and b/.git_disabled/objects/1a/9e142bfff505e251e1eb2b4ee2756c4d15b2a7 differ diff --git a/.git_disabled/objects/1a/a1b03255b59ef3eefd16ed31a202354a6cb0ce b/.git_disabled/objects/1a/a1b03255b59ef3eefd16ed31a202354a6cb0ce new file mode 100755 index 0000000..8b1e39f Binary files /dev/null and b/.git_disabled/objects/1a/a1b03255b59ef3eefd16ed31a202354a6cb0ce differ diff --git a/.git_disabled/objects/1a/ac5193b52584540d64af400a28835a4cfabdc8 b/.git_disabled/objects/1a/ac5193b52584540d64af400a28835a4cfabdc8 new file mode 100755 index 0000000..69a5415 Binary files /dev/null and b/.git_disabled/objects/1a/ac5193b52584540d64af400a28835a4cfabdc8 differ diff --git a/.git_disabled/objects/1a/b765245d989e9590292cf0285aba6dde065ffc b/.git_disabled/objects/1a/b765245d989e9590292cf0285aba6dde065ffc new file mode 100755 index 0000000..91ab527 Binary files /dev/null and b/.git_disabled/objects/1a/b765245d989e9590292cf0285aba6dde065ffc differ diff --git a/.git_disabled/objects/1a/bbebd3e941a4ddce2311d4c916cc381f0b68d6 b/.git_disabled/objects/1a/bbebd3e941a4ddce2311d4c916cc381f0b68d6 new file mode 100755 index 0000000..0e4ba7b Binary files /dev/null and b/.git_disabled/objects/1a/bbebd3e941a4ddce2311d4c916cc381f0b68d6 differ diff --git a/.git_disabled/objects/1a/ddc8e32a649d6dd09517bbc53b5b3dd63b127f b/.git_disabled/objects/1a/ddc8e32a649d6dd09517bbc53b5b3dd63b127f new file mode 100755 index 0000000..0c36d3c Binary files /dev/null and b/.git_disabled/objects/1a/ddc8e32a649d6dd09517bbc53b5b3dd63b127f differ diff --git a/.git_disabled/objects/1a/e0bb4c516626e24dc173a70f895f2c38a9307b b/.git_disabled/objects/1a/e0bb4c516626e24dc173a70f895f2c38a9307b new file mode 100755 index 0000000..dbfb078 Binary files /dev/null and b/.git_disabled/objects/1a/e0bb4c516626e24dc173a70f895f2c38a9307b differ diff --git a/.git_disabled/objects/1a/ed2bf4724077288c0df99abe464ed429c839f3 b/.git_disabled/objects/1a/ed2bf4724077288c0df99abe464ed429c839f3 new file mode 100755 index 0000000..c157e63 Binary files /dev/null and b/.git_disabled/objects/1a/ed2bf4724077288c0df99abe464ed429c839f3 differ diff --git a/.git_disabled/objects/1a/ef3dadc6d210dc9e454b60dedff0220129bef8 b/.git_disabled/objects/1a/ef3dadc6d210dc9e454b60dedff0220129bef8 new file mode 100755 index 0000000..9c97518 Binary files /dev/null and b/.git_disabled/objects/1a/ef3dadc6d210dc9e454b60dedff0220129bef8 differ diff --git a/.git_disabled/objects/1a/f6d7b41fc6a648aa1514b025478704124669b1 b/.git_disabled/objects/1a/f6d7b41fc6a648aa1514b025478704124669b1 new file mode 100755 index 0000000..9be381a Binary files /dev/null and b/.git_disabled/objects/1a/f6d7b41fc6a648aa1514b025478704124669b1 differ diff --git a/.git_disabled/objects/1a/feaed1895722113a3b9f41353ac182d3266485 b/.git_disabled/objects/1a/feaed1895722113a3b9f41353ac182d3266485 new file mode 100755 index 0000000..4f565a2 Binary files /dev/null and b/.git_disabled/objects/1a/feaed1895722113a3b9f41353ac182d3266485 differ diff --git a/.git_disabled/objects/1b/25362014cf637f959f441d2e1a50660be9deb2 b/.git_disabled/objects/1b/25362014cf637f959f441d2e1a50660be9deb2 new file mode 100755 index 0000000..86f673d Binary files /dev/null and b/.git_disabled/objects/1b/25362014cf637f959f441d2e1a50660be9deb2 differ diff --git a/.git_disabled/objects/1b/2569b19324058de96187bc786fc88e96a1d822 b/.git_disabled/objects/1b/2569b19324058de96187bc786fc88e96a1d822 new file mode 100755 index 0000000..64ed558 Binary files /dev/null and b/.git_disabled/objects/1b/2569b19324058de96187bc786fc88e96a1d822 differ diff --git a/.git_disabled/objects/1b/39b094f69f54cabe0695d91f67f8ba30e94495 b/.git_disabled/objects/1b/39b094f69f54cabe0695d91f67f8ba30e94495 new file mode 100755 index 0000000..7d98c87 Binary files /dev/null and b/.git_disabled/objects/1b/39b094f69f54cabe0695d91f67f8ba30e94495 differ diff --git a/.git_disabled/objects/1b/3aa6ce0c03941676056093b283b687ba5ba4b9 b/.git_disabled/objects/1b/3aa6ce0c03941676056093b283b687ba5ba4b9 new file mode 100755 index 0000000..766bcee Binary files /dev/null and b/.git_disabled/objects/1b/3aa6ce0c03941676056093b283b687ba5ba4b9 differ diff --git a/.git_disabled/objects/1b/4ec98f66a0f8ac40975eda01cebd3fbf31fdae b/.git_disabled/objects/1b/4ec98f66a0f8ac40975eda01cebd3fbf31fdae new file mode 100755 index 0000000..d175b22 Binary files /dev/null and b/.git_disabled/objects/1b/4ec98f66a0f8ac40975eda01cebd3fbf31fdae differ diff --git a/.git_disabled/objects/1b/52a980576f3a7162279b5040d0add71734f20f b/.git_disabled/objects/1b/52a980576f3a7162279b5040d0add71734f20f new file mode 100755 index 0000000..8ab8d12 Binary files /dev/null and b/.git_disabled/objects/1b/52a980576f3a7162279b5040d0add71734f20f differ diff --git a/.git_disabled/objects/1b/6549d49224643f33f27b0ff8956545d7fdcb1f b/.git_disabled/objects/1b/6549d49224643f33f27b0ff8956545d7fdcb1f new file mode 100755 index 0000000..21f61ac Binary files /dev/null and b/.git_disabled/objects/1b/6549d49224643f33f27b0ff8956545d7fdcb1f differ diff --git a/.git_disabled/objects/1b/73f8c048bac985224547263597a5cb583b0852 b/.git_disabled/objects/1b/73f8c048bac985224547263597a5cb583b0852 new file mode 100755 index 0000000..b79653c Binary files /dev/null and b/.git_disabled/objects/1b/73f8c048bac985224547263597a5cb583b0852 differ diff --git a/.git_disabled/objects/1b/768ee349b6c2672abc70bf2e3dbcc3163f885f b/.git_disabled/objects/1b/768ee349b6c2672abc70bf2e3dbcc3163f885f new file mode 100755 index 0000000..0213097 Binary files /dev/null and b/.git_disabled/objects/1b/768ee349b6c2672abc70bf2e3dbcc3163f885f differ diff --git a/.git_disabled/objects/1b/7c37f2c722ef29f0354b9ba0dc3884a214a10e b/.git_disabled/objects/1b/7c37f2c722ef29f0354b9ba0dc3884a214a10e new file mode 100755 index 0000000..2576c71 Binary files /dev/null and b/.git_disabled/objects/1b/7c37f2c722ef29f0354b9ba0dc3884a214a10e differ diff --git a/.git_disabled/objects/1b/8d612aa39466f22277fa54472a04dc6adb0a34 b/.git_disabled/objects/1b/8d612aa39466f22277fa54472a04dc6adb0a34 new file mode 100755 index 0000000..4a2facb Binary files /dev/null and b/.git_disabled/objects/1b/8d612aa39466f22277fa54472a04dc6adb0a34 differ diff --git a/.git_disabled/objects/1b/98ce61b9bdc7e3760695b34814a885b507f634 b/.git_disabled/objects/1b/98ce61b9bdc7e3760695b34814a885b507f634 new file mode 100755 index 0000000..4214f30 Binary files /dev/null and b/.git_disabled/objects/1b/98ce61b9bdc7e3760695b34814a885b507f634 differ diff --git a/.git_disabled/objects/1b/9e03c16f3deefd4dd6a6296592a33aae07f916 b/.git_disabled/objects/1b/9e03c16f3deefd4dd6a6296592a33aae07f916 new file mode 100755 index 0000000..ae16820 Binary files /dev/null and b/.git_disabled/objects/1b/9e03c16f3deefd4dd6a6296592a33aae07f916 differ diff --git a/.git_disabled/objects/1b/b0ab476d1bd22c953cd70e9b0e47cd4a531557 b/.git_disabled/objects/1b/b0ab476d1bd22c953cd70e9b0e47cd4a531557 new file mode 100755 index 0000000..6982d3d Binary files /dev/null and b/.git_disabled/objects/1b/b0ab476d1bd22c953cd70e9b0e47cd4a531557 differ diff --git a/.git_disabled/objects/1b/c55108bbd71d6c92baf97c87e972122c04f4f5 b/.git_disabled/objects/1b/c55108bbd71d6c92baf97c87e972122c04f4f5 new file mode 100755 index 0000000..8765b37 Binary files /dev/null and b/.git_disabled/objects/1b/c55108bbd71d6c92baf97c87e972122c04f4f5 differ diff --git a/.git_disabled/objects/1b/d059df4f4ec58f2196b3963f84e57e49002f06 b/.git_disabled/objects/1b/d059df4f4ec58f2196b3963f84e57e49002f06 new file mode 100755 index 0000000..4fb57bd --- /dev/null +++ b/.git_disabled/objects/1b/d059df4f4ec58f2196b3963f84e57e49002f06 @@ -0,0 +1,3 @@ +x]TM0ٿb,mn Kz)-Gn1{졧#vZ l{3o&).jaIdkCNfǮ :9$mJr#qa])Doh?b,*,i"W6*VWx t1te׌$1X_J$y}!e/- +SnYRb(/|[X2N*xr.W5]/iK#{r٧ ,Р=ȲEths?MU`^і,VA1 t O5*:?vfcvHTxq5[~]>?FtJ0q+hf9#$Yŷarkٻ".G += ׎AŃnK7WJmvIYܖB cӌ T/4~Li0YH.jՃRy'Zt5; .tb3X]3e`ùc|Z3>2ZpHoFZZ \ No newline at end of file diff --git a/.git_disabled/objects/1b/ed3fdadd9b3774be0504a75b1c4ac857edaf08 b/.git_disabled/objects/1b/ed3fdadd9b3774be0504a75b1c4ac857edaf08 new file mode 100755 index 0000000..f6e9f07 Binary files /dev/null and b/.git_disabled/objects/1b/ed3fdadd9b3774be0504a75b1c4ac857edaf08 differ diff --git a/.git_disabled/objects/1c/1a1c7324fe6937a9fbac53f033794d0aa4b6d2 b/.git_disabled/objects/1c/1a1c7324fe6937a9fbac53f033794d0aa4b6d2 new file mode 100755 index 0000000..85b7393 Binary files /dev/null and b/.git_disabled/objects/1c/1a1c7324fe6937a9fbac53f033794d0aa4b6d2 differ diff --git a/.git_disabled/objects/1c/1d93ba5191499febbcfab6a3f8cfbc4cbc855a b/.git_disabled/objects/1c/1d93ba5191499febbcfab6a3f8cfbc4cbc855a new file mode 100755 index 0000000..637b28f Binary files /dev/null and b/.git_disabled/objects/1c/1d93ba5191499febbcfab6a3f8cfbc4cbc855a differ diff --git a/.git_disabled/objects/1c/39b024dfc0ae576f31d92e3b2507833b5358ca b/.git_disabled/objects/1c/39b024dfc0ae576f31d92e3b2507833b5358ca new file mode 100755 index 0000000..383cf34 Binary files /dev/null and b/.git_disabled/objects/1c/39b024dfc0ae576f31d92e3b2507833b5358ca differ diff --git a/.git_disabled/objects/1c/442b2e6ded420c5ebe0ad0eb8dc92413e8a8f7 b/.git_disabled/objects/1c/442b2e6ded420c5ebe0ad0eb8dc92413e8a8f7 new file mode 100755 index 0000000..af2fefe Binary files /dev/null and b/.git_disabled/objects/1c/442b2e6ded420c5ebe0ad0eb8dc92413e8a8f7 differ diff --git a/.git_disabled/objects/1c/44d50f197111b85518e768035235e0f6a1ef74 b/.git_disabled/objects/1c/44d50f197111b85518e768035235e0f6a1ef74 new file mode 100755 index 0000000..2de8bff Binary files /dev/null and b/.git_disabled/objects/1c/44d50f197111b85518e768035235e0f6a1ef74 differ diff --git a/.git_disabled/objects/1c/4c73869e2a4d62663a10ed89cf291be27554f1 b/.git_disabled/objects/1c/4c73869e2a4d62663a10ed89cf291be27554f1 new file mode 100755 index 0000000..db4d0ca Binary files /dev/null and b/.git_disabled/objects/1c/4c73869e2a4d62663a10ed89cf291be27554f1 differ diff --git a/.git_disabled/objects/1c/5fc6ff381e93f21d920fd56927aaaac869c5be b/.git_disabled/objects/1c/5fc6ff381e93f21d920fd56927aaaac869c5be new file mode 100755 index 0000000..0acd93e Binary files /dev/null and b/.git_disabled/objects/1c/5fc6ff381e93f21d920fd56927aaaac869c5be differ diff --git a/.git_disabled/objects/1c/61c43f0e92586ea3108899720c2ce09207fc2c b/.git_disabled/objects/1c/61c43f0e92586ea3108899720c2ce09207fc2c new file mode 100755 index 0000000..931941f Binary files /dev/null and b/.git_disabled/objects/1c/61c43f0e92586ea3108899720c2ce09207fc2c differ diff --git a/.git_disabled/objects/1c/621bada1d0f601a41db4d471929c83fd165043 b/.git_disabled/objects/1c/621bada1d0f601a41db4d471929c83fd165043 new file mode 100755 index 0000000..b3d90b9 Binary files /dev/null and b/.git_disabled/objects/1c/621bada1d0f601a41db4d471929c83fd165043 differ diff --git a/.git_disabled/objects/1c/6ee29eea0262c0fd9a2352536673debdcea35d b/.git_disabled/objects/1c/6ee29eea0262c0fd9a2352536673debdcea35d new file mode 100755 index 0000000..958bf4a Binary files /dev/null and b/.git_disabled/objects/1c/6ee29eea0262c0fd9a2352536673debdcea35d differ diff --git a/.git_disabled/objects/1c/72988f4fc659f02e0ba193ab205180fb4b0e9b b/.git_disabled/objects/1c/72988f4fc659f02e0ba193ab205180fb4b0e9b new file mode 100755 index 0000000..d1c7692 --- /dev/null +++ b/.git_disabled/objects/1c/72988f4fc659f02e0ba193ab205180fb4b0e9b @@ -0,0 +1,4 @@ +x]Qn0Y_/y!( +rq*Г@+L +.]q3â]|Ab"'p}yuw8hB>l@TYArh Q>{Do/+(u_וG`˿Le5 + +ZX'7Bu=hS6.pп9C@^;A<SD \7ʃX[c+͗truDFy%5NGOVH" s*O5D(h,(Esg4í29R˝^g&ゅ}|3욟tl+Nv'0u5$y \ No newline at end of file diff --git a/.git_disabled/objects/1c/bf4ec519c99db8c00f2ff9349e750aec18d69c b/.git_disabled/objects/1c/bf4ec519c99db8c00f2ff9349e750aec18d69c new file mode 100755 index 0000000..7f4a9d5 Binary files /dev/null and b/.git_disabled/objects/1c/bf4ec519c99db8c00f2ff9349e750aec18d69c differ diff --git a/.git_disabled/objects/1c/d4af39ff83bd90659ac0d00480d028a8a7f117 b/.git_disabled/objects/1c/d4af39ff83bd90659ac0d00480d028a8a7f117 new file mode 100755 index 0000000..f7497cf Binary files /dev/null and b/.git_disabled/objects/1c/d4af39ff83bd90659ac0d00480d028a8a7f117 differ diff --git a/.git_disabled/objects/1c/d9223ad4ce8f5b8e7ee2d56eec9ef500ba22d5 b/.git_disabled/objects/1c/d9223ad4ce8f5b8e7ee2d56eec9ef500ba22d5 new file mode 100755 index 0000000..096913d Binary files /dev/null and b/.git_disabled/objects/1c/d9223ad4ce8f5b8e7ee2d56eec9ef500ba22d5 differ diff --git a/.git_disabled/objects/1c/f00c5630a66088a4c42d846ff8b91d511fdd83 b/.git_disabled/objects/1c/f00c5630a66088a4c42d846ff8b91d511fdd83 new file mode 100755 index 0000000..2a29815 Binary files /dev/null and b/.git_disabled/objects/1c/f00c5630a66088a4c42d846ff8b91d511fdd83 differ diff --git a/.git_disabled/objects/1c/fad8350a6904ace5754d06682f571174d72ad5 b/.git_disabled/objects/1c/fad8350a6904ace5754d06682f571174d72ad5 new file mode 100755 index 0000000..8f69371 Binary files /dev/null and b/.git_disabled/objects/1c/fad8350a6904ace5754d06682f571174d72ad5 differ diff --git a/.git_disabled/objects/1d/023e00e36f2fc70232c3be500593695b6af753 b/.git_disabled/objects/1d/023e00e36f2fc70232c3be500593695b6af753 new file mode 100755 index 0000000..6d1fe15 Binary files /dev/null and b/.git_disabled/objects/1d/023e00e36f2fc70232c3be500593695b6af753 differ diff --git a/.git_disabled/objects/1d/12b166cfab37ab45adafe34936beaa8d5d796c b/.git_disabled/objects/1d/12b166cfab37ab45adafe34936beaa8d5d796c new file mode 100755 index 0000000..13a0690 Binary files /dev/null and b/.git_disabled/objects/1d/12b166cfab37ab45adafe34936beaa8d5d796c differ diff --git a/.git_disabled/objects/1d/17f9e6ebb3ced46235d61fa205319b4889fcb0 b/.git_disabled/objects/1d/17f9e6ebb3ced46235d61fa205319b4889fcb0 new file mode 100755 index 0000000..0fb1629 Binary files /dev/null and b/.git_disabled/objects/1d/17f9e6ebb3ced46235d61fa205319b4889fcb0 differ diff --git a/.git_disabled/objects/1d/1a8fb29c6e5c141cd282a8a723133b6f764be6 b/.git_disabled/objects/1d/1a8fb29c6e5c141cd282a8a723133b6f764be6 new file mode 100755 index 0000000..f1e7b28 Binary files /dev/null and b/.git_disabled/objects/1d/1a8fb29c6e5c141cd282a8a723133b6f764be6 differ diff --git a/.git_disabled/objects/1d/2768afbeafd24c39400ead8d607fe22cdca850 b/.git_disabled/objects/1d/2768afbeafd24c39400ead8d607fe22cdca850 new file mode 100755 index 0000000..96d3345 Binary files /dev/null and b/.git_disabled/objects/1d/2768afbeafd24c39400ead8d607fe22cdca850 differ diff --git a/.git_disabled/objects/1d/27ad3c9870c3601c4a5faaeb15ff1f7f7b7a9e b/.git_disabled/objects/1d/27ad3c9870c3601c4a5faaeb15ff1f7f7b7a9e new file mode 100755 index 0000000..9b071b6 Binary files /dev/null and b/.git_disabled/objects/1d/27ad3c9870c3601c4a5faaeb15ff1f7f7b7a9e differ diff --git a/.git_disabled/objects/1d/289e14bfd4cdbce2a39ff86896a344ddcfadd1 b/.git_disabled/objects/1d/289e14bfd4cdbce2a39ff86896a344ddcfadd1 new file mode 100755 index 0000000..17da512 Binary files /dev/null and b/.git_disabled/objects/1d/289e14bfd4cdbce2a39ff86896a344ddcfadd1 differ diff --git a/.git_disabled/objects/1d/2a1079fa95ff15fb640cb6a3e6b103d72dbe48 b/.git_disabled/objects/1d/2a1079fa95ff15fb640cb6a3e6b103d72dbe48 new file mode 100755 index 0000000..ec79c58 Binary files /dev/null and b/.git_disabled/objects/1d/2a1079fa95ff15fb640cb6a3e6b103d72dbe48 differ diff --git a/.git_disabled/objects/1d/2fab985e6bee4caffa6980e5379db69e776b5e b/.git_disabled/objects/1d/2fab985e6bee4caffa6980e5379db69e776b5e new file mode 100755 index 0000000..01a1df6 Binary files /dev/null and b/.git_disabled/objects/1d/2fab985e6bee4caffa6980e5379db69e776b5e differ diff --git a/.git_disabled/objects/1d/48c4e88bc80c3e5b6d5ed8b6e9ca3a0c9a86db b/.git_disabled/objects/1d/48c4e88bc80c3e5b6d5ed8b6e9ca3a0c9a86db new file mode 100755 index 0000000..86bbf8a Binary files /dev/null and b/.git_disabled/objects/1d/48c4e88bc80c3e5b6d5ed8b6e9ca3a0c9a86db differ diff --git a/.git_disabled/objects/1d/52b85405a9e4afd59cdf6e0b3b5079678fcd93 b/.git_disabled/objects/1d/52b85405a9e4afd59cdf6e0b3b5079678fcd93 new file mode 100755 index 0000000..735c823 Binary files /dev/null and b/.git_disabled/objects/1d/52b85405a9e4afd59cdf6e0b3b5079678fcd93 differ diff --git a/.git_disabled/objects/1d/6bf0b0138d684eaf208f21d4900b7b774e1a0a b/.git_disabled/objects/1d/6bf0b0138d684eaf208f21d4900b7b774e1a0a new file mode 100755 index 0000000..1aa3fb0 Binary files /dev/null and b/.git_disabled/objects/1d/6bf0b0138d684eaf208f21d4900b7b774e1a0a differ diff --git a/.git_disabled/objects/1d/7bdce11de7b366344e78611b2af9a3f55af68b b/.git_disabled/objects/1d/7bdce11de7b366344e78611b2af9a3f55af68b new file mode 100755 index 0000000..4b375bf Binary files /dev/null and b/.git_disabled/objects/1d/7bdce11de7b366344e78611b2af9a3f55af68b differ diff --git a/.git_disabled/objects/1d/afe5ae7af32761ddee3581dd97912bd3149d21 b/.git_disabled/objects/1d/afe5ae7af32761ddee3581dd97912bd3149d21 new file mode 100755 index 0000000..3f0de73 Binary files /dev/null and b/.git_disabled/objects/1d/afe5ae7af32761ddee3581dd97912bd3149d21 differ diff --git a/.git_disabled/objects/1d/db8462bcdcadcb90fa83332b9d04c5a102b864 b/.git_disabled/objects/1d/db8462bcdcadcb90fa83332b9d04c5a102b864 new file mode 100755 index 0000000..7c13076 Binary files /dev/null and b/.git_disabled/objects/1d/db8462bcdcadcb90fa83332b9d04c5a102b864 differ diff --git a/.git_disabled/objects/1d/f403c76f443b360883f918bfa25de5530c9a55 b/.git_disabled/objects/1d/f403c76f443b360883f918bfa25de5530c9a55 new file mode 100755 index 0000000..70beb41 --- /dev/null +++ b/.git_disabled/objects/1d/f403c76f443b360883f918bfa25de5530c9a55 @@ -0,0 +1,2 @@ +xEM +0]¶Vp!"H)(?HgIH^)ި W3|46(IʺWdLb;O %Ai]1>@5U3pIM ~۟/WÄaȧr;V۝@H:JOka +gBK)1CE%,CzQ1D (VYko#;Dc )aSzTX$BO&G_?)d \ No newline at end of file diff --git a/.git_disabled/objects/1e/610da5888ebba83bcdc3bd78da082718bf5ac2 b/.git_disabled/objects/1e/610da5888ebba83bcdc3bd78da082718bf5ac2 new file mode 100755 index 0000000..2a158ea Binary files /dev/null and b/.git_disabled/objects/1e/610da5888ebba83bcdc3bd78da082718bf5ac2 differ diff --git a/.git_disabled/objects/1e/642ff387c64a83808a5108371840b301f84288 b/.git_disabled/objects/1e/642ff387c64a83808a5108371840b301f84288 new file mode 100755 index 0000000..ff0233a Binary files /dev/null and b/.git_disabled/objects/1e/642ff387c64a83808a5108371840b301f84288 differ diff --git a/.git_disabled/objects/1e/827eab13086d5f09ec7d7b6c2d761df67635a8 b/.git_disabled/objects/1e/827eab13086d5f09ec7d7b6c2d761df67635a8 new file mode 100755 index 0000000..4502fbf Binary files /dev/null and b/.git_disabled/objects/1e/827eab13086d5f09ec7d7b6c2d761df67635a8 differ diff --git a/.git_disabled/objects/1e/8e12ad6e6661eb95ecb18ba4136a00157c430a b/.git_disabled/objects/1e/8e12ad6e6661eb95ecb18ba4136a00157c430a new file mode 100755 index 0000000..79a607b Binary files /dev/null and b/.git_disabled/objects/1e/8e12ad6e6661eb95ecb18ba4136a00157c430a differ diff --git a/.git_disabled/objects/1e/9be66ddd1328435626ac969f7a541b0068e28a b/.git_disabled/objects/1e/9be66ddd1328435626ac969f7a541b0068e28a new file mode 100755 index 0000000..76acbe3 Binary files /dev/null and b/.git_disabled/objects/1e/9be66ddd1328435626ac969f7a541b0068e28a differ diff --git a/.git_disabled/objects/1e/aef7759531e5117dccf55533231eea4b0ccf2b b/.git_disabled/objects/1e/aef7759531e5117dccf55533231eea4b0ccf2b new file mode 100755 index 0000000..d9f1f4f Binary files /dev/null and b/.git_disabled/objects/1e/aef7759531e5117dccf55533231eea4b0ccf2b differ diff --git a/.git_disabled/objects/1e/b3c49d99559863120cfb8433fc8738fba43ba9 b/.git_disabled/objects/1e/b3c49d99559863120cfb8433fc8738fba43ba9 new file mode 100755 index 0000000..39ef0d3 --- /dev/null +++ b/.git_disabled/objects/1e/b3c49d99559863120cfb8433fc8738fba43ba9 @@ -0,0 +1,2 @@ +x ɱ +@ `-|DD"fWA͇Q yF7;Ő]_YsUSt}^#in0;@'9 oẸYy% E4E1x *~ws(9[.D#1e.%~Sa4r({26"TQ>=1w=d2*y`ͨXZS?EQg3Vl#gU\پDjiw"j'7Aga1x~ߖz3䣵ܑ;VyzU.̪kxЯw-]+sLXF/6Qypu.xp{l##l8 \ No newline at end of file diff --git a/.git_disabled/objects/1f/8af887c6c06de463d0272c27251d4c0094b3ba b/.git_disabled/objects/1f/8af887c6c06de463d0272c27251d4c0094b3ba new file mode 100755 index 0000000..1089e0d --- /dev/null +++ b/.git_disabled/objects/1f/8af887c6c06de463d0272c27251d4c0094b3ba @@ -0,0 +1,3 @@ +xu1O0`~ +b?}"!I_Uul9U!zNלcsA]مc*(X!~X.C)đ*Ж DUeVyʱvMݞ:%jߗ1{Xve~??/ c|B94jf] + ]oS֡Ѝ~+TY(Q R*N >} \ No newline at end of file diff --git a/.git_disabled/objects/1f/a0969c8f3dec48a6a0e795d0fc3dd3cfcec55a b/.git_disabled/objects/1f/a0969c8f3dec48a6a0e795d0fc3dd3cfcec55a new file mode 100755 index 0000000..f8142a4 Binary files /dev/null and b/.git_disabled/objects/1f/a0969c8f3dec48a6a0e795d0fc3dd3cfcec55a differ diff --git a/.git_disabled/objects/1f/a74461febb774fae5b42e38bbecf5acec78963 b/.git_disabled/objects/1f/a74461febb774fae5b42e38bbecf5acec78963 new file mode 100755 index 0000000..77b53e4 Binary files /dev/null and b/.git_disabled/objects/1f/a74461febb774fae5b42e38bbecf5acec78963 differ diff --git a/.git_disabled/objects/1f/e1cd1b1600a084cd00e66e9de3879dd2d506a2 b/.git_disabled/objects/1f/e1cd1b1600a084cd00e66e9de3879dd2d506a2 new file mode 100755 index 0000000..be3bc3b --- /dev/null +++ b/.git_disabled/objects/1f/e1cd1b1600a084cd00e66e9de3879dd2d506a2 @@ -0,0 +1,2 @@ +xnF{SLᢑZ#; JZK%RRI 4Ern@?@EoCo.^ʐ"]$̎f߷3?k@$h+Ͻt:CܷR>p_x,CF};Mjx~'*ㄼ<$M[.:#QlR]lkRhx~`6N,Arf>E-PXɌc\"c1y-r ܙEeiґy|Mã6 +ᑉq(зQ) [-iFá{9W,8+VM8{_/vt^8+?;z{|(>}*w-e LwY YZ{_ W2 F)>G %To.&}+HmD3EkS%gtB³6i;Zߥ\G;DT2EyG+߲KC!TvkX.0z֘LZlY/5Q`̟CqV2DTTu){-p ahsá84O_oּk. L6UhlB zCK[ ւN/˺(HvLb)h(::[m]P \ No newline at end of file diff --git a/.git_disabled/objects/24/850fffb0d2258db794e8730bb527054604009f b/.git_disabled/objects/24/850fffb0d2258db794e8730bb527054604009f new file mode 100755 index 0000000..8ac7d8c Binary files /dev/null and b/.git_disabled/objects/24/850fffb0d2258db794e8730bb527054604009f differ diff --git a/.git_disabled/objects/24/b29e245b4ea82557c3407b9307eaaf1d4f4e2a b/.git_disabled/objects/24/b29e245b4ea82557c3407b9307eaaf1d4f4e2a new file mode 100755 index 0000000..ec2519c Binary files /dev/null and b/.git_disabled/objects/24/b29e245b4ea82557c3407b9307eaaf1d4f4e2a differ diff --git a/.git_disabled/objects/24/b5ec1b3847ec7544d2e5d65cf05f78e9bf6bcb b/.git_disabled/objects/24/b5ec1b3847ec7544d2e5d65cf05f78e9bf6bcb new file mode 100755 index 0000000..b3f6b60 Binary files /dev/null and b/.git_disabled/objects/24/b5ec1b3847ec7544d2e5d65cf05f78e9bf6bcb differ diff --git a/.git_disabled/objects/24/b6b28311d7fbce9b56dae93d78982c02592fa7 b/.git_disabled/objects/24/b6b28311d7fbce9b56dae93d78982c02592fa7 new file mode 100755 index 0000000..c50b59d Binary files /dev/null and b/.git_disabled/objects/24/b6b28311d7fbce9b56dae93d78982c02592fa7 differ diff --git a/.git_disabled/objects/24/b913f51495df07116f2dcb6815031e89202955 b/.git_disabled/objects/24/b913f51495df07116f2dcb6815031e89202955 new file mode 100755 index 0000000..0db68fa --- /dev/null +++ b/.git_disabled/objects/24/b913f51495df07116f2dcb6815031e89202955 @@ -0,0 +1,2 @@ +x;0=2yE!Ch6N`F4@f7UrY2j~Gޯ#,٩K|;|gVjD͙LM;%|}e3 \ No newline at end of file diff --git a/.git_disabled/objects/24/d179f9f26aa77a6fa62cdcf27a38a146a5eac2 b/.git_disabled/objects/24/d179f9f26aa77a6fa62cdcf27a38a146a5eac2 new file mode 100755 index 0000000..0a4d6f2 Binary files /dev/null and b/.git_disabled/objects/24/d179f9f26aa77a6fa62cdcf27a38a146a5eac2 differ diff --git a/.git_disabled/objects/24/d35fe0c1761f4ff65e3df8589e96bf89a0d19c b/.git_disabled/objects/24/d35fe0c1761f4ff65e3df8589e96bf89a0d19c new file mode 100755 index 0000000..833e146 Binary files /dev/null and b/.git_disabled/objects/24/d35fe0c1761f4ff65e3df8589e96bf89a0d19c differ diff --git a/.git_disabled/objects/24/d9562aec5bee0ddf2868ddb95cef80e9583a97 b/.git_disabled/objects/24/d9562aec5bee0ddf2868ddb95cef80e9583a97 new file mode 100755 index 0000000..7da5a79 Binary files /dev/null and b/.git_disabled/objects/24/d9562aec5bee0ddf2868ddb95cef80e9583a97 differ diff --git a/.git_disabled/objects/24/ee4d69362130a81fc9b081088fa51daf116568 b/.git_disabled/objects/24/ee4d69362130a81fc9b081088fa51daf116568 new file mode 100755 index 0000000..a0d9fee Binary files /dev/null and b/.git_disabled/objects/24/ee4d69362130a81fc9b081088fa51daf116568 differ diff --git a/.git_disabled/objects/24/f44f9e499e1a0dd2cc981c60863d8e71f54819 b/.git_disabled/objects/24/f44f9e499e1a0dd2cc981c60863d8e71f54819 new file mode 100755 index 0000000..26ce79d Binary files /dev/null and b/.git_disabled/objects/24/f44f9e499e1a0dd2cc981c60863d8e71f54819 differ diff --git a/.git_disabled/objects/25/0b6958ba661152f77c0f9952a701974cdc2382 b/.git_disabled/objects/25/0b6958ba661152f77c0f9952a701974cdc2382 new file mode 100755 index 0000000..705fac3 Binary files /dev/null and b/.git_disabled/objects/25/0b6958ba661152f77c0f9952a701974cdc2382 differ diff --git a/.git_disabled/objects/25/0c5ff97c66de187604a93c0c504181ac057566 b/.git_disabled/objects/25/0c5ff97c66de187604a93c0c504181ac057566 new file mode 100755 index 0000000..a32335e Binary files /dev/null and b/.git_disabled/objects/25/0c5ff97c66de187604a93c0c504181ac057566 differ diff --git a/.git_disabled/objects/25/1186ec6acf24092b150cf2c2e06c4da504c90c b/.git_disabled/objects/25/1186ec6acf24092b150cf2c2e06c4da504c90c new file mode 100755 index 0000000..4654dbc Binary files /dev/null and b/.git_disabled/objects/25/1186ec6acf24092b150cf2c2e06c4da504c90c differ diff --git a/.git_disabled/objects/25/2891d38d54b39e619fc14e49b878fa309a83a0 b/.git_disabled/objects/25/2891d38d54b39e619fc14e49b878fa309a83a0 new file mode 100755 index 0000000..ea723af Binary files /dev/null and b/.git_disabled/objects/25/2891d38d54b39e619fc14e49b878fa309a83a0 differ diff --git a/.git_disabled/objects/25/294f3bc4e2e1eb6a0d7f358eca60358b8d3aee b/.git_disabled/objects/25/294f3bc4e2e1eb6a0d7f358eca60358b8d3aee new file mode 100755 index 0000000..bfd6379 Binary files /dev/null and b/.git_disabled/objects/25/294f3bc4e2e1eb6a0d7f358eca60358b8d3aee differ diff --git a/.git_disabled/objects/25/2e81780c6be7b46254ab862f6770c7c0e2aeaa b/.git_disabled/objects/25/2e81780c6be7b46254ab862f6770c7c0e2aeaa new file mode 100755 index 0000000..94fa524 Binary files /dev/null and b/.git_disabled/objects/25/2e81780c6be7b46254ab862f6770c7c0e2aeaa differ diff --git a/.git_disabled/objects/25/504516d62c3ce795d7848eff2c0a6c7504a50e b/.git_disabled/objects/25/504516d62c3ce795d7848eff2c0a6c7504a50e new file mode 100755 index 0000000..45d18dd Binary files /dev/null and b/.git_disabled/objects/25/504516d62c3ce795d7848eff2c0a6c7504a50e differ diff --git a/.git_disabled/objects/25/63b4048b72bdaa358e38e1f47707315f2fe866 b/.git_disabled/objects/25/63b4048b72bdaa358e38e1f47707315f2fe866 new file mode 100755 index 0000000..9d13657 Binary files /dev/null and b/.git_disabled/objects/25/63b4048b72bdaa358e38e1f47707315f2fe866 differ diff --git a/.git_disabled/objects/25/6ba90cd91190a6c980bd44663dc51c201c14d3 b/.git_disabled/objects/25/6ba90cd91190a6c980bd44663dc51c201c14d3 new file mode 100755 index 0000000..529464a Binary files /dev/null and b/.git_disabled/objects/25/6ba90cd91190a6c980bd44663dc51c201c14d3 differ diff --git a/.git_disabled/objects/25/809c623a4220f221b6ff62affe4fb0ca746927 b/.git_disabled/objects/25/809c623a4220f221b6ff62affe4fb0ca746927 new file mode 100755 index 0000000..7f0683d --- /dev/null +++ b/.git_disabled/objects/25/809c623a4220f221b6ff62affe4fb0ca746927 @@ -0,0 +1 @@ +xuQJ1u=_q *&mm\XaAQL:IZlOpم+L[DPH9!{ 5H' Z?$&E'D)yۨS<͂a$/X&| S7[, ›$S3˱͈X sKDHfYn%Q$ N_g z{v5!E 0˜QȋeOXb,ؽU)J(|&Shs8mPĹd*4wYCC5"bшXhWǯOe&{̹;JA"__t=+ә+IҌ%&d$-]5^ǵZ \ No newline at end of file diff --git a/.git_disabled/objects/25/82db1817e7a2c526559f7c940a83221b38ea37 b/.git_disabled/objects/25/82db1817e7a2c526559f7c940a83221b38ea37 new file mode 100755 index 0000000..128fd49 Binary files /dev/null and b/.git_disabled/objects/25/82db1817e7a2c526559f7c940a83221b38ea37 differ diff --git a/.git_disabled/objects/25/9a425839a7fcbc2464ed1fb22ac169cf331c7b b/.git_disabled/objects/25/9a425839a7fcbc2464ed1fb22ac169cf331c7b new file mode 100755 index 0000000..948dfba Binary files /dev/null and b/.git_disabled/objects/25/9a425839a7fcbc2464ed1fb22ac169cf331c7b differ diff --git a/.git_disabled/objects/25/a77ed560b778cb4e456d3423789a3f0f5e85cc b/.git_disabled/objects/25/a77ed560b778cb4e456d3423789a3f0f5e85cc new file mode 100755 index 0000000..7cf0d31 Binary files /dev/null and b/.git_disabled/objects/25/a77ed560b778cb4e456d3423789a3f0f5e85cc differ diff --git a/.git_disabled/objects/25/bc254643e9d0a7882d028a7ab11bffd3411726 b/.git_disabled/objects/25/bc254643e9d0a7882d028a7ab11bffd3411726 new file mode 100755 index 0000000..6923b8a Binary files /dev/null and b/.git_disabled/objects/25/bc254643e9d0a7882d028a7ab11bffd3411726 differ diff --git a/.git_disabled/objects/25/c74f19c4ffabec90148489722375f807ca19df b/.git_disabled/objects/25/c74f19c4ffabec90148489722375f807ca19df new file mode 100755 index 0000000..6afb7ba Binary files /dev/null and b/.git_disabled/objects/25/c74f19c4ffabec90148489722375f807ca19df differ diff --git a/.git_disabled/objects/25/d6c3ced6d35ea392cb11c0705be5ea8b7a8d4c b/.git_disabled/objects/25/d6c3ced6d35ea392cb11c0705be5ea8b7a8d4c new file mode 100755 index 0000000..0e41c0d Binary files /dev/null and b/.git_disabled/objects/25/d6c3ced6d35ea392cb11c0705be5ea8b7a8d4c differ diff --git a/.git_disabled/objects/25/e17d497a990cb2e7a974af3264eab8dfb8c5b9 b/.git_disabled/objects/25/e17d497a990cb2e7a974af3264eab8dfb8c5b9 new file mode 100755 index 0000000..65e819b Binary files /dev/null and b/.git_disabled/objects/25/e17d497a990cb2e7a974af3264eab8dfb8c5b9 differ diff --git a/.git_disabled/objects/25/e825d19b5726be3a99363c0b46000688f5dc5e b/.git_disabled/objects/25/e825d19b5726be3a99363c0b46000688f5dc5e new file mode 100755 index 0000000..4aa97d7 Binary files /dev/null and b/.git_disabled/objects/25/e825d19b5726be3a99363c0b46000688f5dc5e differ diff --git a/.git_disabled/objects/26/0039ee18153cc52d43f65fc09b1607639e7618 b/.git_disabled/objects/26/0039ee18153cc52d43f65fc09b1607639e7618 new file mode 100755 index 0000000..84f2aab Binary files /dev/null and b/.git_disabled/objects/26/0039ee18153cc52d43f65fc09b1607639e7618 differ diff --git a/.git_disabled/objects/26/0051f9558a0f8e9c06257ab316a5e69c615216 b/.git_disabled/objects/26/0051f9558a0f8e9c06257ab316a5e69c615216 new file mode 100755 index 0000000..1b507e2 Binary files /dev/null and b/.git_disabled/objects/26/0051f9558a0f8e9c06257ab316a5e69c615216 differ diff --git a/.git_disabled/objects/26/150a857cde367a38504ae38d159f6b2f98cc6d b/.git_disabled/objects/26/150a857cde367a38504ae38d159f6b2f98cc6d new file mode 100755 index 0000000..74833a9 Binary files /dev/null and b/.git_disabled/objects/26/150a857cde367a38504ae38d159f6b2f98cc6d differ diff --git a/.git_disabled/objects/26/20ed8f03740369ee46f56b1c56b852a7ab7e54 b/.git_disabled/objects/26/20ed8f03740369ee46f56b1c56b852a7ab7e54 new file mode 100755 index 0000000..04a3d91 Binary files /dev/null and b/.git_disabled/objects/26/20ed8f03740369ee46f56b1c56b852a7ab7e54 differ diff --git a/.git_disabled/objects/26/3924ef06048b885db91e840005a34f97cc72d6 b/.git_disabled/objects/26/3924ef06048b885db91e840005a34f97cc72d6 new file mode 100755 index 0000000..d1d5438 Binary files /dev/null and b/.git_disabled/objects/26/3924ef06048b885db91e840005a34f97cc72d6 differ diff --git a/.git_disabled/objects/26/45e61e6651a3eabb68052a2529c75e2f83937e b/.git_disabled/objects/26/45e61e6651a3eabb68052a2529c75e2f83937e new file mode 100755 index 0000000..bc313fe Binary files /dev/null and b/.git_disabled/objects/26/45e61e6651a3eabb68052a2529c75e2f83937e differ diff --git a/.git_disabled/objects/26/463a858933f30f5e22d524a81795bca70f7103 b/.git_disabled/objects/26/463a858933f30f5e22d524a81795bca70f7103 new file mode 100755 index 0000000..652ea33 Binary files /dev/null and b/.git_disabled/objects/26/463a858933f30f5e22d524a81795bca70f7103 differ diff --git a/.git_disabled/objects/26/4d86147840ed583e3f6816fab3d47b58d814cc b/.git_disabled/objects/26/4d86147840ed583e3f6816fab3d47b58d814cc new file mode 100755 index 0000000..9e3c2e3 Binary files /dev/null and b/.git_disabled/objects/26/4d86147840ed583e3f6816fab3d47b58d814cc differ diff --git a/.git_disabled/objects/26/5415ea3e251ed68c5e87cf316265c5da5c4709 b/.git_disabled/objects/26/5415ea3e251ed68c5e87cf316265c5da5c4709 new file mode 100755 index 0000000..2575822 Binary files /dev/null and b/.git_disabled/objects/26/5415ea3e251ed68c5e87cf316265c5da5c4709 differ diff --git a/.git_disabled/objects/26/7454e700042cafb640d24a76efe0b5eb9c188f b/.git_disabled/objects/26/7454e700042cafb640d24a76efe0b5eb9c188f new file mode 100755 index 0000000..c36d28e Binary files /dev/null and b/.git_disabled/objects/26/7454e700042cafb640d24a76efe0b5eb9c188f differ diff --git a/.git_disabled/objects/26/84ad76ea61fa1f8617d7539bb7b976de0ad8c5 b/.git_disabled/objects/26/84ad76ea61fa1f8617d7539bb7b976de0ad8c5 new file mode 100755 index 0000000..563a349 Binary files /dev/null and b/.git_disabled/objects/26/84ad76ea61fa1f8617d7539bb7b976de0ad8c5 differ diff --git a/.git_disabled/objects/26/87111a4a71192af7cfdea360aa3e02a9a1cce8 b/.git_disabled/objects/26/87111a4a71192af7cfdea360aa3e02a9a1cce8 new file mode 100755 index 0000000..a25a431 Binary files /dev/null and b/.git_disabled/objects/26/87111a4a71192af7cfdea360aa3e02a9a1cce8 differ diff --git a/.git_disabled/objects/26/918c9e2409549edbfef4f64a21f03bd78b828a b/.git_disabled/objects/26/918c9e2409549edbfef4f64a21f03bd78b828a new file mode 100755 index 0000000..7307657 Binary files /dev/null and b/.git_disabled/objects/26/918c9e2409549edbfef4f64a21f03bd78b828a differ diff --git a/.git_disabled/objects/26/a5a89c9855b41c5e6205c0eaf3e65cd4390230 b/.git_disabled/objects/26/a5a89c9855b41c5e6205c0eaf3e65cd4390230 new file mode 100755 index 0000000..76939ba Binary files /dev/null and b/.git_disabled/objects/26/a5a89c9855b41c5e6205c0eaf3e65cd4390230 differ diff --git a/.git_disabled/objects/26/a83cca8363a4c227167a78e3711401e6133978 b/.git_disabled/objects/26/a83cca8363a4c227167a78e3711401e6133978 new file mode 100755 index 0000000..4e7c343 Binary files /dev/null and b/.git_disabled/objects/26/a83cca8363a4c227167a78e3711401e6133978 differ diff --git a/.git_disabled/objects/26/b8f73205d21e40d9db25b35da255df8725be62 b/.git_disabled/objects/26/b8f73205d21e40d9db25b35da255df8725be62 new file mode 100755 index 0000000..b632e44 Binary files /dev/null and b/.git_disabled/objects/26/b8f73205d21e40d9db25b35da255df8725be62 differ diff --git a/.git_disabled/objects/26/bc6abe065c8c97d12653fa07e9e451888fef15 b/.git_disabled/objects/26/bc6abe065c8c97d12653fa07e9e451888fef15 new file mode 100755 index 0000000..e665a2d Binary files /dev/null and b/.git_disabled/objects/26/bc6abe065c8c97d12653fa07e9e451888fef15 differ diff --git a/.git_disabled/objects/26/d3b75e6530386439a3262834167efefa3888bc b/.git_disabled/objects/26/d3b75e6530386439a3262834167efefa3888bc new file mode 100755 index 0000000..db40b80 Binary files /dev/null and b/.git_disabled/objects/26/d3b75e6530386439a3262834167efefa3888bc differ diff --git a/.git_disabled/objects/26/d8750bf073f03329622d479fa3161033c59775 b/.git_disabled/objects/26/d8750bf073f03329622d479fa3161033c59775 new file mode 100755 index 0000000..925291e Binary files /dev/null and b/.git_disabled/objects/26/d8750bf073f03329622d479fa3161033c59775 differ diff --git a/.git_disabled/objects/26/f3e4b38c0a6140de117df536a1c454e56b331d b/.git_disabled/objects/26/f3e4b38c0a6140de117df536a1c454e56b331d new file mode 100755 index 0000000..50dc9cf Binary files /dev/null and b/.git_disabled/objects/26/f3e4b38c0a6140de117df536a1c454e56b331d differ diff --git a/.git_disabled/objects/26/fc84d0983b07c951e12f094b12224f66ecca31 b/.git_disabled/objects/26/fc84d0983b07c951e12f094b12224f66ecca31 new file mode 100755 index 0000000..63dfd72 Binary files /dev/null and b/.git_disabled/objects/26/fc84d0983b07c951e12f094b12224f66ecca31 differ diff --git a/.git_disabled/objects/27/197d9883cedc59bdc261fc586963379bfed757 b/.git_disabled/objects/27/197d9883cedc59bdc261fc586963379bfed757 new file mode 100755 index 0000000..c27e852 Binary files /dev/null and b/.git_disabled/objects/27/197d9883cedc59bdc261fc586963379bfed757 differ diff --git a/.git_disabled/objects/27/1eff722f0f17c34a38337cd1d568c83f5d42a1 b/.git_disabled/objects/27/1eff722f0f17c34a38337cd1d568c83f5d42a1 new file mode 100755 index 0000000..c534c26 Binary files /dev/null and b/.git_disabled/objects/27/1eff722f0f17c34a38337cd1d568c83f5d42a1 differ diff --git a/.git_disabled/objects/27/1f80b79534cce63e4c4b3d10e74d0355cf66b9 b/.git_disabled/objects/27/1f80b79534cce63e4c4b3d10e74d0355cf66b9 new file mode 100755 index 0000000..12da0ad Binary files /dev/null and b/.git_disabled/objects/27/1f80b79534cce63e4c4b3d10e74d0355cf66b9 differ diff --git a/.git_disabled/objects/27/3dad5a6c5ad3d166bd7d248972d29133bb4c59 b/.git_disabled/objects/27/3dad5a6c5ad3d166bd7d248972d29133bb4c59 new file mode 100755 index 0000000..3cc5d74 Binary files /dev/null and b/.git_disabled/objects/27/3dad5a6c5ad3d166bd7d248972d29133bb4c59 differ diff --git a/.git_disabled/objects/27/42d464d2ada657d81cff1a8e46f2fa76113d0b b/.git_disabled/objects/27/42d464d2ada657d81cff1a8e46f2fa76113d0b new file mode 100755 index 0000000..77b8c00 Binary files /dev/null and b/.git_disabled/objects/27/42d464d2ada657d81cff1a8e46f2fa76113d0b differ diff --git a/.git_disabled/objects/27/4ca84fee2a4b1485852c4f031c614d3e94a01c b/.git_disabled/objects/27/4ca84fee2a4b1485852c4f031c614d3e94a01c new file mode 100755 index 0000000..9e28dda Binary files /dev/null and b/.git_disabled/objects/27/4ca84fee2a4b1485852c4f031c614d3e94a01c differ diff --git a/.git_disabled/objects/27/51bcf938a6e75da0fa9947c331d6fececc42e6 b/.git_disabled/objects/27/51bcf938a6e75da0fa9947c331d6fececc42e6 new file mode 100755 index 0000000..62e3838 Binary files /dev/null and b/.git_disabled/objects/27/51bcf938a6e75da0fa9947c331d6fececc42e6 differ diff --git a/.git_disabled/objects/27/54663252494d94315d74c1901a76185921f085 b/.git_disabled/objects/27/54663252494d94315d74c1901a76185921f085 new file mode 100755 index 0000000..4e9899c Binary files /dev/null and b/.git_disabled/objects/27/54663252494d94315d74c1901a76185921f085 differ diff --git a/.git_disabled/objects/27/56400734ca6b13cbaf66fae25581123126632a b/.git_disabled/objects/27/56400734ca6b13cbaf66fae25581123126632a new file mode 100755 index 0000000..84953d1 Binary files /dev/null and b/.git_disabled/objects/27/56400734ca6b13cbaf66fae25581123126632a differ diff --git a/.git_disabled/objects/27/62944d2e4ad8510ff19f1c70ebdc4fc0a6dabe b/.git_disabled/objects/27/62944d2e4ad8510ff19f1c70ebdc4fc0a6dabe new file mode 100755 index 0000000..2f7e84c Binary files /dev/null and b/.git_disabled/objects/27/62944d2e4ad8510ff19f1c70ebdc4fc0a6dabe differ diff --git a/.git_disabled/objects/27/6428516769d1aea5035500f1e74373b376cd12 b/.git_disabled/objects/27/6428516769d1aea5035500f1e74373b376cd12 new file mode 100755 index 0000000..d3d921f Binary files /dev/null and b/.git_disabled/objects/27/6428516769d1aea5035500f1e74373b376cd12 differ diff --git a/.git_disabled/objects/27/77d6ced5b830226164451da1ab62b21006b8ea b/.git_disabled/objects/27/77d6ced5b830226164451da1ab62b21006b8ea new file mode 100755 index 0000000..4683dde Binary files /dev/null and b/.git_disabled/objects/27/77d6ced5b830226164451da1ab62b21006b8ea differ diff --git a/.git_disabled/objects/27/7aaa3a532e8d76be18886e6c684d1552809312 b/.git_disabled/objects/27/7aaa3a532e8d76be18886e6c684d1552809312 new file mode 100755 index 0000000..00f9f5b Binary files /dev/null and b/.git_disabled/objects/27/7aaa3a532e8d76be18886e6c684d1552809312 differ diff --git a/.git_disabled/objects/27/823c31c7e94cf538e756225ce4ad21f8cc88c5 b/.git_disabled/objects/27/823c31c7e94cf538e756225ce4ad21f8cc88c5 new file mode 100755 index 0000000..4e3cdee Binary files /dev/null and b/.git_disabled/objects/27/823c31c7e94cf538e756225ce4ad21f8cc88c5 differ diff --git a/.git_disabled/objects/27/9322b1ff5c770003e78230bdf947629d8f114d b/.git_disabled/objects/27/9322b1ff5c770003e78230bdf947629d8f114d new file mode 100755 index 0000000..1d840be Binary files /dev/null and b/.git_disabled/objects/27/9322b1ff5c770003e78230bdf947629d8f114d differ diff --git a/.git_disabled/objects/27/9ff5ef1378f3744c02493de03209bfad1d6b7c b/.git_disabled/objects/27/9ff5ef1378f3744c02493de03209bfad1d6b7c new file mode 100755 index 0000000..6b7ec21 Binary files /dev/null and b/.git_disabled/objects/27/9ff5ef1378f3744c02493de03209bfad1d6b7c differ diff --git a/.git_disabled/objects/27/aa7cd2bd9a15af5eb6e0b25f6941a878e39537 b/.git_disabled/objects/27/aa7cd2bd9a15af5eb6e0b25f6941a878e39537 new file mode 100755 index 0000000..fcc8d51 Binary files /dev/null and b/.git_disabled/objects/27/aa7cd2bd9a15af5eb6e0b25f6941a878e39537 differ diff --git a/.git_disabled/objects/27/aea2958c7b9feca1d84b9e55ace41955dbcc6a b/.git_disabled/objects/27/aea2958c7b9feca1d84b9e55ace41955dbcc6a new file mode 100755 index 0000000..477ea04 Binary files /dev/null and b/.git_disabled/objects/27/aea2958c7b9feca1d84b9e55ace41955dbcc6a differ diff --git a/.git_disabled/objects/27/b46d4ab91287ff5c2cd45c1e1e996fe7508774 b/.git_disabled/objects/27/b46d4ab91287ff5c2cd45c1e1e996fe7508774 new file mode 100755 index 0000000..9d22378 --- /dev/null +++ b/.git_disabled/objects/27/b46d4ab91287ff5c2cd45c1e1e996fe7508774 @@ -0,0 +1 @@ +xUn09_@z!R@zSPSÇ/eG $@.++Hy)KUQCZ4#r,2xjCeVhUvC1/ !LR}'Ͷ0.IͨmC Ls,=gƯl2\;mhq|^*r8d |6/=u ?9OgP}QTN0Bc~G`C)c|8{܇{&Z=\|֑c_H.o"mn'j&P,ʛvB< ~2HtXܷQd>4&9IYZN~lc؛c:+֜ݤm_8hjV)H["ͯV(*#:8~GrX reIJXΒ-~ f(Bؔ-捐Ԃe"^v5TJ PJZ{Olu|8{ yG \ No newline at end of file diff --git a/.git_disabled/objects/27/b9bf469a9a15ce2d33cfeae1c87afb4d24f541 b/.git_disabled/objects/27/b9bf469a9a15ce2d33cfeae1c87afb4d24f541 new file mode 100755 index 0000000..cb9e7f5 Binary files /dev/null and b/.git_disabled/objects/27/b9bf469a9a15ce2d33cfeae1c87afb4d24f541 differ diff --git a/.git_disabled/objects/27/bc2099752c2f1c98afc256ef5836b7bdc9cd1e b/.git_disabled/objects/27/bc2099752c2f1c98afc256ef5836b7bdc9cd1e new file mode 100755 index 0000000..6d842cf Binary files /dev/null and b/.git_disabled/objects/27/bc2099752c2f1c98afc256ef5836b7bdc9cd1e differ diff --git a/.git_disabled/objects/27/cea4f203ffd1ec13cd706b1de48c295160cb90 b/.git_disabled/objects/27/cea4f203ffd1ec13cd706b1de48c295160cb90 new file mode 100755 index 0000000..101ea10 Binary files /dev/null and b/.git_disabled/objects/27/cea4f203ffd1ec13cd706b1de48c295160cb90 differ diff --git a/.git_disabled/objects/27/d5f266e327e084f966bcc25aecc635e41df977 b/.git_disabled/objects/27/d5f266e327e084f966bcc25aecc635e41df977 new file mode 100755 index 0000000..8c7f639 Binary files /dev/null and b/.git_disabled/objects/27/d5f266e327e084f966bcc25aecc635e41df977 differ diff --git a/.git_disabled/objects/27/d9530eab5d781e5f20f904e25f94ba9642eb49 b/.git_disabled/objects/27/d9530eab5d781e5f20f904e25f94ba9642eb49 new file mode 100755 index 0000000..84dca8e Binary files /dev/null and b/.git_disabled/objects/27/d9530eab5d781e5f20f904e25f94ba9642eb49 differ diff --git a/.git_disabled/objects/27/db3c0faa5be1d963ef3bb39f1bf43cbaf6da26 b/.git_disabled/objects/27/db3c0faa5be1d963ef3bb39f1bf43cbaf6da26 new file mode 100755 index 0000000..ef68b5b Binary files /dev/null and b/.git_disabled/objects/27/db3c0faa5be1d963ef3bb39f1bf43cbaf6da26 differ diff --git a/.git_disabled/objects/27/e1a9b6e2342f9b5f57852661dbdb8746c60f14 b/.git_disabled/objects/27/e1a9b6e2342f9b5f57852661dbdb8746c60f14 new file mode 100755 index 0000000..57cc732 Binary files /dev/null and b/.git_disabled/objects/27/e1a9b6e2342f9b5f57852661dbdb8746c60f14 differ diff --git a/.git_disabled/objects/27/e6e6853dae1aaa0a01e7cbcc6e5135386fbf1e b/.git_disabled/objects/27/e6e6853dae1aaa0a01e7cbcc6e5135386fbf1e new file mode 100755 index 0000000..0b28fc8 Binary files /dev/null and b/.git_disabled/objects/27/e6e6853dae1aaa0a01e7cbcc6e5135386fbf1e differ diff --git a/.git_disabled/objects/27/ef3c34aa96722c7c17d0f83e315b9203c575df b/.git_disabled/objects/27/ef3c34aa96722c7c17d0f83e315b9203c575df new file mode 100755 index 0000000..3920095 Binary files /dev/null and b/.git_disabled/objects/27/ef3c34aa96722c7c17d0f83e315b9203c575df differ diff --git a/.git_disabled/objects/27/f3a78680176df725473ea23479071c8143d356 b/.git_disabled/objects/27/f3a78680176df725473ea23479071c8143d356 new file mode 100755 index 0000000..9373bb8 Binary files /dev/null and b/.git_disabled/objects/27/f3a78680176df725473ea23479071c8143d356 differ diff --git a/.git_disabled/objects/27/fd1c430109ccb336f58cf531d5f15f919abd95 b/.git_disabled/objects/27/fd1c430109ccb336f58cf531d5f15f919abd95 new file mode 100755 index 0000000..aa01f3b Binary files /dev/null and b/.git_disabled/objects/27/fd1c430109ccb336f58cf531d5f15f919abd95 differ diff --git a/.git_disabled/objects/28/0c7abaf984034b51e8faa7ab00f4f89208ffdc b/.git_disabled/objects/28/0c7abaf984034b51e8faa7ab00f4f89208ffdc new file mode 100755 index 0000000..430318a Binary files /dev/null and b/.git_disabled/objects/28/0c7abaf984034b51e8faa7ab00f4f89208ffdc differ diff --git a/.git_disabled/objects/28/10b20af1642a8a7a6e7012c51d379d7970ab0f b/.git_disabled/objects/28/10b20af1642a8a7a6e7012c51d379d7970ab0f new file mode 100755 index 0000000..c0c6089 Binary files /dev/null and b/.git_disabled/objects/28/10b20af1642a8a7a6e7012c51d379d7970ab0f differ diff --git a/.git_disabled/objects/28/1252c23494a945a5f01e16cfd3c4e5a6246ad8 b/.git_disabled/objects/28/1252c23494a945a5f01e16cfd3c4e5a6246ad8 new file mode 100755 index 0000000..2f409c3 Binary files /dev/null and b/.git_disabled/objects/28/1252c23494a945a5f01e16cfd3c4e5a6246ad8 differ diff --git a/.git_disabled/objects/28/1bfcbcb0681bbdabca6c6c0211d49479dc9496 b/.git_disabled/objects/28/1bfcbcb0681bbdabca6c6c0211d49479dc9496 new file mode 100755 index 0000000..4411b7e Binary files /dev/null and b/.git_disabled/objects/28/1bfcbcb0681bbdabca6c6c0211d49479dc9496 differ diff --git a/.git_disabled/objects/28/1fe04ab72b2a22552024a8bd7e06a9a8817274 b/.git_disabled/objects/28/1fe04ab72b2a22552024a8bd7e06a9a8817274 new file mode 100755 index 0000000..a87632a Binary files /dev/null and b/.git_disabled/objects/28/1fe04ab72b2a22552024a8bd7e06a9a8817274 differ diff --git a/.git_disabled/objects/28/4576b2e4d1ed1c8cf570895120d8222f6e8fdd b/.git_disabled/objects/28/4576b2e4d1ed1c8cf570895120d8222f6e8fdd new file mode 100755 index 0000000..5934cc5 Binary files /dev/null and b/.git_disabled/objects/28/4576b2e4d1ed1c8cf570895120d8222f6e8fdd differ diff --git a/.git_disabled/objects/28/470ba21c39240811e1e90e1ddddd16adb5628a b/.git_disabled/objects/28/470ba21c39240811e1e90e1ddddd16adb5628a new file mode 100755 index 0000000..1472f7d Binary files /dev/null and b/.git_disabled/objects/28/470ba21c39240811e1e90e1ddddd16adb5628a differ diff --git a/.git_disabled/objects/28/5064cd49b118ec35af762c07fdb9a6f648d918 b/.git_disabled/objects/28/5064cd49b118ec35af762c07fdb9a6f648d918 new file mode 100755 index 0000000..c4b620c Binary files /dev/null and b/.git_disabled/objects/28/5064cd49b118ec35af762c07fdb9a6f648d918 differ diff --git a/.git_disabled/objects/28/947ec6e5e602abb535b76b1fbfb8e7ccc80dc8 b/.git_disabled/objects/28/947ec6e5e602abb535b76b1fbfb8e7ccc80dc8 new file mode 100755 index 0000000..02c25d0 Binary files /dev/null and b/.git_disabled/objects/28/947ec6e5e602abb535b76b1fbfb8e7ccc80dc8 differ diff --git a/.git_disabled/objects/28/a18340074a7e1d85a4a6d4e7a51e52e43d3ea6 b/.git_disabled/objects/28/a18340074a7e1d85a4a6d4e7a51e52e43d3ea6 new file mode 100755 index 0000000..699f3ae Binary files /dev/null and b/.git_disabled/objects/28/a18340074a7e1d85a4a6d4e7a51e52e43d3ea6 differ diff --git a/.git_disabled/objects/28/a4e994b4d5bc208fd5275f0ec7e90ccfa4f07b b/.git_disabled/objects/28/a4e994b4d5bc208fd5275f0ec7e90ccfa4f07b new file mode 100755 index 0000000..1d20deb Binary files /dev/null and b/.git_disabled/objects/28/a4e994b4d5bc208fd5275f0ec7e90ccfa4f07b differ diff --git a/.git_disabled/objects/28/b1efbadb8359b153242d51add51bf262df0d61 b/.git_disabled/objects/28/b1efbadb8359b153242d51add51bf262df0d61 new file mode 100755 index 0000000..f23c3a2 Binary files /dev/null and b/.git_disabled/objects/28/b1efbadb8359b153242d51add51bf262df0d61 differ diff --git a/.git_disabled/objects/28/b87b2242822aa8f535b13b98541f5501136187 b/.git_disabled/objects/28/b87b2242822aa8f535b13b98541f5501136187 new file mode 100755 index 0000000..28c1c23 Binary files /dev/null and b/.git_disabled/objects/28/b87b2242822aa8f535b13b98541f5501136187 differ diff --git a/.git_disabled/objects/28/ba4575b8b8c1a423b4668a85791e62d08b1d35 b/.git_disabled/objects/28/ba4575b8b8c1a423b4668a85791e62d08b1d35 new file mode 100755 index 0000000..4014913 Binary files /dev/null and b/.git_disabled/objects/28/ba4575b8b8c1a423b4668a85791e62d08b1d35 differ diff --git a/.git_disabled/objects/28/ee832559b8a12d16119c53f6b7c3ace8838f99 b/.git_disabled/objects/28/ee832559b8a12d16119c53f6b7c3ace8838f99 new file mode 100755 index 0000000..7bc321c Binary files /dev/null and b/.git_disabled/objects/28/ee832559b8a12d16119c53f6b7c3ace8838f99 differ diff --git a/.git_disabled/objects/28/f2c109ecd4fa7c89642846615e62e96655307d b/.git_disabled/objects/28/f2c109ecd4fa7c89642846615e62e96655307d new file mode 100755 index 0000000..c44b8a5 Binary files /dev/null and b/.git_disabled/objects/28/f2c109ecd4fa7c89642846615e62e96655307d differ diff --git a/.git_disabled/objects/29/0b8c10923ffa7c827bb457e6b304e46b91a02f b/.git_disabled/objects/29/0b8c10923ffa7c827bb457e6b304e46b91a02f new file mode 100755 index 0000000..a369d84 Binary files /dev/null and b/.git_disabled/objects/29/0b8c10923ffa7c827bb457e6b304e46b91a02f differ diff --git a/.git_disabled/objects/29/16af2a26bf9cfe9351bca5d5f31496b74bcdbb b/.git_disabled/objects/29/16af2a26bf9cfe9351bca5d5f31496b74bcdbb new file mode 100755 index 0000000..1ab9fa6 Binary files /dev/null and b/.git_disabled/objects/29/16af2a26bf9cfe9351bca5d5f31496b74bcdbb differ diff --git a/.git_disabled/objects/29/3367c23fd6391e3eb53add186aa32bf4d974d9 b/.git_disabled/objects/29/3367c23fd6391e3eb53add186aa32bf4d974d9 new file mode 100755 index 0000000..5eec181 Binary files /dev/null and b/.git_disabled/objects/29/3367c23fd6391e3eb53add186aa32bf4d974d9 differ diff --git a/.git_disabled/objects/29/3c6025750c57b7541d99a87e565c8adb80fba4 b/.git_disabled/objects/29/3c6025750c57b7541d99a87e565c8adb80fba4 new file mode 100755 index 0000000..4aa2436 Binary files /dev/null and b/.git_disabled/objects/29/3c6025750c57b7541d99a87e565c8adb80fba4 differ diff --git a/.git_disabled/objects/29/4a4096743c575bca1939fd4c77a8d4a26bcd1e b/.git_disabled/objects/29/4a4096743c575bca1939fd4c77a8d4a26bcd1e new file mode 100755 index 0000000..eac6d75 Binary files /dev/null and b/.git_disabled/objects/29/4a4096743c575bca1939fd4c77a8d4a26bcd1e differ diff --git a/.git_disabled/objects/29/4f8a2cf8c7f28cd8e32d65aad77d78eaa86d44 b/.git_disabled/objects/29/4f8a2cf8c7f28cd8e32d65aad77d78eaa86d44 new file mode 100755 index 0000000..19fd18c Binary files /dev/null and b/.git_disabled/objects/29/4f8a2cf8c7f28cd8e32d65aad77d78eaa86d44 differ diff --git a/.git_disabled/objects/29/52a138a4c596037551a0a743a0e3362b75a770 b/.git_disabled/objects/29/52a138a4c596037551a0a743a0e3362b75a770 new file mode 100755 index 0000000..8684900 Binary files /dev/null and b/.git_disabled/objects/29/52a138a4c596037551a0a743a0e3362b75a770 differ diff --git a/.git_disabled/objects/29/6cd250459f3848bb333301fff1ac32973f219a b/.git_disabled/objects/29/6cd250459f3848bb333301fff1ac32973f219a new file mode 100755 index 0000000..604fe08 Binary files /dev/null and b/.git_disabled/objects/29/6cd250459f3848bb333301fff1ac32973f219a differ diff --git a/.git_disabled/objects/29/8bbc6bd8c0f6ed850ed1ba3beba652e08eedbb b/.git_disabled/objects/29/8bbc6bd8c0f6ed850ed1ba3beba652e08eedbb new file mode 100755 index 0000000..6b56b32 Binary files /dev/null and b/.git_disabled/objects/29/8bbc6bd8c0f6ed850ed1ba3beba652e08eedbb differ diff --git a/.git_disabled/objects/29/90da9247c298840ed6a221dddd9e3a365bb50e b/.git_disabled/objects/29/90da9247c298840ed6a221dddd9e3a365bb50e new file mode 100755 index 0000000..a360d06 Binary files /dev/null and b/.git_disabled/objects/29/90da9247c298840ed6a221dddd9e3a365bb50e differ diff --git a/.git_disabled/objects/29/96ab76670991564ea0322d5eab554ec87c62df b/.git_disabled/objects/29/96ab76670991564ea0322d5eab554ec87c62df new file mode 100755 index 0000000..ae959de Binary files /dev/null and b/.git_disabled/objects/29/96ab76670991564ea0322d5eab554ec87c62df differ diff --git a/.git_disabled/objects/29/a6377dc219a7d8a57396e45c175f06e2c40efb b/.git_disabled/objects/29/a6377dc219a7d8a57396e45c175f06e2c40efb new file mode 100755 index 0000000..a1ab4e1 Binary files /dev/null and b/.git_disabled/objects/29/a6377dc219a7d8a57396e45c175f06e2c40efb differ diff --git a/.git_disabled/objects/29/b0d89fe18249b8658d0d7445419eaf205ee675 b/.git_disabled/objects/29/b0d89fe18249b8658d0d7445419eaf205ee675 new file mode 100755 index 0000000..60f9fc6 Binary files /dev/null and b/.git_disabled/objects/29/b0d89fe18249b8658d0d7445419eaf205ee675 differ diff --git a/.git_disabled/objects/29/ca40176ceae5ad1ccfa091e504ac860559d042 b/.git_disabled/objects/29/ca40176ceae5ad1ccfa091e504ac860559d042 new file mode 100755 index 0000000..4884da1 Binary files /dev/null and b/.git_disabled/objects/29/ca40176ceae5ad1ccfa091e504ac860559d042 differ diff --git a/.git_disabled/objects/29/d080dccd407feaef5c4185b83f9112114f7652 b/.git_disabled/objects/29/d080dccd407feaef5c4185b83f9112114f7652 new file mode 100755 index 0000000..0b60a34 Binary files /dev/null and b/.git_disabled/objects/29/d080dccd407feaef5c4185b83f9112114f7652 differ diff --git a/.git_disabled/objects/29/d6066661c24df54c17c5cc917498e712f503b3 b/.git_disabled/objects/29/d6066661c24df54c17c5cc917498e712f503b3 new file mode 100755 index 0000000..39da1ea Binary files /dev/null and b/.git_disabled/objects/29/d6066661c24df54c17c5cc917498e712f503b3 differ diff --git a/.git_disabled/objects/29/dc429cb01d2528f229d8fe11d5653e850c4482 b/.git_disabled/objects/29/dc429cb01d2528f229d8fe11d5653e850c4482 new file mode 100755 index 0000000..99d4f4e Binary files /dev/null and b/.git_disabled/objects/29/dc429cb01d2528f229d8fe11d5653e850c4482 differ diff --git a/.git_disabled/objects/29/e3d3274996ec4ec225ed61388a58bdf4a9614c b/.git_disabled/objects/29/e3d3274996ec4ec225ed61388a58bdf4a9614c new file mode 100755 index 0000000..4f150e9 Binary files /dev/null and b/.git_disabled/objects/29/e3d3274996ec4ec225ed61388a58bdf4a9614c differ diff --git a/.git_disabled/objects/29/e629e70c01f4dd3adea6fa84fae3f8c3c4258d b/.git_disabled/objects/29/e629e70c01f4dd3adea6fa84fae3f8c3c4258d new file mode 100755 index 0000000..84c7a3d Binary files /dev/null and b/.git_disabled/objects/29/e629e70c01f4dd3adea6fa84fae3f8c3c4258d differ diff --git a/.git_disabled/objects/29/f9c225e296ab9a088318f14de35ca0496d1801 b/.git_disabled/objects/29/f9c225e296ab9a088318f14de35ca0496d1801 new file mode 100755 index 0000000..8a5ad26 Binary files /dev/null and b/.git_disabled/objects/29/f9c225e296ab9a088318f14de35ca0496d1801 differ diff --git a/.git_disabled/objects/2a/16370a5c5ae38d1555d345516bf9b060bb76d5 b/.git_disabled/objects/2a/16370a5c5ae38d1555d345516bf9b060bb76d5 new file mode 100755 index 0000000..dae4644 Binary files /dev/null and b/.git_disabled/objects/2a/16370a5c5ae38d1555d345516bf9b060bb76d5 differ diff --git a/.git_disabled/objects/2a/24543f996e0d046d63616c4c4b1849e624cbbe b/.git_disabled/objects/2a/24543f996e0d046d63616c4c4b1849e624cbbe new file mode 100755 index 0000000..53eb358 Binary files /dev/null and b/.git_disabled/objects/2a/24543f996e0d046d63616c4c4b1849e624cbbe differ diff --git a/.git_disabled/objects/2a/2e36fb24d586807fb5376bb993ec4471d57e2f b/.git_disabled/objects/2a/2e36fb24d586807fb5376bb993ec4471d57e2f new file mode 100755 index 0000000..c15c1a9 Binary files /dev/null and b/.git_disabled/objects/2a/2e36fb24d586807fb5376bb993ec4471d57e2f differ diff --git a/.git_disabled/objects/2a/39f2718e02bd3dc8eca7e89e94897570e35d1c b/.git_disabled/objects/2a/39f2718e02bd3dc8eca7e89e94897570e35d1c new file mode 100755 index 0000000..21b81b8 Binary files /dev/null and b/.git_disabled/objects/2a/39f2718e02bd3dc8eca7e89e94897570e35d1c differ diff --git a/.git_disabled/objects/2a/3c75900d2e24c4ccf3ead7d933b5cdec5ae8a8 b/.git_disabled/objects/2a/3c75900d2e24c4ccf3ead7d933b5cdec5ae8a8 new file mode 100755 index 0000000..4d71b77 Binary files /dev/null and b/.git_disabled/objects/2a/3c75900d2e24c4ccf3ead7d933b5cdec5ae8a8 differ diff --git a/.git_disabled/objects/2a/433fcecdaa8093e00af83e0472dd9baea8e21a b/.git_disabled/objects/2a/433fcecdaa8093e00af83e0472dd9baea8e21a new file mode 100755 index 0000000..f6e7c46 Binary files /dev/null and b/.git_disabled/objects/2a/433fcecdaa8093e00af83e0472dd9baea8e21a differ diff --git a/.git_disabled/objects/2a/5c6de7e6e53475835a1c738fc28be70745d2fe b/.git_disabled/objects/2a/5c6de7e6e53475835a1c738fc28be70745d2fe new file mode 100755 index 0000000..cb4189a Binary files /dev/null and b/.git_disabled/objects/2a/5c6de7e6e53475835a1c738fc28be70745d2fe differ diff --git a/.git_disabled/objects/2a/5db5f21c0dffcf3e54725d6bd142df43b69343 b/.git_disabled/objects/2a/5db5f21c0dffcf3e54725d6bd142df43b69343 new file mode 100755 index 0000000..7468407 Binary files /dev/null and b/.git_disabled/objects/2a/5db5f21c0dffcf3e54725d6bd142df43b69343 differ diff --git a/.git_disabled/objects/2a/63839f2f1c5348e4ad607709d106c8c23fff22 b/.git_disabled/objects/2a/63839f2f1c5348e4ad607709d106c8c23fff22 new file mode 100755 index 0000000..5938b03 --- /dev/null +++ b/.git_disabled/objects/2a/63839f2f1c5348e4ad607709d106c8c23fff22 @@ -0,0 +1,5 @@ +xTъ1_öP;HઠH$w:$!~O @񿼓ik]qw^iON=[Z_gO=T/!"AlQT3 +HFB-ՠae##W*{oNFLq" X3Uh*[l )>}z- U) 8= ?lC{!t:p`a> h=+,=MpO`"t҂[P=џc]$j`&KO{t!S 1@/ ׿RK;?i}H ViV{XfW`vGuΌ +*M qqWjxDi"t |kZfyn7@d4Ojny&^U恻?+.aT}vOfdoؔHF$)8d:k3b_ U R2;[_oϡɜ3]2/AbK3mh | TIIĹ_?-P} 7Q0S e \ No newline at end of file diff --git a/.git_disabled/objects/2d/40cdf035ec0c6a1a2ce8aaec9258fda746e4a4 b/.git_disabled/objects/2d/40cdf035ec0c6a1a2ce8aaec9258fda746e4a4 new file mode 100755 index 0000000..19f87b0 Binary files /dev/null and b/.git_disabled/objects/2d/40cdf035ec0c6a1a2ce8aaec9258fda746e4a4 differ diff --git a/.git_disabled/objects/2d/4989aa8723b0358bde7cfbee80b0777a5895c9 b/.git_disabled/objects/2d/4989aa8723b0358bde7cfbee80b0777a5895c9 new file mode 100755 index 0000000..80f8ea8 Binary files /dev/null and b/.git_disabled/objects/2d/4989aa8723b0358bde7cfbee80b0777a5895c9 differ diff --git a/.git_disabled/objects/2d/5ef48b2335f98aedf1d9cf3832e886c730fc7a b/.git_disabled/objects/2d/5ef48b2335f98aedf1d9cf3832e886c730fc7a new file mode 100755 index 0000000..4d43616 Binary files /dev/null and b/.git_disabled/objects/2d/5ef48b2335f98aedf1d9cf3832e886c730fc7a differ diff --git a/.git_disabled/objects/2d/6d6eb201636e57bf0d7333f3e111b8bea268db b/.git_disabled/objects/2d/6d6eb201636e57bf0d7333f3e111b8bea268db new file mode 100755 index 0000000..1e95312 Binary files /dev/null and b/.git_disabled/objects/2d/6d6eb201636e57bf0d7333f3e111b8bea268db differ diff --git a/.git_disabled/objects/2d/8b3f3ce0a6c2c288ca914ca12331987b1b35f5 b/.git_disabled/objects/2d/8b3f3ce0a6c2c288ca914ca12331987b1b35f5 new file mode 100755 index 0000000..e2205aa Binary files /dev/null and b/.git_disabled/objects/2d/8b3f3ce0a6c2c288ca914ca12331987b1b35f5 differ diff --git a/.git_disabled/objects/2d/8bf771201fefe05848db94c7cda44e0cf4a8e7 b/.git_disabled/objects/2d/8bf771201fefe05848db94c7cda44e0cf4a8e7 new file mode 100755 index 0000000..d9e5cf4 Binary files /dev/null and b/.git_disabled/objects/2d/8bf771201fefe05848db94c7cda44e0cf4a8e7 differ diff --git a/.git_disabled/objects/2d/957c869f8242756b6bd0a2b674ba35096b73f8 b/.git_disabled/objects/2d/957c869f8242756b6bd0a2b674ba35096b73f8 new file mode 100755 index 0000000..205c782 Binary files /dev/null and b/.git_disabled/objects/2d/957c869f8242756b6bd0a2b674ba35096b73f8 differ diff --git a/.git_disabled/objects/2d/ae722698967e94375a5bf287730a166b555168 b/.git_disabled/objects/2d/ae722698967e94375a5bf287730a166b555168 new file mode 100755 index 0000000..6425ecb Binary files /dev/null and b/.git_disabled/objects/2d/ae722698967e94375a5bf287730a166b555168 differ diff --git a/.git_disabled/objects/2d/b17935fd12c0eec8de0e0335c5ecb56d8d19d5 b/.git_disabled/objects/2d/b17935fd12c0eec8de0e0335c5ecb56d8d19d5 new file mode 100755 index 0000000..d8184e1 Binary files /dev/null and b/.git_disabled/objects/2d/b17935fd12c0eec8de0e0335c5ecb56d8d19d5 differ diff --git a/.git_disabled/objects/2d/cdfe3f5263f56fcd7038765df5d27d9846cfa2 b/.git_disabled/objects/2d/cdfe3f5263f56fcd7038765df5d27d9846cfa2 new file mode 100755 index 0000000..7817813 Binary files /dev/null and b/.git_disabled/objects/2d/cdfe3f5263f56fcd7038765df5d27d9846cfa2 differ diff --git a/.git_disabled/objects/2d/dfd2a4619c75e37563d9b0e575f3d965b37e45 b/.git_disabled/objects/2d/dfd2a4619c75e37563d9b0e575f3d965b37e45 new file mode 100755 index 0000000..4da43ea Binary files /dev/null and b/.git_disabled/objects/2d/dfd2a4619c75e37563d9b0e575f3d965b37e45 differ diff --git a/.git_disabled/objects/2d/e252873f0bb44e35a1c54fec2f0f800ffc02ab b/.git_disabled/objects/2d/e252873f0bb44e35a1c54fec2f0f800ffc02ab new file mode 100755 index 0000000..15bf427 Binary files /dev/null and b/.git_disabled/objects/2d/e252873f0bb44e35a1c54fec2f0f800ffc02ab differ diff --git a/.git_disabled/objects/2d/e8503a1138bf12c5ec863c18109be1103fc92e b/.git_disabled/objects/2d/e8503a1138bf12c5ec863c18109be1103fc92e new file mode 100755 index 0000000..0587323 Binary files /dev/null and b/.git_disabled/objects/2d/e8503a1138bf12c5ec863c18109be1103fc92e differ diff --git a/.git_disabled/objects/2d/ed4f51c281a479f605e32f08499fda9972bd7d b/.git_disabled/objects/2d/ed4f51c281a479f605e32f08499fda9972bd7d new file mode 100755 index 0000000..f331b26 Binary files /dev/null and b/.git_disabled/objects/2d/ed4f51c281a479f605e32f08499fda9972bd7d differ diff --git a/.git_disabled/objects/2d/ef6b220169f3dc1459cf2a9b742026637cfa30 b/.git_disabled/objects/2d/ef6b220169f3dc1459cf2a9b742026637cfa30 new file mode 100755 index 0000000..547c783 Binary files /dev/null and b/.git_disabled/objects/2d/ef6b220169f3dc1459cf2a9b742026637cfa30 differ diff --git a/.git_disabled/objects/2d/f502ebf48707340bd728f0b3fccef01f422eca b/.git_disabled/objects/2d/f502ebf48707340bd728f0b3fccef01f422eca new file mode 100755 index 0000000..999da67 Binary files /dev/null and b/.git_disabled/objects/2d/f502ebf48707340bd728f0b3fccef01f422eca differ diff --git a/.git_disabled/objects/2e/012da1ca1a26814d9b1456c7006330dc8a1997 b/.git_disabled/objects/2e/012da1ca1a26814d9b1456c7006330dc8a1997 new file mode 100755 index 0000000..abe4ae4 Binary files /dev/null and b/.git_disabled/objects/2e/012da1ca1a26814d9b1456c7006330dc8a1997 differ diff --git a/.git_disabled/objects/2e/0659fb839cfddef1b8fecf4554d02f1a7e3ac3 b/.git_disabled/objects/2e/0659fb839cfddef1b8fecf4554d02f1a7e3ac3 new file mode 100755 index 0000000..9c13bc4 Binary files /dev/null and b/.git_disabled/objects/2e/0659fb839cfddef1b8fecf4554d02f1a7e3ac3 differ diff --git a/.git_disabled/objects/2e/0aeb964668209bc3b5796a7b7aa65683760e4f b/.git_disabled/objects/2e/0aeb964668209bc3b5796a7b7aa65683760e4f new file mode 100755 index 0000000..560828a Binary files /dev/null and b/.git_disabled/objects/2e/0aeb964668209bc3b5796a7b7aa65683760e4f differ diff --git a/.git_disabled/objects/2e/109220e8fabdeedcb5160e4100f5bec8a31c21 b/.git_disabled/objects/2e/109220e8fabdeedcb5160e4100f5bec8a31c21 new file mode 100755 index 0000000..3540d7d Binary files /dev/null and b/.git_disabled/objects/2e/109220e8fabdeedcb5160e4100f5bec8a31c21 differ diff --git a/.git_disabled/objects/2e/114bec0e0f44c86a8be4f2a75fc4f881a4b371 b/.git_disabled/objects/2e/114bec0e0f44c86a8be4f2a75fc4f881a4b371 new file mode 100755 index 0000000..24cc4f8 Binary files /dev/null and b/.git_disabled/objects/2e/114bec0e0f44c86a8be4f2a75fc4f881a4b371 differ diff --git a/.git_disabled/objects/2e/3beec4a28aa7c4fe1275c2b04703381fbe49ec b/.git_disabled/objects/2e/3beec4a28aa7c4fe1275c2b04703381fbe49ec new file mode 100755 index 0000000..e86de11 Binary files /dev/null and b/.git_disabled/objects/2e/3beec4a28aa7c4fe1275c2b04703381fbe49ec differ diff --git a/.git_disabled/objects/2e/43352ed104590aaa32642291d8bd133350a128 b/.git_disabled/objects/2e/43352ed104590aaa32642291d8bd133350a128 new file mode 100755 index 0000000..19eaae7 Binary files /dev/null and b/.git_disabled/objects/2e/43352ed104590aaa32642291d8bd133350a128 differ diff --git a/.git_disabled/objects/2e/5b22018141e200e655d70a936713d25db2089c b/.git_disabled/objects/2e/5b22018141e200e655d70a936713d25db2089c new file mode 100755 index 0000000..27f4b27 Binary files /dev/null and b/.git_disabled/objects/2e/5b22018141e200e655d70a936713d25db2089c differ diff --git a/.git_disabled/objects/2e/62180b036826399b3f8ea108370a895bca4f6d b/.git_disabled/objects/2e/62180b036826399b3f8ea108370a895bca4f6d new file mode 100755 index 0000000..4452b41 Binary files /dev/null and b/.git_disabled/objects/2e/62180b036826399b3f8ea108370a895bca4f6d differ diff --git a/.git_disabled/objects/2e/67dd913c6534f6f25d40cd7e7ca8a11e417ed5 b/.git_disabled/objects/2e/67dd913c6534f6f25d40cd7e7ca8a11e417ed5 new file mode 100755 index 0000000..d8be3d2 Binary files /dev/null and b/.git_disabled/objects/2e/67dd913c6534f6f25d40cd7e7ca8a11e417ed5 differ diff --git a/.git_disabled/objects/2e/8752dd55fb287fa84402d0eff66ea2bc87ef5a b/.git_disabled/objects/2e/8752dd55fb287fa84402d0eff66ea2bc87ef5a new file mode 100755 index 0000000..7de44a8 Binary files /dev/null and b/.git_disabled/objects/2e/8752dd55fb287fa84402d0eff66ea2bc87ef5a differ diff --git a/.git_disabled/objects/2e/9c7fe67b25e27e7dc3d46c31f6ec3ab6ea55a2 b/.git_disabled/objects/2e/9c7fe67b25e27e7dc3d46c31f6ec3ab6ea55a2 new file mode 100755 index 0000000..c4f415e Binary files /dev/null and b/.git_disabled/objects/2e/9c7fe67b25e27e7dc3d46c31f6ec3ab6ea55a2 differ diff --git a/.git_disabled/objects/2e/9d79383bf9ee74454337e1e9f6f77048aaa800 b/.git_disabled/objects/2e/9d79383bf9ee74454337e1e9f6f77048aaa800 new file mode 100755 index 0000000..02eddd7 Binary files /dev/null and b/.git_disabled/objects/2e/9d79383bf9ee74454337e1e9f6f77048aaa800 differ diff --git a/.git_disabled/objects/2e/ba7b2e7e1bfbc1960c2466ce5a4e3bca30041c b/.git_disabled/objects/2e/ba7b2e7e1bfbc1960c2466ce5a4e3bca30041c new file mode 100755 index 0000000..043192b Binary files /dev/null and b/.git_disabled/objects/2e/ba7b2e7e1bfbc1960c2466ce5a4e3bca30041c differ diff --git a/.git_disabled/objects/2e/cc9e9c363e2f16c4f934cf41cf871826d6a495 b/.git_disabled/objects/2e/cc9e9c363e2f16c4f934cf41cf871826d6a495 new file mode 100755 index 0000000..15684ab Binary files /dev/null and b/.git_disabled/objects/2e/cc9e9c363e2f16c4f934cf41cf871826d6a495 differ diff --git a/.git_disabled/objects/2e/d49e7161254e617173e0f8f1a813c6100431c1 b/.git_disabled/objects/2e/d49e7161254e617173e0f8f1a813c6100431c1 new file mode 100755 index 0000000..f9c536e Binary files /dev/null and b/.git_disabled/objects/2e/d49e7161254e617173e0f8f1a813c6100431c1 differ diff --git a/.git_disabled/objects/2e/d4e667707387fe3f57493b1e77368b4252cb5b b/.git_disabled/objects/2e/d4e667707387fe3f57493b1e77368b4252cb5b new file mode 100755 index 0000000..85d9fa5 Binary files /dev/null and b/.git_disabled/objects/2e/d4e667707387fe3f57493b1e77368b4252cb5b differ diff --git a/.git_disabled/objects/2f/0d8abb05f59b4450e2716e90825236d2de2c16 b/.git_disabled/objects/2f/0d8abb05f59b4450e2716e90825236d2de2c16 new file mode 100755 index 0000000..4b16564 Binary files /dev/null and b/.git_disabled/objects/2f/0d8abb05f59b4450e2716e90825236d2de2c16 differ diff --git a/.git_disabled/objects/2f/0f7230a4f9f6719f4a6ddef0ad7e1e1159564a b/.git_disabled/objects/2f/0f7230a4f9f6719f4a6ddef0ad7e1e1159564a new file mode 100755 index 0000000..08c1ecf Binary files /dev/null and b/.git_disabled/objects/2f/0f7230a4f9f6719f4a6ddef0ad7e1e1159564a differ diff --git a/.git_disabled/objects/2f/1eeee584b1b483af0dd3c8dbad0a70c98a293b b/.git_disabled/objects/2f/1eeee584b1b483af0dd3c8dbad0a70c98a293b new file mode 100755 index 0000000..3a3b13c Binary files /dev/null and b/.git_disabled/objects/2f/1eeee584b1b483af0dd3c8dbad0a70c98a293b differ diff --git a/.git_disabled/objects/2f/289b134a692669f2fb0ce4a05ed8b4595428e6 b/.git_disabled/objects/2f/289b134a692669f2fb0ce4a05ed8b4595428e6 new file mode 100755 index 0000000..cbb2dd4 Binary files /dev/null and b/.git_disabled/objects/2f/289b134a692669f2fb0ce4a05ed8b4595428e6 differ diff --git a/.git_disabled/objects/2f/2c36119f58df1e32d66f3b040296ca1e2fd650 b/.git_disabled/objects/2f/2c36119f58df1e32d66f3b040296ca1e2fd650 new file mode 100755 index 0000000..34daa30 Binary files /dev/null and b/.git_disabled/objects/2f/2c36119f58df1e32d66f3b040296ca1e2fd650 differ diff --git a/.git_disabled/objects/2f/3c558a754a12a55e6e6ca5d114f61c6da42103 b/.git_disabled/objects/2f/3c558a754a12a55e6e6ca5d114f61c6da42103 new file mode 100755 index 0000000..f9630a4 --- /dev/null +++ b/.git_disabled/objects/2f/3c558a754a12a55e6e6ca5d114f61c6da42103 @@ -0,0 +1,3 @@ +xUQk0OqlC6#06U#YFc/}̾${^dqw**1Dv͸}쏈\O1˩{/@o? w=# Gm_ 1X5X3bI6XQ8)IrkTĠ@jgΙ5/'gՉ3An%s!86Іo1l I6rV㾤IAT^['N%b@J(C8^-=ߓiP?z2+!m-Fw6 +Yqyeʡ.u:"b(F0ܝy~rr~2u3TI(< \ No newline at end of file diff --git a/.git_disabled/objects/2f/432373771f0a7c24c44c45aef7b5ff89122030 b/.git_disabled/objects/2f/432373771f0a7c24c44c45aef7b5ff89122030 new file mode 100755 index 0000000..1c7ccf5 Binary files /dev/null and b/.git_disabled/objects/2f/432373771f0a7c24c44c45aef7b5ff89122030 differ diff --git a/.git_disabled/objects/2f/50080e95f470e716e654fa6549b1d6cda46514 b/.git_disabled/objects/2f/50080e95f470e716e654fa6549b1d6cda46514 new file mode 100755 index 0000000..8e8c957 Binary files /dev/null and b/.git_disabled/objects/2f/50080e95f470e716e654fa6549b1d6cda46514 differ diff --git a/.git_disabled/objects/2f/52e831c6dd3d29d96f417e9e75bf9ecf0491bd b/.git_disabled/objects/2f/52e831c6dd3d29d96f417e9e75bf9ecf0491bd new file mode 100755 index 0000000..544a658 Binary files /dev/null and b/.git_disabled/objects/2f/52e831c6dd3d29d96f417e9e75bf9ecf0491bd differ diff --git a/.git_disabled/objects/2f/71a4ba0ecbdffc7e6c9c48c9f3d62f672b7122 b/.git_disabled/objects/2f/71a4ba0ecbdffc7e6c9c48c9f3d62f672b7122 new file mode 100755 index 0000000..5e79d55 Binary files /dev/null and b/.git_disabled/objects/2f/71a4ba0ecbdffc7e6c9c48c9f3d62f672b7122 differ diff --git a/.git_disabled/objects/2f/745555f4264c9c9c58ae9829c36148c37a37b9 b/.git_disabled/objects/2f/745555f4264c9c9c58ae9829c36148c37a37b9 new file mode 100755 index 0000000..a437fdc Binary files /dev/null and b/.git_disabled/objects/2f/745555f4264c9c9c58ae9829c36148c37a37b9 differ diff --git a/.git_disabled/objects/2f/7fc4fe8356de1af6b63ce3b40370c5405690e3 b/.git_disabled/objects/2f/7fc4fe8356de1af6b63ce3b40370c5405690e3 new file mode 100755 index 0000000..6f7d73e Binary files /dev/null and b/.git_disabled/objects/2f/7fc4fe8356de1af6b63ce3b40370c5405690e3 differ diff --git a/.git_disabled/objects/2f/95aa31a5a8957764f2071fe526094e403adaa7 b/.git_disabled/objects/2f/95aa31a5a8957764f2071fe526094e403adaa7 new file mode 100755 index 0000000..08f33bc --- /dev/null +++ b/.git_disabled/objects/2f/95aa31a5a8957764f2071fe526094e403adaa7 @@ -0,0 +1,3 @@ +xUmHqpgP/, +]VZ{`e.;V’ _2jQ>/"Ŗ2B1jlYf^|?ߏE,L) J% 5'R]Ll뜍s[|h rBv^$xYGľ Ԍ^]c +['Vh-L YJ@# `v-YsKH==rȚXEc]l1k8Xx;K;%Ti:^|[F*0!!*ܰ92+BI )U6ܘk=Ņ^ ff\tP4cv>]cd͕ 'zrԷ<"t߉}xg=/G3",iE{|c>R&Y#nsLIObÁرK/ h~ \ No newline at end of file diff --git a/.git_disabled/objects/2f/c85539dd337a5dbdceef95a407b05b382700ad b/.git_disabled/objects/2f/c85539dd337a5dbdceef95a407b05b382700ad new file mode 100755 index 0000000..ddfb735 Binary files /dev/null and b/.git_disabled/objects/2f/c85539dd337a5dbdceef95a407b05b382700ad differ diff --git a/.git_disabled/objects/2f/d44a3980d16b93d13a45d70a8442dd88abd249 b/.git_disabled/objects/2f/d44a3980d16b93d13a45d70a8442dd88abd249 new file mode 100755 index 0000000..66fd436 Binary files /dev/null and b/.git_disabled/objects/2f/d44a3980d16b93d13a45d70a8442dd88abd249 differ diff --git a/.git_disabled/objects/2f/dc1f3d7eb935f9a905373e81ad9f0012f5e226 b/.git_disabled/objects/2f/dc1f3d7eb935f9a905373e81ad9f0012f5e226 new file mode 100755 index 0000000..566304a Binary files /dev/null and b/.git_disabled/objects/2f/dc1f3d7eb935f9a905373e81ad9f0012f5e226 differ diff --git a/.git_disabled/objects/2f/efb72c5eae0596839da9dae7c398003c966572 b/.git_disabled/objects/2f/efb72c5eae0596839da9dae7c398003c966572 new file mode 100755 index 0000000..1af582e Binary files /dev/null and b/.git_disabled/objects/2f/efb72c5eae0596839da9dae7c398003c966572 differ diff --git a/.git_disabled/objects/30/116a3c78e888ded27a49c54b4279313cefa89b b/.git_disabled/objects/30/116a3c78e888ded27a49c54b4279313cefa89b new file mode 100755 index 0000000..f3cea82 Binary files /dev/null and b/.git_disabled/objects/30/116a3c78e888ded27a49c54b4279313cefa89b differ diff --git a/.git_disabled/objects/30/1a98eb4172f0db61f781230a1281d9a3af3975 b/.git_disabled/objects/30/1a98eb4172f0db61f781230a1281d9a3af3975 new file mode 100755 index 0000000..ba629cf Binary files /dev/null and b/.git_disabled/objects/30/1a98eb4172f0db61f781230a1281d9a3af3975 differ diff --git a/.git_disabled/objects/30/291b47d997a1b601d11ece778de1ee553ab36c b/.git_disabled/objects/30/291b47d997a1b601d11ece778de1ee553ab36c new file mode 100755 index 0000000..3d0db50 Binary files /dev/null and b/.git_disabled/objects/30/291b47d997a1b601d11ece778de1ee553ab36c differ diff --git a/.git_disabled/objects/30/2f32b0c78a7071605b195c55054cfdb0b55f37 b/.git_disabled/objects/30/2f32b0c78a7071605b195c55054cfdb0b55f37 new file mode 100755 index 0000000..f64ccd6 Binary files /dev/null and b/.git_disabled/objects/30/2f32b0c78a7071605b195c55054cfdb0b55f37 differ diff --git a/.git_disabled/objects/30/3f6f730b027f9b3d1ba6c961b50250aeae8561 b/.git_disabled/objects/30/3f6f730b027f9b3d1ba6c961b50250aeae8561 new file mode 100755 index 0000000..7531cc7 Binary files /dev/null and b/.git_disabled/objects/30/3f6f730b027f9b3d1ba6c961b50250aeae8561 differ diff --git a/.git_disabled/objects/30/5f3f3ad0eab7b564e3ca92d976c042fae48a3e b/.git_disabled/objects/30/5f3f3ad0eab7b564e3ca92d976c042fae48a3e new file mode 100755 index 0000000..c4aa67c Binary files /dev/null and b/.git_disabled/objects/30/5f3f3ad0eab7b564e3ca92d976c042fae48a3e differ diff --git a/.git_disabled/objects/30/6d75c80a082d793073a8103e53583b3ee9c657 b/.git_disabled/objects/30/6d75c80a082d793073a8103e53583b3ee9c657 new file mode 100755 index 0000000..9c5a2d7 Binary files /dev/null and b/.git_disabled/objects/30/6d75c80a082d793073a8103e53583b3ee9c657 differ diff --git a/.git_disabled/objects/30/8f31094537b3f0d20e095a0b09815395b100f8 b/.git_disabled/objects/30/8f31094537b3f0d20e095a0b09815395b100f8 new file mode 100755 index 0000000..18fe985 --- /dev/null +++ b/.git_disabled/objects/30/8f31094537b3f0d20e095a0b09815395b100f8 @@ -0,0 +1,2 @@ +xRJ0x BAѣR,KH%+IXMdsJ`f՚jj-2;PA8Ofӥ:|v|&lXJWd\!j9<{“e +aRVZ*Z8(6e8kW-gu%8op79 *zKՉ:qwipI64nբLb.+:.;$&:gN^9d~Y2dP I~5>)ͩ|5"> \ No newline at end of file diff --git a/.git_disabled/objects/30/928a98455aba407cd7ae9b198c4602b7224cd5 b/.git_disabled/objects/30/928a98455aba407cd7ae9b198c4602b7224cd5 new file mode 100755 index 0000000..5b9dd01 Binary files /dev/null and b/.git_disabled/objects/30/928a98455aba407cd7ae9b198c4602b7224cd5 differ diff --git a/.git_disabled/objects/30/973dcaaaaae9317a31c3ca73611859b05a786d b/.git_disabled/objects/30/973dcaaaaae9317a31c3ca73611859b05a786d new file mode 100755 index 0000000..627173a Binary files /dev/null and b/.git_disabled/objects/30/973dcaaaaae9317a31c3ca73611859b05a786d differ diff --git a/.git_disabled/objects/30/9816f7b9c87f6f4b5238a8d6b8507f916c6628 b/.git_disabled/objects/30/9816f7b9c87f6f4b5238a8d6b8507f916c6628 new file mode 100755 index 0000000..8725dde Binary files /dev/null and b/.git_disabled/objects/30/9816f7b9c87f6f4b5238a8d6b8507f916c6628 differ diff --git a/.git_disabled/objects/30/a0e74f1f8ca8fdbb2ad60436cef0a64b0b30e4 b/.git_disabled/objects/30/a0e74f1f8ca8fdbb2ad60436cef0a64b0b30e4 new file mode 100755 index 0000000..6ca2714 Binary files /dev/null and b/.git_disabled/objects/30/a0e74f1f8ca8fdbb2ad60436cef0a64b0b30e4 differ diff --git a/.git_disabled/objects/30/a1f4b60a6558d33a973accfb5c0991cce137ea b/.git_disabled/objects/30/a1f4b60a6558d33a973accfb5c0991cce137ea new file mode 100755 index 0000000..09c7a09 Binary files /dev/null and b/.git_disabled/objects/30/a1f4b60a6558d33a973accfb5c0991cce137ea differ diff --git a/.git_disabled/objects/30/b05948a5142d2dc79551a74b9270129a34d1b2 b/.git_disabled/objects/30/b05948a5142d2dc79551a74b9270129a34d1b2 new file mode 100755 index 0000000..55587fe Binary files /dev/null and b/.git_disabled/objects/30/b05948a5142d2dc79551a74b9270129a34d1b2 differ diff --git a/.git_disabled/objects/30/c9f6d22546df4d792f66caea0bdec986fb73a0 b/.git_disabled/objects/30/c9f6d22546df4d792f66caea0bdec986fb73a0 new file mode 100755 index 0000000..f8befa9 Binary files /dev/null and b/.git_disabled/objects/30/c9f6d22546df4d792f66caea0bdec986fb73a0 differ diff --git a/.git_disabled/objects/30/e57f24b85aaae1f9351ab49bc3e75644e3de9c b/.git_disabled/objects/30/e57f24b85aaae1f9351ab49bc3e75644e3de9c new file mode 100755 index 0000000..4f7df83 Binary files /dev/null and b/.git_disabled/objects/30/e57f24b85aaae1f9351ab49bc3e75644e3de9c differ diff --git a/.git_disabled/objects/30/e91a71179c7156378c3cc1bb00ae243a119846 b/.git_disabled/objects/30/e91a71179c7156378c3cc1bb00ae243a119846 new file mode 100755 index 0000000..366d7b0 Binary files /dev/null and b/.git_disabled/objects/30/e91a71179c7156378c3cc1bb00ae243a119846 differ diff --git a/.git_disabled/objects/30/eeb725e667a01a8138f04594d88fe1eb00e844 b/.git_disabled/objects/30/eeb725e667a01a8138f04594d88fe1eb00e844 new file mode 100755 index 0000000..34306de Binary files /dev/null and b/.git_disabled/objects/30/eeb725e667a01a8138f04594d88fe1eb00e844 differ diff --git a/.git_disabled/objects/30/fe4eacf96773f47b14c1a013502d22aebda6e8 b/.git_disabled/objects/30/fe4eacf96773f47b14c1a013502d22aebda6e8 new file mode 100755 index 0000000..9cf10ff Binary files /dev/null and b/.git_disabled/objects/30/fe4eacf96773f47b14c1a013502d22aebda6e8 differ diff --git a/.git_disabled/objects/31/138532743f6f20cd782ca77ac46dd6b0652437 b/.git_disabled/objects/31/138532743f6f20cd782ca77ac46dd6b0652437 new file mode 100755 index 0000000..9828292 Binary files /dev/null and b/.git_disabled/objects/31/138532743f6f20cd782ca77ac46dd6b0652437 differ diff --git a/.git_disabled/objects/31/158ccfe1b1276fe9fb25ef71cf93e3a1dd8843 b/.git_disabled/objects/31/158ccfe1b1276fe9fb25ef71cf93e3a1dd8843 new file mode 100755 index 0000000..e315de8 Binary files /dev/null and b/.git_disabled/objects/31/158ccfe1b1276fe9fb25ef71cf93e3a1dd8843 differ diff --git a/.git_disabled/objects/31/1b2b56c53f678ab95fc0def708c675d521a807 b/.git_disabled/objects/31/1b2b56c53f678ab95fc0def708c675d521a807 new file mode 100755 index 0000000..908bf1f Binary files /dev/null and b/.git_disabled/objects/31/1b2b56c53f678ab95fc0def708c675d521a807 differ diff --git a/.git_disabled/objects/31/40ba82211bb57fd5bad3c6f4a0f62e336e87f3 b/.git_disabled/objects/31/40ba82211bb57fd5bad3c6f4a0f62e336e87f3 new file mode 100755 index 0000000..3aa245d Binary files /dev/null and b/.git_disabled/objects/31/40ba82211bb57fd5bad3c6f4a0f62e336e87f3 differ diff --git a/.git_disabled/objects/31/4349b3cda5b7af3e25d6a76345b213fce1068a b/.git_disabled/objects/31/4349b3cda5b7af3e25d6a76345b213fce1068a new file mode 100755 index 0000000..7942125 Binary files /dev/null and b/.git_disabled/objects/31/4349b3cda5b7af3e25d6a76345b213fce1068a differ diff --git a/.git_disabled/objects/31/45269978770d66e1c2ff1e797b9ce698e09f20 b/.git_disabled/objects/31/45269978770d66e1c2ff1e797b9ce698e09f20 new file mode 100755 index 0000000..34eb424 Binary files /dev/null and b/.git_disabled/objects/31/45269978770d66e1c2ff1e797b9ce698e09f20 differ diff --git a/.git_disabled/objects/31/4e34ec3718e684932a456afe363055a1015b24 b/.git_disabled/objects/31/4e34ec3718e684932a456afe363055a1015b24 new file mode 100755 index 0000000..a1d799d Binary files /dev/null and b/.git_disabled/objects/31/4e34ec3718e684932a456afe363055a1015b24 differ diff --git a/.git_disabled/objects/31/580d8fd47efe6a7defd98ebf260c922da65d64 b/.git_disabled/objects/31/580d8fd47efe6a7defd98ebf260c922da65d64 new file mode 100755 index 0000000..443a403 Binary files /dev/null and b/.git_disabled/objects/31/580d8fd47efe6a7defd98ebf260c922da65d64 differ diff --git a/.git_disabled/objects/31/5980739e5de7bee1231f9b55027c995ee40685 b/.git_disabled/objects/31/5980739e5de7bee1231f9b55027c995ee40685 new file mode 100755 index 0000000..9283f23 Binary files /dev/null and b/.git_disabled/objects/31/5980739e5de7bee1231f9b55027c995ee40685 differ diff --git a/.git_disabled/objects/31/6c7ce2ab6e126efd03e84e8a62fa5f41bb1a67 b/.git_disabled/objects/31/6c7ce2ab6e126efd03e84e8a62fa5f41bb1a67 new file mode 100755 index 0000000..895703e Binary files /dev/null and b/.git_disabled/objects/31/6c7ce2ab6e126efd03e84e8a62fa5f41bb1a67 differ diff --git a/.git_disabled/objects/31/71424374cf3eb33b00817398f3a3ee7de46a84 b/.git_disabled/objects/31/71424374cf3eb33b00817398f3a3ee7de46a84 new file mode 100755 index 0000000..797c865 Binary files /dev/null and b/.git_disabled/objects/31/71424374cf3eb33b00817398f3a3ee7de46a84 differ diff --git a/.git_disabled/objects/31/7195fd1e9ef6f3d904595ee867c473ff38f93c b/.git_disabled/objects/31/7195fd1e9ef6f3d904595ee867c473ff38f93c new file mode 100755 index 0000000..d8b4781 Binary files /dev/null and b/.git_disabled/objects/31/7195fd1e9ef6f3d904595ee867c473ff38f93c differ diff --git a/.git_disabled/objects/31/7e6ddc59601ba926293721ace756bc77cf77b5 b/.git_disabled/objects/31/7e6ddc59601ba926293721ace756bc77cf77b5 new file mode 100755 index 0000000..60187f6 Binary files /dev/null and b/.git_disabled/objects/31/7e6ddc59601ba926293721ace756bc77cf77b5 differ diff --git a/.git_disabled/objects/31/9f18603140f9a06ca647240a01d9ad1f897977 b/.git_disabled/objects/31/9f18603140f9a06ca647240a01d9ad1f897977 new file mode 100755 index 0000000..cb34efd --- /dev/null +++ b/.git_disabled/objects/31/9f18603140f9a06ca647240a01d9ad1f897977 @@ -0,0 +1,4 @@ +xTn0Oq(KDv0 А(Ӷ DUEns&vd]˴yOtȍc;TNWЕFr:GՍpը|aEDOFuYW"0,,5|݊bx<˥20Xk0X%_8ŕi6L.ʬsy.K[- +4 +4g C2 C՚Lkb^Q[@߉6if&#a T%*F(D-Y@CJf +sn(6%NkK"N͹#^30'F!>fz>DC,zcV!?huC!WhJk2Q/g5 RRu;*/˧uKE.[+K#2I&7Mubb336աѵ퉑K)[`[fIXUc\eHPFsOYQmM;(lE[Pu!^]d U؞גMYdлć2Sd"Əhcג"0cE*A647pw9LbS +-Z':E)3RH]󃜢 ﶒ;LƝ6z]'3H7џ)-n芧Plc-*0w+fɋfFo$QZ17VbM#PJSc̥!O"yŵ@$;e15#{M.<6Q2 +XQ }CbkQsOR2=]7Ep]w1~q iz<zw\|@|tAsIBwhC`d\;oq;aA__Ÿz`duA \ No newline at end of file diff --git a/.git_disabled/objects/38/0e55a39902d09647b3a006e2d58ad98705d959 b/.git_disabled/objects/38/0e55a39902d09647b3a006e2d58ad98705d959 new file mode 100755 index 0000000..0eb877f --- /dev/null +++ b/.git_disabled/objects/38/0e55a39902d09647b3a006e2d58ad98705d959 @@ -0,0 +1,3 @@ +x=\WsDZ=qqƱaC 6 !Ј4.W+FF &!"\FP`(FJDlh$ggms=s=ܵ5kO|k?vᓟ4t+uhPڱ2n8fe4[m@@@@@@@@@@@@@@@@@@@@@@@@@@@@@݁ߞq}^^'vL32lrb!9d,"\{qb*r#/L +r9 =r]E.!id !ן9,# El rG#Idl>Yd%d9,!#3X"ged9G6sYD 4G#Idl>YdS\B֑M-#KHC~u*rl Sd9"dYBzdS<\A.#YGQ;P;P;P;P;P;P;P;P;P;P;u`dGmlϯVّ`|_Ƈ{ w0091Ʒ ƷƷ``o0;x=x`|` G-}[ԑu/xl_t?F,;#kP Ɯ8{qD|BaU~ps܇5G3;{U~฻4w@n{w_swީ0q-U6ܲhn>vi&ݪ7Ϲc;kUi=8v3d7HJ_ι֖@F+JkR]{PsU}Hcsn5kZ|/8W=zt=8mf[UC-h5mf[Q'Glk4όq4ͶF(GlYVh5mf[Q5ǵVf[Q\cǽ5v)[c5SCG}^#{u8v1k|B~:okd<7F{5WkcF+ܫcF+ܟ7F{5WˎcF+ܯ׈;ug_8Zj/ͮ|\,Y,ǎb6ZβepO:ffn_~q7ov~87;pf߯:~fq7ov~87;:~fqoƞd.9~fǃs.o$=8M79GI~&w8$Ifv~9_v;;7ld<3 +񣎤w$I~7oq7or~7GI~&-o$}q7or~p&M97oq7ot~87:GKQ7rt׎ڿQ,Fs(Q~o(7o~q7ot~87:Ϲ KQ߰Ze={,Y\8ZdpwT-Y A~io =8 78GGA~w =5P5P ˥/#S4(rs >YI]:rޞs&$78wW״hdg-L {Jkr]:W&W+]]ptML&ׅ{q52]\ q_qo}i2f2fn_9x˃ s|_qq7H}`p3aoAeYԵ}]_5ZъouV۳dNtڅNA;w::M&z \ No newline at end of file diff --git a/.git_disabled/objects/38/2fa1626cde6576502c43f856851431499f52d0 b/.git_disabled/objects/38/2fa1626cde6576502c43f856851431499f52d0 new file mode 100755 index 0000000..0043dd4 Binary files /dev/null and b/.git_disabled/objects/38/2fa1626cde6576502c43f856851431499f52d0 differ diff --git a/.git_disabled/objects/38/4af1b8a5b56ef8071b88e0ad859797814d4954 b/.git_disabled/objects/38/4af1b8a5b56ef8071b88e0ad859797814d4954 new file mode 100755 index 0000000..f494df1 Binary files /dev/null and b/.git_disabled/objects/38/4af1b8a5b56ef8071b88e0ad859797814d4954 differ diff --git a/.git_disabled/objects/38/4cb9278b49c0ecf0164f71fa805c63d561e475 b/.git_disabled/objects/38/4cb9278b49c0ecf0164f71fa805c63d561e475 new file mode 100755 index 0000000..d32d485 Binary files /dev/null and b/.git_disabled/objects/38/4cb9278b49c0ecf0164f71fa805c63d561e475 differ diff --git a/.git_disabled/objects/38/5ec4317005c200f178a1fcb03234d648bfe854 b/.git_disabled/objects/38/5ec4317005c200f178a1fcb03234d648bfe854 new file mode 100755 index 0000000..8074df9 Binary files /dev/null and b/.git_disabled/objects/38/5ec4317005c200f178a1fcb03234d648bfe854 differ diff --git a/.git_disabled/objects/38/706b8a8ea2fbbde9f67a5446455ddf70f596be b/.git_disabled/objects/38/706b8a8ea2fbbde9f67a5446455ddf70f596be new file mode 100755 index 0000000..2f7a565 Binary files /dev/null and b/.git_disabled/objects/38/706b8a8ea2fbbde9f67a5446455ddf70f596be differ diff --git a/.git_disabled/objects/38/b961d10de88bebc98c758d0d1f14af1e7c0370 b/.git_disabled/objects/38/b961d10de88bebc98c758d0d1f14af1e7c0370 new file mode 100755 index 0000000..236f955 Binary files /dev/null and b/.git_disabled/objects/38/b961d10de88bebc98c758d0d1f14af1e7c0370 differ diff --git a/.git_disabled/objects/38/c60fcd2765a4ebe3d61a117e1c83fbf6232a2a b/.git_disabled/objects/38/c60fcd2765a4ebe3d61a117e1c83fbf6232a2a new file mode 100755 index 0000000..3bc8174 Binary files /dev/null and b/.git_disabled/objects/38/c60fcd2765a4ebe3d61a117e1c83fbf6232a2a differ diff --git a/.git_disabled/objects/38/ed34b3fbddcd53d59ebf7f5501337561f7a5cc b/.git_disabled/objects/38/ed34b3fbddcd53d59ebf7f5501337561f7a5cc new file mode 100755 index 0000000..d5a1568 Binary files /dev/null and b/.git_disabled/objects/38/ed34b3fbddcd53d59ebf7f5501337561f7a5cc differ diff --git a/.git_disabled/objects/39/16b594d29dcec45c9daf5e3802fa4606e619cc b/.git_disabled/objects/39/16b594d29dcec45c9daf5e3802fa4606e619cc new file mode 100755 index 0000000..6f9a7f3 Binary files /dev/null and b/.git_disabled/objects/39/16b594d29dcec45c9daf5e3802fa4606e619cc differ diff --git a/.git_disabled/objects/39/77f55a8b1e94e67bab364885e502e6c89e3bc5 b/.git_disabled/objects/39/77f55a8b1e94e67bab364885e502e6c89e3bc5 new file mode 100755 index 0000000..ef110e4 --- /dev/null +++ b/.git_disabled/objects/39/77f55a8b1e94e67bab364885e502e6c89e3bc5 @@ -0,0 +1,2 @@ +x +0E]+.Y);.iR:̔t|gwF\!6,b0>"I%H4Ua1.}*jIc8V\mo8Dj"0Bhb, \ No newline at end of file diff --git a/.git_disabled/objects/39/8e083952915fe3a3e5b00da7273999496b7848 b/.git_disabled/objects/39/8e083952915fe3a3e5b00da7273999496b7848 new file mode 100755 index 0000000..53acd0f Binary files /dev/null and b/.git_disabled/objects/39/8e083952915fe3a3e5b00da7273999496b7848 differ diff --git a/.git_disabled/objects/39/90621399a9263e6752b95637ce6c1db3890ebd b/.git_disabled/objects/39/90621399a9263e6752b95637ce6c1db3890ebd new file mode 100755 index 0000000..8deb872 Binary files /dev/null and b/.git_disabled/objects/39/90621399a9263e6752b95637ce6c1db3890ebd differ diff --git a/.git_disabled/objects/39/99213e5cbcb1018a025946bc190b9f196cb498 b/.git_disabled/objects/39/99213e5cbcb1018a025946bc190b9f196cb498 new file mode 100755 index 0000000..434484e Binary files /dev/null and b/.git_disabled/objects/39/99213e5cbcb1018a025946bc190b9f196cb498 differ diff --git a/.git_disabled/objects/39/aa6b441854cd106de527d3d11b5f897680cb7a b/.git_disabled/objects/39/aa6b441854cd106de527d3d11b5f897680cb7a new file mode 100755 index 0000000..5cda2e5 Binary files /dev/null and b/.git_disabled/objects/39/aa6b441854cd106de527d3d11b5f897680cb7a differ diff --git a/.git_disabled/objects/39/ae9f406decb53f74bf2d9ac440aab894477510 b/.git_disabled/objects/39/ae9f406decb53f74bf2d9ac440aab894477510 new file mode 100755 index 0000000..e986658 Binary files /dev/null and b/.git_disabled/objects/39/ae9f406decb53f74bf2d9ac440aab894477510 differ diff --git a/.git_disabled/objects/39/b9203c3a4ef71e486cf408056756d7d0a1f4c1 b/.git_disabled/objects/39/b9203c3a4ef71e486cf408056756d7d0a1f4c1 new file mode 100755 index 0000000..70fa65c Binary files /dev/null and b/.git_disabled/objects/39/b9203c3a4ef71e486cf408056756d7d0a1f4c1 differ diff --git a/.git_disabled/objects/39/c3a29299a1b891b2084024e5d2bdeeef8a4002 b/.git_disabled/objects/39/c3a29299a1b891b2084024e5d2bdeeef8a4002 new file mode 100755 index 0000000..dcc1820 Binary files /dev/null and b/.git_disabled/objects/39/c3a29299a1b891b2084024e5d2bdeeef8a4002 differ diff --git a/.git_disabled/objects/39/ed8472bd2d6b1bfe2bf3a589ff61df596c91c8 b/.git_disabled/objects/39/ed8472bd2d6b1bfe2bf3a589ff61df596c91c8 new file mode 100755 index 0000000..5879cf9 Binary files /dev/null and b/.git_disabled/objects/39/ed8472bd2d6b1bfe2bf3a589ff61df596c91c8 differ diff --git a/.git_disabled/objects/39/edc415e9e620d652913fc65750c6da95e06a59 b/.git_disabled/objects/39/edc415e9e620d652913fc65750c6da95e06a59 new file mode 100755 index 0000000..0bdc7b0 Binary files /dev/null and b/.git_disabled/objects/39/edc415e9e620d652913fc65750c6da95e06a59 differ diff --git a/.git_disabled/objects/39/f186f5c8250c939e4c12ff4a20ab3007ccfbc4 b/.git_disabled/objects/39/f186f5c8250c939e4c12ff4a20ab3007ccfbc4 new file mode 100755 index 0000000..1c84466 Binary files /dev/null and b/.git_disabled/objects/39/f186f5c8250c939e4c12ff4a20ab3007ccfbc4 differ diff --git a/.git_disabled/objects/39/f8f2416d9bc031cdc3a8c2dfcf949b2a6b2ced b/.git_disabled/objects/39/f8f2416d9bc031cdc3a8c2dfcf949b2a6b2ced new file mode 100755 index 0000000..0be9f2a Binary files /dev/null and b/.git_disabled/objects/39/f8f2416d9bc031cdc3a8c2dfcf949b2a6b2ced differ diff --git a/.git_disabled/objects/39/fb2befb58229af3357b22968f9db6bb7754cbe b/.git_disabled/objects/39/fb2befb58229af3357b22968f9db6bb7754cbe new file mode 100755 index 0000000..05d4a64 Binary files /dev/null and b/.git_disabled/objects/39/fb2befb58229af3357b22968f9db6bb7754cbe differ diff --git a/.git_disabled/objects/3a/03efe966dfe5d4c5b5e3acbf1de639264ef47d b/.git_disabled/objects/3a/03efe966dfe5d4c5b5e3acbf1de639264ef47d new file mode 100755 index 0000000..202298e Binary files /dev/null and b/.git_disabled/objects/3a/03efe966dfe5d4c5b5e3acbf1de639264ef47d differ diff --git a/.git_disabled/objects/3a/10773d6d0eefbbcfa46cae207438a45c3594a1 b/.git_disabled/objects/3a/10773d6d0eefbbcfa46cae207438a45c3594a1 new file mode 100755 index 0000000..b54d4ec Binary files /dev/null and b/.git_disabled/objects/3a/10773d6d0eefbbcfa46cae207438a45c3594a1 differ diff --git a/.git_disabled/objects/3a/1ac25909009a57c02932b194d41baf7a8bcd94 b/.git_disabled/objects/3a/1ac25909009a57c02932b194d41baf7a8bcd94 new file mode 100755 index 0000000..6b1cc1b Binary files /dev/null and b/.git_disabled/objects/3a/1ac25909009a57c02932b194d41baf7a8bcd94 differ diff --git a/.git_disabled/objects/3a/1f1fceefe9b9254d752d56cc04d3a3bf775f6f b/.git_disabled/objects/3a/1f1fceefe9b9254d752d56cc04d3a3bf775f6f new file mode 100755 index 0000000..9fadb66 Binary files /dev/null and b/.git_disabled/objects/3a/1f1fceefe9b9254d752d56cc04d3a3bf775f6f differ diff --git a/.git_disabled/objects/3a/1fa4d6dacee04bfcf240ef79deed291cf990c3 b/.git_disabled/objects/3a/1fa4d6dacee04bfcf240ef79deed291cf990c3 new file mode 100755 index 0000000..b2fffa8 Binary files /dev/null and b/.git_disabled/objects/3a/1fa4d6dacee04bfcf240ef79deed291cf990c3 differ diff --git a/.git_disabled/objects/3a/27dcae529e97a12d062e186e147e68a5bcc0a5 b/.git_disabled/objects/3a/27dcae529e97a12d062e186e147e68a5bcc0a5 new file mode 100755 index 0000000..3b0a829 Binary files /dev/null and b/.git_disabled/objects/3a/27dcae529e97a12d062e186e147e68a5bcc0a5 differ diff --git a/.git_disabled/objects/3a/294ef2f9c3120eb6102b1f0c664c6ddc38efe7 b/.git_disabled/objects/3a/294ef2f9c3120eb6102b1f0c664c6ddc38efe7 new file mode 100755 index 0000000..0b01700 Binary files /dev/null and b/.git_disabled/objects/3a/294ef2f9c3120eb6102b1f0c664c6ddc38efe7 differ diff --git a/.git_disabled/objects/3a/4f3974e5d168c56f8bd74efdf3d229ea281e8a b/.git_disabled/objects/3a/4f3974e5d168c56f8bd74efdf3d229ea281e8a new file mode 100755 index 0000000..61419b9 --- /dev/null +++ b/.git_disabled/objects/3a/4f3974e5d168c56f8bd74efdf3d229ea281e8a @@ -0,0 +1,3 @@ +x% BK7xhaQ)ixxd +^([`]@ +N@ÜMtHC!( 19lc;շvqwnWy'.ޟ?wQI$P( J%@I$P( J%@I$P( J%@I$P( J3αq_؎ +̘0b@-06vV,1aĀZ4a8yذb #ТA ;cdž fL1G jx;6X0cˆ=:hPpرałF ѡEǎ +̘0b@-0?QeQeQeQeQeQeQeQ̯y ?OK{ r/A%Ƚ ^K{ r/z^K{ r/A%Ƚ ^K{ r/A%Ƚx{#|rO^[~O{rO^^ܓ{rO^=y'/垼ܓ{rO^={'/?^=y'/垼ܓ{rO^=y'/垼ܓﬕC?}ߓooʜIIIIIIIIIIeIIIIIII&}0`,Yfy>}0`IL`>&}0IL`>&}0IL`>&}0IL`>&}0IL`҇_5 B2V \ No newline at end of file diff --git a/.git_disabled/objects/3a/90d58db7c258186a96e761dafe6810b5698c49 b/.git_disabled/objects/3a/90d58db7c258186a96e761dafe6810b5698c49 new file mode 100755 index 0000000..f1598b0 Binary files /dev/null and b/.git_disabled/objects/3a/90d58db7c258186a96e761dafe6810b5698c49 differ diff --git a/.git_disabled/objects/3a/97119010ac82e15e917a69b7b8f9f59b5a4601 b/.git_disabled/objects/3a/97119010ac82e15e917a69b7b8f9f59b5a4601 new file mode 100755 index 0000000..81ba0e4 Binary files /dev/null and b/.git_disabled/objects/3a/97119010ac82e15e917a69b7b8f9f59b5a4601 differ diff --git a/.git_disabled/objects/3a/98065f3f7aae17a2695f63c3b29883bccc37ee b/.git_disabled/objects/3a/98065f3f7aae17a2695f63c3b29883bccc37ee new file mode 100755 index 0000000..8c25bde Binary files /dev/null and b/.git_disabled/objects/3a/98065f3f7aae17a2695f63c3b29883bccc37ee differ diff --git a/.git_disabled/objects/3a/9ef47726378ecf29ebb38a56507b805aed11c0 b/.git_disabled/objects/3a/9ef47726378ecf29ebb38a56507b805aed11c0 new file mode 100755 index 0000000..9f7e673 Binary files /dev/null and b/.git_disabled/objects/3a/9ef47726378ecf29ebb38a56507b805aed11c0 differ diff --git a/.git_disabled/objects/3a/ac0c7be1d55d491e38104fba0f936c89b60f45 b/.git_disabled/objects/3a/ac0c7be1d55d491e38104fba0f936c89b60f45 new file mode 100755 index 0000000..09379b0 Binary files /dev/null and b/.git_disabled/objects/3a/ac0c7be1d55d491e38104fba0f936c89b60f45 differ diff --git a/.git_disabled/objects/3a/bd041c19e79ffbe1460a8473d7fb9ce34339f2 b/.git_disabled/objects/3a/bd041c19e79ffbe1460a8473d7fb9ce34339f2 new file mode 100755 index 0000000..1e15d07 Binary files /dev/null and b/.git_disabled/objects/3a/bd041c19e79ffbe1460a8473d7fb9ce34339f2 differ diff --git a/.git_disabled/objects/3a/d444b043e3f3d6c05c2d9d84d5119312bfaa34 b/.git_disabled/objects/3a/d444b043e3f3d6c05c2d9d84d5119312bfaa34 new file mode 100755 index 0000000..bfb7eac Binary files /dev/null and b/.git_disabled/objects/3a/d444b043e3f3d6c05c2d9d84d5119312bfaa34 differ diff --git a/.git_disabled/objects/3a/f5801dd7da8c479782763c682449492198c04a b/.git_disabled/objects/3a/f5801dd7da8c479782763c682449492198c04a new file mode 100755 index 0000000..9fa3ea4 Binary files /dev/null and b/.git_disabled/objects/3a/f5801dd7da8c479782763c682449492198c04a differ diff --git a/.git_disabled/objects/3b/0c1d3cc4143f574c0ef4f7ef2e927bef964ab8 b/.git_disabled/objects/3b/0c1d3cc4143f574c0ef4f7ef2e927bef964ab8 new file mode 100755 index 0000000..34db13f Binary files /dev/null and b/.git_disabled/objects/3b/0c1d3cc4143f574c0ef4f7ef2e927bef964ab8 differ diff --git a/.git_disabled/objects/3b/11ad6cbe3ca4b40c2455555aefa7ce4a590e46 b/.git_disabled/objects/3b/11ad6cbe3ca4b40c2455555aefa7ce4a590e46 new file mode 100755 index 0000000..ded46cb Binary files /dev/null and b/.git_disabled/objects/3b/11ad6cbe3ca4b40c2455555aefa7ce4a590e46 differ diff --git a/.git_disabled/objects/3b/198c8fe2424035a9ab2502406a36825ba20425 b/.git_disabled/objects/3b/198c8fe2424035a9ab2502406a36825ba20425 new file mode 100755 index 0000000..1925d8e Binary files /dev/null and b/.git_disabled/objects/3b/198c8fe2424035a9ab2502406a36825ba20425 differ diff --git a/.git_disabled/objects/3b/19ade9277b7f71d023cab351ea478610110cbd b/.git_disabled/objects/3b/19ade9277b7f71d023cab351ea478610110cbd new file mode 100755 index 0000000..bd610ed Binary files /dev/null and b/.git_disabled/objects/3b/19ade9277b7f71d023cab351ea478610110cbd differ diff --git a/.git_disabled/objects/3b/20c85bb5335026363169f7e4c49bfc47de893f b/.git_disabled/objects/3b/20c85bb5335026363169f7e4c49bfc47de893f new file mode 100755 index 0000000..ce88af4 Binary files /dev/null and b/.git_disabled/objects/3b/20c85bb5335026363169f7e4c49bfc47de893f differ diff --git a/.git_disabled/objects/3b/27c30e61645ccd9102fa0ea06308fe7806561a b/.git_disabled/objects/3b/27c30e61645ccd9102fa0ea06308fe7806561a new file mode 100755 index 0000000..8a2e64e Binary files /dev/null and b/.git_disabled/objects/3b/27c30e61645ccd9102fa0ea06308fe7806561a differ diff --git a/.git_disabled/objects/3b/3e50d1a6c78ed463ae93aaf3dee15348d8d9d0 b/.git_disabled/objects/3b/3e50d1a6c78ed463ae93aaf3dee15348d8d9d0 new file mode 100755 index 0000000..c952405 Binary files /dev/null and b/.git_disabled/objects/3b/3e50d1a6c78ed463ae93aaf3dee15348d8d9d0 differ diff --git a/.git_disabled/objects/3b/3e644c8d840f24d4e58e31dc2be21f10423193 b/.git_disabled/objects/3b/3e644c8d840f24d4e58e31dc2be21f10423193 new file mode 100755 index 0000000..70f63a8 Binary files /dev/null and b/.git_disabled/objects/3b/3e644c8d840f24d4e58e31dc2be21f10423193 differ diff --git a/.git_disabled/objects/3b/420b9a857a9e5eb094285a25f33d6a7f103faf b/.git_disabled/objects/3b/420b9a857a9e5eb094285a25f33d6a7f103faf new file mode 100755 index 0000000..f8bca3d --- /dev/null +++ b/.git_disabled/objects/3b/420b9a857a9e5eb094285a25f33d6a7f103faf @@ -0,0 +1 @@ +x= =^ !!@z[ǂDf7*%~>^k|(+2gLL5dvms~ յ;Im !Fy 1:C@44?g*&FIZ?<'7սbuB~)%\޿%6A \ No newline at end of file diff --git a/.git_disabled/objects/3b/46fd94409fd52879ad26e6b9725d90b120a7cf b/.git_disabled/objects/3b/46fd94409fd52879ad26e6b9725d90b120a7cf new file mode 100755 index 0000000..da6f911 Binary files /dev/null and b/.git_disabled/objects/3b/46fd94409fd52879ad26e6b9725d90b120a7cf differ diff --git a/.git_disabled/objects/3b/5218ad6acd168917cf1b91c1b7067e7bee6b83 b/.git_disabled/objects/3b/5218ad6acd168917cf1b91c1b7067e7bee6b83 new file mode 100755 index 0000000..6d3ad12 Binary files /dev/null and b/.git_disabled/objects/3b/5218ad6acd168917cf1b91c1b7067e7bee6b83 differ diff --git a/.git_disabled/objects/3b/58bf338133f4e0eed16bc3aa7b9ce7722af842 b/.git_disabled/objects/3b/58bf338133f4e0eed16bc3aa7b9ce7722af842 new file mode 100755 index 0000000..0a6ad01 Binary files /dev/null and b/.git_disabled/objects/3b/58bf338133f4e0eed16bc3aa7b9ce7722af842 differ diff --git a/.git_disabled/objects/3b/5e25747ab7204e6bf00f1a04bc18844c0e1bfd b/.git_disabled/objects/3b/5e25747ab7204e6bf00f1a04bc18844c0e1bfd new file mode 100755 index 0000000..99c15f6 Binary files /dev/null and b/.git_disabled/objects/3b/5e25747ab7204e6bf00f1a04bc18844c0e1bfd differ diff --git a/.git_disabled/objects/3b/5f371dc474233b284dbd0556ef4eeffce80e43 b/.git_disabled/objects/3b/5f371dc474233b284dbd0556ef4eeffce80e43 new file mode 100755 index 0000000..54d1ed5 Binary files /dev/null and b/.git_disabled/objects/3b/5f371dc474233b284dbd0556ef4eeffce80e43 differ diff --git a/.git_disabled/objects/3b/6b88ad24187efcefc59c9f4480bd7403966690 b/.git_disabled/objects/3b/6b88ad24187efcefc59c9f4480bd7403966690 new file mode 100755 index 0000000..84ff1d8 --- /dev/null +++ b/.git_disabled/objects/3b/6b88ad24187efcefc59c9f4480bd7403966690 @@ -0,0 +1,2 @@ +xn0;)q. Ԉ6hHeL*~,y5*u]AE 4w/FaȲL\gXN.:hBa>m: mN^MS7\o"MHOVgHjd2]%Y~`Y%`$e%Xj"҉dU'FH ))Q:MS}ާ4Y p#45 t/a~5ç⁞8Z`Mrc0qt]/b`l^;Eq]<`%,*2R_=t:_vAZ-rTQ WJ2̭^3+W9C-_s۷ Vh\L-o3I`ؽz+7@Qp1#[Z.gzlr}9){rXm1G%$Ń2,o"L?z ~PxJ \ No newline at end of file diff --git a/.git_disabled/objects/3b/896846f6c06b9f922f4d43c8f627044a81d349 b/.git_disabled/objects/3b/896846f6c06b9f922f4d43c8f627044a81d349 new file mode 100755 index 0000000..b42c7e3 Binary files /dev/null and b/.git_disabled/objects/3b/896846f6c06b9f922f4d43c8f627044a81d349 differ diff --git a/.git_disabled/objects/3b/8ed7a07648105e36da95ab89327d53b15adf25 b/.git_disabled/objects/3b/8ed7a07648105e36da95ab89327d53b15adf25 new file mode 100755 index 0000000..4ad8f6f Binary files /dev/null and b/.git_disabled/objects/3b/8ed7a07648105e36da95ab89327d53b15adf25 differ diff --git a/.git_disabled/objects/3b/9fd938ff4063e10c9838228db47835526c0aa4 b/.git_disabled/objects/3b/9fd938ff4063e10c9838228db47835526c0aa4 new file mode 100755 index 0000000..28554e2 Binary files /dev/null and b/.git_disabled/objects/3b/9fd938ff4063e10c9838228db47835526c0aa4 differ diff --git a/.git_disabled/objects/3b/a6e4d06b955efa1cf4f798c61101369f6da0c8 b/.git_disabled/objects/3b/a6e4d06b955efa1cf4f798c61101369f6da0c8 new file mode 100755 index 0000000..cedd27c Binary files /dev/null and b/.git_disabled/objects/3b/a6e4d06b955efa1cf4f798c61101369f6da0c8 differ diff --git a/.git_disabled/objects/3b/b56a964732421bf70578294547b57489d4f741 b/.git_disabled/objects/3b/b56a964732421bf70578294547b57489d4f741 new file mode 100755 index 0000000..ba481ef Binary files /dev/null and b/.git_disabled/objects/3b/b56a964732421bf70578294547b57489d4f741 differ diff --git a/.git_disabled/objects/3b/cfaebb08211ac7f0905228cf77c511fd1e2239 b/.git_disabled/objects/3b/cfaebb08211ac7f0905228cf77c511fd1e2239 new file mode 100755 index 0000000..b3d78c0 Binary files /dev/null and b/.git_disabled/objects/3b/cfaebb08211ac7f0905228cf77c511fd1e2239 differ diff --git a/.git_disabled/objects/3b/db19b054685caa59b2a7804990eb2e819ea970 b/.git_disabled/objects/3b/db19b054685caa59b2a7804990eb2e819ea970 new file mode 100755 index 0000000..3902fa3 Binary files /dev/null and b/.git_disabled/objects/3b/db19b054685caa59b2a7804990eb2e819ea970 differ diff --git a/.git_disabled/objects/3b/edf6d9d540a8910e4ceed9c2e5880a21c05a6e b/.git_disabled/objects/3b/edf6d9d540a8910e4ceed9c2e5880a21c05a6e new file mode 100755 index 0000000..56af3ed Binary files /dev/null and b/.git_disabled/objects/3b/edf6d9d540a8910e4ceed9c2e5880a21c05a6e differ diff --git a/.git_disabled/objects/3b/ffbb829ed381b9232031ad2468731b3cf0c223 b/.git_disabled/objects/3b/ffbb829ed381b9232031ad2468731b3cf0c223 new file mode 100755 index 0000000..ab941c7 Binary files /dev/null and b/.git_disabled/objects/3b/ffbb829ed381b9232031ad2468731b3cf0c223 differ diff --git a/.git_disabled/objects/3b/fffb8540d9cd52244b2785ba25ccd113f033a0 b/.git_disabled/objects/3b/fffb8540d9cd52244b2785ba25ccd113f033a0 new file mode 100755 index 0000000..bc90f3c Binary files /dev/null and b/.git_disabled/objects/3b/fffb8540d9cd52244b2785ba25ccd113f033a0 differ diff --git a/.git_disabled/objects/3c/0ce1025aed837433e1f5ded58311898a88b6f4 b/.git_disabled/objects/3c/0ce1025aed837433e1f5ded58311898a88b6f4 new file mode 100755 index 0000000..f64da7e Binary files /dev/null and b/.git_disabled/objects/3c/0ce1025aed837433e1f5ded58311898a88b6f4 differ diff --git a/.git_disabled/objects/3c/16dff6cb2413261e539d6b55cd0a65b947a0bb b/.git_disabled/objects/3c/16dff6cb2413261e539d6b55cd0a65b947a0bb new file mode 100755 index 0000000..68f5406 Binary files /dev/null and b/.git_disabled/objects/3c/16dff6cb2413261e539d6b55cd0a65b947a0bb differ diff --git a/.git_disabled/objects/3c/1a911f5f93699aa4a16b1ef568249062499611 b/.git_disabled/objects/3c/1a911f5f93699aa4a16b1ef568249062499611 new file mode 100755 index 0000000..648ab30 Binary files /dev/null and b/.git_disabled/objects/3c/1a911f5f93699aa4a16b1ef568249062499611 differ diff --git a/.git_disabled/objects/3c/1e639cf773524fc8ca67325467ae2f8f52e98f b/.git_disabled/objects/3c/1e639cf773524fc8ca67325467ae2f8f52e98f new file mode 100755 index 0000000..4f07471 Binary files /dev/null and b/.git_disabled/objects/3c/1e639cf773524fc8ca67325467ae2f8f52e98f differ diff --git a/.git_disabled/objects/3c/23cbdee76b1be6351cae4926f6a92d0f043590 b/.git_disabled/objects/3c/23cbdee76b1be6351cae4926f6a92d0f043590 new file mode 100755 index 0000000..a74c4e4 Binary files /dev/null and b/.git_disabled/objects/3c/23cbdee76b1be6351cae4926f6a92d0f043590 differ diff --git a/.git_disabled/objects/3c/25cd5f9e8c7014bab90fbf9b6a08d376345126 b/.git_disabled/objects/3c/25cd5f9e8c7014bab90fbf9b6a08d376345126 new file mode 100755 index 0000000..81cb2e0 Binary files /dev/null and b/.git_disabled/objects/3c/25cd5f9e8c7014bab90fbf9b6a08d376345126 differ diff --git a/.git_disabled/objects/3c/2ff8bc5f8dfc8e5146f5de5b87b8fd15c9f3cd b/.git_disabled/objects/3c/2ff8bc5f8dfc8e5146f5de5b87b8fd15c9f3cd new file mode 100755 index 0000000..a22a171 Binary files /dev/null and b/.git_disabled/objects/3c/2ff8bc5f8dfc8e5146f5de5b87b8fd15c9f3cd differ diff --git a/.git_disabled/objects/3c/324d00c62894f7fdc04dd0c6b52b13c3e3c606 b/.git_disabled/objects/3c/324d00c62894f7fdc04dd0c6b52b13c3e3c606 new file mode 100755 index 0000000..3fe89e9 Binary files /dev/null and b/.git_disabled/objects/3c/324d00c62894f7fdc04dd0c6b52b13c3e3c606 differ diff --git a/.git_disabled/objects/3c/5e645d8892041ef4478695812bcbe1ac89786a b/.git_disabled/objects/3c/5e645d8892041ef4478695812bcbe1ac89786a new file mode 100755 index 0000000..6cf32aa Binary files /dev/null and b/.git_disabled/objects/3c/5e645d8892041ef4478695812bcbe1ac89786a differ diff --git a/.git_disabled/objects/3c/63eff273ba7785c75f6a8da5f5bc1a28eb4335 b/.git_disabled/objects/3c/63eff273ba7785c75f6a8da5f5bc1a28eb4335 new file mode 100755 index 0000000..f1b3aa3 Binary files /dev/null and b/.git_disabled/objects/3c/63eff273ba7785c75f6a8da5f5bc1a28eb4335 differ diff --git a/.git_disabled/objects/3c/6e70f671b992dbc04f5ef95ddd05fd789d7c78 b/.git_disabled/objects/3c/6e70f671b992dbc04f5ef95ddd05fd789d7c78 new file mode 100755 index 0000000..c771637 Binary files /dev/null and b/.git_disabled/objects/3c/6e70f671b992dbc04f5ef95ddd05fd789d7c78 differ diff --git a/.git_disabled/objects/3c/7f0c82549719b8707767adbb11c560fdd89d5c b/.git_disabled/objects/3c/7f0c82549719b8707767adbb11c560fdd89d5c new file mode 100755 index 0000000..9b6e2d3 Binary files /dev/null and b/.git_disabled/objects/3c/7f0c82549719b8707767adbb11c560fdd89d5c differ diff --git a/.git_disabled/objects/3c/81c396f6e82857afcde03a4be2e2d67fa67d56 b/.git_disabled/objects/3c/81c396f6e82857afcde03a4be2e2d67fa67d56 new file mode 100755 index 0000000..5f345c2 Binary files /dev/null and b/.git_disabled/objects/3c/81c396f6e82857afcde03a4be2e2d67fa67d56 differ diff --git a/.git_disabled/objects/3c/827682333fef41ef2c6018a815c68c587b50b0 b/.git_disabled/objects/3c/827682333fef41ef2c6018a815c68c587b50b0 new file mode 100755 index 0000000..ececea2 Binary files /dev/null and b/.git_disabled/objects/3c/827682333fef41ef2c6018a815c68c587b50b0 differ diff --git a/.git_disabled/objects/3c/82b37fddc8ac64fe0d3ebd7708c3c5661e42a2 b/.git_disabled/objects/3c/82b37fddc8ac64fe0d3ebd7708c3c5661e42a2 new file mode 100755 index 0000000..065eacd Binary files /dev/null and b/.git_disabled/objects/3c/82b37fddc8ac64fe0d3ebd7708c3c5661e42a2 differ diff --git a/.git_disabled/objects/3c/981bfe798129bbe476cf3bd3c2a5701245d98b b/.git_disabled/objects/3c/981bfe798129bbe476cf3bd3c2a5701245d98b new file mode 100755 index 0000000..52453cf Binary files /dev/null and b/.git_disabled/objects/3c/981bfe798129bbe476cf3bd3c2a5701245d98b differ diff --git a/.git_disabled/objects/3c/a803ebfb42fb2a517e3525410af6c84bd352ea b/.git_disabled/objects/3c/a803ebfb42fb2a517e3525410af6c84bd352ea new file mode 100755 index 0000000..55bd8ce Binary files /dev/null and b/.git_disabled/objects/3c/a803ebfb42fb2a517e3525410af6c84bd352ea differ diff --git a/.git_disabled/objects/3c/af7d984c15e2b2ff04ebb64e7fe9b251dca303 b/.git_disabled/objects/3c/af7d984c15e2b2ff04ebb64e7fe9b251dca303 new file mode 100755 index 0000000..ab4a1bd Binary files /dev/null and b/.git_disabled/objects/3c/af7d984c15e2b2ff04ebb64e7fe9b251dca303 differ diff --git a/.git_disabled/objects/3c/b165f6ac6151929018d2f5fd2cd65b7514b46c b/.git_disabled/objects/3c/b165f6ac6151929018d2f5fd2cd65b7514b46c new file mode 100755 index 0000000..a55468e Binary files /dev/null and b/.git_disabled/objects/3c/b165f6ac6151929018d2f5fd2cd65b7514b46c differ diff --git a/.git_disabled/objects/3c/b2b23fbe4031b5b194a892e4865526b19f87a1 b/.git_disabled/objects/3c/b2b23fbe4031b5b194a892e4865526b19f87a1 new file mode 100755 index 0000000..5f7f45d Binary files /dev/null and b/.git_disabled/objects/3c/b2b23fbe4031b5b194a892e4865526b19f87a1 differ diff --git a/.git_disabled/objects/3c/c5ed689131f36bbeeebf14726c7e227351322c b/.git_disabled/objects/3c/c5ed689131f36bbeeebf14726c7e227351322c new file mode 100755 index 0000000..1a7d4e7 Binary files /dev/null and b/.git_disabled/objects/3c/c5ed689131f36bbeeebf14726c7e227351322c differ diff --git a/.git_disabled/objects/3c/c630d4dec7ab39da1debb5696b89abb2938e7b b/.git_disabled/objects/3c/c630d4dec7ab39da1debb5696b89abb2938e7b new file mode 100755 index 0000000..1bf379e Binary files /dev/null and b/.git_disabled/objects/3c/c630d4dec7ab39da1debb5696b89abb2938e7b differ diff --git a/.git_disabled/objects/3c/e077e2b2413bded08b0015b37633e515214a9d b/.git_disabled/objects/3c/e077e2b2413bded08b0015b37633e515214a9d new file mode 100755 index 0000000..45edc28 Binary files /dev/null and b/.git_disabled/objects/3c/e077e2b2413bded08b0015b37633e515214a9d differ diff --git a/.git_disabled/objects/3c/f1563554cb767ba7b3d298b023154a3c837d0a b/.git_disabled/objects/3c/f1563554cb767ba7b3d298b023154a3c837d0a new file mode 100755 index 0000000..1638e66 Binary files /dev/null and b/.git_disabled/objects/3c/f1563554cb767ba7b3d298b023154a3c837d0a differ diff --git a/.git_disabled/objects/3c/f6d64ea25a15bcfe04ea89f2622648646637d2 b/.git_disabled/objects/3c/f6d64ea25a15bcfe04ea89f2622648646637d2 new file mode 100755 index 0000000..be589a9 Binary files /dev/null and b/.git_disabled/objects/3c/f6d64ea25a15bcfe04ea89f2622648646637d2 differ diff --git a/.git_disabled/objects/3d/05279a0a95009d47bb0534d0afc831284393fe b/.git_disabled/objects/3d/05279a0a95009d47bb0534d0afc831284393fe new file mode 100755 index 0000000..a6dc1f0 Binary files /dev/null and b/.git_disabled/objects/3d/05279a0a95009d47bb0534d0afc831284393fe differ diff --git a/.git_disabled/objects/3d/17bb7c5bfe411c4e6fc2c45890e0d4f6a9ffaa b/.git_disabled/objects/3d/17bb7c5bfe411c4e6fc2c45890e0d4f6a9ffaa new file mode 100755 index 0000000..dfce39d --- /dev/null +++ b/.git_disabled/objects/3d/17bb7c5bfe411c4e6fc2c45890e0d4f6a9ffaa @@ -0,0 +1,2 @@ +xm +0] \\5wm1KoohAAk]hp\Q4sF͔FkǂZ(G 1j6=ʐT ^陉esK@rۺR<4ɽ<;w#^{x p%V QUsRUWr +ٱ` -( RSj-A/+ȹ.7PTڂGES2CM8 +k+s8___Ǫ"5X髹hc̼v?UQE1fEKr y!5/a<p\;1vx>*piZXV52 ,/soHVVkəp$x<= .fpte D+f\ưTQe6*(E?qz]<MIlΣZz k]S,sJ-G !oFoa\*CRz\>9tJ.6Ej;I&q^m*LdZv2Y0a*ဌ~(q6DmKqWګv_[N \ No newline at end of file diff --git a/.git_disabled/objects/3d/89ff86bb01c3663c47fecfa7d434ebdbe767e9 b/.git_disabled/objects/3d/89ff86bb01c3663c47fecfa7d434ebdbe767e9 new file mode 100755 index 0000000..00a37f3 --- /dev/null +++ b/.git_disabled/objects/3d/89ff86bb01c3663c47fecfa7d434ebdbe767e9 @@ -0,0 +1 @@ +x+)JMU00`040075UL I+d/akd.6UTRi_Mnܗ&*tTIJnV2H Dvzu~r"UWRZUrfKyLbwyЦ\+w wQqG/ĥM|J4niOF \ No newline at end of file diff --git a/.git_disabled/objects/3d/aa042b0bbd595cf629c47cf5db387af4c0db9a b/.git_disabled/objects/3d/aa042b0bbd595cf629c47cf5db387af4c0db9a new file mode 100755 index 0000000..a5b07ce Binary files /dev/null and b/.git_disabled/objects/3d/aa042b0bbd595cf629c47cf5db387af4c0db9a differ diff --git a/.git_disabled/objects/3d/c6bf698c4a7357ccb057574c6afc9742a0948d b/.git_disabled/objects/3d/c6bf698c4a7357ccb057574c6afc9742a0948d new file mode 100755 index 0000000..306c63c Binary files /dev/null and b/.git_disabled/objects/3d/c6bf698c4a7357ccb057574c6afc9742a0948d differ diff --git a/.git_disabled/objects/3d/c7dedce310ebbbfeac4591a8480518d19c4384 b/.git_disabled/objects/3d/c7dedce310ebbbfeac4591a8480518d19c4384 new file mode 100755 index 0000000..50e4f1c Binary files /dev/null and b/.git_disabled/objects/3d/c7dedce310ebbbfeac4591a8480518d19c4384 differ diff --git a/.git_disabled/objects/3d/c8382093a4f28f6e67c4f9f021a9ec3d40bbc0 b/.git_disabled/objects/3d/c8382093a4f28f6e67c4f9f021a9ec3d40bbc0 new file mode 100755 index 0000000..9b70d52 Binary files /dev/null and b/.git_disabled/objects/3d/c8382093a4f28f6e67c4f9f021a9ec3d40bbc0 differ diff --git a/.git_disabled/objects/3d/c9bf0731c1ee5640069b873dc70bd11af64710 b/.git_disabled/objects/3d/c9bf0731c1ee5640069b873dc70bd11af64710 new file mode 100755 index 0000000..fd02734 Binary files /dev/null and b/.git_disabled/objects/3d/c9bf0731c1ee5640069b873dc70bd11af64710 differ diff --git a/.git_disabled/objects/3d/da04796c522340185b13ea1c5ea6184f4b0478 b/.git_disabled/objects/3d/da04796c522340185b13ea1c5ea6184f4b0478 new file mode 100755 index 0000000..ab3f317 Binary files /dev/null and b/.git_disabled/objects/3d/da04796c522340185b13ea1c5ea6184f4b0478 differ diff --git a/.git_disabled/objects/3d/db859881b7b04e40f11d98fb0998283803f3f4 b/.git_disabled/objects/3d/db859881b7b04e40f11d98fb0998283803f3f4 new file mode 100755 index 0000000..effe98b Binary files /dev/null and b/.git_disabled/objects/3d/db859881b7b04e40f11d98fb0998283803f3f4 differ diff --git a/.git_disabled/objects/3d/dc8e075a6d25d40372797e8f4c1e6bdd92300c b/.git_disabled/objects/3d/dc8e075a6d25d40372797e8f4c1e6bdd92300c new file mode 100755 index 0000000..1bb0fd2 Binary files /dev/null and b/.git_disabled/objects/3d/dc8e075a6d25d40372797e8f4c1e6bdd92300c differ diff --git a/.git_disabled/objects/3d/dd05532d1c231dda778245319ac9dd05c42dc4 b/.git_disabled/objects/3d/dd05532d1c231dda778245319ac9dd05c42dc4 new file mode 100755 index 0000000..a772dd0 --- /dev/null +++ b/.git_disabled/objects/3d/dd05532d1c231dda778245319ac9dd05c42dc4 @@ -0,0 +1,3 @@ +xR]k0ݳ~]8u2 cc0FF2D>\Iȿm(az{=R`@++uՁ>r˵2vƸdb*hsH,Ks1H_9$q2I4,ɢ8qB'${%S홀Z?AUaӒCʒW=HԂ!~gP9hlE ݬ3Z^@gy_>ؾC޷F4TUBwvaXb-72aRNomWD2pzBp@ݵQ0Z n]&:bFׅQp&"f&_yUϤnlTľ&!I ' c.x^_p%WJcoZͦXݦJ[@RU1aʲKqD羇]GY#qP L E"gX&>.t6αF_71Uhܤ2ข1%>)M;{4 VNos [ԖU1ʐ CWu`Lb£"%#.ɀ}bّݴ}o=smصv:K,Eၨ@0@|APZ_ڹ}Ks@Se2bx` % +G!ί:WO&+Sˑ|Is%J 0N,xt+e]:[^4_eAUXRR.a~ /lxwhfl40KݎQTG̲ =j9l7n +0`[W׬|W%柿??>$n3UK3yc`%NPW| d%ST}Q?&rSRݢ*\E?nic2?xc_KΟܸLvh5(T`lƒjt7;yOygb W%QHp֟@Y:֠ޅѡvNvBr-^N\Z;uyd]׶w >8( \ No newline at end of file diff --git a/.git_disabled/objects/3e/8d72ab77be56707b9f5a84ab200fc2b7478ec8 b/.git_disabled/objects/3e/8d72ab77be56707b9f5a84ab200fc2b7478ec8 new file mode 100755 index 0000000..27653b7 Binary files /dev/null and b/.git_disabled/objects/3e/8d72ab77be56707b9f5a84ab200fc2b7478ec8 differ diff --git a/.git_disabled/objects/3e/a3304eb308940b6077f5bc802a5bad197076fa b/.git_disabled/objects/3e/a3304eb308940b6077f5bc802a5bad197076fa new file mode 100755 index 0000000..28a5e86 Binary files /dev/null and b/.git_disabled/objects/3e/a3304eb308940b6077f5bc802a5bad197076fa differ diff --git a/.git_disabled/objects/3e/a35bf254e939c78e3f0efb07fd0a867d4ce2a2 b/.git_disabled/objects/3e/a35bf254e939c78e3f0efb07fd0a867d4ce2a2 new file mode 100755 index 0000000..da73e45 --- /dev/null +++ b/.git_disabled/objects/3e/a35bf254e939c78e3f0efb07fd0a867d4ce2a2 @@ -0,0 +1,8 @@ +xKoWgb{GHH$#! $@)&(N:w2sczό53uWGh辻nEJء*RW=Ƙ +Ks}=2؞\_\2~*}f~?33^fwk447!0 LBSB ,LC3I9YbrdP e@`a< +Gu%q8#0'¨88x +N$L꾌*dzeqW*8lھQC[iþ-ET"飠 2*E-Z5VؖAS (VYmߥhUϷ}Eڱ%@]Mg* eMiǢTźw=GlGǣc/[vS{}g?MoVS*]sPD*<Ζ+ 5q(s`nuBY+!UM-[F;MKđJnfcρiii׃5A!XwXtp Ωr[j$&tr9:zȿ49ԫ*pXO`;Tݞugh8Ҏ"I\*ERs MGVi: WmʡMHIe^aiT.~[[Z;4=[> \#-/VazE=(ۿ +Yn49o4~0^S{l_䒊 FcU[䤗vb!*a_aNOxo%́}𚱟7-_u6\l8< c16٨Lw7^zW+寧r+{ѽŸbntF~J\ \ No newline at end of file diff --git a/.git_disabled/objects/3e/a8b578cc0cc36d9138193292ccb5731e9a3d5c b/.git_disabled/objects/3e/a8b578cc0cc36d9138193292ccb5731e9a3d5c new file mode 100755 index 0000000..6d31c2c Binary files /dev/null and b/.git_disabled/objects/3e/a8b578cc0cc36d9138193292ccb5731e9a3d5c differ diff --git a/.git_disabled/objects/3e/aeedb335f1910ee450cc84a7062a6d730fe81b b/.git_disabled/objects/3e/aeedb335f1910ee450cc84a7062a6d730fe81b new file mode 100755 index 0000000..7d4b1d4 Binary files /dev/null and b/.git_disabled/objects/3e/aeedb335f1910ee450cc84a7062a6d730fe81b differ diff --git a/.git_disabled/objects/3e/c07ae188f0357cd87c5f6d1265345a43fde359 b/.git_disabled/objects/3e/c07ae188f0357cd87c5f6d1265345a43fde359 new file mode 100755 index 0000000..018023d Binary files /dev/null and b/.git_disabled/objects/3e/c07ae188f0357cd87c5f6d1265345a43fde359 differ diff --git a/.git_disabled/objects/3e/c50ded3edf6225f2ba3b340ab1226301cec28a b/.git_disabled/objects/3e/c50ded3edf6225f2ba3b340ab1226301cec28a new file mode 100755 index 0000000..8cc0235 Binary files /dev/null and b/.git_disabled/objects/3e/c50ded3edf6225f2ba3b340ab1226301cec28a differ diff --git a/.git_disabled/objects/3e/c8c04cf47a1143bc05a3a3e9a490fc2831f1bf b/.git_disabled/objects/3e/c8c04cf47a1143bc05a3a3e9a490fc2831f1bf new file mode 100755 index 0000000..25f5447 Binary files /dev/null and b/.git_disabled/objects/3e/c8c04cf47a1143bc05a3a3e9a490fc2831f1bf differ diff --git a/.git_disabled/objects/3e/d1cd8c02cd6f518877eb14a69212298f3a9b2e b/.git_disabled/objects/3e/d1cd8c02cd6f518877eb14a69212298f3a9b2e new file mode 100755 index 0000000..3e57507 Binary files /dev/null and b/.git_disabled/objects/3e/d1cd8c02cd6f518877eb14a69212298f3a9b2e differ diff --git a/.git_disabled/objects/3e/ed9e3c31d4ff8ac7e4ecd20c107c09cb1724bc b/.git_disabled/objects/3e/ed9e3c31d4ff8ac7e4ecd20c107c09cb1724bc new file mode 100755 index 0000000..ca5778e Binary files /dev/null and b/.git_disabled/objects/3e/ed9e3c31d4ff8ac7e4ecd20c107c09cb1724bc differ diff --git a/.git_disabled/objects/3f/0d9bb39eae8d60816033b7e7371859e58c0938 b/.git_disabled/objects/3f/0d9bb39eae8d60816033b7e7371859e58c0938 new file mode 100755 index 0000000..fe9cd60 Binary files /dev/null and b/.git_disabled/objects/3f/0d9bb39eae8d60816033b7e7371859e58c0938 differ diff --git a/.git_disabled/objects/3f/2931a24817cfd6abdd86389f857181bf7e7795 b/.git_disabled/objects/3f/2931a24817cfd6abdd86389f857181bf7e7795 new file mode 100755 index 0000000..cc6b57c Binary files /dev/null and b/.git_disabled/objects/3f/2931a24817cfd6abdd86389f857181bf7e7795 differ diff --git a/.git_disabled/objects/3f/2e6715733fff105cc3bc576fedb089a1fd4c4f b/.git_disabled/objects/3f/2e6715733fff105cc3bc576fedb089a1fd4c4f new file mode 100755 index 0000000..e79300d Binary files /dev/null and b/.git_disabled/objects/3f/2e6715733fff105cc3bc576fedb089a1fd4c4f differ diff --git a/.git_disabled/objects/3f/5f836a5863023b605df1d76d8b93dcc3870598 b/.git_disabled/objects/3f/5f836a5863023b605df1d76d8b93dcc3870598 new file mode 100755 index 0000000..5df77d1 Binary files /dev/null and b/.git_disabled/objects/3f/5f836a5863023b605df1d76d8b93dcc3870598 differ diff --git a/.git_disabled/objects/3f/621b478bac84e9b9781ddf012eef937bd329fe b/.git_disabled/objects/3f/621b478bac84e9b9781ddf012eef937bd329fe new file mode 100755 index 0000000..262c7cc Binary files /dev/null and b/.git_disabled/objects/3f/621b478bac84e9b9781ddf012eef937bd329fe differ diff --git a/.git_disabled/objects/3f/69668bdfd789f514450477caffc8fde885c0cc b/.git_disabled/objects/3f/69668bdfd789f514450477caffc8fde885c0cc new file mode 100755 index 0000000..9d6f48a Binary files /dev/null and b/.git_disabled/objects/3f/69668bdfd789f514450477caffc8fde885c0cc differ diff --git a/.git_disabled/objects/3f/71acd9108722839234ec6c0385c78493756eba b/.git_disabled/objects/3f/71acd9108722839234ec6c0385c78493756eba new file mode 100755 index 0000000..e8bf5b1 Binary files /dev/null and b/.git_disabled/objects/3f/71acd9108722839234ec6c0385c78493756eba differ diff --git a/.git_disabled/objects/3f/7816a87ad2dafc2872589a7c63ffd8d9fa6175 b/.git_disabled/objects/3f/7816a87ad2dafc2872589a7c63ffd8d9fa6175 new file mode 100755 index 0000000..284253e Binary files /dev/null and b/.git_disabled/objects/3f/7816a87ad2dafc2872589a7c63ffd8d9fa6175 differ diff --git a/.git_disabled/objects/3f/8608ff8df94406e07898e44e0c26b31549dc38 b/.git_disabled/objects/3f/8608ff8df94406e07898e44e0c26b31549dc38 new file mode 100755 index 0000000..30ad7e4 Binary files /dev/null and b/.git_disabled/objects/3f/8608ff8df94406e07898e44e0c26b31549dc38 differ diff --git a/.git_disabled/objects/3f/883ae930bc17a33e40a68aacd0bbd1adf5602f b/.git_disabled/objects/3f/883ae930bc17a33e40a68aacd0bbd1adf5602f new file mode 100755 index 0000000..b45c1d0 Binary files /dev/null and b/.git_disabled/objects/3f/883ae930bc17a33e40a68aacd0bbd1adf5602f differ diff --git a/.git_disabled/objects/3f/b01a9a9f8b85a3d514843a100ff0c577f16782 b/.git_disabled/objects/3f/b01a9a9f8b85a3d514843a100ff0c577f16782 new file mode 100755 index 0000000..7ddd8c9 Binary files /dev/null and b/.git_disabled/objects/3f/b01a9a9f8b85a3d514843a100ff0c577f16782 differ diff --git a/.git_disabled/objects/3f/b91728b44bc29fa87cf29bfc2cb4b9417fa3a5 b/.git_disabled/objects/3f/b91728b44bc29fa87cf29bfc2cb4b9417fa3a5 new file mode 100755 index 0000000..7b82dbf Binary files /dev/null and b/.git_disabled/objects/3f/b91728b44bc29fa87cf29bfc2cb4b9417fa3a5 differ diff --git a/.git_disabled/objects/3f/cfe2db7c50f2a82bb2d2e3ecc78de43a4325ed b/.git_disabled/objects/3f/cfe2db7c50f2a82bb2d2e3ecc78de43a4325ed new file mode 100755 index 0000000..9b2f04d --- /dev/null +++ b/.git_disabled/objects/3f/cfe2db7c50f2a82bb2d2e3ecc78de43a4325ed @@ -0,0 +1,5 @@ +x}TMk@ٿb*_) )6Jf%ֻbw61>\ȡ?ɖ-c7WL >zӅ) 5Ivb.dLLDQ cq ]Xv0?$J8& +c7R 7ʔbc=* !!(Ց|<"vp}jHh!}-{DWaR;1m1)&֛ׄ 8qZnmu 0ڛ< +P--%|gY5L2c!9+ +m1$W::!?qc;e!%@]P9lբۊtNE: ANY/iK_јF Հ9+OC+NHPu?O}ٿn?5 }Qp_YF6.H]8 o^4ص (v ++5o_> ; E>Mޏ{^D W.'aTZI"=~xcD=K?A=t:, cLCxuH={-6p0>S#u+!ĤRo.>yPo-GfDTYITuv? OΌ05ʂ; ǚSq嫢p;5n,ZYمB 4TW8 -5ͻ:1Yؚ \ No newline at end of file diff --git a/.git_disabled/objects/3f/d77ebce50c951d2f81bfe79480e934e2412778 b/.git_disabled/objects/3f/d77ebce50c951d2f81bfe79480e934e2412778 new file mode 100755 index 0000000..1e897c2 --- /dev/null +++ b/.git_disabled/objects/3f/d77ebce50c951d2f81bfe79480e934e2412778 @@ -0,0 +1,5 @@ +xV͎6O1/M CsJ+ASc%*$e챷VԠq{( }>AC+oboR%@p!x1z,WpW +xFUBA?;G@] +^ ฿\UB`k9yACso/ᠵy|U[BqTN3Ʋb“L)m9S}DJܢPBce1,RA9h~LR^g@mh9‰./:/'ISxzԄ5V &מ\b;E3H9)%5Ѱ`r^5inV8q\\bHFGzQ;&%kB&_%blg3qr&TߓIeu7VuB&, zs*bcky4X+cKn VoqcON$zhr/l!FsYe ,h+$&y#jLLψG-tlQ_"ȁZAcqA XTp1k6\'>؁NfBbA6IV0mvhbZ<.}l03xMHK|\y;ȺfVٿJ\dIZk$mqT4AEYENI x +iZ=q~ިaRa]-c%^?#v8yw׃}rOJ-ykjw>P Y ckO(bl \ No newline at end of file diff --git a/.git_disabled/objects/3f/e74a7e3edc28c00507f9c8c36a57b2244da11a b/.git_disabled/objects/3f/e74a7e3edc28c00507f9c8c36a57b2244da11a new file mode 100755 index 0000000..856ecd7 Binary files /dev/null and b/.git_disabled/objects/3f/e74a7e3edc28c00507f9c8c36a57b2244da11a differ diff --git a/.git_disabled/objects/3f/f60d4d9dfc3c15d416c9fc4a6b3b7f79a9fdb1 b/.git_disabled/objects/3f/f60d4d9dfc3c15d416c9fc4a6b3b7f79a9fdb1 new file mode 100755 index 0000000..9b263aa Binary files /dev/null and b/.git_disabled/objects/3f/f60d4d9dfc3c15d416c9fc4a6b3b7f79a9fdb1 differ diff --git a/.git_disabled/objects/3f/ffa5a3ecf4ee7a56a77bfc66eb06b54aaa140d b/.git_disabled/objects/3f/ffa5a3ecf4ee7a56a77bfc66eb06b54aaa140d new file mode 100755 index 0000000..4dd4aaa Binary files /dev/null and b/.git_disabled/objects/3f/ffa5a3ecf4ee7a56a77bfc66eb06b54aaa140d differ diff --git a/.git_disabled/objects/40/18a09c6fb1e0ef1b03ab8d84b13ebef4031f7c b/.git_disabled/objects/40/18a09c6fb1e0ef1b03ab8d84b13ebef4031f7c new file mode 100755 index 0000000..1641591 Binary files /dev/null and b/.git_disabled/objects/40/18a09c6fb1e0ef1b03ab8d84b13ebef4031f7c differ diff --git a/.git_disabled/objects/40/2eda1edae1373cfca955ed30a509bdf7b4fe41 b/.git_disabled/objects/40/2eda1edae1373cfca955ed30a509bdf7b4fe41 new file mode 100755 index 0000000..ae08b46 Binary files /dev/null and b/.git_disabled/objects/40/2eda1edae1373cfca955ed30a509bdf7b4fe41 differ diff --git a/.git_disabled/objects/40/2fa4a3d55ae7be78a277383b2c432843d0f62f b/.git_disabled/objects/40/2fa4a3d55ae7be78a277383b2c432843d0f62f new file mode 100755 index 0000000..1d6d428 Binary files /dev/null and b/.git_disabled/objects/40/2fa4a3d55ae7be78a277383b2c432843d0f62f differ diff --git a/.git_disabled/objects/40/3228fc64c536b8b97fd92ba883738ceba86ca7 b/.git_disabled/objects/40/3228fc64c536b8b97fd92ba883738ceba86ca7 new file mode 100755 index 0000000..17d91cc Binary files /dev/null and b/.git_disabled/objects/40/3228fc64c536b8b97fd92ba883738ceba86ca7 differ diff --git a/.git_disabled/objects/40/411c8698ed8d67c9f97cb3af6cd7e49e8965b9 b/.git_disabled/objects/40/411c8698ed8d67c9f97cb3af6cd7e49e8965b9 new file mode 100755 index 0000000..afd4fec Binary files /dev/null and b/.git_disabled/objects/40/411c8698ed8d67c9f97cb3af6cd7e49e8965b9 differ diff --git a/.git_disabled/objects/40/567725cac18d87b81a6371d73435d68687ab7e b/.git_disabled/objects/40/567725cac18d87b81a6371d73435d68687ab7e new file mode 100755 index 0000000..dfab14e Binary files /dev/null and b/.git_disabled/objects/40/567725cac18d87b81a6371d73435d68687ab7e differ diff --git a/.git_disabled/objects/40/5bb790bc0dae260e65a5409979a38e5dab20ac b/.git_disabled/objects/40/5bb790bc0dae260e65a5409979a38e5dab20ac new file mode 100755 index 0000000..3115685 Binary files /dev/null and b/.git_disabled/objects/40/5bb790bc0dae260e65a5409979a38e5dab20ac differ diff --git a/.git_disabled/objects/40/5e3b7d80c6c904791c8174c45216b10984d610 b/.git_disabled/objects/40/5e3b7d80c6c904791c8174c45216b10984d610 new file mode 100755 index 0000000..94e7fc9 Binary files /dev/null and b/.git_disabled/objects/40/5e3b7d80c6c904791c8174c45216b10984d610 differ diff --git a/.git_disabled/objects/40/66fa120772e3ff70125944bd96557b37619889 b/.git_disabled/objects/40/66fa120772e3ff70125944bd96557b37619889 new file mode 100755 index 0000000..75417cb Binary files /dev/null and b/.git_disabled/objects/40/66fa120772e3ff70125944bd96557b37619889 differ diff --git a/.git_disabled/objects/40/69ea21c4496ccc73014dd90dfef512470964a9 b/.git_disabled/objects/40/69ea21c4496ccc73014dd90dfef512470964a9 new file mode 100755 index 0000000..6046508 Binary files /dev/null and b/.git_disabled/objects/40/69ea21c4496ccc73014dd90dfef512470964a9 differ diff --git a/.git_disabled/objects/40/7345490f5f6d326f51c7a7ea89bb642e179bb4 b/.git_disabled/objects/40/7345490f5f6d326f51c7a7ea89bb642e179bb4 new file mode 100755 index 0000000..fb2a996 Binary files /dev/null and b/.git_disabled/objects/40/7345490f5f6d326f51c7a7ea89bb642e179bb4 differ diff --git a/.git_disabled/objects/40/7c2d45075e9d0b657ddc1347c05fd2ffedc7d1 b/.git_disabled/objects/40/7c2d45075e9d0b657ddc1347c05fd2ffedc7d1 new file mode 100755 index 0000000..d1a10d0 Binary files /dev/null and b/.git_disabled/objects/40/7c2d45075e9d0b657ddc1347c05fd2ffedc7d1 differ diff --git a/.git_disabled/objects/40/869ad3b10006503d91656777311bf6332ad570 b/.git_disabled/objects/40/869ad3b10006503d91656777311bf6332ad570 new file mode 100755 index 0000000..9eccbe8 --- /dev/null +++ b/.git_disabled/objects/40/869ad3b10006503d91656777311bf6332ad570 @@ -0,0 +1,2 @@ +x +aR4KKD+I;% V\.)WR\gxWjvWbYR >OEpܯxڭpH@$  H@$  H@$  H@!H q 4d/Tǻ?]ԺMYWf7$sr`w?.b]9uuf]غ6pj8 Y>A>ֽ \ No newline at end of file diff --git a/.git_disabled/objects/40/974d4b827d185eb256221783b9bcef6a05758f b/.git_disabled/objects/40/974d4b827d185eb256221783b9bcef6a05758f new file mode 100755 index 0000000..e2b57ca Binary files /dev/null and b/.git_disabled/objects/40/974d4b827d185eb256221783b9bcef6a05758f differ diff --git a/.git_disabled/objects/40/a47a1d20073e26d0d0432642db21b2fd8b144b b/.git_disabled/objects/40/a47a1d20073e26d0d0432642db21b2fd8b144b new file mode 100755 index 0000000..3b76521 Binary files /dev/null and b/.git_disabled/objects/40/a47a1d20073e26d0d0432642db21b2fd8b144b differ diff --git a/.git_disabled/objects/40/b0e5c2156cd5e0bd4e221d451d80d9220c7929 b/.git_disabled/objects/40/b0e5c2156cd5e0bd4e221d451d80d9220c7929 new file mode 100755 index 0000000..1279aeb Binary files /dev/null and b/.git_disabled/objects/40/b0e5c2156cd5e0bd4e221d451d80d9220c7929 differ diff --git a/.git_disabled/objects/40/ba4916b92811deecbeeb5d788c3455cbd0196c b/.git_disabled/objects/40/ba4916b92811deecbeeb5d788c3455cbd0196c new file mode 100755 index 0000000..3cccc5c Binary files /dev/null and b/.git_disabled/objects/40/ba4916b92811deecbeeb5d788c3455cbd0196c differ diff --git a/.git_disabled/objects/40/c9e323972d74d23d0a6f634ad97f00360c3f5f b/.git_disabled/objects/40/c9e323972d74d23d0a6f634ad97f00360c3f5f new file mode 100755 index 0000000..ebbfbd4 Binary files /dev/null and b/.git_disabled/objects/40/c9e323972d74d23d0a6f634ad97f00360c3f5f differ diff --git a/.git_disabled/objects/40/cec4c6b8db44c3775c5a0fdad2cb467d4c374a b/.git_disabled/objects/40/cec4c6b8db44c3775c5a0fdad2cb467d4c374a new file mode 100755 index 0000000..9f6ee3a --- /dev/null +++ b/.git_disabled/objects/40/cec4c6b8db44c3775c5a0fdad2cb467d4c374a @@ -0,0 +1,3 @@ +xSN0ܯC$,vhC9D !4qN>R)@-ht3~ yIR8c*U_(6蕨M|{'5)մ'SQ_#ŅM_mk$le0Rl'ot \ No newline at end of file diff --git a/.git_disabled/objects/40/d7bd8b933ff07d26790cd3802dd16889e50ef5 b/.git_disabled/objects/40/d7bd8b933ff07d26790cd3802dd16889e50ef5 new file mode 100755 index 0000000..fcd6ea0 Binary files /dev/null and b/.git_disabled/objects/40/d7bd8b933ff07d26790cd3802dd16889e50ef5 differ diff --git a/.git_disabled/objects/40/fcca9f1e52de48bb58490430250d6f117cce00 b/.git_disabled/objects/40/fcca9f1e52de48bb58490430250d6f117cce00 new file mode 100755 index 0000000..ffb0e25 Binary files /dev/null and b/.git_disabled/objects/40/fcca9f1e52de48bb58490430250d6f117cce00 differ diff --git a/.git_disabled/objects/41/093984024fa7d00364ebfee37fb241188ba9c0 b/.git_disabled/objects/41/093984024fa7d00364ebfee37fb241188ba9c0 new file mode 100755 index 0000000..dad47e1 Binary files /dev/null and b/.git_disabled/objects/41/093984024fa7d00364ebfee37fb241188ba9c0 differ diff --git a/.git_disabled/objects/41/3074099554200cad4f850db202ce85c3dd2fdc b/.git_disabled/objects/41/3074099554200cad4f850db202ce85c3dd2fdc new file mode 100755 index 0000000..1d5d755 Binary files /dev/null and b/.git_disabled/objects/41/3074099554200cad4f850db202ce85c3dd2fdc differ diff --git a/.git_disabled/objects/41/45c6645fcaa7838e1f631978f7c6e4de69d693 b/.git_disabled/objects/41/45c6645fcaa7838e1f631978f7c6e4de69d693 new file mode 100755 index 0000000..3725f6b Binary files /dev/null and b/.git_disabled/objects/41/45c6645fcaa7838e1f631978f7c6e4de69d693 differ diff --git a/.git_disabled/objects/41/4ab4d106ae1e292b31fa3c31694850b2e457f8 b/.git_disabled/objects/41/4ab4d106ae1e292b31fa3c31694850b2e457f8 new file mode 100755 index 0000000..22277f0 Binary files /dev/null and b/.git_disabled/objects/41/4ab4d106ae1e292b31fa3c31694850b2e457f8 differ diff --git a/.git_disabled/objects/41/79f3a3ec28427e4ba30ed47bcfb14ee47b2030 b/.git_disabled/objects/41/79f3a3ec28427e4ba30ed47bcfb14ee47b2030 new file mode 100755 index 0000000..e261658 Binary files /dev/null and b/.git_disabled/objects/41/79f3a3ec28427e4ba30ed47bcfb14ee47b2030 differ diff --git a/.git_disabled/objects/41/889d9634be7740aba237931bf36683ef512f6b b/.git_disabled/objects/41/889d9634be7740aba237931bf36683ef512f6b new file mode 100755 index 0000000..8ac3302 Binary files /dev/null and b/.git_disabled/objects/41/889d9634be7740aba237931bf36683ef512f6b differ diff --git a/.git_disabled/objects/41/9d382de6e515662ea9b0f5f35451428e82fe8b b/.git_disabled/objects/41/9d382de6e515662ea9b0f5f35451428e82fe8b new file mode 100755 index 0000000..12a70b0 Binary files /dev/null and b/.git_disabled/objects/41/9d382de6e515662ea9b0f5f35451428e82fe8b differ diff --git a/.git_disabled/objects/41/b0952ac60aa758d3eb6c3420e6232f6193d516 b/.git_disabled/objects/41/b0952ac60aa758d3eb6c3420e6232f6193d516 new file mode 100755 index 0000000..278eab5 Binary files /dev/null and b/.git_disabled/objects/41/b0952ac60aa758d3eb6c3420e6232f6193d516 differ diff --git a/.git_disabled/objects/41/c0a9147e9421ccb3a52222db295e7531955f32 b/.git_disabled/objects/41/c0a9147e9421ccb3a52222db295e7531955f32 new file mode 100755 index 0000000..b4b6bb3 Binary files /dev/null and b/.git_disabled/objects/41/c0a9147e9421ccb3a52222db295e7531955f32 differ diff --git a/.git_disabled/objects/41/cc9ccb83b4e9de9d75f07f7ff29c03af9f9e37 b/.git_disabled/objects/41/cc9ccb83b4e9de9d75f07f7ff29c03af9f9e37 new file mode 100755 index 0000000..eaa2e9d Binary files /dev/null and b/.git_disabled/objects/41/cc9ccb83b4e9de9d75f07f7ff29c03af9f9e37 differ diff --git a/.git_disabled/objects/41/d53847ed5f2b9665d043bf04eeedefdca84891 b/.git_disabled/objects/41/d53847ed5f2b9665d043bf04eeedefdca84891 new file mode 100755 index 0000000..1650845 Binary files /dev/null and b/.git_disabled/objects/41/d53847ed5f2b9665d043bf04eeedefdca84891 differ diff --git a/.git_disabled/objects/41/eb45a0a8534de7cb67aae8d46cb60b0251e03e b/.git_disabled/objects/41/eb45a0a8534de7cb67aae8d46cb60b0251e03e new file mode 100755 index 0000000..3881ef1 Binary files /dev/null and b/.git_disabled/objects/41/eb45a0a8534de7cb67aae8d46cb60b0251e03e differ diff --git a/.git_disabled/objects/41/efcc42b3aefb01258bed4a44ce57d16f932da5 b/.git_disabled/objects/41/efcc42b3aefb01258bed4a44ce57d16f932da5 new file mode 100755 index 0000000..16f559a Binary files /dev/null and b/.git_disabled/objects/41/efcc42b3aefb01258bed4a44ce57d16f932da5 differ diff --git a/.git_disabled/objects/41/f613b0a9ffbfadb6a223a895dd494453b61b0f b/.git_disabled/objects/41/f613b0a9ffbfadb6a223a895dd494453b61b0f new file mode 100755 index 0000000..600ffb3 Binary files /dev/null and b/.git_disabled/objects/41/f613b0a9ffbfadb6a223a895dd494453b61b0f differ diff --git a/.git_disabled/objects/41/fa18f8a714bb5e562e9f32de4a21792275f063 b/.git_disabled/objects/41/fa18f8a714bb5e562e9f32de4a21792275f063 new file mode 100755 index 0000000..6f6af18 Binary files /dev/null and b/.git_disabled/objects/41/fa18f8a714bb5e562e9f32de4a21792275f063 differ diff --git a/.git_disabled/objects/41/fec41b60b890e7e55f30609ca6ea55ce7d286d b/.git_disabled/objects/41/fec41b60b890e7e55f30609ca6ea55ce7d286d new file mode 100755 index 0000000..fae69a7 Binary files /dev/null and b/.git_disabled/objects/41/fec41b60b890e7e55f30609ca6ea55ce7d286d differ diff --git a/.git_disabled/objects/42/1fe019fa217ab76979818e5ac7e592432ead52 b/.git_disabled/objects/42/1fe019fa217ab76979818e5ac7e592432ead52 new file mode 100755 index 0000000..64775ed Binary files /dev/null and b/.git_disabled/objects/42/1fe019fa217ab76979818e5ac7e592432ead52 differ diff --git a/.git_disabled/objects/42/22816ab72f6dc96e16e43e06ae6a8b4059b3cd b/.git_disabled/objects/42/22816ab72f6dc96e16e43e06ae6a8b4059b3cd new file mode 100755 index 0000000..89c0236 Binary files /dev/null and b/.git_disabled/objects/42/22816ab72f6dc96e16e43e06ae6a8b4059b3cd differ diff --git a/.git_disabled/objects/42/316fb21d3814964c2080fd434dd274229cfcef b/.git_disabled/objects/42/316fb21d3814964c2080fd434dd274229cfcef new file mode 100755 index 0000000..ac6976f Binary files /dev/null and b/.git_disabled/objects/42/316fb21d3814964c2080fd434dd274229cfcef differ diff --git a/.git_disabled/objects/42/5f598fa38598da5113bbd654be36d94801b1cb b/.git_disabled/objects/42/5f598fa38598da5113bbd654be36d94801b1cb new file mode 100755 index 0000000..e9f2d6f Binary files /dev/null and b/.git_disabled/objects/42/5f598fa38598da5113bbd654be36d94801b1cb differ diff --git a/.git_disabled/objects/42/66d908a83930c31f5591ff499a9cfb5d01ead7 b/.git_disabled/objects/42/66d908a83930c31f5591ff499a9cfb5d01ead7 new file mode 100755 index 0000000..4cb3e5c Binary files /dev/null and b/.git_disabled/objects/42/66d908a83930c31f5591ff499a9cfb5d01ead7 differ diff --git a/.git_disabled/objects/42/7f175a9f535ad4849a8c8045fa70201d30331b b/.git_disabled/objects/42/7f175a9f535ad4849a8c8045fa70201d30331b new file mode 100755 index 0000000..02bf2c6 Binary files /dev/null and b/.git_disabled/objects/42/7f175a9f535ad4849a8c8045fa70201d30331b differ diff --git a/.git_disabled/objects/42/8427e499bdb0e21ab90c95987a3aa2127bb024 b/.git_disabled/objects/42/8427e499bdb0e21ab90c95987a3aa2127bb024 new file mode 100755 index 0000000..c234a0b Binary files /dev/null and b/.git_disabled/objects/42/8427e499bdb0e21ab90c95987a3aa2127bb024 differ diff --git a/.git_disabled/objects/42/bc9bb103d852eea93a084b4bad59826bcbe928 b/.git_disabled/objects/42/bc9bb103d852eea93a084b4bad59826bcbe928 new file mode 100755 index 0000000..f9c847e Binary files /dev/null and b/.git_disabled/objects/42/bc9bb103d852eea93a084b4bad59826bcbe928 differ diff --git a/.git_disabled/objects/42/c21e63f82eb6209533f16e26e78107a6e916ea b/.git_disabled/objects/42/c21e63f82eb6209533f16e26e78107a6e916ea new file mode 100755 index 0000000..ad93ef1 Binary files /dev/null and b/.git_disabled/objects/42/c21e63f82eb6209533f16e26e78107a6e916ea differ diff --git a/.git_disabled/objects/42/da96aa9397f979d002f8f6f477bc2359fec1d5 b/.git_disabled/objects/42/da96aa9397f979d002f8f6f477bc2359fec1d5 new file mode 100755 index 0000000..addeba4 Binary files /dev/null and b/.git_disabled/objects/42/da96aa9397f979d002f8f6f477bc2359fec1d5 differ diff --git a/.git_disabled/objects/42/e19200769d8fa06cdd749bf4e8c83230d93c3f b/.git_disabled/objects/42/e19200769d8fa06cdd749bf4e8c83230d93c3f new file mode 100755 index 0000000..023aa38 Binary files /dev/null and b/.git_disabled/objects/42/e19200769d8fa06cdd749bf4e8c83230d93c3f differ diff --git a/.git_disabled/objects/42/f14c1a1eac19f79779aeec1111d849eb4e40c9 b/.git_disabled/objects/42/f14c1a1eac19f79779aeec1111d849eb4e40c9 new file mode 100755 index 0000000..cddb01b Binary files /dev/null and b/.git_disabled/objects/42/f14c1a1eac19f79779aeec1111d849eb4e40c9 differ diff --git a/.git_disabled/objects/42/f9a0962126d0b623fc869b4f1ed309510a8820 b/.git_disabled/objects/42/f9a0962126d0b623fc869b4f1ed309510a8820 new file mode 100755 index 0000000..b4a4853 Binary files /dev/null and b/.git_disabled/objects/42/f9a0962126d0b623fc869b4f1ed309510a8820 differ diff --git a/.git_disabled/objects/43/094730458541fd387595dfd61c483f477b95f0 b/.git_disabled/objects/43/094730458541fd387595dfd61c483f477b95f0 new file mode 100755 index 0000000..0d49f55 Binary files /dev/null and b/.git_disabled/objects/43/094730458541fd387595dfd61c483f477b95f0 differ diff --git a/.git_disabled/objects/43/25f4208ef2eb896c7df7483d25621d61bd961f b/.git_disabled/objects/43/25f4208ef2eb896c7df7483d25621d61bd961f new file mode 100755 index 0000000..991f382 Binary files /dev/null and b/.git_disabled/objects/43/25f4208ef2eb896c7df7483d25621d61bd961f differ diff --git a/.git_disabled/objects/43/383d0aeb9e67064550f049d0f473e766523243 b/.git_disabled/objects/43/383d0aeb9e67064550f049d0f473e766523243 new file mode 100755 index 0000000..da7ce83 Binary files /dev/null and b/.git_disabled/objects/43/383d0aeb9e67064550f049d0f473e766523243 differ diff --git a/.git_disabled/objects/43/4afabfc36147c59dbe583a143ea344fdcf9cf2 b/.git_disabled/objects/43/4afabfc36147c59dbe583a143ea344fdcf9cf2 new file mode 100755 index 0000000..536cf10 Binary files /dev/null and b/.git_disabled/objects/43/4afabfc36147c59dbe583a143ea344fdcf9cf2 differ diff --git a/.git_disabled/objects/43/5ade28d17f611131fe21e332766addc8760d0f b/.git_disabled/objects/43/5ade28d17f611131fe21e332766addc8760d0f new file mode 100755 index 0000000..77fbea7 Binary files /dev/null and b/.git_disabled/objects/43/5ade28d17f611131fe21e332766addc8760d0f differ diff --git a/.git_disabled/objects/43/622c2aca020639bdaa4b3322908b26bc700b21 b/.git_disabled/objects/43/622c2aca020639bdaa4b3322908b26bc700b21 new file mode 100755 index 0000000..dbb813f --- /dev/null +++ b/.git_disabled/objects/43/622c2aca020639bdaa4b3322908b26bc700b21 @@ -0,0 +1,2 @@ +xmQKk0 ٿBK +!.Au̱2[aͿ_j7}:Y:M㩇aSg.T63hQFTkC0rH^X C\\cڅ1 qm#;p6QA$!(b]갑o];*ʆ`3<Wta4,;Ϊe䏍*Y~CZ;ƣ$'5Uc*5jtz-p{}@,SzL\;Ibl5ǀU%d cq \ No newline at end of file diff --git a/.git_disabled/objects/43/92a6c15ae9a71873f4685ae7cee23bcd7ec95f b/.git_disabled/objects/43/92a6c15ae9a71873f4685ae7cee23bcd7ec95f new file mode 100755 index 0000000..59ad19d Binary files /dev/null and b/.git_disabled/objects/43/92a6c15ae9a71873f4685ae7cee23bcd7ec95f differ diff --git a/.git_disabled/objects/43/a01c41a369a6740b5729f48fa1adf1d1d4e36a b/.git_disabled/objects/43/a01c41a369a6740b5729f48fa1adf1d1d4e36a new file mode 100755 index 0000000..5d2b188 --- /dev/null +++ b/.git_disabled/objects/43/a01c41a369a6740b5729f48fa1adf1d1d4e36a @@ -0,0 +1,3 @@ +xQMo0 ݙ_?$X4킶i]VvBhAaiRN{KJHgA+=M8яQ3i1氲~֐ǂ[X#FW_|G  +2IgKYsk>U$v=Y7n=rEveO|5OHqMl +muџ?57DVHhݿF,Ssr3-_>?Fŏ \ No newline at end of file diff --git a/.git_disabled/objects/43/adf225951fd7b03706678a5713ad87fd5d5442 b/.git_disabled/objects/43/adf225951fd7b03706678a5713ad87fd5d5442 new file mode 100755 index 0000000..b6181ec Binary files /dev/null and b/.git_disabled/objects/43/adf225951fd7b03706678a5713ad87fd5d5442 differ diff --git a/.git_disabled/objects/43/c4aa362bb721b12f6d78bd04c18d3c53dfdbbd b/.git_disabled/objects/43/c4aa362bb721b12f6d78bd04c18d3c53dfdbbd new file mode 100755 index 0000000..819205e Binary files /dev/null and b/.git_disabled/objects/43/c4aa362bb721b12f6d78bd04c18d3c53dfdbbd differ diff --git a/.git_disabled/objects/43/c4d0c374a125d5f182aaef387cf11cf4b1a8c5 b/.git_disabled/objects/43/c4d0c374a125d5f182aaef387cf11cf4b1a8c5 new file mode 100755 index 0000000..194025b Binary files /dev/null and b/.git_disabled/objects/43/c4d0c374a125d5f182aaef387cf11cf4b1a8c5 differ diff --git a/.git_disabled/objects/43/cd1035c62c12820e296c95b83724586727d1aa b/.git_disabled/objects/43/cd1035c62c12820e296c95b83724586727d1aa new file mode 100755 index 0000000..a7395ed --- /dev/null +++ b/.git_disabled/objects/43/cd1035c62c12820e296c95b83724586727d1aa @@ -0,0 +1,3 @@ +xUPj0Y_$9> BRHz6DdIH2ؗ괏t7E\YkSs߱)Vb\=BRHuI lkW# *mMi|V:B PEHEE[b fph#A:ڶ5A"wᒙZpP8RB'}ceeV\%QQ'9 +8dDLlotf@h&j6蕙uBY ҆(շ&y>4ytPIi€KJx _ځ +J6R´*htz;b*XQ?툁 hKXӀ0/Tmцp DnaIqXz_ +ڜG ÔgVUOpF](*%ep_ۺv;q \ No newline at end of file diff --git a/.git_disabled/objects/44/22177d313ef0bee7ea9a0f3e5a7ba95ed8b311 b/.git_disabled/objects/44/22177d313ef0bee7ea9a0f3e5a7ba95ed8b311 new file mode 100755 index 0000000..86549f1 Binary files /dev/null and b/.git_disabled/objects/44/22177d313ef0bee7ea9a0f3e5a7ba95ed8b311 differ diff --git a/.git_disabled/objects/44/849b5ddd2d039da050afdd57f46afc1f0dfd9c b/.git_disabled/objects/44/849b5ddd2d039da050afdd57f46afc1f0dfd9c new file mode 100755 index 0000000..d699bb6 Binary files /dev/null and b/.git_disabled/objects/44/849b5ddd2d039da050afdd57f46afc1f0dfd9c differ diff --git a/.git_disabled/objects/44/857fef28df21f044a83f9fa880a55fcf7cc36f b/.git_disabled/objects/44/857fef28df21f044a83f9fa880a55fcf7cc36f new file mode 100755 index 0000000..c4e2ee9 Binary files /dev/null and b/.git_disabled/objects/44/857fef28df21f044a83f9fa880a55fcf7cc36f differ diff --git a/.git_disabled/objects/44/aac64b4ad5dc4c28ba40a65167068415c0df78 b/.git_disabled/objects/44/aac64b4ad5dc4c28ba40a65167068415c0df78 new file mode 100755 index 0000000..7e9f55d Binary files /dev/null and b/.git_disabled/objects/44/aac64b4ad5dc4c28ba40a65167068415c0df78 differ diff --git a/.git_disabled/objects/44/cb32752ef1a1ab48002f2e378eb98294526067 b/.git_disabled/objects/44/cb32752ef1a1ab48002f2e378eb98294526067 new file mode 100755 index 0000000..c04bedf Binary files /dev/null and b/.git_disabled/objects/44/cb32752ef1a1ab48002f2e378eb98294526067 differ diff --git a/.git_disabled/objects/44/d4769e791312e8572bc5c24ed2efdc86819835 b/.git_disabled/objects/44/d4769e791312e8572bc5c24ed2efdc86819835 new file mode 100755 index 0000000..352b5d6 Binary files /dev/null and b/.git_disabled/objects/44/d4769e791312e8572bc5c24ed2efdc86819835 differ diff --git a/.git_disabled/objects/44/dc8052f4ec96bb7ef96325f614c3853750a9f4 b/.git_disabled/objects/44/dc8052f4ec96bb7ef96325f614c3853750a9f4 new file mode 100755 index 0000000..615ea70 --- /dev/null +++ b/.git_disabled/objects/44/dc8052f4ec96bb7ef96325f614c3853750a9f4 @@ -0,0 +1,13 @@ +xKU$!$4 +x "!B@(*ʈ +@pZkfi;w>VUΩ<|sr{/ J>BqS娺eYT j5@M&P j5@M&P j5@M&P j53|?u{+쥶` >ޖ9LacAChr VaSFZh +9` +:B X?OX0LacACh+X0)L` #`-40&q}1`KXf0 a  +?` 01!@3,as&0t0(~%ׂf0 n#  +PG1+X0)L` #`-4P`aKXf0 a  +?` 01!@,as&0t0(%aKXf0 a  +` &0Zj5@M&P j5@MI`PF)wm/eiA o߀:\mG]kW5vQ9۞R^kyO](~xk쟰f +?i {ݞs߷}A +\⿷࿳__!J7~2띺AmR}+]s?k܍'/ٓ=iȖ]?_{)9[꟰"a>e4__zP}xT}s>oyk~_ߗg*WCni}o?\ĞEϟRy|* ~>i]3}9Oh>ﵫ>?ߠgRO~'>./gj}=/q6\m_ߏ<?as(U?_)k5u?[ݴQJ)۳>}uykC{=Ox?Kʛq=2;_Ox{yh=3?t̯/ל>R~`O>ڕ/ҾHu->WAE<קBW]æ|מhOޟ'OړMܿt}=yy܏'6y{8lOٓ q<>'ȓ?_zg~&ng # \ No newline at end of file diff --git a/.git_disabled/objects/44/dd9bdc3039122cc98014c1439ca254313fd014 b/.git_disabled/objects/44/dd9bdc3039122cc98014c1439ca254313fd014 new file mode 100755 index 0000000..5b98d5d Binary files /dev/null and b/.git_disabled/objects/44/dd9bdc3039122cc98014c1439ca254313fd014 differ diff --git a/.git_disabled/objects/44/dffe3218e23a339b3bb668dabfabb7e8bc2db3 b/.git_disabled/objects/44/dffe3218e23a339b3bb668dabfabb7e8bc2db3 new file mode 100755 index 0000000..aeb7f61 Binary files /dev/null and b/.git_disabled/objects/44/dffe3218e23a339b3bb668dabfabb7e8bc2db3 differ diff --git a/.git_disabled/objects/44/ebd49d4391ad476462d4334e3a7a27f096c518 b/.git_disabled/objects/44/ebd49d4391ad476462d4334e3a7a27f096c518 new file mode 100755 index 0000000..49e4499 Binary files /dev/null and b/.git_disabled/objects/44/ebd49d4391ad476462d4334e3a7a27f096c518 differ diff --git a/.git_disabled/objects/45/06c6ac6368730264dcdf2dff30cec98da039ea b/.git_disabled/objects/45/06c6ac6368730264dcdf2dff30cec98da039ea new file mode 100755 index 0000000..03be079 Binary files /dev/null and b/.git_disabled/objects/45/06c6ac6368730264dcdf2dff30cec98da039ea differ diff --git a/.git_disabled/objects/45/1900ae1a05b2669439260066e3d3eeaf11f8c8 b/.git_disabled/objects/45/1900ae1a05b2669439260066e3d3eeaf11f8c8 new file mode 100755 index 0000000..2f77950 --- /dev/null +++ b/.git_disabled/objects/45/1900ae1a05b2669439260066e3d3eeaf11f8c8 @@ -0,0 +1,2 @@ +xMk1{_1ٵ(!4$5m`zm,HJ[w֋)9V'iyw ]D Hrݡ,źo++jM[∑|A\͡bR7eE+Ir-DP1DjJe|AwUӔnOU?NJ0㎖r<рZGJ )er^13aT#0U+ך4(hKnr7~' +{?"X`i bbŝu,zFÜl2,5|&}7duozBgz0缰sFz`T{~Ylj'y R3+a#oq\]ﶬ?y5'(=Qg<&FR#9L_`5ʝ \ No newline at end of file diff --git a/.git_disabled/objects/45/2b84429c54b4d1f83c94809479f120278c97b7 b/.git_disabled/objects/45/2b84429c54b4d1f83c94809479f120278c97b7 new file mode 100755 index 0000000..9223fcf Binary files /dev/null and b/.git_disabled/objects/45/2b84429c54b4d1f83c94809479f120278c97b7 differ diff --git a/.git_disabled/objects/45/338f1ef314f54713beffac258be5df711d5ee6 b/.git_disabled/objects/45/338f1ef314f54713beffac258be5df711d5ee6 new file mode 100755 index 0000000..85225a1 Binary files /dev/null and b/.git_disabled/objects/45/338f1ef314f54713beffac258be5df711d5ee6 differ diff --git a/.git_disabled/objects/45/40cb1b3d20e88b466d8a809c4b1ab8d48fd676 b/.git_disabled/objects/45/40cb1b3d20e88b466d8a809c4b1ab8d48fd676 new file mode 100755 index 0000000..d758ae3 Binary files /dev/null and b/.git_disabled/objects/45/40cb1b3d20e88b466d8a809c4b1ab8d48fd676 differ diff --git a/.git_disabled/objects/45/483e74aaad1c08fdd0362285f30d8c79c70148 b/.git_disabled/objects/45/483e74aaad1c08fdd0362285f30d8c79c70148 new file mode 100755 index 0000000..c487686 Binary files /dev/null and b/.git_disabled/objects/45/483e74aaad1c08fdd0362285f30d8c79c70148 differ diff --git a/.git_disabled/objects/45/940554ab95c1784798d9760fdbf0a085524bc8 b/.git_disabled/objects/45/940554ab95c1784798d9760fdbf0a085524bc8 new file mode 100755 index 0000000..4b88053 Binary files /dev/null and b/.git_disabled/objects/45/940554ab95c1784798d9760fdbf0a085524bc8 differ diff --git a/.git_disabled/objects/45/97628401a8d188c8ac477a0d638a383b02c9ff b/.git_disabled/objects/45/97628401a8d188c8ac477a0d638a383b02c9ff new file mode 100755 index 0000000..f7a3339 Binary files /dev/null and b/.git_disabled/objects/45/97628401a8d188c8ac477a0d638a383b02c9ff differ diff --git a/.git_disabled/objects/45/a5f9287f2990bb0255ee380a54937c3572e864 b/.git_disabled/objects/45/a5f9287f2990bb0255ee380a54937c3572e864 new file mode 100755 index 0000000..b0f5a3d Binary files /dev/null and b/.git_disabled/objects/45/a5f9287f2990bb0255ee380a54937c3572e864 differ diff --git a/.git_disabled/objects/45/a65e18ee8f9fe37d6591474f0a62442dc971fd b/.git_disabled/objects/45/a65e18ee8f9fe37d6591474f0a62442dc971fd new file mode 100755 index 0000000..0acf6bc Binary files /dev/null and b/.git_disabled/objects/45/a65e18ee8f9fe37d6591474f0a62442dc971fd differ diff --git a/.git_disabled/objects/45/a8a51055c1f46cec4579a79c5a53dd04038c53 b/.git_disabled/objects/45/a8a51055c1f46cec4579a79c5a53dd04038c53 new file mode 100755 index 0000000..ca1766c Binary files /dev/null and b/.git_disabled/objects/45/a8a51055c1f46cec4579a79c5a53dd04038c53 differ diff --git a/.git_disabled/objects/45/c8dab16001724d0246c38081e644d0f28c0071 b/.git_disabled/objects/45/c8dab16001724d0246c38081e644d0f28c0071 new file mode 100755 index 0000000..be1e1ec Binary files /dev/null and b/.git_disabled/objects/45/c8dab16001724d0246c38081e644d0f28c0071 differ diff --git a/.git_disabled/objects/45/ce94abcc7068ac29dfd22f7cafad70bf585167 b/.git_disabled/objects/45/ce94abcc7068ac29dfd22f7cafad70bf585167 new file mode 100755 index 0000000..6034654 Binary files /dev/null and b/.git_disabled/objects/45/ce94abcc7068ac29dfd22f7cafad70bf585167 differ diff --git a/.git_disabled/objects/45/dc9228cd4dab88ced729e9750e71e65a8acd69 b/.git_disabled/objects/45/dc9228cd4dab88ced729e9750e71e65a8acd69 new file mode 100755 index 0000000..13573ee Binary files /dev/null and b/.git_disabled/objects/45/dc9228cd4dab88ced729e9750e71e65a8acd69 differ diff --git a/.git_disabled/objects/45/ed76b3e5a9def7c710eff3748b86a48419eb2c b/.git_disabled/objects/45/ed76b3e5a9def7c710eff3748b86a48419eb2c new file mode 100755 index 0000000..80df4a9 Binary files /dev/null and b/.git_disabled/objects/45/ed76b3e5a9def7c710eff3748b86a48419eb2c differ diff --git a/.git_disabled/objects/45/f51b6952ffac26d7ace70c2547a2f2740e713f b/.git_disabled/objects/45/f51b6952ffac26d7ace70c2547a2f2740e713f new file mode 100755 index 0000000..fb5ce21 Binary files /dev/null and b/.git_disabled/objects/45/f51b6952ffac26d7ace70c2547a2f2740e713f differ diff --git a/.git_disabled/objects/46/05f021a50cfe4bc576537caf83a0a86d9e9bb4 b/.git_disabled/objects/46/05f021a50cfe4bc576537caf83a0a86d9e9bb4 new file mode 100755 index 0000000..0a56863 Binary files /dev/null and b/.git_disabled/objects/46/05f021a50cfe4bc576537caf83a0a86d9e9bb4 differ diff --git a/.git_disabled/objects/46/10b71dad9196838d4e1e04e76d5e7c9baf8cd9 b/.git_disabled/objects/46/10b71dad9196838d4e1e04e76d5e7c9baf8cd9 new file mode 100755 index 0000000..4a14dee Binary files /dev/null and b/.git_disabled/objects/46/10b71dad9196838d4e1e04e76d5e7c9baf8cd9 differ diff --git a/.git_disabled/objects/46/18d610ef91533ad94acdfd15f23c4f53e174ea b/.git_disabled/objects/46/18d610ef91533ad94acdfd15f23c4f53e174ea new file mode 100755 index 0000000..c9c5daa Binary files /dev/null and b/.git_disabled/objects/46/18d610ef91533ad94acdfd15f23c4f53e174ea differ diff --git a/.git_disabled/objects/46/2a51fefd10dbc1bab4a78fbb9711fffc165438 b/.git_disabled/objects/46/2a51fefd10dbc1bab4a78fbb9711fffc165438 new file mode 100755 index 0000000..3e8d063 Binary files /dev/null and b/.git_disabled/objects/46/2a51fefd10dbc1bab4a78fbb9711fffc165438 differ diff --git a/.git_disabled/objects/46/304cebf5cc336720bf1c7e1ddd5727c6bed0d4 b/.git_disabled/objects/46/304cebf5cc336720bf1c7e1ddd5727c6bed0d4 new file mode 100755 index 0000000..be51bb1 Binary files /dev/null and b/.git_disabled/objects/46/304cebf5cc336720bf1c7e1ddd5727c6bed0d4 differ diff --git a/.git_disabled/objects/46/333b9de504374a69674f3c7084d43cfb6100ef b/.git_disabled/objects/46/333b9de504374a69674f3c7084d43cfb6100ef new file mode 100755 index 0000000..27ab8a3 Binary files /dev/null and b/.git_disabled/objects/46/333b9de504374a69674f3c7084d43cfb6100ef differ diff --git a/.git_disabled/objects/46/4df2548a3897e926248550cc656c5da62aaac8 b/.git_disabled/objects/46/4df2548a3897e926248550cc656c5da62aaac8 new file mode 100755 index 0000000..f9fdb84 Binary files /dev/null and b/.git_disabled/objects/46/4df2548a3897e926248550cc656c5da62aaac8 differ diff --git a/.git_disabled/objects/46/564a3404689eee3bed9869f266838b847e58d5 b/.git_disabled/objects/46/564a3404689eee3bed9869f266838b847e58d5 new file mode 100755 index 0000000..6a7ef1a Binary files /dev/null and b/.git_disabled/objects/46/564a3404689eee3bed9869f266838b847e58d5 differ diff --git a/.git_disabled/objects/46/688fc811ea67217c37e83a7fadc8062a601484 b/.git_disabled/objects/46/688fc811ea67217c37e83a7fadc8062a601484 new file mode 100755 index 0000000..4c955c1 Binary files /dev/null and b/.git_disabled/objects/46/688fc811ea67217c37e83a7fadc8062a601484 differ diff --git a/.git_disabled/objects/46/6ca3cfc218c67a47fc9d9aeaa96f683ee11d35 b/.git_disabled/objects/46/6ca3cfc218c67a47fc9d9aeaa96f683ee11d35 new file mode 100755 index 0000000..9ea2158 Binary files /dev/null and b/.git_disabled/objects/46/6ca3cfc218c67a47fc9d9aeaa96f683ee11d35 differ diff --git a/.git_disabled/objects/46/7177478ad7bedec6568978d61b62acbb1a5baf b/.git_disabled/objects/46/7177478ad7bedec6568978d61b62acbb1a5baf new file mode 100755 index 0000000..74c9403 Binary files /dev/null and b/.git_disabled/objects/46/7177478ad7bedec6568978d61b62acbb1a5baf differ diff --git a/.git_disabled/objects/46/725be4fd5ff62893d8def5f9e356d4d096328a b/.git_disabled/objects/46/725be4fd5ff62893d8def5f9e356d4d096328a new file mode 100755 index 0000000..08f4288 Binary files /dev/null and b/.git_disabled/objects/46/725be4fd5ff62893d8def5f9e356d4d096328a differ diff --git a/.git_disabled/objects/46/74808884f25e0056dfcedd2af6a97e91a12c70 b/.git_disabled/objects/46/74808884f25e0056dfcedd2af6a97e91a12c70 new file mode 100755 index 0000000..389ddf5 --- /dev/null +++ b/.git_disabled/objects/46/74808884f25e0056dfcedd2af6a97e91a12c70 @@ -0,0 +1,3 @@ +x-j1{)ºxP k{̺n6$ +#x܃R ߫L/Lmpx5CLs +UlfxҝMkvX =fo}"]uސ+yŹԳhF/Z 4J-M@֝bGnh956gl5(klf0)2Y8Uw/GsP iɖLkVX+kf69iZ!jmI @"u9ThNӋch)8 <<ߠ|ZMEU;fo+A4eRm>di/I \ No newline at end of file diff --git a/.git_disabled/objects/46/7a6c90ae269babe3af7963d9d7c78b9f012268 b/.git_disabled/objects/46/7a6c90ae269babe3af7963d9d7c78b9f012268 new file mode 100755 index 0000000..f41583f Binary files /dev/null and b/.git_disabled/objects/46/7a6c90ae269babe3af7963d9d7c78b9f012268 differ diff --git a/.git_disabled/objects/46/7c423fd4c272a64435de0a3eb030fc5f81116b b/.git_disabled/objects/46/7c423fd4c272a64435de0a3eb030fc5f81116b new file mode 100755 index 0000000..19644ce Binary files /dev/null and b/.git_disabled/objects/46/7c423fd4c272a64435de0a3eb030fc5f81116b differ diff --git a/.git_disabled/objects/46/8ac5b193fde71a6d42258c9731789d5720a909 b/.git_disabled/objects/46/8ac5b193fde71a6d42258c9731789d5720a909 new file mode 100755 index 0000000..47832bc Binary files /dev/null and b/.git_disabled/objects/46/8ac5b193fde71a6d42258c9731789d5720a909 differ diff --git a/.git_disabled/objects/46/91173dc593f593ec7830a1739eabed27574712 b/.git_disabled/objects/46/91173dc593f593ec7830a1739eabed27574712 new file mode 100755 index 0000000..10f2b77 Binary files /dev/null and b/.git_disabled/objects/46/91173dc593f593ec7830a1739eabed27574712 differ diff --git a/.git_disabled/objects/46/9dd9d365bd8da98a748bb781829230660f1534 b/.git_disabled/objects/46/9dd9d365bd8da98a748bb781829230660f1534 new file mode 100755 index 0000000..d1c29a0 Binary files /dev/null and b/.git_disabled/objects/46/9dd9d365bd8da98a748bb781829230660f1534 differ diff --git a/.git_disabled/objects/46/a370855b5ad702a1b8f14f39736f1adc4bdb48 b/.git_disabled/objects/46/a370855b5ad702a1b8f14f39736f1adc4bdb48 new file mode 100755 index 0000000..7666072 Binary files /dev/null and b/.git_disabled/objects/46/a370855b5ad702a1b8f14f39736f1adc4bdb48 differ diff --git a/.git_disabled/objects/46/a9fe01bd60504992b7f8ae868d072d5a07520f b/.git_disabled/objects/46/a9fe01bd60504992b7f8ae868d072d5a07520f new file mode 100755 index 0000000..bcbc512 Binary files /dev/null and b/.git_disabled/objects/46/a9fe01bd60504992b7f8ae868d072d5a07520f differ diff --git a/.git_disabled/objects/46/ae04bdd94d4269fade4aca6123bb736f0461d5 b/.git_disabled/objects/46/ae04bdd94d4269fade4aca6123bb736f0461d5 new file mode 100755 index 0000000..b8bb3d8 Binary files /dev/null and b/.git_disabled/objects/46/ae04bdd94d4269fade4aca6123bb736f0461d5 differ diff --git a/.git_disabled/objects/46/c15232a599089e3e693d3da77fd003eeeed30f b/.git_disabled/objects/46/c15232a599089e3e693d3da77fd003eeeed30f new file mode 100755 index 0000000..00f0f72 Binary files /dev/null and b/.git_disabled/objects/46/c15232a599089e3e693d3da77fd003eeeed30f differ diff --git a/.git_disabled/objects/46/c87fceda13c94f2b8242a5d798900eaea8042f b/.git_disabled/objects/46/c87fceda13c94f2b8242a5d798900eaea8042f new file mode 100755 index 0000000..b1fb4f5 Binary files /dev/null and b/.git_disabled/objects/46/c87fceda13c94f2b8242a5d798900eaea8042f differ diff --git a/.git_disabled/objects/46/d681b10750f0c4299247fa954b4416f4a01a14 b/.git_disabled/objects/46/d681b10750f0c4299247fa954b4416f4a01a14 new file mode 100755 index 0000000..9fdab6a Binary files /dev/null and b/.git_disabled/objects/46/d681b10750f0c4299247fa954b4416f4a01a14 differ diff --git a/.git_disabled/objects/47/016b4a35d7c61f9b8799fe8dcf21be99476fe7 b/.git_disabled/objects/47/016b4a35d7c61f9b8799fe8dcf21be99476fe7 new file mode 100755 index 0000000..2c37ea9 Binary files /dev/null and b/.git_disabled/objects/47/016b4a35d7c61f9b8799fe8dcf21be99476fe7 differ diff --git a/.git_disabled/objects/47/0e77a56bb41a28fcc596b7005373a49946a519 b/.git_disabled/objects/47/0e77a56bb41a28fcc596b7005373a49946a519 new file mode 100755 index 0000000..506a255 Binary files /dev/null and b/.git_disabled/objects/47/0e77a56bb41a28fcc596b7005373a49946a519 differ diff --git a/.git_disabled/objects/47/0f15304b8762056d12159429ab34974c6358ac b/.git_disabled/objects/47/0f15304b8762056d12159429ab34974c6358ac new file mode 100755 index 0000000..ac1c27e Binary files /dev/null and b/.git_disabled/objects/47/0f15304b8762056d12159429ab34974c6358ac differ diff --git a/.git_disabled/objects/47/222f6ae84e0e491b8f4e5371d9b47f40e1a6b5 b/.git_disabled/objects/47/222f6ae84e0e491b8f4e5371d9b47f40e1a6b5 new file mode 100755 index 0000000..8bb7980 --- /dev/null +++ b/.git_disabled/objects/47/222f6ae84e0e491b8f4e5371d9b47f40e1a6b5 @@ -0,0 +1 @@ +x+)JMU022e040075UrutueO*Z^|ϱ&@_Pp'>j>~e6/b29K9yez "o8%rX>ePE%@Ez Ɍ=5N7,y|ƲԢb 9fJw{\k;v{T%I٥ \Mg>[SyHEJq^9 \ No newline at end of file diff --git a/.git_disabled/objects/47/335b86b3dc3b40bc089f2d3daca7be7566e841 b/.git_disabled/objects/47/335b86b3dc3b40bc089f2d3daca7be7566e841 new file mode 100755 index 0000000..a2781e4 --- /dev/null +++ b/.git_disabled/objects/47/335b86b3dc3b40bc089f2d3daca7be7566e841 @@ -0,0 +1,10 @@ +xTuϞs/_( +G\FL +*mX,7LLL(- -Sh`grR!wC_gm&rڟLש_Pf}|"wW[~"Wc7j}k05|qVZjVZjVZjVZjVZjVZjVZjVZ +rU9?LԧuEMjPr(<G]*CmjQT2 +4|i@}Q +PZԤ) 4>KuM-jRSFOr= O=RAjSԠ:QԧuEMjPr(\OSTPԢ&5N9ehӀԣ.ԡ6I SN>4>KuM-jRSFGԧuEMjPr(Ӏԣ.ԡ6I SN~i@}Q +PZԤ) zPzԥ:Ԧ5Au)@\OSTPԢ&5N9ehYG]*CmjQT2 +4,ԧuEMjPr(Ӏԣ.ԡ6I SNzPzԥ:Ԧ5Au)@\OSTPԢ&5N9eh(Ӏԣ.ԡ6I SNNq= O=~U+P@ +T+]a~[Gbf85Gs _7_kg +8nJs|F7y\x,zFV࿘߀l>|Ky9\||g^4%Zb|0/k j|L|>ۜfqY8n<~yz< o:fRsYzguFGAyY9۬}A_:oOF'Afw'k|7Q>CڿZмߣӠxst\ 4bqtR_ߚ;zI/Dwst~.N>OE'mϊݯg猞/ ~NHt(ϫf=Rs~̺̺ ̚3ZѵyiW+Ϸu>|׬N4. ~:] A~:`TtRGz?\:?Y'Ci~Dt7~u:uN褜kA{YYG/_?b||8:-LJZ9D'~c6f=.f0<;: :=~N}!pgtZ;k㷛/oY}2:-ώZ~kݬϛ[|ŬGn6k^czdz.N٣yiy<;kxSI_=AtZi~7F'~YOuYiڏ/Ձ \ No newline at end of file diff --git a/.git_disabled/objects/47/34feb13474c4cce7849a079584f32de7186e28 b/.git_disabled/objects/47/34feb13474c4cce7849a079584f32de7186e28 new file mode 100755 index 0000000..d807c36 Binary files /dev/null and b/.git_disabled/objects/47/34feb13474c4cce7849a079584f32de7186e28 differ diff --git a/.git_disabled/objects/47/5124405ee17c6b992c92f074f51f8d9e53ecff b/.git_disabled/objects/47/5124405ee17c6b992c92f074f51f8d9e53ecff new file mode 100755 index 0000000..e3ecbaa --- /dev/null +++ b/.git_disabled/objects/47/5124405ee17c6b992c92f074f51f8d9e53ecff @@ -0,0 +1,5 @@ +xn@9)FŮRKqDEJB +Wk;iui?&ԛ?s8U-Zƙ[,V-1@ CJy#J/13o&Q/k?Yx'2ln-lf&%Mg\<^kl:8$(h' _{w#x!וL"%Σe_ +!z9ۻ؋.>k'eS|zv-8sx;sc`H1}xT j F]UKޡH{PT;(ˀQw飃{p$/(N7 \ No newline at end of file diff --git a/.git_disabled/objects/47/67261e52b35bce73b8f9a413c256bc4bf0e1ae b/.git_disabled/objects/47/67261e52b35bce73b8f9a413c256bc4bf0e1ae new file mode 100755 index 0000000..ac675c5 Binary files /dev/null and b/.git_disabled/objects/47/67261e52b35bce73b8f9a413c256bc4bf0e1ae differ diff --git a/.git_disabled/objects/47/6d325715b05f89895ba4e62e0a31e5cb5d562a b/.git_disabled/objects/47/6d325715b05f89895ba4e62e0a31e5cb5d562a new file mode 100755 index 0000000..5d461c1 Binary files /dev/null and b/.git_disabled/objects/47/6d325715b05f89895ba4e62e0a31e5cb5d562a differ diff --git a/.git_disabled/objects/47/744773e646f1f044686f3ef61999c74dc48226 b/.git_disabled/objects/47/744773e646f1f044686f3ef61999c74dc48226 new file mode 100755 index 0000000..a0e7870 Binary files /dev/null and b/.git_disabled/objects/47/744773e646f1f044686f3ef61999c74dc48226 differ diff --git a/.git_disabled/objects/47/9089dd6fbb1f3278b8a131b83f0d0ecf2c19ec b/.git_disabled/objects/47/9089dd6fbb1f3278b8a131b83f0d0ecf2c19ec new file mode 100755 index 0000000..5a208d2 Binary files /dev/null and b/.git_disabled/objects/47/9089dd6fbb1f3278b8a131b83f0d0ecf2c19ec differ diff --git a/.git_disabled/objects/47/9a5cc5721c6929741e114447bf5f20360fb949 b/.git_disabled/objects/47/9a5cc5721c6929741e114447bf5f20360fb949 new file mode 100755 index 0000000..3dd3155 Binary files /dev/null and b/.git_disabled/objects/47/9a5cc5721c6929741e114447bf5f20360fb949 differ diff --git a/.git_disabled/objects/47/9d6bd25c21d73e0ce69e1d996e5f21df790ce9 b/.git_disabled/objects/47/9d6bd25c21d73e0ce69e1d996e5f21df790ce9 new file mode 100755 index 0000000..5de4bd9 Binary files /dev/null and b/.git_disabled/objects/47/9d6bd25c21d73e0ce69e1d996e5f21df790ce9 differ diff --git a/.git_disabled/objects/47/9fd945d97361a780c400021651ee6351b4e733 b/.git_disabled/objects/47/9fd945d97361a780c400021651ee6351b4e733 new file mode 100755 index 0000000..b1901d9 Binary files /dev/null and b/.git_disabled/objects/47/9fd945d97361a780c400021651ee6351b4e733 differ diff --git a/.git_disabled/objects/47/bc75559ee1ea6282515271405947a459cc68e0 b/.git_disabled/objects/47/bc75559ee1ea6282515271405947a459cc68e0 new file mode 100755 index 0000000..d296238 Binary files /dev/null and b/.git_disabled/objects/47/bc75559ee1ea6282515271405947a459cc68e0 differ diff --git a/.git_disabled/objects/47/e6987b8578177e34fd98249024777be47f4b39 b/.git_disabled/objects/47/e6987b8578177e34fd98249024777be47f4b39 new file mode 100755 index 0000000..550ce65 Binary files /dev/null and b/.git_disabled/objects/47/e6987b8578177e34fd98249024777be47f4b39 differ diff --git a/.git_disabled/objects/47/e7b94befb8f1d7ec2beb6e0abf70b0969d7747 b/.git_disabled/objects/47/e7b94befb8f1d7ec2beb6e0abf70b0969d7747 new file mode 100755 index 0000000..77a2b9e Binary files /dev/null and b/.git_disabled/objects/47/e7b94befb8f1d7ec2beb6e0abf70b0969d7747 differ diff --git a/.git_disabled/objects/47/f131b0a54e54e45132e776277bb47b0e2d21c3 b/.git_disabled/objects/47/f131b0a54e54e45132e776277bb47b0e2d21c3 new file mode 100755 index 0000000..60c2212 Binary files /dev/null and b/.git_disabled/objects/47/f131b0a54e54e45132e776277bb47b0e2d21c3 differ diff --git a/.git_disabled/objects/48/116ce4dc8ea0f60447c754e302e7acd60431d3 b/.git_disabled/objects/48/116ce4dc8ea0f60447c754e302e7acd60431d3 new file mode 100755 index 0000000..44bd661 Binary files /dev/null and b/.git_disabled/objects/48/116ce4dc8ea0f60447c754e302e7acd60431d3 differ diff --git a/.git_disabled/objects/48/18b55ba8f1b4b23e9cd9082ae19d5db5da9260 b/.git_disabled/objects/48/18b55ba8f1b4b23e9cd9082ae19d5db5da9260 new file mode 100755 index 0000000..31b01d8 Binary files /dev/null and b/.git_disabled/objects/48/18b55ba8f1b4b23e9cd9082ae19d5db5da9260 differ diff --git a/.git_disabled/objects/48/4a01d5e6a7498beb8f6898ba1e23fec15c9c5b b/.git_disabled/objects/48/4a01d5e6a7498beb8f6898ba1e23fec15c9c5b new file mode 100755 index 0000000..1d26928 Binary files /dev/null and b/.git_disabled/objects/48/4a01d5e6a7498beb8f6898ba1e23fec15c9c5b differ diff --git a/.git_disabled/objects/48/a77db0aee79d8ac6ade072493153472ba437e6 b/.git_disabled/objects/48/a77db0aee79d8ac6ade072493153472ba437e6 new file mode 100755 index 0000000..30641c0 Binary files /dev/null and b/.git_disabled/objects/48/a77db0aee79d8ac6ade072493153472ba437e6 differ diff --git a/.git_disabled/objects/48/aeceefe185dff351ef6b3e26ef09e6894cddff b/.git_disabled/objects/48/aeceefe185dff351ef6b3e26ef09e6894cddff new file mode 100755 index 0000000..a05abc7 Binary files /dev/null and b/.git_disabled/objects/48/aeceefe185dff351ef6b3e26ef09e6894cddff differ diff --git a/.git_disabled/objects/48/b7994a82ab01c1bf56dc7bbdbeb024228bc1c4 b/.git_disabled/objects/48/b7994a82ab01c1bf56dc7bbdbeb024228bc1c4 new file mode 100755 index 0000000..21b04ea Binary files /dev/null and b/.git_disabled/objects/48/b7994a82ab01c1bf56dc7bbdbeb024228bc1c4 differ diff --git a/.git_disabled/objects/48/bd36d7ccbdfdafc442f6921d589aecfc90380d b/.git_disabled/objects/48/bd36d7ccbdfdafc442f6921d589aecfc90380d new file mode 100755 index 0000000..9ee1a53 Binary files /dev/null and b/.git_disabled/objects/48/bd36d7ccbdfdafc442f6921d589aecfc90380d differ diff --git a/.git_disabled/objects/48/c7f5e7990f1db89cc514822f943bca0e15614d b/.git_disabled/objects/48/c7f5e7990f1db89cc514822f943bca0e15614d new file mode 100755 index 0000000..9ce52eb Binary files /dev/null and b/.git_disabled/objects/48/c7f5e7990f1db89cc514822f943bca0e15614d differ diff --git a/.git_disabled/objects/48/ccebd7eb8cf0e3140492213c217238b301208d b/.git_disabled/objects/48/ccebd7eb8cf0e3140492213c217238b301208d new file mode 100755 index 0000000..9cef553 Binary files /dev/null and b/.git_disabled/objects/48/ccebd7eb8cf0e3140492213c217238b301208d differ diff --git a/.git_disabled/objects/48/ce433c048804e2f9595985dbf22b96c5387b0b b/.git_disabled/objects/48/ce433c048804e2f9595985dbf22b96c5387b0b new file mode 100755 index 0000000..ecaf920 Binary files /dev/null and b/.git_disabled/objects/48/ce433c048804e2f9595985dbf22b96c5387b0b differ diff --git a/.git_disabled/objects/48/e7acdb4b18dce472ff712060199312be99b12b b/.git_disabled/objects/48/e7acdb4b18dce472ff712060199312be99b12b new file mode 100755 index 0000000..3fd9417 Binary files /dev/null and b/.git_disabled/objects/48/e7acdb4b18dce472ff712060199312be99b12b differ diff --git a/.git_disabled/objects/49/12c1d44a42a4eb973758dd151d7b2568beb7eb b/.git_disabled/objects/49/12c1d44a42a4eb973758dd151d7b2568beb7eb new file mode 100755 index 0000000..88d971e Binary files /dev/null and b/.git_disabled/objects/49/12c1d44a42a4eb973758dd151d7b2568beb7eb differ diff --git a/.git_disabled/objects/49/204fa2b09d3ad3e2a48419fba139b3af78406b b/.git_disabled/objects/49/204fa2b09d3ad3e2a48419fba139b3af78406b new file mode 100755 index 0000000..93c0f5a Binary files /dev/null and b/.git_disabled/objects/49/204fa2b09d3ad3e2a48419fba139b3af78406b differ diff --git a/.git_disabled/objects/49/3329449b36b640d2d3f7323774ff98347d2d80 b/.git_disabled/objects/49/3329449b36b640d2d3f7323774ff98347d2d80 new file mode 100755 index 0000000..1e6bd22 Binary files /dev/null and b/.git_disabled/objects/49/3329449b36b640d2d3f7323774ff98347d2d80 differ diff --git a/.git_disabled/objects/49/3fa6baa3b28c74ade1a8d9b6ed2e6a3208e596 b/.git_disabled/objects/49/3fa6baa3b28c74ade1a8d9b6ed2e6a3208e596 new file mode 100755 index 0000000..b883748 Binary files /dev/null and b/.git_disabled/objects/49/3fa6baa3b28c74ade1a8d9b6ed2e6a3208e596 differ diff --git a/.git_disabled/objects/49/4bd15653457feaeab027971ad9d392206492d2 b/.git_disabled/objects/49/4bd15653457feaeab027971ad9d392206492d2 new file mode 100755 index 0000000..ccd8a2b Binary files /dev/null and b/.git_disabled/objects/49/4bd15653457feaeab027971ad9d392206492d2 differ diff --git a/.git_disabled/objects/49/7dad5565cb96159b318edb788c175187e810b9 b/.git_disabled/objects/49/7dad5565cb96159b318edb788c175187e810b9 new file mode 100755 index 0000000..52c2d0c Binary files /dev/null and b/.git_disabled/objects/49/7dad5565cb96159b318edb788c175187e810b9 differ diff --git a/.git_disabled/objects/49/adb6dbe9af01cf575d06b4092ad70dd3b09e61 b/.git_disabled/objects/49/adb6dbe9af01cf575d06b4092ad70dd3b09e61 new file mode 100755 index 0000000..6305675 Binary files /dev/null and b/.git_disabled/objects/49/adb6dbe9af01cf575d06b4092ad70dd3b09e61 differ diff --git a/.git_disabled/objects/49/aea2baf353b77529ad6d9de10e2d2638523207 b/.git_disabled/objects/49/aea2baf353b77529ad6d9de10e2d2638523207 new file mode 100755 index 0000000..f7feaf7 Binary files /dev/null and b/.git_disabled/objects/49/aea2baf353b77529ad6d9de10e2d2638523207 differ diff --git a/.git_disabled/objects/49/d91b36ac2f308c3a455bf524817bbd2d423e3c b/.git_disabled/objects/49/d91b36ac2f308c3a455bf524817bbd2d423e3c new file mode 100755 index 0000000..131a871 --- /dev/null +++ b/.git_disabled/objects/49/d91b36ac2f308c3a455bf524817bbd2d423e3c @@ -0,0 +1,4 @@ +xmR=o0_q@cqb8mvhQt SMR C;tO+%ڈpӻw]e/ޕJPRmR?OecPE05BGAzp%;"U}(ZL +G5)2vTh"{eԲ@,x`}scEEܴ r|bKYw[^;M[3QtfLS +B`b' +3T˳+ 6CFY>ADQTf9 #(!3}nC۫Ek1,9x't1=QnVȦc IɸOГ;D lAmf'Km4JITV7:\vTpkԝ.gT\R~Oh;&~\ \ No newline at end of file diff --git a/.git_disabled/objects/4a/18e7e7b6962e30b279721f44048221e8360cb5 b/.git_disabled/objects/4a/18e7e7b6962e30b279721f44048221e8360cb5 new file mode 100755 index 0000000..ca60103 Binary files /dev/null and b/.git_disabled/objects/4a/18e7e7b6962e30b279721f44048221e8360cb5 differ diff --git a/.git_disabled/objects/4a/1ade9d10ef6336634e095b8bed78c65a129c36 b/.git_disabled/objects/4a/1ade9d10ef6336634e095b8bed78c65a129c36 new file mode 100755 index 0000000..61a4690 Binary files /dev/null and b/.git_disabled/objects/4a/1ade9d10ef6336634e095b8bed78c65a129c36 differ diff --git a/.git_disabled/objects/4a/1bd43b6d20522405b97882e8ce080de7f1656d b/.git_disabled/objects/4a/1bd43b6d20522405b97882e8ce080de7f1656d new file mode 100755 index 0000000..3fca000 Binary files /dev/null and b/.git_disabled/objects/4a/1bd43b6d20522405b97882e8ce080de7f1656d differ diff --git a/.git_disabled/objects/4a/26c6c167cd27c1bdf25ffdeb4d8fa59e46c712 b/.git_disabled/objects/4a/26c6c167cd27c1bdf25ffdeb4d8fa59e46c712 new file mode 100755 index 0000000..f1e51b8 Binary files /dev/null and b/.git_disabled/objects/4a/26c6c167cd27c1bdf25ffdeb4d8fa59e46c712 differ diff --git a/.git_disabled/objects/4a/27b0a368a1bc0853796390fcefeeaf300e78ec b/.git_disabled/objects/4a/27b0a368a1bc0853796390fcefeeaf300e78ec new file mode 100755 index 0000000..96564d8 Binary files /dev/null and b/.git_disabled/objects/4a/27b0a368a1bc0853796390fcefeeaf300e78ec differ diff --git a/.git_disabled/objects/4a/34c0b4be455f9dd0602419c3df6fd659c4dbd2 b/.git_disabled/objects/4a/34c0b4be455f9dd0602419c3df6fd659c4dbd2 new file mode 100755 index 0000000..aaf7023 --- /dev/null +++ b/.git_disabled/objects/4a/34c0b4be455f9dd0602419c3df6fd659c4dbd2 @@ -0,0 +1 @@ +x}A0_1(.[^({ZDҚց $U*%o}3o*X}42x3dy ďX5HNeLPGs <4Ϻ}>kN.?/.$=N#zgz4*|-a_7,E(@Q +D(@Q +D(@Q +D(@eZhkԇtmhAPT!  ]@ZЄԡU!wЃ.t -hBP*A\}A:І4uAr -> hC Ѐ:Ԡ +9d`p=BЂ&45B$ЇtmhAPT!  zCЁ6 C C s=]@ZЄԡU!\}A:І# +D(@Q +D(@Q +DK%e-}8~y?h>h>JMϦ |\5_oךk.}js\m3ys:okJ|<ÓkKO9,~|||+~c_o\}ϙYs8c\f_1/k59s\7̵c?b2>ovsj~Kh~{o\vNs7W9s2WqsK?`uI +_-}_,,>Y̵5g\l7>1>ڧRDqKy澚\3 7ҷ55Ks\ϙkYs?c>^||b?6]s\Wz8?iOWu:NJ~ϛ_\15Is\5GJ))}z\?h7u=炙͵]sͻ\kޚ歔˪w5n\]4n\9s_u}g*~4W㢹z\0W1 P3 \ No newline at end of file diff --git a/.git_disabled/objects/4d/08cf94a079fc8cd915b12e9d36f26cdc5836ef b/.git_disabled/objects/4d/08cf94a079fc8cd915b12e9d36f26cdc5836ef new file mode 100755 index 0000000..f449261 Binary files /dev/null and b/.git_disabled/objects/4d/08cf94a079fc8cd915b12e9d36f26cdc5836ef differ diff --git a/.git_disabled/objects/4d/11239c472c4d9cfc55abf985df15591a39048c b/.git_disabled/objects/4d/11239c472c4d9cfc55abf985df15591a39048c new file mode 100755 index 0000000..3bafb5f Binary files /dev/null and b/.git_disabled/objects/4d/11239c472c4d9cfc55abf985df15591a39048c differ diff --git a/.git_disabled/objects/4d/1830994322e3d3af0af9f9a035f77daa16f06e b/.git_disabled/objects/4d/1830994322e3d3af0af9f9a035f77daa16f06e new file mode 100755 index 0000000..a3a67bf --- /dev/null +++ b/.git_disabled/objects/4d/1830994322e3d3af0af9f9a035f77daa16f06e @@ -0,0 +1,3 @@ +x}Sn0 _A P; @ehQRoWAi[, ?ɲfqz{(jnww_(lB>Z@*UYXJj^-W`_ٚ =6RB +ٮ.DX_oP1¥heq)-y:QvJ_S+PZedRtu$-#UҲBv *ZBHK-Œ*6t5/Op0 ||XK C*s_^vY9Oc+ۅhbX 'a,fnwfE%'3[R9~^y;'e&1mDQ99 ux5-CjA ?9/n oIuI/m~?ٓDcE;{FrٰjWipͩ} +` \ No newline at end of file diff --git a/.git_disabled/objects/4d/40b45b5c258fb21cf9d42a33fbb40be910ca14 b/.git_disabled/objects/4d/40b45b5c258fb21cf9d42a33fbb40be910ca14 new file mode 100755 index 0000000..d47108e Binary files /dev/null and b/.git_disabled/objects/4d/40b45b5c258fb21cf9d42a33fbb40be910ca14 differ diff --git a/.git_disabled/objects/4d/43b85fe7c8575c8fd782bd8e743f018f946a0b b/.git_disabled/objects/4d/43b85fe7c8575c8fd782bd8e743f018f946a0b new file mode 100755 index 0000000..9a80ca1 Binary files /dev/null and b/.git_disabled/objects/4d/43b85fe7c8575c8fd782bd8e743f018f946a0b differ diff --git a/.git_disabled/objects/4d/5d445a97eaca9329e71cd70c19f5e57fe6a75d b/.git_disabled/objects/4d/5d445a97eaca9329e71cd70c19f5e57fe6a75d new file mode 100755 index 0000000..5e716d3 Binary files /dev/null and b/.git_disabled/objects/4d/5d445a97eaca9329e71cd70c19f5e57fe6a75d differ diff --git a/.git_disabled/objects/4d/77f0efc5321edc13b757410f7923347557c44c b/.git_disabled/objects/4d/77f0efc5321edc13b757410f7923347557c44c new file mode 100755 index 0000000..c396c94 Binary files /dev/null and b/.git_disabled/objects/4d/77f0efc5321edc13b757410f7923347557c44c differ diff --git a/.git_disabled/objects/4d/7e6331e4d6684e6ab084816c8b968829366ab2 b/.git_disabled/objects/4d/7e6331e4d6684e6ab084816c8b968829366ab2 new file mode 100755 index 0000000..6c0041e Binary files /dev/null and b/.git_disabled/objects/4d/7e6331e4d6684e6ab084816c8b968829366ab2 differ diff --git a/.git_disabled/objects/4d/84f411bba5d342103f011fb6ab37a09b03756f b/.git_disabled/objects/4d/84f411bba5d342103f011fb6ab37a09b03756f new file mode 100755 index 0000000..a80a906 Binary files /dev/null and b/.git_disabled/objects/4d/84f411bba5d342103f011fb6ab37a09b03756f differ diff --git a/.git_disabled/objects/4d/86ba8a81a267dc52b2f3de11f3234932d5b7a6 b/.git_disabled/objects/4d/86ba8a81a267dc52b2f3de11f3234932d5b7a6 new file mode 100755 index 0000000..2cc1806 Binary files /dev/null and b/.git_disabled/objects/4d/86ba8a81a267dc52b2f3de11f3234932d5b7a6 differ diff --git a/.git_disabled/objects/4d/8f6b338ed1559bddd019ad525cb9caf7176840 b/.git_disabled/objects/4d/8f6b338ed1559bddd019ad525cb9caf7176840 new file mode 100755 index 0000000..b2738d3 Binary files /dev/null and b/.git_disabled/objects/4d/8f6b338ed1559bddd019ad525cb9caf7176840 differ diff --git a/.git_disabled/objects/4d/8f88be6f4eeb9904cc8544bc7b7a576deab83a b/.git_disabled/objects/4d/8f88be6f4eeb9904cc8544bc7b7a576deab83a new file mode 100755 index 0000000..94913ed Binary files /dev/null and b/.git_disabled/objects/4d/8f88be6f4eeb9904cc8544bc7b7a576deab83a differ diff --git a/.git_disabled/objects/4d/aa356d3e298a5c610d52a152926676e1317202 b/.git_disabled/objects/4d/aa356d3e298a5c610d52a152926676e1317202 new file mode 100755 index 0000000..3105353 Binary files /dev/null and b/.git_disabled/objects/4d/aa356d3e298a5c610d52a152926676e1317202 differ diff --git a/.git_disabled/objects/4d/cb96fa7cd46f642f509bf8bbf7d3a6ff31cf8c b/.git_disabled/objects/4d/cb96fa7cd46f642f509bf8bbf7d3a6ff31cf8c new file mode 100755 index 0000000..2c48448 Binary files /dev/null and b/.git_disabled/objects/4d/cb96fa7cd46f642f509bf8bbf7d3a6ff31cf8c differ diff --git a/.git_disabled/objects/4d/d40d7220fc9007be2df59cce92a0897f355771 b/.git_disabled/objects/4d/d40d7220fc9007be2df59cce92a0897f355771 new file mode 100755 index 0000000..85a4ec2 --- /dev/null +++ b/.git_disabled/objects/4d/d40d7220fc9007be2df59cce92a0897f355771 @@ -0,0 +1,3 @@ +xRak0g| @- ҅5)s,%M,ŸR60)*OML`lVsyuM`tkr~|6W!l"n5RJ:óQ,",w-\hB]-Ԫh}ifrI\, Mvҏy-Ti{$)Vj19zlRswuuҨҴl\c0MZ&rq%mzB=ʡaK#]=K0qFRVs>ۭ;LKƥ{{fEEQ! 0')]ӡq +g +ߔK2_*Fl~ ._b2=~Thp8|ٗ.F[t )csW~] \ No newline at end of file diff --git a/.git_disabled/objects/4e/14d57bf6243a5d700d485a7535e524e0a5ca46 b/.git_disabled/objects/4e/14d57bf6243a5d700d485a7535e524e0a5ca46 new file mode 100755 index 0000000..3e3790c --- /dev/null +++ b/.git_disabled/objects/4e/14d57bf6243a5d700d485a7535e524e0a5ca46 @@ -0,0 +1 @@ +xJ1]Sܥh~dFD,R6lf}z#>gq>c $j!BɅN2g"ŽvhClSwBI,J& pڌHVF9 ps.= ?G kpYD$\M?ofT`u7ɇD d55ty&5!}[ <iZ_悞}If \ No newline at end of file diff --git a/.git_disabled/objects/4e/17dd46a5e0f8f3ad012a5bba5ef703cfae49ac b/.git_disabled/objects/4e/17dd46a5e0f8f3ad012a5bba5ef703cfae49ac new file mode 100755 index 0000000..3479b79 --- /dev/null +++ b/.git_disabled/objects/4e/17dd46a5e0f8f3ad012a5bba5ef703cfae49ac @@ -0,0 +1,2 @@ +xRˎ0:_ai6 3C)H $ôeXyƙJÎ%kY'jLڪ=sWXΛ `s .|Xmڃ/d|rռ{$cDAJyI& aۚqu KX1+khiIlūYnWjt\jG@Hs\дyhF!7{"Z'f=B\m]7?",վ +np8W;pЮ< -@v_MfD@3 FޘmX=ۜ|;Ks}nC!(??̙h~S]F"7M3Qʊ4FTVwACpZcVfE,r@ yTHc;dfMͭCDHxSE}Bo bugP;}%LnXNSѵ;יk \ No newline at end of file diff --git a/.git_disabled/objects/4e/1927e89d843d8158cbae6d7ecfe76270d87037 b/.git_disabled/objects/4e/1927e89d843d8158cbae6d7ecfe76270d87037 new file mode 100755 index 0000000..cbbcfaa Binary files /dev/null and b/.git_disabled/objects/4e/1927e89d843d8158cbae6d7ecfe76270d87037 differ diff --git a/.git_disabled/objects/4e/268ebe2541214b12a98b52ac1c67a4b36471e1 b/.git_disabled/objects/4e/268ebe2541214b12a98b52ac1c67a4b36471e1 new file mode 100755 index 0000000..a0a572b Binary files /dev/null and b/.git_disabled/objects/4e/268ebe2541214b12a98b52ac1c67a4b36471e1 differ diff --git a/.git_disabled/objects/4e/480bf1d7b7216d1e0d811f99c5e9adf1c229fe b/.git_disabled/objects/4e/480bf1d7b7216d1e0d811f99c5e9adf1c229fe new file mode 100755 index 0000000..fc25f5f Binary files /dev/null and b/.git_disabled/objects/4e/480bf1d7b7216d1e0d811f99c5e9adf1c229fe differ diff --git a/.git_disabled/objects/4e/510e8ba065e7158f80ca4d709c221729ea3263 b/.git_disabled/objects/4e/510e8ba065e7158f80ca4d709c221729ea3263 new file mode 100755 index 0000000..3cce9a2 Binary files /dev/null and b/.git_disabled/objects/4e/510e8ba065e7158f80ca4d709c221729ea3263 differ diff --git a/.git_disabled/objects/4e/574bbb24e9a578f4de041962c04bcd03836ce8 b/.git_disabled/objects/4e/574bbb24e9a578f4de041962c04bcd03836ce8 new file mode 100755 index 0000000..990ed54 Binary files /dev/null and b/.git_disabled/objects/4e/574bbb24e9a578f4de041962c04bcd03836ce8 differ diff --git a/.git_disabled/objects/4e/593094baa378e5a0234b51548dfe80bb5c8670 b/.git_disabled/objects/4e/593094baa378e5a0234b51548dfe80bb5c8670 new file mode 100755 index 0000000..d76aab7 Binary files /dev/null and b/.git_disabled/objects/4e/593094baa378e5a0234b51548dfe80bb5c8670 differ diff --git a/.git_disabled/objects/4e/627590605452dcbe8ecf864c784af7abc39dd9 b/.git_disabled/objects/4e/627590605452dcbe8ecf864c784af7abc39dd9 new file mode 100755 index 0000000..e1b425c Binary files /dev/null and b/.git_disabled/objects/4e/627590605452dcbe8ecf864c784af7abc39dd9 differ diff --git a/.git_disabled/objects/4e/6e0e8563f64bec889e99bdc929300f59cbe154 b/.git_disabled/objects/4e/6e0e8563f64bec889e99bdc929300f59cbe154 new file mode 100755 index 0000000..8d26be7 Binary files /dev/null and b/.git_disabled/objects/4e/6e0e8563f64bec889e99bdc929300f59cbe154 differ diff --git a/.git_disabled/objects/4e/6e98906ddafde79c8d9d0fafd960a7ba6d9cb2 b/.git_disabled/objects/4e/6e98906ddafde79c8d9d0fafd960a7ba6d9cb2 new file mode 100755 index 0000000..5b47ffc Binary files /dev/null and b/.git_disabled/objects/4e/6e98906ddafde79c8d9d0fafd960a7ba6d9cb2 differ diff --git a/.git_disabled/objects/4e/78382c4b628f8c88d2c198e610b5ac5c0574df b/.git_disabled/objects/4e/78382c4b628f8c88d2c198e610b5ac5c0574df new file mode 100755 index 0000000..55f73e5 Binary files /dev/null and b/.git_disabled/objects/4e/78382c4b628f8c88d2c198e610b5ac5c0574df differ diff --git a/.git_disabled/objects/4e/7edbbfe9d0d4c08659f12c469991a3fcb16b04 b/.git_disabled/objects/4e/7edbbfe9d0d4c08659f12c469991a3fcb16b04 new file mode 100755 index 0000000..ee53c7b Binary files /dev/null and b/.git_disabled/objects/4e/7edbbfe9d0d4c08659f12c469991a3fcb16b04 differ diff --git a/.git_disabled/objects/4e/94d48b48992007cbe0f8c978f289ffa07e23bb b/.git_disabled/objects/4e/94d48b48992007cbe0f8c978f289ffa07e23bb new file mode 100755 index 0000000..3c14af0 Binary files /dev/null and b/.git_disabled/objects/4e/94d48b48992007cbe0f8c978f289ffa07e23bb differ diff --git a/.git_disabled/objects/4e/96dc5d6746659bdfb3903ea0de85dec45c6262 b/.git_disabled/objects/4e/96dc5d6746659bdfb3903ea0de85dec45c6262 new file mode 100755 index 0000000..3117307 Binary files /dev/null and b/.git_disabled/objects/4e/96dc5d6746659bdfb3903ea0de85dec45c6262 differ diff --git a/.git_disabled/objects/4e/a211e712d0c917ec80f2b2067a172d4839ee6a b/.git_disabled/objects/4e/a211e712d0c917ec80f2b2067a172d4839ee6a new file mode 100755 index 0000000..bbe406e Binary files /dev/null and b/.git_disabled/objects/4e/a211e712d0c917ec80f2b2067a172d4839ee6a differ diff --git a/.git_disabled/objects/4e/a9aa90f30c161cb62e5bfa8d47958340c02715 b/.git_disabled/objects/4e/a9aa90f30c161cb62e5bfa8d47958340c02715 new file mode 100755 index 0000000..2bc3b6b Binary files /dev/null and b/.git_disabled/objects/4e/a9aa90f30c161cb62e5bfa8d47958340c02715 differ diff --git a/.git_disabled/objects/4e/b33d6833c5a221aa9fab5a805d735d176ae135 b/.git_disabled/objects/4e/b33d6833c5a221aa9fab5a805d735d176ae135 new file mode 100755 index 0000000..3e2bccf Binary files /dev/null and b/.git_disabled/objects/4e/b33d6833c5a221aa9fab5a805d735d176ae135 differ diff --git a/.git_disabled/objects/4e/c93d5fb017bc87dced61d98faca0adf2e9024d b/.git_disabled/objects/4e/c93d5fb017bc87dced61d98faca0adf2e9024d new file mode 100755 index 0000000..9e4640e --- /dev/null +++ b/.git_disabled/objects/4e/c93d5fb017bc87dced61d98faca0adf2e9024d @@ -0,0 +1 @@ +xeJ0=)xh aʊ'&۱v$-ۦhi}h4?<޼B|g!$xxN‹KSq.zNc$ud}X6 Z)`>J%L-)i( }̧KE ̙n׺o[03M6$.y6l޺\u$ ܂XJ(ɕ6uz \ No newline at end of file diff --git a/.git_disabled/objects/4e/de6d125b2d2624856bce9fe8416821467f22c4 b/.git_disabled/objects/4e/de6d125b2d2624856bce9fe8416821467f22c4 new file mode 100755 index 0000000..1a088e6 Binary files /dev/null and b/.git_disabled/objects/4e/de6d125b2d2624856bce9fe8416821467f22c4 differ diff --git a/.git_disabled/objects/4e/e5faa284af668242fd2f6f721b6903045ffbab b/.git_disabled/objects/4e/e5faa284af668242fd2f6f721b6903045ffbab new file mode 100755 index 0000000..dbb2444 Binary files /dev/null and b/.git_disabled/objects/4e/e5faa284af668242fd2f6f721b6903045ffbab differ diff --git a/.git_disabled/objects/4e/fbb18eb19267c1f1b3c77f5f7f4bd7a0b916f4 b/.git_disabled/objects/4e/fbb18eb19267c1f1b3c77f5f7f4bd7a0b916f4 new file mode 100755 index 0000000..4992062 Binary files /dev/null and b/.git_disabled/objects/4e/fbb18eb19267c1f1b3c77f5f7f4bd7a0b916f4 differ diff --git a/.git_disabled/objects/4f/03cf30f2c935887f96c315e44d51e365792628 b/.git_disabled/objects/4f/03cf30f2c935887f96c315e44d51e365792628 new file mode 100755 index 0000000..5dfd601 Binary files /dev/null and b/.git_disabled/objects/4f/03cf30f2c935887f96c315e44d51e365792628 differ diff --git a/.git_disabled/objects/4f/081ec6529a50421974f39bd64cf14d1e87386c b/.git_disabled/objects/4f/081ec6529a50421974f39bd64cf14d1e87386c new file mode 100755 index 0000000..b5ed904 Binary files /dev/null and b/.git_disabled/objects/4f/081ec6529a50421974f39bd64cf14d1e87386c differ diff --git a/.git_disabled/objects/4f/0bc394d08a9d45511855e8c66549ab2c977b89 b/.git_disabled/objects/4f/0bc394d08a9d45511855e8c66549ab2c977b89 new file mode 100755 index 0000000..207147d Binary files /dev/null and b/.git_disabled/objects/4f/0bc394d08a9d45511855e8c66549ab2c977b89 differ diff --git a/.git_disabled/objects/4f/1890a56e9185a6fc13d69a19e239661c110434 b/.git_disabled/objects/4f/1890a56e9185a6fc13d69a19e239661c110434 new file mode 100755 index 0000000..26e7d38 Binary files /dev/null and b/.git_disabled/objects/4f/1890a56e9185a6fc13d69a19e239661c110434 differ diff --git a/.git_disabled/objects/4f/2f5fea40f5094e6b93a2d68ee623319adc3810 b/.git_disabled/objects/4f/2f5fea40f5094e6b93a2d68ee623319adc3810 new file mode 100755 index 0000000..e939b55 Binary files /dev/null and b/.git_disabled/objects/4f/2f5fea40f5094e6b93a2d68ee623319adc3810 differ diff --git a/.git_disabled/objects/4f/383feef82008f3963afb9e3f0e19ef1589857c b/.git_disabled/objects/4f/383feef82008f3963afb9e3f0e19ef1589857c new file mode 100755 index 0000000..0b5292f Binary files /dev/null and b/.git_disabled/objects/4f/383feef82008f3963afb9e3f0e19ef1589857c differ diff --git a/.git_disabled/objects/4f/3986eef536d8f61b3ab8363b46ff7c7ee9d22f b/.git_disabled/objects/4f/3986eef536d8f61b3ab8363b46ff7c7ee9d22f new file mode 100755 index 0000000..81c0fcc Binary files /dev/null and b/.git_disabled/objects/4f/3986eef536d8f61b3ab8363b46ff7c7ee9d22f differ diff --git a/.git_disabled/objects/4f/3997bb8e775d6dc867fd9b7e9de57cda27365c b/.git_disabled/objects/4f/3997bb8e775d6dc867fd9b7e9de57cda27365c new file mode 100755 index 0000000..7eaa2b0 Binary files /dev/null and b/.git_disabled/objects/4f/3997bb8e775d6dc867fd9b7e9de57cda27365c differ diff --git a/.git_disabled/objects/4f/400f21e8618191bca40d67316ec0a20b40bf86 b/.git_disabled/objects/4f/400f21e8618191bca40d67316ec0a20b40bf86 new file mode 100755 index 0000000..f214ee0 Binary files /dev/null and b/.git_disabled/objects/4f/400f21e8618191bca40d67316ec0a20b40bf86 differ diff --git a/.git_disabled/objects/4f/49e9ba7e973fa264510f966853ec68e41ea9cf b/.git_disabled/objects/4f/49e9ba7e973fa264510f966853ec68e41ea9cf new file mode 100755 index 0000000..bd1ac96 Binary files /dev/null and b/.git_disabled/objects/4f/49e9ba7e973fa264510f966853ec68e41ea9cf differ diff --git a/.git_disabled/objects/4f/4aaee27ddf0f3e1c7a19516e0d9679cd266c85 b/.git_disabled/objects/4f/4aaee27ddf0f3e1c7a19516e0d9679cd266c85 new file mode 100755 index 0000000..f542d0e --- /dev/null +++ b/.git_disabled/objects/4f/4aaee27ddf0f3e1c7a19516e0d9679cd266c85 @@ -0,0 +1 @@ +x+)JMU026d040075U(J/Iu(/. IIM-)Ogx6M9{wk+qIOD]%@]`ŭl67^?ypaN5&@PVYRJ!J~)tcɟj!w+(MM,-H+LN,c[b?t]Ƈ>O>Am ݰ븀tB"3ya \ No newline at end of file diff --git a/.git_disabled/objects/4f/4d8bedb792f2ab9956ff2592270fa65ed2caff b/.git_disabled/objects/4f/4d8bedb792f2ab9956ff2592270fa65ed2caff new file mode 100755 index 0000000..a0f1eb1 Binary files /dev/null and b/.git_disabled/objects/4f/4d8bedb792f2ab9956ff2592270fa65ed2caff differ diff --git a/.git_disabled/objects/4f/52874d6bedf1b4e0deea3c4a2f2d2a4f2204a3 b/.git_disabled/objects/4f/52874d6bedf1b4e0deea3c4a2f2d2a4f2204a3 new file mode 100755 index 0000000..1fefa80 Binary files /dev/null and b/.git_disabled/objects/4f/52874d6bedf1b4e0deea3c4a2f2d2a4f2204a3 differ diff --git a/.git_disabled/objects/4f/623ec6af6329bcb3e9e95eec921131f1f2223b b/.git_disabled/objects/4f/623ec6af6329bcb3e9e95eec921131f1f2223b new file mode 100755 index 0000000..71eab48 --- /dev/null +++ b/.git_disabled/objects/4f/623ec6af6329bcb3e9e95eec921131f1f2223b @@ -0,0 +1,2 @@ +xmn0;)./vSUb[hAi%"+ 4ݻh0)Qn#[H޽ٝl%0D : xPkX-0n{~*JPd tf\[Y8}|$A+aAVkGgw<-l38unFJ:ΞMې&]Y,n%5ħ<9G:糱 xr]=C %,.we 2 xt]i MIvmߣunjM]uw%n8^} \ No newline at end of file diff --git a/.git_disabled/objects/4f/a9818b48b89829901e1b37e2832096acdcd73e b/.git_disabled/objects/4f/a9818b48b89829901e1b37e2832096acdcd73e new file mode 100755 index 0000000..71c6e87 Binary files /dev/null and b/.git_disabled/objects/4f/a9818b48b89829901e1b37e2832096acdcd73e differ diff --git a/.git_disabled/objects/4f/a9b9309fe6f139a9c6b0b2045fde29f9faedf2 b/.git_disabled/objects/4f/a9b9309fe6f139a9c6b0b2045fde29f9faedf2 new file mode 100755 index 0000000..29b5a8d Binary files /dev/null and b/.git_disabled/objects/4f/a9b9309fe6f139a9c6b0b2045fde29f9faedf2 differ diff --git a/.git_disabled/objects/4f/abfe8737350a9d482ddbce67e0c17619fe6b2a b/.git_disabled/objects/4f/abfe8737350a9d482ddbce67e0c17619fe6b2a new file mode 100755 index 0000000..63c833f Binary files /dev/null and b/.git_disabled/objects/4f/abfe8737350a9d482ddbce67e0c17619fe6b2a differ diff --git a/.git_disabled/objects/4f/b4539c7da4d09ee38ba33e4f4170def47d6ec6 b/.git_disabled/objects/4f/b4539c7da4d09ee38ba33e4f4170def47d6ec6 new file mode 100755 index 0000000..ed3a909 Binary files /dev/null and b/.git_disabled/objects/4f/b4539c7da4d09ee38ba33e4f4170def47d6ec6 differ diff --git a/.git_disabled/objects/4f/b7261368ee9df09d6586c1ac39bbda357cc17b b/.git_disabled/objects/4f/b7261368ee9df09d6586c1ac39bbda357cc17b new file mode 100755 index 0000000..9bd31d6 Binary files /dev/null and b/.git_disabled/objects/4f/b7261368ee9df09d6586c1ac39bbda357cc17b differ diff --git a/.git_disabled/objects/4f/c0ec970f31d83b6972e83373c480c016761120 b/.git_disabled/objects/4f/c0ec970f31d83b6972e83373c480c016761120 new file mode 100755 index 0000000..6ec5b43 Binary files /dev/null and b/.git_disabled/objects/4f/c0ec970f31d83b6972e83373c480c016761120 differ diff --git a/.git_disabled/objects/4f/c801aace59ead8a115450b52aa5b4e5a8bc97d b/.git_disabled/objects/4f/c801aace59ead8a115450b52aa5b4e5a8bc97d new file mode 100755 index 0000000..62e0b69 Binary files /dev/null and b/.git_disabled/objects/4f/c801aace59ead8a115450b52aa5b4e5a8bc97d differ diff --git a/.git_disabled/objects/4f/cb55ac2a4ffc4adc00c872a247a7fe5e5584a6 b/.git_disabled/objects/4f/cb55ac2a4ffc4adc00c872a247a7fe5e5584a6 new file mode 100755 index 0000000..76ed279 Binary files /dev/null and b/.git_disabled/objects/4f/cb55ac2a4ffc4adc00c872a247a7fe5e5584a6 differ diff --git a/.git_disabled/objects/4f/dc1c7edb1df2b080dcf1a0f119c9007ecd5b91 b/.git_disabled/objects/4f/dc1c7edb1df2b080dcf1a0f119c9007ecd5b91 new file mode 100755 index 0000000..643b240 Binary files /dev/null and b/.git_disabled/objects/4f/dc1c7edb1df2b080dcf1a0f119c9007ecd5b91 differ diff --git a/.git_disabled/objects/4f/de8b54a49e7640cd662902e35d831ddcede2e7 b/.git_disabled/objects/4f/de8b54a49e7640cd662902e35d831ddcede2e7 new file mode 100755 index 0000000..51a907e Binary files /dev/null and b/.git_disabled/objects/4f/de8b54a49e7640cd662902e35d831ddcede2e7 differ diff --git a/.git_disabled/objects/4f/dfbf012b09033182801a1a97d81fb28ca2de25 b/.git_disabled/objects/4f/dfbf012b09033182801a1a97d81fb28ca2de25 new file mode 100755 index 0000000..b0591aa Binary files /dev/null and b/.git_disabled/objects/4f/dfbf012b09033182801a1a97d81fb28ca2de25 differ diff --git a/.git_disabled/objects/4f/e5694d2580b24c8c9af17938b5d28cd38754a8 b/.git_disabled/objects/4f/e5694d2580b24c8c9af17938b5d28cd38754a8 new file mode 100755 index 0000000..a0b0603 Binary files /dev/null and b/.git_disabled/objects/4f/e5694d2580b24c8c9af17938b5d28cd38754a8 differ diff --git a/.git_disabled/objects/4f/ea784855d46725bdcb9ed43537e249bb3f8eee b/.git_disabled/objects/4f/ea784855d46725bdcb9ed43537e249bb3f8eee new file mode 100755 index 0000000..1f83938 Binary files /dev/null and b/.git_disabled/objects/4f/ea784855d46725bdcb9ed43537e249bb3f8eee differ diff --git a/.git_disabled/objects/4f/f58a7325e5a65b0cb6605349fee9fa7270a32a b/.git_disabled/objects/4f/f58a7325e5a65b0cb6605349fee9fa7270a32a new file mode 100755 index 0000000..89fb462 Binary files /dev/null and b/.git_disabled/objects/4f/f58a7325e5a65b0cb6605349fee9fa7270a32a differ diff --git a/.git_disabled/objects/50/07c8e0b78e47f68e64cc94951d208ba2008b43 b/.git_disabled/objects/50/07c8e0b78e47f68e64cc94951d208ba2008b43 new file mode 100755 index 0000000..a7551ed Binary files /dev/null and b/.git_disabled/objects/50/07c8e0b78e47f68e64cc94951d208ba2008b43 differ diff --git a/.git_disabled/objects/50/2ae1b34160d8e0356f9eef7772b9647d599058 b/.git_disabled/objects/50/2ae1b34160d8e0356f9eef7772b9647d599058 new file mode 100755 index 0000000..5da1261 Binary files /dev/null and b/.git_disabled/objects/50/2ae1b34160d8e0356f9eef7772b9647d599058 differ diff --git a/.git_disabled/objects/50/4441eae8a5d6092cd986652c62a3c16b245281 b/.git_disabled/objects/50/4441eae8a5d6092cd986652c62a3c16b245281 new file mode 100755 index 0000000..1c3a119 Binary files /dev/null and b/.git_disabled/objects/50/4441eae8a5d6092cd986652c62a3c16b245281 differ diff --git a/.git_disabled/objects/50/465e9a379a8742ba35ad23d8cca38c36e3ea76 b/.git_disabled/objects/50/465e9a379a8742ba35ad23d8cca38c36e3ea76 new file mode 100755 index 0000000..ae71c18 Binary files /dev/null and b/.git_disabled/objects/50/465e9a379a8742ba35ad23d8cca38c36e3ea76 differ diff --git a/.git_disabled/objects/50/5543330af8a36af7f32fbb7265ef6b1c13f67c b/.git_disabled/objects/50/5543330af8a36af7f32fbb7265ef6b1c13f67c new file mode 100755 index 0000000..416c776 --- /dev/null +++ b/.git_disabled/objects/50/5543330af8a36af7f32fbb7265ef6b1c13f67c @@ -0,0 +1,2 @@ +x1N0@QjbzVN:=X;rrz$8ok`, efo ƘNYPDvHN$oGA/aE B.DM#N +;<|֪Xrya[=hwzx>%;-دP ιs7SO \ No newline at end of file diff --git a/.git_disabled/objects/50/5e555044702fa3f8bba9812766eca99a20cada b/.git_disabled/objects/50/5e555044702fa3f8bba9812766eca99a20cada new file mode 100755 index 0000000..b72444a Binary files /dev/null and b/.git_disabled/objects/50/5e555044702fa3f8bba9812766eca99a20cada differ diff --git a/.git_disabled/objects/50/783ba4a6325f5d83d3af3278abf8dd457e29f2 b/.git_disabled/objects/50/783ba4a6325f5d83d3af3278abf8dd457e29f2 new file mode 100755 index 0000000..f7224d5 Binary files /dev/null and b/.git_disabled/objects/50/783ba4a6325f5d83d3af3278abf8dd457e29f2 differ diff --git a/.git_disabled/objects/50/79c250ee760dcad1bbcbdd5ebaeee25de94e51 b/.git_disabled/objects/50/79c250ee760dcad1bbcbdd5ebaeee25de94e51 new file mode 100755 index 0000000..2180165 Binary files /dev/null and b/.git_disabled/objects/50/79c250ee760dcad1bbcbdd5ebaeee25de94e51 differ diff --git a/.git_disabled/objects/50/8820e67ce7dc4dcb412ee1bb0007c1898d4054 b/.git_disabled/objects/50/8820e67ce7dc4dcb412ee1bb0007c1898d4054 new file mode 100755 index 0000000..4c38a01 Binary files /dev/null and b/.git_disabled/objects/50/8820e67ce7dc4dcb412ee1bb0007c1898d4054 differ diff --git a/.git_disabled/objects/50/8f32a743db20486b9bf945e84176f122bccf20 b/.git_disabled/objects/50/8f32a743db20486b9bf945e84176f122bccf20 new file mode 100755 index 0000000..5a1e99a Binary files /dev/null and b/.git_disabled/objects/50/8f32a743db20486b9bf945e84176f122bccf20 differ diff --git a/.git_disabled/objects/50/a565e74d7d86ef6cdc2e72080793f1739496f7 b/.git_disabled/objects/50/a565e74d7d86ef6cdc2e72080793f1739496f7 new file mode 100755 index 0000000..310278a --- /dev/null +++ b/.git_disabled/objects/50/a565e74d7d86ef6cdc2e72080793f1739496f7 @@ -0,0 +1,3 @@ +xAk@{W Fkkbm ( ؅;}Z݈؃ea֚^?{;{s 29H +L1m^oZ2ld*2!Ҽ1 :D^QqcƄ2$(VB9=PɒbNeQ̮5{=֩+Ee%<~ӏT! +^  CeZTA\4] &!$·v#v`JK{, k-(Nr6MxG2&Vrsi?*`%-Z~MIgg륰3VWۧ \ No newline at end of file diff --git a/.git_disabled/objects/50/ac3ccbaf9c9434a3de16cffd10e11d1941f42c b/.git_disabled/objects/50/ac3ccbaf9c9434a3de16cffd10e11d1941f42c new file mode 100755 index 0000000..2615e0c Binary files /dev/null and b/.git_disabled/objects/50/ac3ccbaf9c9434a3de16cffd10e11d1941f42c differ diff --git a/.git_disabled/objects/50/cc716bb8cf75927f013a9c68dacaf24de3eaf3 b/.git_disabled/objects/50/cc716bb8cf75927f013a9c68dacaf24de3eaf3 new file mode 100755 index 0000000..68e72e7 Binary files /dev/null and b/.git_disabled/objects/50/cc716bb8cf75927f013a9c68dacaf24de3eaf3 differ diff --git a/.git_disabled/objects/50/e647515e1ab3fd860c81af6578ccf5ae67b6a7 b/.git_disabled/objects/50/e647515e1ab3fd860c81af6578ccf5ae67b6a7 new file mode 100755 index 0000000..bfa5f91 Binary files /dev/null and b/.git_disabled/objects/50/e647515e1ab3fd860c81af6578ccf5ae67b6a7 differ diff --git a/.git_disabled/objects/50/f0ca9fca4d630624929631d306abf541e225cb b/.git_disabled/objects/50/f0ca9fca4d630624929631d306abf541e225cb new file mode 100755 index 0000000..9d27ee2 Binary files /dev/null and b/.git_disabled/objects/50/f0ca9fca4d630624929631d306abf541e225cb differ diff --git a/.git_disabled/objects/51/17c7d3d78b96da66d330b47a659d8427a26e71 b/.git_disabled/objects/51/17c7d3d78b96da66d330b47a659d8427a26e71 new file mode 100755 index 0000000..d43aef5 Binary files /dev/null and b/.git_disabled/objects/51/17c7d3d78b96da66d330b47a659d8427a26e71 differ diff --git a/.git_disabled/objects/51/2b857d7050891ed40339805cf3afe204dcc2b2 b/.git_disabled/objects/51/2b857d7050891ed40339805cf3afe204dcc2b2 new file mode 100755 index 0000000..097038a Binary files /dev/null and b/.git_disabled/objects/51/2b857d7050891ed40339805cf3afe204dcc2b2 differ diff --git a/.git_disabled/objects/51/4fe66c4fd94cbc173bcfd473aaed82694609d5 b/.git_disabled/objects/51/4fe66c4fd94cbc173bcfd473aaed82694609d5 new file mode 100755 index 0000000..c307e63 Binary files /dev/null and b/.git_disabled/objects/51/4fe66c4fd94cbc173bcfd473aaed82694609d5 differ diff --git a/.git_disabled/objects/51/6af2f367ba47317944cb5b832f3bfefbba2ac3 b/.git_disabled/objects/51/6af2f367ba47317944cb5b832f3bfefbba2ac3 new file mode 100755 index 0000000..d4b232f Binary files /dev/null and b/.git_disabled/objects/51/6af2f367ba47317944cb5b832f3bfefbba2ac3 differ diff --git a/.git_disabled/objects/51/6b3ec3b38a4b140f5d607dd28da989f057b832 b/.git_disabled/objects/51/6b3ec3b38a4b140f5d607dd28da989f057b832 new file mode 100755 index 0000000..72c3cfb Binary files /dev/null and b/.git_disabled/objects/51/6b3ec3b38a4b140f5d607dd28da989f057b832 differ diff --git a/.git_disabled/objects/51/ae4967efb52ee933d9f1b10bab6c1628734da0 b/.git_disabled/objects/51/ae4967efb52ee933d9f1b10bab6c1628734da0 new file mode 100755 index 0000000..35c7edf --- /dev/null +++ b/.git_disabled/objects/51/ae4967efb52ee933d9f1b10bab6c1628734da0 @@ -0,0 +1 @@ +xn0EW Ѕ²eG,UUQ9KÇ/U(Ad%@\޺W5&Ig%mf&k%d~Ei)c^CoIRm_-R!;@hl}b:1aclP+}0Gpo-&1.\' C!D׋iY&^J0fH-B[tuLPZݯVݱW@zv;}DJW[MFYq1d\8e[ <0 Vgm.]~moyAtY][仓wnʹ-X6K=uug8k;~R.eP3%^01@Yn9y>)G,AHd[FbD_FKSӱSѦb^{89x|u9OӧT56:઄B+oEzHC)TBgvJ] tIZ(;,U%Zbfp/ +T޸h\&[[`|$W9n>$6^h[jex|.a(,jmvH@4Fb z5 nu|p_Kȱ A[ +˸ 7\:RrsjPVTn*3Լ4I{E[ 5W5Ky+nS.ͺt5 rhzdZvpEr9y?^5* gHi5rC)e rgf D-^Ybަ=cm͡~f.74FRì +>bO}'1mMh:4v7FEC+1rpt! pD`~@9  - +힏+zUr8MZʜ U2RІi%tHKn}=Qżd)m榑۪}##S}[`00Qvk|>qU2\<Ҟ}ƭTGei>7-^_9$|2S6||[s뾳j Fps-y u7T)dLV1]>3gS3 7,獳N>˘Z| <cjq8'[F0C?Z'|'@Zxs׃<·÷Ә)m9N8A>w}+=_o;Xև +g}|u׿ϿU@ќG|3V7y/fiw+7m6 z \ No newline at end of file diff --git a/.git_disabled/objects/53/e46022953cd1b94c3f453b6e3a284d47320c52 b/.git_disabled/objects/53/e46022953cd1b94c3f453b6e3a284d47320c52 new file mode 100755 index 0000000..c778e19 --- /dev/null +++ b/.git_disabled/objects/53/e46022953cd1b94c3f453b6e3a284d47320c52 @@ -0,0 +1,7 @@ +x}T=o@_12M@ +tHB "(IڳǗ%];w%JIQХH#~.x?̼f2]X6%3mg8h;bKQWڢ,.$.R, +TVnM*=bk +So9_ucIzeR\a2T.Lܚ[W2AHt)ǓGFc5f +CyUa~ sG :#mnH!t /"@UT?ez1-s=)9ǹkCI0+8nAظ8s;;M&EǩPp; +>aK4 ezq7ua ¨uI Foag}cc}kv׶. ;~F'v+$[@ n-/*)yp"d$, 3ȍ>5z\HW?_%bʌ#C꼇+pPF"~Z0P:̈́{Zs !U5TgJ[uG]k>4QO l? .?~b^8j[? BQn^E'l?zꁀ&uGi."Tn{2$$)I'ux%Ҽ҇ \ No newline at end of file diff --git a/.git_disabled/objects/53/e88cefbb40fe50bcd9b83c95b203ebdfc43e6d b/.git_disabled/objects/53/e88cefbb40fe50bcd9b83c95b203ebdfc43e6d new file mode 100755 index 0000000..01cd7ba Binary files /dev/null and b/.git_disabled/objects/53/e88cefbb40fe50bcd9b83c95b203ebdfc43e6d differ diff --git a/.git_disabled/objects/53/ee4cbe95251fb813089e3e2fbbb2bf3da1524c b/.git_disabled/objects/53/ee4cbe95251fb813089e3e2fbbb2bf3da1524c new file mode 100755 index 0000000..058f0f3 Binary files /dev/null and b/.git_disabled/objects/53/ee4cbe95251fb813089e3e2fbbb2bf3da1524c differ diff --git a/.git_disabled/objects/54/0213e738208ae1bf9ddbc20c24e4c82835828c b/.git_disabled/objects/54/0213e738208ae1bf9ddbc20c24e4c82835828c new file mode 100755 index 0000000..a6f29e9 Binary files /dev/null and b/.git_disabled/objects/54/0213e738208ae1bf9ddbc20c24e4c82835828c differ diff --git a/.git_disabled/objects/54/082488bb49437cdc8e85618eeb40f948a3aa74 b/.git_disabled/objects/54/082488bb49437cdc8e85618eeb40f948a3aa74 new file mode 100755 index 0000000..26ae313 Binary files /dev/null and b/.git_disabled/objects/54/082488bb49437cdc8e85618eeb40f948a3aa74 differ diff --git a/.git_disabled/objects/54/19ca35ad32e4dd7c2d1689038e9b9d77890850 b/.git_disabled/objects/54/19ca35ad32e4dd7c2d1689038e9b9d77890850 new file mode 100755 index 0000000..e3779bf Binary files /dev/null and b/.git_disabled/objects/54/19ca35ad32e4dd7c2d1689038e9b9d77890850 differ diff --git a/.git_disabled/objects/54/2066f9dbb1d00f6e2e1aa5b021d907df8dbfce b/.git_disabled/objects/54/2066f9dbb1d00f6e2e1aa5b021d907df8dbfce new file mode 100755 index 0000000..db7e2d6 Binary files /dev/null and b/.git_disabled/objects/54/2066f9dbb1d00f6e2e1aa5b021d907df8dbfce differ diff --git a/.git_disabled/objects/54/21429ad863060f2ae53d61bb8642445451c5c9 b/.git_disabled/objects/54/21429ad863060f2ae53d61bb8642445451c5c9 new file mode 100755 index 0000000..4614116 --- /dev/null +++ b/.git_disabled/objects/54/21429ad863060f2ae53d61bb8642445451c5c9 @@ -0,0 +1,4 @@ +xS]k0ݳŅ4&m e`Lv{|mk%#_$ib[:{beb><|Y@d,p-a{wP{9weN@+O "ޟ! + Z~ϥ$B[&= +-[T&P-њa;xޗp8y66ۨnm^GO?O @$P9GokHDRp/@O龚?<1ZiH'-Xъ9%P:a"Zbԉt*2&05&T$&qOAt=HzEfnB5H<5 i7 +?Bf;_ZPRCuwP+pBEi^2Qs5τ84!=pfM, "@6ʴ>*V)rȰ;W usQ=N3Rac&v3x8pچ6J~91YkPhp \ No newline at end of file diff --git a/.git_disabled/objects/54/223ecd03684d9c5689466f2105429f9be68f5b b/.git_disabled/objects/54/223ecd03684d9c5689466f2105429f9be68f5b new file mode 100755 index 0000000..8adcdd8 Binary files /dev/null and b/.git_disabled/objects/54/223ecd03684d9c5689466f2105429f9be68f5b differ diff --git a/.git_disabled/objects/54/27056ffd24eb0e1fbf2983d0329f38024e50f3 b/.git_disabled/objects/54/27056ffd24eb0e1fbf2983d0329f38024e50f3 new file mode 100755 index 0000000..d506d53 Binary files /dev/null and b/.git_disabled/objects/54/27056ffd24eb0e1fbf2983d0329f38024e50f3 differ diff --git a/.git_disabled/objects/54/2f8faac75f6050b302c1ed252010a4a63c1d37 b/.git_disabled/objects/54/2f8faac75f6050b302c1ed252010a4a63c1d37 new file mode 100755 index 0000000..ddb687b Binary files /dev/null and b/.git_disabled/objects/54/2f8faac75f6050b302c1ed252010a4a63c1d37 differ diff --git a/.git_disabled/objects/54/3375fdca89e5abfad5f96bc40f04c8da698bbf b/.git_disabled/objects/54/3375fdca89e5abfad5f96bc40f04c8da698bbf new file mode 100755 index 0000000..dc06fc1 Binary files /dev/null and b/.git_disabled/objects/54/3375fdca89e5abfad5f96bc40f04c8da698bbf differ diff --git a/.git_disabled/objects/54/5007c3fdc556d1dc4ceeb4311530101f1c59af b/.git_disabled/objects/54/5007c3fdc556d1dc4ceeb4311530101f1c59af new file mode 100755 index 0000000..ba767c9 Binary files /dev/null and b/.git_disabled/objects/54/5007c3fdc556d1dc4ceeb4311530101f1c59af differ diff --git a/.git_disabled/objects/54/61be24f25616df23ad65a0440671adc0671cc7 b/.git_disabled/objects/54/61be24f25616df23ad65a0440671adc0671cc7 new file mode 100755 index 0000000..6f2f5dc Binary files /dev/null and b/.git_disabled/objects/54/61be24f25616df23ad65a0440671adc0671cc7 differ diff --git a/.git_disabled/objects/54/63e6346e583f434c8be640d3814e677ae68862 b/.git_disabled/objects/54/63e6346e583f434c8be640d3814e677ae68862 new file mode 100755 index 0000000..9346b8a --- /dev/null +++ b/.git_disabled/objects/54/63e6346e583f434c8be640d3814e677ae68862 @@ -0,0 +1,5 @@ +x}MO@=Wp)IQ^@D$QbY~l%ƣƄ-B4dS8;9=qI +4JнܲT"r$kTwyb'RlBI*xD B0>'1UDRϼ4, v>7@ʀC2gSZ[ՄK*1D?;.0H3[ }4߆E5/e) N<^[BxB +H_@^`_w}-1hϵ +\ϻus/QĠު=w\zdԿC +Jۈ(,~ 6ZLV*6f-R \ No newline at end of file diff --git a/.git_disabled/objects/54/6ebbc624b0e3baf58efc6a8dd149ac5e6074e6 b/.git_disabled/objects/54/6ebbc624b0e3baf58efc6a8dd149ac5e6074e6 new file mode 100755 index 0000000..72fe058 Binary files /dev/null and b/.git_disabled/objects/54/6ebbc624b0e3baf58efc6a8dd149ac5e6074e6 differ diff --git a/.git_disabled/objects/54/8430f8f621e886ba5b0f79de2bc24f8b96aaac b/.git_disabled/objects/54/8430f8f621e886ba5b0f79de2bc24f8b96aaac new file mode 100755 index 0000000..f6934d5 Binary files /dev/null and b/.git_disabled/objects/54/8430f8f621e886ba5b0f79de2bc24f8b96aaac differ diff --git a/.git_disabled/objects/54/91c6899a2f31e2f5f9a45ae661f95e20645198 b/.git_disabled/objects/54/91c6899a2f31e2f5f9a45ae661f95e20645198 new file mode 100755 index 0000000..4e0edf8 Binary files /dev/null and b/.git_disabled/objects/54/91c6899a2f31e2f5f9a45ae661f95e20645198 differ diff --git a/.git_disabled/objects/54/985bd4180ab97c880ad55953328361291a06db b/.git_disabled/objects/54/985bd4180ab97c880ad55953328361291a06db new file mode 100755 index 0000000..8c9bfa5 Binary files /dev/null and b/.git_disabled/objects/54/985bd4180ab97c880ad55953328361291a06db differ diff --git a/.git_disabled/objects/54/9be9cc807e90764f9893a3322368923aca576b b/.git_disabled/objects/54/9be9cc807e90764f9893a3322368923aca576b new file mode 100755 index 0000000..97e8098 Binary files /dev/null and b/.git_disabled/objects/54/9be9cc807e90764f9893a3322368923aca576b differ diff --git a/.git_disabled/objects/54/ae96015a0afc4aa03ac930006fb442a9142bf6 b/.git_disabled/objects/54/ae96015a0afc4aa03ac930006fb442a9142bf6 new file mode 100755 index 0000000..b495175 Binary files /dev/null and b/.git_disabled/objects/54/ae96015a0afc4aa03ac930006fb442a9142bf6 differ diff --git a/.git_disabled/objects/54/bf44ae21146c4fc9ce09fc31268d1d15516042 b/.git_disabled/objects/54/bf44ae21146c4fc9ce09fc31268d1d15516042 new file mode 100755 index 0000000..e24c86e Binary files /dev/null and b/.git_disabled/objects/54/bf44ae21146c4fc9ce09fc31268d1d15516042 differ diff --git a/.git_disabled/objects/54/e7bff5ad1cf7f9c7cae8fb4e13a49247ff044a b/.git_disabled/objects/54/e7bff5ad1cf7f9c7cae8fb4e13a49247ff044a new file mode 100755 index 0000000..58ba3e8 --- /dev/null +++ b/.git_disabled/objects/54/e7bff5ad1cf7f9c7cae8fb4e13a49247ff044a @@ -0,0 +1,5 @@ +xm +0P?E6Mv| .l{Ũm$"H +FWaj, 9z|#v M<.aLh +,Sy2S*kgWNTGV3u !^.zK Wcm)}{ ,u.U!W}q4]d?Ns: + ^JB诫]u9jY_kT \ No newline at end of file diff --git a/.git_disabled/objects/55/0a670961ee210b0a037ba9a3f3d5b4a719f275 b/.git_disabled/objects/55/0a670961ee210b0a037ba9a3f3d5b4a719f275 new file mode 100755 index 0000000..6e95255 Binary files /dev/null and b/.git_disabled/objects/55/0a670961ee210b0a037ba9a3f3d5b4a719f275 differ diff --git a/.git_disabled/objects/55/1ad2cf12d05064348e0c63fa4f9347a25ba079 b/.git_disabled/objects/55/1ad2cf12d05064348e0c63fa4f9347a25ba079 new file mode 100755 index 0000000..51d0ffe Binary files /dev/null and b/.git_disabled/objects/55/1ad2cf12d05064348e0c63fa4f9347a25ba079 differ diff --git a/.git_disabled/objects/55/204fc79f6ef47ad40b22e2b4f9ee30356df543 b/.git_disabled/objects/55/204fc79f6ef47ad40b22e2b4f9ee30356df543 new file mode 100755 index 0000000..2a9a7a5 Binary files /dev/null and b/.git_disabled/objects/55/204fc79f6ef47ad40b22e2b4f9ee30356df543 differ diff --git a/.git_disabled/objects/55/22875732f963afb587f48e950a1987edda110a b/.git_disabled/objects/55/22875732f963afb587f48e950a1987edda110a new file mode 100755 index 0000000..390fb6d Binary files /dev/null and b/.git_disabled/objects/55/22875732f963afb587f48e950a1987edda110a differ diff --git a/.git_disabled/objects/55/2c534b0966275664072176de775127cf416a8d b/.git_disabled/objects/55/2c534b0966275664072176de775127cf416a8d new file mode 100755 index 0000000..ab8301c Binary files /dev/null and b/.git_disabled/objects/55/2c534b0966275664072176de775127cf416a8d differ diff --git a/.git_disabled/objects/55/396f758860de1ef6c466401640ff7a9968d76d b/.git_disabled/objects/55/396f758860de1ef6c466401640ff7a9968d76d new file mode 100755 index 0000000..52a1fb0 Binary files /dev/null and b/.git_disabled/objects/55/396f758860de1ef6c466401640ff7a9968d76d differ diff --git a/.git_disabled/objects/55/3cdbadf481c6948689516bbe595f02d551a5f0 b/.git_disabled/objects/55/3cdbadf481c6948689516bbe595f02d551a5f0 new file mode 100755 index 0000000..143dc9b Binary files /dev/null and b/.git_disabled/objects/55/3cdbadf481c6948689516bbe595f02d551a5f0 differ diff --git a/.git_disabled/objects/55/4efcf6b381a9a7b82841b13ae27772012dd844 b/.git_disabled/objects/55/4efcf6b381a9a7b82841b13ae27772012dd844 new file mode 100755 index 0000000..e210f66 Binary files /dev/null and b/.git_disabled/objects/55/4efcf6b381a9a7b82841b13ae27772012dd844 differ diff --git a/.git_disabled/objects/55/70b0b7e1fcaf4b020b821c0feed0905e1a0af5 b/.git_disabled/objects/55/70b0b7e1fcaf4b020b821c0feed0905e1a0af5 new file mode 100755 index 0000000..fb7f6c9 Binary files /dev/null and b/.git_disabled/objects/55/70b0b7e1fcaf4b020b821c0feed0905e1a0af5 differ diff --git a/.git_disabled/objects/55/727dec6b5400e93baf2c7eec7231a91db392a1 b/.git_disabled/objects/55/727dec6b5400e93baf2c7eec7231a91db392a1 new file mode 100755 index 0000000..55dd293 Binary files /dev/null and b/.git_disabled/objects/55/727dec6b5400e93baf2c7eec7231a91db392a1 differ diff --git a/.git_disabled/objects/55/770c890a9e177bb9c3bb2b739a47ff72e3b0f2 b/.git_disabled/objects/55/770c890a9e177bb9c3bb2b739a47ff72e3b0f2 new file mode 100755 index 0000000..16feb32 Binary files /dev/null and b/.git_disabled/objects/55/770c890a9e177bb9c3bb2b739a47ff72e3b0f2 differ diff --git a/.git_disabled/objects/55/8187c0b417140abd9b07dbfa5eb96c0fe10ef1 b/.git_disabled/objects/55/8187c0b417140abd9b07dbfa5eb96c0fe10ef1 new file mode 100755 index 0000000..e97e0ca Binary files /dev/null and b/.git_disabled/objects/55/8187c0b417140abd9b07dbfa5eb96c0fe10ef1 differ diff --git a/.git_disabled/objects/55/873c9a617d0cae1ccf03bd4cabeefba9cf3471 b/.git_disabled/objects/55/873c9a617d0cae1ccf03bd4cabeefba9cf3471 new file mode 100755 index 0000000..51a7ba8 Binary files /dev/null and b/.git_disabled/objects/55/873c9a617d0cae1ccf03bd4cabeefba9cf3471 differ diff --git a/.git_disabled/objects/55/8fb08d0092dcd0c618fc9ddf48249fe2dbca0c b/.git_disabled/objects/55/8fb08d0092dcd0c618fc9ddf48249fe2dbca0c new file mode 100755 index 0000000..8ec1850 Binary files /dev/null and b/.git_disabled/objects/55/8fb08d0092dcd0c618fc9ddf48249fe2dbca0c differ diff --git a/.git_disabled/objects/55/a4fbf12ca775b1a1b0d49f4ddbc3c50ab570d3 b/.git_disabled/objects/55/a4fbf12ca775b1a1b0d49f4ddbc3c50ab570d3 new file mode 100755 index 0000000..d868ca7 Binary files /dev/null and b/.git_disabled/objects/55/a4fbf12ca775b1a1b0d49f4ddbc3c50ab570d3 differ diff --git a/.git_disabled/objects/55/cbdf282f179e7d31e37655e7ddab01a19f3068 b/.git_disabled/objects/55/cbdf282f179e7d31e37655e7ddab01a19f3068 new file mode 100755 index 0000000..cd1e878 --- /dev/null +++ b/.git_disabled/objects/55/cbdf282f179e7d31e37655e7ddab01a19f3068 @@ -0,0 +1,2 @@ +x}QN@uW܄h(tĭ+N:Զ6%kOΙ{Ι{hw;Gexyz?p |aJ2X%VND,JvJ[0a 5[e(# $0SADCFk }.W%Z f#M#?FwJFѴ|^׿[z(]S7EMI7wEYդ5r _E0*lSie4"f1 tp}/phhhۮJԶKTҵ`g]fA5b1κ2ENAѕz`d +7B } >e<ABTFPQJ'j LJ \ No newline at end of file diff --git a/.git_disabled/objects/55/e17607044c73551e05c9455d9b35e8093ff318 b/.git_disabled/objects/55/e17607044c73551e05c9455d9b35e8093ff318 new file mode 100755 index 0000000..47144a1 Binary files /dev/null and b/.git_disabled/objects/55/e17607044c73551e05c9455d9b35e8093ff318 differ diff --git a/.git_disabled/objects/55/e9ffe2e8b4378fdceea28dabfb395dd66a8375 b/.git_disabled/objects/55/e9ffe2e8b4378fdceea28dabfb395dd66a8375 new file mode 100755 index 0000000..bafe1be Binary files /dev/null and b/.git_disabled/objects/55/e9ffe2e8b4378fdceea28dabfb395dd66a8375 differ diff --git a/.git_disabled/objects/56/1240334d3c87e0de443f94f0f5fbeb3947fa8c b/.git_disabled/objects/56/1240334d3c87e0de443f94f0f5fbeb3947fa8c new file mode 100755 index 0000000..abb61cc Binary files /dev/null and b/.git_disabled/objects/56/1240334d3c87e0de443f94f0f5fbeb3947fa8c differ diff --git a/.git_disabled/objects/56/1b9ba76654268bd2529f7e5064f922f58fdb91 b/.git_disabled/objects/56/1b9ba76654268bd2529f7e5064f922f58fdb91 new file mode 100755 index 0000000..b35daa8 Binary files /dev/null and b/.git_disabled/objects/56/1b9ba76654268bd2529f7e5064f922f58fdb91 differ diff --git a/.git_disabled/objects/56/26eb84aa499ff7edb391abe16ae631dba8dcb7 b/.git_disabled/objects/56/26eb84aa499ff7edb391abe16ae631dba8dcb7 new file mode 100755 index 0000000..444c7e0 Binary files /dev/null and b/.git_disabled/objects/56/26eb84aa499ff7edb391abe16ae631dba8dcb7 differ diff --git a/.git_disabled/objects/56/2811e697763a6e589c4f0a5f021fc11e52492d b/.git_disabled/objects/56/2811e697763a6e589c4f0a5f021fc11e52492d new file mode 100755 index 0000000..8dff626 Binary files /dev/null and b/.git_disabled/objects/56/2811e697763a6e589c4f0a5f021fc11e52492d differ diff --git a/.git_disabled/objects/56/46b029b6236d7790ee4e5da38000a2dd713c35 b/.git_disabled/objects/56/46b029b6236d7790ee4e5da38000a2dd713c35 new file mode 100755 index 0000000..fe1b55f Binary files /dev/null and b/.git_disabled/objects/56/46b029b6236d7790ee4e5da38000a2dd713c35 differ diff --git a/.git_disabled/objects/56/4aea00ff65745b57fe497a1e2e5f52b441fcb0 b/.git_disabled/objects/56/4aea00ff65745b57fe497a1e2e5f52b441fcb0 new file mode 100755 index 0000000..8247905 Binary files /dev/null and b/.git_disabled/objects/56/4aea00ff65745b57fe497a1e2e5f52b441fcb0 differ diff --git a/.git_disabled/objects/56/5aa85b4052a4d2488a2064f4da844213f627ce b/.git_disabled/objects/56/5aa85b4052a4d2488a2064f4da844213f627ce new file mode 100755 index 0000000..efaf7b1 Binary files /dev/null and b/.git_disabled/objects/56/5aa85b4052a4d2488a2064f4da844213f627ce differ diff --git a/.git_disabled/objects/56/6edf1c3b66085af208e47706b62847e0414da9 b/.git_disabled/objects/56/6edf1c3b66085af208e47706b62847e0414da9 new file mode 100755 index 0000000..651dd98 Binary files /dev/null and b/.git_disabled/objects/56/6edf1c3b66085af208e47706b62847e0414da9 differ diff --git a/.git_disabled/objects/56/8dea62a919cb4d047db61cd2042889ca30f64d b/.git_disabled/objects/56/8dea62a919cb4d047db61cd2042889ca30f64d new file mode 100755 index 0000000..353cbe3 Binary files /dev/null and b/.git_disabled/objects/56/8dea62a919cb4d047db61cd2042889ca30f64d differ diff --git a/.git_disabled/objects/56/8f1e0e72697af60a4c49c43073652b2510d4ab b/.git_disabled/objects/56/8f1e0e72697af60a4c49c43073652b2510d4ab new file mode 100755 index 0000000..97cc3e9 Binary files /dev/null and b/.git_disabled/objects/56/8f1e0e72697af60a4c49c43073652b2510d4ab differ diff --git a/.git_disabled/objects/56/b2fdcb2949e29fefb2a0bbcaf06ae7b2bb3fd0 b/.git_disabled/objects/56/b2fdcb2949e29fefb2a0bbcaf06ae7b2bb3fd0 new file mode 100755 index 0000000..0575b3c Binary files /dev/null and b/.git_disabled/objects/56/b2fdcb2949e29fefb2a0bbcaf06ae7b2bb3fd0 differ diff --git a/.git_disabled/objects/56/b90ec99e84b219423df539d031d3dd39c7f92f b/.git_disabled/objects/56/b90ec99e84b219423df539d031d3dd39c7f92f new file mode 100755 index 0000000..80601dd Binary files /dev/null and b/.git_disabled/objects/56/b90ec99e84b219423df539d031d3dd39c7f92f differ diff --git a/.git_disabled/objects/56/bb8ed00044c68bde25121df5c030e734528aaa b/.git_disabled/objects/56/bb8ed00044c68bde25121df5c030e734528aaa new file mode 100755 index 0000000..1f3db31 Binary files /dev/null and b/.git_disabled/objects/56/bb8ed00044c68bde25121df5c030e734528aaa differ diff --git a/.git_disabled/objects/56/c3b8cb11f294247e29b9b73d3f99b32def8e97 b/.git_disabled/objects/56/c3b8cb11f294247e29b9b73d3f99b32def8e97 new file mode 100755 index 0000000..475befe Binary files /dev/null and b/.git_disabled/objects/56/c3b8cb11f294247e29b9b73d3f99b32def8e97 differ diff --git a/.git_disabled/objects/56/ef48912b46afc4a691bf1553d12455b323e462 b/.git_disabled/objects/56/ef48912b46afc4a691bf1553d12455b323e462 new file mode 100755 index 0000000..0a22589 Binary files /dev/null and b/.git_disabled/objects/56/ef48912b46afc4a691bf1553d12455b323e462 differ diff --git a/.git_disabled/objects/57/02f2bc1c8b4b42d7c29bc5d0a5551c1632659f b/.git_disabled/objects/57/02f2bc1c8b4b42d7c29bc5d0a5551c1632659f new file mode 100755 index 0000000..f2171a1 Binary files /dev/null and b/.git_disabled/objects/57/02f2bc1c8b4b42d7c29bc5d0a5551c1632659f differ diff --git a/.git_disabled/objects/57/1aa61609cac301771545af44dc57557ba55e8a b/.git_disabled/objects/57/1aa61609cac301771545af44dc57557ba55e8a new file mode 100755 index 0000000..442ed90 Binary files /dev/null and b/.git_disabled/objects/57/1aa61609cac301771545af44dc57557ba55e8a differ diff --git a/.git_disabled/objects/57/217a7be7de9957c4b39ef7770d1d7d3fda9930 b/.git_disabled/objects/57/217a7be7de9957c4b39ef7770d1d7d3fda9930 new file mode 100755 index 0000000..22b355e Binary files /dev/null and b/.git_disabled/objects/57/217a7be7de9957c4b39ef7770d1d7d3fda9930 differ diff --git a/.git_disabled/objects/57/57754aae85250910996dda70d43bf9fe191e38 b/.git_disabled/objects/57/57754aae85250910996dda70d43bf9fe191e38 new file mode 100755 index 0000000..807757c --- /dev/null +++ b/.git_disabled/objects/57/57754aae85250910996dda70d43bf9fe191e38 @@ -0,0 +1 @@ +xOAN0WJt +gڶJ ^Oe6u2^? ,8)-5U0y xZ{JZa6A8"OYfZ*}74ze}'8iEϪcjw{^u~\"n7v) _(u\)6/[~(;vDiMȻw!_tgy<-!/fX[OI5QR {) E#f Uo-D5DTZf1F`Ц7}4v㚌e L,gӃ.wۨcG(^: sI— MyjQ䌂IWaة>½ +"oSȋI!! c~UQu)Yg11d}/μ +^}Vc|2t !,c.l1 od ]I7]M׼ ^wߤEL; 荒|`4ϓ|6Y Njb&0~T[T&lQ]GWn4ՠ \ No newline at end of file diff --git a/.git_disabled/objects/58/8aa84efef2ac7c72cb48c24557734e29d9b7e6 b/.git_disabled/objects/58/8aa84efef2ac7c72cb48c24557734e29d9b7e6 new file mode 100755 index 0000000..4b718a6 Binary files /dev/null and b/.git_disabled/objects/58/8aa84efef2ac7c72cb48c24557734e29d9b7e6 differ diff --git a/.git_disabled/objects/58/bcad431489a683457474a9597f3415631d23d8 b/.git_disabled/objects/58/bcad431489a683457474a9597f3415631d23d8 new file mode 100755 index 0000000..b9491bb Binary files /dev/null and b/.git_disabled/objects/58/bcad431489a683457474a9597f3415631d23d8 differ diff --git a/.git_disabled/objects/58/d7e8e8b568bdf2cbbf2c029eed7c5a26eedbbb b/.git_disabled/objects/58/d7e8e8b568bdf2cbbf2c029eed7c5a26eedbbb new file mode 100755 index 0000000..3241a1d Binary files /dev/null and b/.git_disabled/objects/58/d7e8e8b568bdf2cbbf2c029eed7c5a26eedbbb differ diff --git a/.git_disabled/objects/58/f847ea3b491ceee043ba1cdb8abd3b60bbaed2 b/.git_disabled/objects/58/f847ea3b491ceee043ba1cdb8abd3b60bbaed2 new file mode 100755 index 0000000..684abe3 --- /dev/null +++ b/.git_disabled/objects/58/f847ea3b491ceee043ba1cdb8abd3b60bbaed2 @@ -0,0 +1 @@ +xmA0)2n&i9^AP5H#Y,4JJ&:O!a_EGZ4%z7gjwM߱Z Qhl?#dK%3)h@as<[+2,Ko,9_~-S+X \ No newline at end of file diff --git a/.git_disabled/objects/58/f9198413e01307db06cb135dad05ea077888d7 b/.git_disabled/objects/58/f9198413e01307db06cb135dad05ea077888d7 new file mode 100755 index 0000000..d1f1551 Binary files /dev/null and b/.git_disabled/objects/58/f9198413e01307db06cb135dad05ea077888d7 differ diff --git a/.git_disabled/objects/59/03fa1f6f18b439b694aeb06c7e0d5d22e33adb b/.git_disabled/objects/59/03fa1f6f18b439b694aeb06c7e0d5d22e33adb new file mode 100755 index 0000000..c75b65a Binary files /dev/null and b/.git_disabled/objects/59/03fa1f6f18b439b694aeb06c7e0d5d22e33adb differ diff --git a/.git_disabled/objects/59/12f220d8326b424bd986bd873d1c2755a04e8f b/.git_disabled/objects/59/12f220d8326b424bd986bd873d1c2755a04e8f new file mode 100755 index 0000000..3954196 Binary files /dev/null and b/.git_disabled/objects/59/12f220d8326b424bd986bd873d1c2755a04e8f differ diff --git a/.git_disabled/objects/59/33b880cfa82352b465db4c8c8dcccbab5edfac b/.git_disabled/objects/59/33b880cfa82352b465db4c8c8dcccbab5edfac new file mode 100755 index 0000000..99331ea Binary files /dev/null and b/.git_disabled/objects/59/33b880cfa82352b465db4c8c8dcccbab5edfac differ diff --git a/.git_disabled/objects/59/38f959dd79b277d8290adcb5d66df08f8e4a9b b/.git_disabled/objects/59/38f959dd79b277d8290adcb5d66df08f8e4a9b new file mode 100755 index 0000000..48a669b Binary files /dev/null and b/.git_disabled/objects/59/38f959dd79b277d8290adcb5d66df08f8e4a9b differ diff --git a/.git_disabled/objects/59/412fffa1e303898b33ba71e76cbb717691bf5a b/.git_disabled/objects/59/412fffa1e303898b33ba71e76cbb717691bf5a new file mode 100755 index 0000000..158d36b Binary files /dev/null and b/.git_disabled/objects/59/412fffa1e303898b33ba71e76cbb717691bf5a differ diff --git a/.git_disabled/objects/59/56896f2b1215640cbd1a407d19570a67185a8e b/.git_disabled/objects/59/56896f2b1215640cbd1a407d19570a67185a8e new file mode 100755 index 0000000..3a2401c Binary files /dev/null and b/.git_disabled/objects/59/56896f2b1215640cbd1a407d19570a67185a8e differ diff --git a/.git_disabled/objects/59/59a958247bd85f10e550763986cd1bb5e91944 b/.git_disabled/objects/59/59a958247bd85f10e550763986cd1bb5e91944 new file mode 100755 index 0000000..25331e6 Binary files /dev/null and b/.git_disabled/objects/59/59a958247bd85f10e550763986cd1bb5e91944 differ diff --git a/.git_disabled/objects/59/633ec878b80907c502b18986ea6cc5e84f72de b/.git_disabled/objects/59/633ec878b80907c502b18986ea6cc5e84f72de new file mode 100755 index 0000000..8ce0bf9 Binary files /dev/null and b/.git_disabled/objects/59/633ec878b80907c502b18986ea6cc5e84f72de differ diff --git a/.git_disabled/objects/59/79db02c2ae5c7ad102a0abc0afe20e293daaf8 b/.git_disabled/objects/59/79db02c2ae5c7ad102a0abc0afe20e293daaf8 new file mode 100755 index 0000000..79c3e22 Binary files /dev/null and b/.git_disabled/objects/59/79db02c2ae5c7ad102a0abc0afe20e293daaf8 differ diff --git a/.git_disabled/objects/59/8a6a2af03c47052b93f8edf3082c72acd71331 b/.git_disabled/objects/59/8a6a2af03c47052b93f8edf3082c72acd71331 new file mode 100755 index 0000000..fa29882 Binary files /dev/null and b/.git_disabled/objects/59/8a6a2af03c47052b93f8edf3082c72acd71331 differ diff --git a/.git_disabled/objects/59/8db6cb1cbbb6caa631743265670b7071f8e5e7 b/.git_disabled/objects/59/8db6cb1cbbb6caa631743265670b7071f8e5e7 new file mode 100755 index 0000000..a85d25a Binary files /dev/null and b/.git_disabled/objects/59/8db6cb1cbbb6caa631743265670b7071f8e5e7 differ diff --git a/.git_disabled/objects/59/953fff59c97b33121cd1db3ac1fde43364426e b/.git_disabled/objects/59/953fff59c97b33121cd1db3ac1fde43364426e new file mode 100755 index 0000000..eddde97 Binary files /dev/null and b/.git_disabled/objects/59/953fff59c97b33121cd1db3ac1fde43364426e differ diff --git a/.git_disabled/objects/59/a69ccdf02c2989fb522bcc9af5a23f64e1f3e7 b/.git_disabled/objects/59/a69ccdf02c2989fb522bcc9af5a23f64e1f3e7 new file mode 100755 index 0000000..26d6388 Binary files /dev/null and b/.git_disabled/objects/59/a69ccdf02c2989fb522bcc9af5a23f64e1f3e7 differ diff --git a/.git_disabled/objects/59/a729c01314a32e5808067f77b53aa163deb912 b/.git_disabled/objects/59/a729c01314a32e5808067f77b53aa163deb912 new file mode 100755 index 0000000..8c72b3e Binary files /dev/null and b/.git_disabled/objects/59/a729c01314a32e5808067f77b53aa163deb912 differ diff --git a/.git_disabled/objects/59/e83bfc128a41eb77d1ea6e7bab26634bb1fef6 b/.git_disabled/objects/59/e83bfc128a41eb77d1ea6e7bab26634bb1fef6 new file mode 100755 index 0000000..725d55c Binary files /dev/null and b/.git_disabled/objects/59/e83bfc128a41eb77d1ea6e7bab26634bb1fef6 differ diff --git a/.git_disabled/objects/59/e8df3749f2cdcea50c6963b434946ece2a2fa4 b/.git_disabled/objects/59/e8df3749f2cdcea50c6963b434946ece2a2fa4 new file mode 100755 index 0000000..6c9cc2b --- /dev/null +++ b/.git_disabled/objects/59/e8df3749f2cdcea50c6963b434946ece2a2fa4 @@ -0,0 +1 @@ +x+)JMU043a040075U,+d87eme\2_S_TYR~~IqIQbH֕o' UoPu9yIũ }$'i܇,I-.)]ԳMa.nESD \ No newline at end of file diff --git a/.git_disabled/objects/59/f3f585cba4099e56cfb7074bd53064a87d2c76 b/.git_disabled/objects/59/f3f585cba4099e56cfb7074bd53064a87d2c76 new file mode 100755 index 0000000..e25c51d Binary files /dev/null and b/.git_disabled/objects/59/f3f585cba4099e56cfb7074bd53064a87d2c76 differ diff --git a/.git_disabled/objects/59/f6e5b0c0c1c9f9b9b3c27b5a9f318d1bd3c29c b/.git_disabled/objects/59/f6e5b0c0c1c9f9b9b3c27b5a9f318d1bd3c29c new file mode 100755 index 0000000..7b9baac Binary files /dev/null and b/.git_disabled/objects/59/f6e5b0c0c1c9f9b9b3c27b5a9f318d1bd3c29c differ diff --git a/.git_disabled/objects/5a/042d0a2c8e2fe455b565f2c6d34501f95b54f3 b/.git_disabled/objects/5a/042d0a2c8e2fe455b565f2c6d34501f95b54f3 new file mode 100755 index 0000000..7006335 Binary files /dev/null and b/.git_disabled/objects/5a/042d0a2c8e2fe455b565f2c6d34501f95b54f3 differ diff --git a/.git_disabled/objects/5a/2ea004448ee03c45ffa6adc114fb7fa4c3802e b/.git_disabled/objects/5a/2ea004448ee03c45ffa6adc114fb7fa4c3802e new file mode 100755 index 0000000..1f4eb35 Binary files /dev/null and b/.git_disabled/objects/5a/2ea004448ee03c45ffa6adc114fb7fa4c3802e differ diff --git a/.git_disabled/objects/5a/55b5393a5e1d8d6abb759027faf5fd1c8e67fd b/.git_disabled/objects/5a/55b5393a5e1d8d6abb759027faf5fd1c8e67fd new file mode 100755 index 0000000..dbf7133 Binary files /dev/null and b/.git_disabled/objects/5a/55b5393a5e1d8d6abb759027faf5fd1c8e67fd differ diff --git a/.git_disabled/objects/5a/65d4a8336e6bbbaef0a3ebc7e4a700bdf7bc72 b/.git_disabled/objects/5a/65d4a8336e6bbbaef0a3ebc7e4a700bdf7bc72 new file mode 100755 index 0000000..a41f7a0 Binary files /dev/null and b/.git_disabled/objects/5a/65d4a8336e6bbbaef0a3ebc7e4a700bdf7bc72 differ diff --git a/.git_disabled/objects/5a/68e3a30997d4c1ea6d9aaa13c2406ce7d4e071 b/.git_disabled/objects/5a/68e3a30997d4c1ea6d9aaa13c2406ce7d4e071 new file mode 100755 index 0000000..f764aed Binary files /dev/null and b/.git_disabled/objects/5a/68e3a30997d4c1ea6d9aaa13c2406ce7d4e071 differ diff --git a/.git_disabled/objects/5a/7e410df8f96ec38d681a16aebafc01ed69a1b0 b/.git_disabled/objects/5a/7e410df8f96ec38d681a16aebafc01ed69a1b0 new file mode 100755 index 0000000..e26da10 Binary files /dev/null and b/.git_disabled/objects/5a/7e410df8f96ec38d681a16aebafc01ed69a1b0 differ diff --git a/.git_disabled/objects/5a/8139be1b919ff619674d3462ec89e1d74df47c b/.git_disabled/objects/5a/8139be1b919ff619674d3462ec89e1d74df47c new file mode 100755 index 0000000..4b7982e Binary files /dev/null and b/.git_disabled/objects/5a/8139be1b919ff619674d3462ec89e1d74df47c differ diff --git a/.git_disabled/objects/5a/955669f0e82102d5e6999c14dd27fda93e447e b/.git_disabled/objects/5a/955669f0e82102d5e6999c14dd27fda93e447e new file mode 100755 index 0000000..8115a3a Binary files /dev/null and b/.git_disabled/objects/5a/955669f0e82102d5e6999c14dd27fda93e447e differ diff --git a/.git_disabled/objects/5a/a51b423ea3f55358e5ae239501d0ecae21b5c8 b/.git_disabled/objects/5a/a51b423ea3f55358e5ae239501d0ecae21b5c8 new file mode 100755 index 0000000..eda4290 Binary files /dev/null and b/.git_disabled/objects/5a/a51b423ea3f55358e5ae239501d0ecae21b5c8 differ diff --git a/.git_disabled/objects/5a/c4581f585eacdb0efefd22a574850a582caf23 b/.git_disabled/objects/5a/c4581f585eacdb0efefd22a574850a582caf23 new file mode 100755 index 0000000..cb59910 Binary files /dev/null and b/.git_disabled/objects/5a/c4581f585eacdb0efefd22a574850a582caf23 differ diff --git a/.git_disabled/objects/5a/c7a42ec82d8326ea2f22d83375d4cc1f0090cb b/.git_disabled/objects/5a/c7a42ec82d8326ea2f22d83375d4cc1f0090cb new file mode 100755 index 0000000..c5e44f4 Binary files /dev/null and b/.git_disabled/objects/5a/c7a42ec82d8326ea2f22d83375d4cc1f0090cb differ diff --git a/.git_disabled/objects/5a/e58f71f01514c03cbc0d348c16495deecc7dce b/.git_disabled/objects/5a/e58f71f01514c03cbc0d348c16495deecc7dce new file mode 100755 index 0000000..63b7a28 Binary files /dev/null and b/.git_disabled/objects/5a/e58f71f01514c03cbc0d348c16495deecc7dce differ diff --git a/.git_disabled/objects/5a/fa6c56764d718a719d0557ed80e58ec6cd5b81 b/.git_disabled/objects/5a/fa6c56764d718a719d0557ed80e58ec6cd5b81 new file mode 100755 index 0000000..bcaab69 Binary files /dev/null and b/.git_disabled/objects/5a/fa6c56764d718a719d0557ed80e58ec6cd5b81 differ diff --git a/.git_disabled/objects/5b/091c2c73e415278c48a8d739c9c7c55d0e0d6d b/.git_disabled/objects/5b/091c2c73e415278c48a8d739c9c7c55d0e0d6d new file mode 100755 index 0000000..fae7253 Binary files /dev/null and b/.git_disabled/objects/5b/091c2c73e415278c48a8d739c9c7c55d0e0d6d differ diff --git a/.git_disabled/objects/5b/0a57a2bd2d033292b94c34a0ce7943919c7a5b b/.git_disabled/objects/5b/0a57a2bd2d033292b94c34a0ce7943919c7a5b new file mode 100755 index 0000000..4fd58cf Binary files /dev/null and b/.git_disabled/objects/5b/0a57a2bd2d033292b94c34a0ce7943919c7a5b differ diff --git a/.git_disabled/objects/5b/1fd098fddfef94e0339aa89173444a797f32c5 b/.git_disabled/objects/5b/1fd098fddfef94e0339aa89173444a797f32c5 new file mode 100755 index 0000000..7dad219 Binary files /dev/null and b/.git_disabled/objects/5b/1fd098fddfef94e0339aa89173444a797f32c5 differ diff --git a/.git_disabled/objects/5b/2c90a041ea2cf4b478344df4083ba1cf6cf9e4 b/.git_disabled/objects/5b/2c90a041ea2cf4b478344df4083ba1cf6cf9e4 new file mode 100755 index 0000000..936bda3 Binary files /dev/null and b/.git_disabled/objects/5b/2c90a041ea2cf4b478344df4083ba1cf6cf9e4 differ diff --git a/.git_disabled/objects/5b/314fe218644900f8dd982ffbaff2d8fb579044 b/.git_disabled/objects/5b/314fe218644900f8dd982ffbaff2d8fb579044 new file mode 100755 index 0000000..0c02259 Binary files /dev/null and b/.git_disabled/objects/5b/314fe218644900f8dd982ffbaff2d8fb579044 differ diff --git a/.git_disabled/objects/5b/3a520def728ed3732a067435ef7e925016e736 b/.git_disabled/objects/5b/3a520def728ed3732a067435ef7e925016e736 new file mode 100755 index 0000000..024d055 Binary files /dev/null and b/.git_disabled/objects/5b/3a520def728ed3732a067435ef7e925016e736 differ diff --git a/.git_disabled/objects/5b/5574f2f0b3ac873e4b6249f870382d6607c7e6 b/.git_disabled/objects/5b/5574f2f0b3ac873e4b6249f870382d6607c7e6 new file mode 100755 index 0000000..dde29a6 Binary files /dev/null and b/.git_disabled/objects/5b/5574f2f0b3ac873e4b6249f870382d6607c7e6 differ diff --git a/.git_disabled/objects/5b/5e4b1ca89f224e9393ad0a6e8d7ed85c0ebb0d b/.git_disabled/objects/5b/5e4b1ca89f224e9393ad0a6e8d7ed85c0ebb0d new file mode 100755 index 0000000..51b631d Binary files /dev/null and b/.git_disabled/objects/5b/5e4b1ca89f224e9393ad0a6e8d7ed85c0ebb0d differ diff --git a/.git_disabled/objects/5b/7521ab638bca434cd9c2e2616f1ec4f8e4c54e b/.git_disabled/objects/5b/7521ab638bca434cd9c2e2616f1ec4f8e4c54e new file mode 100755 index 0000000..c547bf6 Binary files /dev/null and b/.git_disabled/objects/5b/7521ab638bca434cd9c2e2616f1ec4f8e4c54e differ diff --git a/.git_disabled/objects/5b/824106dd5c9c57ee5fdc2f36df84dadfb42e80 b/.git_disabled/objects/5b/824106dd5c9c57ee5fdc2f36df84dadfb42e80 new file mode 100755 index 0000000..420c88c Binary files /dev/null and b/.git_disabled/objects/5b/824106dd5c9c57ee5fdc2f36df84dadfb42e80 differ diff --git a/.git_disabled/objects/5b/871b419f1db22e381abb2cc774e78e1eb8f9a1 b/.git_disabled/objects/5b/871b419f1db22e381abb2cc774e78e1eb8f9a1 new file mode 100755 index 0000000..d359aaa Binary files /dev/null and b/.git_disabled/objects/5b/871b419f1db22e381abb2cc774e78e1eb8f9a1 differ diff --git a/.git_disabled/objects/5b/a15cd54c16452bfb751ad10677ecc2d44e422b b/.git_disabled/objects/5b/a15cd54c16452bfb751ad10677ecc2d44e422b new file mode 100755 index 0000000..3afcf08 Binary files /dev/null and b/.git_disabled/objects/5b/a15cd54c16452bfb751ad10677ecc2d44e422b differ diff --git a/.git_disabled/objects/5b/d4f7de2400194728c9ad205298a135653e9d7d b/.git_disabled/objects/5b/d4f7de2400194728c9ad205298a135653e9d7d new file mode 100755 index 0000000..63eb9c4 Binary files /dev/null and b/.git_disabled/objects/5b/d4f7de2400194728c9ad205298a135653e9d7d differ diff --git a/.git_disabled/objects/5b/d68aa0bf9b4c9148a3879f9e2cfc76e29d1911 b/.git_disabled/objects/5b/d68aa0bf9b4c9148a3879f9e2cfc76e29d1911 new file mode 100755 index 0000000..a8b2372 Binary files /dev/null and b/.git_disabled/objects/5b/d68aa0bf9b4c9148a3879f9e2cfc76e29d1911 differ diff --git a/.git_disabled/objects/5b/d6fbaf65ae46e6c17a17566fc3a7356242df1d b/.git_disabled/objects/5b/d6fbaf65ae46e6c17a17566fc3a7356242df1d new file mode 100755 index 0000000..3bf522a Binary files /dev/null and b/.git_disabled/objects/5b/d6fbaf65ae46e6c17a17566fc3a7356242df1d differ diff --git a/.git_disabled/objects/5b/d7f1a827cc13ee2df30fd8b1dc535d568b9989 b/.git_disabled/objects/5b/d7f1a827cc13ee2df30fd8b1dc535d568b9989 new file mode 100755 index 0000000..89ea4e4 Binary files /dev/null and b/.git_disabled/objects/5b/d7f1a827cc13ee2df30fd8b1dc535d568b9989 differ diff --git a/.git_disabled/objects/5b/e96b2170e7deffd2387cf1d03b7458c744ad1b b/.git_disabled/objects/5b/e96b2170e7deffd2387cf1d03b7458c744ad1b new file mode 100755 index 0000000..a2c29c4 Binary files /dev/null and b/.git_disabled/objects/5b/e96b2170e7deffd2387cf1d03b7458c744ad1b differ diff --git a/.git_disabled/objects/5c/06e460977c127bf3be034dd01c9a04cc46d3d3 b/.git_disabled/objects/5c/06e460977c127bf3be034dd01c9a04cc46d3d3 new file mode 100755 index 0000000..4351919 Binary files /dev/null and b/.git_disabled/objects/5c/06e460977c127bf3be034dd01c9a04cc46d3d3 differ diff --git a/.git_disabled/objects/5c/12d538c5951dfd237f035203e172be026f0604 b/.git_disabled/objects/5c/12d538c5951dfd237f035203e172be026f0604 new file mode 100755 index 0000000..bf90660 Binary files /dev/null and b/.git_disabled/objects/5c/12d538c5951dfd237f035203e172be026f0604 differ diff --git a/.git_disabled/objects/5c/163aa97f75d4cfaad56f23a4c287071f5b676d b/.git_disabled/objects/5c/163aa97f75d4cfaad56f23a4c287071f5b676d new file mode 100755 index 0000000..1061bf7 Binary files /dev/null and b/.git_disabled/objects/5c/163aa97f75d4cfaad56f23a4c287071f5b676d differ diff --git a/.git_disabled/objects/5c/1ca6992f9a3cbb7cdb2c939dbe62a769c528c1 b/.git_disabled/objects/5c/1ca6992f9a3cbb7cdb2c939dbe62a769c528c1 new file mode 100755 index 0000000..04922d4 Binary files /dev/null and b/.git_disabled/objects/5c/1ca6992f9a3cbb7cdb2c939dbe62a769c528c1 differ diff --git a/.git_disabled/objects/5c/2fa5e85faed481dfbdb0839b7ff15d473cb9e3 b/.git_disabled/objects/5c/2fa5e85faed481dfbdb0839b7ff15d473cb9e3 new file mode 100755 index 0000000..ce852ef Binary files /dev/null and b/.git_disabled/objects/5c/2fa5e85faed481dfbdb0839b7ff15d473cb9e3 differ diff --git a/.git_disabled/objects/5c/313f9e22a817a1d52db1fbd7207aee9eafc0fe b/.git_disabled/objects/5c/313f9e22a817a1d52db1fbd7207aee9eafc0fe new file mode 100755 index 0000000..6c12acd Binary files /dev/null and b/.git_disabled/objects/5c/313f9e22a817a1d52db1fbd7207aee9eafc0fe differ diff --git a/.git_disabled/objects/5c/35a8940e0f562ea18507852849c83d550b4088 b/.git_disabled/objects/5c/35a8940e0f562ea18507852849c83d550b4088 new file mode 100755 index 0000000..cdd6e04 Binary files /dev/null and b/.git_disabled/objects/5c/35a8940e0f562ea18507852849c83d550b4088 differ diff --git a/.git_disabled/objects/5c/4155e09e95f5788b269f245ed729775d9c677a b/.git_disabled/objects/5c/4155e09e95f5788b269f245ed729775d9c677a new file mode 100755 index 0000000..b477371 Binary files /dev/null and b/.git_disabled/objects/5c/4155e09e95f5788b269f245ed729775d9c677a differ diff --git a/.git_disabled/objects/5c/46492ec462743418cebd2bf7e540283885e90f b/.git_disabled/objects/5c/46492ec462743418cebd2bf7e540283885e90f new file mode 100755 index 0000000..f71d2cb Binary files /dev/null and b/.git_disabled/objects/5c/46492ec462743418cebd2bf7e540283885e90f differ diff --git a/.git_disabled/objects/5c/66cfa7d861bc3959cf52cb537c1e6f8235e8a7 b/.git_disabled/objects/5c/66cfa7d861bc3959cf52cb537c1e6f8235e8a7 new file mode 100755 index 0000000..0ae200f Binary files /dev/null and b/.git_disabled/objects/5c/66cfa7d861bc3959cf52cb537c1e6f8235e8a7 differ diff --git a/.git_disabled/objects/5c/7d4e897eb7d153f178c4617209e69dc697b49a b/.git_disabled/objects/5c/7d4e897eb7d153f178c4617209e69dc697b49a new file mode 100755 index 0000000..26d2ac6 Binary files /dev/null and b/.git_disabled/objects/5c/7d4e897eb7d153f178c4617209e69dc697b49a differ diff --git a/.git_disabled/objects/5c/7ea9caabc11725a0af5e3975388c27fee5d5eb b/.git_disabled/objects/5c/7ea9caabc11725a0af5e3975388c27fee5d5eb new file mode 100755 index 0000000..a13660d Binary files /dev/null and b/.git_disabled/objects/5c/7ea9caabc11725a0af5e3975388c27fee5d5eb differ diff --git a/.git_disabled/objects/5c/8a1471013bb00cf4eeadce08f524a639dd7baa b/.git_disabled/objects/5c/8a1471013bb00cf4eeadce08f524a639dd7baa new file mode 100755 index 0000000..33ebcff Binary files /dev/null and b/.git_disabled/objects/5c/8a1471013bb00cf4eeadce08f524a639dd7baa differ diff --git a/.git_disabled/objects/5c/9706698e2458e78f9b3e340ade34a41fe08c19 b/.git_disabled/objects/5c/9706698e2458e78f9b3e340ade34a41fe08c19 new file mode 100755 index 0000000..38478e3 Binary files /dev/null and b/.git_disabled/objects/5c/9706698e2458e78f9b3e340ade34a41fe08c19 differ diff --git a/.git_disabled/objects/5c/a7f9c1e724fb15c6e6335b201eaf5175eaf471 b/.git_disabled/objects/5c/a7f9c1e724fb15c6e6335b201eaf5175eaf471 new file mode 100755 index 0000000..c2b5e99 Binary files /dev/null and b/.git_disabled/objects/5c/a7f9c1e724fb15c6e6335b201eaf5175eaf471 differ diff --git a/.git_disabled/objects/5c/cf125a22473faccdb969e81372ebbe7c5e5b0a b/.git_disabled/objects/5c/cf125a22473faccdb969e81372ebbe7c5e5b0a new file mode 100755 index 0000000..493168d Binary files /dev/null and b/.git_disabled/objects/5c/cf125a22473faccdb969e81372ebbe7c5e5b0a differ diff --git a/.git_disabled/objects/5c/f6737f113b6f7cf12158dc5022371d323cd074 b/.git_disabled/objects/5c/f6737f113b6f7cf12158dc5022371d323cd074 new file mode 100755 index 0000000..c053b21 Binary files /dev/null and b/.git_disabled/objects/5c/f6737f113b6f7cf12158dc5022371d323cd074 differ diff --git a/.git_disabled/objects/5c/f92e762479304a499f2a1903c00ca8faa180cd b/.git_disabled/objects/5c/f92e762479304a499f2a1903c00ca8faa180cd new file mode 100755 index 0000000..64d1f10 Binary files /dev/null and b/.git_disabled/objects/5c/f92e762479304a499f2a1903c00ca8faa180cd differ diff --git a/.git_disabled/objects/5d/0dc2433cfae4a85c4c6ccc69095e812885607f b/.git_disabled/objects/5d/0dc2433cfae4a85c4c6ccc69095e812885607f new file mode 100755 index 0000000..c21e6d3 Binary files /dev/null and b/.git_disabled/objects/5d/0dc2433cfae4a85c4c6ccc69095e812885607f differ diff --git a/.git_disabled/objects/5d/1ff175ff8c29d820993bbef1cdf6700c578032 b/.git_disabled/objects/5d/1ff175ff8c29d820993bbef1cdf6700c578032 new file mode 100755 index 0000000..5bd879d Binary files /dev/null and b/.git_disabled/objects/5d/1ff175ff8c29d820993bbef1cdf6700c578032 differ diff --git a/.git_disabled/objects/5d/47d8a73bb84976f521b3436183a61269348f82 b/.git_disabled/objects/5d/47d8a73bb84976f521b3436183a61269348f82 new file mode 100755 index 0000000..d9beed4 Binary files /dev/null and b/.git_disabled/objects/5d/47d8a73bb84976f521b3436183a61269348f82 differ diff --git a/.git_disabled/objects/5d/764a96e250a9e368c4d83f4a80d10c6871eb07 b/.git_disabled/objects/5d/764a96e250a9e368c4d83f4a80d10c6871eb07 new file mode 100755 index 0000000..bc302b3 Binary files /dev/null and b/.git_disabled/objects/5d/764a96e250a9e368c4d83f4a80d10c6871eb07 differ diff --git a/.git_disabled/objects/5d/7b3abee81ffab0e1cec3e9cbceda58aa270fb2 b/.git_disabled/objects/5d/7b3abee81ffab0e1cec3e9cbceda58aa270fb2 new file mode 100755 index 0000000..ca3a97f Binary files /dev/null and b/.git_disabled/objects/5d/7b3abee81ffab0e1cec3e9cbceda58aa270fb2 differ diff --git a/.git_disabled/objects/5d/bd4fcd62952cf302a693dc2664038acadf272a b/.git_disabled/objects/5d/bd4fcd62952cf302a693dc2664038acadf272a new file mode 100755 index 0000000..6e28ddf Binary files /dev/null and b/.git_disabled/objects/5d/bd4fcd62952cf302a693dc2664038acadf272a differ diff --git a/.git_disabled/objects/5d/c76ac1577983a0573d262594c6c13f32237231 b/.git_disabled/objects/5d/c76ac1577983a0573d262594c6c13f32237231 new file mode 100755 index 0000000..c1debf6 Binary files /dev/null and b/.git_disabled/objects/5d/c76ac1577983a0573d262594c6c13f32237231 differ diff --git a/.git_disabled/objects/5d/d5692d83891817166fcf3f770eba02e9f1657e b/.git_disabled/objects/5d/d5692d83891817166fcf3f770eba02e9f1657e new file mode 100755 index 0000000..e86813c --- /dev/null +++ b/.git_disabled/objects/5d/d5692d83891817166fcf3f770eba02e9f1657e @@ -0,0 +1,3 @@ +xN0D9+HTٱ PBoMkUb8o-14M)Ǜ2uG+HIZ"gēi'=[Nx@ a@ +}Ѷ3!?O?!G0ڴ;]*߶y߁MG6k ;Iq +|^x^V?nQ \ No newline at end of file diff --git a/.git_disabled/objects/5d/dab3be986ea01d2e3dbd76f3c1960c9ed6edd9 b/.git_disabled/objects/5d/dab3be986ea01d2e3dbd76f3c1960c9ed6edd9 new file mode 100755 index 0000000..d773cfd Binary files /dev/null and b/.git_disabled/objects/5d/dab3be986ea01d2e3dbd76f3c1960c9ed6edd9 differ diff --git a/.git_disabled/objects/5d/fb0d09b0cc428e87c95b0ea48b5b6150f43835 b/.git_disabled/objects/5d/fb0d09b0cc428e87c95b0ea48b5b6150f43835 new file mode 100755 index 0000000..fdadaec Binary files /dev/null and b/.git_disabled/objects/5d/fb0d09b0cc428e87c95b0ea48b5b6150f43835 differ diff --git a/.git_disabled/objects/5e/046dea05bb5fdeaf10576672c8c331d1d78d9f b/.git_disabled/objects/5e/046dea05bb5fdeaf10576672c8c331d1d78d9f new file mode 100755 index 0000000..90bd1e0 --- /dev/null +++ b/.git_disabled/objects/5e/046dea05bb5fdeaf10576672c8c331d1d78d9f @@ -0,0 +1,3 @@ +xuRn@OR/*0~,q Ӥ^0 +&=Vꭷ^y>Imf\`8}0>kcE Fp +C=|JV{Ntbʊ֌'T"\{оIɠ;BHI)3[9;_,PRN{A4ݣL(u8FGNuN9bJ%6+/[Xwao0lx=49Ɏqp4Xt("YAՁ2]ҋ<#h/%r-DQuSX;+P0 mo?ը4.S;J(SL]+%m`V B9,u 7\A3slk0tFݫx<궮!1f b/_oW\]ҮWDZ֥5M-q fs w<>^e?Sz/BߟօOh.XX: ̬&y|VJN~oW2r6zQ'C \ No newline at end of file diff --git a/.git_disabled/objects/5e/06b95515b367eeed10073dc7616d10a6ca2bb5 b/.git_disabled/objects/5e/06b95515b367eeed10073dc7616d10a6ca2bb5 new file mode 100755 index 0000000..0e1d9ca Binary files /dev/null and b/.git_disabled/objects/5e/06b95515b367eeed10073dc7616d10a6ca2bb5 differ diff --git a/.git_disabled/objects/5e/0f7735b3115d7b3debf993d1d646dfade73d2c b/.git_disabled/objects/5e/0f7735b3115d7b3debf993d1d646dfade73d2c new file mode 100755 index 0000000..9a50a98 Binary files /dev/null and b/.git_disabled/objects/5e/0f7735b3115d7b3debf993d1d646dfade73d2c differ diff --git a/.git_disabled/objects/5e/11d49bbb0247d922b0cae24248c49bc677db51 b/.git_disabled/objects/5e/11d49bbb0247d922b0cae24248c49bc677db51 new file mode 100755 index 0000000..d3d7cb0 Binary files /dev/null and b/.git_disabled/objects/5e/11d49bbb0247d922b0cae24248c49bc677db51 differ diff --git a/.git_disabled/objects/5e/1507476984d52e80bd4fcea1caddf49341e97b b/.git_disabled/objects/5e/1507476984d52e80bd4fcea1caddf49341e97b new file mode 100755 index 0000000..a0f2e0f --- /dev/null +++ b/.git_disabled/objects/5e/1507476984d52e80bd4fcea1caddf49341e97b @@ -0,0 +1,5 @@ +xUOcE?s?򵻰\a{7fDI1417w(~ ՒCl1Y# >Ro}+v13-QM9;s̙33+܊ĝl+o"i4 JNҐ!1ba<3BLp03RL"k {\CLuw1WARr6l↕ei؂E-Qj( tn uAP +1Cj9*<ԇ:Hpx!T^=)6zlL.JF0 66-RHj)n3h9ڲ:]Ӗ-fbׁ`Zqߐ6" wQ+"HEi{ݤ(H|ӹB#O5_ܘϱ1ߎ2ĢKY($8i.<"(L'G62'ά Ifq +/":(M- +ftjf.YWӢͤ&V7"!N3TyUBܪ\UnfQܬ4!UY\TYx#Vz50:Ϧ*lb7ԖrPD^nM]s%' 2Όn#7Ji_ Zb -)/d`f{2;7Ė6M-jVXents7(؜:oL6˄~ol8ݬ]x¹IBĿQےjT;}-7 A;J:zUχR +|8?tꈖ{Jy` veH*R0zq5qsŮ/G2ށ6E}:^:UDĨs0qVEf G+nyJYbJ=_|{tT +F*w;in}r\@;. 8f76A?z;/|Xfm& aJsaFpX87$?u0S'mn+5.Ŀu~Ej:aVm17z$ V[RjY?apF}y+ \ No newline at end of file diff --git a/.git_disabled/objects/64/2a0a6cf0324a783321faf59f6323a6716a2016 b/.git_disabled/objects/64/2a0a6cf0324a783321faf59f6323a6716a2016 new file mode 100755 index 0000000..8224d68 --- /dev/null +++ b/.git_disabled/objects/64/2a0a6cf0324a783321faf59f6323a6716a2016 @@ -0,0 +1 @@ +x+)JMU0`040075UH62L6J6O57H1OIM̋OOLLN,ϋ/N-)-+dhzDWgq7U:w \ No newline at end of file diff --git a/.git_disabled/objects/64/2bce3b39bce21d43c3e8e24fe4c438e6a67f36 b/.git_disabled/objects/64/2bce3b39bce21d43c3e8e24fe4c438e6a67f36 new file mode 100755 index 0000000..649071c Binary files /dev/null and b/.git_disabled/objects/64/2bce3b39bce21d43c3e8e24fe4c438e6a67f36 differ diff --git a/.git_disabled/objects/64/467743e0acf888077bed364a6bba149a63ba73 b/.git_disabled/objects/64/467743e0acf888077bed364a6bba149a63ba73 new file mode 100755 index 0000000..17bd29e Binary files /dev/null and b/.git_disabled/objects/64/467743e0acf888077bed364a6bba149a63ba73 differ diff --git a/.git_disabled/objects/64/46f2da101a24c237151e0d25b47c63254ba74a b/.git_disabled/objects/64/46f2da101a24c237151e0d25b47c63254ba74a new file mode 100755 index 0000000..43e62d3 Binary files /dev/null and b/.git_disabled/objects/64/46f2da101a24c237151e0d25b47c63254ba74a differ diff --git a/.git_disabled/objects/64/4ec2177a840e3428517ac7105481299d9a997f b/.git_disabled/objects/64/4ec2177a840e3428517ac7105481299d9a997f new file mode 100755 index 0000000..71a370e Binary files /dev/null and b/.git_disabled/objects/64/4ec2177a840e3428517ac7105481299d9a997f differ diff --git a/.git_disabled/objects/64/51d1d83eb7238b57c7ef439b20a166415de462 b/.git_disabled/objects/64/51d1d83eb7238b57c7ef439b20a166415de462 new file mode 100755 index 0000000..4661b34 Binary files /dev/null and b/.git_disabled/objects/64/51d1d83eb7238b57c7ef439b20a166415de462 differ diff --git a/.git_disabled/objects/64/68ce7189e2cd74c4b97aa5135461db7cedb367 b/.git_disabled/objects/64/68ce7189e2cd74c4b97aa5135461db7cedb367 new file mode 100755 index 0000000..f98cbfe Binary files /dev/null and b/.git_disabled/objects/64/68ce7189e2cd74c4b97aa5135461db7cedb367 differ diff --git a/.git_disabled/objects/64/73f771b7a66360435604790264d12106c1e8a1 b/.git_disabled/objects/64/73f771b7a66360435604790264d12106c1e8a1 new file mode 100755 index 0000000..469a255 Binary files /dev/null and b/.git_disabled/objects/64/73f771b7a66360435604790264d12106c1e8a1 differ diff --git a/.git_disabled/objects/64/7487588e803b1bb7033e3f585222975370187c b/.git_disabled/objects/64/7487588e803b1bb7033e3f585222975370187c new file mode 100755 index 0000000..54ba306 Binary files /dev/null and b/.git_disabled/objects/64/7487588e803b1bb7033e3f585222975370187c differ diff --git a/.git_disabled/objects/64/a81a9235ee55a9c030c350e6bcfa3153cda015 b/.git_disabled/objects/64/a81a9235ee55a9c030c350e6bcfa3153cda015 new file mode 100755 index 0000000..de9d50d Binary files /dev/null and b/.git_disabled/objects/64/a81a9235ee55a9c030c350e6bcfa3153cda015 differ diff --git a/.git_disabled/objects/64/a9deba3f45563b30cf58c42b25c766b529cff1 b/.git_disabled/objects/64/a9deba3f45563b30cf58c42b25c766b529cff1 new file mode 100755 index 0000000..659acb0 Binary files /dev/null and b/.git_disabled/objects/64/a9deba3f45563b30cf58c42b25c766b529cff1 differ diff --git a/.git_disabled/objects/64/aeaa474cb6a654b0274fbcd8d2af3ea5b0f434 b/.git_disabled/objects/64/aeaa474cb6a654b0274fbcd8d2af3ea5b0f434 new file mode 100755 index 0000000..8ad5b00 Binary files /dev/null and b/.git_disabled/objects/64/aeaa474cb6a654b0274fbcd8d2af3ea5b0f434 differ diff --git a/.git_disabled/objects/64/af7645093d47541a5bdcbd35a0e4058edc4990 b/.git_disabled/objects/64/af7645093d47541a5bdcbd35a0e4058edc4990 new file mode 100755 index 0000000..d446545 Binary files /dev/null and b/.git_disabled/objects/64/af7645093d47541a5bdcbd35a0e4058edc4990 differ diff --git a/.git_disabled/objects/64/b6286523ed02dc097ed8cdb45caee669344379 b/.git_disabled/objects/64/b6286523ed02dc097ed8cdb45caee669344379 new file mode 100755 index 0000000..e8398d4 Binary files /dev/null and b/.git_disabled/objects/64/b6286523ed02dc097ed8cdb45caee669344379 differ diff --git a/.git_disabled/objects/64/b646a16cf50e69abe99cc2773275c1fb78b0dc b/.git_disabled/objects/64/b646a16cf50e69abe99cc2773275c1fb78b0dc new file mode 100755 index 0000000..7e61c85 Binary files /dev/null and b/.git_disabled/objects/64/b646a16cf50e69abe99cc2773275c1fb78b0dc differ diff --git a/.git_disabled/objects/64/b8cf3b0ef4d9a6be06ec7d0ec2eeeb8bbf33f4 b/.git_disabled/objects/64/b8cf3b0ef4d9a6be06ec7d0ec2eeeb8bbf33f4 new file mode 100755 index 0000000..ba51151 Binary files /dev/null and b/.git_disabled/objects/64/b8cf3b0ef4d9a6be06ec7d0ec2eeeb8bbf33f4 differ diff --git a/.git_disabled/objects/64/bf8e4b18b800d0ba6a59fc61425c1ccf9a67ba b/.git_disabled/objects/64/bf8e4b18b800d0ba6a59fc61425c1ccf9a67ba new file mode 100755 index 0000000..b120aa3 --- /dev/null +++ b/.git_disabled/objects/64/bf8e4b18b800d0ba6a59fc61425c1ccf9a67ba @@ -0,0 +1 @@ +x=N1 EHCv΃c;KanssYͱ\vJ:$$G^9mM@z>}SYzNN߃/Ҙݵ\!:1!d8+$ՠ( JCeGKͤHXϣ+ܴ">YT`1 \ No newline at end of file diff --git a/.git_disabled/objects/64/c1350e7b8349b4e71e28baf447eed7e0f22ab7 b/.git_disabled/objects/64/c1350e7b8349b4e71e28baf447eed7e0f22ab7 new file mode 100755 index 0000000..d7367b8 Binary files /dev/null and b/.git_disabled/objects/64/c1350e7b8349b4e71e28baf447eed7e0f22ab7 differ diff --git a/.git_disabled/objects/64/cb1fd3cc0c640e3ffe2a2c4f5cfa7615828deb b/.git_disabled/objects/64/cb1fd3cc0c640e3ffe2a2c4f5cfa7615828deb new file mode 100755 index 0000000..b083400 Binary files /dev/null and b/.git_disabled/objects/64/cb1fd3cc0c640e3ffe2a2c4f5cfa7615828deb differ diff --git a/.git_disabled/objects/64/da30ef56e167c118825571b9728e1506b8c7ec b/.git_disabled/objects/64/da30ef56e167c118825571b9728e1506b8c7ec new file mode 100755 index 0000000..61e40b2 Binary files /dev/null and b/.git_disabled/objects/64/da30ef56e167c118825571b9728e1506b8c7ec differ diff --git a/.git_disabled/objects/64/e3e6b898ec765d4e37075f7b1635ad24c9efa2 b/.git_disabled/objects/64/e3e6b898ec765d4e37075f7b1635ad24c9efa2 new file mode 100755 index 0000000..079fa6c Binary files /dev/null and b/.git_disabled/objects/64/e3e6b898ec765d4e37075f7b1635ad24c9efa2 differ diff --git a/.git_disabled/objects/64/e94f7c0fb5127ab67d7293776f7345ec49f3ab b/.git_disabled/objects/64/e94f7c0fb5127ab67d7293776f7345ec49f3ab new file mode 100755 index 0000000..a6dbb6b Binary files /dev/null and b/.git_disabled/objects/64/e94f7c0fb5127ab67d7293776f7345ec49f3ab differ diff --git a/.git_disabled/objects/64/fdefd56de94eb562dd40d046c4d60b03784d2c b/.git_disabled/objects/64/fdefd56de94eb562dd40d046c4d60b03784d2c new file mode 100755 index 0000000..2196d33 Binary files /dev/null and b/.git_disabled/objects/64/fdefd56de94eb562dd40d046c4d60b03784d2c differ diff --git a/.git_disabled/objects/65/093b6f0b5266e12d10e6f84f516c3939a59987 b/.git_disabled/objects/65/093b6f0b5266e12d10e6f84f516c3939a59987 new file mode 100755 index 0000000..1c30347 Binary files /dev/null and b/.git_disabled/objects/65/093b6f0b5266e12d10e6f84f516c3939a59987 differ diff --git a/.git_disabled/objects/65/19a8f183b8d26d446aa5ef808d8aa22ccf8c5e b/.git_disabled/objects/65/19a8f183b8d26d446aa5ef808d8aa22ccf8c5e new file mode 100755 index 0000000..9b53575 Binary files /dev/null and b/.git_disabled/objects/65/19a8f183b8d26d446aa5ef808d8aa22ccf8c5e differ diff --git a/.git_disabled/objects/65/19b659bf7fbd4002c54ef556f9e601bc912ca8 b/.git_disabled/objects/65/19b659bf7fbd4002c54ef556f9e601bc912ca8 new file mode 100755 index 0000000..3497bdf Binary files /dev/null and b/.git_disabled/objects/65/19b659bf7fbd4002c54ef556f9e601bc912ca8 differ diff --git a/.git_disabled/objects/65/1c176a72b077cd4fdc4dabfa939f5353de3a33 b/.git_disabled/objects/65/1c176a72b077cd4fdc4dabfa939f5353de3a33 new file mode 100755 index 0000000..c1c0510 Binary files /dev/null and b/.git_disabled/objects/65/1c176a72b077cd4fdc4dabfa939f5353de3a33 differ diff --git a/.git_disabled/objects/65/3b687b80fb0fd611870ac5d438f13f168e1a0e b/.git_disabled/objects/65/3b687b80fb0fd611870ac5d438f13f168e1a0e new file mode 100755 index 0000000..a9902bb Binary files /dev/null and b/.git_disabled/objects/65/3b687b80fb0fd611870ac5d438f13f168e1a0e differ diff --git a/.git_disabled/objects/65/4f5aa09cc16e33826ffd7098a51875c64c0e8c b/.git_disabled/objects/65/4f5aa09cc16e33826ffd7098a51875c64c0e8c new file mode 100755 index 0000000..4206d53 Binary files /dev/null and b/.git_disabled/objects/65/4f5aa09cc16e33826ffd7098a51875c64c0e8c differ diff --git a/.git_disabled/objects/65/5003aa12ca3ba9bba634a879f702c2789e050e b/.git_disabled/objects/65/5003aa12ca3ba9bba634a879f702c2789e050e new file mode 100755 index 0000000..f2f5030 Binary files /dev/null and b/.git_disabled/objects/65/5003aa12ca3ba9bba634a879f702c2789e050e differ diff --git a/.git_disabled/objects/65/55ba8c05b1d99b1df121c3398f358bc4beb6c2 b/.git_disabled/objects/65/55ba8c05b1d99b1df121c3398f358bc4beb6c2 new file mode 100755 index 0000000..2fec235 Binary files /dev/null and b/.git_disabled/objects/65/55ba8c05b1d99b1df121c3398f358bc4beb6c2 differ diff --git a/.git_disabled/objects/65/576df44ca99db2c1c16ed2229e4e12675fc8b8 b/.git_disabled/objects/65/576df44ca99db2c1c16ed2229e4e12675fc8b8 new file mode 100755 index 0000000..2e9e72d Binary files /dev/null and b/.git_disabled/objects/65/576df44ca99db2c1c16ed2229e4e12675fc8b8 differ diff --git a/.git_disabled/objects/65/5b2d54fb8eaa29cc943a02a44f516da9a8f142 b/.git_disabled/objects/65/5b2d54fb8eaa29cc943a02a44f516da9a8f142 new file mode 100755 index 0000000..846997a Binary files /dev/null and b/.git_disabled/objects/65/5b2d54fb8eaa29cc943a02a44f516da9a8f142 differ diff --git a/.git_disabled/objects/65/61bcaac70b7b7cb503987b1e10b3da0acc0cc8 b/.git_disabled/objects/65/61bcaac70b7b7cb503987b1e10b3da0acc0cc8 new file mode 100755 index 0000000..cda6c92 Binary files /dev/null and b/.git_disabled/objects/65/61bcaac70b7b7cb503987b1e10b3da0acc0cc8 differ diff --git a/.git_disabled/objects/65/6ab3641d017b732f2fdd4f46d8c3dde0fcbc70 b/.git_disabled/objects/65/6ab3641d017b732f2fdd4f46d8c3dde0fcbc70 new file mode 100755 index 0000000..6ea151c Binary files /dev/null and b/.git_disabled/objects/65/6ab3641d017b732f2fdd4f46d8c3dde0fcbc70 differ diff --git a/.git_disabled/objects/65/6d092416579d891fc4ca5e43094a2b7d83182a b/.git_disabled/objects/65/6d092416579d891fc4ca5e43094a2b7d83182a new file mode 100755 index 0000000..ded8e2a Binary files /dev/null and b/.git_disabled/objects/65/6d092416579d891fc4ca5e43094a2b7d83182a differ diff --git a/.git_disabled/objects/65/6f7ee312c7c102d14247b2a28361bf4a2b9b8c b/.git_disabled/objects/65/6f7ee312c7c102d14247b2a28361bf4a2b9b8c new file mode 100755 index 0000000..a2a2dbc Binary files /dev/null and b/.git_disabled/objects/65/6f7ee312c7c102d14247b2a28361bf4a2b9b8c differ diff --git a/.git_disabled/objects/65/74fb7362eea39e207dacc0fd597d45cfe1892e b/.git_disabled/objects/65/74fb7362eea39e207dacc0fd597d45cfe1892e new file mode 100755 index 0000000..297342b Binary files /dev/null and b/.git_disabled/objects/65/74fb7362eea39e207dacc0fd597d45cfe1892e differ diff --git a/.git_disabled/objects/65/886c0a2d6d1d1d11ef82aa2e8742eab4cc6c6c b/.git_disabled/objects/65/886c0a2d6d1d1d11ef82aa2e8742eab4cc6c6c new file mode 100755 index 0000000..8ef9157 --- /dev/null +++ b/.git_disabled/objects/65/886c0a2d6d1d1d11ef82aa2e8742eab4cc6c6c @@ -0,0 +1 @@ +xMPN0 jY"+Ak!v {슛g6Lnd䰸 +`Pjy\u9V kPXd-5+R'0'E FpuīR"%b(ޑH0C|4GTy %,ˢZrBn;x. J0«_]H0 f<_Wk0| \ No newline at end of file diff --git a/.git_disabled/objects/65/9c1e85e1a611d1e551c45654051f78495b8ee3 b/.git_disabled/objects/65/9c1e85e1a611d1e551c45654051f78495b8ee3 new file mode 100755 index 0000000..36ecf4c Binary files /dev/null and b/.git_disabled/objects/65/9c1e85e1a611d1e551c45654051f78495b8ee3 differ diff --git a/.git_disabled/objects/65/a7d71be2f8a5ab862f15f88ca1fe2d47fe0fc4 b/.git_disabled/objects/65/a7d71be2f8a5ab862f15f88ca1fe2d47fe0fc4 new file mode 100755 index 0000000..4079613 --- /dev/null +++ b/.git_disabled/objects/65/a7d71be2f8a5ab862f15f88ca1fe2d47fe0fc4 @@ -0,0 +1 @@ +xuN0{8Z*A+S$(PBhQV7dq?lGȋβh{\b93LU w1UƊ_pp40E~:6ƇSw%G<)<^}N'_񲉝eӏW] E@԰Agf.[U+կjo7L\uRSBG)+k7[/y,ssn4}"Ȱ ѕW17ZZąO6C*/x}p0%O`OgcL*ݮkX{"ʡ0>-1w xPHŜ[YTe#ٕ}۶9 \ No newline at end of file diff --git a/.git_disabled/objects/67/9bf28b978da2878c36bc6a7412b88450c7e3a1 b/.git_disabled/objects/67/9bf28b978da2878c36bc6a7412b88450c7e3a1 new file mode 100755 index 0000000..ad99e3c Binary files /dev/null and b/.git_disabled/objects/67/9bf28b978da2878c36bc6a7412b88450c7e3a1 differ diff --git a/.git_disabled/objects/67/a95627408963398e4b0c751c1fd48d1e884c60 b/.git_disabled/objects/67/a95627408963398e4b0c751c1fd48d1e884c60 new file mode 100755 index 0000000..8dc6a38 Binary files /dev/null and b/.git_disabled/objects/67/a95627408963398e4b0c751c1fd48d1e884c60 differ diff --git a/.git_disabled/objects/67/b09ae8e211930dc16e708b14e2c6d81ff74897 b/.git_disabled/objects/67/b09ae8e211930dc16e708b14e2c6d81ff74897 new file mode 100755 index 0000000..cf7853f --- /dev/null +++ b/.git_disabled/objects/67/b09ae8e211930dc16e708b14e2c6d81ff74897 @@ -0,0 +1,5 @@ +xUn0_A8h"mA/Ac JZ+(R!vя1 .E;V-I1;ɇoxY)mI]lԪ$V0@"ؙu)#rm5yD.tD./و3 s^Ƅbp8L@jM\)cs x0CfvZ>Ϊ*Β8ah*1>hf8&TOGZJɔ9(nMk.2=0  c?ZpOVQyu ZZ\u<8",Y-4|ʚWe-{ |?Uo|>˒iaGP +t׽¶abcO+p1_UKƓA-b_Gb֒Ъ/me?ftB;f#!iXfc0* +&H!o̺ywcf{0ʿs!35%oho睯ζ+5 zkK6dUcu~y6+A^VKTǧpht +7^s ćx—{_Mj|UDl-C)o~)f-\0cT +%?GTΣ΍v*8Jzߠ h5^7cbc \ No newline at end of file diff --git a/.git_disabled/objects/67/b1d8d407b7a58c3d280a8ff34f701815059a4d b/.git_disabled/objects/67/b1d8d407b7a58c3d280a8ff34f701815059a4d new file mode 100755 index 0000000..a2049dd Binary files /dev/null and b/.git_disabled/objects/67/b1d8d407b7a58c3d280a8ff34f701815059a4d differ diff --git a/.git_disabled/objects/67/b486270e805ac0433edfd3239916adc5cc9585 b/.git_disabled/objects/67/b486270e805ac0433edfd3239916adc5cc9585 new file mode 100755 index 0000000..f895bdb Binary files /dev/null and b/.git_disabled/objects/67/b486270e805ac0433edfd3239916adc5cc9585 differ diff --git a/.git_disabled/objects/67/c09ddaf0c5d4c61528aee22841263fdc6e46d4 b/.git_disabled/objects/67/c09ddaf0c5d4c61528aee22841263fdc6e46d4 new file mode 100755 index 0000000..be4a613 Binary files /dev/null and b/.git_disabled/objects/67/c09ddaf0c5d4c61528aee22841263fdc6e46d4 differ diff --git a/.git_disabled/objects/67/d74bf86bfc80e22d9a4a3153572845accd9039 b/.git_disabled/objects/67/d74bf86bfc80e22d9a4a3153572845accd9039 new file mode 100755 index 0000000..57da1ce Binary files /dev/null and b/.git_disabled/objects/67/d74bf86bfc80e22d9a4a3153572845accd9039 differ diff --git a/.git_disabled/objects/67/d8d30d8a564a11507c736e8b2d04ba22eab982 b/.git_disabled/objects/67/d8d30d8a564a11507c736e8b2d04ba22eab982 new file mode 100755 index 0000000..fb7d6ac Binary files /dev/null and b/.git_disabled/objects/67/d8d30d8a564a11507c736e8b2d04ba22eab982 differ diff --git a/.git_disabled/objects/67/dd5a63ebc99dc69df95bf1ce7dbca0af68c337 b/.git_disabled/objects/67/dd5a63ebc99dc69df95bf1ce7dbca0af68c337 new file mode 100755 index 0000000..ecb881b Binary files /dev/null and b/.git_disabled/objects/67/dd5a63ebc99dc69df95bf1ce7dbca0af68c337 differ diff --git a/.git_disabled/objects/67/e20b8680a650a4defc0469f6cc1f0a32aa4b28 b/.git_disabled/objects/67/e20b8680a650a4defc0469f6cc1f0a32aa4b28 new file mode 100755 index 0000000..8fc72e9 Binary files /dev/null and b/.git_disabled/objects/67/e20b8680a650a4defc0469f6cc1f0a32aa4b28 differ diff --git a/.git_disabled/objects/67/e300d4898d18f690a15d026c2b664665cdc6ea b/.git_disabled/objects/67/e300d4898d18f690a15d026c2b664665cdc6ea new file mode 100755 index 0000000..294a93f Binary files /dev/null and b/.git_disabled/objects/67/e300d4898d18f690a15d026c2b664665cdc6ea differ diff --git a/.git_disabled/objects/67/e8f3a4dbefdc303a7470e057c9845caaa0075a b/.git_disabled/objects/67/e8f3a4dbefdc303a7470e057c9845caaa0075a new file mode 100755 index 0000000..98b3502 Binary files /dev/null and b/.git_disabled/objects/67/e8f3a4dbefdc303a7470e057c9845caaa0075a differ diff --git a/.git_disabled/objects/67/ec2ebd969ee0e941f09f87e7a00f99b5e72dd1 b/.git_disabled/objects/67/ec2ebd969ee0e941f09f87e7a00f99b5e72dd1 new file mode 100755 index 0000000..07232b5 Binary files /dev/null and b/.git_disabled/objects/67/ec2ebd969ee0e941f09f87e7a00f99b5e72dd1 differ diff --git a/.git_disabled/objects/67/ed9834b23b04a31d9f45ffc6d9d5761094826c b/.git_disabled/objects/67/ed9834b23b04a31d9f45ffc6d9d5761094826c new file mode 100755 index 0000000..a81a2cf --- /dev/null +++ b/.git_disabled/objects/67/ed9834b23b04a31d9f45ffc6d9d5761094826c @@ -0,0 +1,2 @@ +xuJ0ŽS|ԛ. +[F[2]:!|A|/`999IyES\"W9/!W|brC;C Kt(ڹE~J5ճ,9AO=mjG[ޭi'( 3{wb1y4!QeOZj:YDd6Oq`{EAf2bhQRX5tno(BJ7؛m{Խ7NeG[whPLPU VDLQh+|(%ۖV+.Q~w5RYrn8~ts[gYp L0>9= Y U\8?. \ No newline at end of file diff --git a/.git_disabled/objects/67/f601c7aa88c47f92866aea71161ebb9271cfc1 b/.git_disabled/objects/67/f601c7aa88c47f92866aea71161ebb9271cfc1 new file mode 100755 index 0000000..971e240 Binary files /dev/null and b/.git_disabled/objects/67/f601c7aa88c47f92866aea71161ebb9271cfc1 differ diff --git a/.git_disabled/objects/67/f875dba4372ba55c46c7639c14cde0de2a7800 b/.git_disabled/objects/67/f875dba4372ba55c46c7639c14cde0de2a7800 new file mode 100755 index 0000000..6cfc0d2 Binary files /dev/null and b/.git_disabled/objects/67/f875dba4372ba55c46c7639c14cde0de2a7800 differ diff --git a/.git_disabled/objects/68/0c4e2fa28edb22617902437072b2774d3e20fa b/.git_disabled/objects/68/0c4e2fa28edb22617902437072b2774d3e20fa new file mode 100755 index 0000000..81057d7 Binary files /dev/null and b/.git_disabled/objects/68/0c4e2fa28edb22617902437072b2774d3e20fa differ diff --git a/.git_disabled/objects/68/1437c6ce3d282a2c3aa53cf28cf904ddf9fd99 b/.git_disabled/objects/68/1437c6ce3d282a2c3aa53cf28cf904ddf9fd99 new file mode 100755 index 0000000..d086f66 Binary files /dev/null and b/.git_disabled/objects/68/1437c6ce3d282a2c3aa53cf28cf904ddf9fd99 differ diff --git a/.git_disabled/objects/68/163e646e9507bdcf671f08ae12c30ffbb6aec7 b/.git_disabled/objects/68/163e646e9507bdcf671f08ae12c30ffbb6aec7 new file mode 100755 index 0000000..9e7fae7 Binary files /dev/null and b/.git_disabled/objects/68/163e646e9507bdcf671f08ae12c30ffbb6aec7 differ diff --git a/.git_disabled/objects/68/3fff9920e3579662a6b5d6fee2f91f6e02ee03 b/.git_disabled/objects/68/3fff9920e3579662a6b5d6fee2f91f6e02ee03 new file mode 100755 index 0000000..7bd364b Binary files /dev/null and b/.git_disabled/objects/68/3fff9920e3579662a6b5d6fee2f91f6e02ee03 differ diff --git a/.git_disabled/objects/68/425aeb14625e354cfe0802db1ba3cf2dde45bb b/.git_disabled/objects/68/425aeb14625e354cfe0802db1ba3cf2dde45bb new file mode 100755 index 0000000..8be7420 Binary files /dev/null and b/.git_disabled/objects/68/425aeb14625e354cfe0802db1ba3cf2dde45bb differ diff --git a/.git_disabled/objects/68/6479706da38e9925246e5663be423192b1078b b/.git_disabled/objects/68/6479706da38e9925246e5663be423192b1078b new file mode 100755 index 0000000..a3a754e Binary files /dev/null and b/.git_disabled/objects/68/6479706da38e9925246e5663be423192b1078b differ diff --git a/.git_disabled/objects/68/68b1c2182b3b6012d81f272c0f6e0d3c69512b b/.git_disabled/objects/68/68b1c2182b3b6012d81f272c0f6e0d3c69512b new file mode 100755 index 0000000..de7c3fc Binary files /dev/null and b/.git_disabled/objects/68/68b1c2182b3b6012d81f272c0f6e0d3c69512b differ diff --git a/.git_disabled/objects/68/6d445d8dedaba26421b1eeca1c00c95b921803 b/.git_disabled/objects/68/6d445d8dedaba26421b1eeca1c00c95b921803 new file mode 100755 index 0000000..2bb8980 Binary files /dev/null and b/.git_disabled/objects/68/6d445d8dedaba26421b1eeca1c00c95b921803 differ diff --git a/.git_disabled/objects/68/7c3931185dc13ac07717118b4bd1b560ef3232 b/.git_disabled/objects/68/7c3931185dc13ac07717118b4bd1b560ef3232 new file mode 100755 index 0000000..ba2f4f3 Binary files /dev/null and b/.git_disabled/objects/68/7c3931185dc13ac07717118b4bd1b560ef3232 differ diff --git a/.git_disabled/objects/68/7de497d98d83d0000cc8352ef657c666a66504 b/.git_disabled/objects/68/7de497d98d83d0000cc8352ef657c666a66504 new file mode 100755 index 0000000..c437e3e Binary files /dev/null and b/.git_disabled/objects/68/7de497d98d83d0000cc8352ef657c666a66504 differ diff --git a/.git_disabled/objects/68/7fe2b355938e9ccdd3b5e6131ea4f282ce432e b/.git_disabled/objects/68/7fe2b355938e9ccdd3b5e6131ea4f282ce432e new file mode 100755 index 0000000..ed403cd Binary files /dev/null and b/.git_disabled/objects/68/7fe2b355938e9ccdd3b5e6131ea4f282ce432e differ diff --git a/.git_disabled/objects/68/a7f140d9d6cae45ec023a5fd0588ef18c13007 b/.git_disabled/objects/68/a7f140d9d6cae45ec023a5fd0588ef18c13007 new file mode 100755 index 0000000..f383723 Binary files /dev/null and b/.git_disabled/objects/68/a7f140d9d6cae45ec023a5fd0588ef18c13007 differ diff --git a/.git_disabled/objects/68/a9f50e159d47bc722c0f11f21b68ebfb16564c b/.git_disabled/objects/68/a9f50e159d47bc722c0f11f21b68ebfb16564c new file mode 100755 index 0000000..e6cebe4 Binary files /dev/null and b/.git_disabled/objects/68/a9f50e159d47bc722c0f11f21b68ebfb16564c differ diff --git a/.git_disabled/objects/68/ae6efec52174dad34684fefdc96e04a6084c49 b/.git_disabled/objects/68/ae6efec52174dad34684fefdc96e04a6084c49 new file mode 100755 index 0000000..df1f5dc Binary files /dev/null and b/.git_disabled/objects/68/ae6efec52174dad34684fefdc96e04a6084c49 differ diff --git a/.git_disabled/objects/68/b95192b09cb0dc1218d9b4a83b7d1225d17234 b/.git_disabled/objects/68/b95192b09cb0dc1218d9b4a83b7d1225d17234 new file mode 100755 index 0000000..27d7c92 Binary files /dev/null and b/.git_disabled/objects/68/b95192b09cb0dc1218d9b4a83b7d1225d17234 differ diff --git a/.git_disabled/objects/68/bf31fcb3590cff72d2ee313685173cf9e2dc12 b/.git_disabled/objects/68/bf31fcb3590cff72d2ee313685173cf9e2dc12 new file mode 100755 index 0000000..221a915 Binary files /dev/null and b/.git_disabled/objects/68/bf31fcb3590cff72d2ee313685173cf9e2dc12 differ diff --git a/.git_disabled/objects/68/c413c79860aa7fb35954b80891e74b5c4d8568 b/.git_disabled/objects/68/c413c79860aa7fb35954b80891e74b5c4d8568 new file mode 100755 index 0000000..b6edfb1 Binary files /dev/null and b/.git_disabled/objects/68/c413c79860aa7fb35954b80891e74b5c4d8568 differ diff --git a/.git_disabled/objects/68/c888c930d7faf55c4133ebcb0d7fe13afe520c b/.git_disabled/objects/68/c888c930d7faf55c4133ebcb0d7fe13afe520c new file mode 100755 index 0000000..7d9a091 Binary files /dev/null and b/.git_disabled/objects/68/c888c930d7faf55c4133ebcb0d7fe13afe520c differ diff --git a/.git_disabled/objects/68/cbc435c2a33a225dcbf3e843c392f705ad2e10 b/.git_disabled/objects/68/cbc435c2a33a225dcbf3e843c392f705ad2e10 new file mode 100755 index 0000000..f1d2838 Binary files /dev/null and b/.git_disabled/objects/68/cbc435c2a33a225dcbf3e843c392f705ad2e10 differ diff --git a/.git_disabled/objects/68/d326f8717d4d099bd05305e8a752de1ae68b83 b/.git_disabled/objects/68/d326f8717d4d099bd05305e8a752de1ae68b83 new file mode 100755 index 0000000..6536103 Binary files /dev/null and b/.git_disabled/objects/68/d326f8717d4d099bd05305e8a752de1ae68b83 differ diff --git a/.git_disabled/objects/68/dd32cb538b897dd5434110fe34712d08ddc05e b/.git_disabled/objects/68/dd32cb538b897dd5434110fe34712d08ddc05e new file mode 100755 index 0000000..1554a21 Binary files /dev/null and b/.git_disabled/objects/68/dd32cb538b897dd5434110fe34712d08ddc05e differ diff --git a/.git_disabled/objects/68/e4f9f436be3b39dbad20e1f23484698cf3eea2 b/.git_disabled/objects/68/e4f9f436be3b39dbad20e1f23484698cf3eea2 new file mode 100755 index 0000000..bbdbe36 Binary files /dev/null and b/.git_disabled/objects/68/e4f9f436be3b39dbad20e1f23484698cf3eea2 differ diff --git a/.git_disabled/objects/68/e8a98d59c3054f09aec0302ce7f7319ddc1be1 b/.git_disabled/objects/68/e8a98d59c3054f09aec0302ce7f7319ddc1be1 new file mode 100755 index 0000000..c8069d6 Binary files /dev/null and b/.git_disabled/objects/68/e8a98d59c3054f09aec0302ce7f7319ddc1be1 differ diff --git a/.git_disabled/objects/68/fb2d244c2bb969e2a1e1a469f6851faba96bf9 b/.git_disabled/objects/68/fb2d244c2bb969e2a1e1a469f6851faba96bf9 new file mode 100755 index 0000000..9a5c1d8 Binary files /dev/null and b/.git_disabled/objects/68/fb2d244c2bb969e2a1e1a469f6851faba96bf9 differ diff --git a/.git_disabled/objects/69/09ffe39dfdb4600486bee487eeef53a12f75fc b/.git_disabled/objects/69/09ffe39dfdb4600486bee487eeef53a12f75fc new file mode 100755 index 0000000..64b7f62 Binary files /dev/null and b/.git_disabled/objects/69/09ffe39dfdb4600486bee487eeef53a12f75fc differ diff --git a/.git_disabled/objects/69/0cd713f58b168414843af0882c9a459254aaad b/.git_disabled/objects/69/0cd713f58b168414843af0882c9a459254aaad new file mode 100755 index 0000000..1afab59 Binary files /dev/null and b/.git_disabled/objects/69/0cd713f58b168414843af0882c9a459254aaad differ diff --git a/.git_disabled/objects/69/3b6c68016d1cc938072039abacc1d4c77a45ef b/.git_disabled/objects/69/3b6c68016d1cc938072039abacc1d4c77a45ef new file mode 100755 index 0000000..73b9393 Binary files /dev/null and b/.git_disabled/objects/69/3b6c68016d1cc938072039abacc1d4c77a45ef differ diff --git a/.git_disabled/objects/69/3eb6350322fed8c0707ec91d649fef56090b83 b/.git_disabled/objects/69/3eb6350322fed8c0707ec91d649fef56090b83 new file mode 100755 index 0000000..db1f420 Binary files /dev/null and b/.git_disabled/objects/69/3eb6350322fed8c0707ec91d649fef56090b83 differ diff --git a/.git_disabled/objects/69/4dbe77bc8581032ee72316afe4e0590311ba00 b/.git_disabled/objects/69/4dbe77bc8581032ee72316afe4e0590311ba00 new file mode 100755 index 0000000..fdf8d62 Binary files /dev/null and b/.git_disabled/objects/69/4dbe77bc8581032ee72316afe4e0590311ba00 differ diff --git a/.git_disabled/objects/69/4df0e02ee0447682c5747e1c5d74e677a1de8a b/.git_disabled/objects/69/4df0e02ee0447682c5747e1c5d74e677a1de8a new file mode 100755 index 0000000..01c9c4f Binary files /dev/null and b/.git_disabled/objects/69/4df0e02ee0447682c5747e1c5d74e677a1de8a differ diff --git a/.git_disabled/objects/69/631870808163fe0eb723778482ba0408f3115e b/.git_disabled/objects/69/631870808163fe0eb723778482ba0408f3115e new file mode 100755 index 0000000..9a763a0 Binary files /dev/null and b/.git_disabled/objects/69/631870808163fe0eb723778482ba0408f3115e differ diff --git a/.git_disabled/objects/69/675078d25a103688e78eed9ce0ceacf584bb10 b/.git_disabled/objects/69/675078d25a103688e78eed9ce0ceacf584bb10 new file mode 100755 index 0000000..f657b2d Binary files /dev/null and b/.git_disabled/objects/69/675078d25a103688e78eed9ce0ceacf584bb10 differ diff --git a/.git_disabled/objects/69/79a7d3ed055d180d32852155ef02b5b184c91c b/.git_disabled/objects/69/79a7d3ed055d180d32852155ef02b5b184c91c new file mode 100755 index 0000000..7c34122 Binary files /dev/null and b/.git_disabled/objects/69/79a7d3ed055d180d32852155ef02b5b184c91c differ diff --git a/.git_disabled/objects/69/84d86ae567925588205e2dfc0e71534c3faa6a b/.git_disabled/objects/69/84d86ae567925588205e2dfc0e71534c3faa6a new file mode 100755 index 0000000..1ff42d1 Binary files /dev/null and b/.git_disabled/objects/69/84d86ae567925588205e2dfc0e71534c3faa6a differ diff --git a/.git_disabled/objects/69/8e6d09d5fc171070ebe8e949e61011ffa0e56d b/.git_disabled/objects/69/8e6d09d5fc171070ebe8e949e61011ffa0e56d new file mode 100755 index 0000000..da68f11 Binary files /dev/null and b/.git_disabled/objects/69/8e6d09d5fc171070ebe8e949e61011ffa0e56d differ diff --git a/.git_disabled/objects/69/906b25b1719aadcc0e6b02b3b98005db312353 b/.git_disabled/objects/69/906b25b1719aadcc0e6b02b3b98005db312353 new file mode 100755 index 0000000..87f6021 Binary files /dev/null and b/.git_disabled/objects/69/906b25b1719aadcc0e6b02b3b98005db312353 differ diff --git a/.git_disabled/objects/69/9c5c5b2cd7b165c240ded9fa2c4f1c58814495 b/.git_disabled/objects/69/9c5c5b2cd7b165c240ded9fa2c4f1c58814495 new file mode 100755 index 0000000..ac241dc --- /dev/null +++ b/.git_disabled/objects/69/9c5c5b2cd7b165c240ded9fa2c4f1c58814495 @@ -0,0 +1,5 @@ +xj@{S FII.Vx#vW"W/ѿlb0fep U.)(?I +l9. VtLUWOP aA_vT;4ʛf3" }pB1a-:Y8I^]"o5KQRGj\FsR. +A-ܙ-XCV.[;Zx߇ ɑ9VcE(k'+`,u~^T̑EV8q_ xSx ot'7vͩA40 xOBHӚ'9ut'>z)7x"y՘yh)+{ئ 0/C +Rm>4˨xbp2e=baPgzC#ݾC=y]e+ +SH?VD \ No newline at end of file diff --git a/.git_disabled/objects/69/bb7f3e747168ff7b7159cef9096d69164f351c b/.git_disabled/objects/69/bb7f3e747168ff7b7159cef9096d69164f351c new file mode 100755 index 0000000..8e055b4 Binary files /dev/null and b/.git_disabled/objects/69/bb7f3e747168ff7b7159cef9096d69164f351c differ diff --git a/.git_disabled/objects/69/cf92ef6897be1f7c2b6fdf45511f7279afaf96 b/.git_disabled/objects/69/cf92ef6897be1f7c2b6fdf45511f7279afaf96 new file mode 100755 index 0000000..da5f4ad Binary files /dev/null and b/.git_disabled/objects/69/cf92ef6897be1f7c2b6fdf45511f7279afaf96 differ diff --git a/.git_disabled/objects/69/d21ebc4c1382642c2a3d3ed6cb778b501c2566 b/.git_disabled/objects/69/d21ebc4c1382642c2a3d3ed6cb778b501c2566 new file mode 100755 index 0000000..39a0204 Binary files /dev/null and b/.git_disabled/objects/69/d21ebc4c1382642c2a3d3ed6cb778b501c2566 differ diff --git a/.git_disabled/objects/69/e348710fcb5986b8c33104d2d698ca50c48702 b/.git_disabled/objects/69/e348710fcb5986b8c33104d2d698ca50c48702 new file mode 100755 index 0000000..c11a8ef Binary files /dev/null and b/.git_disabled/objects/69/e348710fcb5986b8c33104d2d698ca50c48702 differ diff --git a/.git_disabled/objects/6a/1373e0ebc09df18ea5d3fe4e07130df42da970 b/.git_disabled/objects/6a/1373e0ebc09df18ea5d3fe4e07130df42da970 new file mode 100755 index 0000000..5bbb662 Binary files /dev/null and b/.git_disabled/objects/6a/1373e0ebc09df18ea5d3fe4e07130df42da970 differ diff --git a/.git_disabled/objects/6a/2b6b18f41336e16db5b44cd315b403d1a159de b/.git_disabled/objects/6a/2b6b18f41336e16db5b44cd315b403d1a159de new file mode 100755 index 0000000..e4b0c03 Binary files /dev/null and b/.git_disabled/objects/6a/2b6b18f41336e16db5b44cd315b403d1a159de differ diff --git a/.git_disabled/objects/6a/484b6586c64bbd22c8b14f5360e5399d23f47a b/.git_disabled/objects/6a/484b6586c64bbd22c8b14f5360e5399d23f47a new file mode 100755 index 0000000..8147709 Binary files /dev/null and b/.git_disabled/objects/6a/484b6586c64bbd22c8b14f5360e5399d23f47a differ diff --git a/.git_disabled/objects/6a/6b2dbb0ec140e840953aa594c755fe22f2824f b/.git_disabled/objects/6a/6b2dbb0ec140e840953aa594c755fe22f2824f new file mode 100755 index 0000000..c79e981 Binary files /dev/null and b/.git_disabled/objects/6a/6b2dbb0ec140e840953aa594c755fe22f2824f differ diff --git a/.git_disabled/objects/6a/783fae672abac09ac797073c2dbdb21f0452e2 b/.git_disabled/objects/6a/783fae672abac09ac797073c2dbdb21f0452e2 new file mode 100755 index 0000000..a42efe3 Binary files /dev/null and b/.git_disabled/objects/6a/783fae672abac09ac797073c2dbdb21f0452e2 differ diff --git a/.git_disabled/objects/6a/7bef6ff9523ae6df08c112bcf84d901bc860c1 b/.git_disabled/objects/6a/7bef6ff9523ae6df08c112bcf84d901bc860c1 new file mode 100755 index 0000000..aeaa788 Binary files /dev/null and b/.git_disabled/objects/6a/7bef6ff9523ae6df08c112bcf84d901bc860c1 differ diff --git a/.git_disabled/objects/6a/8139e01252f7399c4c18b37923f2c425337331 b/.git_disabled/objects/6a/8139e01252f7399c4c18b37923f2c425337331 new file mode 100755 index 0000000..2b9ac37 Binary files /dev/null and b/.git_disabled/objects/6a/8139e01252f7399c4c18b37923f2c425337331 differ diff --git a/.git_disabled/objects/6a/8e5eb4192f586cb8a0101c79ace0e96afabfb6 b/.git_disabled/objects/6a/8e5eb4192f586cb8a0101c79ace0e96afabfb6 new file mode 100755 index 0000000..2444b02 Binary files /dev/null and b/.git_disabled/objects/6a/8e5eb4192f586cb8a0101c79ace0e96afabfb6 differ diff --git a/.git_disabled/objects/6a/93e723966a13b288fe5bcee670b558368455c4 b/.git_disabled/objects/6a/93e723966a13b288fe5bcee670b558368455c4 new file mode 100755 index 0000000..020b25f Binary files /dev/null and b/.git_disabled/objects/6a/93e723966a13b288fe5bcee670b558368455c4 differ diff --git a/.git_disabled/objects/6a/b09b53e132462766fd72cf97573820c5fe5fd8 b/.git_disabled/objects/6a/b09b53e132462766fd72cf97573820c5fe5fd8 new file mode 100755 index 0000000..4b0ffc0 Binary files /dev/null and b/.git_disabled/objects/6a/b09b53e132462766fd72cf97573820c5fe5fd8 differ diff --git a/.git_disabled/objects/6a/ce4427447a0e2db983ffa94ac26da285cfaae2 b/.git_disabled/objects/6a/ce4427447a0e2db983ffa94ac26da285cfaae2 new file mode 100755 index 0000000..d9dc12c --- /dev/null +++ b/.git_disabled/objects/6a/ce4427447a0e2db983ffa94ac26da285cfaae2 @@ -0,0 +1,4 @@ +xuT6yb2ꥷF{(- +$ @#+TI'#rCEn܄Wf̕l6:Q73opm~x~wpm\(W +w~K,*m]%YZȶMaa]ԕ.eݟU5dĨݴ|DBFr^(dR`ſ/1 hZeGƻΪW2!P;qTLZ:GdG]JQ`#1VV}q/pcuggD /8g@OXeq@(+TMAj,jS +3M)Y#f)̲ (?zYk>l${%<+[gafh6G= 7TS:ua"-7.Ʈ>P9dz [g\O"3b9|+Ϯft8V_^1i\F%}WK=zmb$5 8O9 7fn"E-z'dO,ᑜ'z#:5[i/״lXvz ɽϡ"OBh 95H"фA !M**"I^v.\Qb1ǝf3@;Bp}G)QڣaQS,ַ|ȓuśˋBeg)GAX/a9[Dx?3*{zOmfeϴ \ No newline at end of file diff --git a/.git_disabled/objects/6a/d3c1fa1a5af9f2b2f608b198d9256ea619e655 b/.git_disabled/objects/6a/d3c1fa1a5af9f2b2f608b198d9256ea619e655 new file mode 100755 index 0000000..0782754 Binary files /dev/null and b/.git_disabled/objects/6a/d3c1fa1a5af9f2b2f608b198d9256ea619e655 differ diff --git a/.git_disabled/objects/6a/fcbccdebe93f6344552ff2283a9064e9839ce2 b/.git_disabled/objects/6a/fcbccdebe93f6344552ff2283a9064e9839ce2 new file mode 100755 index 0000000..4c5be61 Binary files /dev/null and b/.git_disabled/objects/6a/fcbccdebe93f6344552ff2283a9064e9839ce2 differ diff --git a/.git_disabled/objects/6b/0159fe399c6346a2cdeaa4d78342e70632ffd8 b/.git_disabled/objects/6b/0159fe399c6346a2cdeaa4d78342e70632ffd8 new file mode 100755 index 0000000..dcd256a Binary files /dev/null and b/.git_disabled/objects/6b/0159fe399c6346a2cdeaa4d78342e70632ffd8 differ diff --git a/.git_disabled/objects/6b/03877a6b7cee3e36575760d42d2cc6eb1591c8 b/.git_disabled/objects/6b/03877a6b7cee3e36575760d42d2cc6eb1591c8 new file mode 100755 index 0000000..fc6f07f Binary files /dev/null and b/.git_disabled/objects/6b/03877a6b7cee3e36575760d42d2cc6eb1591c8 differ diff --git a/.git_disabled/objects/6b/240025ee6d9671485b4a38181c7a185e199c73 b/.git_disabled/objects/6b/240025ee6d9671485b4a38181c7a185e199c73 new file mode 100755 index 0000000..8cdbaba Binary files /dev/null and b/.git_disabled/objects/6b/240025ee6d9671485b4a38181c7a185e199c73 differ diff --git a/.git_disabled/objects/6b/273f6593870472c57ff3f435eb981160c2a65a b/.git_disabled/objects/6b/273f6593870472c57ff3f435eb981160c2a65a new file mode 100755 index 0000000..678fab2 Binary files /dev/null and b/.git_disabled/objects/6b/273f6593870472c57ff3f435eb981160c2a65a differ diff --git a/.git_disabled/objects/6b/2f0e154a049fb75aa325e423b8c21a9722bfd4 b/.git_disabled/objects/6b/2f0e154a049fb75aa325e423b8c21a9722bfd4 new file mode 100755 index 0000000..4d77562 Binary files /dev/null and b/.git_disabled/objects/6b/2f0e154a049fb75aa325e423b8c21a9722bfd4 differ diff --git a/.git_disabled/objects/6b/49f3eabd8f0e0fe1266c3f62cf13379a5edc07 b/.git_disabled/objects/6b/49f3eabd8f0e0fe1266c3f62cf13379a5edc07 new file mode 100755 index 0000000..d5ea7aa Binary files /dev/null and b/.git_disabled/objects/6b/49f3eabd8f0e0fe1266c3f62cf13379a5edc07 differ diff --git a/.git_disabled/objects/6b/8e8f2dba97f2138993984f0a073863c2742768 b/.git_disabled/objects/6b/8e8f2dba97f2138993984f0a073863c2742768 new file mode 100755 index 0000000..5c67944 Binary files /dev/null and b/.git_disabled/objects/6b/8e8f2dba97f2138993984f0a073863c2742768 differ diff --git a/.git_disabled/objects/6b/a1dc86704fa61a640525c22d0d33350edd7f57 b/.git_disabled/objects/6b/a1dc86704fa61a640525c22d0d33350edd7f57 new file mode 100755 index 0000000..aabae32 Binary files /dev/null and b/.git_disabled/objects/6b/a1dc86704fa61a640525c22d0d33350edd7f57 differ diff --git a/.git_disabled/objects/6b/afd97cf59461b3f42d7aa11756cc9c11460d67 b/.git_disabled/objects/6b/afd97cf59461b3f42d7aa11756cc9c11460d67 new file mode 100755 index 0000000..f3df573 Binary files /dev/null and b/.git_disabled/objects/6b/afd97cf59461b3f42d7aa11756cc9c11460d67 differ diff --git a/.git_disabled/objects/6b/ca4b0d69b8e974b09219fbbb14ab73d9070bd3 b/.git_disabled/objects/6b/ca4b0d69b8e974b09219fbbb14ab73d9070bd3 new file mode 100755 index 0000000..2ff5fc0 Binary files /dev/null and b/.git_disabled/objects/6b/ca4b0d69b8e974b09219fbbb14ab73d9070bd3 differ diff --git a/.git_disabled/objects/6b/d1c025756d4543bc26da3887bb1d11394895d6 b/.git_disabled/objects/6b/d1c025756d4543bc26da3887bb1d11394895d6 new file mode 100755 index 0000000..cdda260 Binary files /dev/null and b/.git_disabled/objects/6b/d1c025756d4543bc26da3887bb1d11394895d6 differ diff --git a/.git_disabled/objects/6b/e4a8c390123e92bb326b77979a4dfd95c4493c b/.git_disabled/objects/6b/e4a8c390123e92bb326b77979a4dfd95c4493c new file mode 100755 index 0000000..49d030a Binary files /dev/null and b/.git_disabled/objects/6b/e4a8c390123e92bb326b77979a4dfd95c4493c differ diff --git a/.git_disabled/objects/6b/e7ec8c72de37e9fbe1f77dc7b31e7896c22096 b/.git_disabled/objects/6b/e7ec8c72de37e9fbe1f77dc7b31e7896c22096 new file mode 100755 index 0000000..26b8201 Binary files /dev/null and b/.git_disabled/objects/6b/e7ec8c72de37e9fbe1f77dc7b31e7896c22096 differ diff --git a/.git_disabled/objects/6c/1c13bd4508592b82b7662d5b100200aed48b3b b/.git_disabled/objects/6c/1c13bd4508592b82b7662d5b100200aed48b3b new file mode 100755 index 0000000..cb59f73 Binary files /dev/null and b/.git_disabled/objects/6c/1c13bd4508592b82b7662d5b100200aed48b3b differ diff --git a/.git_disabled/objects/6c/224a8bdae84ea90e1f1f6d273f144b8e84abc9 b/.git_disabled/objects/6c/224a8bdae84ea90e1f1f6d273f144b8e84abc9 new file mode 100755 index 0000000..047da33 Binary files /dev/null and b/.git_disabled/objects/6c/224a8bdae84ea90e1f1f6d273f144b8e84abc9 differ diff --git a/.git_disabled/objects/6c/25b5cdd3e3aeda103732f3abb09d9de30f202a b/.git_disabled/objects/6c/25b5cdd3e3aeda103732f3abb09d9de30f202a new file mode 100755 index 0000000..5508144 Binary files /dev/null and b/.git_disabled/objects/6c/25b5cdd3e3aeda103732f3abb09d9de30f202a differ diff --git a/.git_disabled/objects/6c/32828502373e61c07ae5fee80df90922133c43 b/.git_disabled/objects/6c/32828502373e61c07ae5fee80df90922133c43 new file mode 100755 index 0000000..7ce54a2 Binary files /dev/null and b/.git_disabled/objects/6c/32828502373e61c07ae5fee80df90922133c43 differ diff --git a/.git_disabled/objects/6c/5a52721a86660160d438501e979693c7d5033f b/.git_disabled/objects/6c/5a52721a86660160d438501e979693c7d5033f new file mode 100755 index 0000000..4786785 Binary files /dev/null and b/.git_disabled/objects/6c/5a52721a86660160d438501e979693c7d5033f differ diff --git a/.git_disabled/objects/6c/5d318a13e75197eae6eb4400539f7fdb183eee b/.git_disabled/objects/6c/5d318a13e75197eae6eb4400539f7fdb183eee new file mode 100755 index 0000000..f7d8538 Binary files /dev/null and b/.git_disabled/objects/6c/5d318a13e75197eae6eb4400539f7fdb183eee differ diff --git a/.git_disabled/objects/6c/60b507dab5778466075748ce1dbbb94670a080 b/.git_disabled/objects/6c/60b507dab5778466075748ce1dbbb94670a080 new file mode 100755 index 0000000..4359b4f Binary files /dev/null and b/.git_disabled/objects/6c/60b507dab5778466075748ce1dbbb94670a080 differ diff --git a/.git_disabled/objects/6c/7a3ff298cd1fbb7bf81c11b9402e7ea91db9fc b/.git_disabled/objects/6c/7a3ff298cd1fbb7bf81c11b9402e7ea91db9fc new file mode 100755 index 0000000..9d1afed Binary files /dev/null and b/.git_disabled/objects/6c/7a3ff298cd1fbb7bf81c11b9402e7ea91db9fc differ diff --git a/.git_disabled/objects/6c/7cab849f4145e25a2309872ec33fe832058c80 b/.git_disabled/objects/6c/7cab849f4145e25a2309872ec33fe832058c80 new file mode 100755 index 0000000..a496cb9 Binary files /dev/null and b/.git_disabled/objects/6c/7cab849f4145e25a2309872ec33fe832058c80 differ diff --git a/.git_disabled/objects/6c/7db8acbf7948074317e8406e5a30ae62332e4a b/.git_disabled/objects/6c/7db8acbf7948074317e8406e5a30ae62332e4a new file mode 100755 index 0000000..ac1ffa4 --- /dev/null +++ b/.git_disabled/objects/6c/7db8acbf7948074317e8406e5a30ae62332e4a @@ -0,0 +1,3 @@ +xUKn0횧& 9cJ(.h +4*۬)R!sK/z +*%8h>7JNu~~Cenj:*u/vJ0*cRB~཰B+҆ht=g60* \ No newline at end of file diff --git a/.git_disabled/objects/6c/99b3a1c1c7a5beee07aa5cf053149f8b5b9e2f b/.git_disabled/objects/6c/99b3a1c1c7a5beee07aa5cf053149f8b5b9e2f new file mode 100755 index 0000000..d5760a1 Binary files /dev/null and b/.git_disabled/objects/6c/99b3a1c1c7a5beee07aa5cf053149f8b5b9e2f differ diff --git a/.git_disabled/objects/6c/9dccf76fed5121bbe7b69f5d7fc24eb4fe0ae5 b/.git_disabled/objects/6c/9dccf76fed5121bbe7b69f5d7fc24eb4fe0ae5 new file mode 100755 index 0000000..a05ed27 Binary files /dev/null and b/.git_disabled/objects/6c/9dccf76fed5121bbe7b69f5d7fc24eb4fe0ae5 differ diff --git a/.git_disabled/objects/6c/a16ab580628f469dece3284851ca4ae66adf0c b/.git_disabled/objects/6c/a16ab580628f469dece3284851ca4ae66adf0c new file mode 100755 index 0000000..c217265 Binary files /dev/null and b/.git_disabled/objects/6c/a16ab580628f469dece3284851ca4ae66adf0c differ diff --git a/.git_disabled/objects/6c/a7b9a856b9f730d57b9597b4f69b828b9e3339 b/.git_disabled/objects/6c/a7b9a856b9f730d57b9597b4f69b828b9e3339 new file mode 100755 index 0000000..4072782 Binary files /dev/null and b/.git_disabled/objects/6c/a7b9a856b9f730d57b9597b4f69b828b9e3339 differ diff --git a/.git_disabled/objects/6c/ad131dfde240ca66c98abb4ef9f43805b5bb49 b/.git_disabled/objects/6c/ad131dfde240ca66c98abb4ef9f43805b5bb49 new file mode 100755 index 0000000..ae6d936 Binary files /dev/null and b/.git_disabled/objects/6c/ad131dfde240ca66c98abb4ef9f43805b5bb49 differ diff --git a/.git_disabled/objects/6c/b8c0dbfae80d3fa12115cc421f4aaf541dea24 b/.git_disabled/objects/6c/b8c0dbfae80d3fa12115cc421f4aaf541dea24 new file mode 100755 index 0000000..79fbfc4 Binary files /dev/null and b/.git_disabled/objects/6c/b8c0dbfae80d3fa12115cc421f4aaf541dea24 differ diff --git a/.git_disabled/objects/6c/d3e1da146ce2a7491b1cfea908c05ce5b0230e b/.git_disabled/objects/6c/d3e1da146ce2a7491b1cfea908c05ce5b0230e new file mode 100755 index 0000000..c0f0503 Binary files /dev/null and b/.git_disabled/objects/6c/d3e1da146ce2a7491b1cfea908c05ce5b0230e differ diff --git a/.git_disabled/objects/6c/dc31ce4dc44a8b735d6cc7832a1e3aa88a46a4 b/.git_disabled/objects/6c/dc31ce4dc44a8b735d6cc7832a1e3aa88a46a4 new file mode 100755 index 0000000..b3a6522 Binary files /dev/null and b/.git_disabled/objects/6c/dc31ce4dc44a8b735d6cc7832a1e3aa88a46a4 differ diff --git a/.git_disabled/objects/6c/efbf010eb0d3667e0ff65e17e7feb04442c4e2 b/.git_disabled/objects/6c/efbf010eb0d3667e0ff65e17e7feb04442c4e2 new file mode 100755 index 0000000..56629a5 Binary files /dev/null and b/.git_disabled/objects/6c/efbf010eb0d3667e0ff65e17e7feb04442c4e2 differ diff --git a/.git_disabled/objects/6c/f107fa1b5db19500c536d705f91b3d1b5f795c b/.git_disabled/objects/6c/f107fa1b5db19500c536d705f91b3d1b5f795c new file mode 100755 index 0000000..2c3106c Binary files /dev/null and b/.git_disabled/objects/6c/f107fa1b5db19500c536d705f91b3d1b5f795c differ diff --git a/.git_disabled/objects/6d/0550d4638b2dde834316d79d7e57d22fa7827b b/.git_disabled/objects/6d/0550d4638b2dde834316d79d7e57d22fa7827b new file mode 100755 index 0000000..53d756c Binary files /dev/null and b/.git_disabled/objects/6d/0550d4638b2dde834316d79d7e57d22fa7827b differ diff --git a/.git_disabled/objects/6d/17cf9d15fb9f4a2358a2d079f3b8c755d005fa b/.git_disabled/objects/6d/17cf9d15fb9f4a2358a2d079f3b8c755d005fa new file mode 100755 index 0000000..d804c72 Binary files /dev/null and b/.git_disabled/objects/6d/17cf9d15fb9f4a2358a2d079f3b8c755d005fa differ diff --git a/.git_disabled/objects/6d/42f3efb9ffd7ecba99a77047726713d6a9165d b/.git_disabled/objects/6d/42f3efb9ffd7ecba99a77047726713d6a9165d new file mode 100755 index 0000000..ddbeee1 Binary files /dev/null and b/.git_disabled/objects/6d/42f3efb9ffd7ecba99a77047726713d6a9165d differ diff --git a/.git_disabled/objects/6d/617b4fe140254e2e5fbbb03f9e660de37dbbf1 b/.git_disabled/objects/6d/617b4fe140254e2e5fbbb03f9e660de37dbbf1 new file mode 100755 index 0000000..eb93fbc Binary files /dev/null and b/.git_disabled/objects/6d/617b4fe140254e2e5fbbb03f9e660de37dbbf1 differ diff --git a/.git_disabled/objects/6d/7ba724a3da85f35fcf4b1987701e47b59381c8 b/.git_disabled/objects/6d/7ba724a3da85f35fcf4b1987701e47b59381c8 new file mode 100755 index 0000000..f3e0620 Binary files /dev/null and b/.git_disabled/objects/6d/7ba724a3da85f35fcf4b1987701e47b59381c8 differ diff --git a/.git_disabled/objects/6d/93c13266a623bc2b0d59ff2db7f7224fe3b347 b/.git_disabled/objects/6d/93c13266a623bc2b0d59ff2db7f7224fe3b347 new file mode 100755 index 0000000..da49e06 Binary files /dev/null and b/.git_disabled/objects/6d/93c13266a623bc2b0d59ff2db7f7224fe3b347 differ diff --git a/.git_disabled/objects/6d/9bec235a8a474b8dc051b81894c1cf6332b493 b/.git_disabled/objects/6d/9bec235a8a474b8dc051b81894c1cf6332b493 new file mode 100755 index 0000000..7fa1422 Binary files /dev/null and b/.git_disabled/objects/6d/9bec235a8a474b8dc051b81894c1cf6332b493 differ diff --git a/.git_disabled/objects/6d/ab898083e2ddc15dedc001190d35691cefcd8f b/.git_disabled/objects/6d/ab898083e2ddc15dedc001190d35691cefcd8f new file mode 100755 index 0000000..885ac9c Binary files /dev/null and b/.git_disabled/objects/6d/ab898083e2ddc15dedc001190d35691cefcd8f differ diff --git a/.git_disabled/objects/6d/b82fb212a182a31f6cafd8240d87c684f64ddc b/.git_disabled/objects/6d/b82fb212a182a31f6cafd8240d87c684f64ddc new file mode 100755 index 0000000..6c80de8 Binary files /dev/null and b/.git_disabled/objects/6d/b82fb212a182a31f6cafd8240d87c684f64ddc differ diff --git a/.git_disabled/objects/6d/b83152c903275b87409f573296b534dbe1dae7 b/.git_disabled/objects/6d/b83152c903275b87409f573296b534dbe1dae7 new file mode 100755 index 0000000..18c5e2e Binary files /dev/null and b/.git_disabled/objects/6d/b83152c903275b87409f573296b534dbe1dae7 differ diff --git a/.git_disabled/objects/6d/d1492ff9e3b48938562f48b5ded0aea61e0481 b/.git_disabled/objects/6d/d1492ff9e3b48938562f48b5ded0aea61e0481 new file mode 100755 index 0000000..0daa48e Binary files /dev/null and b/.git_disabled/objects/6d/d1492ff9e3b48938562f48b5ded0aea61e0481 differ diff --git a/.git_disabled/objects/6d/e803a8a8124c65d44cb36cf1a4f68c2c270370 b/.git_disabled/objects/6d/e803a8a8124c65d44cb36cf1a4f68c2c270370 new file mode 100755 index 0000000..25cf323 Binary files /dev/null and b/.git_disabled/objects/6d/e803a8a8124c65d44cb36cf1a4f68c2c270370 differ diff --git a/.git_disabled/objects/6d/ecf2699c9290d1ac03c587d81daa0cb6927e1d b/.git_disabled/objects/6d/ecf2699c9290d1ac03c587d81daa0cb6927e1d new file mode 100755 index 0000000..fee9c58 Binary files /dev/null and b/.git_disabled/objects/6d/ecf2699c9290d1ac03c587d81daa0cb6927e1d differ diff --git a/.git_disabled/objects/6d/fed7d8abace7bea8260e220a989f93034a9d3c b/.git_disabled/objects/6d/fed7d8abace7bea8260e220a989f93034a9d3c new file mode 100755 index 0000000..9a162b1 Binary files /dev/null and b/.git_disabled/objects/6d/fed7d8abace7bea8260e220a989f93034a9d3c differ diff --git a/.git_disabled/objects/6e/03e4dce9654d8ef6cfbbcc22a313df6f4fc9f2 b/.git_disabled/objects/6e/03e4dce9654d8ef6cfbbcc22a313df6f4fc9f2 new file mode 100755 index 0000000..2add940 Binary files /dev/null and b/.git_disabled/objects/6e/03e4dce9654d8ef6cfbbcc22a313df6f4fc9f2 differ diff --git a/.git_disabled/objects/6e/09b9deee794b72a7a0943c5f4e72bdd41f4166 b/.git_disabled/objects/6e/09b9deee794b72a7a0943c5f4e72bdd41f4166 new file mode 100755 index 0000000..f62a744 Binary files /dev/null and b/.git_disabled/objects/6e/09b9deee794b72a7a0943c5f4e72bdd41f4166 differ diff --git a/.git_disabled/objects/6e/28a5fe1acc3f72518685c75dfc50ed4261cd75 b/.git_disabled/objects/6e/28a5fe1acc3f72518685c75dfc50ed4261cd75 new file mode 100755 index 0000000..9cb127b Binary files /dev/null and b/.git_disabled/objects/6e/28a5fe1acc3f72518685c75dfc50ed4261cd75 differ diff --git a/.git_disabled/objects/6e/348d796135aeddfe271aa1e0be7ca2eba6366d b/.git_disabled/objects/6e/348d796135aeddfe271aa1e0be7ca2eba6366d new file mode 100755 index 0000000..bf00928 Binary files /dev/null and b/.git_disabled/objects/6e/348d796135aeddfe271aa1e0be7ca2eba6366d differ diff --git a/.git_disabled/objects/6e/4b864e7dcbf04caf998dcabfd6feec65382291 b/.git_disabled/objects/6e/4b864e7dcbf04caf998dcabfd6feec65382291 new file mode 100755 index 0000000..37e49b3 Binary files /dev/null and b/.git_disabled/objects/6e/4b864e7dcbf04caf998dcabfd6feec65382291 differ diff --git a/.git_disabled/objects/6e/5bcd62c0fa0bcd32c8a2d783e083dd64a2d9f9 b/.git_disabled/objects/6e/5bcd62c0fa0bcd32c8a2d783e083dd64a2d9f9 new file mode 100755 index 0000000..e9f247f Binary files /dev/null and b/.git_disabled/objects/6e/5bcd62c0fa0bcd32c8a2d783e083dd64a2d9f9 differ diff --git a/.git_disabled/objects/6e/5c3629404482400a2c162922bb84d94669a09a b/.git_disabled/objects/6e/5c3629404482400a2c162922bb84d94669a09a new file mode 100755 index 0000000..f1b1e10 Binary files /dev/null and b/.git_disabled/objects/6e/5c3629404482400a2c162922bb84d94669a09a differ diff --git a/.git_disabled/objects/6e/5d0688b39ad6f29b978c55a16516a7c8be1cdb b/.git_disabled/objects/6e/5d0688b39ad6f29b978c55a16516a7c8be1cdb new file mode 100755 index 0000000..c317b33 Binary files /dev/null and b/.git_disabled/objects/6e/5d0688b39ad6f29b978c55a16516a7c8be1cdb differ diff --git a/.git_disabled/objects/6e/5e57275987c6aa6e0f2c1150481f9a8bca39fb b/.git_disabled/objects/6e/5e57275987c6aa6e0f2c1150481f9a8bca39fb new file mode 100755 index 0000000..4e5417d Binary files /dev/null and b/.git_disabled/objects/6e/5e57275987c6aa6e0f2c1150481f9a8bca39fb differ diff --git a/.git_disabled/objects/6e/8d6aa568a8725cd65dd98affbaf41d95f24e17 b/.git_disabled/objects/6e/8d6aa568a8725cd65dd98affbaf41d95f24e17 new file mode 100755 index 0000000..9ad6c3f Binary files /dev/null and b/.git_disabled/objects/6e/8d6aa568a8725cd65dd98affbaf41d95f24e17 differ diff --git a/.git_disabled/objects/6e/a4e7e2d71e496ab604de0548d452bd6bf3e160 b/.git_disabled/objects/6e/a4e7e2d71e496ab604de0548d452bd6bf3e160 new file mode 100755 index 0000000..fe99185 Binary files /dev/null and b/.git_disabled/objects/6e/a4e7e2d71e496ab604de0548d452bd6bf3e160 differ diff --git a/.git_disabled/objects/6e/b5daea941eee397a81244e36dced3d493bb0d3 b/.git_disabled/objects/6e/b5daea941eee397a81244e36dced3d493bb0d3 new file mode 100755 index 0000000..13aad2e Binary files /dev/null and b/.git_disabled/objects/6e/b5daea941eee397a81244e36dced3d493bb0d3 differ diff --git a/.git_disabled/objects/6e/bea6c765be9919d2cf0e93a3c360ac7da63f53 b/.git_disabled/objects/6e/bea6c765be9919d2cf0e93a3c360ac7da63f53 new file mode 100755 index 0000000..6aaa095 Binary files /dev/null and b/.git_disabled/objects/6e/bea6c765be9919d2cf0e93a3c360ac7da63f53 differ diff --git a/.git_disabled/objects/6e/c377031f2602beea1ad8502ef4b50f64b4f6ad b/.git_disabled/objects/6e/c377031f2602beea1ad8502ef4b50f64b4f6ad new file mode 100755 index 0000000..252fa12 Binary files /dev/null and b/.git_disabled/objects/6e/c377031f2602beea1ad8502ef4b50f64b4f6ad differ diff --git a/.git_disabled/objects/6e/d6e061cac49d1462ab142783f3a7de5324cfb6 b/.git_disabled/objects/6e/d6e061cac49d1462ab142783f3a7de5324cfb6 new file mode 100755 index 0000000..a8a3c04 Binary files /dev/null and b/.git_disabled/objects/6e/d6e061cac49d1462ab142783f3a7de5324cfb6 differ diff --git a/.git_disabled/objects/6e/efd9f32b6a0038155fa405dca2eec672c276d3 b/.git_disabled/objects/6e/efd9f32b6a0038155fa405dca2eec672c276d3 new file mode 100755 index 0000000..0231e26 Binary files /dev/null and b/.git_disabled/objects/6e/efd9f32b6a0038155fa405dca2eec672c276d3 differ diff --git a/.git_disabled/objects/6f/33629ab72df58dcae8251d1a691ad8c45aaa60 b/.git_disabled/objects/6f/33629ab72df58dcae8251d1a691ad8c45aaa60 new file mode 100755 index 0000000..ada814c Binary files /dev/null and b/.git_disabled/objects/6f/33629ab72df58dcae8251d1a691ad8c45aaa60 differ diff --git a/.git_disabled/objects/6f/479a0885f723b7395843d41164a87041820776 b/.git_disabled/objects/6f/479a0885f723b7395843d41164a87041820776 new file mode 100755 index 0000000..fcc2b9c Binary files /dev/null and b/.git_disabled/objects/6f/479a0885f723b7395843d41164a87041820776 differ diff --git a/.git_disabled/objects/6f/53f5f2a025e01e9949e2530bd9ca6928859251 b/.git_disabled/objects/6f/53f5f2a025e01e9949e2530bd9ca6928859251 new file mode 100755 index 0000000..d861aec Binary files /dev/null and b/.git_disabled/objects/6f/53f5f2a025e01e9949e2530bd9ca6928859251 differ diff --git a/.git_disabled/objects/6f/555c110c70e2ca4bc176e0442feb8033e5ba7f b/.git_disabled/objects/6f/555c110c70e2ca4bc176e0442feb8033e5ba7f new file mode 100755 index 0000000..cbbc3d9 Binary files /dev/null and b/.git_disabled/objects/6f/555c110c70e2ca4bc176e0442feb8033e5ba7f differ diff --git a/.git_disabled/objects/6f/5a0aa8cff07f5097173f89949d34a86e860af0 b/.git_disabled/objects/6f/5a0aa8cff07f5097173f89949d34a86e860af0 new file mode 100755 index 0000000..cd4712b Binary files /dev/null and b/.git_disabled/objects/6f/5a0aa8cff07f5097173f89949d34a86e860af0 differ diff --git a/.git_disabled/objects/6f/69eade41483862cd637505f59c0ec712b0f1db b/.git_disabled/objects/6f/69eade41483862cd637505f59c0ec712b0f1db new file mode 100755 index 0000000..66a2144 Binary files /dev/null and b/.git_disabled/objects/6f/69eade41483862cd637505f59c0ec712b0f1db differ diff --git a/.git_disabled/objects/6f/6e7eddc7455675f8949f76305643aa0e45e89f b/.git_disabled/objects/6f/6e7eddc7455675f8949f76305643aa0e45e89f new file mode 100755 index 0000000..ce04858 Binary files /dev/null and b/.git_disabled/objects/6f/6e7eddc7455675f8949f76305643aa0e45e89f differ diff --git a/.git_disabled/objects/6f/7d65d29324641900820083396eebc24e799c7c b/.git_disabled/objects/6f/7d65d29324641900820083396eebc24e799c7c new file mode 100755 index 0000000..c5dbcb0 Binary files /dev/null and b/.git_disabled/objects/6f/7d65d29324641900820083396eebc24e799c7c differ diff --git a/.git_disabled/objects/6f/7eae3d77652f8b9e458664482eac8191f186d4 b/.git_disabled/objects/6f/7eae3d77652f8b9e458664482eac8191f186d4 new file mode 100755 index 0000000..49c262a Binary files /dev/null and b/.git_disabled/objects/6f/7eae3d77652f8b9e458664482eac8191f186d4 differ diff --git a/.git_disabled/objects/6f/abfdd86b34e220d61267f344d6e3927f9401c5 b/.git_disabled/objects/6f/abfdd86b34e220d61267f344d6e3927f9401c5 new file mode 100755 index 0000000..44c1c55 Binary files /dev/null and b/.git_disabled/objects/6f/abfdd86b34e220d61267f344d6e3927f9401c5 differ diff --git a/.git_disabled/objects/6f/b44b0626ea37cd99ada37d8b82966d7f2780f1 b/.git_disabled/objects/6f/b44b0626ea37cd99ada37d8b82966d7f2780f1 new file mode 100755 index 0000000..861f7b9 Binary files /dev/null and b/.git_disabled/objects/6f/b44b0626ea37cd99ada37d8b82966d7f2780f1 differ diff --git a/.git_disabled/objects/6f/cdce0dc1c4a3a53ae261bb1352a370a559ba82 b/.git_disabled/objects/6f/cdce0dc1c4a3a53ae261bb1352a370a559ba82 new file mode 100755 index 0000000..32dc897 Binary files /dev/null and b/.git_disabled/objects/6f/cdce0dc1c4a3a53ae261bb1352a370a559ba82 differ diff --git a/.git_disabled/objects/6f/f0652804aaa4470288b65d1877d22caebf0dfd b/.git_disabled/objects/6f/f0652804aaa4470288b65d1877d22caebf0dfd new file mode 100755 index 0000000..ea11987 Binary files /dev/null and b/.git_disabled/objects/6f/f0652804aaa4470288b65d1877d22caebf0dfd differ diff --git a/.git_disabled/objects/6f/f287d11aeb2283c980cdf9a323f618944bc5bd b/.git_disabled/objects/6f/f287d11aeb2283c980cdf9a323f618944bc5bd new file mode 100755 index 0000000..65eaaf3 Binary files /dev/null and b/.git_disabled/objects/6f/f287d11aeb2283c980cdf9a323f618944bc5bd differ diff --git a/.git_disabled/objects/6f/f80ec572633ea4c0c31efce261090008714894 b/.git_disabled/objects/6f/f80ec572633ea4c0c31efce261090008714894 new file mode 100755 index 0000000..e55977e Binary files /dev/null and b/.git_disabled/objects/6f/f80ec572633ea4c0c31efce261090008714894 differ diff --git a/.git_disabled/objects/6f/f8e3deb3022e66c6cf0340a7a40e0e11206a0d b/.git_disabled/objects/6f/f8e3deb3022e66c6cf0340a7a40e0e11206a0d new file mode 100755 index 0000000..0fca2e1 Binary files /dev/null and b/.git_disabled/objects/6f/f8e3deb3022e66c6cf0340a7a40e0e11206a0d differ diff --git a/.git_disabled/objects/6f/f965375a3410c29c7d3e7ae13c447fd10f00e6 b/.git_disabled/objects/6f/f965375a3410c29c7d3e7ae13c447fd10f00e6 new file mode 100755 index 0000000..ceb1ed6 Binary files /dev/null and b/.git_disabled/objects/6f/f965375a3410c29c7d3e7ae13c447fd10f00e6 differ diff --git a/.git_disabled/objects/70/25fa9b9e414545b2e07429e84f41e02ddc0b8c b/.git_disabled/objects/70/25fa9b9e414545b2e07429e84f41e02ddc0b8c new file mode 100755 index 0000000..fb0e432 Binary files /dev/null and b/.git_disabled/objects/70/25fa9b9e414545b2e07429e84f41e02ddc0b8c differ diff --git a/.git_disabled/objects/70/2e34aebfed829438f7491ef8e68fda4f8009fe b/.git_disabled/objects/70/2e34aebfed829438f7491ef8e68fda4f8009fe new file mode 100755 index 0000000..2e1f9b2 Binary files /dev/null and b/.git_disabled/objects/70/2e34aebfed829438f7491ef8e68fda4f8009fe differ diff --git a/.git_disabled/objects/70/2ecc4b2e48a1bfc5413122184e98660177ce2b b/.git_disabled/objects/70/2ecc4b2e48a1bfc5413122184e98660177ce2b new file mode 100755 index 0000000..5ccf051 Binary files /dev/null and b/.git_disabled/objects/70/2ecc4b2e48a1bfc5413122184e98660177ce2b differ diff --git a/.git_disabled/objects/70/4dfdffc8ba61eb913fa918072381e410b23c00 b/.git_disabled/objects/70/4dfdffc8ba61eb913fa918072381e410b23c00 new file mode 100755 index 0000000..fa3c90c Binary files /dev/null and b/.git_disabled/objects/70/4dfdffc8ba61eb913fa918072381e410b23c00 differ diff --git a/.git_disabled/objects/70/6ce3e0b7897bbf7fa2698010e24b9c6a026829 b/.git_disabled/objects/70/6ce3e0b7897bbf7fa2698010e24b9c6a026829 new file mode 100755 index 0000000..93c9069 Binary files /dev/null and b/.git_disabled/objects/70/6ce3e0b7897bbf7fa2698010e24b9c6a026829 differ diff --git a/.git_disabled/objects/70/a83cb8a73bda44fdf446ac36ff0c15a692950a b/.git_disabled/objects/70/a83cb8a73bda44fdf446ac36ff0c15a692950a new file mode 100755 index 0000000..1b28448 Binary files /dev/null and b/.git_disabled/objects/70/a83cb8a73bda44fdf446ac36ff0c15a692950a differ diff --git a/.git_disabled/objects/70/ad1c4e83271528eb06cd78b6fb22db8a5848bf b/.git_disabled/objects/70/ad1c4e83271528eb06cd78b6fb22db8a5848bf new file mode 100755 index 0000000..6e54c5d Binary files /dev/null and b/.git_disabled/objects/70/ad1c4e83271528eb06cd78b6fb22db8a5848bf differ diff --git a/.git_disabled/objects/70/c76d65518cefba0268f80ffc513426fc9a3a97 b/.git_disabled/objects/70/c76d65518cefba0268f80ffc513426fc9a3a97 new file mode 100755 index 0000000..b71d73a Binary files /dev/null and b/.git_disabled/objects/70/c76d65518cefba0268f80ffc513426fc9a3a97 differ diff --git a/.git_disabled/objects/70/ce68af6950e6a4dc6f0e68830be5355e04cfc7 b/.git_disabled/objects/70/ce68af6950e6a4dc6f0e68830be5355e04cfc7 new file mode 100755 index 0000000..91a1190 Binary files /dev/null and b/.git_disabled/objects/70/ce68af6950e6a4dc6f0e68830be5355e04cfc7 differ diff --git a/.git_disabled/objects/70/d16ce481b4c1ff60f27fc6cebb084a285de794 b/.git_disabled/objects/70/d16ce481b4c1ff60f27fc6cebb084a285de794 new file mode 100755 index 0000000..3540898 Binary files /dev/null and b/.git_disabled/objects/70/d16ce481b4c1ff60f27fc6cebb084a285de794 differ diff --git a/.git_disabled/objects/71/07f561fbf51ecf2e8fe229d37bf79f53ef84f0 b/.git_disabled/objects/71/07f561fbf51ecf2e8fe229d37bf79f53ef84f0 new file mode 100755 index 0000000..b401148 Binary files /dev/null and b/.git_disabled/objects/71/07f561fbf51ecf2e8fe229d37bf79f53ef84f0 differ diff --git a/.git_disabled/objects/71/4447849f1ca0b64ae20a960f0c5bfae177e7ce b/.git_disabled/objects/71/4447849f1ca0b64ae20a960f0c5bfae177e7ce new file mode 100755 index 0000000..ffc78b4 Binary files /dev/null and b/.git_disabled/objects/71/4447849f1ca0b64ae20a960f0c5bfae177e7ce differ diff --git a/.git_disabled/objects/71/4de9dd93c89237744ca52850a61b44d06258fa b/.git_disabled/objects/71/4de9dd93c89237744ca52850a61b44d06258fa new file mode 100755 index 0000000..8ca48e0 Binary files /dev/null and b/.git_disabled/objects/71/4de9dd93c89237744ca52850a61b44d06258fa differ diff --git a/.git_disabled/objects/71/51f096edd24549ed344f52a5f588cc9b83dab4 b/.git_disabled/objects/71/51f096edd24549ed344f52a5f588cc9b83dab4 new file mode 100755 index 0000000..e928ea6 Binary files /dev/null and b/.git_disabled/objects/71/51f096edd24549ed344f52a5f588cc9b83dab4 differ diff --git a/.git_disabled/objects/71/69e4bf649a669efd5d7ed40f559dd955757da0 b/.git_disabled/objects/71/69e4bf649a669efd5d7ed40f559dd955757da0 new file mode 100755 index 0000000..575fb61 Binary files /dev/null and b/.git_disabled/objects/71/69e4bf649a669efd5d7ed40f559dd955757da0 differ diff --git a/.git_disabled/objects/71/70c9392d8339687d2acc8b0aa5d76524b0f858 b/.git_disabled/objects/71/70c9392d8339687d2acc8b0aa5d76524b0f858 new file mode 100755 index 0000000..692017b Binary files /dev/null and b/.git_disabled/objects/71/70c9392d8339687d2acc8b0aa5d76524b0f858 differ diff --git a/.git_disabled/objects/71/73e267a8ea89fde086a909283da688398a6a9b b/.git_disabled/objects/71/73e267a8ea89fde086a909283da688398a6a9b new file mode 100755 index 0000000..34b91e6 Binary files /dev/null and b/.git_disabled/objects/71/73e267a8ea89fde086a909283da688398a6a9b differ diff --git a/.git_disabled/objects/71/748df7335a8d7f4cf7fcde3903ea28b1efaefd b/.git_disabled/objects/71/748df7335a8d7f4cf7fcde3903ea28b1efaefd new file mode 100755 index 0000000..c0a2068 Binary files /dev/null and b/.git_disabled/objects/71/748df7335a8d7f4cf7fcde3903ea28b1efaefd differ diff --git a/.git_disabled/objects/71/83aea3997e257d1277fa658cc16bd186af9575 b/.git_disabled/objects/71/83aea3997e257d1277fa658cc16bd186af9575 new file mode 100755 index 0000000..843abdc Binary files /dev/null and b/.git_disabled/objects/71/83aea3997e257d1277fa658cc16bd186af9575 differ diff --git a/.git_disabled/objects/71/8c077c0dab4013cfa7d0c90b756f33f3810d7f b/.git_disabled/objects/71/8c077c0dab4013cfa7d0c90b756f33f3810d7f new file mode 100755 index 0000000..cda6d83 Binary files /dev/null and b/.git_disabled/objects/71/8c077c0dab4013cfa7d0c90b756f33f3810d7f differ diff --git a/.git_disabled/objects/71/90b5505361642b2302643e221e3899cf462a61 b/.git_disabled/objects/71/90b5505361642b2302643e221e3899cf462a61 new file mode 100755 index 0000000..71cbcd8 Binary files /dev/null and b/.git_disabled/objects/71/90b5505361642b2302643e221e3899cf462a61 differ diff --git a/.git_disabled/objects/71/90df73741b16e5a852e287edd0ab50bbe98dd4 b/.git_disabled/objects/71/90df73741b16e5a852e287edd0ab50bbe98dd4 new file mode 100755 index 0000000..55d6d1c Binary files /dev/null and b/.git_disabled/objects/71/90df73741b16e5a852e287edd0ab50bbe98dd4 differ diff --git a/.git_disabled/objects/71/a4984f60660d9a3b3deede386bf07f5322bd2d b/.git_disabled/objects/71/a4984f60660d9a3b3deede386bf07f5322bd2d new file mode 100755 index 0000000..5342e2e Binary files /dev/null and b/.git_disabled/objects/71/a4984f60660d9a3b3deede386bf07f5322bd2d differ diff --git a/.git_disabled/objects/71/bd8c45494a69d089b0719da7daf01dc4324768 b/.git_disabled/objects/71/bd8c45494a69d089b0719da7daf01dc4324768 new file mode 100755 index 0000000..ca0aad3 Binary files /dev/null and b/.git_disabled/objects/71/bd8c45494a69d089b0719da7daf01dc4324768 differ diff --git a/.git_disabled/objects/71/d3d1c278147a67efee88d3f823bd1137f5f759 b/.git_disabled/objects/71/d3d1c278147a67efee88d3f823bd1137f5f759 new file mode 100755 index 0000000..5d7bf97 Binary files /dev/null and b/.git_disabled/objects/71/d3d1c278147a67efee88d3f823bd1137f5f759 differ diff --git a/.git_disabled/objects/71/d64dd1c5d67806318ef30ecc27762896d463e4 b/.git_disabled/objects/71/d64dd1c5d67806318ef30ecc27762896d463e4 new file mode 100755 index 0000000..738f0aa Binary files /dev/null and b/.git_disabled/objects/71/d64dd1c5d67806318ef30ecc27762896d463e4 differ diff --git a/.git_disabled/objects/71/e4d5524ec756ed4f1306cd34ba6ec08f260057 b/.git_disabled/objects/71/e4d5524ec756ed4f1306cd34ba6ec08f260057 new file mode 100755 index 0000000..f856c33 Binary files /dev/null and b/.git_disabled/objects/71/e4d5524ec756ed4f1306cd34ba6ec08f260057 differ diff --git a/.git_disabled/objects/71/e5dd81e0bb1bb2ef74a027fe99a44db6d9f96c b/.git_disabled/objects/71/e5dd81e0bb1bb2ef74a027fe99a44db6d9f96c new file mode 100755 index 0000000..71b6baa Binary files /dev/null and b/.git_disabled/objects/71/e5dd81e0bb1bb2ef74a027fe99a44db6d9f96c differ diff --git a/.git_disabled/objects/71/fb04f8ea3d16c0902063c4db1907a4e8b49938 b/.git_disabled/objects/71/fb04f8ea3d16c0902063c4db1907a4e8b49938 new file mode 100755 index 0000000..1fde16b Binary files /dev/null and b/.git_disabled/objects/71/fb04f8ea3d16c0902063c4db1907a4e8b49938 differ diff --git a/.git_disabled/objects/72/071e1762f6204ce64745a22639013af4b6e866 b/.git_disabled/objects/72/071e1762f6204ce64745a22639013af4b6e866 new file mode 100755 index 0000000..0243382 Binary files /dev/null and b/.git_disabled/objects/72/071e1762f6204ce64745a22639013af4b6e866 differ diff --git a/.git_disabled/objects/72/49aa5809859343c9ec543e6d05d479de760ed5 b/.git_disabled/objects/72/49aa5809859343c9ec543e6d05d479de760ed5 new file mode 100755 index 0000000..c4cd92d --- /dev/null +++ b/.git_disabled/objects/72/49aa5809859343c9ec543e6d05d479de760ed5 @@ -0,0 +1,2 @@ +xJ0E}WA6m vMRx|#~iam|֪a0d! ':iXv8q +jV PoI)J)2kF%JZaٰnRgi fKJBi.DMS*WXp8^mkXRf > j|9>qOvoсRq/WJ^ \ No newline at end of file diff --git a/.git_disabled/objects/72/5b4467382ae0d0cc2febc4eb757da2666adc9b b/.git_disabled/objects/72/5b4467382ae0d0cc2febc4eb757da2666adc9b new file mode 100755 index 0000000..7b4fecf Binary files /dev/null and b/.git_disabled/objects/72/5b4467382ae0d0cc2febc4eb757da2666adc9b differ diff --git a/.git_disabled/objects/72/72c8d92364886c51fefd22837ed5ceab145606 b/.git_disabled/objects/72/72c8d92364886c51fefd22837ed5ceab145606 new file mode 100755 index 0000000..c03bd0b Binary files /dev/null and b/.git_disabled/objects/72/72c8d92364886c51fefd22837ed5ceab145606 differ diff --git a/.git_disabled/objects/72/98b07730bae032e47e719a32662f5aa5fde720 b/.git_disabled/objects/72/98b07730bae032e47e719a32662f5aa5fde720 new file mode 100755 index 0000000..b8e72e4 Binary files /dev/null and b/.git_disabled/objects/72/98b07730bae032e47e719a32662f5aa5fde720 differ diff --git a/.git_disabled/objects/72/a148bb2534f859e14dd4319017a6864a1de613 b/.git_disabled/objects/72/a148bb2534f859e14dd4319017a6864a1de613 new file mode 100755 index 0000000..9a41b74 Binary files /dev/null and b/.git_disabled/objects/72/a148bb2534f859e14dd4319017a6864a1de613 differ diff --git a/.git_disabled/objects/72/a617f4e227784884609eb0b03e7e9657a6714f b/.git_disabled/objects/72/a617f4e227784884609eb0b03e7e9657a6714f new file mode 100755 index 0000000..c8b3265 Binary files /dev/null and b/.git_disabled/objects/72/a617f4e227784884609eb0b03e7e9657a6714f differ diff --git a/.git_disabled/objects/72/a9b9ca3380a9c450b7568c30c4856f6c81ed54 b/.git_disabled/objects/72/a9b9ca3380a9c450b7568c30c4856f6c81ed54 new file mode 100755 index 0000000..82455c5 Binary files /dev/null and b/.git_disabled/objects/72/a9b9ca3380a9c450b7568c30c4856f6c81ed54 differ diff --git a/.git_disabled/objects/72/c3c0566cd8af2fa99d2d39b39903b0f3beb10e b/.git_disabled/objects/72/c3c0566cd8af2fa99d2d39b39903b0f3beb10e new file mode 100755 index 0000000..0481bed Binary files /dev/null and b/.git_disabled/objects/72/c3c0566cd8af2fa99d2d39b39903b0f3beb10e differ diff --git a/.git_disabled/objects/72/c9198472ede6ebfd1935aedb6d58254760446b b/.git_disabled/objects/72/c9198472ede6ebfd1935aedb6d58254760446b new file mode 100755 index 0000000..0b3273d Binary files /dev/null and b/.git_disabled/objects/72/c9198472ede6ebfd1935aedb6d58254760446b differ diff --git a/.git_disabled/objects/72/fa641762e9bcfe20f2073e6ab765adf72028c6 b/.git_disabled/objects/72/fa641762e9bcfe20f2073e6ab765adf72028c6 new file mode 100755 index 0000000..062cac5 Binary files /dev/null and b/.git_disabled/objects/72/fa641762e9bcfe20f2073e6ab765adf72028c6 differ diff --git a/.git_disabled/objects/73/0c947f7c60c104e3e9c984354c3cce712ce881 b/.git_disabled/objects/73/0c947f7c60c104e3e9c984354c3cce712ce881 new file mode 100755 index 0000000..5db0dca Binary files /dev/null and b/.git_disabled/objects/73/0c947f7c60c104e3e9c984354c3cce712ce881 differ diff --git a/.git_disabled/objects/73/136704b5cf27bd385533e066710c230c183513 b/.git_disabled/objects/73/136704b5cf27bd385533e066710c230c183513 new file mode 100755 index 0000000..fa1e943 Binary files /dev/null and b/.git_disabled/objects/73/136704b5cf27bd385533e066710c230c183513 differ diff --git a/.git_disabled/objects/73/15069d07ae915f9a5f19a1160b0ce3a2fa38c5 b/.git_disabled/objects/73/15069d07ae915f9a5f19a1160b0ce3a2fa38c5 new file mode 100755 index 0000000..290976d Binary files /dev/null and b/.git_disabled/objects/73/15069d07ae915f9a5f19a1160b0ce3a2fa38c5 differ diff --git a/.git_disabled/objects/73/1963d4695bec11b11fea967023be61d4aafca4 b/.git_disabled/objects/73/1963d4695bec11b11fea967023be61d4aafca4 new file mode 100755 index 0000000..b4dd5f4 Binary files /dev/null and b/.git_disabled/objects/73/1963d4695bec11b11fea967023be61d4aafca4 differ diff --git a/.git_disabled/objects/73/4907eaf8b4afa1666b0f608bbae659670643fc b/.git_disabled/objects/73/4907eaf8b4afa1666b0f608bbae659670643fc new file mode 100755 index 0000000..f2475d0 Binary files /dev/null and b/.git_disabled/objects/73/4907eaf8b4afa1666b0f608bbae659670643fc differ diff --git a/.git_disabled/objects/73/4be87853c86eb0da818a4cca3da9ecd0353eb1 b/.git_disabled/objects/73/4be87853c86eb0da818a4cca3da9ecd0353eb1 new file mode 100755 index 0000000..f89924e --- /dev/null +++ b/.git_disabled/objects/73/4be87853c86eb0da818a4cca3da9ecd0353eb1 @@ -0,0 +1,3 @@ +x}J@S  +"B"2LL[9揈E/TK +EnÚZM,#.uݨ(F\~}1RJ]6y3=9g ³c* \ No newline at end of file diff --git a/.git_disabled/objects/73/6bb600d96459f432c0450947a59a1fb9af9a5f b/.git_disabled/objects/73/6bb600d96459f432c0450947a59a1fb9af9a5f new file mode 100755 index 0000000..4391d2b Binary files /dev/null and b/.git_disabled/objects/73/6bb600d96459f432c0450947a59a1fb9af9a5f differ diff --git a/.git_disabled/objects/73/70370679f294495ed4d19c98952a41a9fc8591 b/.git_disabled/objects/73/70370679f294495ed4d19c98952a41a9fc8591 new file mode 100755 index 0000000..5658928 Binary files /dev/null and b/.git_disabled/objects/73/70370679f294495ed4d19c98952a41a9fc8591 differ diff --git a/.git_disabled/objects/73/728f706234792734de647c5dbcaa923a7304cc b/.git_disabled/objects/73/728f706234792734de647c5dbcaa923a7304cc new file mode 100755 index 0000000..4da7443 Binary files /dev/null and b/.git_disabled/objects/73/728f706234792734de647c5dbcaa923a7304cc differ diff --git a/.git_disabled/objects/73/76078a61884b89cb1169938d32aca30b38254a b/.git_disabled/objects/73/76078a61884b89cb1169938d32aca30b38254a new file mode 100755 index 0000000..529176b Binary files /dev/null and b/.git_disabled/objects/73/76078a61884b89cb1169938d32aca30b38254a differ diff --git a/.git_disabled/objects/73/7aacf0d190d409f5c1d50453993a56e435bf8a b/.git_disabled/objects/73/7aacf0d190d409f5c1d50453993a56e435bf8a new file mode 100755 index 0000000..987c951 Binary files /dev/null and b/.git_disabled/objects/73/7aacf0d190d409f5c1d50453993a56e435bf8a differ diff --git a/.git_disabled/objects/73/a81330d1f70dad3b8fbe922bdcd2102cca55dc b/.git_disabled/objects/73/a81330d1f70dad3b8fbe922bdcd2102cca55dc new file mode 100755 index 0000000..5b46c08 Binary files /dev/null and b/.git_disabled/objects/73/a81330d1f70dad3b8fbe922bdcd2102cca55dc differ diff --git a/.git_disabled/objects/73/b18e384cc041115d98027fd7be7533d1c2e569 b/.git_disabled/objects/73/b18e384cc041115d98027fd7be7533d1c2e569 new file mode 100755 index 0000000..ae9581f Binary files /dev/null and b/.git_disabled/objects/73/b18e384cc041115d98027fd7be7533d1c2e569 differ diff --git a/.git_disabled/objects/73/d464eb60dd6823dab55ec03493b0cbc36f5225 b/.git_disabled/objects/73/d464eb60dd6823dab55ec03493b0cbc36f5225 new file mode 100755 index 0000000..8da3707 --- /dev/null +++ b/.git_disabled/objects/73/d464eb60dd6823dab55ec03493b0cbc36f5225 @@ -0,0 +1,2 @@ +xV]k0sŅ=J$u-B0(c֍-*K>OYaBƞ 9(2d"m7 o \ No newline at end of file diff --git a/.git_disabled/objects/73/d753e5f75789378143dc9c54b5ffe519fb45c9 b/.git_disabled/objects/73/d753e5f75789378143dc9c54b5ffe519fb45c9 new file mode 100755 index 0000000..6dd2762 --- /dev/null +++ b/.git_disabled/objects/73/d753e5f75789378143dc9c54b5ffe519fb45c9 @@ -0,0 +1,4 @@ +x}M @; Ba!. V :NVRb UuB#`8ؤ5NUuܩq|,Q+eo a +ajżs8úథJKWIlr9t=-  +I0' +\5+ L?Aa)9?#wvOr \ No newline at end of file diff --git a/.git_disabled/objects/73/d9b2bcef11183a3e25f36eb2a7ee01b0734ae1 b/.git_disabled/objects/73/d9b2bcef11183a3e25f36eb2a7ee01b0734ae1 new file mode 100755 index 0000000..93aeab2 Binary files /dev/null and b/.git_disabled/objects/73/d9b2bcef11183a3e25f36eb2a7ee01b0734ae1 differ diff --git a/.git_disabled/objects/73/e9310d046243fc8e09a2053f11a6b890e1fabb b/.git_disabled/objects/73/e9310d046243fc8e09a2053f11a6b890e1fabb new file mode 100755 index 0000000..4038baa Binary files /dev/null and b/.git_disabled/objects/73/e9310d046243fc8e09a2053f11a6b890e1fabb differ diff --git a/.git_disabled/objects/73/f994283b6b487f9a3dd0980a9f128382cf6735 b/.git_disabled/objects/73/f994283b6b487f9a3dd0980a9f128382cf6735 new file mode 100755 index 0000000..62add60 Binary files /dev/null and b/.git_disabled/objects/73/f994283b6b487f9a3dd0980a9f128382cf6735 differ diff --git a/.git_disabled/objects/74/013b88fa6e3d92c3382fd750f5aea1054afd7e b/.git_disabled/objects/74/013b88fa6e3d92c3382fd750f5aea1054afd7e new file mode 100755 index 0000000..48f4cfb Binary files /dev/null and b/.git_disabled/objects/74/013b88fa6e3d92c3382fd750f5aea1054afd7e differ diff --git a/.git_disabled/objects/74/09acf6b397f4c092b0aa1959aae665a64372ec b/.git_disabled/objects/74/09acf6b397f4c092b0aa1959aae665a64372ec new file mode 100755 index 0000000..0be4b96 Binary files /dev/null and b/.git_disabled/objects/74/09acf6b397f4c092b0aa1959aae665a64372ec differ diff --git a/.git_disabled/objects/74/2eadcc04d112652c967a2660d3526d32304f24 b/.git_disabled/objects/74/2eadcc04d112652c967a2660d3526d32304f24 new file mode 100755 index 0000000..44150b3 Binary files /dev/null and b/.git_disabled/objects/74/2eadcc04d112652c967a2660d3526d32304f24 differ diff --git a/.git_disabled/objects/74/3e04fdd398822c38cc7f4658b5a0e7bb83ef8f b/.git_disabled/objects/74/3e04fdd398822c38cc7f4658b5a0e7bb83ef8f new file mode 100755 index 0000000..55942d1 Binary files /dev/null and b/.git_disabled/objects/74/3e04fdd398822c38cc7f4658b5a0e7bb83ef8f differ diff --git a/.git_disabled/objects/74/4af9760c7f8bfca60f22fec35ca164aa8ce8a0 b/.git_disabled/objects/74/4af9760c7f8bfca60f22fec35ca164aa8ce8a0 new file mode 100755 index 0000000..9613a94 Binary files /dev/null and b/.git_disabled/objects/74/4af9760c7f8bfca60f22fec35ca164aa8ce8a0 differ diff --git a/.git_disabled/objects/74/50257b9183c971187fddff44a5037cbcdfe522 b/.git_disabled/objects/74/50257b9183c971187fddff44a5037cbcdfe522 new file mode 100755 index 0000000..e418ee8 Binary files /dev/null and b/.git_disabled/objects/74/50257b9183c971187fddff44a5037cbcdfe522 differ diff --git a/.git_disabled/objects/74/55c01119c07edd5b8deeca40eff6778e7d05ab b/.git_disabled/objects/74/55c01119c07edd5b8deeca40eff6778e7d05ab new file mode 100755 index 0000000..605d0b9 Binary files /dev/null and b/.git_disabled/objects/74/55c01119c07edd5b8deeca40eff6778e7d05ab differ diff --git a/.git_disabled/objects/74/73cd90a39149e4e465b919975abea7d7d578ae b/.git_disabled/objects/74/73cd90a39149e4e465b919975abea7d7d578ae new file mode 100755 index 0000000..b8574e1 Binary files /dev/null and b/.git_disabled/objects/74/73cd90a39149e4e465b919975abea7d7d578ae differ diff --git a/.git_disabled/objects/74/8d3d7314f85db577bbbd53c8828f53b849c8c4 b/.git_disabled/objects/74/8d3d7314f85db577bbbd53c8828f53b849c8c4 new file mode 100755 index 0000000..1f3b04c Binary files /dev/null and b/.git_disabled/objects/74/8d3d7314f85db577bbbd53c8828f53b849c8c4 differ diff --git a/.git_disabled/objects/74/8d6ae627f15ed6f4310980902dee0d340aa336 b/.git_disabled/objects/74/8d6ae627f15ed6f4310980902dee0d340aa336 new file mode 100755 index 0000000..e95ea14 Binary files /dev/null and b/.git_disabled/objects/74/8d6ae627f15ed6f4310980902dee0d340aa336 differ diff --git a/.git_disabled/objects/74/95c58b29def16c50111d542d381eb8123660c1 b/.git_disabled/objects/74/95c58b29def16c50111d542d381eb8123660c1 new file mode 100755 index 0000000..8833f31 Binary files /dev/null and b/.git_disabled/objects/74/95c58b29def16c50111d542d381eb8123660c1 differ diff --git a/.git_disabled/objects/74/f4afe2e5d02b8b4f56def1fb7ccb15a37e9e6f b/.git_disabled/objects/74/f4afe2e5d02b8b4f56def1fb7ccb15a37e9e6f new file mode 100755 index 0000000..3c3b75c Binary files /dev/null and b/.git_disabled/objects/74/f4afe2e5d02b8b4f56def1fb7ccb15a37e9e6f differ diff --git a/.git_disabled/objects/75/058fb875174d341aa05be557765422b30b3b8a b/.git_disabled/objects/75/058fb875174d341aa05be557765422b30b3b8a new file mode 100755 index 0000000..4aac870 --- /dev/null +++ b/.git_disabled/objects/75/058fb875174d341aa05be557765422b30b3b8a @@ -0,0 +1,8 @@ +x}TO@Oh/-i]Y‚U %f2Sf&]APpok/'#&iۭKfޛ~Bpc #f·\F$ +id4dZeZ9,AϔB\B% I'*Y1)0%V2V휍պT xW\.&5Zv~9%AE{j *vs00D^l +''&+"D5V|@~D2SJbдZfmΣ)IbMWgZ [7xUC4ҋ׫ +ZRث@ŗ!,?$#68Pk+C- +)H'uc S +Ij§qG=8O<;9CvjJ1̈́TKh)] ~y NS.uqn7Qxml1x*h.0Ւ¢lqy-x[Sƅj6[yk4 fz#yʲpmhd A[(m3ar#¿ (@ \ No newline at end of file diff --git a/.git_disabled/objects/75/184f9dfa672926ad5cc67389196feee500f700 b/.git_disabled/objects/75/184f9dfa672926ad5cc67389196feee500f700 new file mode 100755 index 0000000..4de2887 Binary files /dev/null and b/.git_disabled/objects/75/184f9dfa672926ad5cc67389196feee500f700 differ diff --git a/.git_disabled/objects/75/2d61ac26e6ea7699e47d1e29a32ae6ce8f2a2c b/.git_disabled/objects/75/2d61ac26e6ea7699e47d1e29a32ae6ce8f2a2c new file mode 100755 index 0000000..a81dc58 Binary files /dev/null and b/.git_disabled/objects/75/2d61ac26e6ea7699e47d1e29a32ae6ce8f2a2c differ diff --git a/.git_disabled/objects/75/2fd007c9ced73a6bbe4bcee70049f7ba986b71 b/.git_disabled/objects/75/2fd007c9ced73a6bbe4bcee70049f7ba986b71 new file mode 100755 index 0000000..5f7279f Binary files /dev/null and b/.git_disabled/objects/75/2fd007c9ced73a6bbe4bcee70049f7ba986b71 differ diff --git a/.git_disabled/objects/75/3b877a45b79cfc01802e7b058b6803aa33b650 b/.git_disabled/objects/75/3b877a45b79cfc01802e7b058b6803aa33b650 new file mode 100755 index 0000000..ef90cee --- /dev/null +++ b/.git_disabled/objects/75/3b877a45b79cfc01802e7b058b6803aa33b650 @@ -0,0 +1,3 @@ +x}Tn1朧e# JEUm$]lo!Ác_0w{h7|T)>{X r܃ST=8NVVj-<8GNJ- JL6k^^UqVj?j,P +un8yZ2ĖST/ĭ.kgMq]RQ,APd8`g/Dp(TNH;t^ g\c&Vt\e>lI. +z%ƥL^n1#\}xMs/͋@Sԋ_,1',R=CR*"!AaO~ ~-`9AN: b|W8Cx$'rRcYPG] ^î glD묺+=h3~n N>,Bօćg'ua cM BرRB&l=38nxoX}|eZ)4Dl iCdOqqC,AojqSP7; T}Q\whkϸk'76jO75|fAXX9e__ $O[3BSZJl׍uZs BLݭ5vS땋 1^nxΆo#k9oYUi4tvcل䏺w>Pɮ2Y bv;# \ No newline at end of file diff --git a/.git_disabled/objects/75/5cd18491ad169e80025a67c17530b0c29db78d b/.git_disabled/objects/75/5cd18491ad169e80025a67c17530b0c29db78d new file mode 100755 index 0000000..fe4a94f --- /dev/null +++ b/.git_disabled/objects/75/5cd18491ad169e80025a67c17530b0c29db78d @@ -0,0 +1,3 @@ +xUn6O1^Y, 7iq-m2)؇wsâ@_@ꐔ;)栘o>39ӓ_M\B D\*Ӭ;`)f[)B&bZK@_lZYDmrR79kQT~yHʥ[W0`ڠR.,jCO L"l W_K\=89>xs" a&w +TZc]ۗ2sTt7Q 5NkC:kZxtVed&^2H_9Ych'8gZJyƸh=Fu,=zoa,eA[$_)3 7_Z˿W8E shמ%:eFn1, p i^$v{sPcFg$}!{oa2dMu93D0_`n r_vOjc]dQhjѭ,˝i$"k5}՞-KxglQXHB% j@&1a=wG+ԱԂq=U{M{!$si`я+*bAr?XY@.ж#] K"B&28O5K=q`+U%6"-ه8 \mVS$Ga'.SLۤNA}^KhؿnoUtG~FQtᒾ!Zy 0j%,-w9Sib)_*g̐:b_b節uII003 +ܔHZ='mt1FU[X6r /G? f/?a}ᾙlKd+N:&87!V,rfqn@r$KV uW_7z;TID3+\d?񦺱 \ No newline at end of file diff --git a/.git_disabled/objects/75/680c065f9f763282b7a1a383a7cc0c08d07f31 b/.git_disabled/objects/75/680c065f9f763282b7a1a383a7cc0c08d07f31 new file mode 100755 index 0000000..49b46d9 Binary files /dev/null and b/.git_disabled/objects/75/680c065f9f763282b7a1a383a7cc0c08d07f31 differ diff --git a/.git_disabled/objects/75/6c84710848ee33dd24df1b72b91a7768df3693 b/.git_disabled/objects/75/6c84710848ee33dd24df1b72b91a7768df3693 new file mode 100755 index 0000000..3ff70e1 Binary files /dev/null and b/.git_disabled/objects/75/6c84710848ee33dd24df1b72b91a7768df3693 differ diff --git a/.git_disabled/objects/75/728b69fb2261bb74ace9ce98f4aec60829085e b/.git_disabled/objects/75/728b69fb2261bb74ace9ce98f4aec60829085e new file mode 100755 index 0000000..4b82f45 Binary files /dev/null and b/.git_disabled/objects/75/728b69fb2261bb74ace9ce98f4aec60829085e differ diff --git a/.git_disabled/objects/75/76baa1b7dc660877b03117b7ef1770d54b6cee b/.git_disabled/objects/75/76baa1b7dc660877b03117b7ef1770d54b6cee new file mode 100755 index 0000000..f99ae83 Binary files /dev/null and b/.git_disabled/objects/75/76baa1b7dc660877b03117b7ef1770d54b6cee differ diff --git a/.git_disabled/objects/75/82bbb1ae31e34941e2d95093d587671beeb51a b/.git_disabled/objects/75/82bbb1ae31e34941e2d95093d587671beeb51a new file mode 100755 index 0000000..a420420 Binary files /dev/null and b/.git_disabled/objects/75/82bbb1ae31e34941e2d95093d587671beeb51a differ diff --git a/.git_disabled/objects/75/894ff5b5844897cf98792e963b1e144b49e6d9 b/.git_disabled/objects/75/894ff5b5844897cf98792e963b1e144b49e6d9 new file mode 100755 index 0000000..21da4c0 Binary files /dev/null and b/.git_disabled/objects/75/894ff5b5844897cf98792e963b1e144b49e6d9 differ diff --git a/.git_disabled/objects/75/9dae68ce2a09a0b3367bf8835572c52f72b870 b/.git_disabled/objects/75/9dae68ce2a09a0b3367bf8835572c52f72b870 new file mode 100755 index 0000000..44e0480 Binary files /dev/null and b/.git_disabled/objects/75/9dae68ce2a09a0b3367bf8835572c52f72b870 differ diff --git a/.git_disabled/objects/75/a3b0556f373cb6ed80a262dd0a34c40aeb605e b/.git_disabled/objects/75/a3b0556f373cb6ed80a262dd0a34c40aeb605e new file mode 100755 index 0000000..50974e6 Binary files /dev/null and b/.git_disabled/objects/75/a3b0556f373cb6ed80a262dd0a34c40aeb605e differ diff --git a/.git_disabled/objects/75/ad90f0a243362bea2434bb4c5ed36ee6718111 b/.git_disabled/objects/75/ad90f0a243362bea2434bb4c5ed36ee6718111 new file mode 100755 index 0000000..ce85032 Binary files /dev/null and b/.git_disabled/objects/75/ad90f0a243362bea2434bb4c5ed36ee6718111 differ diff --git a/.git_disabled/objects/75/ad998349af45e66a5fc2bbe1966960b7eab3ba b/.git_disabled/objects/75/ad998349af45e66a5fc2bbe1966960b7eab3ba new file mode 100755 index 0000000..dd6811a Binary files /dev/null and b/.git_disabled/objects/75/ad998349af45e66a5fc2bbe1966960b7eab3ba differ diff --git a/.git_disabled/objects/75/f50bd102b01e358251da5b1f8f9f465a8d5b68 b/.git_disabled/objects/75/f50bd102b01e358251da5b1f8f9f465a8d5b68 new file mode 100755 index 0000000..c675096 Binary files /dev/null and b/.git_disabled/objects/75/f50bd102b01e358251da5b1f8f9f465a8d5b68 differ diff --git a/.git_disabled/objects/76/00d80e89f5e8fde14a6a4bcb52f6369fb4ccb6 b/.git_disabled/objects/76/00d80e89f5e8fde14a6a4bcb52f6369fb4ccb6 new file mode 100755 index 0000000..e2db0ed Binary files /dev/null and b/.git_disabled/objects/76/00d80e89f5e8fde14a6a4bcb52f6369fb4ccb6 differ diff --git a/.git_disabled/objects/76/11a59979189de0e3c3e440e513722d3e38dbdd b/.git_disabled/objects/76/11a59979189de0e3c3e440e513722d3e38dbdd new file mode 100755 index 0000000..87d95f7 Binary files /dev/null and b/.git_disabled/objects/76/11a59979189de0e3c3e440e513722d3e38dbdd differ diff --git a/.git_disabled/objects/76/2740363916f70f853af4ff7ebb2c8b56088046 b/.git_disabled/objects/76/2740363916f70f853af4ff7ebb2c8b56088046 new file mode 100755 index 0000000..585ff31 Binary files /dev/null and b/.git_disabled/objects/76/2740363916f70f853af4ff7ebb2c8b56088046 differ diff --git a/.git_disabled/objects/76/32ecf77545c5e5501cb3fc5719df0761104ca2 b/.git_disabled/objects/76/32ecf77545c5e5501cb3fc5719df0761104ca2 new file mode 100755 index 0000000..03ea952 Binary files /dev/null and b/.git_disabled/objects/76/32ecf77545c5e5501cb3fc5719df0761104ca2 differ diff --git a/.git_disabled/objects/76/3a32db7f4a3b17be6b1d248ce20ce6c8b4c843 b/.git_disabled/objects/76/3a32db7f4a3b17be6b1d248ce20ce6c8b4c843 new file mode 100755 index 0000000..cc58c3d Binary files /dev/null and b/.git_disabled/objects/76/3a32db7f4a3b17be6b1d248ce20ce6c8b4c843 differ diff --git a/.git_disabled/objects/76/420da250585812f7d113f81e139291029ae356 b/.git_disabled/objects/76/420da250585812f7d113f81e139291029ae356 new file mode 100755 index 0000000..c74cd45 Binary files /dev/null and b/.git_disabled/objects/76/420da250585812f7d113f81e139291029ae356 differ diff --git a/.git_disabled/objects/76/5bf7249de7c79c01506a11c0bebf0d18ecd961 b/.git_disabled/objects/76/5bf7249de7c79c01506a11c0bebf0d18ecd961 new file mode 100755 index 0000000..0138b65 Binary files /dev/null and b/.git_disabled/objects/76/5bf7249de7c79c01506a11c0bebf0d18ecd961 differ diff --git a/.git_disabled/objects/76/62598004c51cdad1757bb76e449bdb652db91a b/.git_disabled/objects/76/62598004c51cdad1757bb76e449bdb652db91a new file mode 100755 index 0000000..45fc641 Binary files /dev/null and b/.git_disabled/objects/76/62598004c51cdad1757bb76e449bdb652db91a differ diff --git a/.git_disabled/objects/76/6a3ffc565427ed430dd59df075d42a76547d8e b/.git_disabled/objects/76/6a3ffc565427ed430dd59df075d42a76547d8e new file mode 100755 index 0000000..72d095a Binary files /dev/null and b/.git_disabled/objects/76/6a3ffc565427ed430dd59df075d42a76547d8e differ diff --git a/.git_disabled/objects/76/76fd82bbd0f5e8c425d7944572ed4092e27867 b/.git_disabled/objects/76/76fd82bbd0f5e8c425d7944572ed4092e27867 new file mode 100755 index 0000000..1ce6ddb Binary files /dev/null and b/.git_disabled/objects/76/76fd82bbd0f5e8c425d7944572ed4092e27867 differ diff --git a/.git_disabled/objects/76/7b88bc66b44d17fc5433ccdbca9ce2e9866205 b/.git_disabled/objects/76/7b88bc66b44d17fc5433ccdbca9ce2e9866205 new file mode 100755 index 0000000..7c78dc2 Binary files /dev/null and b/.git_disabled/objects/76/7b88bc66b44d17fc5433ccdbca9ce2e9866205 differ diff --git a/.git_disabled/objects/76/7eac9b3afccf5233f200daca6a6146a58652a3 b/.git_disabled/objects/76/7eac9b3afccf5233f200daca6a6146a58652a3 new file mode 100755 index 0000000..893e502 Binary files /dev/null and b/.git_disabled/objects/76/7eac9b3afccf5233f200daca6a6146a58652a3 differ diff --git a/.git_disabled/objects/76/93cb2f6f852b108706f24a02c8b20b33e414ba b/.git_disabled/objects/76/93cb2f6f852b108706f24a02c8b20b33e414ba new file mode 100755 index 0000000..ea38605 Binary files /dev/null and b/.git_disabled/objects/76/93cb2f6f852b108706f24a02c8b20b33e414ba differ diff --git a/.git_disabled/objects/76/949465e3a0a63cec9d247443921f298f56772b b/.git_disabled/objects/76/949465e3a0a63cec9d247443921f298f56772b new file mode 100755 index 0000000..a3f6f65 Binary files /dev/null and b/.git_disabled/objects/76/949465e3a0a63cec9d247443921f298f56772b differ diff --git a/.git_disabled/objects/76/96a0cfe26c4f3e11ba518b38f8fc65a8d6cdf2 b/.git_disabled/objects/76/96a0cfe26c4f3e11ba518b38f8fc65a8d6cdf2 new file mode 100755 index 0000000..3d82334 Binary files /dev/null and b/.git_disabled/objects/76/96a0cfe26c4f3e11ba518b38f8fc65a8d6cdf2 differ diff --git a/.git_disabled/objects/76/cbabb4c900269ce5e54f16f8fb5337dce4093c b/.git_disabled/objects/76/cbabb4c900269ce5e54f16f8fb5337dce4093c new file mode 100755 index 0000000..13dbf07 Binary files /dev/null and b/.git_disabled/objects/76/cbabb4c900269ce5e54f16f8fb5337dce4093c differ diff --git a/.git_disabled/objects/76/d504f6903dac227f620bfeb4521c98c5b60588 b/.git_disabled/objects/76/d504f6903dac227f620bfeb4521c98c5b60588 new file mode 100755 index 0000000..f7977aa Binary files /dev/null and b/.git_disabled/objects/76/d504f6903dac227f620bfeb4521c98c5b60588 differ diff --git a/.git_disabled/objects/76/e7327b8617c9d12236f511414d5eb58e98a44b b/.git_disabled/objects/76/e7327b8617c9d12236f511414d5eb58e98a44b new file mode 100755 index 0000000..802beee Binary files /dev/null and b/.git_disabled/objects/76/e7327b8617c9d12236f511414d5eb58e98a44b differ diff --git a/.git_disabled/objects/76/f22893168891ecf32cb39be90c3b4765a79bd0 b/.git_disabled/objects/76/f22893168891ecf32cb39be90c3b4765a79bd0 new file mode 100755 index 0000000..2223162 --- /dev/null +++ b/.git_disabled/objects/76/f22893168891ecf32cb39be90c3b4765a79bd0 @@ -0,0 +1 @@ +xUOj0 _!ȥ=4vX(ck6LvN{{z #t/>;υP[EujQ15ً!еk' p:28 2HAOɎ`}F}:|Ã栋C.D;Mb&CQC_ެ?8Yŏc(ieCd,Ҹ̖vCMJɜ.} ̊_e \ No newline at end of file diff --git a/.git_disabled/objects/77/0e9d333ee70e75fe7c0bad7fb13e4f6ed4627a b/.git_disabled/objects/77/0e9d333ee70e75fe7c0bad7fb13e4f6ed4627a new file mode 100755 index 0000000..e10666b --- /dev/null +++ b/.git_disabled/objects/77/0e9d333ee70e75fe7c0bad7fb13e4f6ed4627a @@ -0,0 +1,2 @@ +xu=o SNHT)tk7'&˦H8{8{XOܚn,P9op&2qb&d'Fw#!D"TZvK" uAgS~>N_&];U ԍr"p/c/r8uR:R"nWNESs#Ier`JdDDıG _rA\L +n(?'yP<?@"y޳R9XyW*]=vm^>rn \ No newline at end of file diff --git a/.git_disabled/objects/77/22593966e98b2c7170f6ce13bb010503b84196 b/.git_disabled/objects/77/22593966e98b2c7170f6ce13bb010503b84196 new file mode 100755 index 0000000..6f28b0a Binary files /dev/null and b/.git_disabled/objects/77/22593966e98b2c7170f6ce13bb010503b84196 differ diff --git a/.git_disabled/objects/77/22bd005099be98512f337fb32ef370278e089f b/.git_disabled/objects/77/22bd005099be98512f337fb32ef370278e089f new file mode 100755 index 0000000..87ec1b5 Binary files /dev/null and b/.git_disabled/objects/77/22bd005099be98512f337fb32ef370278e089f differ diff --git a/.git_disabled/objects/77/2c39f96069d868b8a8f197225d927ff2ada485 b/.git_disabled/objects/77/2c39f96069d868b8a8f197225d927ff2ada485 new file mode 100755 index 0000000..cf30850 Binary files /dev/null and b/.git_disabled/objects/77/2c39f96069d868b8a8f197225d927ff2ada485 differ diff --git a/.git_disabled/objects/77/32d22b74bd2486be1c4fbf03395d8087992879 b/.git_disabled/objects/77/32d22b74bd2486be1c4fbf03395d8087992879 new file mode 100755 index 0000000..fddef16 Binary files /dev/null and b/.git_disabled/objects/77/32d22b74bd2486be1c4fbf03395d8087992879 differ diff --git a/.git_disabled/objects/77/42f9a4573f9ed648de10b5c001e34d46c6abed b/.git_disabled/objects/77/42f9a4573f9ed648de10b5c001e34d46c6abed new file mode 100755 index 0000000..64a84da Binary files /dev/null and b/.git_disabled/objects/77/42f9a4573f9ed648de10b5c001e34d46c6abed differ diff --git a/.git_disabled/objects/77/48a048bda4c31aaf94e6f27d5354b9b1d6483c b/.git_disabled/objects/77/48a048bda4c31aaf94e6f27d5354b9b1d6483c new file mode 100755 index 0000000..f60b4a3 Binary files /dev/null and b/.git_disabled/objects/77/48a048bda4c31aaf94e6f27d5354b9b1d6483c differ diff --git a/.git_disabled/objects/77/5573c8e0bb5c4db7bb3a8e39e284ff273eb93f b/.git_disabled/objects/77/5573c8e0bb5c4db7bb3a8e39e284ff273eb93f new file mode 100755 index 0000000..072058a Binary files /dev/null and b/.git_disabled/objects/77/5573c8e0bb5c4db7bb3a8e39e284ff273eb93f differ diff --git a/.git_disabled/objects/77/5a96c5f0d2123fef06f47b23e1e064c670cea2 b/.git_disabled/objects/77/5a96c5f0d2123fef06f47b23e1e064c670cea2 new file mode 100755 index 0000000..f8ad2dd Binary files /dev/null and b/.git_disabled/objects/77/5a96c5f0d2123fef06f47b23e1e064c670cea2 differ diff --git a/.git_disabled/objects/77/6167dd3b4dda992f380636efaa56bef6511041 b/.git_disabled/objects/77/6167dd3b4dda992f380636efaa56bef6511041 new file mode 100755 index 0000000..d6f86de Binary files /dev/null and b/.git_disabled/objects/77/6167dd3b4dda992f380636efaa56bef6511041 differ diff --git a/.git_disabled/objects/77/7ef41de77321a49db9d7b3d8703b1f561830d1 b/.git_disabled/objects/77/7ef41de77321a49db9d7b3d8703b1f561830d1 new file mode 100755 index 0000000..c729b5e Binary files /dev/null and b/.git_disabled/objects/77/7ef41de77321a49db9d7b3d8703b1f561830d1 differ diff --git a/.git_disabled/objects/77/a6d16674083339a4118f418d9bd3ac797a2b42 b/.git_disabled/objects/77/a6d16674083339a4118f418d9bd3ac797a2b42 new file mode 100755 index 0000000..d8c1f42 Binary files /dev/null and b/.git_disabled/objects/77/a6d16674083339a4118f418d9bd3ac797a2b42 differ diff --git a/.git_disabled/objects/77/b2960aabf858fe8170801e2037cc42a700106c b/.git_disabled/objects/77/b2960aabf858fe8170801e2037cc42a700106c new file mode 100755 index 0000000..e81fcec Binary files /dev/null and b/.git_disabled/objects/77/b2960aabf858fe8170801e2037cc42a700106c differ diff --git a/.git_disabled/objects/77/c484504aaf57b778223279d178b3b6d8ac93f2 b/.git_disabled/objects/77/c484504aaf57b778223279d178b3b6d8ac93f2 new file mode 100755 index 0000000..42473bb Binary files /dev/null and b/.git_disabled/objects/77/c484504aaf57b778223279d178b3b6d8ac93f2 differ diff --git a/.git_disabled/objects/77/c8b5db484fe7e4a1fe0740955e23ee6c5382b2 b/.git_disabled/objects/77/c8b5db484fe7e4a1fe0740955e23ee6c5382b2 new file mode 100755 index 0000000..ba48704 Binary files /dev/null and b/.git_disabled/objects/77/c8b5db484fe7e4a1fe0740955e23ee6c5382b2 differ diff --git a/.git_disabled/objects/77/cb243a8088b3aabc0c4a56fa86c0cfc865a6f5 b/.git_disabled/objects/77/cb243a8088b3aabc0c4a56fa86c0cfc865a6f5 new file mode 100755 index 0000000..c96c515 Binary files /dev/null and b/.git_disabled/objects/77/cb243a8088b3aabc0c4a56fa86c0cfc865a6f5 differ diff --git a/.git_disabled/objects/77/d83361566a650605962271713d2f81506efcac b/.git_disabled/objects/77/d83361566a650605962271713d2f81506efcac new file mode 100755 index 0000000..be418fa Binary files /dev/null and b/.git_disabled/objects/77/d83361566a650605962271713d2f81506efcac differ diff --git a/.git_disabled/objects/77/e6458a0d37507b01e4d31cdec82308771db2e0 b/.git_disabled/objects/77/e6458a0d37507b01e4d31cdec82308771db2e0 new file mode 100755 index 0000000..647ed43 Binary files /dev/null and b/.git_disabled/objects/77/e6458a0d37507b01e4d31cdec82308771db2e0 differ diff --git a/.git_disabled/objects/77/e89550dde9da1b5231294dc80fd7d9daa75255 b/.git_disabled/objects/77/e89550dde9da1b5231294dc80fd7d9daa75255 new file mode 100755 index 0000000..6c52fe6 Binary files /dev/null and b/.git_disabled/objects/77/e89550dde9da1b5231294dc80fd7d9daa75255 differ diff --git a/.git_disabled/objects/77/f33e1614fd7d46ccd66b394d6c5d663bf8a8c6 b/.git_disabled/objects/77/f33e1614fd7d46ccd66b394d6c5d663bf8a8c6 new file mode 100755 index 0000000..8d4eb69 Binary files /dev/null and b/.git_disabled/objects/77/f33e1614fd7d46ccd66b394d6c5d663bf8a8c6 differ diff --git a/.git_disabled/objects/77/f45a6d3986d15626fc8a5fd459d6a3e0fbe466 b/.git_disabled/objects/77/f45a6d3986d15626fc8a5fd459d6a3e0fbe466 new file mode 100755 index 0000000..b2dec97 Binary files /dev/null and b/.git_disabled/objects/77/f45a6d3986d15626fc8a5fd459d6a3e0fbe466 differ diff --git a/.git_disabled/objects/78/0084304368d63fa20c55b88d22e4dc406c05d8 b/.git_disabled/objects/78/0084304368d63fa20c55b88d22e4dc406c05d8 new file mode 100755 index 0000000..92dd36b Binary files /dev/null and b/.git_disabled/objects/78/0084304368d63fa20c55b88d22e4dc406c05d8 differ diff --git a/.git_disabled/objects/78/05f84bcc75bdcc2992d1a28c21dd70abd33c92 b/.git_disabled/objects/78/05f84bcc75bdcc2992d1a28c21dd70abd33c92 new file mode 100755 index 0000000..76ef296 Binary files /dev/null and b/.git_disabled/objects/78/05f84bcc75bdcc2992d1a28c21dd70abd33c92 differ diff --git a/.git_disabled/objects/78/1c05557a5a6ac30e9d279279f12c3d430f0ba4 b/.git_disabled/objects/78/1c05557a5a6ac30e9d279279f12c3d430f0ba4 new file mode 100755 index 0000000..c271732 Binary files /dev/null and b/.git_disabled/objects/78/1c05557a5a6ac30e9d279279f12c3d430f0ba4 differ diff --git a/.git_disabled/objects/78/221e649c56150aa61c7acb12fc8a26857f2834 b/.git_disabled/objects/78/221e649c56150aa61c7acb12fc8a26857f2834 new file mode 100755 index 0000000..7d64b58 Binary files /dev/null and b/.git_disabled/objects/78/221e649c56150aa61c7acb12fc8a26857f2834 differ diff --git a/.git_disabled/objects/78/2a3641e49e35d8ee20fa672c2a4222ac8ee005 b/.git_disabled/objects/78/2a3641e49e35d8ee20fa672c2a4222ac8ee005 new file mode 100755 index 0000000..930a994 Binary files /dev/null and b/.git_disabled/objects/78/2a3641e49e35d8ee20fa672c2a4222ac8ee005 differ diff --git a/.git_disabled/objects/78/3dd7655cc6e3ad1fe8abcda19967c298b2deac b/.git_disabled/objects/78/3dd7655cc6e3ad1fe8abcda19967c298b2deac new file mode 100755 index 0000000..29c2a35 Binary files /dev/null and b/.git_disabled/objects/78/3dd7655cc6e3ad1fe8abcda19967c298b2deac differ diff --git a/.git_disabled/objects/78/50d6a999836207e0ad6b5fa1e01521fded2501 b/.git_disabled/objects/78/50d6a999836207e0ad6b5fa1e01521fded2501 new file mode 100755 index 0000000..4102082 Binary files /dev/null and b/.git_disabled/objects/78/50d6a999836207e0ad6b5fa1e01521fded2501 differ diff --git a/.git_disabled/objects/78/50f8109f9ee2614155213d81ba2937dee680e8 b/.git_disabled/objects/78/50f8109f9ee2614155213d81ba2937dee680e8 new file mode 100755 index 0000000..809af70 Binary files /dev/null and b/.git_disabled/objects/78/50f8109f9ee2614155213d81ba2937dee680e8 differ diff --git a/.git_disabled/objects/78/53f86d847952689a09f9952710dad36db06308 b/.git_disabled/objects/78/53f86d847952689a09f9952710dad36db06308 new file mode 100755 index 0000000..0eab304 Binary files /dev/null and b/.git_disabled/objects/78/53f86d847952689a09f9952710dad36db06308 differ diff --git a/.git_disabled/objects/78/5afe180b6943325f38623b9840ded65dc9714b b/.git_disabled/objects/78/5afe180b6943325f38623b9840ded65dc9714b new file mode 100755 index 0000000..9ddd1a4 Binary files /dev/null and b/.git_disabled/objects/78/5afe180b6943325f38623b9840ded65dc9714b differ diff --git a/.git_disabled/objects/78/686edd3415639bfd783da3e7beee916ed46691 b/.git_disabled/objects/78/686edd3415639bfd783da3e7beee916ed46691 new file mode 100755 index 0000000..417dd82 Binary files /dev/null and b/.git_disabled/objects/78/686edd3415639bfd783da3e7beee916ed46691 differ diff --git a/.git_disabled/objects/78/717fcbd64ee4673b425c23b9d0a379c157ddd4 b/.git_disabled/objects/78/717fcbd64ee4673b425c23b9d0a379c157ddd4 new file mode 100755 index 0000000..a91d782 Binary files /dev/null and b/.git_disabled/objects/78/717fcbd64ee4673b425c23b9d0a379c157ddd4 differ diff --git a/.git_disabled/objects/78/7d5d1885baffb21d19c5d19bdee47d36ece63d b/.git_disabled/objects/78/7d5d1885baffb21d19c5d19bdee47d36ece63d new file mode 100755 index 0000000..796a2b6 Binary files /dev/null and b/.git_disabled/objects/78/7d5d1885baffb21d19c5d19bdee47d36ece63d differ diff --git a/.git_disabled/objects/78/849c283c8535965de26fddbc79c2f70bb39f65 b/.git_disabled/objects/78/849c283c8535965de26fddbc79c2f70bb39f65 new file mode 100755 index 0000000..eb50d23 Binary files /dev/null and b/.git_disabled/objects/78/849c283c8535965de26fddbc79c2f70bb39f65 differ diff --git a/.git_disabled/objects/78/8665bab5a7d4f785afb1788f507b42052bca67 b/.git_disabled/objects/78/8665bab5a7d4f785afb1788f507b42052bca67 new file mode 100755 index 0000000..4a99a78 Binary files /dev/null and b/.git_disabled/objects/78/8665bab5a7d4f785afb1788f507b42052bca67 differ diff --git a/.git_disabled/objects/78/96c015667e930a47db01d65450460b3fc8e2e0 b/.git_disabled/objects/78/96c015667e930a47db01d65450460b3fc8e2e0 new file mode 100755 index 0000000..82472aa Binary files /dev/null and b/.git_disabled/objects/78/96c015667e930a47db01d65450460b3fc8e2e0 differ diff --git a/.git_disabled/objects/78/ae9fa17b70ac01c4c758cc714c0801344c19ac b/.git_disabled/objects/78/ae9fa17b70ac01c4c758cc714c0801344c19ac new file mode 100755 index 0000000..cfecc00 Binary files /dev/null and b/.git_disabled/objects/78/ae9fa17b70ac01c4c758cc714c0801344c19ac differ diff --git a/.git_disabled/objects/78/bea8ebba122a82e9381d61aa5abcc79f64f382 b/.git_disabled/objects/78/bea8ebba122a82e9381d61aa5abcc79f64f382 new file mode 100755 index 0000000..f537e4d Binary files /dev/null and b/.git_disabled/objects/78/bea8ebba122a82e9381d61aa5abcc79f64f382 differ diff --git a/.git_disabled/objects/78/c726dbc2a3bae31bf10b86602de3708d575131 b/.git_disabled/objects/78/c726dbc2a3bae31bf10b86602de3708d575131 new file mode 100755 index 0000000..11223a9 Binary files /dev/null and b/.git_disabled/objects/78/c726dbc2a3bae31bf10b86602de3708d575131 differ diff --git a/.git_disabled/objects/78/d0f7b68372acc8d1630e20122361160cf24ff1 b/.git_disabled/objects/78/d0f7b68372acc8d1630e20122361160cf24ff1 new file mode 100755 index 0000000..a192112 Binary files /dev/null and b/.git_disabled/objects/78/d0f7b68372acc8d1630e20122361160cf24ff1 differ diff --git a/.git_disabled/objects/78/dc2bda0569cecbe7d336df77df9f97c145159d b/.git_disabled/objects/78/dc2bda0569cecbe7d336df77df9f97c145159d new file mode 100755 index 0000000..b965581 Binary files /dev/null and b/.git_disabled/objects/78/dc2bda0569cecbe7d336df77df9f97c145159d differ diff --git a/.git_disabled/objects/78/e9b3f7b5e8496496b8f65b44d584b7caa38a7e b/.git_disabled/objects/78/e9b3f7b5e8496496b8f65b44d584b7caa38a7e new file mode 100755 index 0000000..1b42a94 Binary files /dev/null and b/.git_disabled/objects/78/e9b3f7b5e8496496b8f65b44d584b7caa38a7e differ diff --git a/.git_disabled/objects/78/fffe312a9d216fbf5c23285468bd257ad55a99 b/.git_disabled/objects/78/fffe312a9d216fbf5c23285468bd257ad55a99 new file mode 100755 index 0000000..5de3542 Binary files /dev/null and b/.git_disabled/objects/78/fffe312a9d216fbf5c23285468bd257ad55a99 differ diff --git a/.git_disabled/objects/79/08409af591c833bc7b4581b19f3b5b85921ebc b/.git_disabled/objects/79/08409af591c833bc7b4581b19f3b5b85921ebc new file mode 100755 index 0000000..6678398 Binary files /dev/null and b/.git_disabled/objects/79/08409af591c833bc7b4581b19f3b5b85921ebc differ diff --git a/.git_disabled/objects/79/17c399aabdc59448aafd91b6f63ab6c4cd0fc3 b/.git_disabled/objects/79/17c399aabdc59448aafd91b6f63ab6c4cd0fc3 new file mode 100755 index 0000000..24b17ba Binary files /dev/null and b/.git_disabled/objects/79/17c399aabdc59448aafd91b6f63ab6c4cd0fc3 differ diff --git a/.git_disabled/objects/79/1fa8f834201d01e3166a09be869af7d3b92ffc b/.git_disabled/objects/79/1fa8f834201d01e3166a09be869af7d3b92ffc new file mode 100755 index 0000000..ba69f47 Binary files /dev/null and b/.git_disabled/objects/79/1fa8f834201d01e3166a09be869af7d3b92ffc differ diff --git a/.git_disabled/objects/79/3c195d940f1a064c54530e134d7075a69f7d32 b/.git_disabled/objects/79/3c195d940f1a064c54530e134d7075a69f7d32 new file mode 100755 index 0000000..85c756b Binary files /dev/null and b/.git_disabled/objects/79/3c195d940f1a064c54530e134d7075a69f7d32 differ diff --git a/.git_disabled/objects/79/45321a5a9a294f527d49960ea62acd745e1104 b/.git_disabled/objects/79/45321a5a9a294f527d49960ea62acd745e1104 new file mode 100755 index 0000000..6b4cae6 Binary files /dev/null and b/.git_disabled/objects/79/45321a5a9a294f527d49960ea62acd745e1104 differ diff --git a/.git_disabled/objects/79/483ccb85c831a949100af84a2cbdc84c71b74d b/.git_disabled/objects/79/483ccb85c831a949100af84a2cbdc84c71b74d new file mode 100755 index 0000000..e688ab6 Binary files /dev/null and b/.git_disabled/objects/79/483ccb85c831a949100af84a2cbdc84c71b74d differ diff --git a/.git_disabled/objects/79/6114cd5364b077eb9bf5db534df09028b8f9cd b/.git_disabled/objects/79/6114cd5364b077eb9bf5db534df09028b8f9cd new file mode 100755 index 0000000..ac79ef7 Binary files /dev/null and b/.git_disabled/objects/79/6114cd5364b077eb9bf5db534df09028b8f9cd differ diff --git a/.git_disabled/objects/79/63fe83280d0e43cc7154e45de1f49d2790638e b/.git_disabled/objects/79/63fe83280d0e43cc7154e45de1f49d2790638e new file mode 100755 index 0000000..6363e03 Binary files /dev/null and b/.git_disabled/objects/79/63fe83280d0e43cc7154e45de1f49d2790638e differ diff --git a/.git_disabled/objects/79/75d309d66aa54fa226d6776d2901ddcf55d8ac b/.git_disabled/objects/79/75d309d66aa54fa226d6776d2901ddcf55d8ac new file mode 100755 index 0000000..88c7898 Binary files /dev/null and b/.git_disabled/objects/79/75d309d66aa54fa226d6776d2901ddcf55d8ac differ diff --git a/.git_disabled/objects/79/950b82cb08a3675fe1463739577ccd9cefeaf2 b/.git_disabled/objects/79/950b82cb08a3675fe1463739577ccd9cefeaf2 new file mode 100755 index 0000000..bb0022c --- /dev/null +++ b/.git_disabled/objects/79/950b82cb08a3675fe1463739577ccd9cefeaf2 @@ -0,0 +1,3 @@ +xu1o0;+k" +uG/pluZtA͋T-*)Jnekg}s2< Sz6#e)K)a+-e0|lFˌ ݜq ?=@NWc."~Ӟhڕ>+A"o{igt| \ No newline at end of file diff --git a/.git_disabled/objects/79/9f8941e847c0e20a93ddf08087e1a02643e91e b/.git_disabled/objects/79/9f8941e847c0e20a93ddf08087e1a02643e91e new file mode 100755 index 0000000..d3a8367 Binary files /dev/null and b/.git_disabled/objects/79/9f8941e847c0e20a93ddf08087e1a02643e91e differ diff --git a/.git_disabled/objects/79/a1d4429a6eee8c2cfa0716ccd58f33953967f0 b/.git_disabled/objects/79/a1d4429a6eee8c2cfa0716ccd58f33953967f0 new file mode 100755 index 0000000..93ca622 Binary files /dev/null and b/.git_disabled/objects/79/a1d4429a6eee8c2cfa0716ccd58f33953967f0 differ diff --git a/.git_disabled/objects/79/b2d149e8b7747d5e9c2dd282274bc09605f8b7 b/.git_disabled/objects/79/b2d149e8b7747d5e9c2dd282274bc09605f8b7 new file mode 100755 index 0000000..57123cd Binary files /dev/null and b/.git_disabled/objects/79/b2d149e8b7747d5e9c2dd282274bc09605f8b7 differ diff --git a/.git_disabled/objects/79/b711cdb7bb547ee6dfab416f51184e49340188 b/.git_disabled/objects/79/b711cdb7bb547ee6dfab416f51184e49340188 new file mode 100755 index 0000000..10a2dd7 Binary files /dev/null and b/.git_disabled/objects/79/b711cdb7bb547ee6dfab416f51184e49340188 differ diff --git a/.git_disabled/objects/79/b9a3f11bebc979404d82aac8808f077ab1002a b/.git_disabled/objects/79/b9a3f11bebc979404d82aac8808f077ab1002a new file mode 100755 index 0000000..dedb054 Binary files /dev/null and b/.git_disabled/objects/79/b9a3f11bebc979404d82aac8808f077ab1002a differ diff --git a/.git_disabled/objects/79/b9fda6a25242e8a77e20d06fe976c766562cd2 b/.git_disabled/objects/79/b9fda6a25242e8a77e20d06fe976c766562cd2 new file mode 100755 index 0000000..714ef8d Binary files /dev/null and b/.git_disabled/objects/79/b9fda6a25242e8a77e20d06fe976c766562cd2 differ diff --git a/.git_disabled/objects/79/cc712338546fde352a8baad8647547838e2892 b/.git_disabled/objects/79/cc712338546fde352a8baad8647547838e2892 new file mode 100755 index 0000000..4cf52a1 Binary files /dev/null and b/.git_disabled/objects/79/cc712338546fde352a8baad8647547838e2892 differ diff --git a/.git_disabled/objects/79/dcbf91c0b335c23e5570d297bda49a3525f40a b/.git_disabled/objects/79/dcbf91c0b335c23e5570d297bda49a3525f40a new file mode 100755 index 0000000..8af7319 Binary files /dev/null and b/.git_disabled/objects/79/dcbf91c0b335c23e5570d297bda49a3525f40a differ diff --git a/.git_disabled/objects/79/de1f14a45e86f3d5e98d29059c30e72ce3fb9f b/.git_disabled/objects/79/de1f14a45e86f3d5e98d29059c30e72ce3fb9f new file mode 100755 index 0000000..588c836 Binary files /dev/null and b/.git_disabled/objects/79/de1f14a45e86f3d5e98d29059c30e72ce3fb9f differ diff --git a/.git_disabled/objects/79/e783d5a4a3d6431ea3f63231821f555cef42b7 b/.git_disabled/objects/79/e783d5a4a3d6431ea3f63231821f555cef42b7 new file mode 100755 index 0000000..fe8f94a Binary files /dev/null and b/.git_disabled/objects/79/e783d5a4a3d6431ea3f63231821f555cef42b7 differ diff --git a/.git_disabled/objects/79/f375d676bb042ef63d815877310e2c90fa8f43 b/.git_disabled/objects/79/f375d676bb042ef63d815877310e2c90fa8f43 new file mode 100755 index 0000000..71fb9b3 Binary files /dev/null and b/.git_disabled/objects/79/f375d676bb042ef63d815877310e2c90fa8f43 differ diff --git a/.git_disabled/objects/7a/00b7009b7a4fe699d20a20ad06b53b6fa823d2 b/.git_disabled/objects/7a/00b7009b7a4fe699d20a20ad06b53b6fa823d2 new file mode 100755 index 0000000..0b91946 Binary files /dev/null and b/.git_disabled/objects/7a/00b7009b7a4fe699d20a20ad06b53b6fa823d2 differ diff --git a/.git_disabled/objects/7a/038deb101e1191194ddd4fd98a62f9d1c2acd6 b/.git_disabled/objects/7a/038deb101e1191194ddd4fd98a62f9d1c2acd6 new file mode 100755 index 0000000..c0209cd Binary files /dev/null and b/.git_disabled/objects/7a/038deb101e1191194ddd4fd98a62f9d1c2acd6 differ diff --git a/.git_disabled/objects/7a/03af61f592604627a3cbc6e1e3e82d7bcf6918 b/.git_disabled/objects/7a/03af61f592604627a3cbc6e1e3e82d7bcf6918 new file mode 100755 index 0000000..22e3775 Binary files /dev/null and b/.git_disabled/objects/7a/03af61f592604627a3cbc6e1e3e82d7bcf6918 differ diff --git a/.git_disabled/objects/7a/19f04b5bf5d957c20c3c59939a2a8040f95f62 b/.git_disabled/objects/7a/19f04b5bf5d957c20c3c59939a2a8040f95f62 new file mode 100755 index 0000000..5dcb119 --- /dev/null +++ b/.git_disabled/objects/7a/19f04b5bf5d957c20c3c59939a2a8040f95f62 @@ -0,0 +1,2 @@ +xTn09_@ +zXlrHOFOEQPJ",J>Ui,\T YoiaiqQ&iն\<KidYڀ6DdwSd#!&Zv.-QQ0ԨT73R0jU 㓄>Y-lӋ)v'{!/ \ No newline at end of file diff --git a/.git_disabled/objects/7a/321053b29bcd48698cf2bd74a1d19c8556aefb b/.git_disabled/objects/7a/321053b29bcd48698cf2bd74a1d19c8556aefb new file mode 100755 index 0000000..f9039e2 Binary files /dev/null and b/.git_disabled/objects/7a/321053b29bcd48698cf2bd74a1d19c8556aefb differ diff --git a/.git_disabled/objects/7a/3dc1bae13f665dbea255d01b5ccf6cbf240cfa b/.git_disabled/objects/7a/3dc1bae13f665dbea255d01b5ccf6cbf240cfa new file mode 100755 index 0000000..d09d41b Binary files /dev/null and b/.git_disabled/objects/7a/3dc1bae13f665dbea255d01b5ccf6cbf240cfa differ diff --git a/.git_disabled/objects/7a/474fe05b5c624741e1d00c10b641ecbed8e70c b/.git_disabled/objects/7a/474fe05b5c624741e1d00c10b641ecbed8e70c new file mode 100755 index 0000000..2f20e9b --- /dev/null +++ b/.git_disabled/objects/7a/474fe05b5c624741e1d00c10b641ecbed8e70c @@ -0,0 +1,2 @@ +xuα +0aE\1*""6W&$(nEqs>rŤ}m &1ػtgQB>ix+A6.owshSn/ +['fa~)56 .ӕ4G?`Vtm3Qf4 +t(O9e=`Rk4  c6x3N@R1= )^"s sktQu֢v0UH's:\#⊱'w Fǎ<_=?IZ"P`TD9˳x 0InZnR0H"hϹpPW=9Q9uhOg2N Ktb/\<^xpdkΙmx'˨[otH?d ڸ0=vz[uTT>|~*}Gm:-?UZ6-E@'4/‚[p +U$kea Y_LhR +9vqltt)4^fB=>[C#;kZFq^uu E55v dNmwVd.ziP URr=wWr4].͖_%wBDME \ No newline at end of file diff --git a/.git_disabled/objects/7e/29462253f37c1761cd4f0d5faa4dac27cae2c3 b/.git_disabled/objects/7e/29462253f37c1761cd4f0d5faa4dac27cae2c3 new file mode 100755 index 0000000..c9dbbf1 --- /dev/null +++ b/.git_disabled/objects/7e/29462253f37c1761cd4f0d5faa4dac27cae2c3 @@ -0,0 +1,3 @@ +x=o0;W@IH P ZSQuS?mN"IH޽W)T L>$N2 y1,_\o_[+ 2m`+iLX-VWVʣb EZ)B1*"PS +ugfIάҴ(#UULw{Hٓp4̻ ?|E-"y} J>mnY +7@+`݋7ɡȴrHl[zv吀iH">M t`v\G7Хu 8p@]HĜpbo%{>Go8W`{M8 SVNH?J{u[>pMp1]E]c ΎQAqۃ=,K*y~^⋴X(_JEivYe>Ag'Rk]zS{Ry)R$Y0'ovY.42+Т1aUe^,Mꅗ~C<\ P2vDPgp )!ZsWզގ \ No newline at end of file diff --git a/.git_disabled/objects/7e/2ede84e2b91b322e8dc92d8953beb16a732a44 b/.git_disabled/objects/7e/2ede84e2b91b322e8dc92d8953beb16a732a44 new file mode 100755 index 0000000..82a018a Binary files /dev/null and b/.git_disabled/objects/7e/2ede84e2b91b322e8dc92d8953beb16a732a44 differ diff --git a/.git_disabled/objects/7e/31a0e2eaf857c34d77a0e5f547ac2e2253b49a b/.git_disabled/objects/7e/31a0e2eaf857c34d77a0e5f547ac2e2253b49a new file mode 100755 index 0000000..a6c7341 Binary files /dev/null and b/.git_disabled/objects/7e/31a0e2eaf857c34d77a0e5f547ac2e2253b49a differ diff --git a/.git_disabled/objects/7e/61c60a367b7754a6a0820ecc19f10f30fceef3 b/.git_disabled/objects/7e/61c60a367b7754a6a0820ecc19f10f30fceef3 new file mode 100755 index 0000000..dee7ff5 Binary files /dev/null and b/.git_disabled/objects/7e/61c60a367b7754a6a0820ecc19f10f30fceef3 differ diff --git a/.git_disabled/objects/7e/75c8283bcd43d211ca0af022a5bc262ab5d4d8 b/.git_disabled/objects/7e/75c8283bcd43d211ca0af022a5bc262ab5d4d8 new file mode 100755 index 0000000..ed13ac9 Binary files /dev/null and b/.git_disabled/objects/7e/75c8283bcd43d211ca0af022a5bc262ab5d4d8 differ diff --git a/.git_disabled/objects/7e/77f50fc38fe59e4810360e8fdb0c2b229b9171 b/.git_disabled/objects/7e/77f50fc38fe59e4810360e8fdb0c2b229b9171 new file mode 100755 index 0000000..68a9eea --- /dev/null +++ b/.git_disabled/objects/7e/77f50fc38fe59e4810360e8fdb0c2b229b9171 @@ -0,0 +1,2 @@ +xMn! (gVڿd[)5]+JU^؞7zņvrs G=Ńw]N >>9dFKAA/Ӷ3iZ5j~38詑nh^'ٍ=P ^/ ZV*xޞKŌIG +ALLt g*kԷ q8R]lF|q6Vu 8qj \ No newline at end of file diff --git a/.git_disabled/objects/7e/8ac4c1476d28b7a508e3c11aa8529cb58e8108 b/.git_disabled/objects/7e/8ac4c1476d28b7a508e3c11aa8529cb58e8108 new file mode 100755 index 0000000..4a70ebc Binary files /dev/null and b/.git_disabled/objects/7e/8ac4c1476d28b7a508e3c11aa8529cb58e8108 differ diff --git a/.git_disabled/objects/7e/8c21aa250724ed98d1d2a33759f7771ea4e682 b/.git_disabled/objects/7e/8c21aa250724ed98d1d2a33759f7771ea4e682 new file mode 100755 index 0000000..718ddcb --- /dev/null +++ b/.git_disabled/objects/7e/8c21aa250724ed98d1d2a33759f7771ea4e682 @@ -0,0 +1,3 @@ +xMRKkANv HI@F‚ ADI\ٝ^3k. +=% +?!޼rс`/ѽ'&n:q"0QB>!) H@9G#S(bir=2<#2=/Eg·WD! z63暲@Œ5І@>j)Ai--z<-WPUrk1gY@Vinn\dRI QUՃF>Y#`LX2FF`%E 4h0#\ ]$J;s@^ ~i6,sZ/7N*V S!YذHYiHJ#)a"9qh7bz`Yt.ZڈnԔ\< '(ʝڽpӣѣxCE6.NnfVuh7|atMi)M?W`jAv`j@{[ަ *'Pr+:pj~2Y<c, \ No newline at end of file diff --git a/.git_disabled/objects/7f/193efc98aff809be788f4c1293279de1a55f65 b/.git_disabled/objects/7f/193efc98aff809be788f4c1293279de1a55f65 new file mode 100755 index 0000000..74e2e74 Binary files /dev/null and b/.git_disabled/objects/7f/193efc98aff809be788f4c1293279de1a55f65 differ diff --git a/.git_disabled/objects/7f/254f932f5e4f5519e04487393651d588f3974e b/.git_disabled/objects/7f/254f932f5e4f5519e04487393651d588f3974e new file mode 100755 index 0000000..c1593cb Binary files /dev/null and b/.git_disabled/objects/7f/254f932f5e4f5519e04487393651d588f3974e differ diff --git a/.git_disabled/objects/7f/25c8c8b8a503c79e119a27783a8cc0eb7fc9c1 b/.git_disabled/objects/7f/25c8c8b8a503c79e119a27783a8cc0eb7fc9c1 new file mode 100755 index 0000000..df1d4c5 Binary files /dev/null and b/.git_disabled/objects/7f/25c8c8b8a503c79e119a27783a8cc0eb7fc9c1 differ diff --git a/.git_disabled/objects/7f/27a04e2956da47737ff2c2696e8a571e1f8a18 b/.git_disabled/objects/7f/27a04e2956da47737ff2c2696e8a571e1f8a18 new file mode 100755 index 0000000..3790234 Binary files /dev/null and b/.git_disabled/objects/7f/27a04e2956da47737ff2c2696e8a571e1f8a18 differ diff --git a/.git_disabled/objects/7f/379dbb0b0e05e8b6125b7613130e5520fd8579 b/.git_disabled/objects/7f/379dbb0b0e05e8b6125b7613130e5520fd8579 new file mode 100755 index 0000000..4305936 Binary files /dev/null and b/.git_disabled/objects/7f/379dbb0b0e05e8b6125b7613130e5520fd8579 differ diff --git a/.git_disabled/objects/7f/6957677585cba96c5281b96622344475a430ee b/.git_disabled/objects/7f/6957677585cba96c5281b96622344475a430ee new file mode 100755 index 0000000..18a4d5d Binary files /dev/null and b/.git_disabled/objects/7f/6957677585cba96c5281b96622344475a430ee differ diff --git a/.git_disabled/objects/7f/6f52963f973fdce42d61cd757716258860ab18 b/.git_disabled/objects/7f/6f52963f973fdce42d61cd757716258860ab18 new file mode 100755 index 0000000..ab11a46 Binary files /dev/null and b/.git_disabled/objects/7f/6f52963f973fdce42d61cd757716258860ab18 differ diff --git a/.git_disabled/objects/7f/7dbb50728a15cbf16c55de04bdf3ae7cfa7f5d b/.git_disabled/objects/7f/7dbb50728a15cbf16c55de04bdf3ae7cfa7f5d new file mode 100755 index 0000000..74615aa Binary files /dev/null and b/.git_disabled/objects/7f/7dbb50728a15cbf16c55de04bdf3ae7cfa7f5d differ diff --git a/.git_disabled/objects/7f/7dbcfb5f95b38ea0522f2f6581baebf360e4ca b/.git_disabled/objects/7f/7dbcfb5f95b38ea0522f2f6581baebf360e4ca new file mode 100755 index 0000000..c2a7dd9 Binary files /dev/null and b/.git_disabled/objects/7f/7dbcfb5f95b38ea0522f2f6581baebf360e4ca differ diff --git a/.git_disabled/objects/7f/8bb725f4c865f598d08a9b780fa25929afe83e b/.git_disabled/objects/7f/8bb725f4c865f598d08a9b780fa25929afe83e new file mode 100755 index 0000000..bf4cbd8 Binary files /dev/null and b/.git_disabled/objects/7f/8bb725f4c865f598d08a9b780fa25929afe83e differ diff --git a/.git_disabled/objects/7f/93146cbc180d86c37551ad518cd94307eb004a b/.git_disabled/objects/7f/93146cbc180d86c37551ad518cd94307eb004a new file mode 100755 index 0000000..b5b8c9b Binary files /dev/null and b/.git_disabled/objects/7f/93146cbc180d86c37551ad518cd94307eb004a differ diff --git a/.git_disabled/objects/7f/a46a4d07d6c2a1ab287af34ca39fb032c559cd b/.git_disabled/objects/7f/a46a4d07d6c2a1ab287af34ca39fb032c559cd new file mode 100755 index 0000000..c7ef27d Binary files /dev/null and b/.git_disabled/objects/7f/a46a4d07d6c2a1ab287af34ca39fb032c559cd differ diff --git a/.git_disabled/objects/7f/acd8893a9824007e3cea6024b8ed49183651ba b/.git_disabled/objects/7f/acd8893a9824007e3cea6024b8ed49183651ba new file mode 100755 index 0000000..5413e8e Binary files /dev/null and b/.git_disabled/objects/7f/acd8893a9824007e3cea6024b8ed49183651ba differ diff --git a/.git_disabled/objects/7f/ca52d5c68ead5414c68c1405ca2a7464c49f95 b/.git_disabled/objects/7f/ca52d5c68ead5414c68c1405ca2a7464c49f95 new file mode 100755 index 0000000..7bccd09 --- /dev/null +++ b/.git_disabled/objects/7f/ca52d5c68ead5414c68c1405ca2a7464c49f95 @@ -0,0 +1,2 @@ +xN0WeI(*UBKX#' Nl'!w`=߹\/g$DiR0`Y!QwX`N+'<~Ƭ]DyfܠRL䝟E@@uKQ4ra +WO{k6K;f_ʝ9f@@C 1?iZC^)JX*P"fS)Xq_Zְh/Y^wpp8y3%z \ No newline at end of file diff --git a/.git_disabled/objects/80/20bbd394f22a93eab2a9b269cc1a4ef79a013e b/.git_disabled/objects/80/20bbd394f22a93eab2a9b269cc1a4ef79a013e new file mode 100755 index 0000000..2ec5362 --- /dev/null +++ b/.git_disabled/objects/80/20bbd394f22a93eab2a9b269cc1a4ef79a013e @@ -0,0 +1,3 @@ +xJ1D=WUL2IdAxd:kLdo_`^ѱm["C~*J) $b]8KU +NgTpt 3viF +>Eڛ u8/toy:n}l#HkVrvnW~n?)`\henPjh\px)DcXWx UHRYkX'3^k \ No newline at end of file diff --git a/.git_disabled/objects/80/221f6f678e2e5d16597de295447660971afbbd b/.git_disabled/objects/80/221f6f678e2e5d16597de295447660971afbbd new file mode 100755 index 0000000..b488043 Binary files /dev/null and b/.git_disabled/objects/80/221f6f678e2e5d16597de295447660971afbbd differ diff --git a/.git_disabled/objects/80/4787448fdacb32c47af4f28110f2230413a171 b/.git_disabled/objects/80/4787448fdacb32c47af4f28110f2230413a171 new file mode 100755 index 0000000..5a00576 --- /dev/null +++ b/.git_disabled/objects/80/4787448fdacb32c47af4f28110f2230413a171 @@ -0,0 +1 @@ +x+)JMU0`040075U(.I,I*cMR,jymgo6M<=GPq: \ No newline at end of file diff --git a/.git_disabled/objects/80/4b5cedac87fc409561f93d4ee2a08546509643 b/.git_disabled/objects/80/4b5cedac87fc409561f93d4ee2a08546509643 new file mode 100755 index 0000000..ce4f9f5 Binary files /dev/null and b/.git_disabled/objects/80/4b5cedac87fc409561f93d4ee2a08546509643 differ diff --git a/.git_disabled/objects/80/539f770200ecad50ea35312dd9ee84b545eac5 b/.git_disabled/objects/80/539f770200ecad50ea35312dd9ee84b545eac5 new file mode 100755 index 0000000..e038dca Binary files /dev/null and b/.git_disabled/objects/80/539f770200ecad50ea35312dd9ee84b545eac5 differ diff --git a/.git_disabled/objects/80/55ad9bb88ae77df1b00a48dd31a11648c8a1b0 b/.git_disabled/objects/80/55ad9bb88ae77df1b00a48dd31a11648c8a1b0 new file mode 100755 index 0000000..761f327 Binary files /dev/null and b/.git_disabled/objects/80/55ad9bb88ae77df1b00a48dd31a11648c8a1b0 differ diff --git a/.git_disabled/objects/80/56834e6714b089ef49847820064a1ae4b041fd b/.git_disabled/objects/80/56834e6714b089ef49847820064a1ae4b041fd new file mode 100755 index 0000000..687f44b Binary files /dev/null and b/.git_disabled/objects/80/56834e6714b089ef49847820064a1ae4b041fd differ diff --git a/.git_disabled/objects/80/897f29262fc243a28f8edf2bf8a2d7d434c9e8 b/.git_disabled/objects/80/897f29262fc243a28f8edf2bf8a2d7d434c9e8 new file mode 100755 index 0000000..2183a77 Binary files /dev/null and b/.git_disabled/objects/80/897f29262fc243a28f8edf2bf8a2d7d434c9e8 differ diff --git a/.git_disabled/objects/80/8f4305e4bac09070e8515e72c7c644b036c675 b/.git_disabled/objects/80/8f4305e4bac09070e8515e72c7c644b036c675 new file mode 100755 index 0000000..b3bd677 Binary files /dev/null and b/.git_disabled/objects/80/8f4305e4bac09070e8515e72c7c644b036c675 differ diff --git a/.git_disabled/objects/80/998ac12f414687ea815c8f1a5f3b3317204fcf b/.git_disabled/objects/80/998ac12f414687ea815c8f1a5f3b3317204fcf new file mode 100755 index 0000000..a3f4cf3 Binary files /dev/null and b/.git_disabled/objects/80/998ac12f414687ea815c8f1a5f3b3317204fcf differ diff --git a/.git_disabled/objects/80/a425def506130063b96b1af9aaea57022e0954 b/.git_disabled/objects/80/a425def506130063b96b1af9aaea57022e0954 new file mode 100755 index 0000000..105c70e Binary files /dev/null and b/.git_disabled/objects/80/a425def506130063b96b1af9aaea57022e0954 differ diff --git a/.git_disabled/objects/80/ac8b14c5d931dd2974b435c7dc5090bfa41f07 b/.git_disabled/objects/80/ac8b14c5d931dd2974b435c7dc5090bfa41f07 new file mode 100755 index 0000000..0cf5dbc Binary files /dev/null and b/.git_disabled/objects/80/ac8b14c5d931dd2974b435c7dc5090bfa41f07 differ diff --git a/.git_disabled/objects/80/b78f3a166a9f24d5c44f4402785654a1b63ca9 b/.git_disabled/objects/80/b78f3a166a9f24d5c44f4402785654a1b63ca9 new file mode 100755 index 0000000..4e7cb7a Binary files /dev/null and b/.git_disabled/objects/80/b78f3a166a9f24d5c44f4402785654a1b63ca9 differ diff --git a/.git_disabled/objects/80/e6fed38f1186b0c9bd890b655bd7a4e69dc98a b/.git_disabled/objects/80/e6fed38f1186b0c9bd890b655bd7a4e69dc98a new file mode 100755 index 0000000..11df95b Binary files /dev/null and b/.git_disabled/objects/80/e6fed38f1186b0c9bd890b655bd7a4e69dc98a differ diff --git a/.git_disabled/objects/80/fdfb6172a73a1cd6605b43b64035dab33bcf9e b/.git_disabled/objects/80/fdfb6172a73a1cd6605b43b64035dab33bcf9e new file mode 100755 index 0000000..e910cc6 Binary files /dev/null and b/.git_disabled/objects/80/fdfb6172a73a1cd6605b43b64035dab33bcf9e differ diff --git a/.git_disabled/objects/81/18be38e9c386794a7b1c113bdb81b086ad1a49 b/.git_disabled/objects/81/18be38e9c386794a7b1c113bdb81b086ad1a49 new file mode 100755 index 0000000..5937436 --- /dev/null +++ b/.git_disabled/objects/81/18be38e9c386794a7b1c113bdb81b086ad1a49 @@ -0,0 +1,3 @@ +xm=o@g}g| B@AANB'*D +Q‡e߮vmkmN:*R7[(VB)E*)2>;;[ɦz~0^9V C3|HPatK]QOW 'CHhо*Ji&t2)1Y  x{eOu\`뮩M𡔒&كF1*kVnZ&|?&ff^|iCbu m/ޯ'ѴoXE0mN-&޼"^L\U +{on1IsmL0ȍQ LXxEQ910.yQZE1k7&zO?>M#\B/xx8g!%s{X}`% \ No newline at end of file diff --git a/.git_disabled/objects/81/451972cd27f33d1f3c31b78403b792107bc9b3 b/.git_disabled/objects/81/451972cd27f33d1f3c31b78403b792107bc9b3 new file mode 100755 index 0000000..7fc0b3c Binary files /dev/null and b/.git_disabled/objects/81/451972cd27f33d1f3c31b78403b792107bc9b3 differ diff --git a/.git_disabled/objects/81/452712950f793cd7829ddf7e01e62d7f7bec80 b/.git_disabled/objects/81/452712950f793cd7829ddf7e01e62d7f7bec80 new file mode 100755 index 0000000..162c8f1 Binary files /dev/null and b/.git_disabled/objects/81/452712950f793cd7829ddf7e01e62d7f7bec80 differ diff --git a/.git_disabled/objects/81/471cca399ad3c399e3a1c21cf575ce23f1c031 b/.git_disabled/objects/81/471cca399ad3c399e3a1c21cf575ce23f1c031 new file mode 100755 index 0000000..4389579 Binary files /dev/null and b/.git_disabled/objects/81/471cca399ad3c399e3a1c21cf575ce23f1c031 differ diff --git a/.git_disabled/objects/81/5aba9845acb45599dd20e4362c837ce2e0cbc5 b/.git_disabled/objects/81/5aba9845acb45599dd20e4362c837ce2e0cbc5 new file mode 100755 index 0000000..8eaf68e Binary files /dev/null and b/.git_disabled/objects/81/5aba9845acb45599dd20e4362c837ce2e0cbc5 differ diff --git a/.git_disabled/objects/81/65bf55318e0fa0dc903231cc52ae161be5f6cb b/.git_disabled/objects/81/65bf55318e0fa0dc903231cc52ae161be5f6cb new file mode 100755 index 0000000..bc262f9 Binary files /dev/null and b/.git_disabled/objects/81/65bf55318e0fa0dc903231cc52ae161be5f6cb differ diff --git a/.git_disabled/objects/81/77bf7a324f9f54a29e41e867f5d56f2dd0a924 b/.git_disabled/objects/81/77bf7a324f9f54a29e41e867f5d56f2dd0a924 new file mode 100755 index 0000000..7c8b134 Binary files /dev/null and b/.git_disabled/objects/81/77bf7a324f9f54a29e41e867f5d56f2dd0a924 differ diff --git a/.git_disabled/objects/81/7f91d267b1830abd4bf251402b5d04b0c126aa b/.git_disabled/objects/81/7f91d267b1830abd4bf251402b5d04b0c126aa new file mode 100755 index 0000000..b91a55c Binary files /dev/null and b/.git_disabled/objects/81/7f91d267b1830abd4bf251402b5d04b0c126aa differ diff --git a/.git_disabled/objects/81/8bc99afe77486f7cbd7da5e6035f821a5ef6e2 b/.git_disabled/objects/81/8bc99afe77486f7cbd7da5e6035f821a5ef6e2 new file mode 100755 index 0000000..9100300 Binary files /dev/null and b/.git_disabled/objects/81/8bc99afe77486f7cbd7da5e6035f821a5ef6e2 differ diff --git a/.git_disabled/objects/81/a02148b74366153ae536ee6825c2222a150066 b/.git_disabled/objects/81/a02148b74366153ae536ee6825c2222a150066 new file mode 100755 index 0000000..fcaef31 Binary files /dev/null and b/.git_disabled/objects/81/a02148b74366153ae536ee6825c2222a150066 differ diff --git a/.git_disabled/objects/81/c6c968b6c11ddf8013d14e9deed6ceb6e2afd5 b/.git_disabled/objects/81/c6c968b6c11ddf8013d14e9deed6ceb6e2afd5 new file mode 100755 index 0000000..d9e295c Binary files /dev/null and b/.git_disabled/objects/81/c6c968b6c11ddf8013d14e9deed6ceb6e2afd5 differ diff --git a/.git_disabled/objects/81/e7a07911c9189cd5cde00869d7147668057516 b/.git_disabled/objects/81/e7a07911c9189cd5cde00869d7147668057516 new file mode 100755 index 0000000..02b72c4 Binary files /dev/null and b/.git_disabled/objects/81/e7a07911c9189cd5cde00869d7147668057516 differ diff --git a/.git_disabled/objects/81/f2f2bcbf80b27c860c72d462c3b874b02fb802 b/.git_disabled/objects/81/f2f2bcbf80b27c860c72d462c3b874b02fb802 new file mode 100755 index 0000000..92b27e7 Binary files /dev/null and b/.git_disabled/objects/81/f2f2bcbf80b27c860c72d462c3b874b02fb802 differ diff --git a/.git_disabled/objects/81/f8ab9fe0e5e65270600db5209c8c37ae55c46a b/.git_disabled/objects/81/f8ab9fe0e5e65270600db5209c8c37ae55c46a new file mode 100755 index 0000000..25367a9 Binary files /dev/null and b/.git_disabled/objects/81/f8ab9fe0e5e65270600db5209c8c37ae55c46a differ diff --git a/.git_disabled/objects/81/fea26ce4c8e6fea0db9b859e605455f80f3a94 b/.git_disabled/objects/81/fea26ce4c8e6fea0db9b859e605455f80f3a94 new file mode 100755 index 0000000..226e970 Binary files /dev/null and b/.git_disabled/objects/81/fea26ce4c8e6fea0db9b859e605455f80f3a94 differ diff --git a/.git_disabled/objects/82/00398523de879f5379d9e71765e5907560a0c5 b/.git_disabled/objects/82/00398523de879f5379d9e71765e5907560a0c5 new file mode 100755 index 0000000..3338c23 Binary files /dev/null and b/.git_disabled/objects/82/00398523de879f5379d9e71765e5907560a0c5 differ diff --git a/.git_disabled/objects/82/15d4c38881a902a36750cdbb6bffb4a6946f2e b/.git_disabled/objects/82/15d4c38881a902a36750cdbb6bffb4a6946f2e new file mode 100755 index 0000000..cdc8265 Binary files /dev/null and b/.git_disabled/objects/82/15d4c38881a902a36750cdbb6bffb4a6946f2e differ diff --git a/.git_disabled/objects/82/2f80cffa556bd379f71f028b5710c3ca26d63d b/.git_disabled/objects/82/2f80cffa556bd379f71f028b5710c3ca26d63d new file mode 100755 index 0000000..80ad8c4 Binary files /dev/null and b/.git_disabled/objects/82/2f80cffa556bd379f71f028b5710c3ca26d63d differ diff --git a/.git_disabled/objects/82/50be91be2374989cfb71a962f8667c9da91fa5 b/.git_disabled/objects/82/50be91be2374989cfb71a962f8667c9da91fa5 new file mode 100755 index 0000000..c7f5ce3 Binary files /dev/null and b/.git_disabled/objects/82/50be91be2374989cfb71a962f8667c9da91fa5 differ diff --git a/.git_disabled/objects/82/5f349d38f5f25bda4a9c255eb02c8ca7c45e47 b/.git_disabled/objects/82/5f349d38f5f25bda4a9c255eb02c8ca7c45e47 new file mode 100755 index 0000000..b032355 Binary files /dev/null and b/.git_disabled/objects/82/5f349d38f5f25bda4a9c255eb02c8ca7c45e47 differ diff --git a/.git_disabled/objects/82/6f3451740c9ab386c615ba3c3bf5f73e30e713 b/.git_disabled/objects/82/6f3451740c9ab386c615ba3c3bf5f73e30e713 new file mode 100755 index 0000000..48be5b8 Binary files /dev/null and b/.git_disabled/objects/82/6f3451740c9ab386c615ba3c3bf5f73e30e713 differ diff --git a/.git_disabled/objects/82/80551b2b1ea43fdecdc59ff5774a14a5db1b9e b/.git_disabled/objects/82/80551b2b1ea43fdecdc59ff5774a14a5db1b9e new file mode 100755 index 0000000..49999b4 Binary files /dev/null and b/.git_disabled/objects/82/80551b2b1ea43fdecdc59ff5774a14a5db1b9e differ diff --git a/.git_disabled/objects/82/9f3599e25507209a5fcb2c3570bb49ae34ac82 b/.git_disabled/objects/82/9f3599e25507209a5fcb2c3570bb49ae34ac82 new file mode 100755 index 0000000..af78ae0 Binary files /dev/null and b/.git_disabled/objects/82/9f3599e25507209a5fcb2c3570bb49ae34ac82 differ diff --git a/.git_disabled/objects/82/b3b9f0af4f5a7a3a23d7bbf1f1afbda6cefa41 b/.git_disabled/objects/82/b3b9f0af4f5a7a3a23d7bbf1f1afbda6cefa41 new file mode 100755 index 0000000..851d0d6 Binary files /dev/null and b/.git_disabled/objects/82/b3b9f0af4f5a7a3a23d7bbf1f1afbda6cefa41 differ diff --git a/.git_disabled/objects/82/c5ab7c001604d01dbc31b50578590a02819a69 b/.git_disabled/objects/82/c5ab7c001604d01dbc31b50578590a02819a69 new file mode 100755 index 0000000..30ae677 Binary files /dev/null and b/.git_disabled/objects/82/c5ab7c001604d01dbc31b50578590a02819a69 differ diff --git a/.git_disabled/objects/82/c90da3039b117954e7e70e070e70f3039b5db5 b/.git_disabled/objects/82/c90da3039b117954e7e70e070e70f3039b5db5 new file mode 100755 index 0000000..9932f88 Binary files /dev/null and b/.git_disabled/objects/82/c90da3039b117954e7e70e070e70f3039b5db5 differ diff --git a/.git_disabled/objects/82/d2da8965ab4281ef0b554f7b8cae857a21bde5 b/.git_disabled/objects/82/d2da8965ab4281ef0b554f7b8cae857a21bde5 new file mode 100755 index 0000000..246d689 Binary files /dev/null and b/.git_disabled/objects/82/d2da8965ab4281ef0b554f7b8cae857a21bde5 differ diff --git a/.git_disabled/objects/82/ee6559a1742ac24a7bf31708ec1b7a2c69f727 b/.git_disabled/objects/82/ee6559a1742ac24a7bf31708ec1b7a2c69f727 new file mode 100755 index 0000000..fa35709 Binary files /dev/null and b/.git_disabled/objects/82/ee6559a1742ac24a7bf31708ec1b7a2c69f727 differ diff --git a/.git_disabled/objects/82/f22a01957051000654b2c5f927626f3d81d55b b/.git_disabled/objects/82/f22a01957051000654b2c5f927626f3d81d55b new file mode 100755 index 0000000..c3303d7 Binary files /dev/null and b/.git_disabled/objects/82/f22a01957051000654b2c5f927626f3d81d55b differ diff --git a/.git_disabled/objects/82/f5c4c1c77edd80560608062620c8b6a0924f19 b/.git_disabled/objects/82/f5c4c1c77edd80560608062620c8b6a0924f19 new file mode 100755 index 0000000..1dd9c50 Binary files /dev/null and b/.git_disabled/objects/82/f5c4c1c77edd80560608062620c8b6a0924f19 differ diff --git a/.git_disabled/objects/82/f79c30910d7e8e59b7b27d5cb6a5be4241548e b/.git_disabled/objects/82/f79c30910d7e8e59b7b27d5cb6a5be4241548e new file mode 100755 index 0000000..a0a683a Binary files /dev/null and b/.git_disabled/objects/82/f79c30910d7e8e59b7b27d5cb6a5be4241548e differ diff --git a/.git_disabled/objects/83/08866b1b03b0cf2921558cf0394b582b3122cc b/.git_disabled/objects/83/08866b1b03b0cf2921558cf0394b582b3122cc new file mode 100755 index 0000000..ac0c458 Binary files /dev/null and b/.git_disabled/objects/83/08866b1b03b0cf2921558cf0394b582b3122cc differ diff --git a/.git_disabled/objects/83/3175e7fae5741b1a5a59b0686a5799a25f6db8 b/.git_disabled/objects/83/3175e7fae5741b1a5a59b0686a5799a25f6db8 new file mode 100755 index 0000000..83a9701 Binary files /dev/null and b/.git_disabled/objects/83/3175e7fae5741b1a5a59b0686a5799a25f6db8 differ diff --git a/.git_disabled/objects/83/34ac5a557ee616c9d50a6894164779ad5a4643 b/.git_disabled/objects/83/34ac5a557ee616c9d50a6894164779ad5a4643 new file mode 100755 index 0000000..e547049 Binary files /dev/null and b/.git_disabled/objects/83/34ac5a557ee616c9d50a6894164779ad5a4643 differ diff --git a/.git_disabled/objects/83/39ed120f11ce6b210e5b1ef8d582fbc41e254a b/.git_disabled/objects/83/39ed120f11ce6b210e5b1ef8d582fbc41e254a new file mode 100755 index 0000000..95683d1 Binary files /dev/null and b/.git_disabled/objects/83/39ed120f11ce6b210e5b1ef8d582fbc41e254a differ diff --git a/.git_disabled/objects/83/3bd4dd7d9122d600bd8247cac48be2da42c37d b/.git_disabled/objects/83/3bd4dd7d9122d600bd8247cac48be2da42c37d new file mode 100755 index 0000000..e0620a2 Binary files /dev/null and b/.git_disabled/objects/83/3bd4dd7d9122d600bd8247cac48be2da42c37d differ diff --git a/.git_disabled/objects/83/43827fe4c5d293775800013223959d5bd15640 b/.git_disabled/objects/83/43827fe4c5d293775800013223959d5bd15640 new file mode 100755 index 0000000..5588884 Binary files /dev/null and b/.git_disabled/objects/83/43827fe4c5d293775800013223959d5bd15640 differ diff --git a/.git_disabled/objects/83/4868b628fd08a977fb00954e746d8790a5a673 b/.git_disabled/objects/83/4868b628fd08a977fb00954e746d8790a5a673 new file mode 100755 index 0000000..875cc15 Binary files /dev/null and b/.git_disabled/objects/83/4868b628fd08a977fb00954e746d8790a5a673 differ diff --git a/.git_disabled/objects/83/4f617aa1be2398a98ee82577b6d6329cfdcf5e b/.git_disabled/objects/83/4f617aa1be2398a98ee82577b6d6329cfdcf5e new file mode 100755 index 0000000..7f6c35a Binary files /dev/null and b/.git_disabled/objects/83/4f617aa1be2398a98ee82577b6d6329cfdcf5e differ diff --git a/.git_disabled/objects/83/4fc56521f70efdb685b5dde38a010c130f527e b/.git_disabled/objects/83/4fc56521f70efdb685b5dde38a010c130f527e new file mode 100755 index 0000000..fb33b97 Binary files /dev/null and b/.git_disabled/objects/83/4fc56521f70efdb685b5dde38a010c130f527e differ diff --git a/.git_disabled/objects/83/527bd09138d3c4ed5e777a3f5971d01875d078 b/.git_disabled/objects/83/527bd09138d3c4ed5e777a3f5971d01875d078 new file mode 100755 index 0000000..7865d51 Binary files /dev/null and b/.git_disabled/objects/83/527bd09138d3c4ed5e777a3f5971d01875d078 differ diff --git a/.git_disabled/objects/83/576714ead22860faf44005378c871feb2808ca b/.git_disabled/objects/83/576714ead22860faf44005378c871feb2808ca new file mode 100755 index 0000000..32f4074 Binary files /dev/null and b/.git_disabled/objects/83/576714ead22860faf44005378c871feb2808ca differ diff --git a/.git_disabled/objects/83/64b2622fcde7f628470761cd7713d42a30ce5a b/.git_disabled/objects/83/64b2622fcde7f628470761cd7713d42a30ce5a new file mode 100755 index 0000000..1a00695 Binary files /dev/null and b/.git_disabled/objects/83/64b2622fcde7f628470761cd7713d42a30ce5a differ diff --git a/.git_disabled/objects/83/66fcdebda33b63b345afa8c6a4409b5a8f9692 b/.git_disabled/objects/83/66fcdebda33b63b345afa8c6a4409b5a8f9692 new file mode 100755 index 0000000..c5e07ae Binary files /dev/null and b/.git_disabled/objects/83/66fcdebda33b63b345afa8c6a4409b5a8f9692 differ diff --git a/.git_disabled/objects/83/7b9995d1a8bcd06bfeae05a0bc41d73a1ba31a b/.git_disabled/objects/83/7b9995d1a8bcd06bfeae05a0bc41d73a1ba31a new file mode 100755 index 0000000..421b606 Binary files /dev/null and b/.git_disabled/objects/83/7b9995d1a8bcd06bfeae05a0bc41d73a1ba31a differ diff --git a/.git_disabled/objects/83/7de5e96715b6ba324d156e9f4a2432a7ccf27d b/.git_disabled/objects/83/7de5e96715b6ba324d156e9f4a2432a7ccf27d new file mode 100755 index 0000000..0fdfee2 Binary files /dev/null and b/.git_disabled/objects/83/7de5e96715b6ba324d156e9f4a2432a7ccf27d differ diff --git a/.git_disabled/objects/83/901a221138b9141d046d928b7a36fc63cae51d b/.git_disabled/objects/83/901a221138b9141d046d928b7a36fc63cae51d new file mode 100755 index 0000000..e8c7e7e Binary files /dev/null and b/.git_disabled/objects/83/901a221138b9141d046d928b7a36fc63cae51d differ diff --git a/.git_disabled/objects/83/c53c484d6eb651a9e4c48a73832c0658f8c9a2 b/.git_disabled/objects/83/c53c484d6eb651a9e4c48a73832c0658f8c9a2 new file mode 100755 index 0000000..94f1ee0 Binary files /dev/null and b/.git_disabled/objects/83/c53c484d6eb651a9e4c48a73832c0658f8c9a2 differ diff --git a/.git_disabled/objects/83/cdc7a1351659e902233cd96aa6481c9f7b8584 b/.git_disabled/objects/83/cdc7a1351659e902233cd96aa6481c9f7b8584 new file mode 100755 index 0000000..c5f2941 Binary files /dev/null and b/.git_disabled/objects/83/cdc7a1351659e902233cd96aa6481c9f7b8584 differ diff --git a/.git_disabled/objects/83/d765461cce82952676106b33cebb457c2af49d b/.git_disabled/objects/83/d765461cce82952676106b33cebb457c2af49d new file mode 100755 index 0000000..2e4da9e Binary files /dev/null and b/.git_disabled/objects/83/d765461cce82952676106b33cebb457c2af49d differ diff --git a/.git_disabled/objects/84/08bd7fc6c58f601902751293fe907e0ca5b9a9 b/.git_disabled/objects/84/08bd7fc6c58f601902751293fe907e0ca5b9a9 new file mode 100755 index 0000000..ac8625d Binary files /dev/null and b/.git_disabled/objects/84/08bd7fc6c58f601902751293fe907e0ca5b9a9 differ diff --git a/.git_disabled/objects/84/0a2df1765d7d120e3c3b061fd1f6152974dd60 b/.git_disabled/objects/84/0a2df1765d7d120e3c3b061fd1f6152974dd60 new file mode 100755 index 0000000..344db56 Binary files /dev/null and b/.git_disabled/objects/84/0a2df1765d7d120e3c3b061fd1f6152974dd60 differ diff --git a/.git_disabled/objects/84/0d45edb5eba85663f7d515e81d90e4c1dbde25 b/.git_disabled/objects/84/0d45edb5eba85663f7d515e81d90e4c1dbde25 new file mode 100755 index 0000000..ff079b2 Binary files /dev/null and b/.git_disabled/objects/84/0d45edb5eba85663f7d515e81d90e4c1dbde25 differ diff --git a/.git_disabled/objects/84/0d9aa6861b654dd5845618decad66d7f914944 b/.git_disabled/objects/84/0d9aa6861b654dd5845618decad66d7f914944 new file mode 100755 index 0000000..16323e0 Binary files /dev/null and b/.git_disabled/objects/84/0d9aa6861b654dd5845618decad66d7f914944 differ diff --git a/.git_disabled/objects/84/29b20cc90203db430a93c38eda5b9b76fa04c0 b/.git_disabled/objects/84/29b20cc90203db430a93c38eda5b9b76fa04c0 new file mode 100755 index 0000000..98d0580 Binary files /dev/null and b/.git_disabled/objects/84/29b20cc90203db430a93c38eda5b9b76fa04c0 differ diff --git a/.git_disabled/objects/84/35aa004f37df797f0dcc8f7eb8ed952e941cfc b/.git_disabled/objects/84/35aa004f37df797f0dcc8f7eb8ed952e941cfc new file mode 100755 index 0000000..e5dc210 Binary files /dev/null and b/.git_disabled/objects/84/35aa004f37df797f0dcc8f7eb8ed952e941cfc differ diff --git a/.git_disabled/objects/84/669351165a8b03bb76f30a66291426a6470dec b/.git_disabled/objects/84/669351165a8b03bb76f30a66291426a6470dec new file mode 100755 index 0000000..ebeb93a Binary files /dev/null and b/.git_disabled/objects/84/669351165a8b03bb76f30a66291426a6470dec differ diff --git a/.git_disabled/objects/84/67c351790c7882d735eba2061afcbc17633fbf b/.git_disabled/objects/84/67c351790c7882d735eba2061afcbc17633fbf new file mode 100755 index 0000000..db1c8c9 Binary files /dev/null and b/.git_disabled/objects/84/67c351790c7882d735eba2061afcbc17633fbf differ diff --git a/.git_disabled/objects/84/8147ba34df14544e6b9d4d69bacb2363507769 b/.git_disabled/objects/84/8147ba34df14544e6b9d4d69bacb2363507769 new file mode 100755 index 0000000..5d2766d Binary files /dev/null and b/.git_disabled/objects/84/8147ba34df14544e6b9d4d69bacb2363507769 differ diff --git a/.git_disabled/objects/84/96fc5d3bdd52d4115dfe119abd38200882f304 b/.git_disabled/objects/84/96fc5d3bdd52d4115dfe119abd38200882f304 new file mode 100755 index 0000000..62d8f39 Binary files /dev/null and b/.git_disabled/objects/84/96fc5d3bdd52d4115dfe119abd38200882f304 differ diff --git a/.git_disabled/objects/84/9a0bfa0784f897c91fc1738d8620f120de04c8 b/.git_disabled/objects/84/9a0bfa0784f897c91fc1738d8620f120de04c8 new file mode 100755 index 0000000..ba5cd54 Binary files /dev/null and b/.git_disabled/objects/84/9a0bfa0784f897c91fc1738d8620f120de04c8 differ diff --git a/.git_disabled/objects/84/9df4dc30a8511161faf25d462a3fc2319c5125 b/.git_disabled/objects/84/9df4dc30a8511161faf25d462a3fc2319c5125 new file mode 100755 index 0000000..7910f22 Binary files /dev/null and b/.git_disabled/objects/84/9df4dc30a8511161faf25d462a3fc2319c5125 differ diff --git a/.git_disabled/objects/84/9ebc6873d831af71dd29243eb798084619804c b/.git_disabled/objects/84/9ebc6873d831af71dd29243eb798084619804c new file mode 100755 index 0000000..cd92ad9 Binary files /dev/null and b/.git_disabled/objects/84/9ebc6873d831af71dd29243eb798084619804c differ diff --git a/.git_disabled/objects/84/aa0b8656850d47aa5265665588d25c9dc3c499 b/.git_disabled/objects/84/aa0b8656850d47aa5265665588d25c9dc3c499 new file mode 100755 index 0000000..5cedfbf Binary files /dev/null and b/.git_disabled/objects/84/aa0b8656850d47aa5265665588d25c9dc3c499 differ diff --git a/.git_disabled/objects/84/ac65a592e1e2485fc3bd72735f60029da6eadf b/.git_disabled/objects/84/ac65a592e1e2485fc3bd72735f60029da6eadf new file mode 100755 index 0000000..a68a48f Binary files /dev/null and b/.git_disabled/objects/84/ac65a592e1e2485fc3bd72735f60029da6eadf differ diff --git a/.git_disabled/objects/84/b8d0bf642108e027c02fa819bc7836f0fedbda b/.git_disabled/objects/84/b8d0bf642108e027c02fa819bc7836f0fedbda new file mode 100755 index 0000000..2c99f06 Binary files /dev/null and b/.git_disabled/objects/84/b8d0bf642108e027c02fa819bc7836f0fedbda differ diff --git a/.git_disabled/objects/84/c04d6073a50d6245db879bbfbfb45d80c7678c b/.git_disabled/objects/84/c04d6073a50d6245db879bbfbfb45d80c7678c new file mode 100755 index 0000000..5d85fab Binary files /dev/null and b/.git_disabled/objects/84/c04d6073a50d6245db879bbfbfb45d80c7678c differ diff --git a/.git_disabled/objects/84/cdb8bec234b3e981255db0582fd4a9c49bdf7c b/.git_disabled/objects/84/cdb8bec234b3e981255db0582fd4a9c49bdf7c new file mode 100755 index 0000000..0180489 Binary files /dev/null and b/.git_disabled/objects/84/cdb8bec234b3e981255db0582fd4a9c49bdf7c differ diff --git a/.git_disabled/objects/84/e02fb1fdfe395459d56b4ea07e5cb081421697 b/.git_disabled/objects/84/e02fb1fdfe395459d56b4ea07e5cb081421697 new file mode 100755 index 0000000..d08b5c7 Binary files /dev/null and b/.git_disabled/objects/84/e02fb1fdfe395459d56b4ea07e5cb081421697 differ diff --git a/.git_disabled/objects/84/e86216ceca5bdf66f5a6743dd151f451494d0d b/.git_disabled/objects/84/e86216ceca5bdf66f5a6743dd151f451494d0d new file mode 100755 index 0000000..424248f Binary files /dev/null and b/.git_disabled/objects/84/e86216ceca5bdf66f5a6743dd151f451494d0d differ diff --git a/.git_disabled/objects/84/ebabe89e09353cf6b87d7a4bcc41533416dafa b/.git_disabled/objects/84/ebabe89e09353cf6b87d7a4bcc41533416dafa new file mode 100755 index 0000000..9618e7f Binary files /dev/null and b/.git_disabled/objects/84/ebabe89e09353cf6b87d7a4bcc41533416dafa differ diff --git a/.git_disabled/objects/85/07f4c692951b7b873884dd77ff9b66e7f0bde6 b/.git_disabled/objects/85/07f4c692951b7b873884dd77ff9b66e7f0bde6 new file mode 100755 index 0000000..87f17de Binary files /dev/null and b/.git_disabled/objects/85/07f4c692951b7b873884dd77ff9b66e7f0bde6 differ diff --git a/.git_disabled/objects/85/15e1aa19ffa6bd75e300e30eefd17339515e80 b/.git_disabled/objects/85/15e1aa19ffa6bd75e300e30eefd17339515e80 new file mode 100755 index 0000000..328b23a Binary files /dev/null and b/.git_disabled/objects/85/15e1aa19ffa6bd75e300e30eefd17339515e80 differ diff --git a/.git_disabled/objects/85/2357063c5bd8ebe4e850deef316c6713f9ac3b b/.git_disabled/objects/85/2357063c5bd8ebe4e850deef316c6713f9ac3b new file mode 100755 index 0000000..d45876e Binary files /dev/null and b/.git_disabled/objects/85/2357063c5bd8ebe4e850deef316c6713f9ac3b differ diff --git a/.git_disabled/objects/85/25b6daf9b59dd5e02fdf5797c63da32f780ee8 b/.git_disabled/objects/85/25b6daf9b59dd5e02fdf5797c63da32f780ee8 new file mode 100755 index 0000000..6f15978 Binary files /dev/null and b/.git_disabled/objects/85/25b6daf9b59dd5e02fdf5797c63da32f780ee8 differ diff --git a/.git_disabled/objects/85/36a721ed71f693441dc12d5fa3860f435fe537 b/.git_disabled/objects/85/36a721ed71f693441dc12d5fa3860f435fe537 new file mode 100755 index 0000000..4d09f4d Binary files /dev/null and b/.git_disabled/objects/85/36a721ed71f693441dc12d5fa3860f435fe537 differ diff --git a/.git_disabled/objects/85/36d53d77942a2f88959c52e17186435528a144 b/.git_disabled/objects/85/36d53d77942a2f88959c52e17186435528a144 new file mode 100755 index 0000000..e83d6cf --- /dev/null +++ b/.git_disabled/objects/85/36d53d77942a2f88959c52e17186435528a144 @@ -0,0 +1,5 @@ +xVmo6g#v(Ym ҢЗmu%Z:I$R $ޯ%Vl/C"=.+~~#@UHgIJSV7u2(LpqŏJ֕dBej\W_}3{;N(>rȰ_U::"E)-:k+jqBA;+3hU,^,ΡtX7$ӭI1֦8:{VKw/lh4ea +Thd +n }J oU@XhT2hE[\GѢD h뚜$>ܲcW%I,(7$[Lu*v£^ NلU5GAU8M (e;(^>5)USj݂0(EQfHqF$`) /M`83O.%kFSrMI֙$m5)EYuG,s^cQdMȹxNMۑzʷsKK +;2Kso見)5u ,KJGCL-q:ti8]m32{RDh,Zj]Mzp^HE'_ SWNT-uL'd-᰻VM8.S~ß2W,qf5f6=Rlϰh1BZW2u[eq%9`8:݄"zxcPa'"d֩`GS ww~NY?F5?? 8v/du?3.1}x_ɉ@&~ˠl]%5I:Wv2m;}7Uq_`9Ba7NRZwCXsuFa! |>3 \ No newline at end of file diff --git a/.git_disabled/objects/87/4f55f906cd28d299e6fae0d3a9d3f856b7bc7f b/.git_disabled/objects/87/4f55f906cd28d299e6fae0d3a9d3f856b7bc7f new file mode 100755 index 0000000..b24f38a Binary files /dev/null and b/.git_disabled/objects/87/4f55f906cd28d299e6fae0d3a9d3f856b7bc7f differ diff --git a/.git_disabled/objects/87/4f99bcd1bd4632b1447b6457e01ac46b61b4a6 b/.git_disabled/objects/87/4f99bcd1bd4632b1447b6457e01ac46b61b4a6 new file mode 100755 index 0000000..f7a9c85 Binary files /dev/null and b/.git_disabled/objects/87/4f99bcd1bd4632b1447b6457e01ac46b61b4a6 differ diff --git a/.git_disabled/objects/87/5eec4046f3f139819e46e0fac989b0b25df238 b/.git_disabled/objects/87/5eec4046f3f139819e46e0fac989b0b25df238 new file mode 100755 index 0000000..3b5cb92 Binary files /dev/null and b/.git_disabled/objects/87/5eec4046f3f139819e46e0fac989b0b25df238 differ diff --git a/.git_disabled/objects/87/61122237e1253b898bddb27e6ccc7a34c2daaa b/.git_disabled/objects/87/61122237e1253b898bddb27e6ccc7a34c2daaa new file mode 100755 index 0000000..616ac45 Binary files /dev/null and b/.git_disabled/objects/87/61122237e1253b898bddb27e6ccc7a34c2daaa differ diff --git a/.git_disabled/objects/87/7976acf998ec24e9799076acd95627a4b5158e b/.git_disabled/objects/87/7976acf998ec24e9799076acd95627a4b5158e new file mode 100755 index 0000000..74cfcaf Binary files /dev/null and b/.git_disabled/objects/87/7976acf998ec24e9799076acd95627a4b5158e differ diff --git a/.git_disabled/objects/87/903329df0c69bbd319735c4a635cbae1dbf9ba b/.git_disabled/objects/87/903329df0c69bbd319735c4a635cbae1dbf9ba new file mode 100755 index 0000000..0cffc4a Binary files /dev/null and b/.git_disabled/objects/87/903329df0c69bbd319735c4a635cbae1dbf9ba differ diff --git a/.git_disabled/objects/87/a3175e691cb373d3216827eecc7dcb178778a1 b/.git_disabled/objects/87/a3175e691cb373d3216827eecc7dcb178778a1 new file mode 100755 index 0000000..49b3125 --- /dev/null +++ b/.git_disabled/objects/87/a3175e691cb373d3216827eecc7dcb178778a1 @@ -0,0 +1,2 @@ +x1O0Yɯcˉ Q6$)ELlwz}q 9/ӜIΥY!y&6#\v: v8Oz tYr?$僶A3ɥ +1x%ƑF7tƸX"=IäH{Pa5z1P_n. J.Ӷ;΅#ȋݬ;X! ;I_<4l{XTԭp] <BR&_|1 \ No newline at end of file diff --git a/.git_disabled/objects/87/afe887b51df6ca01b111f5d11c840a4e110025 b/.git_disabled/objects/87/afe887b51df6ca01b111f5d11c840a4e110025 new file mode 100755 index 0000000..9d5ea15 Binary files /dev/null and b/.git_disabled/objects/87/afe887b51df6ca01b111f5d11c840a4e110025 differ diff --git a/.git_disabled/objects/87/bf612de070cd77e2165972a94c0d9db2f623f1 b/.git_disabled/objects/87/bf612de070cd77e2165972a94c0d9db2f623f1 new file mode 100755 index 0000000..59875d2 Binary files /dev/null and b/.git_disabled/objects/87/bf612de070cd77e2165972a94c0d9db2f623f1 differ diff --git a/.git_disabled/objects/87/c8caa241b7835533a5741e0bb55dc4332bf793 b/.git_disabled/objects/87/c8caa241b7835533a5741e0bb55dc4332bf793 new file mode 100755 index 0000000..ed450c6 Binary files /dev/null and b/.git_disabled/objects/87/c8caa241b7835533a5741e0bb55dc4332bf793 differ diff --git a/.git_disabled/objects/87/e33b24e09e9683e871bc6aefeac25e3c873948 b/.git_disabled/objects/87/e33b24e09e9683e871bc6aefeac25e3c873948 new file mode 100755 index 0000000..7df83df Binary files /dev/null and b/.git_disabled/objects/87/e33b24e09e9683e871bc6aefeac25e3c873948 differ diff --git a/.git_disabled/objects/87/e4886ffa108fe5522bb01743a8295865ddb133 b/.git_disabled/objects/87/e4886ffa108fe5522bb01743a8295865ddb133 new file mode 100755 index 0000000..b465f49 Binary files /dev/null and b/.git_disabled/objects/87/e4886ffa108fe5522bb01743a8295865ddb133 differ diff --git a/.git_disabled/objects/87/e6be0562bd669de1dc4dcd469b939df8914f3c b/.git_disabled/objects/87/e6be0562bd669de1dc4dcd469b939df8914f3c new file mode 100755 index 0000000..d76b2e4 Binary files /dev/null and b/.git_disabled/objects/87/e6be0562bd669de1dc4dcd469b939df8914f3c differ diff --git a/.git_disabled/objects/87/e941d346c8bba60d0f79babb0d12d90d22348e b/.git_disabled/objects/87/e941d346c8bba60d0f79babb0d12d90d22348e new file mode 100755 index 0000000..5dfb3e7 Binary files /dev/null and b/.git_disabled/objects/87/e941d346c8bba60d0f79babb0d12d90d22348e differ diff --git a/.git_disabled/objects/87/e9622959c0ac4673ab946a4dec7b84c407840b b/.git_disabled/objects/87/e9622959c0ac4673ab946a4dec7b84c407840b new file mode 100755 index 0000000..4dc90c7 Binary files /dev/null and b/.git_disabled/objects/87/e9622959c0ac4673ab946a4dec7b84c407840b differ diff --git a/.git_disabled/objects/88/42ff2caca9022e5149cda139c18ee1b57015cc b/.git_disabled/objects/88/42ff2caca9022e5149cda139c18ee1b57015cc new file mode 100755 index 0000000..26c43cd Binary files /dev/null and b/.git_disabled/objects/88/42ff2caca9022e5149cda139c18ee1b57015cc differ diff --git a/.git_disabled/objects/88/495206ea20e366bac67edc5256b044ad655d38 b/.git_disabled/objects/88/495206ea20e366bac67edc5256b044ad655d38 new file mode 100755 index 0000000..121c471 Binary files /dev/null and b/.git_disabled/objects/88/495206ea20e366bac67edc5256b044ad655d38 differ diff --git a/.git_disabled/objects/88/61f969e929e4529040943da6f5d5db867ed4b8 b/.git_disabled/objects/88/61f969e929e4529040943da6f5d5db867ed4b8 new file mode 100755 index 0000000..a7e0825 Binary files /dev/null and b/.git_disabled/objects/88/61f969e929e4529040943da6f5d5db867ed4b8 differ diff --git a/.git_disabled/objects/88/6f081bcba128fa96c57dccd468d5f57beb4ab3 b/.git_disabled/objects/88/6f081bcba128fa96c57dccd468d5f57beb4ab3 new file mode 100755 index 0000000..aa03cfd Binary files /dev/null and b/.git_disabled/objects/88/6f081bcba128fa96c57dccd468d5f57beb4ab3 differ diff --git a/.git_disabled/objects/88/7456462fffd0dd028dd54335c9964ac319683c b/.git_disabled/objects/88/7456462fffd0dd028dd54335c9964ac319683c new file mode 100755 index 0000000..6e6367d Binary files /dev/null and b/.git_disabled/objects/88/7456462fffd0dd028dd54335c9964ac319683c differ diff --git a/.git_disabled/objects/88/935e2024559f6e1bcffb8f6735f33736e2d82e b/.git_disabled/objects/88/935e2024559f6e1bcffb8f6735f33736e2d82e new file mode 100755 index 0000000..c5520e7 Binary files /dev/null and b/.git_disabled/objects/88/935e2024559f6e1bcffb8f6735f33736e2d82e differ diff --git a/.git_disabled/objects/88/9f894a1762aeeb1bfe9e5998b48ad95f1d795d b/.git_disabled/objects/88/9f894a1762aeeb1bfe9e5998b48ad95f1d795d new file mode 100755 index 0000000..9c5164c --- /dev/null +++ b/.git_disabled/objects/88/9f894a1762aeeb1bfe9e5998b48ad95f1d795d @@ -0,0 +1,2 @@ +xMPAN0 WpFjġH{ʽILj!q =]vcy3cV̰l䰸 W`g`ݒ򦳤ΉRZ/(.A9cS*lY69AXk`3]%UNBW;T)9f%pҾ̪5h-% axCo8,:7'ZOE +]t#+aS?<yJTPy%_| \ No newline at end of file diff --git a/.git_disabled/objects/88/b687240382ede48f8923814fe21dc3934a5993 b/.git_disabled/objects/88/b687240382ede48f8923814fe21dc3934a5993 new file mode 100755 index 0000000..eb1a63f Binary files /dev/null and b/.git_disabled/objects/88/b687240382ede48f8923814fe21dc3934a5993 differ diff --git a/.git_disabled/objects/88/bcfd3127ad70b0b17afcf9323db397c1854eef b/.git_disabled/objects/88/bcfd3127ad70b0b17afcf9323db397c1854eef new file mode 100755 index 0000000..8d0b472 Binary files /dev/null and b/.git_disabled/objects/88/bcfd3127ad70b0b17afcf9323db397c1854eef differ diff --git a/.git_disabled/objects/88/c39f8f2d7c42c52eabe4b5ba07c77208783ba9 b/.git_disabled/objects/88/c39f8f2d7c42c52eabe4b5ba07c77208783ba9 new file mode 100755 index 0000000..8792279 Binary files /dev/null and b/.git_disabled/objects/88/c39f8f2d7c42c52eabe4b5ba07c77208783ba9 differ diff --git a/.git_disabled/objects/88/cbb7580daffc11ce928af671a783ede5569e62 b/.git_disabled/objects/88/cbb7580daffc11ce928af671a783ede5569e62 new file mode 100755 index 0000000..0f75add Binary files /dev/null and b/.git_disabled/objects/88/cbb7580daffc11ce928af671a783ede5569e62 differ diff --git a/.git_disabled/objects/88/dae7b02aed9524a9b0e078a15115f7f2e5d591 b/.git_disabled/objects/88/dae7b02aed9524a9b0e078a15115f7f2e5d591 new file mode 100755 index 0000000..758776a Binary files /dev/null and b/.git_disabled/objects/88/dae7b02aed9524a9b0e078a15115f7f2e5d591 differ diff --git a/.git_disabled/objects/88/dc7f01e132933728cbcf45c88ce82e85ddf65f b/.git_disabled/objects/88/dc7f01e132933728cbcf45c88ce82e85ddf65f new file mode 100755 index 0000000..ea3a849 --- /dev/null +++ b/.git_disabled/objects/88/dc7f01e132933728cbcf45c88ce82e85ddf65f @@ -0,0 +1,4 @@ +xSMK1bmcAADP-~i:mCwL{6n`.y3Ǜz +yQGs+ +Znje߹h]6 +y]yR4(E*C!kV!1B͢(siU5XCC -F~cs`L*I:,}qp[.]V7>(,qHV=7 x8K" H pk\tM@KɲbgtrR9ex# /}-'f}7kX~?=\=m IqDh"18t@;R݀Bcz[`-1 ,uG'8L \ No newline at end of file diff --git a/.git_disabled/objects/88/e1611859135a3a7f1fee65a6d70f9367d1f5dc b/.git_disabled/objects/88/e1611859135a3a7f1fee65a6d70f9367d1f5dc new file mode 100755 index 0000000..1307f4a Binary files /dev/null and b/.git_disabled/objects/88/e1611859135a3a7f1fee65a6d70f9367d1f5dc differ diff --git a/.git_disabled/objects/89/01b0e4dc812e0be6683aa6ce0ee9cbb0fd0992 b/.git_disabled/objects/89/01b0e4dc812e0be6683aa6ce0ee9cbb0fd0992 new file mode 100755 index 0000000..6ded8a0 Binary files /dev/null and b/.git_disabled/objects/89/01b0e4dc812e0be6683aa6ce0ee9cbb0fd0992 differ diff --git a/.git_disabled/objects/89/29e03c569cdeeef11adf4f2b7ed883837aca0a b/.git_disabled/objects/89/29e03c569cdeeef11adf4f2b7ed883837aca0a new file mode 100755 index 0000000..71327df Binary files /dev/null and b/.git_disabled/objects/89/29e03c569cdeeef11adf4f2b7ed883837aca0a differ diff --git a/.git_disabled/objects/89/2adbe9f8dc4de23a911359177dd00940e0469d b/.git_disabled/objects/89/2adbe9f8dc4de23a911359177dd00940e0469d new file mode 100755 index 0000000..c399547 Binary files /dev/null and b/.git_disabled/objects/89/2adbe9f8dc4de23a911359177dd00940e0469d differ diff --git a/.git_disabled/objects/89/3369c7a96aeafcbb030c4e13979d62cb587d08 b/.git_disabled/objects/89/3369c7a96aeafcbb030c4e13979d62cb587d08 new file mode 100755 index 0000000..224b722 Binary files /dev/null and b/.git_disabled/objects/89/3369c7a96aeafcbb030c4e13979d62cb587d08 differ diff --git a/.git_disabled/objects/89/3f39fa15f363fff9fe8fc6acecfb0c76c236fb b/.git_disabled/objects/89/3f39fa15f363fff9fe8fc6acecfb0c76c236fb new file mode 100755 index 0000000..7a4b420 Binary files /dev/null and b/.git_disabled/objects/89/3f39fa15f363fff9fe8fc6acecfb0c76c236fb differ diff --git a/.git_disabled/objects/89/3f82919d45982f80f244dd1b36c9e347539bbe b/.git_disabled/objects/89/3f82919d45982f80f244dd1b36c9e347539bbe new file mode 100755 index 0000000..5b9d2ba Binary files /dev/null and b/.git_disabled/objects/89/3f82919d45982f80f244dd1b36c9e347539bbe differ diff --git a/.git_disabled/objects/89/41f79cbef1f73d78e0cef2262958edeed51c82 b/.git_disabled/objects/89/41f79cbef1f73d78e0cef2262958edeed51c82 new file mode 100755 index 0000000..55a286a Binary files /dev/null and b/.git_disabled/objects/89/41f79cbef1f73d78e0cef2262958edeed51c82 differ diff --git a/.git_disabled/objects/89/45b5da857f4a7dec2b84f1225f012f6098418c b/.git_disabled/objects/89/45b5da857f4a7dec2b84f1225f012f6098418c new file mode 100755 index 0000000..3d12de6 --- /dev/null +++ b/.git_disabled/objects/89/45b5da857f4a7dec2b84f1225f012f6098418c @@ -0,0 +1,3 @@ +xM10 Es ++S" ԁp*MM*' -‹eϱzҴZJ(Hq~. R6U/A3%{BJc)8y40Oֱ#aǴ"_LƘ +%ecIM`ZVNi-pN׋UUl \ No newline at end of file diff --git a/.git_disabled/objects/89/59ece6aa9a50ee2805cea19b369f89fbad25dd b/.git_disabled/objects/89/59ece6aa9a50ee2805cea19b369f89fbad25dd new file mode 100755 index 0000000..13dc711 Binary files /dev/null and b/.git_disabled/objects/89/59ece6aa9a50ee2805cea19b369f89fbad25dd differ diff --git a/.git_disabled/objects/89/5cb4fad7c38405ec7ad41b0a91959105ddd31b b/.git_disabled/objects/89/5cb4fad7c38405ec7ad41b0a91959105ddd31b new file mode 100755 index 0000000..fde0296 Binary files /dev/null and b/.git_disabled/objects/89/5cb4fad7c38405ec7ad41b0a91959105ddd31b differ diff --git a/.git_disabled/objects/89/63738ca866675bd92d2d0d5c8cd356445a44b0 b/.git_disabled/objects/89/63738ca866675bd92d2d0d5c8cd356445a44b0 new file mode 100755 index 0000000..8667191 Binary files /dev/null and b/.git_disabled/objects/89/63738ca866675bd92d2d0d5c8cd356445a44b0 differ diff --git a/.git_disabled/objects/89/72742093041581ab724eb8d9471fac36b988e7 b/.git_disabled/objects/89/72742093041581ab724eb8d9471fac36b988e7 new file mode 100755 index 0000000..630a7fb Binary files /dev/null and b/.git_disabled/objects/89/72742093041581ab724eb8d9471fac36b988e7 differ diff --git a/.git_disabled/objects/89/8452f1d7b7b9169287fb5aa62bdc24e3103444 b/.git_disabled/objects/89/8452f1d7b7b9169287fb5aa62bdc24e3103444 new file mode 100755 index 0000000..0b8aaeb Binary files /dev/null and b/.git_disabled/objects/89/8452f1d7b7b9169287fb5aa62bdc24e3103444 differ diff --git a/.git_disabled/objects/89/855718f7d15c6c777ff53d77cf19368b81e726 b/.git_disabled/objects/89/855718f7d15c6c777ff53d77cf19368b81e726 new file mode 100755 index 0000000..fdc18a4 Binary files /dev/null and b/.git_disabled/objects/89/855718f7d15c6c777ff53d77cf19368b81e726 differ diff --git a/.git_disabled/objects/89/8def2bc41c527324ca9e90cdf1dd1c3feaa9ab b/.git_disabled/objects/89/8def2bc41c527324ca9e90cdf1dd1c3feaa9ab new file mode 100755 index 0000000..8ad89db Binary files /dev/null and b/.git_disabled/objects/89/8def2bc41c527324ca9e90cdf1dd1c3feaa9ab differ diff --git a/.git_disabled/objects/89/9dfada878e1181fca6d3c75a79526a076abb9e b/.git_disabled/objects/89/9dfada878e1181fca6d3c75a79526a076abb9e new file mode 100755 index 0000000..7ed2f55 Binary files /dev/null and b/.git_disabled/objects/89/9dfada878e1181fca6d3c75a79526a076abb9e differ diff --git a/.git_disabled/objects/89/a9077e7f4e4bb479ae68d455d3bde4e862c78a b/.git_disabled/objects/89/a9077e7f4e4bb479ae68d455d3bde4e862c78a new file mode 100755 index 0000000..a920558 Binary files /dev/null and b/.git_disabled/objects/89/a9077e7f4e4bb479ae68d455d3bde4e862c78a differ diff --git a/.git_disabled/objects/89/b7d1e4f9b2a53051501c20918a8e213e4cc39c b/.git_disabled/objects/89/b7d1e4f9b2a53051501c20918a8e213e4cc39c new file mode 100755 index 0000000..e1d2dc8 Binary files /dev/null and b/.git_disabled/objects/89/b7d1e4f9b2a53051501c20918a8e213e4cc39c differ diff --git a/.git_disabled/objects/89/e4e15fa79904c724db7eacfc51a870d511e1b3 b/.git_disabled/objects/89/e4e15fa79904c724db7eacfc51a870d511e1b3 new file mode 100755 index 0000000..e7a680f Binary files /dev/null and b/.git_disabled/objects/89/e4e15fa79904c724db7eacfc51a870d511e1b3 differ diff --git a/.git_disabled/objects/89/e503c256aae2a087ccb531d92ca270b73e3376 b/.git_disabled/objects/89/e503c256aae2a087ccb531d92ca270b73e3376 new file mode 100755 index 0000000..1050ef3 Binary files /dev/null and b/.git_disabled/objects/89/e503c256aae2a087ccb531d92ca270b73e3376 differ diff --git a/.git_disabled/objects/89/f4d0ff93fd6694656b4646d0600ed23486cf13 b/.git_disabled/objects/89/f4d0ff93fd6694656b4646d0600ed23486cf13 new file mode 100755 index 0000000..b91bf30 Binary files /dev/null and b/.git_disabled/objects/89/f4d0ff93fd6694656b4646d0600ed23486cf13 differ diff --git a/.git_disabled/objects/8a/172c7c5901cfe0b6ef8f836025beb6391cd224 b/.git_disabled/objects/8a/172c7c5901cfe0b6ef8f836025beb6391cd224 new file mode 100755 index 0000000..deaf45d --- /dev/null +++ b/.git_disabled/objects/8a/172c7c5901cfe0b6ef8f836025beb6391cd224 @@ -0,0 +1,3 @@ +xTn09_@ +i=rHOFOEQPJ",N>dT)ns;S$ϲOiAiIZ%ean wOR@'Gn:8p"sІ(j&KUDhx1bH]3Rr[訩dpUs=+d"6Lh3#x[jBu@PNq졂@zvwtUo`QjlzdvI4瑺'Ne7Ey7TP/ƽ0FE]>֠4@X Iy7g,2r9n)c*ʩֶAO X{pulLefP09=!.yeP \m +)#2" [4J]0T^Yg˜TJ<=Ѡ18aЯ3pVn7^m|^1}B| \ No newline at end of file diff --git a/.git_disabled/objects/8a/187cdc2af9e201ad7b38c47884ff72f89d451d b/.git_disabled/objects/8a/187cdc2af9e201ad7b38c47884ff72f89d451d new file mode 100755 index 0000000..6189337 Binary files /dev/null and b/.git_disabled/objects/8a/187cdc2af9e201ad7b38c47884ff72f89d451d differ diff --git a/.git_disabled/objects/8a/18d0bebb34b062db32f23d4b2367a0d0479d36 b/.git_disabled/objects/8a/18d0bebb34b062db32f23d4b2367a0d0479d36 new file mode 100755 index 0000000..f3eee58 Binary files /dev/null and b/.git_disabled/objects/8a/18d0bebb34b062db32f23d4b2367a0d0479d36 differ diff --git a/.git_disabled/objects/8a/238b30bd60aa130368b235efde24e9067cb660 b/.git_disabled/objects/8a/238b30bd60aa130368b235efde24e9067cb660 new file mode 100755 index 0000000..a37c145 Binary files /dev/null and b/.git_disabled/objects/8a/238b30bd60aa130368b235efde24e9067cb660 differ diff --git a/.git_disabled/objects/8a/2f639061cc4a203f7109d8335d28076442c61d b/.git_disabled/objects/8a/2f639061cc4a203f7109d8335d28076442c61d new file mode 100755 index 0000000..6bc7d02 Binary files /dev/null and b/.git_disabled/objects/8a/2f639061cc4a203f7109d8335d28076442c61d differ diff --git a/.git_disabled/objects/8a/32370ffee50e8e1c94890a410766ef63b8fafb b/.git_disabled/objects/8a/32370ffee50e8e1c94890a410766ef63b8fafb new file mode 100755 index 0000000..de72818 Binary files /dev/null and b/.git_disabled/objects/8a/32370ffee50e8e1c94890a410766ef63b8fafb differ diff --git a/.git_disabled/objects/8a/4e0905426bdafd6c712a3ae0ca46b1716d4e85 b/.git_disabled/objects/8a/4e0905426bdafd6c712a3ae0ca46b1716d4e85 new file mode 100755 index 0000000..ab8be24 Binary files /dev/null and b/.git_disabled/objects/8a/4e0905426bdafd6c712a3ae0ca46b1716d4e85 differ diff --git a/.git_disabled/objects/8a/54d03a863f344db31c4a7f4a3654c289da3478 b/.git_disabled/objects/8a/54d03a863f344db31c4a7f4a3654c289da3478 new file mode 100755 index 0000000..445e642 Binary files /dev/null and b/.git_disabled/objects/8a/54d03a863f344db31c4a7f4a3654c289da3478 differ diff --git a/.git_disabled/objects/8a/551b7ed7924cd6110752e5deac6b59367f5d43 b/.git_disabled/objects/8a/551b7ed7924cd6110752e5deac6b59367f5d43 new file mode 100755 index 0000000..544d1e9 Binary files /dev/null and b/.git_disabled/objects/8a/551b7ed7924cd6110752e5deac6b59367f5d43 differ diff --git a/.git_disabled/objects/8a/5c74315e5cf9f7c50a06d1c5911585a55161a1 b/.git_disabled/objects/8a/5c74315e5cf9f7c50a06d1c5911585a55161a1 new file mode 100755 index 0000000..d4e2a70 Binary files /dev/null and b/.git_disabled/objects/8a/5c74315e5cf9f7c50a06d1c5911585a55161a1 differ diff --git a/.git_disabled/objects/8a/626bc49bbe579d7ae9385f505750b88bf2ebf0 b/.git_disabled/objects/8a/626bc49bbe579d7ae9385f505750b88bf2ebf0 new file mode 100755 index 0000000..4f089a4 Binary files /dev/null and b/.git_disabled/objects/8a/626bc49bbe579d7ae9385f505750b88bf2ebf0 differ diff --git a/.git_disabled/objects/8a/654f4c639d88e2225cfbc5bbb77a0ad3ad316b b/.git_disabled/objects/8a/654f4c639d88e2225cfbc5bbb77a0ad3ad316b new file mode 100755 index 0000000..9f2b162 Binary files /dev/null and b/.git_disabled/objects/8a/654f4c639d88e2225cfbc5bbb77a0ad3ad316b differ diff --git a/.git_disabled/objects/8a/65f13347d6621289a166d08123cbc8e1ad0157 b/.git_disabled/objects/8a/65f13347d6621289a166d08123cbc8e1ad0157 new file mode 100755 index 0000000..f6b1a16 Binary files /dev/null and b/.git_disabled/objects/8a/65f13347d6621289a166d08123cbc8e1ad0157 differ diff --git a/.git_disabled/objects/8a/73ed9ba1a778ef274570fb0d95525d82c236f1 b/.git_disabled/objects/8a/73ed9ba1a778ef274570fb0d95525d82c236f1 new file mode 100755 index 0000000..79ff077 Binary files /dev/null and b/.git_disabled/objects/8a/73ed9ba1a778ef274570fb0d95525d82c236f1 differ diff --git a/.git_disabled/objects/8a/7894495b53b6993044f5ded4f8fff403b143ae b/.git_disabled/objects/8a/7894495b53b6993044f5ded4f8fff403b143ae new file mode 100755 index 0000000..be2f69a Binary files /dev/null and b/.git_disabled/objects/8a/7894495b53b6993044f5ded4f8fff403b143ae differ diff --git a/.git_disabled/objects/8a/8321176d4df05c47685fc8feda5da782bfbfce b/.git_disabled/objects/8a/8321176d4df05c47685fc8feda5da782bfbfce new file mode 100755 index 0000000..976a363 Binary files /dev/null and b/.git_disabled/objects/8a/8321176d4df05c47685fc8feda5da782bfbfce differ diff --git a/.git_disabled/objects/8a/927777f19b2b5d022c7725bb3b7ef244361ba7 b/.git_disabled/objects/8a/927777f19b2b5d022c7725bb3b7ef244361ba7 new file mode 100755 index 0000000..725c905 Binary files /dev/null and b/.git_disabled/objects/8a/927777f19b2b5d022c7725bb3b7ef244361ba7 differ diff --git a/.git_disabled/objects/8a/99eca39a124c1616105126b247f480e0427bc5 b/.git_disabled/objects/8a/99eca39a124c1616105126b247f480e0427bc5 new file mode 100755 index 0000000..c51b623 Binary files /dev/null and b/.git_disabled/objects/8a/99eca39a124c1616105126b247f480e0427bc5 differ diff --git a/.git_disabled/objects/8a/ab2c4a1157ab7c8dfac0121e054e8ad0cf32a5 b/.git_disabled/objects/8a/ab2c4a1157ab7c8dfac0121e054e8ad0cf32a5 new file mode 100755 index 0000000..7f6d765 Binary files /dev/null and b/.git_disabled/objects/8a/ab2c4a1157ab7c8dfac0121e054e8ad0cf32a5 differ diff --git a/.git_disabled/objects/8a/c34e2943b9bcb274d4abdd3087ccdfc38de784 b/.git_disabled/objects/8a/c34e2943b9bcb274d4abdd3087ccdfc38de784 new file mode 100755 index 0000000..c21d0a9 Binary files /dev/null and b/.git_disabled/objects/8a/c34e2943b9bcb274d4abdd3087ccdfc38de784 differ diff --git a/.git_disabled/objects/8a/cb98f06269b2421b53c3dfcc8d3bef715ae8fa b/.git_disabled/objects/8a/cb98f06269b2421b53c3dfcc8d3bef715ae8fa new file mode 100755 index 0000000..a109935 Binary files /dev/null and b/.git_disabled/objects/8a/cb98f06269b2421b53c3dfcc8d3bef715ae8fa differ diff --git a/.git_disabled/objects/8a/cd468ccdb3097d0d236281ff67cf7391e1f19d b/.git_disabled/objects/8a/cd468ccdb3097d0d236281ff67cf7391e1f19d new file mode 100755 index 0000000..fb7ea8b Binary files /dev/null and b/.git_disabled/objects/8a/cd468ccdb3097d0d236281ff67cf7391e1f19d differ diff --git a/.git_disabled/objects/8a/d85c104a9d8d7d7c2b69e01d09bc434b1e6f09 b/.git_disabled/objects/8a/d85c104a9d8d7d7c2b69e01d09bc434b1e6f09 new file mode 100755 index 0000000..c4c8aee Binary files /dev/null and b/.git_disabled/objects/8a/d85c104a9d8d7d7c2b69e01d09bc434b1e6f09 differ diff --git a/.git_disabled/objects/8a/df507f9be6c19e91a0aa348fb50df4944ab507 b/.git_disabled/objects/8a/df507f9be6c19e91a0aa348fb50df4944ab507 new file mode 100755 index 0000000..d57fac6 Binary files /dev/null and b/.git_disabled/objects/8a/df507f9be6c19e91a0aa348fb50df4944ab507 differ diff --git a/.git_disabled/objects/8a/e96007f7d725813fd02dc1d06d3834ee1939e4 b/.git_disabled/objects/8a/e96007f7d725813fd02dc1d06d3834ee1939e4 new file mode 100755 index 0000000..b5c9479 Binary files /dev/null and b/.git_disabled/objects/8a/e96007f7d725813fd02dc1d06d3834ee1939e4 differ diff --git a/.git_disabled/objects/8a/ef52a58693e5d149305682028228c45d92cc22 b/.git_disabled/objects/8a/ef52a58693e5d149305682028228c45d92cc22 new file mode 100755 index 0000000..ab5502d --- /dev/null +++ b/.git_disabled/objects/8a/ef52a58693e5d149305682028228c45d92cc22 @@ -0,0 +1,2 @@ +xU1N0stI$KD XҸubv +9P ,=vp?4+7Yܪ|[`A4E+ !gUGP `JA:maL8=TK<њ \ No newline at end of file diff --git a/.git_disabled/objects/8b/01cdb20b863fae9d8a934468baddc275373b88 b/.git_disabled/objects/8b/01cdb20b863fae9d8a934468baddc275373b88 new file mode 100755 index 0000000..eb183f2 Binary files /dev/null and b/.git_disabled/objects/8b/01cdb20b863fae9d8a934468baddc275373b88 differ diff --git a/.git_disabled/objects/8b/03cee64b0a1e5e190e1bea7265afe252676a35 b/.git_disabled/objects/8b/03cee64b0a1e5e190e1bea7265afe252676a35 new file mode 100755 index 0000000..e27bf3b Binary files /dev/null and b/.git_disabled/objects/8b/03cee64b0a1e5e190e1bea7265afe252676a35 differ diff --git a/.git_disabled/objects/8b/068f1de83bde5ac689b9eab6bfd8f16fef4683 b/.git_disabled/objects/8b/068f1de83bde5ac689b9eab6bfd8f16fef4683 new file mode 100755 index 0000000..94fcfb4 Binary files /dev/null and b/.git_disabled/objects/8b/068f1de83bde5ac689b9eab6bfd8f16fef4683 differ diff --git a/.git_disabled/objects/8b/149445040252c8f08c2d2e7b5a74a92583f439 b/.git_disabled/objects/8b/149445040252c8f08c2d2e7b5a74a92583f439 new file mode 100755 index 0000000..7e90e5e Binary files /dev/null and b/.git_disabled/objects/8b/149445040252c8f08c2d2e7b5a74a92583f439 differ diff --git a/.git_disabled/objects/8b/1d88ddc12f0661c2d0631e686ca7b47ff2cbf7 b/.git_disabled/objects/8b/1d88ddc12f0661c2d0631e686ca7b47ff2cbf7 new file mode 100755 index 0000000..387729c Binary files /dev/null and b/.git_disabled/objects/8b/1d88ddc12f0661c2d0631e686ca7b47ff2cbf7 differ diff --git a/.git_disabled/objects/8b/431c1314c0445a5e6ccb5eb8b33c0ce3f16f45 b/.git_disabled/objects/8b/431c1314c0445a5e6ccb5eb8b33c0ce3f16f45 new file mode 100755 index 0000000..d86dd70 Binary files /dev/null and b/.git_disabled/objects/8b/431c1314c0445a5e6ccb5eb8b33c0ce3f16f45 differ diff --git a/.git_disabled/objects/8b/479bf92b63da45132bd0ffc83d2e632fee5f1b b/.git_disabled/objects/8b/479bf92b63da45132bd0ffc83d2e632fee5f1b new file mode 100755 index 0000000..bbc2c99 Binary files /dev/null and b/.git_disabled/objects/8b/479bf92b63da45132bd0ffc83d2e632fee5f1b differ diff --git a/.git_disabled/objects/8b/483b38c28a5427d6f2be873052048c98930733 b/.git_disabled/objects/8b/483b38c28a5427d6f2be873052048c98930733 new file mode 100755 index 0000000..04aca6e Binary files /dev/null and b/.git_disabled/objects/8b/483b38c28a5427d6f2be873052048c98930733 differ diff --git a/.git_disabled/objects/8b/68a004869548111a2cf581c8fd060382597687 b/.git_disabled/objects/8b/68a004869548111a2cf581c8fd060382597687 new file mode 100755 index 0000000..8afaef4 Binary files /dev/null and b/.git_disabled/objects/8b/68a004869548111a2cf581c8fd060382597687 differ diff --git a/.git_disabled/objects/8b/a512f937b65dec2dcfa8eee54e2801105fee7d b/.git_disabled/objects/8b/a512f937b65dec2dcfa8eee54e2801105fee7d new file mode 100755 index 0000000..0581b1f Binary files /dev/null and b/.git_disabled/objects/8b/a512f937b65dec2dcfa8eee54e2801105fee7d differ diff --git a/.git_disabled/objects/8b/b01985ecc5bdb06148bda91a3962679e629c65 b/.git_disabled/objects/8b/b01985ecc5bdb06148bda91a3962679e629c65 new file mode 100755 index 0000000..190331c Binary files /dev/null and b/.git_disabled/objects/8b/b01985ecc5bdb06148bda91a3962679e629c65 differ diff --git a/.git_disabled/objects/8b/c301a0860298c00e84a6f3b868ad24b5e91459 b/.git_disabled/objects/8b/c301a0860298c00e84a6f3b868ad24b5e91459 new file mode 100755 index 0000000..e287882 Binary files /dev/null and b/.git_disabled/objects/8b/c301a0860298c00e84a6f3b868ad24b5e91459 differ diff --git a/.git_disabled/objects/8b/c4d54ddbcb6f1d61b9948caab0418deba5d756 b/.git_disabled/objects/8b/c4d54ddbcb6f1d61b9948caab0418deba5d756 new file mode 100755 index 0000000..ea2222d Binary files /dev/null and b/.git_disabled/objects/8b/c4d54ddbcb6f1d61b9948caab0418deba5d756 differ diff --git a/.git_disabled/objects/8b/d115cc5a380d1bdc866a33a4b8a1b9d5d94328 b/.git_disabled/objects/8b/d115cc5a380d1bdc866a33a4b8a1b9d5d94328 new file mode 100755 index 0000000..6aaa254 Binary files /dev/null and b/.git_disabled/objects/8b/d115cc5a380d1bdc866a33a4b8a1b9d5d94328 differ diff --git a/.git_disabled/objects/8b/e9b9e58e80559385562a382a0d823f91a4b551 b/.git_disabled/objects/8b/e9b9e58e80559385562a382a0d823f91a4b551 new file mode 100755 index 0000000..602f804 Binary files /dev/null and b/.git_disabled/objects/8b/e9b9e58e80559385562a382a0d823f91a4b551 differ diff --git a/.git_disabled/objects/8b/f38f13675a44d0ef3d9ea1a8b808fd24c453e2 b/.git_disabled/objects/8b/f38f13675a44d0ef3d9ea1a8b808fd24c453e2 new file mode 100755 index 0000000..615929b Binary files /dev/null and b/.git_disabled/objects/8b/f38f13675a44d0ef3d9ea1a8b808fd24c453e2 differ diff --git a/.git_disabled/objects/8c/0ab591892fbe26288cc6e2bbff301e410d7862 b/.git_disabled/objects/8c/0ab591892fbe26288cc6e2bbff301e410d7862 new file mode 100755 index 0000000..a278487 Binary files /dev/null and b/.git_disabled/objects/8c/0ab591892fbe26288cc6e2bbff301e410d7862 differ diff --git a/.git_disabled/objects/8c/0af7351afedd77b4fae005284f6d238ac6b3e9 b/.git_disabled/objects/8c/0af7351afedd77b4fae005284f6d238ac6b3e9 new file mode 100755 index 0000000..63f825c Binary files /dev/null and b/.git_disabled/objects/8c/0af7351afedd77b4fae005284f6d238ac6b3e9 differ diff --git a/.git_disabled/objects/8c/15c1d7f3d5f55c154688b0ecde158ded05064e b/.git_disabled/objects/8c/15c1d7f3d5f55c154688b0ecde158ded05064e new file mode 100755 index 0000000..2cc1736 Binary files /dev/null and b/.git_disabled/objects/8c/15c1d7f3d5f55c154688b0ecde158ded05064e differ diff --git a/.git_disabled/objects/8c/189e9eb8e661f0ce2c7bceee17a3fdb50c3b47 b/.git_disabled/objects/8c/189e9eb8e661f0ce2c7bceee17a3fdb50c3b47 new file mode 100755 index 0000000..a4bd1ab Binary files /dev/null and b/.git_disabled/objects/8c/189e9eb8e661f0ce2c7bceee17a3fdb50c3b47 differ diff --git a/.git_disabled/objects/8c/346b8ee62f195d502acf351baff1fa9a1a3c1c b/.git_disabled/objects/8c/346b8ee62f195d502acf351baff1fa9a1a3c1c new file mode 100755 index 0000000..b39b550 Binary files /dev/null and b/.git_disabled/objects/8c/346b8ee62f195d502acf351baff1fa9a1a3c1c differ diff --git a/.git_disabled/objects/8c/418f59e06cae43abdbb626ec21cafc7e8c6277 b/.git_disabled/objects/8c/418f59e06cae43abdbb626ec21cafc7e8c6277 new file mode 100755 index 0000000..56c6e23 --- /dev/null +++ b/.git_disabled/objects/8c/418f59e06cae43abdbb626ec21cafc7e8c6277 @@ -0,0 +1,3 @@ +xTMk0Yb\54RHB{hinq"\INXvzi +݃Y޼yoV>\}z7}&7lQ\)ZYR̝G )U՜t;9u%ܡ) 3ƞUwK{ _A/\ \C,Yߧ*́7d:mw}$57t47«xٶ58B 4E9a=/XϵB*R@c/Er>lP. L #:N]*|h@XCm p'^:f'0\NݟGl6f&roY DvRr +rQ]JplH_QK=| m80UP'–QGxFb };7B+!I*]{3Y0:m-V,}[f؟ \ No newline at end of file diff --git a/.git_disabled/objects/8c/68f66c38f517b0e66325fdf5dd4802fe4f6bed b/.git_disabled/objects/8c/68f66c38f517b0e66325fdf5dd4802fe4f6bed new file mode 100755 index 0000000..1dad064 Binary files /dev/null and b/.git_disabled/objects/8c/68f66c38f517b0e66325fdf5dd4802fe4f6bed differ diff --git a/.git_disabled/objects/8c/6b61f04ea71015fc33492f856ddd207d9e9ec2 b/.git_disabled/objects/8c/6b61f04ea71015fc33492f856ddd207d9e9ec2 new file mode 100755 index 0000000..0d0a469 Binary files /dev/null and b/.git_disabled/objects/8c/6b61f04ea71015fc33492f856ddd207d9e9ec2 differ diff --git a/.git_disabled/objects/8c/7204d97aaf27f9684b4fd81245b4a95159a734 b/.git_disabled/objects/8c/7204d97aaf27f9684b4fd81245b4a95159a734 new file mode 100755 index 0000000..096b6e2 Binary files /dev/null and b/.git_disabled/objects/8c/7204d97aaf27f9684b4fd81245b4a95159a734 differ diff --git a/.git_disabled/objects/8c/cc3c7a58d0aaf1cc5ef74a24c6162584c134c1 b/.git_disabled/objects/8c/cc3c7a58d0aaf1cc5ef74a24c6162584c134c1 new file mode 100755 index 0000000..3608fc8 Binary files /dev/null and b/.git_disabled/objects/8c/cc3c7a58d0aaf1cc5ef74a24c6162584c134c1 differ diff --git a/.git_disabled/objects/8c/dc915a514bd041a8e92429107ce83883d57117 b/.git_disabled/objects/8c/dc915a514bd041a8e92429107ce83883d57117 new file mode 100755 index 0000000..918cbf3 Binary files /dev/null and b/.git_disabled/objects/8c/dc915a514bd041a8e92429107ce83883d57117 differ diff --git a/.git_disabled/objects/8c/e10728bdd1cf1ca6bb8b0e29ccb808efe1f18e b/.git_disabled/objects/8c/e10728bdd1cf1ca6bb8b0e29ccb808efe1f18e new file mode 100755 index 0000000..c613839 Binary files /dev/null and b/.git_disabled/objects/8c/e10728bdd1cf1ca6bb8b0e29ccb808efe1f18e differ diff --git a/.git_disabled/objects/8c/f05cb16332d7ddd64387f24e4753b1f3196f49 b/.git_disabled/objects/8c/f05cb16332d7ddd64387f24e4753b1f3196f49 new file mode 100755 index 0000000..1971159 Binary files /dev/null and b/.git_disabled/objects/8c/f05cb16332d7ddd64387f24e4753b1f3196f49 differ diff --git a/.git_disabled/objects/8c/f29b47967eb8c4be67c6c37fa29003308dc27b b/.git_disabled/objects/8c/f29b47967eb8c4be67c6c37fa29003308dc27b new file mode 100755 index 0000000..fe5773a Binary files /dev/null and b/.git_disabled/objects/8c/f29b47967eb8c4be67c6c37fa29003308dc27b differ diff --git a/.git_disabled/objects/8d/0e77442ded63d167d6d6154c30af826ef7ff7f b/.git_disabled/objects/8d/0e77442ded63d167d6d6154c30af826ef7ff7f new file mode 100755 index 0000000..9a679de Binary files /dev/null and b/.git_disabled/objects/8d/0e77442ded63d167d6d6154c30af826ef7ff7f differ diff --git a/.git_disabled/objects/8d/24b107ad443322f96f3622e2d7abfb00af67f2 b/.git_disabled/objects/8d/24b107ad443322f96f3622e2d7abfb00af67f2 new file mode 100755 index 0000000..10ea733 Binary files /dev/null and b/.git_disabled/objects/8d/24b107ad443322f96f3622e2d7abfb00af67f2 differ diff --git a/.git_disabled/objects/8d/2b13b86e1e73c0f4bc7b6f12d5489081e899aa b/.git_disabled/objects/8d/2b13b86e1e73c0f4bc7b6f12d5489081e899aa new file mode 100755 index 0000000..f7586db Binary files /dev/null and b/.git_disabled/objects/8d/2b13b86e1e73c0f4bc7b6f12d5489081e899aa differ diff --git a/.git_disabled/objects/8d/2d6cf4673f39f759f962ba62879dbc188463b6 b/.git_disabled/objects/8d/2d6cf4673f39f759f962ba62879dbc188463b6 new file mode 100755 index 0000000..53afd92 Binary files /dev/null and b/.git_disabled/objects/8d/2d6cf4673f39f759f962ba62879dbc188463b6 differ diff --git a/.git_disabled/objects/8d/3e63eff71cb05ddb29af1f0b45a047307b9691 b/.git_disabled/objects/8d/3e63eff71cb05ddb29af1f0b45a047307b9691 new file mode 100755 index 0000000..5fa62dd Binary files /dev/null and b/.git_disabled/objects/8d/3e63eff71cb05ddb29af1f0b45a047307b9691 differ diff --git a/.git_disabled/objects/8d/3f67fd245ed80ce131f884317d49f6ffd6dcb6 b/.git_disabled/objects/8d/3f67fd245ed80ce131f884317d49f6ffd6dcb6 new file mode 100755 index 0000000..edacb3c Binary files /dev/null and b/.git_disabled/objects/8d/3f67fd245ed80ce131f884317d49f6ffd6dcb6 differ diff --git a/.git_disabled/objects/8d/44b97a672946dca4166e7c99151e637d44b63f b/.git_disabled/objects/8d/44b97a672946dca4166e7c99151e637d44b63f new file mode 100755 index 0000000..11927f0 Binary files /dev/null and b/.git_disabled/objects/8d/44b97a672946dca4166e7c99151e637d44b63f differ diff --git a/.git_disabled/objects/8d/4d21de6e6e2ad3204fb1af448d6ac5439bc2f1 b/.git_disabled/objects/8d/4d21de6e6e2ad3204fb1af448d6ac5439bc2f1 new file mode 100755 index 0000000..d26714b Binary files /dev/null and b/.git_disabled/objects/8d/4d21de6e6e2ad3204fb1af448d6ac5439bc2f1 differ diff --git a/.git_disabled/objects/8d/6d070b9ea95b2d808962ca60d7113c8f7067ce b/.git_disabled/objects/8d/6d070b9ea95b2d808962ca60d7113c8f7067ce new file mode 100755 index 0000000..172fc1a Binary files /dev/null and b/.git_disabled/objects/8d/6d070b9ea95b2d808962ca60d7113c8f7067ce differ diff --git a/.git_disabled/objects/8d/752a63dd6560995d4d785069a61465e2a729c5 b/.git_disabled/objects/8d/752a63dd6560995d4d785069a61465e2a729c5 new file mode 100755 index 0000000..c029938 Binary files /dev/null and b/.git_disabled/objects/8d/752a63dd6560995d4d785069a61465e2a729c5 differ diff --git a/.git_disabled/objects/8d/8671e229f0b860321b58fbb36f54008307d65e b/.git_disabled/objects/8d/8671e229f0b860321b58fbb36f54008307d65e new file mode 100755 index 0000000..c63d2d5 Binary files /dev/null and b/.git_disabled/objects/8d/8671e229f0b860321b58fbb36f54008307d65e differ diff --git a/.git_disabled/objects/8d/99b7ea0985e03855f0ab41d091bcd9e2f34623 b/.git_disabled/objects/8d/99b7ea0985e03855f0ab41d091bcd9e2f34623 new file mode 100755 index 0000000..6070928 Binary files /dev/null and b/.git_disabled/objects/8d/99b7ea0985e03855f0ab41d091bcd9e2f34623 differ diff --git a/.git_disabled/objects/8d/9d072f6c9c569fdfa5557026f76bdc6a70d9eb b/.git_disabled/objects/8d/9d072f6c9c569fdfa5557026f76bdc6a70d9eb new file mode 100755 index 0000000..1d38606 Binary files /dev/null and b/.git_disabled/objects/8d/9d072f6c9c569fdfa5557026f76bdc6a70d9eb differ diff --git a/.git_disabled/objects/8d/aa15abbf3f0a19159543720aaaa8c326731458 b/.git_disabled/objects/8d/aa15abbf3f0a19159543720aaaa8c326731458 new file mode 100755 index 0000000..e8ae831 Binary files /dev/null and b/.git_disabled/objects/8d/aa15abbf3f0a19159543720aaaa8c326731458 differ diff --git a/.git_disabled/objects/8d/b08ebb615ee80db91d43d4ed68d577afb0154a b/.git_disabled/objects/8d/b08ebb615ee80db91d43d4ed68d577afb0154a new file mode 100755 index 0000000..c0d59f2 Binary files /dev/null and b/.git_disabled/objects/8d/b08ebb615ee80db91d43d4ed68d577afb0154a differ diff --git a/.git_disabled/objects/8d/b287dceee16a2e1b8eadf002df282a16d79499 b/.git_disabled/objects/8d/b287dceee16a2e1b8eadf002df282a16d79499 new file mode 100755 index 0000000..40065ef --- /dev/null +++ b/.git_disabled/objects/8d/b287dceee16a2e1b8eadf002df282a16d79499 @@ -0,0 +1,6 @@ +xTMo@_1HE"TDEUBE=Ph'&]kw6F~B=p q_:Ni>웝@l>ڂl'Vu'iǠC.c + ȸòL1J0MQBs YiD7<"V!F$1p;9_5\P뢼5;;.56tiUcQ6Qqq˳?r_@)( +wgj?)g~P >,h SfAӳoȌՏ;uIZו&MLP#>a2bY1FaRc(A1¸ÔtQ+{1JD&k +8>iTnx xL5Sj`&|BcG7BK-ʻ3-$]8k;Pxhf; +M¨__ ? \ No newline at end of file diff --git a/.git_disabled/objects/8d/bfa0034301dd04a3a9123b3e145d8ba05279f7 b/.git_disabled/objects/8d/bfa0034301dd04a3a9123b3e145d8ba05279f7 new file mode 100755 index 0000000..5efd829 Binary files /dev/null and b/.git_disabled/objects/8d/bfa0034301dd04a3a9123b3e145d8ba05279f7 differ diff --git a/.git_disabled/objects/8d/c6b11bcad673afd3e156b3012be01b21187178 b/.git_disabled/objects/8d/c6b11bcad673afd3e156b3012be01b21187178 new file mode 100755 index 0000000..22682d5 --- /dev/null +++ b/.git_disabled/objects/8d/c6b11bcad673afd3e156b3012be01b21187178 @@ -0,0 +1 @@ +x+)JMU0d040075UHK37H425I255I6JѵHL3MJ3H440OI337*c맒=[q u9F \ No newline at end of file diff --git a/.git_disabled/objects/8d/d719d3e02f90917f32b8ec1526cd10d6d9e7bc b/.git_disabled/objects/8d/d719d3e02f90917f32b8ec1526cd10d6d9e7bc new file mode 100755 index 0000000..8a741e8 Binary files /dev/null and b/.git_disabled/objects/8d/d719d3e02f90917f32b8ec1526cd10d6d9e7bc differ diff --git a/.git_disabled/objects/8d/e3f8ac89206629be9f9c9fb73fdf8ffaccd287 b/.git_disabled/objects/8d/e3f8ac89206629be9f9c9fb73fdf8ffaccd287 new file mode 100755 index 0000000..8eccd6b Binary files /dev/null and b/.git_disabled/objects/8d/e3f8ac89206629be9f9c9fb73fdf8ffaccd287 differ diff --git a/.git_disabled/objects/8d/e7c5e6a31dc561a2e19817ded506db2fc03e33 b/.git_disabled/objects/8d/e7c5e6a31dc561a2e19817ded506db2fc03e33 new file mode 100755 index 0000000..768e50d Binary files /dev/null and b/.git_disabled/objects/8d/e7c5e6a31dc561a2e19817ded506db2fc03e33 differ diff --git a/.git_disabled/objects/8d/ed13922f81bc098adf5ce4992f30d0854967f2 b/.git_disabled/objects/8d/ed13922f81bc098adf5ce4992f30d0854967f2 new file mode 100755 index 0000000..6194b41 Binary files /dev/null and b/.git_disabled/objects/8d/ed13922f81bc098adf5ce4992f30d0854967f2 differ diff --git a/.git_disabled/objects/8d/fcef06282d8020f6d450a940e0f05afecad2a4 b/.git_disabled/objects/8d/fcef06282d8020f6d450a940e0f05afecad2a4 new file mode 100755 index 0000000..0690c5c Binary files /dev/null and b/.git_disabled/objects/8d/fcef06282d8020f6d450a940e0f05afecad2a4 differ diff --git a/.git_disabled/objects/8e/1d69b6e0410413186fee8badbf241f090be2db b/.git_disabled/objects/8e/1d69b6e0410413186fee8badbf241f090be2db new file mode 100755 index 0000000..d24596e Binary files /dev/null and b/.git_disabled/objects/8e/1d69b6e0410413186fee8badbf241f090be2db differ diff --git a/.git_disabled/objects/8e/23a62bf3304f4b2f200554b75519bbe386e421 b/.git_disabled/objects/8e/23a62bf3304f4b2f200554b75519bbe386e421 new file mode 100755 index 0000000..8c8648d Binary files /dev/null and b/.git_disabled/objects/8e/23a62bf3304f4b2f200554b75519bbe386e421 differ diff --git a/.git_disabled/objects/8e/340d37a853d6acd307636702a91c2da17a362a b/.git_disabled/objects/8e/340d37a853d6acd307636702a91c2da17a362a new file mode 100755 index 0000000..59a3308 Binary files /dev/null and b/.git_disabled/objects/8e/340d37a853d6acd307636702a91c2da17a362a differ diff --git a/.git_disabled/objects/8e/3a2b3c29979005a1317e057131355b62a14c75 b/.git_disabled/objects/8e/3a2b3c29979005a1317e057131355b62a14c75 new file mode 100755 index 0000000..a4b0809 Binary files /dev/null and b/.git_disabled/objects/8e/3a2b3c29979005a1317e057131355b62a14c75 differ diff --git a/.git_disabled/objects/8e/3e231ff2ad8a07cfa262b1422232e4fad1295e b/.git_disabled/objects/8e/3e231ff2ad8a07cfa262b1422232e4fad1295e new file mode 100755 index 0000000..fb7e4ca Binary files /dev/null and b/.git_disabled/objects/8e/3e231ff2ad8a07cfa262b1422232e4fad1295e differ diff --git a/.git_disabled/objects/8e/5bccb8b18c3bcca28217c931c067b63a2ada48 b/.git_disabled/objects/8e/5bccb8b18c3bcca28217c931c067b63a2ada48 new file mode 100755 index 0000000..b55f179 Binary files /dev/null and b/.git_disabled/objects/8e/5bccb8b18c3bcca28217c931c067b63a2ada48 differ diff --git a/.git_disabled/objects/8e/6f54ac1e80f94a958cde7bb6ffbb392a4e6a42 b/.git_disabled/objects/8e/6f54ac1e80f94a958cde7bb6ffbb392a4e6a42 new file mode 100755 index 0000000..18a2aa2 Binary files /dev/null and b/.git_disabled/objects/8e/6f54ac1e80f94a958cde7bb6ffbb392a4e6a42 differ diff --git a/.git_disabled/objects/8e/7418b1268ccce2df04006daea1c2671e569ac7 b/.git_disabled/objects/8e/7418b1268ccce2df04006daea1c2671e569ac7 new file mode 100755 index 0000000..38ef3cf Binary files /dev/null and b/.git_disabled/objects/8e/7418b1268ccce2df04006daea1c2671e569ac7 differ diff --git a/.git_disabled/objects/8e/7d75d84ec802bb0ec429df69b9bf1a432b9b4a b/.git_disabled/objects/8e/7d75d84ec802bb0ec429df69b9bf1a432b9b4a new file mode 100755 index 0000000..5cdff10 Binary files /dev/null and b/.git_disabled/objects/8e/7d75d84ec802bb0ec429df69b9bf1a432b9b4a differ diff --git a/.git_disabled/objects/8e/7f6076713ad8290757afe761ec27440feda306 b/.git_disabled/objects/8e/7f6076713ad8290757afe761ec27440feda306 new file mode 100755 index 0000000..effef9b Binary files /dev/null and b/.git_disabled/objects/8e/7f6076713ad8290757afe761ec27440feda306 differ diff --git a/.git_disabled/objects/8e/881846519443032d7c9c4ef6d9a873c7b52068 b/.git_disabled/objects/8e/881846519443032d7c9c4ef6d9a873c7b52068 new file mode 100755 index 0000000..44fda7e Binary files /dev/null and b/.git_disabled/objects/8e/881846519443032d7c9c4ef6d9a873c7b52068 differ diff --git a/.git_disabled/objects/8e/a43e8f9cdc1b5cebba33c38ef393c4f01a34d8 b/.git_disabled/objects/8e/a43e8f9cdc1b5cebba33c38ef393c4f01a34d8 new file mode 100755 index 0000000..deb148f Binary files /dev/null and b/.git_disabled/objects/8e/a43e8f9cdc1b5cebba33c38ef393c4f01a34d8 differ diff --git a/.git_disabled/objects/8e/b793214baa1e8ab0413f9c1af0f982567c1b04 b/.git_disabled/objects/8e/b793214baa1e8ab0413f9c1af0f982567c1b04 new file mode 100755 index 0000000..76415d5 Binary files /dev/null and b/.git_disabled/objects/8e/b793214baa1e8ab0413f9c1af0f982567c1b04 differ diff --git a/.git_disabled/objects/8e/c09832778c4a12b78e86c9bb9003e4263cd38a b/.git_disabled/objects/8e/c09832778c4a12b78e86c9bb9003e4263cd38a new file mode 100755 index 0000000..dccfa8c Binary files /dev/null and b/.git_disabled/objects/8e/c09832778c4a12b78e86c9bb9003e4263cd38a differ diff --git a/.git_disabled/objects/8e/d701a9674db3db6583e755401a01218d688616 b/.git_disabled/objects/8e/d701a9674db3db6583e755401a01218d688616 new file mode 100755 index 0000000..5291a28 Binary files /dev/null and b/.git_disabled/objects/8e/d701a9674db3db6583e755401a01218d688616 differ diff --git a/.git_disabled/objects/8e/db2a8c359291322e6882b5f5427b10dfdf6aa6 b/.git_disabled/objects/8e/db2a8c359291322e6882b5f5427b10dfdf6aa6 new file mode 100755 index 0000000..33d5df3 Binary files /dev/null and b/.git_disabled/objects/8e/db2a8c359291322e6882b5f5427b10dfdf6aa6 differ diff --git a/.git_disabled/objects/8e/eccd4bd36f50bab6c243bfd9953b27ccbc0e3d b/.git_disabled/objects/8e/eccd4bd36f50bab6c243bfd9953b27ccbc0e3d new file mode 100755 index 0000000..977a523 Binary files /dev/null and b/.git_disabled/objects/8e/eccd4bd36f50bab6c243bfd9953b27ccbc0e3d differ diff --git a/.git_disabled/objects/8e/fd199b863839266e460f9b76893fbdb0a2bf63 b/.git_disabled/objects/8e/fd199b863839266e460f9b76893fbdb0a2bf63 new file mode 100755 index 0000000..d5edaa3 Binary files /dev/null and b/.git_disabled/objects/8e/fd199b863839266e460f9b76893fbdb0a2bf63 differ diff --git a/.git_disabled/objects/8f/080eae848f759c9173bfc0c79506357ebe5090 b/.git_disabled/objects/8f/080eae848f759c9173bfc0c79506357ebe5090 new file mode 100755 index 0000000..36a7eef Binary files /dev/null and b/.git_disabled/objects/8f/080eae848f759c9173bfc0c79506357ebe5090 differ diff --git a/.git_disabled/objects/8f/0c6416985f0139762ba50be48d370bb4038142 b/.git_disabled/objects/8f/0c6416985f0139762ba50be48d370bb4038142 new file mode 100755 index 0000000..be49387 Binary files /dev/null and b/.git_disabled/objects/8f/0c6416985f0139762ba50be48d370bb4038142 differ diff --git a/.git_disabled/objects/8f/0f9acdc4fd42850b15bb1fa049ba0afbd6ef0a b/.git_disabled/objects/8f/0f9acdc4fd42850b15bb1fa049ba0afbd6ef0a new file mode 100755 index 0000000..719b825 Binary files /dev/null and b/.git_disabled/objects/8f/0f9acdc4fd42850b15bb1fa049ba0afbd6ef0a differ diff --git a/.git_disabled/objects/8f/1d5132c425762bbeee41a87350225151c1de3f b/.git_disabled/objects/8f/1d5132c425762bbeee41a87350225151c1de3f new file mode 100755 index 0000000..19fdbf2 Binary files /dev/null and b/.git_disabled/objects/8f/1d5132c425762bbeee41a87350225151c1de3f differ diff --git a/.git_disabled/objects/8f/362f0dd9e238267e52aaa4c999bf9ba961e255 b/.git_disabled/objects/8f/362f0dd9e238267e52aaa4c999bf9ba961e255 new file mode 100755 index 0000000..4950532 Binary files /dev/null and b/.git_disabled/objects/8f/362f0dd9e238267e52aaa4c999bf9ba961e255 differ diff --git a/.git_disabled/objects/8f/392b822f4b773bcd5d9505b81742e8552f08d0 b/.git_disabled/objects/8f/392b822f4b773bcd5d9505b81742e8552f08d0 new file mode 100755 index 0000000..44c033b Binary files /dev/null and b/.git_disabled/objects/8f/392b822f4b773bcd5d9505b81742e8552f08d0 differ diff --git a/.git_disabled/objects/8f/429293f649ff08749da1e0f0c83141679cf1b7 b/.git_disabled/objects/8f/429293f649ff08749da1e0f0c83141679cf1b7 new file mode 100755 index 0000000..3d60ff6 Binary files /dev/null and b/.git_disabled/objects/8f/429293f649ff08749da1e0f0c83141679cf1b7 differ diff --git a/.git_disabled/objects/8f/47014e50f15582fdc51f9deea03f3231ca6759 b/.git_disabled/objects/8f/47014e50f15582fdc51f9deea03f3231ca6759 new file mode 100755 index 0000000..71af3ed Binary files /dev/null and b/.git_disabled/objects/8f/47014e50f15582fdc51f9deea03f3231ca6759 differ diff --git a/.git_disabled/objects/8f/4f151f23c9c8b4d9544b0e411469b781969ae4 b/.git_disabled/objects/8f/4f151f23c9c8b4d9544b0e411469b781969ae4 new file mode 100755 index 0000000..d1ce636 Binary files /dev/null and b/.git_disabled/objects/8f/4f151f23c9c8b4d9544b0e411469b781969ae4 differ diff --git a/.git_disabled/objects/8f/58bfb1f9c7b7f6c628bf3ea308f0707e74e3f5 b/.git_disabled/objects/8f/58bfb1f9c7b7f6c628bf3ea308f0707e74e3f5 new file mode 100755 index 0000000..338c8ef Binary files /dev/null and b/.git_disabled/objects/8f/58bfb1f9c7b7f6c628bf3ea308f0707e74e3f5 differ diff --git a/.git_disabled/objects/8f/5d799ed4f95d56d360845088486e5333d6c5a5 b/.git_disabled/objects/8f/5d799ed4f95d56d360845088486e5333d6c5a5 new file mode 100755 index 0000000..0f44368 Binary files /dev/null and b/.git_disabled/objects/8f/5d799ed4f95d56d360845088486e5333d6c5a5 differ diff --git a/.git_disabled/objects/8f/5ff716dc258efca945c4c06c82220462213285 b/.git_disabled/objects/8f/5ff716dc258efca945c4c06c82220462213285 new file mode 100755 index 0000000..60a9c7b Binary files /dev/null and b/.git_disabled/objects/8f/5ff716dc258efca945c4c06c82220462213285 differ diff --git a/.git_disabled/objects/8f/6e3b99f32c99e871c7acee3b707212494a189c b/.git_disabled/objects/8f/6e3b99f32c99e871c7acee3b707212494a189c new file mode 100755 index 0000000..935992f Binary files /dev/null and b/.git_disabled/objects/8f/6e3b99f32c99e871c7acee3b707212494a189c differ diff --git a/.git_disabled/objects/8f/85a41a2c068b0779da9fc7bcd193b3d1ecd9a6 b/.git_disabled/objects/8f/85a41a2c068b0779da9fc7bcd193b3d1ecd9a6 new file mode 100755 index 0000000..9292977 Binary files /dev/null and b/.git_disabled/objects/8f/85a41a2c068b0779da9fc7bcd193b3d1ecd9a6 differ diff --git a/.git_disabled/objects/8f/8cc4bacc0f02574082eb2e61675392b57640c2 b/.git_disabled/objects/8f/8cc4bacc0f02574082eb2e61675392b57640c2 new file mode 100755 index 0000000..1528a99 Binary files /dev/null and b/.git_disabled/objects/8f/8cc4bacc0f02574082eb2e61675392b57640c2 differ diff --git a/.git_disabled/objects/8f/aaa5884d8a4161984f1e0f18db26dab6b404f9 b/.git_disabled/objects/8f/aaa5884d8a4161984f1e0f18db26dab6b404f9 new file mode 100755 index 0000000..35b7548 Binary files /dev/null and b/.git_disabled/objects/8f/aaa5884d8a4161984f1e0f18db26dab6b404f9 differ diff --git a/.git_disabled/objects/8f/b64a7756d3ac6791a70c7adec8547f96830320 b/.git_disabled/objects/8f/b64a7756d3ac6791a70c7adec8547f96830320 new file mode 100755 index 0000000..041f064 Binary files /dev/null and b/.git_disabled/objects/8f/b64a7756d3ac6791a70c7adec8547f96830320 differ diff --git a/.git_disabled/objects/8f/e5a5bdc4e51654862cbc75e1f0239f982ff19a b/.git_disabled/objects/8f/e5a5bdc4e51654862cbc75e1f0239f982ff19a new file mode 100755 index 0000000..2086f6b Binary files /dev/null and b/.git_disabled/objects/8f/e5a5bdc4e51654862cbc75e1f0239f982ff19a differ diff --git a/.git_disabled/objects/8f/f009e2699a3731e9b42e3318b87ef72f90900c b/.git_disabled/objects/8f/f009e2699a3731e9b42e3318b87ef72f90900c new file mode 100755 index 0000000..7c46628 Binary files /dev/null and b/.git_disabled/objects/8f/f009e2699a3731e9b42e3318b87ef72f90900c differ diff --git a/.git_disabled/objects/8f/f361fc091d2eec0d2666bd71835f67371edb3c b/.git_disabled/objects/8f/f361fc091d2eec0d2666bd71835f67371edb3c new file mode 100755 index 0000000..a1a9d5a Binary files /dev/null and b/.git_disabled/objects/8f/f361fc091d2eec0d2666bd71835f67371edb3c differ diff --git a/.git_disabled/objects/8f/faa7a2a6d02f0a32f63bef469758b446785d8d b/.git_disabled/objects/8f/faa7a2a6d02f0a32f63bef469758b446785d8d new file mode 100755 index 0000000..a965fee Binary files /dev/null and b/.git_disabled/objects/8f/faa7a2a6d02f0a32f63bef469758b446785d8d differ diff --git a/.git_disabled/objects/90/2d18f5b8a0c0a7f6924ddcc0e7db09763b6683 b/.git_disabled/objects/90/2d18f5b8a0c0a7f6924ddcc0e7db09763b6683 new file mode 100755 index 0000000..15dbfa6 Binary files /dev/null and b/.git_disabled/objects/90/2d18f5b8a0c0a7f6924ddcc0e7db09763b6683 differ diff --git a/.git_disabled/objects/90/3532a2c0ab6eeb8f1bf730f13520286e80168c b/.git_disabled/objects/90/3532a2c0ab6eeb8f1bf730f13520286e80168c new file mode 100755 index 0000000..c76055b Binary files /dev/null and b/.git_disabled/objects/90/3532a2c0ab6eeb8f1bf730f13520286e80168c differ diff --git a/.git_disabled/objects/90/3c436fda89a8efbaf55bddca31cb2a9e7d3e01 b/.git_disabled/objects/90/3c436fda89a8efbaf55bddca31cb2a9e7d3e01 new file mode 100755 index 0000000..bb87ce0 Binary files /dev/null and b/.git_disabled/objects/90/3c436fda89a8efbaf55bddca31cb2a9e7d3e01 differ diff --git a/.git_disabled/objects/90/40ad3c17dd4646b33f2182017fea609a9d6b1c b/.git_disabled/objects/90/40ad3c17dd4646b33f2182017fea609a9d6b1c new file mode 100755 index 0000000..c006366 --- /dev/null +++ b/.git_disabled/objects/90/40ad3c17dd4646b33f2182017fea609a9d6b1c @@ -0,0 +1,4 @@ +xgu¢Ųc8. b{C7622V: o||I#p= HL\9d&aVGF t}y yǿ?g/ ~_/ ~_/ ~_/ ~#yOM]qQK TQIQJ QngQZjJ*(RJ(u;xzRC5UTRA9eRB1Eԣ +))@6PMTPNPLoGCi}=)]xx +^/;[q)>!>.>&___O/?CXx`A!=X#=xZl{````IbۃŶm<"=Ŷm<(=X.=x@l{p>bۃ{Ķwm)=Cl{p6A&=Ul{pfMbۃŶ7m,\'=X*=Vl{pjUbۃ%bۃTl{Xl{Hl{Pl{@l{0_l{0Ol{0Wl{0*=#= mĶOAA \ No newline at end of file diff --git a/.git_disabled/objects/90/42034191cb25172a46d02f1391f3098ebd8e5f b/.git_disabled/objects/90/42034191cb25172a46d02f1391f3098ebd8e5f new file mode 100755 index 0000000..a46b393 Binary files /dev/null and b/.git_disabled/objects/90/42034191cb25172a46d02f1391f3098ebd8e5f differ diff --git a/.git_disabled/objects/90/67a8ff77fe3463308a5c1b58fb382eff3d3c27 b/.git_disabled/objects/90/67a8ff77fe3463308a5c1b58fb382eff3d3c27 new file mode 100755 index 0000000..3159733 Binary files /dev/null and b/.git_disabled/objects/90/67a8ff77fe3463308a5c1b58fb382eff3d3c27 differ diff --git a/.git_disabled/objects/90/69bcc2efc07e720e219fc0962e74adf7a3bc10 b/.git_disabled/objects/90/69bcc2efc07e720e219fc0962e74adf7a3bc10 new file mode 100755 index 0000000..6c41f4f Binary files /dev/null and b/.git_disabled/objects/90/69bcc2efc07e720e219fc0962e74adf7a3bc10 differ diff --git a/.git_disabled/objects/90/7d1ec6fed8f0d586381e69e2fb7526c3fcc75b b/.git_disabled/objects/90/7d1ec6fed8f0d586381e69e2fb7526c3fcc75b new file mode 100755 index 0000000..f5f2276 Binary files /dev/null and b/.git_disabled/objects/90/7d1ec6fed8f0d586381e69e2fb7526c3fcc75b differ diff --git a/.git_disabled/objects/90/9435b1ddc4e1255afc8a24f785888ac7b600b6 b/.git_disabled/objects/90/9435b1ddc4e1255afc8a24f785888ac7b600b6 new file mode 100755 index 0000000..b00f08a Binary files /dev/null and b/.git_disabled/objects/90/9435b1ddc4e1255afc8a24f785888ac7b600b6 differ diff --git a/.git_disabled/objects/90/ca0a5c428b936b74ef5d9bafa2e500d1049d6b b/.git_disabled/objects/90/ca0a5c428b936b74ef5d9bafa2e500d1049d6b new file mode 100755 index 0000000..25924e0 Binary files /dev/null and b/.git_disabled/objects/90/ca0a5c428b936b74ef5d9bafa2e500d1049d6b differ diff --git a/.git_disabled/objects/90/dbd3cc4452c5c71f4d7905fd050a3ed3b9e280 b/.git_disabled/objects/90/dbd3cc4452c5c71f4d7905fd050a3ed3b9e280 new file mode 100755 index 0000000..fd8e2e1 Binary files /dev/null and b/.git_disabled/objects/90/dbd3cc4452c5c71f4d7905fd050a3ed3b9e280 differ diff --git a/.git_disabled/objects/90/dbf1555241bc263a938e5859151cca55d9859b b/.git_disabled/objects/90/dbf1555241bc263a938e5859151cca55d9859b new file mode 100755 index 0000000..85bb1b2 --- /dev/null +++ b/.git_disabled/objects/90/dbf1555241bc263a938e5859151cca55d9859b @@ -0,0 +1 @@ +x}AK@=W饅ԃC/<&$3awR'[I*I$RCnFnVk&n;F L`)= ȝ΂`2 2M2bK Dp#qkLevUOմGߵ4szgFpp_JQI+UvXBmHe׽$ A-Y[Iy헏WmnZw\=c}+CyD-G}&^ \ No newline at end of file diff --git a/.git_disabled/objects/90/f3e5153f13a11a9a2d99ee7b447624725f7902 b/.git_disabled/objects/90/f3e5153f13a11a9a2d99ee7b447624725f7902 new file mode 100755 index 0000000..b795f6c Binary files /dev/null and b/.git_disabled/objects/90/f3e5153f13a11a9a2d99ee7b447624725f7902 differ diff --git a/.git_disabled/objects/91/06731c44d5a734bf20ab1c4fc42226ed4ec676 b/.git_disabled/objects/91/06731c44d5a734bf20ab1c4fc42226ed4ec676 new file mode 100755 index 0000000..48885c9 Binary files /dev/null and b/.git_disabled/objects/91/06731c44d5a734bf20ab1c4fc42226ed4ec676 differ diff --git a/.git_disabled/objects/91/090923803b2e8b6eea894c3daa5285444de966 b/.git_disabled/objects/91/090923803b2e8b6eea894c3daa5285444de966 new file mode 100755 index 0000000..3d3bb5b Binary files /dev/null and b/.git_disabled/objects/91/090923803b2e8b6eea894c3daa5285444de966 differ diff --git a/.git_disabled/objects/91/19555dc89e64ba455fd6a1b62fa16bf2ce9707 b/.git_disabled/objects/91/19555dc89e64ba455fd6a1b62fa16bf2ce9707 new file mode 100755 index 0000000..6c765c5 Binary files /dev/null and b/.git_disabled/objects/91/19555dc89e64ba455fd6a1b62fa16bf2ce9707 differ diff --git a/.git_disabled/objects/91/43bca4eccb83e4b3970f7bdeff2175f26275c0 b/.git_disabled/objects/91/43bca4eccb83e4b3970f7bdeff2175f26275c0 new file mode 100755 index 0000000..1b5b443 Binary files /dev/null and b/.git_disabled/objects/91/43bca4eccb83e4b3970f7bdeff2175f26275c0 differ diff --git a/.git_disabled/objects/91/46c13ee2bfa693a1bee7527b861330db4b7bfe b/.git_disabled/objects/91/46c13ee2bfa693a1bee7527b861330db4b7bfe new file mode 100755 index 0000000..013235d Binary files /dev/null and b/.git_disabled/objects/91/46c13ee2bfa693a1bee7527b861330db4b7bfe differ diff --git a/.git_disabled/objects/91/4a0a2d11e44f27cdbcfd4f180ac0f286272c60 b/.git_disabled/objects/91/4a0a2d11e44f27cdbcfd4f180ac0f286272c60 new file mode 100755 index 0000000..5ee4159 Binary files /dev/null and b/.git_disabled/objects/91/4a0a2d11e44f27cdbcfd4f180ac0f286272c60 differ diff --git a/.git_disabled/objects/91/590a5d6a02abaffe0e6a2adbdaa45bc3277dd7 b/.git_disabled/objects/91/590a5d6a02abaffe0e6a2adbdaa45bc3277dd7 new file mode 100755 index 0000000..65e73aa Binary files /dev/null and b/.git_disabled/objects/91/590a5d6a02abaffe0e6a2adbdaa45bc3277dd7 differ diff --git a/.git_disabled/objects/91/5fd291082aad6e9b5d3fbd0e12954df1e26aa1 b/.git_disabled/objects/91/5fd291082aad6e9b5d3fbd0e12954df1e26aa1 new file mode 100755 index 0000000..6be5d8e Binary files /dev/null and b/.git_disabled/objects/91/5fd291082aad6e9b5d3fbd0e12954df1e26aa1 differ diff --git a/.git_disabled/objects/91/6ed26189104dff2a97e9c430fee7d7047a00b7 b/.git_disabled/objects/91/6ed26189104dff2a97e9c430fee7d7047a00b7 new file mode 100755 index 0000000..3946834 Binary files /dev/null and b/.git_disabled/objects/91/6ed26189104dff2a97e9c430fee7d7047a00b7 differ diff --git a/.git_disabled/objects/91/74c54413a00922e07ddd41e9084b28672b9612 b/.git_disabled/objects/91/74c54413a00922e07ddd41e9084b28672b9612 new file mode 100755 index 0000000..a155fe2 Binary files /dev/null and b/.git_disabled/objects/91/74c54413a00922e07ddd41e9084b28672b9612 differ diff --git a/.git_disabled/objects/91/7c4db8eb0a6fd4dedc81aaecae043d57779d80 b/.git_disabled/objects/91/7c4db8eb0a6fd4dedc81aaecae043d57779d80 new file mode 100755 index 0000000..9a3e696 Binary files /dev/null and b/.git_disabled/objects/91/7c4db8eb0a6fd4dedc81aaecae043d57779d80 differ diff --git a/.git_disabled/objects/91/99367f8b02d89856ed2be082a3aba6222df205 b/.git_disabled/objects/91/99367f8b02d89856ed2be082a3aba6222df205 new file mode 100755 index 0000000..7810c7b Binary files /dev/null and b/.git_disabled/objects/91/99367f8b02d89856ed2be082a3aba6222df205 differ diff --git a/.git_disabled/objects/91/9d6c104f45f2098855176f360664a67fb8fd05 b/.git_disabled/objects/91/9d6c104f45f2098855176f360664a67fb8fd05 new file mode 100755 index 0000000..7413ae2 Binary files /dev/null and b/.git_disabled/objects/91/9d6c104f45f2098855176f360664a67fb8fd05 differ diff --git a/.git_disabled/objects/92/09c86a841df9612823be240b9b5a5026679878 b/.git_disabled/objects/92/09c86a841df9612823be240b9b5a5026679878 new file mode 100755 index 0000000..3f58d49 Binary files /dev/null and b/.git_disabled/objects/92/09c86a841df9612823be240b9b5a5026679878 differ diff --git a/.git_disabled/objects/92/1d1729769264d5ebc4b98cff4a37b327709a86 b/.git_disabled/objects/92/1d1729769264d5ebc4b98cff4a37b327709a86 new file mode 100755 index 0000000..a9558d5 Binary files /dev/null and b/.git_disabled/objects/92/1d1729769264d5ebc4b98cff4a37b327709a86 differ diff --git a/.git_disabled/objects/92/21557cd32f3b5d298a1b337d452dce7145d33d b/.git_disabled/objects/92/21557cd32f3b5d298a1b337d452dce7145d33d new file mode 100755 index 0000000..7420ab4 Binary files /dev/null and b/.git_disabled/objects/92/21557cd32f3b5d298a1b337d452dce7145d33d differ diff --git a/.git_disabled/objects/92/25cbc1bd2257b621584dde65654e4021f0d7fa b/.git_disabled/objects/92/25cbc1bd2257b621584dde65654e4021f0d7fa new file mode 100755 index 0000000..0a65dbb Binary files /dev/null and b/.git_disabled/objects/92/25cbc1bd2257b621584dde65654e4021f0d7fa differ diff --git a/.git_disabled/objects/92/27a6bb7118bd71b70f125df5f605b7e74826cd b/.git_disabled/objects/92/27a6bb7118bd71b70f125df5f605b7e74826cd new file mode 100755 index 0000000..3abbdbc Binary files /dev/null and b/.git_disabled/objects/92/27a6bb7118bd71b70f125df5f605b7e74826cd differ diff --git a/.git_disabled/objects/92/3b6b5897c8ad0d22c0c0d75d30ab9a92e5ab73 b/.git_disabled/objects/92/3b6b5897c8ad0d22c0c0d75d30ab9a92e5ab73 new file mode 100755 index 0000000..0b6296b Binary files /dev/null and b/.git_disabled/objects/92/3b6b5897c8ad0d22c0c0d75d30ab9a92e5ab73 differ diff --git a/.git_disabled/objects/92/48b68abfbff90ddd64646fbe9cabb9f0ebe869 b/.git_disabled/objects/92/48b68abfbff90ddd64646fbe9cabb9f0ebe869 new file mode 100755 index 0000000..7007e33 Binary files /dev/null and b/.git_disabled/objects/92/48b68abfbff90ddd64646fbe9cabb9f0ebe869 differ diff --git a/.git_disabled/objects/92/875e1ce025c0ba18b0d42997c477717cda409a b/.git_disabled/objects/92/875e1ce025c0ba18b0d42997c477717cda409a new file mode 100755 index 0000000..6cb9cef Binary files /dev/null and b/.git_disabled/objects/92/875e1ce025c0ba18b0d42997c477717cda409a differ diff --git a/.git_disabled/objects/92/9ed30d1e77f791e8265d58373bb043ef1a5a0b b/.git_disabled/objects/92/9ed30d1e77f791e8265d58373bb043ef1a5a0b new file mode 100755 index 0000000..146674c Binary files /dev/null and b/.git_disabled/objects/92/9ed30d1e77f791e8265d58373bb043ef1a5a0b differ diff --git a/.git_disabled/objects/92/a320886ec9c42152ce657a2c666e696b306644 b/.git_disabled/objects/92/a320886ec9c42152ce657a2c666e696b306644 new file mode 100755 index 0000000..c324dc8 Binary files /dev/null and b/.git_disabled/objects/92/a320886ec9c42152ce657a2c666e696b306644 differ diff --git a/.git_disabled/objects/92/a4bf90926d50aecc34980b2626317963845d62 b/.git_disabled/objects/92/a4bf90926d50aecc34980b2626317963845d62 new file mode 100755 index 0000000..7e6cdac Binary files /dev/null and b/.git_disabled/objects/92/a4bf90926d50aecc34980b2626317963845d62 differ diff --git a/.git_disabled/objects/92/aadacd2ac850eb27d9da7054c1f23cb853ed32 b/.git_disabled/objects/92/aadacd2ac850eb27d9da7054c1f23cb853ed32 new file mode 100755 index 0000000..2442128 Binary files /dev/null and b/.git_disabled/objects/92/aadacd2ac850eb27d9da7054c1f23cb853ed32 differ diff --git a/.git_disabled/objects/92/afabb9c9c5376d3849156b1f48ef80f5882813 b/.git_disabled/objects/92/afabb9c9c5376d3849156b1f48ef80f5882813 new file mode 100755 index 0000000..9e01ea2 Binary files /dev/null and b/.git_disabled/objects/92/afabb9c9c5376d3849156b1f48ef80f5882813 differ diff --git a/.git_disabled/objects/92/b1d247a5dd236b1e697973779fc6eca457e6c8 b/.git_disabled/objects/92/b1d247a5dd236b1e697973779fc6eca457e6c8 new file mode 100755 index 0000000..a25a98c Binary files /dev/null and b/.git_disabled/objects/92/b1d247a5dd236b1e697973779fc6eca457e6c8 differ diff --git a/.git_disabled/objects/92/dfb46915c5b5356e7bf5463af20cbfcda08aba b/.git_disabled/objects/92/dfb46915c5b5356e7bf5463af20cbfcda08aba new file mode 100755 index 0000000..4352318 Binary files /dev/null and b/.git_disabled/objects/92/dfb46915c5b5356e7bf5463af20cbfcda08aba differ diff --git a/.git_disabled/objects/93/0835de8dae404d1fa9661e19351a1d9d09ec11 b/.git_disabled/objects/93/0835de8dae404d1fa9661e19351a1d9d09ec11 new file mode 100755 index 0000000..15d685b Binary files /dev/null and b/.git_disabled/objects/93/0835de8dae404d1fa9661e19351a1d9d09ec11 differ diff --git a/.git_disabled/objects/93/0be999cf8ebce9bf9e6747bc8dc298154a99d8 b/.git_disabled/objects/93/0be999cf8ebce9bf9e6747bc8dc298154a99d8 new file mode 100755 index 0000000..746072d Binary files /dev/null and b/.git_disabled/objects/93/0be999cf8ebce9bf9e6747bc8dc298154a99d8 differ diff --git a/.git_disabled/objects/93/17be63b8faed9a006569da3feb7ffde23c0407 b/.git_disabled/objects/93/17be63b8faed9a006569da3feb7ffde23c0407 new file mode 100755 index 0000000..f71cba2 Binary files /dev/null and b/.git_disabled/objects/93/17be63b8faed9a006569da3feb7ffde23c0407 differ diff --git a/.git_disabled/objects/93/303423fed03866329a9bcb1c4aeaec0ba5e4ee b/.git_disabled/objects/93/303423fed03866329a9bcb1c4aeaec0ba5e4ee new file mode 100755 index 0000000..7f50cd8 Binary files /dev/null and b/.git_disabled/objects/93/303423fed03866329a9bcb1c4aeaec0ba5e4ee differ diff --git a/.git_disabled/objects/93/3587fba22290d7eb7df4c88e12f1e61702b8ce b/.git_disabled/objects/93/3587fba22290d7eb7df4c88e12f1e61702b8ce new file mode 100755 index 0000000..6e88adb Binary files /dev/null and b/.git_disabled/objects/93/3587fba22290d7eb7df4c88e12f1e61702b8ce differ diff --git a/.git_disabled/objects/93/49337fccdc95bb4ff8accb55018da6ea695ab7 b/.git_disabled/objects/93/49337fccdc95bb4ff8accb55018da6ea695ab7 new file mode 100755 index 0000000..409328f Binary files /dev/null and b/.git_disabled/objects/93/49337fccdc95bb4ff8accb55018da6ea695ab7 differ diff --git a/.git_disabled/objects/93/55c76d1783daf35183c2303fc9d543685140b3 b/.git_disabled/objects/93/55c76d1783daf35183c2303fc9d543685140b3 new file mode 100755 index 0000000..04bd1d1 Binary files /dev/null and b/.git_disabled/objects/93/55c76d1783daf35183c2303fc9d543685140b3 differ diff --git a/.git_disabled/objects/93/575e404ea490807d2aecaeee066dee067a5444 b/.git_disabled/objects/93/575e404ea490807d2aecaeee066dee067a5444 new file mode 100755 index 0000000..782f04b Binary files /dev/null and b/.git_disabled/objects/93/575e404ea490807d2aecaeee066dee067a5444 differ diff --git a/.git_disabled/objects/93/5d748e8b7af1d405e2e8291846c2448a444d90 b/.git_disabled/objects/93/5d748e8b7af1d405e2e8291846c2448a444d90 new file mode 100755 index 0000000..51ba4ee Binary files /dev/null and b/.git_disabled/objects/93/5d748e8b7af1d405e2e8291846c2448a444d90 differ diff --git a/.git_disabled/objects/93/66ba8b7781d44c2f00ae57f54dae21ef6c9cce b/.git_disabled/objects/93/66ba8b7781d44c2f00ae57f54dae21ef6c9cce new file mode 100755 index 0000000..f76a9ec Binary files /dev/null and b/.git_disabled/objects/93/66ba8b7781d44c2f00ae57f54dae21ef6c9cce differ diff --git a/.git_disabled/objects/93/78f83544d1f10db310dd2d011fa842834df6a4 b/.git_disabled/objects/93/78f83544d1f10db310dd2d011fa842834df6a4 new file mode 100755 index 0000000..cbd4c8f Binary files /dev/null and b/.git_disabled/objects/93/78f83544d1f10db310dd2d011fa842834df6a4 differ diff --git a/.git_disabled/objects/93/900acacad113a52ff311ed5ba984c7ecc46527 b/.git_disabled/objects/93/900acacad113a52ff311ed5ba984c7ecc46527 new file mode 100755 index 0000000..777162c Binary files /dev/null and b/.git_disabled/objects/93/900acacad113a52ff311ed5ba984c7ecc46527 differ diff --git a/.git_disabled/objects/93/96fda89c4fa295021bef9dc9eeabc3290dfee6 b/.git_disabled/objects/93/96fda89c4fa295021bef9dc9eeabc3290dfee6 new file mode 100755 index 0000000..d7c0eed Binary files /dev/null and b/.git_disabled/objects/93/96fda89c4fa295021bef9dc9eeabc3290dfee6 differ diff --git a/.git_disabled/objects/93/9cdb912a9debaea07fbf3a9ac04549c44d077c b/.git_disabled/objects/93/9cdb912a9debaea07fbf3a9ac04549c44d077c new file mode 100755 index 0000000..64e8e53 Binary files /dev/null and b/.git_disabled/objects/93/9cdb912a9debaea07fbf3a9ac04549c44d077c differ diff --git a/.git_disabled/objects/93/b7deabb3bc42f85a2a807a7fc02413f4a8b948 b/.git_disabled/objects/93/b7deabb3bc42f85a2a807a7fc02413f4a8b948 new file mode 100755 index 0000000..38cdf14 Binary files /dev/null and b/.git_disabled/objects/93/b7deabb3bc42f85a2a807a7fc02413f4a8b948 differ diff --git a/.git_disabled/objects/93/bd6fc143458d737a83fb4147a276c17ca81acf b/.git_disabled/objects/93/bd6fc143458d737a83fb4147a276c17ca81acf new file mode 100755 index 0000000..6c69f2a Binary files /dev/null and b/.git_disabled/objects/93/bd6fc143458d737a83fb4147a276c17ca81acf differ diff --git a/.git_disabled/objects/93/be8cab5aea128e7fe471fd486f18ebe040255f b/.git_disabled/objects/93/be8cab5aea128e7fe471fd486f18ebe040255f new file mode 100755 index 0000000..9857c21 --- /dev/null +++ b/.git_disabled/objects/93/be8cab5aea128e7fe471fd486f18ebe040255f @@ -0,0 +1 @@ +xKOR01eRPPLQRP23IN642NT%概D󋲋 Sjd \ No newline at end of file diff --git a/.git_disabled/objects/93/c9dce809e20b1371347c6bb633f91cd2175891 b/.git_disabled/objects/93/c9dce809e20b1371347c6bb633f91cd2175891 new file mode 100755 index 0000000..72b4d76 Binary files /dev/null and b/.git_disabled/objects/93/c9dce809e20b1371347c6bb633f91cd2175891 differ diff --git a/.git_disabled/objects/93/d0bdeba42ad6d55ca7873dbbfa36f3f27e70a1 b/.git_disabled/objects/93/d0bdeba42ad6d55ca7873dbbfa36f3f27e70a1 new file mode 100755 index 0000000..1a87fa9 Binary files /dev/null and b/.git_disabled/objects/93/d0bdeba42ad6d55ca7873dbbfa36f3f27e70a1 differ diff --git a/.git_disabled/objects/93/d4a630f5883c8b3b475fbeeb5e5382730a5989 b/.git_disabled/objects/93/d4a630f5883c8b3b475fbeeb5e5382730a5989 new file mode 100755 index 0000000..0ce6b6d Binary files /dev/null and b/.git_disabled/objects/93/d4a630f5883c8b3b475fbeeb5e5382730a5989 differ diff --git a/.git_disabled/objects/93/d519657201260e0f7baa3b50300785d6682337 b/.git_disabled/objects/93/d519657201260e0f7baa3b50300785d6682337 new file mode 100755 index 0000000..cf3cbbd Binary files /dev/null and b/.git_disabled/objects/93/d519657201260e0f7baa3b50300785d6682337 differ diff --git a/.git_disabled/objects/93/ebdfafc946dd96755b39bfbf5fa4f2b1d82414 b/.git_disabled/objects/93/ebdfafc946dd96755b39bfbf5fa4f2b1d82414 new file mode 100755 index 0000000..1a21993 Binary files /dev/null and b/.git_disabled/objects/93/ebdfafc946dd96755b39bfbf5fa4f2b1d82414 differ diff --git a/.git_disabled/objects/94/05f95b1338a7901614ea9bc0cf3cec81517076 b/.git_disabled/objects/94/05f95b1338a7901614ea9bc0cf3cec81517076 new file mode 100755 index 0000000..5bad96a Binary files /dev/null and b/.git_disabled/objects/94/05f95b1338a7901614ea9bc0cf3cec81517076 differ diff --git a/.git_disabled/objects/94/09bec782a5f09d60e5dbdfef44a7ff4709367d b/.git_disabled/objects/94/09bec782a5f09d60e5dbdfef44a7ff4709367d new file mode 100755 index 0000000..d582b45 Binary files /dev/null and b/.git_disabled/objects/94/09bec782a5f09d60e5dbdfef44a7ff4709367d differ diff --git a/.git_disabled/objects/94/0fcd00d97ca21eaa74f94158d375eede4e7f23 b/.git_disabled/objects/94/0fcd00d97ca21eaa74f94158d375eede4e7f23 new file mode 100755 index 0000000..9f1fcff Binary files /dev/null and b/.git_disabled/objects/94/0fcd00d97ca21eaa74f94158d375eede4e7f23 differ diff --git a/.git_disabled/objects/94/178d17e862de4271a267e7678c0c4ff971613c b/.git_disabled/objects/94/178d17e862de4271a267e7678c0c4ff971613c new file mode 100755 index 0000000..a3692cc Binary files /dev/null and b/.git_disabled/objects/94/178d17e862de4271a267e7678c0c4ff971613c differ diff --git a/.git_disabled/objects/94/3fd98e974f8fdffb8c20d468da321b25eb00dc b/.git_disabled/objects/94/3fd98e974f8fdffb8c20d468da321b25eb00dc new file mode 100755 index 0000000..168e48d Binary files /dev/null and b/.git_disabled/objects/94/3fd98e974f8fdffb8c20d468da321b25eb00dc differ diff --git a/.git_disabled/objects/94/459f7b0676102bc52bbe554e675d714a0c718a b/.git_disabled/objects/94/459f7b0676102bc52bbe554e675d714a0c718a new file mode 100755 index 0000000..ef06af2 Binary files /dev/null and b/.git_disabled/objects/94/459f7b0676102bc52bbe554e675d714a0c718a differ diff --git a/.git_disabled/objects/94/5c9b46d684f08ec84cb316e1dc0061e361f794 b/.git_disabled/objects/94/5c9b46d684f08ec84cb316e1dc0061e361f794 new file mode 100755 index 0000000..1b309de Binary files /dev/null and b/.git_disabled/objects/94/5c9b46d684f08ec84cb316e1dc0061e361f794 differ diff --git a/.git_disabled/objects/94/9bd18fe589842c219d28b3a8d3d43e0f15a513 b/.git_disabled/objects/94/9bd18fe589842c219d28b3a8d3d43e0f15a513 new file mode 100755 index 0000000..0eddf5c Binary files /dev/null and b/.git_disabled/objects/94/9bd18fe589842c219d28b3a8d3d43e0f15a513 differ diff --git a/.git_disabled/objects/94/a002a1c98807578c06ff91e88210264982fbd3 b/.git_disabled/objects/94/a002a1c98807578c06ff91e88210264982fbd3 new file mode 100755 index 0000000..64d6ab8 Binary files /dev/null and b/.git_disabled/objects/94/a002a1c98807578c06ff91e88210264982fbd3 differ diff --git a/.git_disabled/objects/94/a30c77cf50a10a65f0fb4e462c0702c33d47b4 b/.git_disabled/objects/94/a30c77cf50a10a65f0fb4e462c0702c33d47b4 new file mode 100755 index 0000000..3f86285 Binary files /dev/null and b/.git_disabled/objects/94/a30c77cf50a10a65f0fb4e462c0702c33d47b4 differ diff --git a/.git_disabled/objects/94/a8d311e43b003e10368fe19cbd933f193dfae7 b/.git_disabled/objects/94/a8d311e43b003e10368fe19cbd933f193dfae7 new file mode 100755 index 0000000..adea011 Binary files /dev/null and b/.git_disabled/objects/94/a8d311e43b003e10368fe19cbd933f193dfae7 differ diff --git a/.git_disabled/objects/94/aeffad9ed3e946e190ffefbdc058cf80ee31f9 b/.git_disabled/objects/94/aeffad9ed3e946e190ffefbdc058cf80ee31f9 new file mode 100755 index 0000000..fb60773 Binary files /dev/null and b/.git_disabled/objects/94/aeffad9ed3e946e190ffefbdc058cf80ee31f9 differ diff --git a/.git_disabled/objects/94/b9b1877033ca703b5ae7a9a4c9ddd708090402 b/.git_disabled/objects/94/b9b1877033ca703b5ae7a9a4c9ddd708090402 new file mode 100755 index 0000000..b87d7d0 Binary files /dev/null and b/.git_disabled/objects/94/b9b1877033ca703b5ae7a9a4c9ddd708090402 differ diff --git a/.git_disabled/objects/94/c493bc3d39d16beb5a29042c42b5e68c10453c b/.git_disabled/objects/94/c493bc3d39d16beb5a29042c42b5e68c10453c new file mode 100755 index 0000000..ee78814 Binary files /dev/null and b/.git_disabled/objects/94/c493bc3d39d16beb5a29042c42b5e68c10453c differ diff --git a/.git_disabled/objects/94/cfc03be58595efd2ad5465baad7cddbe2b5acf b/.git_disabled/objects/94/cfc03be58595efd2ad5465baad7cddbe2b5acf new file mode 100755 index 0000000..e6d4680 Binary files /dev/null and b/.git_disabled/objects/94/cfc03be58595efd2ad5465baad7cddbe2b5acf differ diff --git a/.git_disabled/objects/94/e5b01a8129902e5def7d133a24bdb1d189fcbb b/.git_disabled/objects/94/e5b01a8129902e5def7d133a24bdb1d189fcbb new file mode 100755 index 0000000..2499c5b Binary files /dev/null and b/.git_disabled/objects/94/e5b01a8129902e5def7d133a24bdb1d189fcbb differ diff --git a/.git_disabled/objects/94/eda03adc7c4a9e48ca1d7955de9c5b8d5ac162 b/.git_disabled/objects/94/eda03adc7c4a9e48ca1d7955de9c5b8d5ac162 new file mode 100755 index 0000000..9f290d6 Binary files /dev/null and b/.git_disabled/objects/94/eda03adc7c4a9e48ca1d7955de9c5b8d5ac162 differ diff --git a/.git_disabled/objects/95/2453cb41d780cc0b25791bd1d184a614204581 b/.git_disabled/objects/95/2453cb41d780cc0b25791bd1d184a614204581 new file mode 100755 index 0000000..7a4248d Binary files /dev/null and b/.git_disabled/objects/95/2453cb41d780cc0b25791bd1d184a614204581 differ diff --git a/.git_disabled/objects/95/31ca8373afb229d5e86456f52dfcb934014880 b/.git_disabled/objects/95/31ca8373afb229d5e86456f52dfcb934014880 new file mode 100755 index 0000000..1fe7031 Binary files /dev/null and b/.git_disabled/objects/95/31ca8373afb229d5e86456f52dfcb934014880 differ diff --git a/.git_disabled/objects/95/39f8bad3f827085b3fb60c5b231d6a4c60664f b/.git_disabled/objects/95/39f8bad3f827085b3fb60c5b231d6a4c60664f new file mode 100755 index 0000000..6be1583 Binary files /dev/null and b/.git_disabled/objects/95/39f8bad3f827085b3fb60c5b231d6a4c60664f differ diff --git a/.git_disabled/objects/95/53b8c164c381b845b95e44eeddc9e8dd2110a6 b/.git_disabled/objects/95/53b8c164c381b845b95e44eeddc9e8dd2110a6 new file mode 100755 index 0000000..856cc56 Binary files /dev/null and b/.git_disabled/objects/95/53b8c164c381b845b95e44eeddc9e8dd2110a6 differ diff --git a/.git_disabled/objects/95/775e118be1a064c4a21dedfc001f8d74a04bc5 b/.git_disabled/objects/95/775e118be1a064c4a21dedfc001f8d74a04bc5 new file mode 100755 index 0000000..6b57c6d Binary files /dev/null and b/.git_disabled/objects/95/775e118be1a064c4a21dedfc001f8d74a04bc5 differ diff --git a/.git_disabled/objects/95/7d642089cd85bae1d6c804d4e3ff646da77be1 b/.git_disabled/objects/95/7d642089cd85bae1d6c804d4e3ff646da77be1 new file mode 100755 index 0000000..edc3e00 Binary files /dev/null and b/.git_disabled/objects/95/7d642089cd85bae1d6c804d4e3ff646da77be1 differ diff --git a/.git_disabled/objects/95/7e88559e4661e30d1b12f8a071a82aeef0cd86 b/.git_disabled/objects/95/7e88559e4661e30d1b12f8a071a82aeef0cd86 new file mode 100755 index 0000000..5806550 Binary files /dev/null and b/.git_disabled/objects/95/7e88559e4661e30d1b12f8a071a82aeef0cd86 differ diff --git a/.git_disabled/objects/95/b325871ff9ae258c73cd424baaa1892d57b69e b/.git_disabled/objects/95/b325871ff9ae258c73cd424baaa1892d57b69e new file mode 100755 index 0000000..f40df35 Binary files /dev/null and b/.git_disabled/objects/95/b325871ff9ae258c73cd424baaa1892d57b69e differ diff --git a/.git_disabled/objects/95/c3af8bfdb7d7ed449669c8d714abc519eee944 b/.git_disabled/objects/95/c3af8bfdb7d7ed449669c8d714abc519eee944 new file mode 100755 index 0000000..522062f Binary files /dev/null and b/.git_disabled/objects/95/c3af8bfdb7d7ed449669c8d714abc519eee944 differ diff --git a/.git_disabled/objects/95/cf40d63fa15dd02cb42e0392ef67b889b23cff b/.git_disabled/objects/95/cf40d63fa15dd02cb42e0392ef67b889b23cff new file mode 100755 index 0000000..215d88f Binary files /dev/null and b/.git_disabled/objects/95/cf40d63fa15dd02cb42e0392ef67b889b23cff differ diff --git a/.git_disabled/objects/95/ebfae5f723e182eb2e74f7d89539476b637569 b/.git_disabled/objects/95/ebfae5f723e182eb2e74f7d89539476b637569 new file mode 100755 index 0000000..7d9301c Binary files /dev/null and b/.git_disabled/objects/95/ebfae5f723e182eb2e74f7d89539476b637569 differ diff --git a/.git_disabled/objects/95/ef1b3482e84d6959140f90d2eee14cbf310b46 b/.git_disabled/objects/95/ef1b3482e84d6959140f90d2eee14cbf310b46 new file mode 100755 index 0000000..170ccdd Binary files /dev/null and b/.git_disabled/objects/95/ef1b3482e84d6959140f90d2eee14cbf310b46 differ diff --git a/.git_disabled/objects/95/fade913d3920df1a6aa2e6f35108b6c7338910 b/.git_disabled/objects/95/fade913d3920df1a6aa2e6f35108b6c7338910 new file mode 100755 index 0000000..479c672 Binary files /dev/null and b/.git_disabled/objects/95/fade913d3920df1a6aa2e6f35108b6c7338910 differ diff --git a/.git_disabled/objects/96/02d0770be0ac5c3905e8060dd6cd5f4b0db66b b/.git_disabled/objects/96/02d0770be0ac5c3905e8060dd6cd5f4b0db66b new file mode 100755 index 0000000..61eefe7 Binary files /dev/null and b/.git_disabled/objects/96/02d0770be0ac5c3905e8060dd6cd5f4b0db66b differ diff --git a/.git_disabled/objects/96/25ccf3347e735c19bb072426a7bfdea4121590 b/.git_disabled/objects/96/25ccf3347e735c19bb072426a7bfdea4121590 new file mode 100755 index 0000000..1b41ed7 Binary files /dev/null and b/.git_disabled/objects/96/25ccf3347e735c19bb072426a7bfdea4121590 differ diff --git a/.git_disabled/objects/96/2f7a90834930a1e1fd3e8049513b3a667d5ac5 b/.git_disabled/objects/96/2f7a90834930a1e1fd3e8049513b3a667d5ac5 new file mode 100755 index 0000000..2bf4c9d Binary files /dev/null and b/.git_disabled/objects/96/2f7a90834930a1e1fd3e8049513b3a667d5ac5 differ diff --git a/.git_disabled/objects/96/363fad0d2b95d3b427b194ee36b597912db596 b/.git_disabled/objects/96/363fad0d2b95d3b427b194ee36b597912db596 new file mode 100755 index 0000000..d77c7b3 Binary files /dev/null and b/.git_disabled/objects/96/363fad0d2b95d3b427b194ee36b597912db596 differ diff --git a/.git_disabled/objects/96/37aa4181180b0348a1e95577c8680be3ab3e4c b/.git_disabled/objects/96/37aa4181180b0348a1e95577c8680be3ab3e4c new file mode 100755 index 0000000..f258c81 --- /dev/null +++ b/.git_disabled/objects/96/37aa4181180b0348a1e95577c8680be3ab3e4c @@ -0,0 +1,3 @@ +x}J@=)xi!Dz! J/"I&%n؝Q +}2$-wLnWV;H!VBiyQ%vZ_~L +%$1#+3x4gRTq:B0s o=*AI5By`3k~A1{T]qajxu=5Y푗=ڃFET6AC{aV9}_X*ʞ2ncfWSOzPB¬q-#t"$ ]l 5 \ No newline at end of file diff --git a/.git_disabled/objects/96/3eac530b9bc28d704d1bc410299c68e3216d4d b/.git_disabled/objects/96/3eac530b9bc28d704d1bc410299c68e3216d4d new file mode 100755 index 0000000..1653e9d Binary files /dev/null and b/.git_disabled/objects/96/3eac530b9bc28d704d1bc410299c68e3216d4d differ diff --git a/.git_disabled/objects/96/4271d594bd080f6c6b517672593ce5f3588976 b/.git_disabled/objects/96/4271d594bd080f6c6b517672593ce5f3588976 new file mode 100755 index 0000000..a1e69de Binary files /dev/null and b/.git_disabled/objects/96/4271d594bd080f6c6b517672593ce5f3588976 differ diff --git a/.git_disabled/objects/96/5a43bf33eeff0d7ec8fee032e7e71b7cbb1860 b/.git_disabled/objects/96/5a43bf33eeff0d7ec8fee032e7e71b7cbb1860 new file mode 100755 index 0000000..1fef1d9 Binary files /dev/null and b/.git_disabled/objects/96/5a43bf33eeff0d7ec8fee032e7e71b7cbb1860 differ diff --git a/.git_disabled/objects/96/5bbfe638771eee975c965ee5a7bdd36790a6de b/.git_disabled/objects/96/5bbfe638771eee975c965ee5a7bdd36790a6de new file mode 100755 index 0000000..2bcbbc1 Binary files /dev/null and b/.git_disabled/objects/96/5bbfe638771eee975c965ee5a7bdd36790a6de differ diff --git a/.git_disabled/objects/96/5da8c7c62be3a0aec01d2b9bd536caad1f5c01 b/.git_disabled/objects/96/5da8c7c62be3a0aec01d2b9bd536caad1f5c01 new file mode 100755 index 0000000..7286fb8 Binary files /dev/null and b/.git_disabled/objects/96/5da8c7c62be3a0aec01d2b9bd536caad1f5c01 differ diff --git a/.git_disabled/objects/96/65e2eb8aeaf7287d857335a387eafe31b5e9a6 b/.git_disabled/objects/96/65e2eb8aeaf7287d857335a387eafe31b5e9a6 new file mode 100755 index 0000000..af56dd0 --- /dev/null +++ b/.git_disabled/objects/96/65e2eb8aeaf7287d857335a387eafe31b5e9a6 @@ -0,0 +1,2 @@ +xUsFYki`ZxŒfd@R"i},h BBjnL=tr#:ez'l\k~Tf̯{pX&)\ }}۲{xBIO*~u]\t|CjfgcJߺ~2㘜oSS:2"^l]],kMZ4z<Ǎ#@*T "eh W2UbKXK9iR0eSG<煘luexXYV<E> BQSe,~LAʞBc4H> E95+9dy⑞,)HȀ/H%,eJ)' \ No newline at end of file diff --git a/.git_disabled/objects/96/87aa5886cf7f3726a5dc7f1783a4a60c1f27be b/.git_disabled/objects/96/87aa5886cf7f3726a5dc7f1783a4a60c1f27be new file mode 100755 index 0000000..fd37c93 Binary files /dev/null and b/.git_disabled/objects/96/87aa5886cf7f3726a5dc7f1783a4a60c1f27be differ diff --git a/.git_disabled/objects/96/87b5065b11d42239249dcf7cc41f99e0a3a145 b/.git_disabled/objects/96/87b5065b11d42239249dcf7cc41f99e0a3a145 new file mode 100755 index 0000000..17692ef Binary files /dev/null and b/.git_disabled/objects/96/87b5065b11d42239249dcf7cc41f99e0a3a145 differ diff --git a/.git_disabled/objects/96/990c391724c0dd2b3868ae220c929e16a73959 b/.git_disabled/objects/96/990c391724c0dd2b3868ae220c929e16a73959 new file mode 100755 index 0000000..4038abd Binary files /dev/null and b/.git_disabled/objects/96/990c391724c0dd2b3868ae220c929e16a73959 differ diff --git a/.git_disabled/objects/96/a0a5855b0d30add274c72467fa58c5182d422e b/.git_disabled/objects/96/a0a5855b0d30add274c72467fa58c5182d422e new file mode 100755 index 0000000..d81e999 Binary files /dev/null and b/.git_disabled/objects/96/a0a5855b0d30add274c72467fa58c5182d422e differ diff --git a/.git_disabled/objects/96/abc7df694c9431408d3b8dae351c7296014428 b/.git_disabled/objects/96/abc7df694c9431408d3b8dae351c7296014428 new file mode 100755 index 0000000..e2a2574 Binary files /dev/null and b/.git_disabled/objects/96/abc7df694c9431408d3b8dae351c7296014428 differ diff --git a/.git_disabled/objects/96/ad3f4ae995794c79e35614653ffaae8af97fe1 b/.git_disabled/objects/96/ad3f4ae995794c79e35614653ffaae8af97fe1 new file mode 100755 index 0000000..fec35c8 Binary files /dev/null and b/.git_disabled/objects/96/ad3f4ae995794c79e35614653ffaae8af97fe1 differ diff --git a/.git_disabled/objects/96/c17cf1700fd501df2113713307251fff8d095c b/.git_disabled/objects/96/c17cf1700fd501df2113713307251fff8d095c new file mode 100755 index 0000000..6ce322b --- /dev/null +++ b/.git_disabled/objects/96/c17cf1700fd501df2113713307251fff8d095c @@ -0,0 +1,6 @@ +xuTMo0 ٿKQDiZeEO[P6RӉGDkH'N5XǏyp}sGJ3Oy|դcKBcmbHB[2{lٱjoM[ꗁvŻr',!XGv~<-o1W !k6.mnŚ.e9%ߘKhRLTO +¶ٟy9i\ +N¾`B9:)ONk +&97QvI\)n733f2X7!!YDu鄶.Q?Kd?Ky +[Ɠ((sGsOC4q%{s@ OwhZ(2P_ERaGw|jc BX,O}HOaeʣs]]4sP|QpQĻ>ŗ9(T>'Fs޹HeQ⺨ ++լ|nb[E{KmzJ]u \ No newline at end of file diff --git a/.git_disabled/objects/96/d91484867a81d86ed38891bbb91296454ed0e4 b/.git_disabled/objects/96/d91484867a81d86ed38891bbb91296454ed0e4 new file mode 100755 index 0000000..dcbcc05 Binary files /dev/null and b/.git_disabled/objects/96/d91484867a81d86ed38891bbb91296454ed0e4 differ diff --git a/.git_disabled/objects/96/e973d0ce223f6bed9be9e6a6a2f3c01622c611 b/.git_disabled/objects/96/e973d0ce223f6bed9be9e6a6a2f3c01622c611 new file mode 100755 index 0000000..c6a4083 Binary files /dev/null and b/.git_disabled/objects/96/e973d0ce223f6bed9be9e6a6a2f3c01622c611 differ diff --git a/.git_disabled/objects/96/f0d302d51e8e03f7b6495de00f9e567dfeee17 b/.git_disabled/objects/96/f0d302d51e8e03f7b6495de00f9e567dfeee17 new file mode 100755 index 0000000..ab45dda Binary files /dev/null and b/.git_disabled/objects/96/f0d302d51e8e03f7b6495de00f9e567dfeee17 differ diff --git a/.git_disabled/objects/96/f7c99023c35f5778da9e144763975aa2abcc23 b/.git_disabled/objects/96/f7c99023c35f5778da9e144763975aa2abcc23 new file mode 100755 index 0000000..96caf0b Binary files /dev/null and b/.git_disabled/objects/96/f7c99023c35f5778da9e144763975aa2abcc23 differ diff --git a/.git_disabled/objects/97/056344897289c2fa254b426e0af968137545e7 b/.git_disabled/objects/97/056344897289c2fa254b426e0af968137545e7 new file mode 100755 index 0000000..553967d Binary files /dev/null and b/.git_disabled/objects/97/056344897289c2fa254b426e0af968137545e7 differ diff --git a/.git_disabled/objects/97/1245b9f83668e3772452fe4c77c792ed3fe7bd b/.git_disabled/objects/97/1245b9f83668e3772452fe4c77c792ed3fe7bd new file mode 100755 index 0000000..7d3d46c Binary files /dev/null and b/.git_disabled/objects/97/1245b9f83668e3772452fe4c77c792ed3fe7bd differ diff --git a/.git_disabled/objects/97/1dc51e9afd55dc98a32f0ea854e1b5d8435e2a b/.git_disabled/objects/97/1dc51e9afd55dc98a32f0ea854e1b5d8435e2a new file mode 100755 index 0000000..82a0ed7 Binary files /dev/null and b/.git_disabled/objects/97/1dc51e9afd55dc98a32f0ea854e1b5d8435e2a differ diff --git a/.git_disabled/objects/97/2e8517687bd65ae2b3b5f5de2da1015790caa5 b/.git_disabled/objects/97/2e8517687bd65ae2b3b5f5de2da1015790caa5 new file mode 100755 index 0000000..83996cc Binary files /dev/null and b/.git_disabled/objects/97/2e8517687bd65ae2b3b5f5de2da1015790caa5 differ diff --git a/.git_disabled/objects/97/407b5b76843c5e57f775dfd3e470664e1312e0 b/.git_disabled/objects/97/407b5b76843c5e57f775dfd3e470664e1312e0 new file mode 100755 index 0000000..8ba20e6 Binary files /dev/null and b/.git_disabled/objects/97/407b5b76843c5e57f775dfd3e470664e1312e0 differ diff --git a/.git_disabled/objects/97/41288e8cc36917b0cf5d60261879e98bd6e94e b/.git_disabled/objects/97/41288e8cc36917b0cf5d60261879e98bd6e94e new file mode 100755 index 0000000..ac3c320 Binary files /dev/null and b/.git_disabled/objects/97/41288e8cc36917b0cf5d60261879e98bd6e94e differ diff --git a/.git_disabled/objects/97/43ab51b56738e20d1bcaa70ea1e01c599299dd b/.git_disabled/objects/97/43ab51b56738e20d1bcaa70ea1e01c599299dd new file mode 100755 index 0000000..6f004cc Binary files /dev/null and b/.git_disabled/objects/97/43ab51b56738e20d1bcaa70ea1e01c599299dd differ diff --git a/.git_disabled/objects/97/479cb75f7f8e512870bf4264c7c964b1b43793 b/.git_disabled/objects/97/479cb75f7f8e512870bf4264c7c964b1b43793 new file mode 100755 index 0000000..e73fafb Binary files /dev/null and b/.git_disabled/objects/97/479cb75f7f8e512870bf4264c7c964b1b43793 differ diff --git a/.git_disabled/objects/97/51c76ccb18711846a046e06c28912c5cb248a4 b/.git_disabled/objects/97/51c76ccb18711846a046e06c28912c5cb248a4 new file mode 100755 index 0000000..fcf70c6 Binary files /dev/null and b/.git_disabled/objects/97/51c76ccb18711846a046e06c28912c5cb248a4 differ diff --git a/.git_disabled/objects/97/55ff106e807cc301a56c0d7620bace0b1ead05 b/.git_disabled/objects/97/55ff106e807cc301a56c0d7620bace0b1ead05 new file mode 100755 index 0000000..3ed094b Binary files /dev/null and b/.git_disabled/objects/97/55ff106e807cc301a56c0d7620bace0b1ead05 differ diff --git a/.git_disabled/objects/97/670dd45cfa0626bebf8dd582d1170221737d5e b/.git_disabled/objects/97/670dd45cfa0626bebf8dd582d1170221737d5e new file mode 100755 index 0000000..3bde50c Binary files /dev/null and b/.git_disabled/objects/97/670dd45cfa0626bebf8dd582d1170221737d5e differ diff --git a/.git_disabled/objects/97/6b873d4d393e6f8a6b290949b6c1bdce958a50 b/.git_disabled/objects/97/6b873d4d393e6f8a6b290949b6c1bdce958a50 new file mode 100755 index 0000000..7a277cb Binary files /dev/null and b/.git_disabled/objects/97/6b873d4d393e6f8a6b290949b6c1bdce958a50 differ diff --git a/.git_disabled/objects/97/adb95286cc9a8218f390f749d855252aa075ff b/.git_disabled/objects/97/adb95286cc9a8218f390f749d855252aa075ff new file mode 100755 index 0000000..800066e Binary files /dev/null and b/.git_disabled/objects/97/adb95286cc9a8218f390f749d855252aa075ff differ diff --git a/.git_disabled/objects/97/b3d8d96d10b563e26fd25cb22f7b4f99d83057 b/.git_disabled/objects/97/b3d8d96d10b563e26fd25cb22f7b4f99d83057 new file mode 100755 index 0000000..78819de Binary files /dev/null and b/.git_disabled/objects/97/b3d8d96d10b563e26fd25cb22f7b4f99d83057 differ diff --git a/.git_disabled/objects/97/c07a68e3038ea70301d07e89c5b245806e41e1 b/.git_disabled/objects/97/c07a68e3038ea70301d07e89c5b245806e41e1 new file mode 100755 index 0000000..aa15616 Binary files /dev/null and b/.git_disabled/objects/97/c07a68e3038ea70301d07e89c5b245806e41e1 differ diff --git a/.git_disabled/objects/97/cf86a2dd5ecd662cbeb772d9d67e5038602a74 b/.git_disabled/objects/97/cf86a2dd5ecd662cbeb772d9d67e5038602a74 new file mode 100755 index 0000000..f3a9d21 Binary files /dev/null and b/.git_disabled/objects/97/cf86a2dd5ecd662cbeb772d9d67e5038602a74 differ diff --git a/.git_disabled/objects/97/e6916b62bfb263934bac8be56eb8fd0f4cc791 b/.git_disabled/objects/97/e6916b62bfb263934bac8be56eb8fd0f4cc791 new file mode 100755 index 0000000..7a0a7e5 Binary files /dev/null and b/.git_disabled/objects/97/e6916b62bfb263934bac8be56eb8fd0f4cc791 differ diff --git a/.git_disabled/objects/98/04fe57e2f1e3250cceea1860701df3d793bf01 b/.git_disabled/objects/98/04fe57e2f1e3250cceea1860701df3d793bf01 new file mode 100755 index 0000000..3662594 Binary files /dev/null and b/.git_disabled/objects/98/04fe57e2f1e3250cceea1860701df3d793bf01 differ diff --git a/.git_disabled/objects/98/0cd586d75ca4d8fdc801755bd3c8d53935b683 b/.git_disabled/objects/98/0cd586d75ca4d8fdc801755bd3c8d53935b683 new file mode 100755 index 0000000..2a81e82 Binary files /dev/null and b/.git_disabled/objects/98/0cd586d75ca4d8fdc801755bd3c8d53935b683 differ diff --git a/.git_disabled/objects/98/1b48e6968caf9392e5bef60023360097041b1b b/.git_disabled/objects/98/1b48e6968caf9392e5bef60023360097041b1b new file mode 100755 index 0000000..f556219 Binary files /dev/null and b/.git_disabled/objects/98/1b48e6968caf9392e5bef60023360097041b1b differ diff --git a/.git_disabled/objects/98/447d6e0f61192bb157146fa4d331b580fa59be b/.git_disabled/objects/98/447d6e0f61192bb157146fa4d331b580fa59be new file mode 100755 index 0000000..94ebf94 Binary files /dev/null and b/.git_disabled/objects/98/447d6e0f61192bb157146fa4d331b580fa59be differ diff --git a/.git_disabled/objects/98/495f3c58ec36dba11e31b778eb80957750090a b/.git_disabled/objects/98/495f3c58ec36dba11e31b778eb80957750090a new file mode 100755 index 0000000..dbb7107 Binary files /dev/null and b/.git_disabled/objects/98/495f3c58ec36dba11e31b778eb80957750090a differ diff --git a/.git_disabled/objects/98/5660b6c78e687ee8133ad723640d1783a423a2 b/.git_disabled/objects/98/5660b6c78e687ee8133ad723640d1783a423a2 new file mode 100755 index 0000000..6444b00 Binary files /dev/null and b/.git_disabled/objects/98/5660b6c78e687ee8133ad723640d1783a423a2 differ diff --git a/.git_disabled/objects/98/6c072d19971bf7f14caf421f66e975b8587df2 b/.git_disabled/objects/98/6c072d19971bf7f14caf421f66e975b8587df2 new file mode 100755 index 0000000..b935623 Binary files /dev/null and b/.git_disabled/objects/98/6c072d19971bf7f14caf421f66e975b8587df2 differ diff --git a/.git_disabled/objects/98/6df2a444b747931781f080a33561d99b7c376c b/.git_disabled/objects/98/6df2a444b747931781f080a33561d99b7c376c new file mode 100755 index 0000000..3b5b6a5 Binary files /dev/null and b/.git_disabled/objects/98/6df2a444b747931781f080a33561d99b7c376c differ diff --git a/.git_disabled/objects/98/7241fd6458d22e0134a2de011b8c4e912df4aa b/.git_disabled/objects/98/7241fd6458d22e0134a2de011b8c4e912df4aa new file mode 100755 index 0000000..320647d Binary files /dev/null and b/.git_disabled/objects/98/7241fd6458d22e0134a2de011b8c4e912df4aa differ diff --git a/.git_disabled/objects/98/8b95f6b76288160c90a2297b4e5df7906790f8 b/.git_disabled/objects/98/8b95f6b76288160c90a2297b4e5df7906790f8 new file mode 100755 index 0000000..12387e5 --- /dev/null +++ b/.git_disabled/objects/98/8b95f6b76288160c90a2297b4e5df7906790f8 @@ -0,0 +1,2 @@ +xuAO0 9WDIh&C\qC(&!v'quٯ/wUةruw91O9a:9z5D6s2r4qmOV' | ޕ/j]cxTn娽Evl|&;ZYƙf P +Ի(X $.VB7t+Yv #?Sп080T:&.F(U(I \äcDoZi0G-Nl \ No newline at end of file diff --git a/.git_disabled/objects/98/9e92c3458681a6f0be72ae4105ea742750d328 b/.git_disabled/objects/98/9e92c3458681a6f0be72ae4105ea742750d328 new file mode 100755 index 0000000..7eb25ef Binary files /dev/null and b/.git_disabled/objects/98/9e92c3458681a6f0be72ae4105ea742750d328 differ diff --git a/.git_disabled/objects/98/b42b4ff9af047130c3762080334ea3c854a0ba b/.git_disabled/objects/98/b42b4ff9af047130c3762080334ea3c854a0ba new file mode 100755 index 0000000..a3c13f4 Binary files /dev/null and b/.git_disabled/objects/98/b42b4ff9af047130c3762080334ea3c854a0ba differ diff --git a/.git_disabled/objects/98/be8b1fa8e561d2c4b8e98884a3c9fd42964fd6 b/.git_disabled/objects/98/be8b1fa8e561d2c4b8e98884a3c9fd42964fd6 new file mode 100755 index 0000000..f3e3525 Binary files /dev/null and b/.git_disabled/objects/98/be8b1fa8e561d2c4b8e98884a3c9fd42964fd6 differ diff --git a/.git_disabled/objects/98/c8ca4c1a3b908273ff457b268db4b579170440 b/.git_disabled/objects/98/c8ca4c1a3b908273ff457b268db4b579170440 new file mode 100755 index 0000000..f75e886 Binary files /dev/null and b/.git_disabled/objects/98/c8ca4c1a3b908273ff457b268db4b579170440 differ diff --git a/.git_disabled/objects/98/d8396b01b0a8b8a012f8bd67fcebe8f26fc368 b/.git_disabled/objects/98/d8396b01b0a8b8a012f8bd67fcebe8f26fc368 new file mode 100755 index 0000000..9829f0a Binary files /dev/null and b/.git_disabled/objects/98/d8396b01b0a8b8a012f8bd67fcebe8f26fc368 differ diff --git a/.git_disabled/objects/98/d9bcb75a685dfbfd60f611c309410152935b3d b/.git_disabled/objects/98/d9bcb75a685dfbfd60f611c309410152935b3d new file mode 100755 index 0000000..f6e750c Binary files /dev/null and b/.git_disabled/objects/98/d9bcb75a685dfbfd60f611c309410152935b3d differ diff --git a/.git_disabled/objects/98/dc0640cb739e0140876f05978e171c4f2f2222 b/.git_disabled/objects/98/dc0640cb739e0140876f05978e171c4f2f2222 new file mode 100755 index 0000000..5af8549 Binary files /dev/null and b/.git_disabled/objects/98/dc0640cb739e0140876f05978e171c4f2f2222 differ diff --git a/.git_disabled/objects/98/e4f9c44effe479ed38c66ba922e7bcc672916f b/.git_disabled/objects/98/e4f9c44effe479ed38c66ba922e7bcc672916f new file mode 100755 index 0000000..603ae16 Binary files /dev/null and b/.git_disabled/objects/98/e4f9c44effe479ed38c66ba922e7bcc672916f differ diff --git a/.git_disabled/objects/98/fcbdbbd531d696cf5c50a7c21fa7a32a197391 b/.git_disabled/objects/98/fcbdbbd531d696cf5c50a7c21fa7a32a197391 new file mode 100755 index 0000000..b07958a Binary files /dev/null and b/.git_disabled/objects/98/fcbdbbd531d696cf5c50a7c21fa7a32a197391 differ diff --git a/.git_disabled/objects/98/fd8de80dc3a6706db9602691ede062aa34c320 b/.git_disabled/objects/98/fd8de80dc3a6706db9602691ede062aa34c320 new file mode 100755 index 0000000..b605fab Binary files /dev/null and b/.git_disabled/objects/98/fd8de80dc3a6706db9602691ede062aa34c320 differ diff --git a/.git_disabled/objects/98/ffeaf726c7fcc4b0c4a755fcf8c98159a9bc09 b/.git_disabled/objects/98/ffeaf726c7fcc4b0c4a755fcf8c98159a9bc09 new file mode 100755 index 0000000..76a44a3 Binary files /dev/null and b/.git_disabled/objects/98/ffeaf726c7fcc4b0c4a755fcf8c98159a9bc09 differ diff --git a/.git_disabled/objects/99/09f9684031bfd4698577130f2ad31cf983044b b/.git_disabled/objects/99/09f9684031bfd4698577130f2ad31cf983044b new file mode 100755 index 0000000..3fdfc9f Binary files /dev/null and b/.git_disabled/objects/99/09f9684031bfd4698577130f2ad31cf983044b differ diff --git a/.git_disabled/objects/99/171c40e0753f85f7f442a6ed4bb4d674f41993 b/.git_disabled/objects/99/171c40e0753f85f7f442a6ed4bb4d674f41993 new file mode 100755 index 0000000..b81c510 Binary files /dev/null and b/.git_disabled/objects/99/171c40e0753f85f7f442a6ed4bb4d674f41993 differ diff --git a/.git_disabled/objects/99/187e0a95459745feb11f039863d2b67fa2b0f3 b/.git_disabled/objects/99/187e0a95459745feb11f039863d2b67fa2b0f3 new file mode 100755 index 0000000..edcf1df Binary files /dev/null and b/.git_disabled/objects/99/187e0a95459745feb11f039863d2b67fa2b0f3 differ diff --git a/.git_disabled/objects/99/1c25f03d28b3b2f9cf61e0f0ba31f368b9eed2 b/.git_disabled/objects/99/1c25f03d28b3b2f9cf61e0f0ba31f368b9eed2 new file mode 100755 index 0000000..ccc8190 Binary files /dev/null and b/.git_disabled/objects/99/1c25f03d28b3b2f9cf61e0f0ba31f368b9eed2 differ diff --git a/.git_disabled/objects/99/2b2029608028800f97d7de186250cd12490573 b/.git_disabled/objects/99/2b2029608028800f97d7de186250cd12490573 new file mode 100755 index 0000000..cf1f35c Binary files /dev/null and b/.git_disabled/objects/99/2b2029608028800f97d7de186250cd12490573 differ diff --git a/.git_disabled/objects/99/5cfeca74a3418a225e426cedf4f2d0529fa6a1 b/.git_disabled/objects/99/5cfeca74a3418a225e426cedf4f2d0529fa6a1 new file mode 100755 index 0000000..6b6a8f4 Binary files /dev/null and b/.git_disabled/objects/99/5cfeca74a3418a225e426cedf4f2d0529fa6a1 differ diff --git a/.git_disabled/objects/99/74bad1a5a970b8d7fc7de82258ad92b653f27f b/.git_disabled/objects/99/74bad1a5a970b8d7fc7de82258ad92b653f27f new file mode 100755 index 0000000..542bdd4 Binary files /dev/null and b/.git_disabled/objects/99/74bad1a5a970b8d7fc7de82258ad92b653f27f differ diff --git a/.git_disabled/objects/99/85f0798cdb16d826785690caac56bfa3794ca6 b/.git_disabled/objects/99/85f0798cdb16d826785690caac56bfa3794ca6 new file mode 100755 index 0000000..dfbbe2f Binary files /dev/null and b/.git_disabled/objects/99/85f0798cdb16d826785690caac56bfa3794ca6 differ diff --git a/.git_disabled/objects/99/866829cb4035a3298e3b46c57663b8b94ca65d b/.git_disabled/objects/99/866829cb4035a3298e3b46c57663b8b94ca65d new file mode 100755 index 0000000..31dccdf Binary files /dev/null and b/.git_disabled/objects/99/866829cb4035a3298e3b46c57663b8b94ca65d differ diff --git a/.git_disabled/objects/99/9724440bcaf441af3cf9d5a846d757b9ad575b b/.git_disabled/objects/99/9724440bcaf441af3cf9d5a846d757b9ad575b new file mode 100755 index 0000000..edb133d Binary files /dev/null and b/.git_disabled/objects/99/9724440bcaf441af3cf9d5a846d757b9ad575b differ diff --git a/.git_disabled/objects/99/9a71e9a859e5ec90ebbc456083059dcdfc7626 b/.git_disabled/objects/99/9a71e9a859e5ec90ebbc456083059dcdfc7626 new file mode 100755 index 0000000..ed327ba Binary files /dev/null and b/.git_disabled/objects/99/9a71e9a859e5ec90ebbc456083059dcdfc7626 differ diff --git a/.git_disabled/objects/99/a18970907e09e8ffc6a262c3041dd5c0dcbb37 b/.git_disabled/objects/99/a18970907e09e8ffc6a262c3041dd5c0dcbb37 new file mode 100755 index 0000000..7277adf Binary files /dev/null and b/.git_disabled/objects/99/a18970907e09e8ffc6a262c3041dd5c0dcbb37 differ diff --git a/.git_disabled/objects/99/b19c994211a5a35a3683529a40aa3aec94d799 b/.git_disabled/objects/99/b19c994211a5a35a3683529a40aa3aec94d799 new file mode 100755 index 0000000..42a8736 Binary files /dev/null and b/.git_disabled/objects/99/b19c994211a5a35a3683529a40aa3aec94d799 differ diff --git a/.git_disabled/objects/99/b53a0b3d5a15e403f9c33f463eb7474eeb6d47 b/.git_disabled/objects/99/b53a0b3d5a15e403f9c33f463eb7474eeb6d47 new file mode 100755 index 0000000..24a24d7 Binary files /dev/null and b/.git_disabled/objects/99/b53a0b3d5a15e403f9c33f463eb7474eeb6d47 differ diff --git a/.git_disabled/objects/99/b55473220ad0c1876201d06dfe922ab23ede3a b/.git_disabled/objects/99/b55473220ad0c1876201d06dfe922ab23ede3a new file mode 100755 index 0000000..592b5d0 Binary files /dev/null and b/.git_disabled/objects/99/b55473220ad0c1876201d06dfe922ab23ede3a differ diff --git a/.git_disabled/objects/99/c3661cc697a4aabef3703908c5a91bc20dea08 b/.git_disabled/objects/99/c3661cc697a4aabef3703908c5a91bc20dea08 new file mode 100755 index 0000000..4bde669 Binary files /dev/null and b/.git_disabled/objects/99/c3661cc697a4aabef3703908c5a91bc20dea08 differ diff --git a/.git_disabled/objects/99/cec23411d1762aadad89b1c53892da17a2e065 b/.git_disabled/objects/99/cec23411d1762aadad89b1c53892da17a2e065 new file mode 100755 index 0000000..39ae17e Binary files /dev/null and b/.git_disabled/objects/99/cec23411d1762aadad89b1c53892da17a2e065 differ diff --git a/.git_disabled/objects/99/db636ccffadb0b67038a0af61777625cfdf0a3 b/.git_disabled/objects/99/db636ccffadb0b67038a0af61777625cfdf0a3 new file mode 100755 index 0000000..e3c6abc Binary files /dev/null and b/.git_disabled/objects/99/db636ccffadb0b67038a0af61777625cfdf0a3 differ diff --git a/.git_disabled/objects/99/e770efa74ec9ac5529830170e95728581a17ea b/.git_disabled/objects/99/e770efa74ec9ac5529830170e95728581a17ea new file mode 100755 index 0000000..377da08 Binary files /dev/null and b/.git_disabled/objects/99/e770efa74ec9ac5529830170e95728581a17ea differ diff --git a/.git_disabled/objects/99/e7ba19816aac3e92b51a3eb5c8430ecaa158aa b/.git_disabled/objects/99/e7ba19816aac3e92b51a3eb5c8430ecaa158aa new file mode 100755 index 0000000..678cd16 Binary files /dev/null and b/.git_disabled/objects/99/e7ba19816aac3e92b51a3eb5c8430ecaa158aa differ diff --git a/.git_disabled/objects/99/e9fef70332071ce0c651c739cb5e64f42b2957 b/.git_disabled/objects/99/e9fef70332071ce0c651c739cb5e64f42b2957 new file mode 100755 index 0000000..7066a7a Binary files /dev/null and b/.git_disabled/objects/99/e9fef70332071ce0c651c739cb5e64f42b2957 differ diff --git a/.git_disabled/objects/9a/0b13afd3da3faa7936ba61fa1f192a1cee1a52 b/.git_disabled/objects/9a/0b13afd3da3faa7936ba61fa1f192a1cee1a52 new file mode 100755 index 0000000..f6f828d --- /dev/null +++ b/.git_disabled/objects/9a/0b13afd3da3faa7936ba61fa1f192a1cee1a52 @@ -0,0 +1,4 @@ +xTMo0 ٿB7;a$r)ú@u\zhqÓtް>ɲc/^>ʹj^}8h%΁G-aVڒϊ7BAZPj&*\ X3)WY%Mؔ|kjVD3ghphd<uQTp0 `|ՉYD}Z9JH)ْ==S]+6^)7$.BñҕӧWxwa0fHl8]k4q._nDR+`Ȉ_8czYU:/PcP_3v+xSG0DZ̬ 3 +Ng nQ-L9Q2,QZդl.ijzkaUtf1%hHQfZfrbIf~^|I~vjĚt%I,aO,<ŮSNЁ[b`jjfY 4&)85'3/5ñ 'T?pj|,NK}jqjY|QjRifNJ|qrFjn"6M|Xi_33)15 `C_ZLpa͎ 7{_^36rB\g-Sa ̼t VgRc>FP S RLԒ 3r]b{߮^)ѓ$ \ No newline at end of file diff --git a/.git_disabled/objects/9b/db0ee81ee7c858277fe54d3937ce134e23d448 b/.git_disabled/objects/9b/db0ee81ee7c858277fe54d3937ce134e23d448 new file mode 100755 index 0000000..5d13b98 Binary files /dev/null and b/.git_disabled/objects/9b/db0ee81ee7c858277fe54d3937ce134e23d448 differ diff --git a/.git_disabled/objects/9b/e0813b584b396a31f3e7f0d4fcf7983f043c82 b/.git_disabled/objects/9b/e0813b584b396a31f3e7f0d4fcf7983f043c82 new file mode 100755 index 0000000..360a985 Binary files /dev/null and b/.git_disabled/objects/9b/e0813b584b396a31f3e7f0d4fcf7983f043c82 differ diff --git a/.git_disabled/objects/9b/e3ecb95a5f4ca31cfb3c3d0e1113e6bf5e0dfb b/.git_disabled/objects/9b/e3ecb95a5f4ca31cfb3c3d0e1113e6bf5e0dfb new file mode 100755 index 0000000..327df4c Binary files /dev/null and b/.git_disabled/objects/9b/e3ecb95a5f4ca31cfb3c3d0e1113e6bf5e0dfb differ diff --git a/.git_disabled/objects/9b/f2841cc5db99d0c2b5577f4d80883aa645da0a b/.git_disabled/objects/9b/f2841cc5db99d0c2b5577f4d80883aa645da0a new file mode 100755 index 0000000..3c60251 Binary files /dev/null and b/.git_disabled/objects/9b/f2841cc5db99d0c2b5577f4d80883aa645da0a differ diff --git a/.git_disabled/objects/9c/07bf1800063a0e372b0b2d25be0eed0627268c b/.git_disabled/objects/9c/07bf1800063a0e372b0b2d25be0eed0627268c new file mode 100755 index 0000000..e6cd354 Binary files /dev/null and b/.git_disabled/objects/9c/07bf1800063a0e372b0b2d25be0eed0627268c differ diff --git a/.git_disabled/objects/9c/0e439df4c3b3421dd67ad1d79756e7a0185cdc b/.git_disabled/objects/9c/0e439df4c3b3421dd67ad1d79756e7a0185cdc new file mode 100755 index 0000000..50b7600 Binary files /dev/null and b/.git_disabled/objects/9c/0e439df4c3b3421dd67ad1d79756e7a0185cdc differ diff --git a/.git_disabled/objects/9c/15fb4090877f15fe7952e4c08142bb6d702340 b/.git_disabled/objects/9c/15fb4090877f15fe7952e4c08142bb6d702340 new file mode 100755 index 0000000..c06b351 Binary files /dev/null and b/.git_disabled/objects/9c/15fb4090877f15fe7952e4c08142bb6d702340 differ diff --git a/.git_disabled/objects/9c/18af84912c6eddfddf88f5083f42211dfa07e3 b/.git_disabled/objects/9c/18af84912c6eddfddf88f5083f42211dfa07e3 new file mode 100755 index 0000000..feb5222 Binary files /dev/null and b/.git_disabled/objects/9c/18af84912c6eddfddf88f5083f42211dfa07e3 differ diff --git a/.git_disabled/objects/9c/1df46aea8c695101ea1ae4a2d770446f0eacac b/.git_disabled/objects/9c/1df46aea8c695101ea1ae4a2d770446f0eacac new file mode 100755 index 0000000..fc6d804 Binary files /dev/null and b/.git_disabled/objects/9c/1df46aea8c695101ea1ae4a2d770446f0eacac differ diff --git a/.git_disabled/objects/9c/1e83d38f663fb534cdeedbe138ad59ef9b5a3d b/.git_disabled/objects/9c/1e83d38f663fb534cdeedbe138ad59ef9b5a3d new file mode 100755 index 0000000..c101f78 Binary files /dev/null and b/.git_disabled/objects/9c/1e83d38f663fb534cdeedbe138ad59ef9b5a3d differ diff --git a/.git_disabled/objects/9c/24ff26f119d733de5c0623d430ac2385d1dce7 b/.git_disabled/objects/9c/24ff26f119d733de5c0623d430ac2385d1dce7 new file mode 100755 index 0000000..0a9036c Binary files /dev/null and b/.git_disabled/objects/9c/24ff26f119d733de5c0623d430ac2385d1dce7 differ diff --git a/.git_disabled/objects/9c/31499ab76e5e8061c9fd4e643d06e39ea24688 b/.git_disabled/objects/9c/31499ab76e5e8061c9fd4e643d06e39ea24688 new file mode 100755 index 0000000..4637de3 Binary files /dev/null and b/.git_disabled/objects/9c/31499ab76e5e8061c9fd4e643d06e39ea24688 differ diff --git a/.git_disabled/objects/9c/52bee599885592ed64adfe57c92ea9fc22fbde b/.git_disabled/objects/9c/52bee599885592ed64adfe57c92ea9fc22fbde new file mode 100755 index 0000000..e702406 Binary files /dev/null and b/.git_disabled/objects/9c/52bee599885592ed64adfe57c92ea9fc22fbde differ diff --git a/.git_disabled/objects/9c/59ea335955082392fdc01685acc1f90188ca6b b/.git_disabled/objects/9c/59ea335955082392fdc01685acc1f90188ca6b new file mode 100755 index 0000000..95632ce Binary files /dev/null and b/.git_disabled/objects/9c/59ea335955082392fdc01685acc1f90188ca6b differ diff --git a/.git_disabled/objects/9c/679368716b48ff449e0a512ef5ffd12929dfc8 b/.git_disabled/objects/9c/679368716b48ff449e0a512ef5ffd12929dfc8 new file mode 100755 index 0000000..abb297d Binary files /dev/null and b/.git_disabled/objects/9c/679368716b48ff449e0a512ef5ffd12929dfc8 differ diff --git a/.git_disabled/objects/9c/73d2539da0b67f354aa6fb541a862a7660f989 b/.git_disabled/objects/9c/73d2539da0b67f354aa6fb541a862a7660f989 new file mode 100755 index 0000000..a1fcb37 Binary files /dev/null and b/.git_disabled/objects/9c/73d2539da0b67f354aa6fb541a862a7660f989 differ diff --git a/.git_disabled/objects/9c/80bc2210a82efd7f0b15131ce8a92aa1816b1e b/.git_disabled/objects/9c/80bc2210a82efd7f0b15131ce8a92aa1816b1e new file mode 100755 index 0000000..4cf0ab0 Binary files /dev/null and b/.git_disabled/objects/9c/80bc2210a82efd7f0b15131ce8a92aa1816b1e differ diff --git a/.git_disabled/objects/9c/8f07c235089d09e3f0af784f860fe13091f69f b/.git_disabled/objects/9c/8f07c235089d09e3f0af784f860fe13091f69f new file mode 100755 index 0000000..76f5deb Binary files /dev/null and b/.git_disabled/objects/9c/8f07c235089d09e3f0af784f860fe13091f69f differ diff --git a/.git_disabled/objects/9c/ab3b9ad0445ee84f4a87ec176da968c1c1efc4 b/.git_disabled/objects/9c/ab3b9ad0445ee84f4a87ec176da968c1c1efc4 new file mode 100755 index 0000000..f8fa53a Binary files /dev/null and b/.git_disabled/objects/9c/ab3b9ad0445ee84f4a87ec176da968c1c1efc4 differ diff --git a/.git_disabled/objects/9c/c5dc70a05365bcd86317c7062fa2cb9c39cfee b/.git_disabled/objects/9c/c5dc70a05365bcd86317c7062fa2cb9c39cfee new file mode 100755 index 0000000..a4429a8 Binary files /dev/null and b/.git_disabled/objects/9c/c5dc70a05365bcd86317c7062fa2cb9c39cfee differ diff --git a/.git_disabled/objects/9c/cc94af8c4945214993b2aced7d8fb73ef75507 b/.git_disabled/objects/9c/cc94af8c4945214993b2aced7d8fb73ef75507 new file mode 100755 index 0000000..8f981f6 Binary files /dev/null and b/.git_disabled/objects/9c/cc94af8c4945214993b2aced7d8fb73ef75507 differ diff --git a/.git_disabled/objects/9c/cfa53e597a29ee387f9d16f3af4f695ac0d33a b/.git_disabled/objects/9c/cfa53e597a29ee387f9d16f3af4f695ac0d33a new file mode 100755 index 0000000..0d91865 Binary files /dev/null and b/.git_disabled/objects/9c/cfa53e597a29ee387f9d16f3af4f695ac0d33a differ diff --git a/.git_disabled/objects/9c/d3fe5ed00ca64b24785b9ffcba330bd11bcbfd b/.git_disabled/objects/9c/d3fe5ed00ca64b24785b9ffcba330bd11bcbfd new file mode 100755 index 0000000..3dd6689 Binary files /dev/null and b/.git_disabled/objects/9c/d3fe5ed00ca64b24785b9ffcba330bd11bcbfd differ diff --git a/.git_disabled/objects/9c/d66ad9fe8f354c2d438cffe1a32a3d60408c6e b/.git_disabled/objects/9c/d66ad9fe8f354c2d438cffe1a32a3d60408c6e new file mode 100755 index 0000000..8c5fe05 Binary files /dev/null and b/.git_disabled/objects/9c/d66ad9fe8f354c2d438cffe1a32a3d60408c6e differ diff --git a/.git_disabled/objects/9c/ec5b9286c642ecab2cfbbdea90864ebdf202e7 b/.git_disabled/objects/9c/ec5b9286c642ecab2cfbbdea90864ebdf202e7 new file mode 100755 index 0000000..8fc6005 Binary files /dev/null and b/.git_disabled/objects/9c/ec5b9286c642ecab2cfbbdea90864ebdf202e7 differ diff --git a/.git_disabled/objects/9c/fe12425af55f5f10b62d77207dfdc87bc69c48 b/.git_disabled/objects/9c/fe12425af55f5f10b62d77207dfdc87bc69c48 new file mode 100755 index 0000000..9f7738b Binary files /dev/null and b/.git_disabled/objects/9c/fe12425af55f5f10b62d77207dfdc87bc69c48 differ diff --git a/.git_disabled/objects/9d/02e9cb3710bb5dc1a04387d061b72e48235b7c b/.git_disabled/objects/9d/02e9cb3710bb5dc1a04387d061b72e48235b7c new file mode 100755 index 0000000..d9c2b57 Binary files /dev/null and b/.git_disabled/objects/9d/02e9cb3710bb5dc1a04387d061b72e48235b7c differ diff --git a/.git_disabled/objects/9d/06be4f8728b84c85731f39510596a99fc0a495 b/.git_disabled/objects/9d/06be4f8728b84c85731f39510596a99fc0a495 new file mode 100755 index 0000000..d3d7b6c Binary files /dev/null and b/.git_disabled/objects/9d/06be4f8728b84c85731f39510596a99fc0a495 differ diff --git a/.git_disabled/objects/9d/19d52de5e1eafd3d41adbf097ff84f6f15d97a b/.git_disabled/objects/9d/19d52de5e1eafd3d41adbf097ff84f6f15d97a new file mode 100755 index 0000000..d44fc78 Binary files /dev/null and b/.git_disabled/objects/9d/19d52de5e1eafd3d41adbf097ff84f6f15d97a differ diff --git a/.git_disabled/objects/9d/1a0c7f282971def6dafd1843f6ec013fe7d5d6 b/.git_disabled/objects/9d/1a0c7f282971def6dafd1843f6ec013fe7d5d6 new file mode 100755 index 0000000..3f5aabc Binary files /dev/null and b/.git_disabled/objects/9d/1a0c7f282971def6dafd1843f6ec013fe7d5d6 differ diff --git a/.git_disabled/objects/9d/3222b4fbfc8c2fc52f8431be17dff3617fb455 b/.git_disabled/objects/9d/3222b4fbfc8c2fc52f8431be17dff3617fb455 new file mode 100755 index 0000000..8822137 Binary files /dev/null and b/.git_disabled/objects/9d/3222b4fbfc8c2fc52f8431be17dff3617fb455 differ diff --git a/.git_disabled/objects/9d/4487269fcaa8adfe1895bc61fba987598b574f b/.git_disabled/objects/9d/4487269fcaa8adfe1895bc61fba987598b574f new file mode 100755 index 0000000..0c96e26 Binary files /dev/null and b/.git_disabled/objects/9d/4487269fcaa8adfe1895bc61fba987598b574f differ diff --git a/.git_disabled/objects/9d/4c85654d7858ec00e2472feaaab728fc16240c b/.git_disabled/objects/9d/4c85654d7858ec00e2472feaaab728fc16240c new file mode 100755 index 0000000..844c11a Binary files /dev/null and b/.git_disabled/objects/9d/4c85654d7858ec00e2472feaaab728fc16240c differ diff --git a/.git_disabled/objects/9d/53ffc2f97ee48cfb5f9de1ace221a81c095952 b/.git_disabled/objects/9d/53ffc2f97ee48cfb5f9de1ace221a81c095952 new file mode 100755 index 0000000..1e620d0 Binary files /dev/null and b/.git_disabled/objects/9d/53ffc2f97ee48cfb5f9de1ace221a81c095952 differ diff --git a/.git_disabled/objects/9d/6325cebdc9866dc45f38ba4d73940827a638f4 b/.git_disabled/objects/9d/6325cebdc9866dc45f38ba4d73940827a638f4 new file mode 100755 index 0000000..5df4bd4 Binary files /dev/null and b/.git_disabled/objects/9d/6325cebdc9866dc45f38ba4d73940827a638f4 differ diff --git a/.git_disabled/objects/9d/6afb3675df6a7ab24987a620871fb494714406 b/.git_disabled/objects/9d/6afb3675df6a7ab24987a620871fb494714406 new file mode 100755 index 0000000..9a4cd40 Binary files /dev/null and b/.git_disabled/objects/9d/6afb3675df6a7ab24987a620871fb494714406 differ diff --git a/.git_disabled/objects/9d/7837b491116b30ca1aa6788848cd9f48dd00d2 b/.git_disabled/objects/9d/7837b491116b30ca1aa6788848cd9f48dd00d2 new file mode 100755 index 0000000..a9e615f Binary files /dev/null and b/.git_disabled/objects/9d/7837b491116b30ca1aa6788848cd9f48dd00d2 differ diff --git a/.git_disabled/objects/9d/78a6555cbb1e23fb456ddc7ef6cb0dd0108cf8 b/.git_disabled/objects/9d/78a6555cbb1e23fb456ddc7ef6cb0dd0108cf8 new file mode 100755 index 0000000..8b8388e Binary files /dev/null and b/.git_disabled/objects/9d/78a6555cbb1e23fb456ddc7ef6cb0dd0108cf8 differ diff --git a/.git_disabled/objects/9d/794d4316fa59dc9ca7acb5930428c79e6cbc8a b/.git_disabled/objects/9d/794d4316fa59dc9ca7acb5930428c79e6cbc8a new file mode 100755 index 0000000..6f94d0e Binary files /dev/null and b/.git_disabled/objects/9d/794d4316fa59dc9ca7acb5930428c79e6cbc8a differ diff --git a/.git_disabled/objects/9d/7dc922af0c32e17149aeb0bd4c59fa2c9672fb b/.git_disabled/objects/9d/7dc922af0c32e17149aeb0bd4c59fa2c9672fb new file mode 100755 index 0000000..3af79ce --- /dev/null +++ b/.git_disabled/objects/9d/7dc922af0c32e17149aeb0bd4c59fa2c9672fb @@ -0,0 +1,3 @@ +xmQM09bؽȬ @Csh4%W7{콷U9]4㽊]w-hMK`8K8 Y5Fh &sN.1O +SΓ cYںhj0gg3 @S Ievo tBH*Tw}1LP,g5ܝ~%|;qgi{1"ob,Tħ?|ShkXM~JݢWwCXo35{{4)J >AU]\l+a[g}C~J% +&}ygkL 9C YDfq$+x?<(gYB}FQQd;NW?~ \ No newline at end of file diff --git a/.git_disabled/objects/9d/7e3282cf34d0f004b3b677c28366e40663d3d2 b/.git_disabled/objects/9d/7e3282cf34d0f004b3b677c28366e40663d3d2 new file mode 100755 index 0000000..5548368 Binary files /dev/null and b/.git_disabled/objects/9d/7e3282cf34d0f004b3b677c28366e40663d3d2 differ diff --git a/.git_disabled/objects/9d/a6cfcd0be4adcc4ecb4a43dc2bc213199a4b0e b/.git_disabled/objects/9d/a6cfcd0be4adcc4ecb4a43dc2bc213199a4b0e new file mode 100755 index 0000000..4d87ac8 Binary files /dev/null and b/.git_disabled/objects/9d/a6cfcd0be4adcc4ecb4a43dc2bc213199a4b0e differ diff --git a/.git_disabled/objects/9d/aa4b9f44a4ba19ebed6524d18fd45afeefc763 b/.git_disabled/objects/9d/aa4b9f44a4ba19ebed6524d18fd45afeefc763 new file mode 100755 index 0000000..f300f5f Binary files /dev/null and b/.git_disabled/objects/9d/aa4b9f44a4ba19ebed6524d18fd45afeefc763 differ diff --git a/.git_disabled/objects/9d/b6e9c3db7cb59bd5272c476f611802bbf01be7 b/.git_disabled/objects/9d/b6e9c3db7cb59bd5272c476f611802bbf01be7 new file mode 100755 index 0000000..71cf433 Binary files /dev/null and b/.git_disabled/objects/9d/b6e9c3db7cb59bd5272c476f611802bbf01be7 differ diff --git a/.git_disabled/objects/9d/dddddc9cae491bf2294bd681771689763674e1 b/.git_disabled/objects/9d/dddddc9cae491bf2294bd681771689763674e1 new file mode 100755 index 0000000..ce5d490 Binary files /dev/null and b/.git_disabled/objects/9d/dddddc9cae491bf2294bd681771689763674e1 differ diff --git a/.git_disabled/objects/9d/e34b889a6276f176720f977b992091b0545654 b/.git_disabled/objects/9d/e34b889a6276f176720f977b992091b0545654 new file mode 100755 index 0000000..448bde5 Binary files /dev/null and b/.git_disabled/objects/9d/e34b889a6276f176720f977b992091b0545654 differ diff --git a/.git_disabled/objects/9d/fd1a8540af52882db448d556a30187711d47f0 b/.git_disabled/objects/9d/fd1a8540af52882db448d556a30187711d47f0 new file mode 100755 index 0000000..75255ad Binary files /dev/null and b/.git_disabled/objects/9d/fd1a8540af52882db448d556a30187711d47f0 differ diff --git a/.git_disabled/objects/9d/ff2aee534a7a7d916b6f7d61483857d2674a08 b/.git_disabled/objects/9d/ff2aee534a7a7d916b6f7d61483857d2674a08 new file mode 100755 index 0000000..b3c3a33 Binary files /dev/null and b/.git_disabled/objects/9d/ff2aee534a7a7d916b6f7d61483857d2674a08 differ diff --git a/.git_disabled/objects/9e/04957507bab07276c7640ffb90539c6027cd62 b/.git_disabled/objects/9e/04957507bab07276c7640ffb90539c6027cd62 new file mode 100755 index 0000000..56c3fec Binary files /dev/null and b/.git_disabled/objects/9e/04957507bab07276c7640ffb90539c6027cd62 differ diff --git a/.git_disabled/objects/9e/04ef6a0eae00f621755de2009fa427811da2cf b/.git_disabled/objects/9e/04ef6a0eae00f621755de2009fa427811da2cf new file mode 100755 index 0000000..31d6230 Binary files /dev/null and b/.git_disabled/objects/9e/04ef6a0eae00f621755de2009fa427811da2cf differ diff --git a/.git_disabled/objects/9e/079e06d3e96dbea15ebb990b2782e4e2ad5a61 b/.git_disabled/objects/9e/079e06d3e96dbea15ebb990b2782e4e2ad5a61 new file mode 100755 index 0000000..b517d12 Binary files /dev/null and b/.git_disabled/objects/9e/079e06d3e96dbea15ebb990b2782e4e2ad5a61 differ diff --git a/.git_disabled/objects/9e/07e19e8d16b7b0d3ebabc40fe5bb60a67e557d b/.git_disabled/objects/9e/07e19e8d16b7b0d3ebabc40fe5bb60a67e557d new file mode 100755 index 0000000..d9a8083 Binary files /dev/null and b/.git_disabled/objects/9e/07e19e8d16b7b0d3ebabc40fe5bb60a67e557d differ diff --git a/.git_disabled/objects/9e/1718fc8f5d172da7f0be712eab5f1ba7d85015 b/.git_disabled/objects/9e/1718fc8f5d172da7f0be712eab5f1ba7d85015 new file mode 100755 index 0000000..1d8e20d Binary files /dev/null and b/.git_disabled/objects/9e/1718fc8f5d172da7f0be712eab5f1ba7d85015 differ diff --git a/.git_disabled/objects/9e/1a084a3f5a8e1a3a4d784417d6efbce43cd2a7 b/.git_disabled/objects/9e/1a084a3f5a8e1a3a4d784417d6efbce43cd2a7 new file mode 100755 index 0000000..b226bef Binary files /dev/null and b/.git_disabled/objects/9e/1a084a3f5a8e1a3a4d784417d6efbce43cd2a7 differ diff --git a/.git_disabled/objects/9e/2452e6559aee7b3d289122ea4c43a5aba72c60 b/.git_disabled/objects/9e/2452e6559aee7b3d289122ea4c43a5aba72c60 new file mode 100755 index 0000000..c22cdae Binary files /dev/null and b/.git_disabled/objects/9e/2452e6559aee7b3d289122ea4c43a5aba72c60 differ diff --git a/.git_disabled/objects/9e/263cd96345f30c885bc1904ee17e103aedc394 b/.git_disabled/objects/9e/263cd96345f30c885bc1904ee17e103aedc394 new file mode 100755 index 0000000..b0de654 --- /dev/null +++ b/.git_disabled/objects/9e/263cd96345f30c885bc1904ee17e103aedc394 @@ -0,0 +1,3 @@ +xmRN0䜯XKAUPH JPƛԱ#|CA.Y')3QJ&[ 2/ 9upB!^ݎ'7;hsEª_L_NɔiJNeYtNxkt +c6Ad0Z ʺ ^!Yita/MS?^Y䫨Gm3|FM^Ƨԉ*w[BA]&\ԣe:,Gn_tS c\d؄LJOJˆVR#Za%^ \ No newline at end of file diff --git a/.git_disabled/objects/9e/3c1cbf3103a4aa2412fc278e2cf87e3f9081a1 b/.git_disabled/objects/9e/3c1cbf3103a4aa2412fc278e2cf87e3f9081a1 new file mode 100755 index 0000000..0898a4a9 Binary files /dev/null and b/.git_disabled/objects/9e/3c1cbf3103a4aa2412fc278e2cf87e3f9081a1 differ diff --git a/.git_disabled/objects/9e/44683638bae13eb8c9ae318472485d5233a168 b/.git_disabled/objects/9e/44683638bae13eb8c9ae318472485d5233a168 new file mode 100755 index 0000000..54a8177 Binary files /dev/null and b/.git_disabled/objects/9e/44683638bae13eb8c9ae318472485d5233a168 differ diff --git a/.git_disabled/objects/9e/4693b650f219ddf7989bea9790b87eba6c7af9 b/.git_disabled/objects/9e/4693b650f219ddf7989bea9790b87eba6c7af9 new file mode 100755 index 0000000..537481a Binary files /dev/null and b/.git_disabled/objects/9e/4693b650f219ddf7989bea9790b87eba6c7af9 differ diff --git a/.git_disabled/objects/9e/5c8939762e0ec840ab81ac43634264cb0ff1cd b/.git_disabled/objects/9e/5c8939762e0ec840ab81ac43634264cb0ff1cd new file mode 100755 index 0000000..2035015 Binary files /dev/null and b/.git_disabled/objects/9e/5c8939762e0ec840ab81ac43634264cb0ff1cd differ diff --git a/.git_disabled/objects/9e/62b61807e7e49267330a6de53c92fbeea6579b b/.git_disabled/objects/9e/62b61807e7e49267330a6de53c92fbeea6579b new file mode 100755 index 0000000..c9bf48c Binary files /dev/null and b/.git_disabled/objects/9e/62b61807e7e49267330a6de53c92fbeea6579b differ diff --git a/.git_disabled/objects/9e/640e15f1a595cd086549041fc944d41d3fc3ae b/.git_disabled/objects/9e/640e15f1a595cd086549041fc944d41d3fc3ae new file mode 100755 index 0000000..fe827ae Binary files /dev/null and b/.git_disabled/objects/9e/640e15f1a595cd086549041fc944d41d3fc3ae differ diff --git a/.git_disabled/objects/9e/96546fdccff82935fd91140901e55b838c157a b/.git_disabled/objects/9e/96546fdccff82935fd91140901e55b838c157a new file mode 100755 index 0000000..c4d1262 Binary files /dev/null and b/.git_disabled/objects/9e/96546fdccff82935fd91140901e55b838c157a differ diff --git a/.git_disabled/objects/9e/a3ddfdc61657e74d8c13ac10f2a65b83e62e7f b/.git_disabled/objects/9e/a3ddfdc61657e74d8c13ac10f2a65b83e62e7f new file mode 100755 index 0000000..ac28af9 Binary files /dev/null and b/.git_disabled/objects/9e/a3ddfdc61657e74d8c13ac10f2a65b83e62e7f differ diff --git a/.git_disabled/objects/9e/a4f9a0c2f37c12204a678547a72d06e6b978e6 b/.git_disabled/objects/9e/a4f9a0c2f37c12204a678547a72d06e6b978e6 new file mode 100755 index 0000000..9a65bbf Binary files /dev/null and b/.git_disabled/objects/9e/a4f9a0c2f37c12204a678547a72d06e6b978e6 differ diff --git a/.git_disabled/objects/9e/af34ef4328ff3c91e0363f793c4a575063cea4 b/.git_disabled/objects/9e/af34ef4328ff3c91e0363f793c4a575063cea4 new file mode 100755 index 0000000..6cd853b Binary files /dev/null and b/.git_disabled/objects/9e/af34ef4328ff3c91e0363f793c4a575063cea4 differ diff --git a/.git_disabled/objects/9e/bc46153c97882c3bd59aebaf7e0ce6bbd0ea4b b/.git_disabled/objects/9e/bc46153c97882c3bd59aebaf7e0ce6bbd0ea4b new file mode 100755 index 0000000..6f2f2b1 Binary files /dev/null and b/.git_disabled/objects/9e/bc46153c97882c3bd59aebaf7e0ce6bbd0ea4b differ diff --git a/.git_disabled/objects/9e/bc4f6a31e1c80a9c063f4ac32dd4d06ed10732 b/.git_disabled/objects/9e/bc4f6a31e1c80a9c063f4ac32dd4d06ed10732 new file mode 100755 index 0000000..5edd540 Binary files /dev/null and b/.git_disabled/objects/9e/bc4f6a31e1c80a9c063f4ac32dd4d06ed10732 differ diff --git a/.git_disabled/objects/9e/d4e0461bafd06367512275963cea47cc9a02c1 b/.git_disabled/objects/9e/d4e0461bafd06367512275963cea47cc9a02c1 new file mode 100755 index 0000000..6ec3627 Binary files /dev/null and b/.git_disabled/objects/9e/d4e0461bafd06367512275963cea47cc9a02c1 differ diff --git a/.git_disabled/objects/9e/eb4b4da12efe287f4a7efbd0229de08b4f20b6 b/.git_disabled/objects/9e/eb4b4da12efe287f4a7efbd0229de08b4f20b6 new file mode 100755 index 0000000..5f48285 Binary files /dev/null and b/.git_disabled/objects/9e/eb4b4da12efe287f4a7efbd0229de08b4f20b6 differ diff --git a/.git_disabled/objects/9f/0de0ece38ff1f78634d8abb443477dec8b20e0 b/.git_disabled/objects/9f/0de0ece38ff1f78634d8abb443477dec8b20e0 new file mode 100755 index 0000000..de8872f Binary files /dev/null and b/.git_disabled/objects/9f/0de0ece38ff1f78634d8abb443477dec8b20e0 differ diff --git a/.git_disabled/objects/9f/0fd021f41f5314b9d74f81d9b71bdaedc9bfb4 b/.git_disabled/objects/9f/0fd021f41f5314b9d74f81d9b71bdaedc9bfb4 new file mode 100755 index 0000000..8e65eec Binary files /dev/null and b/.git_disabled/objects/9f/0fd021f41f5314b9d74f81d9b71bdaedc9bfb4 differ diff --git a/.git_disabled/objects/9f/15be90999acf63d527af95f88ada5829e2c735 b/.git_disabled/objects/9f/15be90999acf63d527af95f88ada5829e2c735 new file mode 100755 index 0000000..e54a10f --- /dev/null +++ b/.git_disabled/objects/9f/15be90999acf63d527af95f88ada5829e2c735 @@ -0,0 +1 @@ +xuνN0`:q EDqIVǖ@;ARlfݵpu&dH^ɟb!S7Pʍ(%gh)zE>п8CY:q)c,)9ZLy>;,5a%2L(njUGw{Be@T.Bj{&5\ik.S ۤR05 ۩iP Ӏ \ No newline at end of file diff --git a/.git_disabled/objects/9f/1f76d9e1759456259327899bb3c0d3252b6ed9 b/.git_disabled/objects/9f/1f76d9e1759456259327899bb3c0d3252b6ed9 new file mode 100755 index 0000000..aa13688 Binary files /dev/null and b/.git_disabled/objects/9f/1f76d9e1759456259327899bb3c0d3252b6ed9 differ diff --git a/.git_disabled/objects/9f/35bae568e33e6a9e1219761c83cc8350fa0532 b/.git_disabled/objects/9f/35bae568e33e6a9e1219761c83cc8350fa0532 new file mode 100755 index 0000000..a2a0ec7 Binary files /dev/null and b/.git_disabled/objects/9f/35bae568e33e6a9e1219761c83cc8350fa0532 differ diff --git a/.git_disabled/objects/9f/541c4747dd6738b1da770881e31c7663883174 b/.git_disabled/objects/9f/541c4747dd6738b1da770881e31c7663883174 new file mode 100755 index 0000000..45739ab Binary files /dev/null and b/.git_disabled/objects/9f/541c4747dd6738b1da770881e31c7663883174 differ diff --git a/.git_disabled/objects/9f/54c6fd650f404ecfd9d0c56fe151bf6aa9ff96 b/.git_disabled/objects/9f/54c6fd650f404ecfd9d0c56fe151bf6aa9ff96 new file mode 100755 index 0000000..6b19d3e Binary files /dev/null and b/.git_disabled/objects/9f/54c6fd650f404ecfd9d0c56fe151bf6aa9ff96 differ diff --git a/.git_disabled/objects/9f/59cc53a24a9f91835616f79710afe9a13fcf53 b/.git_disabled/objects/9f/59cc53a24a9f91835616f79710afe9a13fcf53 new file mode 100755 index 0000000..9412ecd Binary files /dev/null and b/.git_disabled/objects/9f/59cc53a24a9f91835616f79710afe9a13fcf53 differ diff --git a/.git_disabled/objects/9f/5c3c0141c4357fe75ff7a96b8a8393a8be595d b/.git_disabled/objects/9f/5c3c0141c4357fe75ff7a96b8a8393a8be595d new file mode 100755 index 0000000..34c0db4 Binary files /dev/null and b/.git_disabled/objects/9f/5c3c0141c4357fe75ff7a96b8a8393a8be595d differ diff --git a/.git_disabled/objects/9f/7dfa40d5b22b10a6e5d9d4d59a88f9a56c4843 b/.git_disabled/objects/9f/7dfa40d5b22b10a6e5d9d4d59a88f9a56c4843 new file mode 100755 index 0000000..100e52d Binary files /dev/null and b/.git_disabled/objects/9f/7dfa40d5b22b10a6e5d9d4d59a88f9a56c4843 differ diff --git a/.git_disabled/objects/9f/a8da6295f40688d275c396c19e69f7fd9cafce b/.git_disabled/objects/9f/a8da6295f40688d275c396c19e69f7fd9cafce new file mode 100755 index 0000000..d970098 Binary files /dev/null and b/.git_disabled/objects/9f/a8da6295f40688d275c396c19e69f7fd9cafce differ diff --git a/.git_disabled/objects/9f/f8d10d245b6a302d8b7591df91b68e07ab98a7 b/.git_disabled/objects/9f/f8d10d245b6a302d8b7591df91b68e07ab98a7 new file mode 100755 index 0000000..2547fa6 Binary files /dev/null and b/.git_disabled/objects/9f/f8d10d245b6a302d8b7591df91b68e07ab98a7 differ diff --git a/.git_disabled/objects/a0/1782baa92ca3d7bf273eefe54dfaf33d4f09fb b/.git_disabled/objects/a0/1782baa92ca3d7bf273eefe54dfaf33d4f09fb new file mode 100755 index 0000000..d49c8cb Binary files /dev/null and b/.git_disabled/objects/a0/1782baa92ca3d7bf273eefe54dfaf33d4f09fb differ diff --git a/.git_disabled/objects/a0/2d406e28db9960d7911cb103f3414a7fc120df b/.git_disabled/objects/a0/2d406e28db9960d7911cb103f3414a7fc120df new file mode 100755 index 0000000..22eb455 Binary files /dev/null and b/.git_disabled/objects/a0/2d406e28db9960d7911cb103f3414a7fc120df differ diff --git a/.git_disabled/objects/a0/383f827409099291a688c9d0546c99ea90bf53 b/.git_disabled/objects/a0/383f827409099291a688c9d0546c99ea90bf53 new file mode 100755 index 0000000..295795e Binary files /dev/null and b/.git_disabled/objects/a0/383f827409099291a688c9d0546c99ea90bf53 differ diff --git a/.git_disabled/objects/a0/59fe292ed7df91b5d3816cc3b48353956e16b2 b/.git_disabled/objects/a0/59fe292ed7df91b5d3816cc3b48353956e16b2 new file mode 100755 index 0000000..a0f14cc Binary files /dev/null and b/.git_disabled/objects/a0/59fe292ed7df91b5d3816cc3b48353956e16b2 differ diff --git a/.git_disabled/objects/a0/66fe1355b6b3709eaf9ef29fdd09a252e8e0df b/.git_disabled/objects/a0/66fe1355b6b3709eaf9ef29fdd09a252e8e0df new file mode 100755 index 0000000..2620912 Binary files /dev/null and b/.git_disabled/objects/a0/66fe1355b6b3709eaf9ef29fdd09a252e8e0df differ diff --git a/.git_disabled/objects/a0/822da089d70baaf9ecd744c19a29019116e42b b/.git_disabled/objects/a0/822da089d70baaf9ecd744c19a29019116e42b new file mode 100755 index 0000000..5f832d7 Binary files /dev/null and b/.git_disabled/objects/a0/822da089d70baaf9ecd744c19a29019116e42b differ diff --git a/.git_disabled/objects/a0/873776ce9cdb263b422c07c05d67c148181c71 b/.git_disabled/objects/a0/873776ce9cdb263b422c07c05d67c148181c71 new file mode 100755 index 0000000..79c43f7 Binary files /dev/null and b/.git_disabled/objects/a0/873776ce9cdb263b422c07c05d67c148181c71 differ diff --git a/.git_disabled/objects/a0/c340fd5af306cd3f76c2db3febff137ae25db9 b/.git_disabled/objects/a0/c340fd5af306cd3f76c2db3febff137ae25db9 new file mode 100755 index 0000000..7f8ea2d Binary files /dev/null and b/.git_disabled/objects/a0/c340fd5af306cd3f76c2db3febff137ae25db9 differ diff --git a/.git_disabled/objects/a0/cf026f9bd997dbf458e0550bfd28763028ba0a b/.git_disabled/objects/a0/cf026f9bd997dbf458e0550bfd28763028ba0a new file mode 100755 index 0000000..8faf717 Binary files /dev/null and b/.git_disabled/objects/a0/cf026f9bd997dbf458e0550bfd28763028ba0a differ diff --git a/.git_disabled/objects/a0/d8c76bae651329087690bbbf60183799734937 b/.git_disabled/objects/a0/d8c76bae651329087690bbbf60183799734937 new file mode 100755 index 0000000..46da1fe Binary files /dev/null and b/.git_disabled/objects/a0/d8c76bae651329087690bbbf60183799734937 differ diff --git a/.git_disabled/objects/a1/0f6721706793de3335d8fea0bd68f1afb1f5a6 b/.git_disabled/objects/a1/0f6721706793de3335d8fea0bd68f1afb1f5a6 new file mode 100755 index 0000000..3a708bc Binary files /dev/null and b/.git_disabled/objects/a1/0f6721706793de3335d8fea0bd68f1afb1f5a6 differ diff --git a/.git_disabled/objects/a1/11de1f1332907d2940971ccef8d5f84e9f23aa b/.git_disabled/objects/a1/11de1f1332907d2940971ccef8d5f84e9f23aa new file mode 100755 index 0000000..8227e55 --- /dev/null +++ b/.git_disabled/objects/a1/11de1f1332907d2940971ccef8d5f84e9f23aa @@ -0,0 +1 @@ +x+)JMU07e040075UtJN+d? QO*I+)L-*cbº9Ss \ No newline at end of file diff --git a/.git_disabled/objects/a1/336e2646360646cd1ec5cf23efb1d5c088414a b/.git_disabled/objects/a1/336e2646360646cd1ec5cf23efb1d5c088414a new file mode 100755 index 0000000..f5e3054 Binary files /dev/null and b/.git_disabled/objects/a1/336e2646360646cd1ec5cf23efb1d5c088414a differ diff --git a/.git_disabled/objects/a1/40095e1b8de022f321a41c0125e0e5febc0749 b/.git_disabled/objects/a1/40095e1b8de022f321a41c0125e0e5febc0749 new file mode 100755 index 0000000..2d89a8a Binary files /dev/null and b/.git_disabled/objects/a1/40095e1b8de022f321a41c0125e0e5febc0749 differ diff --git a/.git_disabled/objects/a1/7e9cae4bca2c30e54f2c1c948029a72f635b65 b/.git_disabled/objects/a1/7e9cae4bca2c30e54f2c1c948029a72f635b65 new file mode 100755 index 0000000..48324e1 Binary files /dev/null and b/.git_disabled/objects/a1/7e9cae4bca2c30e54f2c1c948029a72f635b65 differ diff --git a/.git_disabled/objects/a1/8b049d7c91f6e75ab66a4ac42726834343a508 b/.git_disabled/objects/a1/8b049d7c91f6e75ab66a4ac42726834343a508 new file mode 100755 index 0000000..31037b2 --- /dev/null +++ b/.git_disabled/objects/a1/8b049d7c91f6e75ab66a4ac42726834343a508 @@ -0,0 +1 @@ +x}AK0=W .<,¢EDݤ?dZͲ}3׃m6WQZ -\Ơ\SimwSr^6Jr _E7?_Cơ5Q͋U#)MyR@omRCVA;:üQުiٯR],铞3j9k*#h4JǕ-i,g{28tb9;ݧ+x}lG/ܲ \ No newline at end of file diff --git a/.git_disabled/objects/a1/975efccf6437f45bb7652336357e9d6eee6298 b/.git_disabled/objects/a1/975efccf6437f45bb7652336357e9d6eee6298 new file mode 100755 index 0000000..197720c Binary files /dev/null and b/.git_disabled/objects/a1/975efccf6437f45bb7652336357e9d6eee6298 differ diff --git a/.git_disabled/objects/a1/9cd9759ab780769ee3cffe673117814ab09d61 b/.git_disabled/objects/a1/9cd9759ab780769ee3cffe673117814ab09d61 new file mode 100755 index 0000000..eff1f69 Binary files /dev/null and b/.git_disabled/objects/a1/9cd9759ab780769ee3cffe673117814ab09d61 differ diff --git a/.git_disabled/objects/a1/9e2b1ae4b47eb40029cb997305cef630c4c151 b/.git_disabled/objects/a1/9e2b1ae4b47eb40029cb997305cef630c4c151 new file mode 100755 index 0000000..8b146bb Binary files /dev/null and b/.git_disabled/objects/a1/9e2b1ae4b47eb40029cb997305cef630c4c151 differ diff --git a/.git_disabled/objects/a1/a365a55a5df5f1fe38197edeba20f4f654914f b/.git_disabled/objects/a1/a365a55a5df5f1fe38197edeba20f4f654914f new file mode 100755 index 0000000..6432f6c Binary files /dev/null and b/.git_disabled/objects/a1/a365a55a5df5f1fe38197edeba20f4f654914f differ diff --git a/.git_disabled/objects/a1/b589e38a32041e49332e5e81c2d363dc418d68 b/.git_disabled/objects/a1/b589e38a32041e49332e5e81c2d363dc418d68 new file mode 100755 index 0000000..627fbc0 Binary files /dev/null and b/.git_disabled/objects/a1/b589e38a32041e49332e5e81c2d363dc418d68 differ diff --git a/.git_disabled/objects/a1/c24dd56f725c773c16adb586fc6796eaad52dc b/.git_disabled/objects/a1/c24dd56f725c773c16adb586fc6796eaad52dc new file mode 100755 index 0000000..b101a38 Binary files /dev/null and b/.git_disabled/objects/a1/c24dd56f725c773c16adb586fc6796eaad52dc differ diff --git a/.git_disabled/objects/a1/c5aa72492180cdd2899501325c5e47094d2976 b/.git_disabled/objects/a1/c5aa72492180cdd2899501325c5e47094d2976 new file mode 100755 index 0000000..1318ee5 Binary files /dev/null and b/.git_disabled/objects/a1/c5aa72492180cdd2899501325c5e47094d2976 differ diff --git a/.git_disabled/objects/a1/c8788ba2d3077f9db9085e4c7abb771b9ef8c0 b/.git_disabled/objects/a1/c8788ba2d3077f9db9085e4c7abb771b9ef8c0 new file mode 100755 index 0000000..6b62edf Binary files /dev/null and b/.git_disabled/objects/a1/c8788ba2d3077f9db9085e4c7abb771b9ef8c0 differ diff --git a/.git_disabled/objects/a1/ca110e9c7e5ab041485e6985313898148614c4 b/.git_disabled/objects/a1/ca110e9c7e5ab041485e6985313898148614c4 new file mode 100755 index 0000000..c228c42 Binary files /dev/null and b/.git_disabled/objects/a1/ca110e9c7e5ab041485e6985313898148614c4 differ diff --git a/.git_disabled/objects/a1/e9541034df06cf23f034f5e33d0bf3d38781cc b/.git_disabled/objects/a1/e9541034df06cf23f034f5e33d0bf3d38781cc new file mode 100755 index 0000000..4f1b357 Binary files /dev/null and b/.git_disabled/objects/a1/e9541034df06cf23f034f5e33d0bf3d38781cc differ diff --git a/.git_disabled/objects/a1/eb33ef9cd35ec49380254759330a48ebb6557d b/.git_disabled/objects/a1/eb33ef9cd35ec49380254759330a48ebb6557d new file mode 100755 index 0000000..b87340e Binary files /dev/null and b/.git_disabled/objects/a1/eb33ef9cd35ec49380254759330a48ebb6557d differ diff --git a/.git_disabled/objects/a1/ecf79946cd2801aa7512519ed8f4f6349bd813 b/.git_disabled/objects/a1/ecf79946cd2801aa7512519ed8f4f6349bd813 new file mode 100755 index 0000000..660d8d9 Binary files /dev/null and b/.git_disabled/objects/a1/ecf79946cd2801aa7512519ed8f4f6349bd813 differ diff --git a/.git_disabled/objects/a1/f1b5add6ad022d56bfda187c75ace5258af714 b/.git_disabled/objects/a1/f1b5add6ad022d56bfda187c75ace5258af714 new file mode 100755 index 0000000..864bea2 Binary files /dev/null and b/.git_disabled/objects/a1/f1b5add6ad022d56bfda187c75ace5258af714 differ diff --git a/.git_disabled/objects/a2/11d0a982f3ea3b1e90d8e6f684ccc05e2020f3 b/.git_disabled/objects/a2/11d0a982f3ea3b1e90d8e6f684ccc05e2020f3 new file mode 100755 index 0000000..dbe1454 Binary files /dev/null and b/.git_disabled/objects/a2/11d0a982f3ea3b1e90d8e6f684ccc05e2020f3 differ diff --git a/.git_disabled/objects/a2/1e5a4f26279b4f9946a07672481dc9349deec1 b/.git_disabled/objects/a2/1e5a4f26279b4f9946a07672481dc9349deec1 new file mode 100755 index 0000000..f9ceb12 --- /dev/null +++ b/.git_disabled/objects/a2/1e5a4f26279b4f9946a07672481dc9349deec1 @@ -0,0 +1,5 @@ +xj@{S t5jbm V .$;!݈FJRCHa7ys]ra1eq;K9pr1G\BY삧_VӘTq"%W }Ѩ(&["5T~B>ve;~x7 ڀك3&Mq0P$4I +1J*k`-$ؗc/깖6C'SĆa^9 JO8x?'Vq:E$'q \ No newline at end of file diff --git a/.git_disabled/objects/a2/2e4a394b9ae0275d958e7948bb2586e1c7c505 b/.git_disabled/objects/a2/2e4a394b9ae0275d958e7948bb2586e1c7c505 new file mode 100755 index 0000000..3bd00db Binary files /dev/null and b/.git_disabled/objects/a2/2e4a394b9ae0275d958e7948bb2586e1c7c505 differ diff --git a/.git_disabled/objects/a2/2f630a953b98cf404b9b3523a761b7c392cc71 b/.git_disabled/objects/a2/2f630a953b98cf404b9b3523a761b7c392cc71 new file mode 100755 index 0000000..b602f70 Binary files /dev/null and b/.git_disabled/objects/a2/2f630a953b98cf404b9b3523a761b7c392cc71 differ diff --git a/.git_disabled/objects/a2/40a3e368e558d7ee38e612dc83e4a36f9a29fa b/.git_disabled/objects/a2/40a3e368e558d7ee38e612dc83e4a36f9a29fa new file mode 100755 index 0000000..76862af Binary files /dev/null and b/.git_disabled/objects/a2/40a3e368e558d7ee38e612dc83e4a36f9a29fa differ diff --git a/.git_disabled/objects/a2/42b0b9875095440e80899e37641f932438a9ba b/.git_disabled/objects/a2/42b0b9875095440e80899e37641f932438a9ba new file mode 100755 index 0000000..8a12f7c Binary files /dev/null and b/.git_disabled/objects/a2/42b0b9875095440e80899e37641f932438a9ba differ diff --git a/.git_disabled/objects/a2/55408f7e595026d4947228124f7630fdeb1c27 b/.git_disabled/objects/a2/55408f7e595026d4947228124f7630fdeb1c27 new file mode 100755 index 0000000..a3f2987 Binary files /dev/null and b/.git_disabled/objects/a2/55408f7e595026d4947228124f7630fdeb1c27 differ diff --git a/.git_disabled/objects/a2/5ab35a16e7865ff5cf05f3cd198e2241ff9dd0 b/.git_disabled/objects/a2/5ab35a16e7865ff5cf05f3cd198e2241ff9dd0 new file mode 100755 index 0000000..e0eb20f Binary files /dev/null and b/.git_disabled/objects/a2/5ab35a16e7865ff5cf05f3cd198e2241ff9dd0 differ diff --git a/.git_disabled/objects/a2/6590ef9c815e3d19f6b5332e36e41943b1e968 b/.git_disabled/objects/a2/6590ef9c815e3d19f6b5332e36e41943b1e968 new file mode 100755 index 0000000..ef84b83 Binary files /dev/null and b/.git_disabled/objects/a2/6590ef9c815e3d19f6b5332e36e41943b1e968 differ diff --git a/.git_disabled/objects/a2/7161e01b0320fe2d0e4116816208c9aead3710 b/.git_disabled/objects/a2/7161e01b0320fe2d0e4116816208c9aead3710 new file mode 100755 index 0000000..0333402 Binary files /dev/null and b/.git_disabled/objects/a2/7161e01b0320fe2d0e4116816208c9aead3710 differ diff --git a/.git_disabled/objects/a2/79a5f0f09ef64ee6b2743b3c6e3ee4aa323aeb b/.git_disabled/objects/a2/79a5f0f09ef64ee6b2743b3c6e3ee4aa323aeb new file mode 100755 index 0000000..7e3890d Binary files /dev/null and b/.git_disabled/objects/a2/79a5f0f09ef64ee6b2743b3c6e3ee4aa323aeb differ diff --git a/.git_disabled/objects/a2/8cb62a46df27fb7bdb560944290f4691147765 b/.git_disabled/objects/a2/8cb62a46df27fb7bdb560944290f4691147765 new file mode 100755 index 0000000..5085899 Binary files /dev/null and b/.git_disabled/objects/a2/8cb62a46df27fb7bdb560944290f4691147765 differ diff --git a/.git_disabled/objects/a2/95b3526cb948d46ab82f51f6a43565cb02d611 b/.git_disabled/objects/a2/95b3526cb948d46ab82f51f6a43565cb02d611 new file mode 100755 index 0000000..ecae498 Binary files /dev/null and b/.git_disabled/objects/a2/95b3526cb948d46ab82f51f6a43565cb02d611 differ diff --git a/.git_disabled/objects/a2/a748b0af6a7f44aa0b7707cbd3e0889ba667b5 b/.git_disabled/objects/a2/a748b0af6a7f44aa0b7707cbd3e0889ba667b5 new file mode 100755 index 0000000..2d9970f Binary files /dev/null and b/.git_disabled/objects/a2/a748b0af6a7f44aa0b7707cbd3e0889ba667b5 differ diff --git a/.git_disabled/objects/a2/afe9ba657a1c8bd1db4efe069e96ba73091688 b/.git_disabled/objects/a2/afe9ba657a1c8bd1db4efe069e96ba73091688 new file mode 100755 index 0000000..afea211 Binary files /dev/null and b/.git_disabled/objects/a2/afe9ba657a1c8bd1db4efe069e96ba73091688 differ diff --git a/.git_disabled/objects/a2/b6d05596bbf00d9748df338f5af30f7be7835a b/.git_disabled/objects/a2/b6d05596bbf00d9748df338f5af30f7be7835a new file mode 100755 index 0000000..4cbda69 Binary files /dev/null and b/.git_disabled/objects/a2/b6d05596bbf00d9748df338f5af30f7be7835a differ diff --git a/.git_disabled/objects/a2/c06b11ac820df7018f7114bf1475f146639f0f b/.git_disabled/objects/a2/c06b11ac820df7018f7114bf1475f146639f0f new file mode 100755 index 0000000..c928598 --- /dev/null +++ b/.git_disabled/objects/a2/c06b11ac820df7018f7114bf1475f146639f0f @@ -0,0 +1,3 @@ +xQk08IaZ'| FA6u44W~{A!$9s /nawC׬ DH)(CZ +e2Lh-R}*Mb(3ޝ!_7NCQSygƔr4(VB'[9_PˊbNeQo5{=թDm%|~ӏT!J +) C.eTC#\4}&!"N+qU (hY4/q2-m4%#UOO?[ɝVT:#?JZ#./ykao(䕣 / \ No newline at end of file diff --git a/.git_disabled/objects/a2/c8f2b25a4a290e43a47c484f41f1493014a66d b/.git_disabled/objects/a2/c8f2b25a4a290e43a47c484f41f1493014a66d new file mode 100755 index 0000000..cb3eb4b Binary files /dev/null and b/.git_disabled/objects/a2/c8f2b25a4a290e43a47c484f41f1493014a66d differ diff --git a/.git_disabled/objects/a2/d3ce81469a803d5cd16548969fb7c522c1d8f9 b/.git_disabled/objects/a2/d3ce81469a803d5cd16548969fb7c522c1d8f9 new file mode 100755 index 0000000..c1cd35e Binary files /dev/null and b/.git_disabled/objects/a2/d3ce81469a803d5cd16548969fb7c522c1d8f9 differ diff --git a/.git_disabled/objects/a2/ee66ee690145879e96f581bafe7f2f2e6d5767 b/.git_disabled/objects/a2/ee66ee690145879e96f581bafe7f2f2e6d5767 new file mode 100755 index 0000000..dea28b7 Binary files /dev/null and b/.git_disabled/objects/a2/ee66ee690145879e96f581bafe7f2f2e6d5767 differ diff --git a/.git_disabled/objects/a2/f7c9f78a304e6b5eb13a6f1a6f5f93f0175bfa b/.git_disabled/objects/a2/f7c9f78a304e6b5eb13a6f1a6f5f93f0175bfa new file mode 100755 index 0000000..944ccb9 Binary files /dev/null and b/.git_disabled/objects/a2/f7c9f78a304e6b5eb13a6f1a6f5f93f0175bfa differ diff --git a/.git_disabled/objects/a2/fc7a23fe177500610774b700fbc00e8cfcf0b1 b/.git_disabled/objects/a2/fc7a23fe177500610774b700fbc00e8cfcf0b1 new file mode 100755 index 0000000..d93ae13 Binary files /dev/null and b/.git_disabled/objects/a2/fc7a23fe177500610774b700fbc00e8cfcf0b1 differ diff --git a/.git_disabled/objects/a3/2ab77a8c63e25a5a95f3343105749b37cbde8e b/.git_disabled/objects/a3/2ab77a8c63e25a5a95f3343105749b37cbde8e new file mode 100755 index 0000000..041fd4e Binary files /dev/null and b/.git_disabled/objects/a3/2ab77a8c63e25a5a95f3343105749b37cbde8e differ diff --git a/.git_disabled/objects/a3/32607e9f5841ed58b70151dd4749805b731454 b/.git_disabled/objects/a3/32607e9f5841ed58b70151dd4749805b731454 new file mode 100755 index 0000000..c0d6208 Binary files /dev/null and b/.git_disabled/objects/a3/32607e9f5841ed58b70151dd4749805b731454 differ diff --git a/.git_disabled/objects/a3/3a9db62312dfa07c7efaba6605ab663082f7b1 b/.git_disabled/objects/a3/3a9db62312dfa07c7efaba6605ab663082f7b1 new file mode 100755 index 0000000..8b33815 Binary files /dev/null and b/.git_disabled/objects/a3/3a9db62312dfa07c7efaba6605ab663082f7b1 differ diff --git a/.git_disabled/objects/a3/3ee18b3a6c7db8e8a08bfcca367a8ee9796e6e b/.git_disabled/objects/a3/3ee18b3a6c7db8e8a08bfcca367a8ee9796e6e new file mode 100755 index 0000000..daca4b9 Binary files /dev/null and b/.git_disabled/objects/a3/3ee18b3a6c7db8e8a08bfcca367a8ee9796e6e differ diff --git a/.git_disabled/objects/a3/4e5b7976d89ac8c955e777b24bc8cdef2e0391 b/.git_disabled/objects/a3/4e5b7976d89ac8c955e777b24bc8cdef2e0391 new file mode 100755 index 0000000..d8099ed Binary files /dev/null and b/.git_disabled/objects/a3/4e5b7976d89ac8c955e777b24bc8cdef2e0391 differ diff --git a/.git_disabled/objects/a3/9bf261b7ba63e2d31c764ccff1b1327e10074c b/.git_disabled/objects/a3/9bf261b7ba63e2d31c764ccff1b1327e10074c new file mode 100755 index 0000000..3080397 Binary files /dev/null and b/.git_disabled/objects/a3/9bf261b7ba63e2d31c764ccff1b1327e10074c differ diff --git a/.git_disabled/objects/a3/9d216058179342ed9496dd37c3a40a5371f7fa b/.git_disabled/objects/a3/9d216058179342ed9496dd37c3a40a5371f7fa new file mode 100755 index 0000000..a00c3cd Binary files /dev/null and b/.git_disabled/objects/a3/9d216058179342ed9496dd37c3a40a5371f7fa differ diff --git a/.git_disabled/objects/a3/a2de4dd35bfc1cc551ec741ab410ca92d14b55 b/.git_disabled/objects/a3/a2de4dd35bfc1cc551ec741ab410ca92d14b55 new file mode 100755 index 0000000..6720964 Binary files /dev/null and b/.git_disabled/objects/a3/a2de4dd35bfc1cc551ec741ab410ca92d14b55 differ diff --git a/.git_disabled/objects/a3/aabc0e0842d420c9959f3cc21ee93a1f0e60ed b/.git_disabled/objects/a3/aabc0e0842d420c9959f3cc21ee93a1f0e60ed new file mode 100755 index 0000000..ed24e09 Binary files /dev/null and b/.git_disabled/objects/a3/aabc0e0842d420c9959f3cc21ee93a1f0e60ed differ diff --git a/.git_disabled/objects/a3/b3850e4b552f8a70273e936c838b243a1acb27 b/.git_disabled/objects/a3/b3850e4b552f8a70273e936c838b243a1acb27 new file mode 100755 index 0000000..ecc523e Binary files /dev/null and b/.git_disabled/objects/a3/b3850e4b552f8a70273e936c838b243a1acb27 differ diff --git a/.git_disabled/objects/a3/beeb9c514347ba3f30ac1170a4512f93e18bc8 b/.git_disabled/objects/a3/beeb9c514347ba3f30ac1170a4512f93e18bc8 new file mode 100755 index 0000000..d579220 Binary files /dev/null and b/.git_disabled/objects/a3/beeb9c514347ba3f30ac1170a4512f93e18bc8 differ diff --git a/.git_disabled/objects/a3/fa0c3d9783f34fb5225938f6ce5d1d31b9b85c b/.git_disabled/objects/a3/fa0c3d9783f34fb5225938f6ce5d1d31b9b85c new file mode 100755 index 0000000..26803fa Binary files /dev/null and b/.git_disabled/objects/a3/fa0c3d9783f34fb5225938f6ce5d1d31b9b85c differ diff --git a/.git_disabled/objects/a4/13ce862329659b9ca086b150297257be738d23 b/.git_disabled/objects/a4/13ce862329659b9ca086b150297257be738d23 new file mode 100755 index 0000000..6675851 Binary files /dev/null and b/.git_disabled/objects/a4/13ce862329659b9ca086b150297257be738d23 differ diff --git a/.git_disabled/objects/a4/2209b3e505f7b078c0c3efc9ace88e37565312 b/.git_disabled/objects/a4/2209b3e505f7b078c0c3efc9ace88e37565312 new file mode 100755 index 0000000..44539bd Binary files /dev/null and b/.git_disabled/objects/a4/2209b3e505f7b078c0c3efc9ace88e37565312 differ diff --git a/.git_disabled/objects/a4/4152db2c6c851f66f720c688bb3a4014b2b101 b/.git_disabled/objects/a4/4152db2c6c851f66f720c688bb3a4014b2b101 new file mode 100755 index 0000000..44f2532 Binary files /dev/null and b/.git_disabled/objects/a4/4152db2c6c851f66f720c688bb3a4014b2b101 differ diff --git a/.git_disabled/objects/a4/5d5aa30f84460f042a9fc376a4385f3ceaa158 b/.git_disabled/objects/a4/5d5aa30f84460f042a9fc376a4385f3ceaa158 new file mode 100755 index 0000000..9b62754 Binary files /dev/null and b/.git_disabled/objects/a4/5d5aa30f84460f042a9fc376a4385f3ceaa158 differ diff --git a/.git_disabled/objects/a4/739517ad9f9e047186ac7a997ab5bbc7345832 b/.git_disabled/objects/a4/739517ad9f9e047186ac7a997ab5bbc7345832 new file mode 100755 index 0000000..8945129 Binary files /dev/null and b/.git_disabled/objects/a4/739517ad9f9e047186ac7a997ab5bbc7345832 differ diff --git a/.git_disabled/objects/a4/9d557532b926a7cad23caa9985060ef1762d3c b/.git_disabled/objects/a4/9d557532b926a7cad23caa9985060ef1762d3c new file mode 100755 index 0000000..010aa1a Binary files /dev/null and b/.git_disabled/objects/a4/9d557532b926a7cad23caa9985060ef1762d3c differ diff --git a/.git_disabled/objects/a4/9e15d79348becf110d620c4885edc3a8e6df8b b/.git_disabled/objects/a4/9e15d79348becf110d620c4885edc3a8e6df8b new file mode 100755 index 0000000..282c235 Binary files /dev/null and b/.git_disabled/objects/a4/9e15d79348becf110d620c4885edc3a8e6df8b differ diff --git a/.git_disabled/objects/a4/b23bd2959f1465d553f2a8cb38e28b9d636281 b/.git_disabled/objects/a4/b23bd2959f1465d553f2a8cb38e28b9d636281 new file mode 100755 index 0000000..d9f1883 Binary files /dev/null and b/.git_disabled/objects/a4/b23bd2959f1465d553f2a8cb38e28b9d636281 differ diff --git a/.git_disabled/objects/a4/b88ce78e07fc80550064239e33b83b73b4ac8a b/.git_disabled/objects/a4/b88ce78e07fc80550064239e33b83b73b4ac8a new file mode 100755 index 0000000..27fa4a1 Binary files /dev/null and b/.git_disabled/objects/a4/b88ce78e07fc80550064239e33b83b73b4ac8a differ diff --git a/.git_disabled/objects/a4/d83c1f21142f4233f80ad1fb6370d1220a48b6 b/.git_disabled/objects/a4/d83c1f21142f4233f80ad1fb6370d1220a48b6 new file mode 100755 index 0000000..5988492 Binary files /dev/null and b/.git_disabled/objects/a4/d83c1f21142f4233f80ad1fb6370d1220a48b6 differ diff --git a/.git_disabled/objects/a4/ff735a7ca2dd598290227503a65f497eeb0138 b/.git_disabled/objects/a4/ff735a7ca2dd598290227503a65f497eeb0138 new file mode 100755 index 0000000..d50c97e Binary files /dev/null and b/.git_disabled/objects/a4/ff735a7ca2dd598290227503a65f497eeb0138 differ diff --git a/.git_disabled/objects/a5/08bbb5988ae94da8bee2c79db3686706f4de9b b/.git_disabled/objects/a5/08bbb5988ae94da8bee2c79db3686706f4de9b new file mode 100755 index 0000000..de1e4ec Binary files /dev/null and b/.git_disabled/objects/a5/08bbb5988ae94da8bee2c79db3686706f4de9b differ diff --git a/.git_disabled/objects/a5/0cf08a062a5814caecce633a86be7c7d64ec7f b/.git_disabled/objects/a5/0cf08a062a5814caecce633a86be7c7d64ec7f new file mode 100755 index 0000000..a28fdf7 Binary files /dev/null and b/.git_disabled/objects/a5/0cf08a062a5814caecce633a86be7c7d64ec7f differ diff --git a/.git_disabled/objects/a5/1363870169d9a2d867c28fe3faba072dc7e2d6 b/.git_disabled/objects/a5/1363870169d9a2d867c28fe3faba072dc7e2d6 new file mode 100755 index 0000000..62380d5 Binary files /dev/null and b/.git_disabled/objects/a5/1363870169d9a2d867c28fe3faba072dc7e2d6 differ diff --git a/.git_disabled/objects/a5/192d2bd59700d076ff12b4fe74d8f0ee878aba b/.git_disabled/objects/a5/192d2bd59700d076ff12b4fe74d8f0ee878aba new file mode 100755 index 0000000..d0407a0 Binary files /dev/null and b/.git_disabled/objects/a5/192d2bd59700d076ff12b4fe74d8f0ee878aba differ diff --git a/.git_disabled/objects/a5/2521548cebb96a0580aed49eb6255c00503665 b/.git_disabled/objects/a5/2521548cebb96a0580aed49eb6255c00503665 new file mode 100755 index 0000000..9e9bd86 Binary files /dev/null and b/.git_disabled/objects/a5/2521548cebb96a0580aed49eb6255c00503665 differ diff --git a/.git_disabled/objects/a5/3f272b6cbbac2dcd7ae0832230f0455a4f5ed0 b/.git_disabled/objects/a5/3f272b6cbbac2dcd7ae0832230f0455a4f5ed0 new file mode 100755 index 0000000..4e9a2ed Binary files /dev/null and b/.git_disabled/objects/a5/3f272b6cbbac2dcd7ae0832230f0455a4f5ed0 differ diff --git a/.git_disabled/objects/a5/47bf36d8d11a4f89c59c144f24795749086dd1 b/.git_disabled/objects/a5/47bf36d8d11a4f89c59c144f24795749086dd1 new file mode 100755 index 0000000..acadfb2 Binary files /dev/null and b/.git_disabled/objects/a5/47bf36d8d11a4f89c59c144f24795749086dd1 differ diff --git a/.git_disabled/objects/a5/5cf1128c375afe7884af8cd21f256776cea028 b/.git_disabled/objects/a5/5cf1128c375afe7884af8cd21f256776cea028 new file mode 100755 index 0000000..1b3486f Binary files /dev/null and b/.git_disabled/objects/a5/5cf1128c375afe7884af8cd21f256776cea028 differ diff --git a/.git_disabled/objects/a5/70b25779e55f8fe8f4ad859b11b762d0151d4d b/.git_disabled/objects/a5/70b25779e55f8fe8f4ad859b11b762d0151d4d new file mode 100755 index 0000000..155af8a Binary files /dev/null and b/.git_disabled/objects/a5/70b25779e55f8fe8f4ad859b11b762d0151d4d differ diff --git a/.git_disabled/objects/a5/7d5333d478638c3b4bad9862eb8888a920a890 b/.git_disabled/objects/a5/7d5333d478638c3b4bad9862eb8888a920a890 new file mode 100755 index 0000000..2fdedaf --- /dev/null +++ b/.git_disabled/objects/a5/7d5333d478638c3b4bad9862eb8888a920a890 @@ -0,0 +1,2 @@ +xK +0Ego.H4?q$/m$Ʈߊ+JAJ<8s䁔ҩ1h=.T;v"ZipSH23AK\+C }n r +p~:Sh|(4p:;nTZa:>HK \ No newline at end of file diff --git a/.git_disabled/objects/a5/81c398913ff35fa067de1993ef1807c51e54e4 b/.git_disabled/objects/a5/81c398913ff35fa067de1993ef1807c51e54e4 new file mode 100755 index 0000000..9ba067e Binary files /dev/null and b/.git_disabled/objects/a5/81c398913ff35fa067de1993ef1807c51e54e4 differ diff --git a/.git_disabled/objects/a5/839ea838fe2bb0c1b1bc30f8691fce29431198 b/.git_disabled/objects/a5/839ea838fe2bb0c1b1bc30f8691fce29431198 new file mode 100755 index 0000000..b39ecc3 Binary files /dev/null and b/.git_disabled/objects/a5/839ea838fe2bb0c1b1bc30f8691fce29431198 differ diff --git a/.git_disabled/objects/a5/8c3e5b3df578451b6282259e43194e3c825b7e b/.git_disabled/objects/a5/8c3e5b3df578451b6282259e43194e3c825b7e new file mode 100755 index 0000000..5b725b6 Binary files /dev/null and b/.git_disabled/objects/a5/8c3e5b3df578451b6282259e43194e3c825b7e differ diff --git a/.git_disabled/objects/a5/9150a2cb167e419e4aa3ffc477d63014ab44e4 b/.git_disabled/objects/a5/9150a2cb167e419e4aa3ffc477d63014ab44e4 new file mode 100755 index 0000000..d8ef6df Binary files /dev/null and b/.git_disabled/objects/a5/9150a2cb167e419e4aa3ffc477d63014ab44e4 differ diff --git a/.git_disabled/objects/a5/b0ca203c5e938e3d2154d1245472d9c3c1f2cf b/.git_disabled/objects/a5/b0ca203c5e938e3d2154d1245472d9c3c1f2cf new file mode 100755 index 0000000..50771f5 Binary files /dev/null and b/.git_disabled/objects/a5/b0ca203c5e938e3d2154d1245472d9c3c1f2cf differ diff --git a/.git_disabled/objects/a5/b2f052326f44f558c1f30e123a10143f95bcac b/.git_disabled/objects/a5/b2f052326f44f558c1f30e123a10143f95bcac new file mode 100755 index 0000000..172dcc6 Binary files /dev/null and b/.git_disabled/objects/a5/b2f052326f44f558c1f30e123a10143f95bcac differ diff --git a/.git_disabled/objects/a5/c14c594ef93538d53db4750614419f1bc1d5d1 b/.git_disabled/objects/a5/c14c594ef93538d53db4750614419f1bc1d5d1 new file mode 100755 index 0000000..28a6560 Binary files /dev/null and b/.git_disabled/objects/a5/c14c594ef93538d53db4750614419f1bc1d5d1 differ diff --git a/.git_disabled/objects/a5/c685a427b678eade42f26ea97698f9c6e87ce9 b/.git_disabled/objects/a5/c685a427b678eade42f26ea97698f9c6e87ce9 new file mode 100755 index 0000000..199da33 --- /dev/null +++ b/.git_disabled/objects/a5/c685a427b678eade42f26ea97698f9c6e87ce9 @@ -0,0 +1,2 @@ +xu10 Es +0ұ b6*75(" =! Qzhe4 <1I6آ^bR ɂ0F|DU8ɝxyYʠ kZ׮}+vhy(eƱϵTY?EM \ No newline at end of file diff --git a/.git_disabled/objects/a5/cd9781204fcfee0521afdfaf69eb17445e9c78 b/.git_disabled/objects/a5/cd9781204fcfee0521afdfaf69eb17445e9c78 new file mode 100755 index 0000000..0f627ae Binary files /dev/null and b/.git_disabled/objects/a5/cd9781204fcfee0521afdfaf69eb17445e9c78 differ diff --git a/.git_disabled/objects/a5/e847b24c9f8b3e624bc8be1b67bb3ef6fbb2bd b/.git_disabled/objects/a5/e847b24c9f8b3e624bc8be1b67bb3ef6fbb2bd new file mode 100755 index 0000000..eb7c785 Binary files /dev/null and b/.git_disabled/objects/a5/e847b24c9f8b3e624bc8be1b67bb3ef6fbb2bd differ diff --git a/.git_disabled/objects/a5/f7f22cacaed69df61b5f8ca81e7e80024d3b12 b/.git_disabled/objects/a5/f7f22cacaed69df61b5f8ca81e7e80024d3b12 new file mode 100755 index 0000000..c7a72e3 Binary files /dev/null and b/.git_disabled/objects/a5/f7f22cacaed69df61b5f8ca81e7e80024d3b12 differ diff --git a/.git_disabled/objects/a6/09700afc4c58d97fac58e143c201a75db29667 b/.git_disabled/objects/a6/09700afc4c58d97fac58e143c201a75db29667 new file mode 100755 index 0000000..4f43ab4 Binary files /dev/null and b/.git_disabled/objects/a6/09700afc4c58d97fac58e143c201a75db29667 differ diff --git a/.git_disabled/objects/a6/0ba1da5450d61b3e2eeb660e8523a9503d3933 b/.git_disabled/objects/a6/0ba1da5450d61b3e2eeb660e8523a9503d3933 new file mode 100755 index 0000000..379d766 Binary files /dev/null and b/.git_disabled/objects/a6/0ba1da5450d61b3e2eeb660e8523a9503d3933 differ diff --git a/.git_disabled/objects/a6/0cae9ba484df91bf831fd447746595fb33d856 b/.git_disabled/objects/a6/0cae9ba484df91bf831fd447746595fb33d856 new file mode 100755 index 0000000..17114ef Binary files /dev/null and b/.git_disabled/objects/a6/0cae9ba484df91bf831fd447746595fb33d856 differ diff --git a/.git_disabled/objects/a6/12e8799d9e47c8ce6aa032259cf0bb337e9f00 b/.git_disabled/objects/a6/12e8799d9e47c8ce6aa032259cf0bb337e9f00 new file mode 100755 index 0000000..4e0bea5 Binary files /dev/null and b/.git_disabled/objects/a6/12e8799d9e47c8ce6aa032259cf0bb337e9f00 differ diff --git a/.git_disabled/objects/a6/15e0d17a340f73534964c3a2fd6a1fbc601043 b/.git_disabled/objects/a6/15e0d17a340f73534964c3a2fd6a1fbc601043 new file mode 100755 index 0000000..2770833 Binary files /dev/null and b/.git_disabled/objects/a6/15e0d17a340f73534964c3a2fd6a1fbc601043 differ diff --git a/.git_disabled/objects/a6/36b34cf2796ba7352772ac15812c7f00b2432f b/.git_disabled/objects/a6/36b34cf2796ba7352772ac15812c7f00b2432f new file mode 100755 index 0000000..933bd84 Binary files /dev/null and b/.git_disabled/objects/a6/36b34cf2796ba7352772ac15812c7f00b2432f differ diff --git a/.git_disabled/objects/a6/397c97fda9f558726dd8594031602cadbe71ce b/.git_disabled/objects/a6/397c97fda9f558726dd8594031602cadbe71ce new file mode 100755 index 0000000..d7b70e3 Binary files /dev/null and b/.git_disabled/objects/a6/397c97fda9f558726dd8594031602cadbe71ce differ diff --git a/.git_disabled/objects/a6/3e6c8facb0349729a98f1c1b818da985c514ab b/.git_disabled/objects/a6/3e6c8facb0349729a98f1c1b818da985c514ab new file mode 100755 index 0000000..40129af --- /dev/null +++ b/.git_disabled/objects/a6/3e6c8facb0349729a98f1c1b818da985c514ab @@ -0,0 +1,3 @@ +x +0=)r$DīF)m|27LLMmedO' |>O' |>O' |>O'N+_H~?JRjRST2T({9 +RPjT +)ET@KO)5A թFUPb*QDE +RPjT +)ET@ O)5A թFUPb*QDE +=RPjT +)ET@.ԠT*UL1("vr<Ԥ%TUBeD)PSJMjPBuQ*TJQer<Ԥ%O' |>O' |>O' Cnn}g[ɶCX.ɟ߂a>|xwۅpOcܻu|!܅{ķn}.-S +wou8W_%^/7f|Aψ7[9Z|V\?W73ir<-'aJ| ^|N|>%O/' ߈O-QG+q'&?vx= }F<ϋo7ki]oxJ|5>%O ekBx>R܏/}CnG܅N<*.a$}Qlۉ7Ŷ߶mmElJ~;"vBϴ]?Z%y߼mخ߱>%}9r@lwخb>xO^~b~ŶĶmߍz~KlXlې~ONm~&G*SOĶo?#]vPlv/1탣bχv?km?~Wlbompɸv4Xm˫Uϒd ٦Ay"AB +aQϩхkQ] l`;":]ue:[)PH +s"lUE{V ~JEިsP~}+Zu>YfTO X^U6U{ҹE]9y:6{Fބ-$O 'ۿge:r'Lg 78[㗰-o3ı'>RȞ>AK)8P~N_^o7dt1}v?^~LD)ׁ\1 M3m=pp]w>b PO%~33Z)0| +K{j%0M"4IR{ \ No newline at end of file diff --git a/.git_disabled/objects/a9/900301b1802202361887b9b93d9862c33987b5 b/.git_disabled/objects/a9/900301b1802202361887b9b93d9862c33987b5 new file mode 100755 index 0000000..bc3dd3b Binary files /dev/null and b/.git_disabled/objects/a9/900301b1802202361887b9b93d9862c33987b5 differ diff --git a/.git_disabled/objects/a9/99dc9771cc60c137a4e521f042882671f4cdd4 b/.git_disabled/objects/a9/99dc9771cc60c137a4e521f042882671f4cdd4 new file mode 100755 index 0000000..d9863ef Binary files /dev/null and b/.git_disabled/objects/a9/99dc9771cc60c137a4e521f042882671f4cdd4 differ diff --git a/.git_disabled/objects/a9/e2dd0a4cddab6dd93f83784fb4aae421141642 b/.git_disabled/objects/a9/e2dd0a4cddab6dd93f83784fb4aae421141642 new file mode 100755 index 0000000..3cbf565 Binary files /dev/null and b/.git_disabled/objects/a9/e2dd0a4cddab6dd93f83784fb4aae421141642 differ diff --git a/.git_disabled/objects/a9/ea2b0150f8a3024f3893a7a2989123b1fe7754 b/.git_disabled/objects/a9/ea2b0150f8a3024f3893a7a2989123b1fe7754 new file mode 100755 index 0000000..00064ef Binary files /dev/null and b/.git_disabled/objects/a9/ea2b0150f8a3024f3893a7a2989123b1fe7754 differ diff --git a/.git_disabled/objects/a9/f247169983a455a4e1db259741a44831584db9 b/.git_disabled/objects/a9/f247169983a455a4e1db259741a44831584db9 new file mode 100755 index 0000000..ea3b0e7 Binary files /dev/null and b/.git_disabled/objects/a9/f247169983a455a4e1db259741a44831584db9 differ diff --git a/.git_disabled/objects/a9/fc074d97660d94aaedea97cacff29fac207120 b/.git_disabled/objects/a9/fc074d97660d94aaedea97cacff29fac207120 new file mode 100755 index 0000000..00e7fdf Binary files /dev/null and b/.git_disabled/objects/a9/fc074d97660d94aaedea97cacff29fac207120 differ diff --git a/.git_disabled/objects/aa/12787c7bf977761e08a25378059bbd09a7c7fa b/.git_disabled/objects/aa/12787c7bf977761e08a25378059bbd09a7c7fa new file mode 100755 index 0000000..5380486 Binary files /dev/null and b/.git_disabled/objects/aa/12787c7bf977761e08a25378059bbd09a7c7fa differ diff --git a/.git_disabled/objects/aa/138b84a54c33dc3ff213d07e26359d33fad1c1 b/.git_disabled/objects/aa/138b84a54c33dc3ff213d07e26359d33fad1c1 new file mode 100755 index 0000000..3627c86 Binary files /dev/null and b/.git_disabled/objects/aa/138b84a54c33dc3ff213d07e26359d33fad1c1 differ diff --git a/.git_disabled/objects/aa/1b67f7514bfa731c71ec3a23065ba8bdc8df90 b/.git_disabled/objects/aa/1b67f7514bfa731c71ec3a23065ba8bdc8df90 new file mode 100755 index 0000000..f80fe40 Binary files /dev/null and b/.git_disabled/objects/aa/1b67f7514bfa731c71ec3a23065ba8bdc8df90 differ diff --git a/.git_disabled/objects/aa/2bf8bc9e1b45d61edf1a58065ff417cb0522e3 b/.git_disabled/objects/aa/2bf8bc9e1b45d61edf1a58065ff417cb0522e3 new file mode 100755 index 0000000..77140da Binary files /dev/null and b/.git_disabled/objects/aa/2bf8bc9e1b45d61edf1a58065ff417cb0522e3 differ diff --git a/.git_disabled/objects/aa/2ce1ddc4d2f9be1232c9182b048549e780a184 b/.git_disabled/objects/aa/2ce1ddc4d2f9be1232c9182b048549e780a184 new file mode 100755 index 0000000..a7ee256 Binary files /dev/null and b/.git_disabled/objects/aa/2ce1ddc4d2f9be1232c9182b048549e780a184 differ diff --git a/.git_disabled/objects/aa/3516ec5f5cf82e3cbd7928a9ee98484c327543 b/.git_disabled/objects/aa/3516ec5f5cf82e3cbd7928a9ee98484c327543 new file mode 100755 index 0000000..50660b1 --- /dev/null +++ b/.git_disabled/objects/aa/3516ec5f5cf82e3cbd7928a9ee98484c327543 @@ -0,0 +1,7 @@ +xuSoEz[HA + coXJZ!Rp@{Yw&ɖpgGBJ$Ni%$r,JNܹ8J$!qڦn>i罙߼y_mQPWgں@BO7NE# aH$ˁb)-,ѱ:8c "ɾ5ZVx/7w5 э^'k;NU/\Yb/ + B _؝]!$i3<%NB + fٜ,W&jb˵Z\M]ȴv.ar crᘁChR'tli?f:&-؎B:E(n[k$pJK?!j;߹)՚ +<@:-psZXjuX{.l!: +̲pf3(@r{,$:j,󁅥y+X9PK>i,́h "No_kB-i.ܭ>$Bp2h^QU~4m)YZk6)@6x$9uJ|z|90?A5ԛ탁`4\Ldzq1KS8_&o.ٰ ^[OeA0ZxD,uM8qnS1Y.0-m0LJՉ(HlW6μԜFD`f#IɂsܸkLU{@(NgKKCq$ǃzZ*[rWk*wM+!{0 ?M.i\B|@mcv *KnwShk-?PE \ No newline at end of file diff --git a/.git_disabled/objects/ac/42bebb511aa297fc1ef17c4c9a68c345580fb7 b/.git_disabled/objects/ac/42bebb511aa297fc1ef17c4c9a68c345580fb7 new file mode 100755 index 0000000..782e6a2 Binary files /dev/null and b/.git_disabled/objects/ac/42bebb511aa297fc1ef17c4c9a68c345580fb7 differ diff --git a/.git_disabled/objects/ac/42ebd9fde10ac05f86cd9c696d0de2e46471d4 b/.git_disabled/objects/ac/42ebd9fde10ac05f86cd9c696d0de2e46471d4 new file mode 100755 index 0000000..f9c4a4f Binary files /dev/null and b/.git_disabled/objects/ac/42ebd9fde10ac05f86cd9c696d0de2e46471d4 differ diff --git a/.git_disabled/objects/ac/469d3a0c68c51c3b12ee08e94c08291472f697 b/.git_disabled/objects/ac/469d3a0c68c51c3b12ee08e94c08291472f697 new file mode 100755 index 0000000..957cabf Binary files /dev/null and b/.git_disabled/objects/ac/469d3a0c68c51c3b12ee08e94c08291472f697 differ diff --git a/.git_disabled/objects/ac/55bb43fdf062ae56429f10cfccb7bd76ab417a b/.git_disabled/objects/ac/55bb43fdf062ae56429f10cfccb7bd76ab417a new file mode 100755 index 0000000..4873189 Binary files /dev/null and b/.git_disabled/objects/ac/55bb43fdf062ae56429f10cfccb7bd76ab417a differ diff --git a/.git_disabled/objects/ac/575a15ef2e58842a7b6899a9ef1ee19160bc87 b/.git_disabled/objects/ac/575a15ef2e58842a7b6899a9ef1ee19160bc87 new file mode 100755 index 0000000..b25a5b9 Binary files /dev/null and b/.git_disabled/objects/ac/575a15ef2e58842a7b6899a9ef1ee19160bc87 differ diff --git a/.git_disabled/objects/ac/6e994bd84f056c6a60d7fd28ddafae51f3e531 b/.git_disabled/objects/ac/6e994bd84f056c6a60d7fd28ddafae51f3e531 new file mode 100755 index 0000000..58db519 --- /dev/null +++ b/.git_disabled/objects/ac/6e994bd84f056c6a60d7fd28ddafae51f3e531 @@ -0,0 +1 @@ +x% B^{5ZibF]̈́jFR6E ?dy!2% -%з T*~([G).#qu~߿+6 \ No newline at end of file diff --git a/.git_disabled/objects/ac/720499b7bf73e84e6d385702ccbba46b5f3148 b/.git_disabled/objects/ac/720499b7bf73e84e6d385702ccbba46b5f3148 new file mode 100755 index 0000000..ed3675e Binary files /dev/null and b/.git_disabled/objects/ac/720499b7bf73e84e6d385702ccbba46b5f3148 differ diff --git a/.git_disabled/objects/ac/7d03c67ef53c86748ca919d0ba4569b53929ff b/.git_disabled/objects/ac/7d03c67ef53c86748ca919d0ba4569b53929ff new file mode 100755 index 0000000..9a3464f Binary files /dev/null and b/.git_disabled/objects/ac/7d03c67ef53c86748ca919d0ba4569b53929ff differ diff --git a/.git_disabled/objects/ac/879e93e6ae97840cd2da0f9f8fa3565c7c55e0 b/.git_disabled/objects/ac/879e93e6ae97840cd2da0f9f8fa3565c7c55e0 new file mode 100755 index 0000000..49aeae9 Binary files /dev/null and b/.git_disabled/objects/ac/879e93e6ae97840cd2da0f9f8fa3565c7c55e0 differ diff --git a/.git_disabled/objects/ac/9305f8653f8c7883ae4a980f02bb3ffae4dc43 b/.git_disabled/objects/ac/9305f8653f8c7883ae4a980f02bb3ffae4dc43 new file mode 100755 index 0000000..7438b56 Binary files /dev/null and b/.git_disabled/objects/ac/9305f8653f8c7883ae4a980f02bb3ffae4dc43 differ diff --git a/.git_disabled/objects/ac/a70d6c445dd853345c208cce13ee7a2039ba06 b/.git_disabled/objects/ac/a70d6c445dd853345c208cce13ee7a2039ba06 new file mode 100755 index 0000000..02c3022 Binary files /dev/null and b/.git_disabled/objects/ac/a70d6c445dd853345c208cce13ee7a2039ba06 differ diff --git a/.git_disabled/objects/ac/add0d8a7cf3554d72708c243ce4e95bf250e87 b/.git_disabled/objects/ac/add0d8a7cf3554d72708c243ce4e95bf250e87 new file mode 100755 index 0000000..27d8951 Binary files /dev/null and b/.git_disabled/objects/ac/add0d8a7cf3554d72708c243ce4e95bf250e87 differ diff --git a/.git_disabled/objects/ac/ce4e9f8b7556c713e48775829d63beea64bf14 b/.git_disabled/objects/ac/ce4e9f8b7556c713e48775829d63beea64bf14 new file mode 100755 index 0000000..f827a36 Binary files /dev/null and b/.git_disabled/objects/ac/ce4e9f8b7556c713e48775829d63beea64bf14 differ diff --git a/.git_disabled/objects/ac/d2db5f54c42032f153b3a76f2e8d76c40c70d5 b/.git_disabled/objects/ac/d2db5f54c42032f153b3a76f2e8d76c40c70d5 new file mode 100755 index 0000000..a6be2ed Binary files /dev/null and b/.git_disabled/objects/ac/d2db5f54c42032f153b3a76f2e8d76c40c70d5 differ diff --git a/.git_disabled/objects/ac/d8ba2e58faba7e89d1a7af3231fcd06ae84f5f b/.git_disabled/objects/ac/d8ba2e58faba7e89d1a7af3231fcd06ae84f5f new file mode 100755 index 0000000..62b0e50 --- /dev/null +++ b/.git_disabled/objects/ac/d8ba2e58faba7e89d1a7af3231fcd06ae84f5f @@ -0,0 +1,8 @@ +xVn69_Aۀbd,;l7 +cTI*؏1Ǣ@N{_J%nmug\9n7 bb~LgljҖ+'B'S|2df<|^L|r4HA w'4)%a#qvcUE*;K~8ϙf +rovvWSRm6HCn*꺏yC ’9ϭ8q 3XFwM1qwÔZ6 Y C:e.*2HtdJGϸ*2x!5RbLiCLPպ.uytF:lr%xՐ۽^|K:=~?|?s>\ r4ɀBU9$ γ|<pU!ɲx%mgwEP?XE^b@pf;loQ녣4-Tfnv߼<d +R5Xͤ,YT;B +ڴu?( \ No newline at end of file diff --git a/.git_disabled/objects/ac/dc317b54b0d482c6f2dd38a5e5f4773be5f865 b/.git_disabled/objects/ac/dc317b54b0d482c6f2dd38a5e5f4773be5f865 new file mode 100755 index 0000000..d34c92f Binary files /dev/null and b/.git_disabled/objects/ac/dc317b54b0d482c6f2dd38a5e5f4773be5f865 differ diff --git a/.git_disabled/objects/ac/f588dffcdc9f2cf0bc4a35c4759c72fbed1925 b/.git_disabled/objects/ac/f588dffcdc9f2cf0bc4a35c4759c72fbed1925 new file mode 100755 index 0000000..2026ed9 Binary files /dev/null and b/.git_disabled/objects/ac/f588dffcdc9f2cf0bc4a35c4759c72fbed1925 differ diff --git a/.git_disabled/objects/ad/0300b1e2864f706ec8b8ff4842f202f5e9a323 b/.git_disabled/objects/ad/0300b1e2864f706ec8b8ff4842f202f5e9a323 new file mode 100755 index 0000000..24e767a Binary files /dev/null and b/.git_disabled/objects/ad/0300b1e2864f706ec8b8ff4842f202f5e9a323 differ diff --git a/.git_disabled/objects/ad/035d88d58b6558c6336a56a0ebe210c1c8dbdf b/.git_disabled/objects/ad/035d88d58b6558c6336a56a0ebe210c1c8dbdf new file mode 100755 index 0000000..f8fe592 Binary files /dev/null and b/.git_disabled/objects/ad/035d88d58b6558c6336a56a0ebe210c1c8dbdf differ diff --git a/.git_disabled/objects/ad/0a3943e09f0868c77aed4cd482dd83c20c0699 b/.git_disabled/objects/ad/0a3943e09f0868c77aed4cd482dd83c20c0699 new file mode 100755 index 0000000..a930497 Binary files /dev/null and b/.git_disabled/objects/ad/0a3943e09f0868c77aed4cd482dd83c20c0699 differ diff --git a/.git_disabled/objects/ad/2652c36e7712ce2a90f160006f9887a2a828af b/.git_disabled/objects/ad/2652c36e7712ce2a90f160006f9887a2a828af new file mode 100755 index 0000000..bbafac2 Binary files /dev/null and b/.git_disabled/objects/ad/2652c36e7712ce2a90f160006f9887a2a828af differ diff --git a/.git_disabled/objects/ad/8375b2423f1d63fa28c901790409f28d942e74 b/.git_disabled/objects/ad/8375b2423f1d63fa28c901790409f28d942e74 new file mode 100755 index 0000000..0b7f469 Binary files /dev/null and b/.git_disabled/objects/ad/8375b2423f1d63fa28c901790409f28d942e74 differ diff --git a/.git_disabled/objects/ad/8ada16e5dd99f2ee4bc8adddd3e3d5f6173859 b/.git_disabled/objects/ad/8ada16e5dd99f2ee4bc8adddd3e3d5f6173859 new file mode 100755 index 0000000..e2ca0bc Binary files /dev/null and b/.git_disabled/objects/ad/8ada16e5dd99f2ee4bc8adddd3e3d5f6173859 differ diff --git a/.git_disabled/objects/ad/95206103d48a97904db9909376d069f6fd634d b/.git_disabled/objects/ad/95206103d48a97904db9909376d069f6fd634d new file mode 100755 index 0000000..b41cdc1 Binary files /dev/null and b/.git_disabled/objects/ad/95206103d48a97904db9909376d069f6fd634d differ diff --git a/.git_disabled/objects/ad/9805b22a28b871ade748fb3bd8d07d3f9b618e b/.git_disabled/objects/ad/9805b22a28b871ade748fb3bd8d07d3f9b618e new file mode 100755 index 0000000..31f346a Binary files /dev/null and b/.git_disabled/objects/ad/9805b22a28b871ade748fb3bd8d07d3f9b618e differ diff --git a/.git_disabled/objects/ad/9da2ba71a382f4af20bd7d54aa83d5db51d45d b/.git_disabled/objects/ad/9da2ba71a382f4af20bd7d54aa83d5db51d45d new file mode 100755 index 0000000..425d5eb Binary files /dev/null and b/.git_disabled/objects/ad/9da2ba71a382f4af20bd7d54aa83d5db51d45d differ diff --git a/.git_disabled/objects/ad/ac0933b9e29822686b55f5de3b8241e132400d b/.git_disabled/objects/ad/ac0933b9e29822686b55f5de3b8241e132400d new file mode 100755 index 0000000..aef2efa Binary files /dev/null and b/.git_disabled/objects/ad/ac0933b9e29822686b55f5de3b8241e132400d differ diff --git a/.git_disabled/objects/ad/b06d6cc2920c7f7bbe0e8eb926f7afa617fede b/.git_disabled/objects/ad/b06d6cc2920c7f7bbe0e8eb926f7afa617fede new file mode 100755 index 0000000..1c7587a Binary files /dev/null and b/.git_disabled/objects/ad/b06d6cc2920c7f7bbe0e8eb926f7afa617fede differ diff --git a/.git_disabled/objects/ad/c86289fa1e6c98c3a023bb5b86d2a207349319 b/.git_disabled/objects/ad/c86289fa1e6c98c3a023bb5b86d2a207349319 new file mode 100755 index 0000000..604680e Binary files /dev/null and b/.git_disabled/objects/ad/c86289fa1e6c98c3a023bb5b86d2a207349319 differ diff --git a/.git_disabled/objects/ad/d269066d6c4424e2090d867a779cbb124b296e b/.git_disabled/objects/ad/d269066d6c4424e2090d867a779cbb124b296e new file mode 100755 index 0000000..1b2407a Binary files /dev/null and b/.git_disabled/objects/ad/d269066d6c4424e2090d867a779cbb124b296e differ diff --git a/.git_disabled/objects/ad/d888a533d2d7ea58b3078844b4590d4358365f b/.git_disabled/objects/ad/d888a533d2d7ea58b3078844b4590d4358365f new file mode 100755 index 0000000..15172b3 Binary files /dev/null and b/.git_disabled/objects/ad/d888a533d2d7ea58b3078844b4590d4358365f differ diff --git a/.git_disabled/objects/ad/f7b05bd996886a9d90a7d9203ff44f9058fabb b/.git_disabled/objects/ad/f7b05bd996886a9d90a7d9203ff44f9058fabb new file mode 100755 index 0000000..c2e8017 Binary files /dev/null and b/.git_disabled/objects/ad/f7b05bd996886a9d90a7d9203ff44f9058fabb differ diff --git a/.git_disabled/objects/ad/fe4e0c7f55ac30730ebded5d154ea8a914a945 b/.git_disabled/objects/ad/fe4e0c7f55ac30730ebded5d154ea8a914a945 new file mode 100755 index 0000000..6d31328 Binary files /dev/null and b/.git_disabled/objects/ad/fe4e0c7f55ac30730ebded5d154ea8a914a945 differ diff --git a/.git_disabled/objects/ae/0595a7841bb197dd00aa72b86adb8cf073ca2f b/.git_disabled/objects/ae/0595a7841bb197dd00aa72b86adb8cf073ca2f new file mode 100755 index 0000000..1cffdfd Binary files /dev/null and b/.git_disabled/objects/ae/0595a7841bb197dd00aa72b86adb8cf073ca2f differ diff --git a/.git_disabled/objects/ae/0b9ae9b6473da0c861f3cd73d54906ceeab6a8 b/.git_disabled/objects/ae/0b9ae9b6473da0c861f3cd73d54906ceeab6a8 new file mode 100755 index 0000000..c59b9de Binary files /dev/null and b/.git_disabled/objects/ae/0b9ae9b6473da0c861f3cd73d54906ceeab6a8 differ diff --git a/.git_disabled/objects/ae/3830ca062d25dc8dca6cfb9f20593abe1afb77 b/.git_disabled/objects/ae/3830ca062d25dc8dca6cfb9f20593abe1afb77 new file mode 100755 index 0000000..a5a790d --- /dev/null +++ b/.git_disabled/objects/ae/3830ca062d25dc8dca6cfb9f20593abe1afb77 @@ -0,0 +1 @@ +x+)JMU066c040075U,+dȋb]Ѝ!WQfY5[nʳfOg},9'dQU?JKgJ=K1\_O"$#?ʯh6s?Y@f ܛ^_r?).Ģ"=-^ >9ߏmSTWRYPf{ѧ2KgOYUSXZ 2+^_bӛGwp켬C+ԢLW]'vfUU[e \ No newline at end of file diff --git a/.git_disabled/objects/ae/4a7255ac0c3d01842e8cc3166ea694e4ae3347 b/.git_disabled/objects/ae/4a7255ac0c3d01842e8cc3166ea694e4ae3347 new file mode 100755 index 0000000..f64ab1e Binary files /dev/null and b/.git_disabled/objects/ae/4a7255ac0c3d01842e8cc3166ea694e4ae3347 differ diff --git a/.git_disabled/objects/ae/574b5001598d7d72f4502fe15484655fc26170 b/.git_disabled/objects/ae/574b5001598d7d72f4502fe15484655fc26170 new file mode 100755 index 0000000..94cb6f0 Binary files /dev/null and b/.git_disabled/objects/ae/574b5001598d7d72f4502fe15484655fc26170 differ diff --git a/.git_disabled/objects/ae/5c1d8385c7b089e4de74a8250ed5adb64be873 b/.git_disabled/objects/ae/5c1d8385c7b089e4de74a8250ed5adb64be873 new file mode 100755 index 0000000..31df57a Binary files /dev/null and b/.git_disabled/objects/ae/5c1d8385c7b089e4de74a8250ed5adb64be873 differ diff --git a/.git_disabled/objects/ae/78694f6d4d0eb734e68dc2a90f96b59852976e b/.git_disabled/objects/ae/78694f6d4d0eb734e68dc2a90f96b59852976e new file mode 100755 index 0000000..b53b8df Binary files /dev/null and b/.git_disabled/objects/ae/78694f6d4d0eb734e68dc2a90f96b59852976e differ diff --git a/.git_disabled/objects/ae/8a9c5bf2b9aee752c582f2d266f0903853e92d b/.git_disabled/objects/ae/8a9c5bf2b9aee752c582f2d266f0903853e92d new file mode 100755 index 0000000..29708bf Binary files /dev/null and b/.git_disabled/objects/ae/8a9c5bf2b9aee752c582f2d266f0903853e92d differ diff --git a/.git_disabled/objects/ae/8ec1bdaa94d726ceb907542d76cbd5d38cafcd b/.git_disabled/objects/ae/8ec1bdaa94d726ceb907542d76cbd5d38cafcd new file mode 100755 index 0000000..9060e2a Binary files /dev/null and b/.git_disabled/objects/ae/8ec1bdaa94d726ceb907542d76cbd5d38cafcd differ diff --git a/.git_disabled/objects/ae/8f2434dc43ca5b863475ddbb64ec32638ab68a b/.git_disabled/objects/ae/8f2434dc43ca5b863475ddbb64ec32638ab68a new file mode 100755 index 0000000..713b667 Binary files /dev/null and b/.git_disabled/objects/ae/8f2434dc43ca5b863475ddbb64ec32638ab68a differ diff --git a/.git_disabled/objects/ae/cdbfe5b306f4957a95e83d75bde9ad5a38462d b/.git_disabled/objects/ae/cdbfe5b306f4957a95e83d75bde9ad5a38462d new file mode 100755 index 0000000..16e077c Binary files /dev/null and b/.git_disabled/objects/ae/cdbfe5b306f4957a95e83d75bde9ad5a38462d differ diff --git a/.git_disabled/objects/ae/eb23eeb318246d9a9ef61e73ece4db6c8b154e b/.git_disabled/objects/ae/eb23eeb318246d9a9ef61e73ece4db6c8b154e new file mode 100755 index 0000000..cfef5e2 Binary files /dev/null and b/.git_disabled/objects/ae/eb23eeb318246d9a9ef61e73ece4db6c8b154e differ diff --git a/.git_disabled/objects/ae/fa40dd689bd8991b607adcb3ae6f91ac4f6ab8 b/.git_disabled/objects/ae/fa40dd689bd8991b607adcb3ae6f91ac4f6ab8 new file mode 100755 index 0000000..e216cab Binary files /dev/null and b/.git_disabled/objects/ae/fa40dd689bd8991b607adcb3ae6f91ac4f6ab8 differ diff --git a/.git_disabled/objects/ae/fec6504fc749ef8a2468cd2371a726916494c4 b/.git_disabled/objects/ae/fec6504fc749ef8a2468cd2371a726916494c4 new file mode 100755 index 0000000..9e3dd3e Binary files /dev/null and b/.git_disabled/objects/ae/fec6504fc749ef8a2468cd2371a726916494c4 differ diff --git a/.git_disabled/objects/af/24bd83e1f2c5c89c5e17b973402a1153514a05 b/.git_disabled/objects/af/24bd83e1f2c5c89c5e17b973402a1153514a05 new file mode 100755 index 0000000..6aa71e1 Binary files /dev/null and b/.git_disabled/objects/af/24bd83e1f2c5c89c5e17b973402a1153514a05 differ diff --git a/.git_disabled/objects/af/53cab66374089e52473f2b46f428b4f15bb2e8 b/.git_disabled/objects/af/53cab66374089e52473f2b46f428b4f15bb2e8 new file mode 100755 index 0000000..eab43c4 Binary files /dev/null and b/.git_disabled/objects/af/53cab66374089e52473f2b46f428b4f15bb2e8 differ diff --git a/.git_disabled/objects/af/6d7df938a4ded726729f5c419489f363d49403 b/.git_disabled/objects/af/6d7df938a4ded726729f5c419489f363d49403 new file mode 100755 index 0000000..b8ee7e8 Binary files /dev/null and b/.git_disabled/objects/af/6d7df938a4ded726729f5c419489f363d49403 differ diff --git a/.git_disabled/objects/af/7125e18c87b887b264aa0075205196a26a050d b/.git_disabled/objects/af/7125e18c87b887b264aa0075205196a26a050d new file mode 100755 index 0000000..e7f6dfe --- /dev/null +++ b/.git_disabled/objects/af/7125e18c87b887b264aa0075205196a26a050d @@ -0,0 +1 @@ +x 1@@PS|ѫ[Hh(1IeQ `XYYaxt<QOat{ \ No newline at end of file diff --git a/.git_disabled/objects/af/7381147343425d83945531854be0d21bd29e4a b/.git_disabled/objects/af/7381147343425d83945531854be0d21bd29e4a new file mode 100755 index 0000000..5338eee Binary files /dev/null and b/.git_disabled/objects/af/7381147343425d83945531854be0d21bd29e4a differ diff --git a/.git_disabled/objects/af/8356f7e859108e6c8a2298479a5cb80b792d9c b/.git_disabled/objects/af/8356f7e859108e6c8a2298479a5cb80b792d9c new file mode 100755 index 0000000..447caac Binary files /dev/null and b/.git_disabled/objects/af/8356f7e859108e6c8a2298479a5cb80b792d9c differ diff --git a/.git_disabled/objects/af/8bcee5a10d8b792a5b0db5572b99c541eafcea b/.git_disabled/objects/af/8bcee5a10d8b792a5b0db5572b99c541eafcea new file mode 100755 index 0000000..3844790 Binary files /dev/null and b/.git_disabled/objects/af/8bcee5a10d8b792a5b0db5572b99c541eafcea differ diff --git a/.git_disabled/objects/af/9d8dc352da0b7268b1c8ead7ee8e9bd67f2b71 b/.git_disabled/objects/af/9d8dc352da0b7268b1c8ead7ee8e9bd67f2b71 new file mode 100755 index 0000000..2c7004f Binary files /dev/null and b/.git_disabled/objects/af/9d8dc352da0b7268b1c8ead7ee8e9bd67f2b71 differ diff --git a/.git_disabled/objects/af/afca8158c22d479f9cc6705c22affa4a6e9cfc b/.git_disabled/objects/af/afca8158c22d479f9cc6705c22affa4a6e9cfc new file mode 100755 index 0000000..d6e0532 Binary files /dev/null and b/.git_disabled/objects/af/afca8158c22d479f9cc6705c22affa4a6e9cfc differ diff --git a/.git_disabled/objects/af/b33b624fd879c5fc67de92519cff2e7cacd874 b/.git_disabled/objects/af/b33b624fd879c5fc67de92519cff2e7cacd874 new file mode 100755 index 0000000..97d4384 Binary files /dev/null and b/.git_disabled/objects/af/b33b624fd879c5fc67de92519cff2e7cacd874 differ diff --git a/.git_disabled/objects/af/b50cc9a7ae2fcc197dd24e75cab68b39ef2ad7 b/.git_disabled/objects/af/b50cc9a7ae2fcc197dd24e75cab68b39ef2ad7 new file mode 100755 index 0000000..a67b7d0 Binary files /dev/null and b/.git_disabled/objects/af/b50cc9a7ae2fcc197dd24e75cab68b39ef2ad7 differ diff --git a/.git_disabled/objects/af/b79d6a255bcbac0dd8fccf8944a0f07f189830 b/.git_disabled/objects/af/b79d6a255bcbac0dd8fccf8944a0f07f189830 new file mode 100755 index 0000000..4ace80c Binary files /dev/null and b/.git_disabled/objects/af/b79d6a255bcbac0dd8fccf8944a0f07f189830 differ diff --git a/.git_disabled/objects/af/bafcdb02f6e55164207ce4f2a10f0691504c4b b/.git_disabled/objects/af/bafcdb02f6e55164207ce4f2a10f0691504c4b new file mode 100755 index 0000000..7a720a4 Binary files /dev/null and b/.git_disabled/objects/af/bafcdb02f6e55164207ce4f2a10f0691504c4b differ diff --git a/.git_disabled/objects/af/cdefa9c002e35a9d1b15a9bb443013fe1b3428 b/.git_disabled/objects/af/cdefa9c002e35a9d1b15a9bb443013fe1b3428 new file mode 100755 index 0000000..41e629e Binary files /dev/null and b/.git_disabled/objects/af/cdefa9c002e35a9d1b15a9bb443013fe1b3428 differ diff --git a/.git_disabled/objects/af/d5efa05c4746090a9e7e3bc354a279c6075549 b/.git_disabled/objects/af/d5efa05c4746090a9e7e3bc354a279c6075549 new file mode 100755 index 0000000..4a68e3e Binary files /dev/null and b/.git_disabled/objects/af/d5efa05c4746090a9e7e3bc354a279c6075549 differ diff --git a/.git_disabled/objects/af/dae4e36f0879e736691004ff8b28094c2bfa7f b/.git_disabled/objects/af/dae4e36f0879e736691004ff8b28094c2bfa7f new file mode 100755 index 0000000..9f01c42 Binary files /dev/null and b/.git_disabled/objects/af/dae4e36f0879e736691004ff8b28094c2bfa7f differ diff --git a/.git_disabled/objects/af/db6ecfd2b762c9cf495c251ca14dba37533215 b/.git_disabled/objects/af/db6ecfd2b762c9cf495c251ca14dba37533215 new file mode 100755 index 0000000..664e566 Binary files /dev/null and b/.git_disabled/objects/af/db6ecfd2b762c9cf495c251ca14dba37533215 differ diff --git a/.git_disabled/objects/af/ee001b2fa9207d191da7b424bdec6c9eed454d b/.git_disabled/objects/af/ee001b2fa9207d191da7b424bdec6c9eed454d new file mode 100755 index 0000000..c25578f Binary files /dev/null and b/.git_disabled/objects/af/ee001b2fa9207d191da7b424bdec6c9eed454d differ diff --git a/.git_disabled/objects/af/f4935eb8262dced615a6fa19a99dd6eae11ca8 b/.git_disabled/objects/af/f4935eb8262dced615a6fa19a99dd6eae11ca8 new file mode 100755 index 0000000..b0cd440 Binary files /dev/null and b/.git_disabled/objects/af/f4935eb8262dced615a6fa19a99dd6eae11ca8 differ diff --git a/.git_disabled/objects/af/f6f2dec8f5070fffe0a14b72789b90fe593df8 b/.git_disabled/objects/af/f6f2dec8f5070fffe0a14b72789b90fe593df8 new file mode 100755 index 0000000..552e3ae Binary files /dev/null and b/.git_disabled/objects/af/f6f2dec8f5070fffe0a14b72789b90fe593df8 differ diff --git a/.git_disabled/objects/af/fcf7faf21c19fcf021ed9de05ed9b8fd4760a2 b/.git_disabled/objects/af/fcf7faf21c19fcf021ed9de05ed9b8fd4760a2 new file mode 100755 index 0000000..7aee460 Binary files /dev/null and b/.git_disabled/objects/af/fcf7faf21c19fcf021ed9de05ed9b8fd4760a2 differ diff --git a/.git_disabled/objects/af/fe09d7bfd2a03b54af842b8d106383f4b502d7 b/.git_disabled/objects/af/fe09d7bfd2a03b54af842b8d106383f4b502d7 new file mode 100755 index 0000000..50bf922 --- /dev/null +++ b/.git_disabled/objects/af/fe09d7bfd2a03b54af842b8d106383f4b502d7 @@ -0,0 +1,9 @@ +xu¢EPmbeem0aYV170$C 80%%q:STR珏*vb㦉xpdht8ث }2@l'~B?~_/ ~_/ ~_/ ~_/_^`??ٓY=.u**2J)" +QR +))@.u**2J)" +yR +))@>.u**2J)" +yR +))@.u**2J)" +yR +))@c~_/ ~_/ ~}a)gAZAa_ۄG 5K!jv}47RF0f_ "SUq̭ʚșFvM㌹̙*'1uC.*g{s3f^!) +mB6_>Qsh 41H[ V>*r?>M ?㰿=֌66ƻDltMVU??6ӰӶkF' Mw pY/Lך.ft^P80.'H3N؈)kUҰҎӒv:%> \ No newline at end of file diff --git a/.git_disabled/objects/b3/62bf95a2d476b4fee2ff49cd7a9c4b53362fb5 b/.git_disabled/objects/b3/62bf95a2d476b4fee2ff49cd7a9c4b53362fb5 new file mode 100755 index 0000000..c79ce65 --- /dev/null +++ b/.git_disabled/objects/b3/62bf95a2d476b4fee2ff49cd7a9c4b53362fb5 @@ -0,0 +1,2 @@ +x0=)Xx L< x',H,<Htvƶ! xT sE +PWtj9Ah'}90&$:yθ]89[S8|H\:J,1 k", HC]e]VD,0\A:?!Az('#^8;1O:%^OzɁNyc=h??돫y_VUwm1RK&czlSm^ u +ϵ t[Zu(B~_x6F!lh}<|Y%)̬.;&9P":RxjQuvB6-w< H-_ \ No newline at end of file diff --git a/.git_disabled/objects/b5/26e20ac670ae2b4f150c6dc95b90acf3f8d904 b/.git_disabled/objects/b5/26e20ac670ae2b4f150c6dc95b90acf3f8d904 new file mode 100755 index 0000000..80a956a Binary files /dev/null and b/.git_disabled/objects/b5/26e20ac670ae2b4f150c6dc95b90acf3f8d904 differ diff --git a/.git_disabled/objects/b5/2beb98dba2ea7733e89ac5647fad7cd3d18339 b/.git_disabled/objects/b5/2beb98dba2ea7733e89ac5647fad7cd3d18339 new file mode 100755 index 0000000..5aad75f Binary files /dev/null and b/.git_disabled/objects/b5/2beb98dba2ea7733e89ac5647fad7cd3d18339 differ diff --git a/.git_disabled/objects/b5/2cc6c5809fd2fab5bd424f9f53d09b5fba7c72 b/.git_disabled/objects/b5/2cc6c5809fd2fab5bd424f9f53d09b5fba7c72 new file mode 100755 index 0000000..d5a56df Binary files /dev/null and b/.git_disabled/objects/b5/2cc6c5809fd2fab5bd424f9f53d09b5fba7c72 differ diff --git a/.git_disabled/objects/b5/2f14aaa375ba205fb1bd1bc14c6c6208dbdf3a b/.git_disabled/objects/b5/2f14aaa375ba205fb1bd1bc14c6c6208dbdf3a new file mode 100755 index 0000000..c79367e Binary files /dev/null and b/.git_disabled/objects/b5/2f14aaa375ba205fb1bd1bc14c6c6208dbdf3a differ diff --git a/.git_disabled/objects/b5/3497fd65843392aef2ba2dfc0451ca8e427573 b/.git_disabled/objects/b5/3497fd65843392aef2ba2dfc0451ca8e427573 new file mode 100755 index 0000000..0ebf166 Binary files /dev/null and b/.git_disabled/objects/b5/3497fd65843392aef2ba2dfc0451ca8e427573 differ diff --git a/.git_disabled/objects/b5/5606438d7b98514143f55c5795d4a47e5f490f b/.git_disabled/objects/b5/5606438d7b98514143f55c5795d4a47e5f490f new file mode 100755 index 0000000..3b739b1 Binary files /dev/null and b/.git_disabled/objects/b5/5606438d7b98514143f55c5795d4a47e5f490f differ diff --git a/.git_disabled/objects/b5/7151682a0ceebb082c9f5555c6b5fe8f6c5192 b/.git_disabled/objects/b5/7151682a0ceebb082c9f5555c6b5fe8f6c5192 new file mode 100755 index 0000000..4907c85 Binary files /dev/null and b/.git_disabled/objects/b5/7151682a0ceebb082c9f5555c6b5fe8f6c5192 differ diff --git a/.git_disabled/objects/b5/7f041fe23d4126c277fcbb801c01b70121d054 b/.git_disabled/objects/b5/7f041fe23d4126c277fcbb801c01b70121d054 new file mode 100755 index 0000000..7bb4ce2 --- /dev/null +++ b/.git_disabled/objects/b5/7f041fe23d4126c277fcbb801c01b70121d054 @@ -0,0 +1,2 @@ +xٱNPSZ +ldHt½%mY8EHH8899;9ࣨ3$ޣׄܟoeUT(ͣ9F~hqoxn7%bY%^fÈ$  H@$  H@$  H@$  C!~O}0K/ٞvmV2Jz]ne og?g:|x=jû쀱͏O$G(5.rBs?W}kh|5&=<}^_yL \ No newline at end of file diff --git a/.git_disabled/objects/b5/8274470f7f1c0ed9f9feca9641fe7f70a022f8 b/.git_disabled/objects/b5/8274470f7f1c0ed9f9feca9641fe7f70a022f8 new file mode 100755 index 0000000..2bdb5af Binary files /dev/null and b/.git_disabled/objects/b5/8274470f7f1c0ed9f9feca9641fe7f70a022f8 differ diff --git a/.git_disabled/objects/b5/827cb8d369364b05c1711b7396001688ba6618 b/.git_disabled/objects/b5/827cb8d369364b05c1711b7396001688ba6618 new file mode 100755 index 0000000..35da008 --- /dev/null +++ b/.git_disabled/objects/b5/827cb8d369364b05c1711b7396001688ba6618 @@ -0,0 +1 @@ +xUj0EW\&]rL I !qƏI$%!pUi7=3̠eTX%u(ʥC2Vg4u]7uKף9,̈́jA6"?ㆻVRv'{sfWxD>7^_N-j$hNeY*2яTY&Y/TNS \ No newline at end of file diff --git a/.git_disabled/objects/b5/8ddf0825e6c5265a5de6cd4548693042695441 b/.git_disabled/objects/b5/8ddf0825e6c5265a5de6cd4548693042695441 new file mode 100755 index 0000000..3b00e39 Binary files /dev/null and b/.git_disabled/objects/b5/8ddf0825e6c5265a5de6cd4548693042695441 differ diff --git a/.git_disabled/objects/b5/9b3022d12d31928c5ebaa0ecb14e174c14ee5f b/.git_disabled/objects/b5/9b3022d12d31928c5ebaa0ecb14e174c14ee5f new file mode 100755 index 0000000..6fdad0c --- /dev/null +++ b/.git_disabled/objects/b5/9b3022d12d31928c5ebaa0ecb14e174c14ee5f @@ -0,0 +1,5 @@ +xUnFYO1E%vAڴvkq +(%9Zrݥ?C!>FE饀C{""}:\hP9q}7Tt;-& ~$fJnKYA`< + "dhF`b9Stz`͗$^B:Ņu*,P2wvہPİSK'谲<;7p_2e*񣃃2ُqF!ZԔ}o%g_J -vӎY}ɫR1+@k϶oIY:xBsl=ˌI_BcT2 HBIPeZ? r(eI7SJ 2N&vnw j%};N%l\XPj39FRB%6 @Ʌ(Cb^RJ_ +cy^SoZoB-2 m "ɔH>Sk@scB;7Pƒ:Ҳ4/y>TCՃ|Γ cJ|""rQX"b1%6oBO"%Dg<;ɧ8U@pЩX?z4"J'f2)lylU]quQ=,Zm {R!s.,8:2+6>-7.cњy&mϣwʍF7ڶF)$OK8Zu_|&ĆqvDҝʶq uum ? \ No newline at end of file diff --git a/.git_disabled/objects/b5/a07681159d6503dd5f64aa4c4281326f9814dc b/.git_disabled/objects/b5/a07681159d6503dd5f64aa4c4281326f9814dc new file mode 100755 index 0000000..746574e Binary files /dev/null and b/.git_disabled/objects/b5/a07681159d6503dd5f64aa4c4281326f9814dc differ diff --git a/.git_disabled/objects/b5/bc72434a5bf0f0e118b2eb07578e40a9bcd0c6 b/.git_disabled/objects/b5/bc72434a5bf0f0e118b2eb07578e40a9bcd0c6 new file mode 100755 index 0000000..2e266a3 Binary files /dev/null and b/.git_disabled/objects/b5/bc72434a5bf0f0e118b2eb07578e40a9bcd0c6 differ diff --git a/.git_disabled/objects/b5/f24012984534629b75bbbf0e78016a2708480a b/.git_disabled/objects/b5/f24012984534629b75bbbf0e78016a2708480a new file mode 100755 index 0000000..598acc9 Binary files /dev/null and b/.git_disabled/objects/b5/f24012984534629b75bbbf0e78016a2708480a differ diff --git a/.git_disabled/objects/b5/fbd865e7981ce077d9c209dd59f178fa212911 b/.git_disabled/objects/b5/fbd865e7981ce077d9c209dd59f178fa212911 new file mode 100755 index 0000000..a2d0de6 Binary files /dev/null and b/.git_disabled/objects/b5/fbd865e7981ce077d9c209dd59f178fa212911 differ diff --git a/.git_disabled/objects/b6/03e89f15d0aff5aadf2ef608dfe0a3c7adc6ca b/.git_disabled/objects/b6/03e89f15d0aff5aadf2ef608dfe0a3c7adc6ca new file mode 100755 index 0000000..54b6a39 Binary files /dev/null and b/.git_disabled/objects/b6/03e89f15d0aff5aadf2ef608dfe0a3c7adc6ca differ diff --git a/.git_disabled/objects/b6/0f6611173d30d2e4f132373f51079da2970933 b/.git_disabled/objects/b6/0f6611173d30d2e4f132373f51079da2970933 new file mode 100755 index 0000000..4d9cd26 Binary files /dev/null and b/.git_disabled/objects/b6/0f6611173d30d2e4f132373f51079da2970933 differ diff --git a/.git_disabled/objects/b6/203af6a8d32ff9854a1cf02b8d56d709ded934 b/.git_disabled/objects/b6/203af6a8d32ff9854a1cf02b8d56d709ded934 new file mode 100755 index 0000000..7f3b1a6 Binary files /dev/null and b/.git_disabled/objects/b6/203af6a8d32ff9854a1cf02b8d56d709ded934 differ diff --git a/.git_disabled/objects/b6/571e918cfe52722dd1abf4707f49d35d846e95 b/.git_disabled/objects/b6/571e918cfe52722dd1abf4707f49d35d846e95 new file mode 100755 index 0000000..cb48cba Binary files /dev/null and b/.git_disabled/objects/b6/571e918cfe52722dd1abf4707f49d35d846e95 differ diff --git a/.git_disabled/objects/b6/57b60e9dec1ed278aa5e7300cbd8d08469012a b/.git_disabled/objects/b6/57b60e9dec1ed278aa5e7300cbd8d08469012a new file mode 100755 index 0000000..994a103 Binary files /dev/null and b/.git_disabled/objects/b6/57b60e9dec1ed278aa5e7300cbd8d08469012a differ diff --git a/.git_disabled/objects/b6/79a19fdfe088112fcb5a3ecc5e4ddba3bc665f b/.git_disabled/objects/b6/79a19fdfe088112fcb5a3ecc5e4ddba3bc665f new file mode 100755 index 0000000..7a232ec Binary files /dev/null and b/.git_disabled/objects/b6/79a19fdfe088112fcb5a3ecc5e4ddba3bc665f differ diff --git a/.git_disabled/objects/b6/875a928565a7004d2be8d5651fc18dd2b7d548 b/.git_disabled/objects/b6/875a928565a7004d2be8d5651fc18dd2b7d548 new file mode 100755 index 0000000..5679ff8 Binary files /dev/null and b/.git_disabled/objects/b6/875a928565a7004d2be8d5651fc18dd2b7d548 differ diff --git a/.git_disabled/objects/b6/98c2eb8fd394593114987aca5f54fb84b44057 b/.git_disabled/objects/b6/98c2eb8fd394593114987aca5f54fb84b44057 new file mode 100755 index 0000000..e2d7f5e Binary files /dev/null and b/.git_disabled/objects/b6/98c2eb8fd394593114987aca5f54fb84b44057 differ diff --git a/.git_disabled/objects/b6/9fe8cf4c11ef54a812c29d9c8f146896308992 b/.git_disabled/objects/b6/9fe8cf4c11ef54a812c29d9c8f146896308992 new file mode 100755 index 0000000..fff676e Binary files /dev/null and b/.git_disabled/objects/b6/9fe8cf4c11ef54a812c29d9c8f146896308992 differ diff --git a/.git_disabled/objects/b6/a7b6e765ed5645eb9849f599913571d60dea31 b/.git_disabled/objects/b6/a7b6e765ed5645eb9849f599913571d60dea31 new file mode 100755 index 0000000..2dd6f01 Binary files /dev/null and b/.git_disabled/objects/b6/a7b6e765ed5645eb9849f599913571d60dea31 differ diff --git a/.git_disabled/objects/b6/b2f73c51df7c64bcd3cd10d94f693bf05d5f61 b/.git_disabled/objects/b6/b2f73c51df7c64bcd3cd10d94f693bf05d5f61 new file mode 100755 index 0000000..0d7b636 Binary files /dev/null and b/.git_disabled/objects/b6/b2f73c51df7c64bcd3cd10d94f693bf05d5f61 differ diff --git a/.git_disabled/objects/b6/b9c87ae8c7d7ee79cb6916a7a060bc356b85c9 b/.git_disabled/objects/b6/b9c87ae8c7d7ee79cb6916a7a060bc356b85c9 new file mode 100755 index 0000000..fde7bcf Binary files /dev/null and b/.git_disabled/objects/b6/b9c87ae8c7d7ee79cb6916a7a060bc356b85c9 differ diff --git a/.git_disabled/objects/b6/c7928feb31fdef9b5edfb6845241dce7108a32 b/.git_disabled/objects/b6/c7928feb31fdef9b5edfb6845241dce7108a32 new file mode 100755 index 0000000..3316ed2 Binary files /dev/null and b/.git_disabled/objects/b6/c7928feb31fdef9b5edfb6845241dce7108a32 differ diff --git a/.git_disabled/objects/b6/def1adc472c7015c63bddee5cc6b65ee88acca b/.git_disabled/objects/b6/def1adc472c7015c63bddee5cc6b65ee88acca new file mode 100755 index 0000000..1aac183 Binary files /dev/null and b/.git_disabled/objects/b6/def1adc472c7015c63bddee5cc6b65ee88acca differ diff --git a/.git_disabled/objects/b6/e357a1f355f72d35a356feef7e982743625508 b/.git_disabled/objects/b6/e357a1f355f72d35a356feef7e982743625508 new file mode 100755 index 0000000..4cceef6 Binary files /dev/null and b/.git_disabled/objects/b6/e357a1f355f72d35a356feef7e982743625508 differ diff --git a/.git_disabled/objects/b7/032b6595955851f655cb95da095289b03a6119 b/.git_disabled/objects/b7/032b6595955851f655cb95da095289b03a6119 new file mode 100755 index 0000000..43d762d Binary files /dev/null and b/.git_disabled/objects/b7/032b6595955851f655cb95da095289b03a6119 differ diff --git a/.git_disabled/objects/b7/0be7f97aa12176086294845a127ed4b7dffe9c b/.git_disabled/objects/b7/0be7f97aa12176086294845a127ed4b7dffe9c new file mode 100755 index 0000000..7d49d9d Binary files /dev/null and b/.git_disabled/objects/b7/0be7f97aa12176086294845a127ed4b7dffe9c differ diff --git a/.git_disabled/objects/b7/0fa03e7bea601b0de9f60861c172f9d0300e38 b/.git_disabled/objects/b7/0fa03e7bea601b0de9f60861c172f9d0300e38 new file mode 100755 index 0000000..c341e48 Binary files /dev/null and b/.git_disabled/objects/b7/0fa03e7bea601b0de9f60861c172f9d0300e38 differ diff --git a/.git_disabled/objects/b7/1bec7402cb5efb3b76352e5398b533253e8292 b/.git_disabled/objects/b7/1bec7402cb5efb3b76352e5398b533253e8292 new file mode 100755 index 0000000..1d33482 Binary files /dev/null and b/.git_disabled/objects/b7/1bec7402cb5efb3b76352e5398b533253e8292 differ diff --git a/.git_disabled/objects/b7/28815e9d78ca37b280910d7b40207581c5eda9 b/.git_disabled/objects/b7/28815e9d78ca37b280910d7b40207581c5eda9 new file mode 100755 index 0000000..5434315 Binary files /dev/null and b/.git_disabled/objects/b7/28815e9d78ca37b280910d7b40207581c5eda9 differ diff --git a/.git_disabled/objects/b7/3859d183a4efd2ddf2ba1595cf5da952140d3a b/.git_disabled/objects/b7/3859d183a4efd2ddf2ba1595cf5da952140d3a new file mode 100755 index 0000000..4cc9b6d Binary files /dev/null and b/.git_disabled/objects/b7/3859d183a4efd2ddf2ba1595cf5da952140d3a differ diff --git a/.git_disabled/objects/b7/3a4a10c6fa93a3a6fa47deb3796c590a9dee10 b/.git_disabled/objects/b7/3a4a10c6fa93a3a6fa47deb3796c590a9dee10 new file mode 100755 index 0000000..dcc9ea7 Binary files /dev/null and b/.git_disabled/objects/b7/3a4a10c6fa93a3a6fa47deb3796c590a9dee10 differ diff --git a/.git_disabled/objects/b7/3d37021c42a42f988698a103b7a800702dd31f b/.git_disabled/objects/b7/3d37021c42a42f988698a103b7a800702dd31f new file mode 100755 index 0000000..f697380 Binary files /dev/null and b/.git_disabled/objects/b7/3d37021c42a42f988698a103b7a800702dd31f differ diff --git a/.git_disabled/objects/b7/4c462400b7751a7ebd15552e18186502ecc205 b/.git_disabled/objects/b7/4c462400b7751a7ebd15552e18186502ecc205 new file mode 100755 index 0000000..27fc36b Binary files /dev/null and b/.git_disabled/objects/b7/4c462400b7751a7ebd15552e18186502ecc205 differ diff --git a/.git_disabled/objects/b7/4e38c5c55906ecc188c3bdd09c060af3ba8d3a b/.git_disabled/objects/b7/4e38c5c55906ecc188c3bdd09c060af3ba8d3a new file mode 100755 index 0000000..bb13d47 Binary files /dev/null and b/.git_disabled/objects/b7/4e38c5c55906ecc188c3bdd09c060af3ba8d3a differ diff --git a/.git_disabled/objects/b7/58a97335ffdaf0ef9432508bab67a8a2bc4950 b/.git_disabled/objects/b7/58a97335ffdaf0ef9432508bab67a8a2bc4950 new file mode 100755 index 0000000..0d3e904 Binary files /dev/null and b/.git_disabled/objects/b7/58a97335ffdaf0ef9432508bab67a8a2bc4950 differ diff --git a/.git_disabled/objects/b7/59382cb277da36ff076321ea38dcf1d3363e2f b/.git_disabled/objects/b7/59382cb277da36ff076321ea38dcf1d3363e2f new file mode 100755 index 0000000..e772b28 Binary files /dev/null and b/.git_disabled/objects/b7/59382cb277da36ff076321ea38dcf1d3363e2f differ diff --git a/.git_disabled/objects/b7/5b8941cda25adb8c07d494c5c98900f8396f0f b/.git_disabled/objects/b7/5b8941cda25adb8c07d494c5c98900f8396f0f new file mode 100755 index 0000000..83e2cf0 Binary files /dev/null and b/.git_disabled/objects/b7/5b8941cda25adb8c07d494c5c98900f8396f0f differ diff --git a/.git_disabled/objects/b7/5d09617d68b2e7cbe3832bc19389025d96ecb3 b/.git_disabled/objects/b7/5d09617d68b2e7cbe3832bc19389025d96ecb3 new file mode 100755 index 0000000..c18c151 Binary files /dev/null and b/.git_disabled/objects/b7/5d09617d68b2e7cbe3832bc19389025d96ecb3 differ diff --git a/.git_disabled/objects/b7/777b7393cf045b0d2de0a5373503f501f6c01e b/.git_disabled/objects/b7/777b7393cf045b0d2de0a5373503f501f6c01e new file mode 100755 index 0000000..8559a41 Binary files /dev/null and b/.git_disabled/objects/b7/777b7393cf045b0d2de0a5373503f501f6c01e differ diff --git a/.git_disabled/objects/b7/949a88a0c2e45b55870df03be9c47ed23a16c6 b/.git_disabled/objects/b7/949a88a0c2e45b55870df03be9c47ed23a16c6 new file mode 100755 index 0000000..339d414 Binary files /dev/null and b/.git_disabled/objects/b7/949a88a0c2e45b55870df03be9c47ed23a16c6 differ diff --git a/.git_disabled/objects/b7/a978799459d251f04df79197a9d634d1f61b70 b/.git_disabled/objects/b7/a978799459d251f04df79197a9d634d1f61b70 new file mode 100755 index 0000000..1d89849 Binary files /dev/null and b/.git_disabled/objects/b7/a978799459d251f04df79197a9d634d1f61b70 differ diff --git a/.git_disabled/objects/b7/cb0bb104a02066ab87b8f80699dc15688da2d4 b/.git_disabled/objects/b7/cb0bb104a02066ab87b8f80699dc15688da2d4 new file mode 100755 index 0000000..a73cb70 Binary files /dev/null and b/.git_disabled/objects/b7/cb0bb104a02066ab87b8f80699dc15688da2d4 differ diff --git a/.git_disabled/objects/b7/d1c224b9c4dcbc7d8d4e25cd60561e3efb05da b/.git_disabled/objects/b7/d1c224b9c4dcbc7d8d4e25cd60561e3efb05da new file mode 100755 index 0000000..04565c8 Binary files /dev/null and b/.git_disabled/objects/b7/d1c224b9c4dcbc7d8d4e25cd60561e3efb05da differ diff --git a/.git_disabled/objects/b7/e5e3f2aba7c2ee9ea48a6e261c8366482531db b/.git_disabled/objects/b7/e5e3f2aba7c2ee9ea48a6e261c8366482531db new file mode 100755 index 0000000..cfcc0bc Binary files /dev/null and b/.git_disabled/objects/b7/e5e3f2aba7c2ee9ea48a6e261c8366482531db differ diff --git a/.git_disabled/objects/b8/0afe6c81e5138c9ba439cd1b7d633eac154b21 b/.git_disabled/objects/b8/0afe6c81e5138c9ba439cd1b7d633eac154b21 new file mode 100755 index 0000000..0cbb996 Binary files /dev/null and b/.git_disabled/objects/b8/0afe6c81e5138c9ba439cd1b7d633eac154b21 differ diff --git a/.git_disabled/objects/b8/0d4507bde662b696da0115d6b8104c8bc64647 b/.git_disabled/objects/b8/0d4507bde662b696da0115d6b8104c8bc64647 new file mode 100755 index 0000000..ab63310 Binary files /dev/null and b/.git_disabled/objects/b8/0d4507bde662b696da0115d6b8104c8bc64647 differ diff --git a/.git_disabled/objects/b8/1b4a2fde828de660a1f477ec4a2311443dc0b9 b/.git_disabled/objects/b8/1b4a2fde828de660a1f477ec4a2311443dc0b9 new file mode 100755 index 0000000..d427681 Binary files /dev/null and b/.git_disabled/objects/b8/1b4a2fde828de660a1f477ec4a2311443dc0b9 differ diff --git a/.git_disabled/objects/b8/29af44d3558883bb97f8eb4345361fac49714b b/.git_disabled/objects/b8/29af44d3558883bb97f8eb4345361fac49714b new file mode 100755 index 0000000..c1a8260 Binary files /dev/null and b/.git_disabled/objects/b8/29af44d3558883bb97f8eb4345361fac49714b differ diff --git a/.git_disabled/objects/b8/2a98980f900d9cbcdcc6ca6c5d65cde505e0eb b/.git_disabled/objects/b8/2a98980f900d9cbcdcc6ca6c5d65cde505e0eb new file mode 100755 index 0000000..96c46ce Binary files /dev/null and b/.git_disabled/objects/b8/2a98980f900d9cbcdcc6ca6c5d65cde505e0eb differ diff --git a/.git_disabled/objects/b8/355d2ac2a25e7f1f9ef92594cfa626da28d5cc b/.git_disabled/objects/b8/355d2ac2a25e7f1f9ef92594cfa626da28d5cc new file mode 100755 index 0000000..ed31d1f Binary files /dev/null and b/.git_disabled/objects/b8/355d2ac2a25e7f1f9ef92594cfa626da28d5cc differ diff --git a/.git_disabled/objects/b8/35c08f670647c71f7344a93cd9ba9fd17d49a0 b/.git_disabled/objects/b8/35c08f670647c71f7344a93cd9ba9fd17d49a0 new file mode 100755 index 0000000..f2633e1 --- /dev/null +++ b/.git_disabled/objects/b8/35c08f670647c71f7344a93cd9ba9fd17d49a0 @@ -0,0 +1,2 @@ +x1k0;WdpZ!KIMҥ#KDĖt6WR4cnu /ȴLh~B 2vF*ᥚ3&ssY"ғ9'`$m ޘõ>BU# Hu!J+!!G&_}/ŨE9倊 +ZH9DG0980t[~~-2}}_¹xCCLZ m5(b\;X{E94fYV1sm`Za4:QuuWlgN*:}]X7t-Wʺ'tq \ No newline at end of file diff --git a/.git_disabled/objects/b8/3ceb9e554e1a992d3c052a2090c4697591af36 b/.git_disabled/objects/b8/3ceb9e554e1a992d3c052a2090c4697591af36 new file mode 100755 index 0000000..4c81bc9 Binary files /dev/null and b/.git_disabled/objects/b8/3ceb9e554e1a992d3c052a2090c4697591af36 differ diff --git a/.git_disabled/objects/b8/45cef0e8384423a07630ee75a0812da707b501 b/.git_disabled/objects/b8/45cef0e8384423a07630ee75a0812da707b501 new file mode 100755 index 0000000..84c8786 Binary files /dev/null and b/.git_disabled/objects/b8/45cef0e8384423a07630ee75a0812da707b501 differ diff --git a/.git_disabled/objects/b8/48df5675d942b28e010c6ae7f90298c0568513 b/.git_disabled/objects/b8/48df5675d942b28e010c6ae7f90298c0568513 new file mode 100755 index 0000000..833fa32 Binary files /dev/null and b/.git_disabled/objects/b8/48df5675d942b28e010c6ae7f90298c0568513 differ diff --git a/.git_disabled/objects/b8/4c0faf3e0c25b7742e4f7f8a644886ef2a3617 b/.git_disabled/objects/b8/4c0faf3e0c25b7742e4f7f8a644886ef2a3617 new file mode 100755 index 0000000..7fa10b1 --- /dev/null +++ b/.git_disabled/objects/b8/4c0faf3e0c25b7742e4f7f8a644886ef2a3617 @@ -0,0 +1,2 @@ +x% @v DIZkw +/tk99M(‚)4$4'``Ɏ<*h8aSL5QRAOK<&z+sC'Y@84bs]a{`Ge wJˮ׍jv۾5 \ No newline at end of file diff --git a/.git_disabled/objects/b8/6352d0bb16adeb4dc38de8e25c5067e4d714ba b/.git_disabled/objects/b8/6352d0bb16adeb4dc38de8e25c5067e4d714ba new file mode 100755 index 0000000..15bedf4 Binary files /dev/null and b/.git_disabled/objects/b8/6352d0bb16adeb4dc38de8e25c5067e4d714ba differ diff --git a/.git_disabled/objects/b8/68ff4c4a5a849d9ac864b278192443f78300df b/.git_disabled/objects/b8/68ff4c4a5a849d9ac864b278192443f78300df new file mode 100755 index 0000000..f79bf1e Binary files /dev/null and b/.git_disabled/objects/b8/68ff4c4a5a849d9ac864b278192443f78300df differ diff --git a/.git_disabled/objects/b8/7cd1d03277447affaa896029f7c64ea8da8da4 b/.git_disabled/objects/b8/7cd1d03277447affaa896029f7c64ea8da8da4 new file mode 100755 index 0000000..3698668 Binary files /dev/null and b/.git_disabled/objects/b8/7cd1d03277447affaa896029f7c64ea8da8da4 differ diff --git a/.git_disabled/objects/b8/80b7e8c72140f66cadce91342b2194a88d86e9 b/.git_disabled/objects/b8/80b7e8c72140f66cadce91342b2194a88d86e9 new file mode 100755 index 0000000..c56b01e --- /dev/null +++ b/.git_disabled/objects/b8/80b7e8c72140f66cadce91342b2194a88d86e9 @@ -0,0 +1,2 @@ +x}Tak0gAk7Y [, ]ƚ> ,mm$3αݴ ݽwғp\ƓoF07v* v<=jr<4+b"'ۏ_O?#׹P*YLz4d#(<&P˚3+$&-<*=D>v](и,*ڲiqÚ *yUmԙBxnk} +S8-]C~=Ӣ? =~w]Or!ߗkY6a/lXܷ1䱽h1xSN G&>0ʞ3y%ݡPm/_:Cf{ xҲ0+ɇv^ҩC[_qqRIK4&A{= PYvD*qHFts_m,CK5+(8CX5pxCDrP= T~pFoȘ=ߎͶ^ s%h ? \ No newline at end of file diff --git a/.git_disabled/objects/b8/8850de6f74e0799ab9eed586e3636c3956b1ae b/.git_disabled/objects/b8/8850de6f74e0799ab9eed586e3636c3956b1ae new file mode 100755 index 0000000..8594c86 Binary files /dev/null and b/.git_disabled/objects/b8/8850de6f74e0799ab9eed586e3636c3956b1ae differ diff --git a/.git_disabled/objects/b8/90b1e7a4ab08678684188dba1384851a5dfb5b b/.git_disabled/objects/b8/90b1e7a4ab08678684188dba1384851a5dfb5b new file mode 100755 index 0000000..1e8f742 Binary files /dev/null and b/.git_disabled/objects/b8/90b1e7a4ab08678684188dba1384851a5dfb5b differ diff --git a/.git_disabled/objects/b8/91b2040ab225c6b1e64dcdc0bc3cb24c2815a6 b/.git_disabled/objects/b8/91b2040ab225c6b1e64dcdc0bc3cb24c2815a6 new file mode 100755 index 0000000..c0bd817 Binary files /dev/null and b/.git_disabled/objects/b8/91b2040ab225c6b1e64dcdc0bc3cb24c2815a6 differ diff --git a/.git_disabled/objects/b8/a090ff14c725b7a28804315fde85c26a5c0ccf b/.git_disabled/objects/b8/a090ff14c725b7a28804315fde85c26a5c0ccf new file mode 100755 index 0000000..a9d8ba2 Binary files /dev/null and b/.git_disabled/objects/b8/a090ff14c725b7a28804315fde85c26a5c0ccf differ diff --git a/.git_disabled/objects/b8/d309b4e05ffc989ee27f5aacde6dd1b6777451 b/.git_disabled/objects/b8/d309b4e05ffc989ee27f5aacde6dd1b6777451 new file mode 100755 index 0000000..e9b8ef3 Binary files /dev/null and b/.git_disabled/objects/b8/d309b4e05ffc989ee27f5aacde6dd1b6777451 differ diff --git a/.git_disabled/objects/b8/e14e3e88f1a7bc8b018e90ea7fe9ba8b0ced66 b/.git_disabled/objects/b8/e14e3e88f1a7bc8b018e90ea7fe9ba8b0ced66 new file mode 100755 index 0000000..0bab0e3 Binary files /dev/null and b/.git_disabled/objects/b8/e14e3e88f1a7bc8b018e90ea7fe9ba8b0ced66 differ diff --git a/.git_disabled/objects/b8/f15de9ffb4dd265721dfe8218ffe5ef76d3421 b/.git_disabled/objects/b8/f15de9ffb4dd265721dfe8218ffe5ef76d3421 new file mode 100755 index 0000000..f5d2288 Binary files /dev/null and b/.git_disabled/objects/b8/f15de9ffb4dd265721dfe8218ffe5ef76d3421 differ diff --git a/.git_disabled/objects/b8/f3942a027e6bc2d673c8448ee49af8da11eab8 b/.git_disabled/objects/b8/f3942a027e6bc2d673c8448ee49af8da11eab8 new file mode 100755 index 0000000..4946c96 Binary files /dev/null and b/.git_disabled/objects/b8/f3942a027e6bc2d673c8448ee49af8da11eab8 differ diff --git a/.git_disabled/objects/b9/003e947d3c76cd4a79d6ada2fe78ddd3235361 b/.git_disabled/objects/b9/003e947d3c76cd4a79d6ada2fe78ddd3235361 new file mode 100755 index 0000000..69cfe00 Binary files /dev/null and b/.git_disabled/objects/b9/003e947d3c76cd4a79d6ada2fe78ddd3235361 differ diff --git a/.git_disabled/objects/b9/5cd284ee8ed7d769c2b166aecdf5376921b4d4 b/.git_disabled/objects/b9/5cd284ee8ed7d769c2b166aecdf5376921b4d4 new file mode 100755 index 0000000..4fa35aa Binary files /dev/null and b/.git_disabled/objects/b9/5cd284ee8ed7d769c2b166aecdf5376921b4d4 differ diff --git a/.git_disabled/objects/b9/61cde5e1eb13e390167a6befc89eda1625bb38 b/.git_disabled/objects/b9/61cde5e1eb13e390167a6befc89eda1625bb38 new file mode 100755 index 0000000..4754cb0 Binary files /dev/null and b/.git_disabled/objects/b9/61cde5e1eb13e390167a6befc89eda1625bb38 differ diff --git a/.git_disabled/objects/b9/65d90c69246bd616a21be9722f5d5d91ae6760 b/.git_disabled/objects/b9/65d90c69246bd616a21be9722f5d5d91ae6760 new file mode 100755 index 0000000..67194d3 Binary files /dev/null and b/.git_disabled/objects/b9/65d90c69246bd616a21be9722f5d5d91ae6760 differ diff --git a/.git_disabled/objects/b9/93ceb9d34f22fe5eb16b53e065007f6309e9e1 b/.git_disabled/objects/b9/93ceb9d34f22fe5eb16b53e065007f6309e9e1 new file mode 100755 index 0000000..67177a6 --- /dev/null +++ b/.git_disabled/objects/b9/93ceb9d34f22fe5eb16b53e065007f6309e9e1 @@ -0,0 +1,10 @@ +xǏUew +="b9`K܅ +n .4n\1b+]{C<+c:vE q!z'fws93f<-+ۥCWyQajG,//////////////////////////////7/0f_[?4TPNjSF-jRT +TO TPNjSF-jRT +TTRA9uMI SRJ(PSIԡ6eԢ&5N5J)@>O%SڔQԠ:(UO%SڔQԠ:(UӼ>< +0~slƓ]xܰ{x(<|$m>25tp<2w +Vf_ndh`[o[k0-5-4ef=f=kz~-vw8/631OW'+p_b>3Osz.6}Ȭ|ާfO>mtY4ާfOSzz&>M0}kߌ;}iT^Nާz2}aYvާ?z~7}ͬWާ_5Ty<Oߛ'o'o'+ KY{ܬ=|f>5kGfCPf=Y{xǬ=m2ko7f5Y{xŬ=l3k/¬=l5k[KfEY{xެ=ԍkn+Cو L^~"(\wnc}(}+22|$ +o*3>A V PqbR*3 c@nfazӆ3?~U[ /F䞷\H F[flh!sFK/qYT3zO0#MA:6+\6XIjjZ0wO("ɡi8K$K߾-!uqT̿cCE_m \ No newline at end of file diff --git a/.git_disabled/objects/bc/3412f256f84b2ac95ba6d9bab2954526da0b9d b/.git_disabled/objects/bc/3412f256f84b2ac95ba6d9bab2954526da0b9d new file mode 100755 index 0000000..e5ee0e9 Binary files /dev/null and b/.git_disabled/objects/bc/3412f256f84b2ac95ba6d9bab2954526da0b9d differ diff --git a/.git_disabled/objects/bc/3ad6b7ea497b44da508313e1de18e2962acc31 b/.git_disabled/objects/bc/3ad6b7ea497b44da508313e1de18e2962acc31 new file mode 100755 index 0000000..ccad750 Binary files /dev/null and b/.git_disabled/objects/bc/3ad6b7ea497b44da508313e1de18e2962acc31 differ diff --git a/.git_disabled/objects/bc/3f17838c1e05e419cd1a714aa9f152ab30fb37 b/.git_disabled/objects/bc/3f17838c1e05e419cd1a714aa9f152ab30fb37 new file mode 100755 index 0000000..3b1d8d1 Binary files /dev/null and b/.git_disabled/objects/bc/3f17838c1e05e419cd1a714aa9f152ab30fb37 differ diff --git a/.git_disabled/objects/bc/4272dbe0e033d53806e272c5f9a78f8576a0a4 b/.git_disabled/objects/bc/4272dbe0e033d53806e272c5f9a78f8576a0a4 new file mode 100755 index 0000000..6045c95 Binary files /dev/null and b/.git_disabled/objects/bc/4272dbe0e033d53806e272c5f9a78f8576a0a4 differ diff --git a/.git_disabled/objects/bc/42a2f0f17c37514590145cd157540f193ab13d b/.git_disabled/objects/bc/42a2f0f17c37514590145cd157540f193ab13d new file mode 100755 index 0000000..a7abbd7 --- /dev/null +++ b/.git_disabled/objects/bc/42a2f0f17c37514590145cd157540f193ab13d @@ -0,0 +1 @@ +x=P@9󇁒JJJKJ7wKn&n;K KR+-)---)d#\ڼ;f~2QFk^t_*fdRjkM9<~QtW琉O4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@a'&?JaG#} t6|EHl#:)rϘ#5E8hhhhhhhhhhhhhhXQw߷@-Ԛx^~7τM)xgy"<.n|dkYetBP;xKiO]L-~Pk8|  8p?Pt"a' Pup8ťV .3L Lk4n13\IzHl@n^A:fү eN{rt+"K%+:(TmBa,[`VuOպs2Vb&0&Z!1^ ZW4 +&\63UJm6nᎻa\\HΚB&Zb8}I{<m"%Mr^ -P1F1OՆ: bxR'%y#`MDoz,~| l5970z>[-77p;i' AcDe&beS vʶɎ4[;/JP 8bDѫS7|Z+-Wڂs*n@4Xmr?e>H9c \ No newline at end of file diff --git a/.git_disabled/objects/bc/d46912adc26e6636337517131a1672cdfb985c b/.git_disabled/objects/bc/d46912adc26e6636337517131a1672cdfb985c new file mode 100755 index 0000000..1a23fc7 Binary files /dev/null and b/.git_disabled/objects/bc/d46912adc26e6636337517131a1672cdfb985c differ diff --git a/.git_disabled/objects/bc/dfc005acd471e32e36c84a8d61e2952a9edbe4 b/.git_disabled/objects/bc/dfc005acd471e32e36c84a8d61e2952a9edbe4 new file mode 100755 index 0000000..0f5ce96 Binary files /dev/null and b/.git_disabled/objects/bc/dfc005acd471e32e36c84a8d61e2952a9edbe4 differ diff --git a/.git_disabled/objects/bc/dfc183a748973b09227388471a0885f0398967 b/.git_disabled/objects/bc/dfc183a748973b09227388471a0885f0398967 new file mode 100755 index 0000000..a1023fa Binary files /dev/null and b/.git_disabled/objects/bc/dfc183a748973b09227388471a0885f0398967 differ diff --git a/.git_disabled/objects/bd/0bb7aa6c303b6d0b7a13466a314ccfee3319ff b/.git_disabled/objects/bd/0bb7aa6c303b6d0b7a13466a314ccfee3319ff new file mode 100755 index 0000000..504b203 Binary files /dev/null and b/.git_disabled/objects/bd/0bb7aa6c303b6d0b7a13466a314ccfee3319ff differ diff --git a/.git_disabled/objects/bd/0c546b6abcfe343d0c988b40c62b77b5f83cd6 b/.git_disabled/objects/bd/0c546b6abcfe343d0c988b40c62b77b5f83cd6 new file mode 100755 index 0000000..8369b64 Binary files /dev/null and b/.git_disabled/objects/bd/0c546b6abcfe343d0c988b40c62b77b5f83cd6 differ diff --git a/.git_disabled/objects/bd/13650a69550f0c08aa1f7dcbb3c309298abc78 b/.git_disabled/objects/bd/13650a69550f0c08aa1f7dcbb3c309298abc78 new file mode 100755 index 0000000..268d0d3 Binary files /dev/null and b/.git_disabled/objects/bd/13650a69550f0c08aa1f7dcbb3c309298abc78 differ diff --git a/.git_disabled/objects/bd/1f90fdee4278af3ddd569da93efbe20eaf1de3 b/.git_disabled/objects/bd/1f90fdee4278af3ddd569da93efbe20eaf1de3 new file mode 100755 index 0000000..e27c2e4 Binary files /dev/null and b/.git_disabled/objects/bd/1f90fdee4278af3ddd569da93efbe20eaf1de3 differ diff --git a/.git_disabled/objects/bd/23b9cfb6b4110fbb55fb45b1546476fc07ed84 b/.git_disabled/objects/bd/23b9cfb6b4110fbb55fb45b1546476fc07ed84 new file mode 100755 index 0000000..ba06652 Binary files /dev/null and b/.git_disabled/objects/bd/23b9cfb6b4110fbb55fb45b1546476fc07ed84 differ diff --git a/.git_disabled/objects/bd/357bd23243330c4e30a475f904e8fb37dba7ea b/.git_disabled/objects/bd/357bd23243330c4e30a475f904e8fb37dba7ea new file mode 100755 index 0000000..c9ed61e Binary files /dev/null and b/.git_disabled/objects/bd/357bd23243330c4e30a475f904e8fb37dba7ea differ diff --git a/.git_disabled/objects/bd/414c68ee9bf079ad72f3350a227575714a64a6 b/.git_disabled/objects/bd/414c68ee9bf079ad72f3350a227575714a64a6 new file mode 100755 index 0000000..e30456d Binary files /dev/null and b/.git_disabled/objects/bd/414c68ee9bf079ad72f3350a227575714a64a6 differ diff --git a/.git_disabled/objects/bd/484b4b1a0dcf0e31879722f966c04f360e71c8 b/.git_disabled/objects/bd/484b4b1a0dcf0e31879722f966c04f360e71c8 new file mode 100755 index 0000000..4d7b3d1 Binary files /dev/null and b/.git_disabled/objects/bd/484b4b1a0dcf0e31879722f966c04f360e71c8 differ diff --git a/.git_disabled/objects/bd/5c68eb473963c1be561cd23160ff00a9f78fcd b/.git_disabled/objects/bd/5c68eb473963c1be561cd23160ff00a9f78fcd new file mode 100755 index 0000000..01360ab Binary files /dev/null and b/.git_disabled/objects/bd/5c68eb473963c1be561cd23160ff00a9f78fcd differ diff --git a/.git_disabled/objects/bd/5cc230d6ca4b1cf1f7de7bd9d7e6aa3b9bf1a6 b/.git_disabled/objects/bd/5cc230d6ca4b1cf1f7de7bd9d7e6aa3b9bf1a6 new file mode 100755 index 0000000..7837c55 --- /dev/null +++ b/.git_disabled/objects/bd/5cc230d6ca4b1cf1f7de7bd9d7e6aa3b9bf1a6 @@ -0,0 +1,3 @@ +xun@{SLXHz,`UVJ 07Yv ;䏣<=G: 6J̇SmSwDX*PEi+ }ei9eM/s>U*#g,*٭i'w7utϣf4B`2i XmWI\VV@`tb$x2RfTSw:xE," ;u|j[E!_ot$VhrE0 GbhQ7 *`MmaWP(d^Fn[Bx*#Q +rp zXASϭ@(m)poyK-|؝5;$:!!{jл <99J?/g ?!Gx4>XH"G\C.=I咪L +TٵY(&?EֿJUsz_g%7sR xEbp)Өs0OȊ-7r;"IN2jr3?n:Ys.Zǁē_ScXYQz2}++pcwX݆ 9nѷXg]IrEz+,0Pڞ´;AF]Qk5|Õ)|x. ow2֭C)mc[#Re F# ,cdDl-IPÞ2aǗ}ۮȯսɰ(H$ӬHOfDҶުhldk!Q+/ĵ:Ϋ TƐJ&%9<Hd ʽq"K. B +ELJ9yY}i\$tMHx:LЯY&({kJ<%JJ({:fx=y݈X`死gݧ.4Q+XiqV ͩ ߒJgB>PCwݭVvu6=a~NK'@7.^T \ No newline at end of file diff --git a/.git_disabled/objects/be/b6a11776aadcec5357b7e3c01bb32388a922fa b/.git_disabled/objects/be/b6a11776aadcec5357b7e3c01bb32388a922fa new file mode 100755 index 0000000..e1fee02 Binary files /dev/null and b/.git_disabled/objects/be/b6a11776aadcec5357b7e3c01bb32388a922fa differ diff --git a/.git_disabled/objects/be/c65d42cef0ba873e1f0025477abeb6dcbc83ef b/.git_disabled/objects/be/c65d42cef0ba873e1f0025477abeb6dcbc83ef new file mode 100755 index 0000000..b1745aa Binary files /dev/null and b/.git_disabled/objects/be/c65d42cef0ba873e1f0025477abeb6dcbc83ef differ diff --git a/.git_disabled/objects/be/cfb88a25365ee943083c945319053f262e6de5 b/.git_disabled/objects/be/cfb88a25365ee943083c945319053f262e6de5 new file mode 100755 index 0000000..1190eaa Binary files /dev/null and b/.git_disabled/objects/be/cfb88a25365ee943083c945319053f262e6de5 differ diff --git a/.git_disabled/objects/be/edf8822138bf676d1577cdca57319975bb6463 b/.git_disabled/objects/be/edf8822138bf676d1577cdca57319975bb6463 new file mode 100755 index 0000000..4f059fa Binary files /dev/null and b/.git_disabled/objects/be/edf8822138bf676d1577cdca57319975bb6463 differ diff --git a/.git_disabled/objects/bf/190fd560ee4fc8a11af371a15fc5f1dc284d34 b/.git_disabled/objects/bf/190fd560ee4fc8a11af371a15fc5f1dc284d34 new file mode 100755 index 0000000..cec5a90 Binary files /dev/null and b/.git_disabled/objects/bf/190fd560ee4fc8a11af371a15fc5f1dc284d34 differ diff --git a/.git_disabled/objects/bf/1ede606bbbdf0ef9965404f01a81e8cbee18ed b/.git_disabled/objects/bf/1ede606bbbdf0ef9965404f01a81e8cbee18ed new file mode 100755 index 0000000..db5b193 Binary files /dev/null and b/.git_disabled/objects/bf/1ede606bbbdf0ef9965404f01a81e8cbee18ed differ diff --git a/.git_disabled/objects/bf/390a32180589e8df145ed3953666ec2e65df73 b/.git_disabled/objects/bf/390a32180589e8df145ed3953666ec2e65df73 new file mode 100755 index 0000000..c06b39f Binary files /dev/null and b/.git_disabled/objects/bf/390a32180589e8df145ed3953666ec2e65df73 differ diff --git a/.git_disabled/objects/bf/6d24390ae98ce30f813a9eb2c51a11d80885e4 b/.git_disabled/objects/bf/6d24390ae98ce30f813a9eb2c51a11d80885e4 new file mode 100755 index 0000000..5d43162 --- /dev/null +++ b/.git_disabled/objects/bf/6d24390ae98ce30f813a9eb2c51a11d80885e4 @@ -0,0 +1,2 @@ +xk0_qВ6mm0 Ss{)Exբ&tsReEƖ#\wwF{Mlf˰ڡLϦ)әCFJ)`%U E Ϊfc@U%+MEiyAx$:j+?‘y9);jF}XB.oڮ{)rd$MF.[mh7Ɉ?tԻnVx#qG[oJ貆&eOaAdBss^k[xNs%9*u2ҽ*sz@'d,Q[LҬx.[K48q4N]gQ|c4gՠ = + \ No newline at end of file diff --git a/.git_disabled/objects/bf/887fa47a34714cc739b5d321fb4eeb89ed3a68 b/.git_disabled/objects/bf/887fa47a34714cc739b5d321fb4eeb89ed3a68 new file mode 100755 index 0000000..2940613 Binary files /dev/null and b/.git_disabled/objects/bf/887fa47a34714cc739b5d321fb4eeb89ed3a68 differ diff --git a/.git_disabled/objects/bf/8e74dfa17fa9d72e657a09794be7096571a1a1 b/.git_disabled/objects/bf/8e74dfa17fa9d72e657a09794be7096571a1a1 new file mode 100755 index 0000000..8d25de5 Binary files /dev/null and b/.git_disabled/objects/bf/8e74dfa17fa9d72e657a09794be7096571a1a1 differ diff --git a/.git_disabled/objects/bf/ad49ae798ec159b93efcb2435e8558ba6b5849 b/.git_disabled/objects/bf/ad49ae798ec159b93efcb2435e8558ba6b5849 new file mode 100755 index 0000000..25975d3 --- /dev/null +++ b/.git_disabled/objects/bf/ad49ae798ec159b93efcb2435e8558ba6b5849 @@ -0,0 +1,5 @@ +xWtYFwDS+Wt'q6؈ HwqǝtI^G?%N6tI;'ç{se-|+G=Ӧߦdui5ljǫi&mPMZlvjR̽Bi&H;rw5vjGZ"mb)w/ŗmK;|Ҏ"7/Y I|io_37/K;rҎ]+D5J $iiMv-L][+Fwm|tXsRwgI;EZ|2S~N>~>t[3왆{;vxCfjy7HN\uw-3ϧ7;H5yVw{qvMm#Y^vM.ۧygOاR[QwP%y{.㕓ܼmQwHUǣ4 wv;LIvvyw6wn[')3Nn^ C+w`h[w vwS7%-{?InIT;SHdςXK@X瀉O6_7"G0q/}qv6& }wA޲2yj1>_wyӫ y}dzQ<-ng7oz뮅,c  woWpP׉._ u/)-L&-YEMtabloh Tuߒ:ʝGݨř{Ÿ|=B'wdcA7!]d8p׫&qkA͐"+not4];]Eq]kk}zBܑ˺8cKQw$۳&_ju_'07JRqoJu_#.EqK]u9 +۪Myap{a.oܮE&2u_)sn.Nt1Ӥp +ͻe{&.QªR{Q9d^3K~=Ne e҇wz颶wP=${Ã.Lmx]uSfW0a5\tn'72epaFuV.L]m?{3Lme.7o[wOEyߺ ;ݼqotXQ7 nUmsmEy=3&[w.)uOY2܊%9 "}ċ;aхq^dߜ[w#AӅyD73Ӆ {ϓb^ h7\o>5/:n}ažg0)őan5\׼D9uƼ:pYVޓj,/Le_3)őCn^b_yk 5&6.>,HK4.Vw郔8z]_=E6\?Dzqa[yYPqޠ':taF]䑗 ᧋meQ7t<8o ?]Mm#/y1E6?u@7o + \ No newline at end of file diff --git a/.git_disabled/objects/bf/c1a816bc67948bcdf2d542e72cf63c226e0c7e b/.git_disabled/objects/bf/c1a816bc67948bcdf2d542e72cf63c226e0c7e new file mode 100755 index 0000000..3c94c27 Binary files /dev/null and b/.git_disabled/objects/bf/c1a816bc67948bcdf2d542e72cf63c226e0c7e differ diff --git a/.git_disabled/objects/bf/c9e3256a20dd75b65ea7d9a34eb2c94572bc7c b/.git_disabled/objects/bf/c9e3256a20dd75b65ea7d9a34eb2c94572bc7c new file mode 100755 index 0000000..a161dba Binary files /dev/null and b/.git_disabled/objects/bf/c9e3256a20dd75b65ea7d9a34eb2c94572bc7c differ diff --git a/.git_disabled/objects/bf/d7dfe6a58e2d90f982c26c083db9b00ca55463 b/.git_disabled/objects/bf/d7dfe6a58e2d90f982c26c083db9b00ca55463 new file mode 100755 index 0000000..d7a9583 Binary files /dev/null and b/.git_disabled/objects/bf/d7dfe6a58e2d90f982c26c083db9b00ca55463 differ diff --git a/.git_disabled/objects/bf/e95541bb5ae228c32bf0da4b050c0960aa1b46 b/.git_disabled/objects/bf/e95541bb5ae228c32bf0da4b050c0960aa1b46 new file mode 100755 index 0000000..3607c2f Binary files /dev/null and b/.git_disabled/objects/bf/e95541bb5ae228c32bf0da4b050c0960aa1b46 differ diff --git a/.git_disabled/objects/bf/ecf01176281cf3970eecf8e6ffbb8b772ff2d3 b/.git_disabled/objects/bf/ecf01176281cf3970eecf8e6ffbb8b772ff2d3 new file mode 100755 index 0000000..759c3b1 Binary files /dev/null and b/.git_disabled/objects/bf/ecf01176281cf3970eecf8e6ffbb8b772ff2d3 differ diff --git a/.git_disabled/objects/bf/f87f17731f7e1941bc5d61a6afea8eca8be1f4 b/.git_disabled/objects/bf/f87f17731f7e1941bc5d61a6afea8eca8be1f4 new file mode 100755 index 0000000..a884097 Binary files /dev/null and b/.git_disabled/objects/bf/f87f17731f7e1941bc5d61a6afea8eca8be1f4 differ diff --git a/.git_disabled/objects/c0/0245b057cce4d7083e7fd965c4e11bb20292d3 b/.git_disabled/objects/c0/0245b057cce4d7083e7fd965c4e11bb20292d3 new file mode 100755 index 0000000..d7c3080 Binary files /dev/null and b/.git_disabled/objects/c0/0245b057cce4d7083e7fd965c4e11bb20292d3 differ diff --git a/.git_disabled/objects/c0/2d52c60857e4b05c960584f11fe1c61cdf47a3 b/.git_disabled/objects/c0/2d52c60857e4b05c960584f11fe1c61cdf47a3 new file mode 100755 index 0000000..0d4455d Binary files /dev/null and b/.git_disabled/objects/c0/2d52c60857e4b05c960584f11fe1c61cdf47a3 differ diff --git a/.git_disabled/objects/c0/3cedbe02e9571124d97dec78f45b6e1513f8bd b/.git_disabled/objects/c0/3cedbe02e9571124d97dec78f45b6e1513f8bd new file mode 100755 index 0000000..e4ee3b1 Binary files /dev/null and b/.git_disabled/objects/c0/3cedbe02e9571124d97dec78f45b6e1513f8bd differ diff --git a/.git_disabled/objects/c0/6132a386c336dd89b735ea39577934585b57a0 b/.git_disabled/objects/c0/6132a386c336dd89b735ea39577934585b57a0 new file mode 100755 index 0000000..497caea Binary files /dev/null and b/.git_disabled/objects/c0/6132a386c336dd89b735ea39577934585b57a0 differ diff --git a/.git_disabled/objects/c0/701ddbe63c7862be2ddac22982cb85febb91c7 b/.git_disabled/objects/c0/701ddbe63c7862be2ddac22982cb85febb91c7 new file mode 100755 index 0000000..beb5ca4 Binary files /dev/null and b/.git_disabled/objects/c0/701ddbe63c7862be2ddac22982cb85febb91c7 differ diff --git a/.git_disabled/objects/c0/76a2c38a36d3d0c5c744e7ff4a417170d512d7 b/.git_disabled/objects/c0/76a2c38a36d3d0c5c744e7ff4a417170d512d7 new file mode 100755 index 0000000..68e842d Binary files /dev/null and b/.git_disabled/objects/c0/76a2c38a36d3d0c5c744e7ff4a417170d512d7 differ diff --git a/.git_disabled/objects/c0/abc49f191f3aabdb7dce9d69b239f8c55f600f b/.git_disabled/objects/c0/abc49f191f3aabdb7dce9d69b239f8c55f600f new file mode 100755 index 0000000..f406f3e Binary files /dev/null and b/.git_disabled/objects/c0/abc49f191f3aabdb7dce9d69b239f8c55f600f differ diff --git a/.git_disabled/objects/c0/abf80050802b090e654a1ff04ebe31a9db38d8 b/.git_disabled/objects/c0/abf80050802b090e654a1ff04ebe31a9db38d8 new file mode 100755 index 0000000..f202bde Binary files /dev/null and b/.git_disabled/objects/c0/abf80050802b090e654a1ff04ebe31a9db38d8 differ diff --git a/.git_disabled/objects/c0/ad055c7bfff07287f4e13b42cacb3e9fb63e6c b/.git_disabled/objects/c0/ad055c7bfff07287f4e13b42cacb3e9fb63e6c new file mode 100755 index 0000000..5e6bbe6 Binary files /dev/null and b/.git_disabled/objects/c0/ad055c7bfff07287f4e13b42cacb3e9fb63e6c differ diff --git a/.git_disabled/objects/c0/bd8c474fdf6ca8f184aab4f54eea3084ac68f5 b/.git_disabled/objects/c0/bd8c474fdf6ca8f184aab4f54eea3084ac68f5 new file mode 100755 index 0000000..f49ce55 Binary files /dev/null and b/.git_disabled/objects/c0/bd8c474fdf6ca8f184aab4f54eea3084ac68f5 differ diff --git a/.git_disabled/objects/c0/d17c40e8c650d167be9e0957e0e004579e9e93 b/.git_disabled/objects/c0/d17c40e8c650d167be9e0957e0e004579e9e93 new file mode 100755 index 0000000..2f75c32 Binary files /dev/null and b/.git_disabled/objects/c0/d17c40e8c650d167be9e0957e0e004579e9e93 differ diff --git a/.git_disabled/objects/c0/d47e2e2c2df6061e0f3379e2c9b9102b67cad5 b/.git_disabled/objects/c0/d47e2e2c2df6061e0f3379e2c9b9102b67cad5 new file mode 100755 index 0000000..60a8ed5 Binary files /dev/null and b/.git_disabled/objects/c0/d47e2e2c2df6061e0f3379e2c9b9102b67cad5 differ diff --git a/.git_disabled/objects/c0/e3e5b67ad017f7c7325e0c2766d65d22cc02b3 b/.git_disabled/objects/c0/e3e5b67ad017f7c7325e0c2766d65d22cc02b3 new file mode 100755 index 0000000..d380bd7 Binary files /dev/null and b/.git_disabled/objects/c0/e3e5b67ad017f7c7325e0c2766d65d22cc02b3 differ diff --git a/.git_disabled/objects/c0/e84fe5ee66462fa315dc00bc1e5ea89a0e085d b/.git_disabled/objects/c0/e84fe5ee66462fa315dc00bc1e5ea89a0e085d new file mode 100755 index 0000000..93e4f5f Binary files /dev/null and b/.git_disabled/objects/c0/e84fe5ee66462fa315dc00bc1e5ea89a0e085d differ diff --git a/.git_disabled/objects/c0/ef27a686f22f77d5ec3f404005e2805fa46a64 b/.git_disabled/objects/c0/ef27a686f22f77d5ec3f404005e2805fa46a64 new file mode 100755 index 0000000..6392a75 Binary files /dev/null and b/.git_disabled/objects/c0/ef27a686f22f77d5ec3f404005e2805fa46a64 differ diff --git a/.git_disabled/objects/c0/fc27f67db7f6ad54aee151af9587b10e0385b5 b/.git_disabled/objects/c0/fc27f67db7f6ad54aee151af9587b10e0385b5 new file mode 100755 index 0000000..9bbda89 Binary files /dev/null and b/.git_disabled/objects/c0/fc27f67db7f6ad54aee151af9587b10e0385b5 differ diff --git a/.git_disabled/objects/c1/0b44c56d1d74915aa7c6ab1b330498b1a03480 b/.git_disabled/objects/c1/0b44c56d1d74915aa7c6ab1b330498b1a03480 new file mode 100755 index 0000000..acafb3e Binary files /dev/null and b/.git_disabled/objects/c1/0b44c56d1d74915aa7c6ab1b330498b1a03480 differ diff --git a/.git_disabled/objects/c1/35995b690d85696fafe25401e8eed7635100ea b/.git_disabled/objects/c1/35995b690d85696fafe25401e8eed7635100ea new file mode 100755 index 0000000..f72d635 Binary files /dev/null and b/.git_disabled/objects/c1/35995b690d85696fafe25401e8eed7635100ea differ diff --git a/.git_disabled/objects/c1/378a01d9cc32de40b6cbccbe3fe8c97acd19f8 b/.git_disabled/objects/c1/378a01d9cc32de40b6cbccbe3fe8c97acd19f8 new file mode 100755 index 0000000..720ec24 Binary files /dev/null and b/.git_disabled/objects/c1/378a01d9cc32de40b6cbccbe3fe8c97acd19f8 differ diff --git a/.git_disabled/objects/c1/4946ea8a1f1697148e382934eb988900469b7d b/.git_disabled/objects/c1/4946ea8a1f1697148e382934eb988900469b7d new file mode 100755 index 0000000..02befd7 Binary files /dev/null and b/.git_disabled/objects/c1/4946ea8a1f1697148e382934eb988900469b7d differ diff --git a/.git_disabled/objects/c1/52af074f3eb6211f4175106d4f2ed2b2c35e3a b/.git_disabled/objects/c1/52af074f3eb6211f4175106d4f2ed2b2c35e3a new file mode 100755 index 0000000..ade9300 Binary files /dev/null and b/.git_disabled/objects/c1/52af074f3eb6211f4175106d4f2ed2b2c35e3a differ diff --git a/.git_disabled/objects/c1/98314c866e767601db8fb95fc295afe656adb2 b/.git_disabled/objects/c1/98314c866e767601db8fb95fc295afe656adb2 new file mode 100755 index 0000000..fafded3 Binary files /dev/null and b/.git_disabled/objects/c1/98314c866e767601db8fb95fc295afe656adb2 differ diff --git a/.git_disabled/objects/c1/a44efd2915e84007ceedc8cd04a68ad853d1aa b/.git_disabled/objects/c1/a44efd2915e84007ceedc8cd04a68ad853d1aa new file mode 100755 index 0000000..e258f74 Binary files /dev/null and b/.git_disabled/objects/c1/a44efd2915e84007ceedc8cd04a68ad853d1aa differ diff --git a/.git_disabled/objects/c1/b45778db258064a84a4ca5ef04e7255e2caa69 b/.git_disabled/objects/c1/b45778db258064a84a4ca5ef04e7255e2caa69 new file mode 100755 index 0000000..456d689 Binary files /dev/null and b/.git_disabled/objects/c1/b45778db258064a84a4ca5ef04e7255e2caa69 differ diff --git a/.git_disabled/objects/c1/c5ed6f92a4676ed5a60fb638124662a67162e7 b/.git_disabled/objects/c1/c5ed6f92a4676ed5a60fb638124662a67162e7 new file mode 100755 index 0000000..ea2ccc1 Binary files /dev/null and b/.git_disabled/objects/c1/c5ed6f92a4676ed5a60fb638124662a67162e7 differ diff --git a/.git_disabled/objects/c1/d2931bed9251e8d85d16c6a52867902bdf0f63 b/.git_disabled/objects/c1/d2931bed9251e8d85d16c6a52867902bdf0f63 new file mode 100755 index 0000000..59db2ea Binary files /dev/null and b/.git_disabled/objects/c1/d2931bed9251e8d85d16c6a52867902bdf0f63 differ diff --git a/.git_disabled/objects/c1/efbda269c7dcc7360d89882d70020de477a5a1 b/.git_disabled/objects/c1/efbda269c7dcc7360d89882d70020de477a5a1 new file mode 100755 index 0000000..cd2d3ed Binary files /dev/null and b/.git_disabled/objects/c1/efbda269c7dcc7360d89882d70020de477a5a1 differ diff --git a/.git_disabled/objects/c1/f5be242cf6b5717b7354bbdc0d03cc78000c06 b/.git_disabled/objects/c1/f5be242cf6b5717b7354bbdc0d03cc78000c06 new file mode 100755 index 0000000..62f7293 Binary files /dev/null and b/.git_disabled/objects/c1/f5be242cf6b5717b7354bbdc0d03cc78000c06 differ diff --git a/.git_disabled/objects/c1/fc1374c7dbffd162dc0a5c1787012d7bb904ce b/.git_disabled/objects/c1/fc1374c7dbffd162dc0a5c1787012d7bb904ce new file mode 100755 index 0000000..5c5e68e Binary files /dev/null and b/.git_disabled/objects/c1/fc1374c7dbffd162dc0a5c1787012d7bb904ce differ diff --git a/.git_disabled/objects/c1/fc456db8e80598d474d00ed5e0bf7cde74aa38 b/.git_disabled/objects/c1/fc456db8e80598d474d00ed5e0bf7cde74aa38 new file mode 100755 index 0000000..6347596 --- /dev/null +++ b/.git_disabled/objects/c1/fc456db8e80598d474d00ed5e0bf7cde74aa38 @@ -0,0 +1,2 @@ +xYKo0 9$@?c: (ǡݐv0ٖ]6UXr`Q41 !))x[o"!Ό"+w>LsjA%Y^%EZ,%%B? C!{` p<SIP?pޕrbFhEcTebT)kH3ƤDoEB[9 +b[1|WBT235ԭ._=C=+V"@ڊǫ9c_z7PX!cJEƗ*'SOW&?U% \ No newline at end of file diff --git a/.git_disabled/objects/c2/076b17fc64a702da81dc0497d1570b57f78c67 b/.git_disabled/objects/c2/076b17fc64a702da81dc0497d1570b57f78c67 new file mode 100755 index 0000000..d3b751a Binary files /dev/null and b/.git_disabled/objects/c2/076b17fc64a702da81dc0497d1570b57f78c67 differ diff --git a/.git_disabled/objects/c2/16b8c9943a19f86a5ec83b1b3ee195b734cb8a b/.git_disabled/objects/c2/16b8c9943a19f86a5ec83b1b3ee195b734cb8a new file mode 100755 index 0000000..0c4aeb5 Binary files /dev/null and b/.git_disabled/objects/c2/16b8c9943a19f86a5ec83b1b3ee195b734cb8a differ diff --git a/.git_disabled/objects/c2/24ea0b099642ab6a6777c9ee64539414e3e275 b/.git_disabled/objects/c2/24ea0b099642ab6a6777c9ee64539414e3e275 new file mode 100755 index 0000000..86a4233 Binary files /dev/null and b/.git_disabled/objects/c2/24ea0b099642ab6a6777c9ee64539414e3e275 differ diff --git a/.git_disabled/objects/c2/28a32eef10cf61a31f4dbeb6925aed958d3fdb b/.git_disabled/objects/c2/28a32eef10cf61a31f4dbeb6925aed958d3fdb new file mode 100755 index 0000000..0683c76 Binary files /dev/null and b/.git_disabled/objects/c2/28a32eef10cf61a31f4dbeb6925aed958d3fdb differ diff --git a/.git_disabled/objects/c2/2ab0046ec10ba61f7897e74d18552f0f8a2391 b/.git_disabled/objects/c2/2ab0046ec10ba61f7897e74d18552f0f8a2391 new file mode 100755 index 0000000..460d042 Binary files /dev/null and b/.git_disabled/objects/c2/2ab0046ec10ba61f7897e74d18552f0f8a2391 differ diff --git a/.git_disabled/objects/c2/5aed685df804e5e01d0b02fe709997fabe2bee b/.git_disabled/objects/c2/5aed685df804e5e01d0b02fe709997fabe2bee new file mode 100755 index 0000000..e12b72f Binary files /dev/null and b/.git_disabled/objects/c2/5aed685df804e5e01d0b02fe709997fabe2bee differ diff --git a/.git_disabled/objects/c2/678f52633cb8ffe84da174fa0263fda1f817ec b/.git_disabled/objects/c2/678f52633cb8ffe84da174fa0263fda1f817ec new file mode 100755 index 0000000..64195a1 Binary files /dev/null and b/.git_disabled/objects/c2/678f52633cb8ffe84da174fa0263fda1f817ec differ diff --git a/.git_disabled/objects/c2/87bc7cd2efb7463c5dfcdb9af55ccb2d5298ba b/.git_disabled/objects/c2/87bc7cd2efb7463c5dfcdb9af55ccb2d5298ba new file mode 100755 index 0000000..31e6648 Binary files /dev/null and b/.git_disabled/objects/c2/87bc7cd2efb7463c5dfcdb9af55ccb2d5298ba differ diff --git a/.git_disabled/objects/c2/8dd4fa04e71a8765dfa5eef1637005c2bed8b2 b/.git_disabled/objects/c2/8dd4fa04e71a8765dfa5eef1637005c2bed8b2 new file mode 100755 index 0000000..6970456 Binary files /dev/null and b/.git_disabled/objects/c2/8dd4fa04e71a8765dfa5eef1637005c2bed8b2 differ diff --git a/.git_disabled/objects/c2/98c069b953faea474a39538f186c820e8b5e61 b/.git_disabled/objects/c2/98c069b953faea474a39538f186c820e8b5e61 new file mode 100755 index 0000000..0b6e688 Binary files /dev/null and b/.git_disabled/objects/c2/98c069b953faea474a39538f186c820e8b5e61 differ diff --git a/.git_disabled/objects/c2/9f252930906b75927da74db4462ac4577d4372 b/.git_disabled/objects/c2/9f252930906b75927da74db4462ac4577d4372 new file mode 100755 index 0000000..2261e7e Binary files /dev/null and b/.git_disabled/objects/c2/9f252930906b75927da74db4462ac4577d4372 differ diff --git a/.git_disabled/objects/c2/a3ddea4965309ac20bec5e9c1ce2b455c1abe4 b/.git_disabled/objects/c2/a3ddea4965309ac20bec5e9c1ce2b455c1abe4 new file mode 100755 index 0000000..f417e35 Binary files /dev/null and b/.git_disabled/objects/c2/a3ddea4965309ac20bec5e9c1ce2b455c1abe4 differ diff --git a/.git_disabled/objects/c2/aa0a584b13e2837b1cf0b3b6915f4674d96938 b/.git_disabled/objects/c2/aa0a584b13e2837b1cf0b3b6915f4674d96938 new file mode 100755 index 0000000..d9e074b Binary files /dev/null and b/.git_disabled/objects/c2/aa0a584b13e2837b1cf0b3b6915f4674d96938 differ diff --git a/.git_disabled/objects/c2/bc597568c08bf141993a58c603b54b3ba5cef0 b/.git_disabled/objects/c2/bc597568c08bf141993a58c603b54b3ba5cef0 new file mode 100755 index 0000000..90aabfb Binary files /dev/null and b/.git_disabled/objects/c2/bc597568c08bf141993a58c603b54b3ba5cef0 differ diff --git a/.git_disabled/objects/c2/bd545b67c8acb478441e6bd46ba67924cb6f31 b/.git_disabled/objects/c2/bd545b67c8acb478441e6bd46ba67924cb6f31 new file mode 100755 index 0000000..de5bd56 Binary files /dev/null and b/.git_disabled/objects/c2/bd545b67c8acb478441e6bd46ba67924cb6f31 differ diff --git a/.git_disabled/objects/c2/c6a93c90fcf8417f66c08419d5b16ac6a7c037 b/.git_disabled/objects/c2/c6a93c90fcf8417f66c08419d5b16ac6a7c037 new file mode 100755 index 0000000..6742495 Binary files /dev/null and b/.git_disabled/objects/c2/c6a93c90fcf8417f66c08419d5b16ac6a7c037 differ diff --git a/.git_disabled/objects/c2/cd4a4e5604df544fd51c5b7e73cf41ee4f39da b/.git_disabled/objects/c2/cd4a4e5604df544fd51c5b7e73cf41ee4f39da new file mode 100755 index 0000000..32d9155 --- /dev/null +++ b/.git_disabled/objects/c2/cd4a4e5604df544fd51c5b7e73cf41ee4f39da @@ -0,0 +1,5 @@ +xoTu.P@=W@R ,?aRnL<ƅcąx +HLpՈ# 5(Eѕn|'ytzZ$4~hpUq;{9@WdχCo_Zi~? |>O' |>O' |>O' |>O࿜@߅/?Þ>֑,h(dRTbRT(% +QJ SJ*S"*ReRjPjPLUPJQ/qO' |>O' _& +nl~ߏmh~oCXW.l&<V󛯇0GZ.{pM|7~Z\ƽGwuoƝeC|.A3/|x6C<.ހω|ZOGux1?* +2|\|)_ q+ߋGtQC⥸_|߉{+px=uNߎ߆sgj|NlY ># _O'vM'Wx!_sW~xB|>(Ľxw.wQZl:oGf7!~{\lA-b;6[*wm~r!tg[by-sV! ]c3otb;?f?ޮbۿKv},Hl{_~im!g\lnLlnݨخŶv m?obdb~?~Tlo>~XlvPlbχĶm~+Y*Gl}vm+KlÝb'bcbv_xoϿĶFŶ>zSl ŶFĶ^>zFww_ǠM \ No newline at end of file diff --git a/.git_disabled/objects/c2/e6e97231882ba763133c9a2dd151f9e14c0a5a b/.git_disabled/objects/c2/e6e97231882ba763133c9a2dd151f9e14c0a5a new file mode 100755 index 0000000..2f14abc Binary files /dev/null and b/.git_disabled/objects/c2/e6e97231882ba763133c9a2dd151f9e14c0a5a differ diff --git a/.git_disabled/objects/c2/f228f670b62a2a25f036e86401ad40da616084 b/.git_disabled/objects/c2/f228f670b62a2a25f036e86401ad40da616084 new file mode 100755 index 0000000..1fff91c Binary files /dev/null and b/.git_disabled/objects/c2/f228f670b62a2a25f036e86401ad40da616084 differ diff --git a/.git_disabled/objects/c3/0847c57fa2c3da46b5a72792cf65532ca5562d b/.git_disabled/objects/c3/0847c57fa2c3da46b5a72792cf65532ca5562d new file mode 100755 index 0000000..2eed85d Binary files /dev/null and b/.git_disabled/objects/c3/0847c57fa2c3da46b5a72792cf65532ca5562d differ diff --git a/.git_disabled/objects/c3/127aca288824f27b08fc42bef040ea12be2d73 b/.git_disabled/objects/c3/127aca288824f27b08fc42bef040ea12be2d73 new file mode 100755 index 0000000..4a0cfe1 Binary files /dev/null and b/.git_disabled/objects/c3/127aca288824f27b08fc42bef040ea12be2d73 differ diff --git a/.git_disabled/objects/c3/214776967f651aabd699757fe460b1625ce2a6 b/.git_disabled/objects/c3/214776967f651aabd699757fe460b1625ce2a6 new file mode 100755 index 0000000..0b4e8c3 Binary files /dev/null and b/.git_disabled/objects/c3/214776967f651aabd699757fe460b1625ce2a6 differ diff --git a/.git_disabled/objects/c3/2acbf43f1ea24d48ca33f5763685741ac5caed b/.git_disabled/objects/c3/2acbf43f1ea24d48ca33f5763685741ac5caed new file mode 100755 index 0000000..de73ab2 Binary files /dev/null and b/.git_disabled/objects/c3/2acbf43f1ea24d48ca33f5763685741ac5caed differ diff --git a/.git_disabled/objects/c3/444cd29b4bc2b642e059055cbd968cf13a6beb b/.git_disabled/objects/c3/444cd29b4bc2b642e059055cbd968cf13a6beb new file mode 100755 index 0000000..39683ba Binary files /dev/null and b/.git_disabled/objects/c3/444cd29b4bc2b642e059055cbd968cf13a6beb differ diff --git a/.git_disabled/objects/c3/446c52cb86ab4559e15f77f49b250f8197aaba b/.git_disabled/objects/c3/446c52cb86ab4559e15f77f49b250f8197aaba new file mode 100755 index 0000000..84853d4 Binary files /dev/null and b/.git_disabled/objects/c3/446c52cb86ab4559e15f77f49b250f8197aaba differ diff --git a/.git_disabled/objects/c3/6e2ae3199ee6187e3d5b42d9beb191cf03fe01 b/.git_disabled/objects/c3/6e2ae3199ee6187e3d5b42d9beb191cf03fe01 new file mode 100755 index 0000000..28966eb Binary files /dev/null and b/.git_disabled/objects/c3/6e2ae3199ee6187e3d5b42d9beb191cf03fe01 differ diff --git a/.git_disabled/objects/c3/78208025e7afa420c4b1c109d21a5948417eab b/.git_disabled/objects/c3/78208025e7afa420c4b1c109d21a5948417eab new file mode 100755 index 0000000..0685e24 Binary files /dev/null and b/.git_disabled/objects/c3/78208025e7afa420c4b1c109d21a5948417eab differ diff --git a/.git_disabled/objects/c3/7a2048f1eda9514bd0dd031ad7c564cc3d5acc b/.git_disabled/objects/c3/7a2048f1eda9514bd0dd031ad7c564cc3d5acc new file mode 100755 index 0000000..2c48af6 Binary files /dev/null and b/.git_disabled/objects/c3/7a2048f1eda9514bd0dd031ad7c564cc3d5acc differ diff --git a/.git_disabled/objects/c3/7d805ef3fb52ec2735d5431e9613eb30c94220 b/.git_disabled/objects/c3/7d805ef3fb52ec2735d5431e9613eb30c94220 new file mode 100755 index 0000000..350c727 Binary files /dev/null and b/.git_disabled/objects/c3/7d805ef3fb52ec2735d5431e9613eb30c94220 differ diff --git a/.git_disabled/objects/c3/9c13be389b0a6725e4bce8cf74b385de562d91 b/.git_disabled/objects/c3/9c13be389b0a6725e4bce8cf74b385de562d91 new file mode 100755 index 0000000..93705a2 Binary files /dev/null and b/.git_disabled/objects/c3/9c13be389b0a6725e4bce8cf74b385de562d91 differ diff --git a/.git_disabled/objects/c3/a187c9f9c0e1153a3550314b68136e508532b1 b/.git_disabled/objects/c3/a187c9f9c0e1153a3550314b68136e508532b1 new file mode 100755 index 0000000..02bae2f Binary files /dev/null and b/.git_disabled/objects/c3/a187c9f9c0e1153a3550314b68136e508532b1 differ diff --git a/.git_disabled/objects/c3/b4e60c8a32ee74386c963dce900e44c5ed142f b/.git_disabled/objects/c3/b4e60c8a32ee74386c963dce900e44c5ed142f new file mode 100755 index 0000000..25dc055 Binary files /dev/null and b/.git_disabled/objects/c3/b4e60c8a32ee74386c963dce900e44c5ed142f differ diff --git a/.git_disabled/objects/c3/c78a778a5b68b594d292c1c721d12a8da64615 b/.git_disabled/objects/c3/c78a778a5b68b594d292c1c721d12a8da64615 new file mode 100755 index 0000000..c890e10 Binary files /dev/null and b/.git_disabled/objects/c3/c78a778a5b68b594d292c1c721d12a8da64615 differ diff --git a/.git_disabled/objects/c3/cda1ecda8629edbdca2e3bc04bc51dba5e1430 b/.git_disabled/objects/c3/cda1ecda8629edbdca2e3bc04bc51dba5e1430 new file mode 100755 index 0000000..0ed29ab Binary files /dev/null and b/.git_disabled/objects/c3/cda1ecda8629edbdca2e3bc04bc51dba5e1430 differ diff --git a/.git_disabled/objects/c3/d111054b64c6ae30274d559e3d2d82e1211d33 b/.git_disabled/objects/c3/d111054b64c6ae30274d559e3d2d82e1211d33 new file mode 100755 index 0000000..12e25ee Binary files /dev/null and b/.git_disabled/objects/c3/d111054b64c6ae30274d559e3d2d82e1211d33 differ diff --git a/.git_disabled/objects/c3/e235c585483c5b7676844312d382dc7e228a9f b/.git_disabled/objects/c3/e235c585483c5b7676844312d382dc7e228a9f new file mode 100755 index 0000000..a823df9 Binary files /dev/null and b/.git_disabled/objects/c3/e235c585483c5b7676844312d382dc7e228a9f differ diff --git a/.git_disabled/objects/c4/0cd0955b1a8badd179218d2ddb2091c72d572e b/.git_disabled/objects/c4/0cd0955b1a8badd179218d2ddb2091c72d572e new file mode 100755 index 0000000..397130e Binary files /dev/null and b/.git_disabled/objects/c4/0cd0955b1a8badd179218d2ddb2091c72d572e differ diff --git a/.git_disabled/objects/c4/3d97727ae68a1c4a4e2169857aee6447309189 b/.git_disabled/objects/c4/3d97727ae68a1c4a4e2169857aee6447309189 new file mode 100755 index 0000000..290159f Binary files /dev/null and b/.git_disabled/objects/c4/3d97727ae68a1c4a4e2169857aee6447309189 differ diff --git a/.git_disabled/objects/c4/4f30cba0d380c1359d5b09c440b653434d8900 b/.git_disabled/objects/c4/4f30cba0d380c1359d5b09c440b653434d8900 new file mode 100755 index 0000000..b76735f Binary files /dev/null and b/.git_disabled/objects/c4/4f30cba0d380c1359d5b09c440b653434d8900 differ diff --git a/.git_disabled/objects/c4/4ff93cb2f572afc6e679308024b744b65c3b0a b/.git_disabled/objects/c4/4ff93cb2f572afc6e679308024b744b65c3b0a new file mode 100755 index 0000000..c92a1de Binary files /dev/null and b/.git_disabled/objects/c4/4ff93cb2f572afc6e679308024b744b65c3b0a differ diff --git a/.git_disabled/objects/c4/64569780128e2a39d32cd4fef52c9a5e8d7929 b/.git_disabled/objects/c4/64569780128e2a39d32cd4fef52c9a5e8d7929 new file mode 100755 index 0000000..dc4743a Binary files /dev/null and b/.git_disabled/objects/c4/64569780128e2a39d32cd4fef52c9a5e8d7929 differ diff --git a/.git_disabled/objects/c4/72d5c6335ed5b18676db75fae31a7062022e6b b/.git_disabled/objects/c4/72d5c6335ed5b18676db75fae31a7062022e6b new file mode 100755 index 0000000..92e69cc Binary files /dev/null and b/.git_disabled/objects/c4/72d5c6335ed5b18676db75fae31a7062022e6b differ diff --git a/.git_disabled/objects/c4/734fae3096948c00f9717adf14c0fd03d0515f b/.git_disabled/objects/c4/734fae3096948c00f9717adf14c0fd03d0515f new file mode 100755 index 0000000..ef8e1d4 Binary files /dev/null and b/.git_disabled/objects/c4/734fae3096948c00f9717adf14c0fd03d0515f differ diff --git a/.git_disabled/objects/c4/98415fd9d534cbc08a41754742f0fe8d069af5 b/.git_disabled/objects/c4/98415fd9d534cbc08a41754742f0fe8d069af5 new file mode 100755 index 0000000..21c7dc4 Binary files /dev/null and b/.git_disabled/objects/c4/98415fd9d534cbc08a41754742f0fe8d069af5 differ diff --git a/.git_disabled/objects/c4/99574634df3a6fe560dad6a5dbda804b642cb4 b/.git_disabled/objects/c4/99574634df3a6fe560dad6a5dbda804b642cb4 new file mode 100755 index 0000000..303c3f2 Binary files /dev/null and b/.git_disabled/objects/c4/99574634df3a6fe560dad6a5dbda804b642cb4 differ diff --git a/.git_disabled/objects/c4/9d61e0538174a2ebecbb666bf5a3be349c630f b/.git_disabled/objects/c4/9d61e0538174a2ebecbb666bf5a3be349c630f new file mode 100755 index 0000000..5df64f9 Binary files /dev/null and b/.git_disabled/objects/c4/9d61e0538174a2ebecbb666bf5a3be349c630f differ diff --git a/.git_disabled/objects/c4/b66b4a1d9632d53943f7dc986532b692741f06 b/.git_disabled/objects/c4/b66b4a1d9632d53943f7dc986532b692741f06 new file mode 100755 index 0000000..0dfbba4 Binary files /dev/null and b/.git_disabled/objects/c4/b66b4a1d9632d53943f7dc986532b692741f06 differ diff --git a/.git_disabled/objects/c4/bb0106650d1881122bc15979957961a6af763d b/.git_disabled/objects/c4/bb0106650d1881122bc15979957961a6af763d new file mode 100755 index 0000000..53a46c0 Binary files /dev/null and b/.git_disabled/objects/c4/bb0106650d1881122bc15979957961a6af763d differ diff --git a/.git_disabled/objects/c4/bd5191aeda36ee65a392dd5a40a968f5da6819 b/.git_disabled/objects/c4/bd5191aeda36ee65a392dd5a40a968f5da6819 new file mode 100755 index 0000000..07064f2 Binary files /dev/null and b/.git_disabled/objects/c4/bd5191aeda36ee65a392dd5a40a968f5da6819 differ diff --git a/.git_disabled/objects/c4/c2f5c5b2a40e3c3ca1f1d03b93468b2f8853a1 b/.git_disabled/objects/c4/c2f5c5b2a40e3c3ca1f1d03b93468b2f8853a1 new file mode 100755 index 0000000..b7a25fd Binary files /dev/null and b/.git_disabled/objects/c4/c2f5c5b2a40e3c3ca1f1d03b93468b2f8853a1 differ diff --git a/.git_disabled/objects/c4/c3373e4a3b7df3bd5e702da3a74351e6999638 b/.git_disabled/objects/c4/c3373e4a3b7df3bd5e702da3a74351e6999638 new file mode 100755 index 0000000..ca93639 Binary files /dev/null and b/.git_disabled/objects/c4/c3373e4a3b7df3bd5e702da3a74351e6999638 differ diff --git a/.git_disabled/objects/c4/c3c5dd2c055a6fa38af8fad26ee7b20aa8d5af b/.git_disabled/objects/c4/c3c5dd2c055a6fa38af8fad26ee7b20aa8d5af new file mode 100755 index 0000000..f852ffa Binary files /dev/null and b/.git_disabled/objects/c4/c3c5dd2c055a6fa38af8fad26ee7b20aa8d5af differ diff --git a/.git_disabled/objects/c4/c7402daf7ae66c19afdd13030901209f3d77fa b/.git_disabled/objects/c4/c7402daf7ae66c19afdd13030901209f3d77fa new file mode 100755 index 0000000..d66fa6c --- /dev/null +++ b/.git_disabled/objects/c4/c7402daf7ae66c19afdd13030901209f3d77fa @@ -0,0 +1 @@ +xM= 0E+.յ-upP(M^Q(v™ι\^55^u5- O>G%+~sWt9 9|u?&T?l b8a{Dӽv27չ44 \ No newline at end of file diff --git a/.git_disabled/objects/c4/cffbb31c409b1a7e2131a4a0e0ad8cadfb956a b/.git_disabled/objects/c4/cffbb31c409b1a7e2131a4a0e0ad8cadfb956a new file mode 100755 index 0000000..c52760a Binary files /dev/null and b/.git_disabled/objects/c4/cffbb31c409b1a7e2131a4a0e0ad8cadfb956a differ diff --git a/.git_disabled/objects/c4/d4416e3de0d20e4fb34e87f89d608563ea0152 b/.git_disabled/objects/c4/d4416e3de0d20e4fb34e87f89d608563ea0152 new file mode 100755 index 0000000..3a9d5a8 --- /dev/null +++ b/.git_disabled/objects/c4/d4416e3de0d20e4fb34e87f89d608563ea0152 @@ -0,0 +1 @@ +xPMk1yŀ=Z RRRA,T{^b2blB{(6>fa>@)覍0,G0> [A'+} *Ơ]d !mZ| ZMpp3"Dp!1Р TYe)tk6ZK1"ϏDą&7_4UlcdY& ʒG, HcJCBSOЄqquT\8[$MZVkT]x'g+.Eµ&":I^<0v“0?Wgc;??FY \ No newline at end of file diff --git a/.git_disabled/objects/c5/2acfb85cc964d7281ed2db56331b525b00f0a5 b/.git_disabled/objects/c5/2acfb85cc964d7281ed2db56331b525b00f0a5 new file mode 100755 index 0000000..e230bda Binary files /dev/null and b/.git_disabled/objects/c5/2acfb85cc964d7281ed2db56331b525b00f0a5 differ diff --git a/.git_disabled/objects/c5/2b273e62d698447ccafed7f1e6c4e5ff00a211 b/.git_disabled/objects/c5/2b273e62d698447ccafed7f1e6c4e5ff00a211 new file mode 100755 index 0000000..2c9a3e4 Binary files /dev/null and b/.git_disabled/objects/c5/2b273e62d698447ccafed7f1e6c4e5ff00a211 differ diff --git a/.git_disabled/objects/c5/2fd9093aff7d997ecdf260e834d9e628b60878 b/.git_disabled/objects/c5/2fd9093aff7d997ecdf260e834d9e628b60878 new file mode 100755 index 0000000..f4f8aca Binary files /dev/null and b/.git_disabled/objects/c5/2fd9093aff7d997ecdf260e834d9e628b60878 differ diff --git a/.git_disabled/objects/c5/3205abd2cbfe9c3b9004eb4c42494774771222 b/.git_disabled/objects/c5/3205abd2cbfe9c3b9004eb4c42494774771222 new file mode 100755 index 0000000..542e838 Binary files /dev/null and b/.git_disabled/objects/c5/3205abd2cbfe9c3b9004eb4c42494774771222 differ diff --git a/.git_disabled/objects/c5/42a78b6a6d45a038ff7a37976654c53ddf778e b/.git_disabled/objects/c5/42a78b6a6d45a038ff7a37976654c53ddf778e new file mode 100755 index 0000000..bf8eff2 Binary files /dev/null and b/.git_disabled/objects/c5/42a78b6a6d45a038ff7a37976654c53ddf778e differ diff --git a/.git_disabled/objects/c5/48aa396ff9951b1b691ae66431a96f7fc88e29 b/.git_disabled/objects/c5/48aa396ff9951b1b691ae66431a96f7fc88e29 new file mode 100755 index 0000000..1283684 Binary files /dev/null and b/.git_disabled/objects/c5/48aa396ff9951b1b691ae66431a96f7fc88e29 differ diff --git a/.git_disabled/objects/c5/4a476b9c2f9c65ef399543b74cf1d29a9b9269 b/.git_disabled/objects/c5/4a476b9c2f9c65ef399543b74cf1d29a9b9269 new file mode 100755 index 0000000..384b423 Binary files /dev/null and b/.git_disabled/objects/c5/4a476b9c2f9c65ef399543b74cf1d29a9b9269 differ diff --git a/.git_disabled/objects/c5/4a965c086b0985eb25b8ccc1baa71bc05a8ff9 b/.git_disabled/objects/c5/4a965c086b0985eb25b8ccc1baa71bc05a8ff9 new file mode 100755 index 0000000..1ecb5bd Binary files /dev/null and b/.git_disabled/objects/c5/4a965c086b0985eb25b8ccc1baa71bc05a8ff9 differ diff --git a/.git_disabled/objects/c5/5167a810986799f5d4d59a77accdf9cb5784e1 b/.git_disabled/objects/c5/5167a810986799f5d4d59a77accdf9cb5784e1 new file mode 100755 index 0000000..4aadb0f Binary files /dev/null and b/.git_disabled/objects/c5/5167a810986799f5d4d59a77accdf9cb5784e1 differ diff --git a/.git_disabled/objects/c5/5b6ef9540272bf68185b9a80a9b256ff0c5f2d b/.git_disabled/objects/c5/5b6ef9540272bf68185b9a80a9b256ff0c5f2d new file mode 100755 index 0000000..49f2e62 Binary files /dev/null and b/.git_disabled/objects/c5/5b6ef9540272bf68185b9a80a9b256ff0c5f2d differ diff --git a/.git_disabled/objects/c5/5dfdc4c7c86717e196d053fcb124062335f1bb b/.git_disabled/objects/c5/5dfdc4c7c86717e196d053fcb124062335f1bb new file mode 100755 index 0000000..875f5c1 Binary files /dev/null and b/.git_disabled/objects/c5/5dfdc4c7c86717e196d053fcb124062335f1bb differ diff --git a/.git_disabled/objects/c5/7a071332e871b2695684fac290c944e87d84be b/.git_disabled/objects/c5/7a071332e871b2695684fac290c944e87d84be new file mode 100755 index 0000000..4a9c024 Binary files /dev/null and b/.git_disabled/objects/c5/7a071332e871b2695684fac290c944e87d84be differ diff --git a/.git_disabled/objects/c5/80d7026a06c098443dd3722cb27589419217db b/.git_disabled/objects/c5/80d7026a06c098443dd3722cb27589419217db new file mode 100755 index 0000000..65bf81f Binary files /dev/null and b/.git_disabled/objects/c5/80d7026a06c098443dd3722cb27589419217db differ diff --git a/.git_disabled/objects/c5/95ef62e57e4f76c094263305355fd04e0dc67b b/.git_disabled/objects/c5/95ef62e57e4f76c094263305355fd04e0dc67b new file mode 100755 index 0000000..e0cce85 Binary files /dev/null and b/.git_disabled/objects/c5/95ef62e57e4f76c094263305355fd04e0dc67b differ diff --git a/.git_disabled/objects/c5/9c441a40d5d4c8032164b4018972041909e8e7 b/.git_disabled/objects/c5/9c441a40d5d4c8032164b4018972041909e8e7 new file mode 100755 index 0000000..394fb6c --- /dev/null +++ b/.git_disabled/objects/c5/9c441a40d5d4c8032164b4018972041909e8e7 @@ -0,0 +1,2 @@ +xN09)XDOB }{m,9c'`Nc( dfpRX@#kh&!246T+bl ;H^qQ$1ex<ןyFnO+C6i+Ys:a˭cr4T-~ +O=mkʡ"en+1LǡÉF/=^m \ No newline at end of file diff --git a/.git_disabled/objects/c5/9cb7a2c3b0ccea159b606c143405259426ed90 b/.git_disabled/objects/c5/9cb7a2c3b0ccea159b606c143405259426ed90 new file mode 100755 index 0000000..040dadb Binary files /dev/null and b/.git_disabled/objects/c5/9cb7a2c3b0ccea159b606c143405259426ed90 differ diff --git a/.git_disabled/objects/c5/ab1e5a9ac7e8cba9382438608a3fdd7e480691 b/.git_disabled/objects/c5/ab1e5a9ac7e8cba9382438608a3fdd7e480691 new file mode 100755 index 0000000..d7f4cee Binary files /dev/null and b/.git_disabled/objects/c5/ab1e5a9ac7e8cba9382438608a3fdd7e480691 differ diff --git a/.git_disabled/objects/c5/bfef7299f97e126bb174a03b6a4a2205159144 b/.git_disabled/objects/c5/bfef7299f97e126bb174a03b6a4a2205159144 new file mode 100755 index 0000000..f1707e0 Binary files /dev/null and b/.git_disabled/objects/c5/bfef7299f97e126bb174a03b6a4a2205159144 differ diff --git a/.git_disabled/objects/c5/c6cd7c5ae64c1a6f4bd643d76d2b87c9cbdfaa b/.git_disabled/objects/c5/c6cd7c5ae64c1a6f4bd643d76d2b87c9cbdfaa new file mode 100755 index 0000000..889532c Binary files /dev/null and b/.git_disabled/objects/c5/c6cd7c5ae64c1a6f4bd643d76d2b87c9cbdfaa differ diff --git a/.git_disabled/objects/c5/dc50fe7b29a099282d73de226e91e00303f8ee b/.git_disabled/objects/c5/dc50fe7b29a099282d73de226e91e00303f8ee new file mode 100755 index 0000000..a7f2a77 Binary files /dev/null and b/.git_disabled/objects/c5/dc50fe7b29a099282d73de226e91e00303f8ee differ diff --git a/.git_disabled/objects/c5/e00a636d7973f9ce4a9e1823c92a1115cb9473 b/.git_disabled/objects/c5/e00a636d7973f9ce4a9e1823c92a1115cb9473 new file mode 100755 index 0000000..cfdd12a Binary files /dev/null and b/.git_disabled/objects/c5/e00a636d7973f9ce4a9e1823c92a1115cb9473 differ diff --git a/.git_disabled/objects/c5/e1118d15ece983c61abf517cbe5afef29c9278 b/.git_disabled/objects/c5/e1118d15ece983c61abf517cbe5afef29c9278 new file mode 100755 index 0000000..c67856d Binary files /dev/null and b/.git_disabled/objects/c5/e1118d15ece983c61abf517cbe5afef29c9278 differ diff --git a/.git_disabled/objects/c5/e4e1a3d126d1cd0f793521f35159a9dd57ab27 b/.git_disabled/objects/c5/e4e1a3d126d1cd0f793521f35159a9dd57ab27 new file mode 100755 index 0000000..4f26a8a Binary files /dev/null and b/.git_disabled/objects/c5/e4e1a3d126d1cd0f793521f35159a9dd57ab27 differ diff --git a/.git_disabled/objects/c5/f45e7802322aef596ad3cea0589beeb6be927c b/.git_disabled/objects/c5/f45e7802322aef596ad3cea0589beeb6be927c new file mode 100755 index 0000000..5c786a7 Binary files /dev/null and b/.git_disabled/objects/c5/f45e7802322aef596ad3cea0589beeb6be927c differ diff --git a/.git_disabled/objects/c5/f4a8de37c1c11e9832d871df4b904cb6dc4d4f b/.git_disabled/objects/c5/f4a8de37c1c11e9832d871df4b904cb6dc4d4f new file mode 100755 index 0000000..0359d86 Binary files /dev/null and b/.git_disabled/objects/c5/f4a8de37c1c11e9832d871df4b904cb6dc4d4f differ diff --git a/.git_disabled/objects/c6/04377cbe46159bf15ef89cad36b5cf81414d55 b/.git_disabled/objects/c6/04377cbe46159bf15ef89cad36b5cf81414d55 new file mode 100755 index 0000000..6617c94 Binary files /dev/null and b/.git_disabled/objects/c6/04377cbe46159bf15ef89cad36b5cf81414d55 differ diff --git a/.git_disabled/objects/c6/420f6957d5fc8821ea899343a27147e40cdf0d b/.git_disabled/objects/c6/420f6957d5fc8821ea899343a27147e40cdf0d new file mode 100755 index 0000000..bdd1428 Binary files /dev/null and b/.git_disabled/objects/c6/420f6957d5fc8821ea899343a27147e40cdf0d differ diff --git a/.git_disabled/objects/c6/449b7287335028d5e98442323f9307d92b1b0f b/.git_disabled/objects/c6/449b7287335028d5e98442323f9307d92b1b0f new file mode 100755 index 0000000..a2a7e5e Binary files /dev/null and b/.git_disabled/objects/c6/449b7287335028d5e98442323f9307d92b1b0f differ diff --git a/.git_disabled/objects/c6/55fec7a62a6a8dc825d2dea703e61650deb3d8 b/.git_disabled/objects/c6/55fec7a62a6a8dc825d2dea703e61650deb3d8 new file mode 100755 index 0000000..f263db2 Binary files /dev/null and b/.git_disabled/objects/c6/55fec7a62a6a8dc825d2dea703e61650deb3d8 differ diff --git a/.git_disabled/objects/c6/64c94dec2de3fe6ea783a603fe575bb65c4f17 b/.git_disabled/objects/c6/64c94dec2de3fe6ea783a603fe575bb65c4f17 new file mode 100755 index 0000000..780048d Binary files /dev/null and b/.git_disabled/objects/c6/64c94dec2de3fe6ea783a603fe575bb65c4f17 differ diff --git a/.git_disabled/objects/c6/8fb65a30c1c366f96ca8b88f1019601e81354d b/.git_disabled/objects/c6/8fb65a30c1c366f96ca8b88f1019601e81354d new file mode 100755 index 0000000..022d858 Binary files /dev/null and b/.git_disabled/objects/c6/8fb65a30c1c366f96ca8b88f1019601e81354d differ diff --git a/.git_disabled/objects/c6/9ecf51fb93db8f9282132ca7a15f5b3916cdcb b/.git_disabled/objects/c6/9ecf51fb93db8f9282132ca7a15f5b3916cdcb new file mode 100755 index 0000000..fe8789d Binary files /dev/null and b/.git_disabled/objects/c6/9ecf51fb93db8f9282132ca7a15f5b3916cdcb differ diff --git a/.git_disabled/objects/c6/9f7a5d2881e59b3c51021c0fa5fdf256c67789 b/.git_disabled/objects/c6/9f7a5d2881e59b3c51021c0fa5fdf256c67789 new file mode 100755 index 0000000..7b4f9c0 Binary files /dev/null and b/.git_disabled/objects/c6/9f7a5d2881e59b3c51021c0fa5fdf256c67789 differ diff --git a/.git_disabled/objects/c6/be8a4c020fc8dc8360905bc2f8b64a923767e9 b/.git_disabled/objects/c6/be8a4c020fc8dc8360905bc2f8b64a923767e9 new file mode 100755 index 0000000..27c387e Binary files /dev/null and b/.git_disabled/objects/c6/be8a4c020fc8dc8360905bc2f8b64a923767e9 differ diff --git a/.git_disabled/objects/c6/c46dd1ad03a3c6adac34b19e3de394f83e60ae b/.git_disabled/objects/c6/c46dd1ad03a3c6adac34b19e3de394f83e60ae new file mode 100755 index 0000000..1056acf Binary files /dev/null and b/.git_disabled/objects/c6/c46dd1ad03a3c6adac34b19e3de394f83e60ae differ diff --git a/.git_disabled/objects/c6/daa4c8d26e8377d14b6adcaad19068b2bed5b8 b/.git_disabled/objects/c6/daa4c8d26e8377d14b6adcaad19068b2bed5b8 new file mode 100755 index 0000000..75babf9 Binary files /dev/null and b/.git_disabled/objects/c6/daa4c8d26e8377d14b6adcaad19068b2bed5b8 differ diff --git a/.git_disabled/objects/c6/dc3b0e39331dd10a18edbfe0a9e82aaadbb7c9 b/.git_disabled/objects/c6/dc3b0e39331dd10a18edbfe0a9e82aaadbb7c9 new file mode 100755 index 0000000..e48367e --- /dev/null +++ b/.git_disabled/objects/c6/dc3b0e39331dd10a18edbfe0a9e82aaadbb7c9 @@ -0,0 +1,4 @@ +xePAN0WD+E-[+HTTcoUز P^#g6 +E N;ݝLil )̵e 2!uHg6čn¹^XI +Ҥna>fB7F:RL]\ W=Rr&q[R舊j4ޭ$RK + mKF?TpH84E2EB0v Fm ʓ;8%#m|`UbtR6D=ɲuVrc9 /5b[s*v٭u/pfLrg/ \ No newline at end of file diff --git a/.git_disabled/objects/c6/e715b5dc43e3ec1584283cc4cfe6e1ad0f7621 b/.git_disabled/objects/c6/e715b5dc43e3ec1584283cc4cfe6e1ad0f7621 new file mode 100755 index 0000000..9022473 Binary files /dev/null and b/.git_disabled/objects/c6/e715b5dc43e3ec1584283cc4cfe6e1ad0f7621 differ diff --git a/.git_disabled/objects/c6/ebedc258214867fefb2e3c6b49cb7a92a48b1f b/.git_disabled/objects/c6/ebedc258214867fefb2e3c6b49cb7a92a48b1f new file mode 100755 index 0000000..04af40b Binary files /dev/null and b/.git_disabled/objects/c6/ebedc258214867fefb2e3c6b49cb7a92a48b1f differ diff --git a/.git_disabled/objects/c6/eefc97a01e70c8460f4096ff839460fb75acd4 b/.git_disabled/objects/c6/eefc97a01e70c8460f4096ff839460fb75acd4 new file mode 100755 index 0000000..9b3bfe5 Binary files /dev/null and b/.git_disabled/objects/c6/eefc97a01e70c8460f4096ff839460fb75acd4 differ diff --git a/.git_disabled/objects/c6/faef3d0aa98f33b159752d1cc11add7eec54f8 b/.git_disabled/objects/c6/faef3d0aa98f33b159752d1cc11add7eec54f8 new file mode 100755 index 0000000..6d50ad7 Binary files /dev/null and b/.git_disabled/objects/c6/faef3d0aa98f33b159752d1cc11add7eec54f8 differ diff --git a/.git_disabled/objects/c6/fbc56492e10911afb0a2699198376a668497cd b/.git_disabled/objects/c6/fbc56492e10911afb0a2699198376a668497cd new file mode 100755 index 0000000..ac33726 Binary files /dev/null and b/.git_disabled/objects/c6/fbc56492e10911afb0a2699198376a668497cd differ diff --git a/.git_disabled/objects/c7/02e7d945e932ef2a4a20758e058f67bc09a1d7 b/.git_disabled/objects/c7/02e7d945e932ef2a4a20758e058f67bc09a1d7 new file mode 100755 index 0000000..d0821fc Binary files /dev/null and b/.git_disabled/objects/c7/02e7d945e932ef2a4a20758e058f67bc09a1d7 differ diff --git a/.git_disabled/objects/c7/156409eb549153eec1aaf1c4f0e9a39c714cc0 b/.git_disabled/objects/c7/156409eb549153eec1aaf1c4f0e9a39c714cc0 new file mode 100755 index 0000000..d65cd1e Binary files /dev/null and b/.git_disabled/objects/c7/156409eb549153eec1aaf1c4f0e9a39c714cc0 differ diff --git a/.git_disabled/objects/c7/17660735200600fd3b745c6ea8264f41ca2a34 b/.git_disabled/objects/c7/17660735200600fd3b745c6ea8264f41ca2a34 new file mode 100755 index 0000000..2199093 Binary files /dev/null and b/.git_disabled/objects/c7/17660735200600fd3b745c6ea8264f41ca2a34 differ diff --git a/.git_disabled/objects/c7/22c53d34b849b321c804da1acfc919ab4f478b b/.git_disabled/objects/c7/22c53d34b849b321c804da1acfc919ab4f478b new file mode 100755 index 0000000..b05a90d Binary files /dev/null and b/.git_disabled/objects/c7/22c53d34b849b321c804da1acfc919ab4f478b differ diff --git a/.git_disabled/objects/c7/2a30a17e6d0e01f43300d676d67950f17240f6 b/.git_disabled/objects/c7/2a30a17e6d0e01f43300d676d67950f17240f6 new file mode 100755 index 0000000..8e28e4f Binary files /dev/null and b/.git_disabled/objects/c7/2a30a17e6d0e01f43300d676d67950f17240f6 differ diff --git a/.git_disabled/objects/c7/39f01722151d7bf889e1acf1edb56f2efaa117 b/.git_disabled/objects/c7/39f01722151d7bf889e1acf1edb56f2efaa117 new file mode 100755 index 0000000..7d97003 Binary files /dev/null and b/.git_disabled/objects/c7/39f01722151d7bf889e1acf1edb56f2efaa117 differ diff --git a/.git_disabled/objects/c7/516336c0d72cab44a773b2b08a4de90216ae77 b/.git_disabled/objects/c7/516336c0d72cab44a773b2b08a4de90216ae77 new file mode 100755 index 0000000..60fb682 Binary files /dev/null and b/.git_disabled/objects/c7/516336c0d72cab44a773b2b08a4de90216ae77 differ diff --git a/.git_disabled/objects/c7/5a7f87b6d20b856ec4e779e3740305e53a9ebf b/.git_disabled/objects/c7/5a7f87b6d20b856ec4e779e3740305e53a9ebf new file mode 100644 index 0000000..2b620fc Binary files /dev/null and b/.git_disabled/objects/c7/5a7f87b6d20b856ec4e779e3740305e53a9ebf differ diff --git a/.git_disabled/objects/c7/6f5f518499a98bcece9a0f0087181598220865 b/.git_disabled/objects/c7/6f5f518499a98bcece9a0f0087181598220865 new file mode 100755 index 0000000..66bda65 Binary files /dev/null and b/.git_disabled/objects/c7/6f5f518499a98bcece9a0f0087181598220865 differ diff --git a/.git_disabled/objects/c7/7b525b2b329ad96e8d7726e0b7e15d28d10513 b/.git_disabled/objects/c7/7b525b2b329ad96e8d7726e0b7e15d28d10513 new file mode 100755 index 0000000..ef93a78 --- /dev/null +++ b/.git_disabled/objects/c7/7b525b2b329ad96e8d7726e0b7e15d28d10513 @@ -0,0 +1,3 @@ +xmQn0왯@˶@HӞzwD2i7"WRU F"g=30OEYV]DQV'Wsq +XT2}W'Eq?A,HiI1j4xxu;  +9,t +J>ZutFhy1qB;e|a9SzhDD:ʽOn:I-J=te%Fy'LSXqXܙBMed)*ꄷE!Ю>{ڴboR赸З \ No newline at end of file diff --git a/.git_disabled/objects/c7/7c069ecc9b7f8b1f97dbcfec905725db0253a8 b/.git_disabled/objects/c7/7c069ecc9b7f8b1f97dbcfec905725db0253a8 new file mode 100755 index 0000000..5f4beed Binary files /dev/null and b/.git_disabled/objects/c7/7c069ecc9b7f8b1f97dbcfec905725db0253a8 differ diff --git a/.git_disabled/objects/c7/825b35a4b585532eae17a88b30404236abf023 b/.git_disabled/objects/c7/825b35a4b585532eae17a88b30404236abf023 new file mode 100755 index 0000000..3445f3b Binary files /dev/null and b/.git_disabled/objects/c7/825b35a4b585532eae17a88b30404236abf023 differ diff --git a/.git_disabled/objects/c7/8eb42aa64ca3d61edbb2ea90e22aee0e0d885f b/.git_disabled/objects/c7/8eb42aa64ca3d61edbb2ea90e22aee0e0d885f new file mode 100755 index 0000000..6b7d652 --- /dev/null +++ b/.git_disabled/objects/c7/8eb42aa64ca3d61edbb2ea90e22aee0e0d885f @@ -0,0 +1,6 @@ +xKOGg{l`l?^v`#;R'jiv[YlNs9#(br7+VSl)+Ꚛo5[2ؚ^5oT(d-l.}+~DZ wmYYٶ y1918C% ɒb)iȰ dYr,y7,@JPfe + aa#p쨉KQ8Ǝ8q`f/%O$)6'IfpO30f,; 98vj3"\b +b윜96g켼 +l\c:nyne|Ey;p5뒼}cx#jKlɶx-wc^aOWfOՑ7KN`ۭjB'׹ +__\䧎<ҕ\m: B=p#kt+Wk02zb_w$ka(>pL \a ygى4u`F뒱rcKXVhۿX~2f[we0I/߬d|g`fϚڳf§MTz5gI+WM.^W&w㻅?) kn \ No newline at end of file diff --git a/.git_disabled/objects/c7/91879d1b0bbfb16758dc3d01ecd5e77933ca72 b/.git_disabled/objects/c7/91879d1b0bbfb16758dc3d01ecd5e77933ca72 new file mode 100755 index 0000000..aa155f3 Binary files /dev/null and b/.git_disabled/objects/c7/91879d1b0bbfb16758dc3d01ecd5e77933ca72 differ diff --git a/.git_disabled/objects/c7/9c0f954b27a6202c7ef36009f9f9a000a4c218 b/.git_disabled/objects/c7/9c0f954b27a6202c7ef36009f9f9a000a4c218 new file mode 100755 index 0000000..6b3e13f Binary files /dev/null and b/.git_disabled/objects/c7/9c0f954b27a6202c7ef36009f9f9a000a4c218 differ diff --git a/.git_disabled/objects/c7/c9ff8f8ae0b71cee26d12740e16b3493d0e938 b/.git_disabled/objects/c7/c9ff8f8ae0b71cee26d12740e16b3493d0e938 new file mode 100755 index 0000000..8b7c03c Binary files /dev/null and b/.git_disabled/objects/c7/c9ff8f8ae0b71cee26d12740e16b3493d0e938 differ diff --git a/.git_disabled/objects/c7/d108c07f49d8f07f1d11460a83988fd46be11d b/.git_disabled/objects/c7/d108c07f49d8f07f1d11460a83988fd46be11d new file mode 100755 index 0000000..a87c110 Binary files /dev/null and b/.git_disabled/objects/c7/d108c07f49d8f07f1d11460a83988fd46be11d differ diff --git a/.git_disabled/objects/c8/06a1e592038d7eb777512aad0f8bedb88919bf b/.git_disabled/objects/c8/06a1e592038d7eb777512aad0f8bedb88919bf new file mode 100755 index 0000000..ede6ced Binary files /dev/null and b/.git_disabled/objects/c8/06a1e592038d7eb777512aad0f8bedb88919bf differ diff --git a/.git_disabled/objects/c8/240bca4a6d78d3b186c58d13168909f3569d9a b/.git_disabled/objects/c8/240bca4a6d78d3b186c58d13168909f3569d9a new file mode 100755 index 0000000..370d3c5 Binary files /dev/null and b/.git_disabled/objects/c8/240bca4a6d78d3b186c58d13168909f3569d9a differ diff --git a/.git_disabled/objects/c8/2af0b209f5736c0aaad9e8dc3ba4f1521d13f0 b/.git_disabled/objects/c8/2af0b209f5736c0aaad9e8dc3ba4f1521d13f0 new file mode 100755 index 0000000..4589f9c Binary files /dev/null and b/.git_disabled/objects/c8/2af0b209f5736c0aaad9e8dc3ba4f1521d13f0 differ diff --git a/.git_disabled/objects/c8/31518afef8fff5373503a1af5779d8a6d1d7d4 b/.git_disabled/objects/c8/31518afef8fff5373503a1af5779d8a6d1d7d4 new file mode 100755 index 0000000..ce46f3f Binary files /dev/null and b/.git_disabled/objects/c8/31518afef8fff5373503a1af5779d8a6d1d7d4 differ diff --git a/.git_disabled/objects/c8/40646f91d50a0440bc27febf33cd7b090a15cd b/.git_disabled/objects/c8/40646f91d50a0440bc27febf33cd7b090a15cd new file mode 100755 index 0000000..0034f9f Binary files /dev/null and b/.git_disabled/objects/c8/40646f91d50a0440bc27febf33cd7b090a15cd differ diff --git a/.git_disabled/objects/c8/57b5f1ab1c91096d3de66ab6ac12a963d4f266 b/.git_disabled/objects/c8/57b5f1ab1c91096d3de66ab6ac12a963d4f266 new file mode 100755 index 0000000..cc58b78 Binary files /dev/null and b/.git_disabled/objects/c8/57b5f1ab1c91096d3de66ab6ac12a963d4f266 differ diff --git a/.git_disabled/objects/c8/5825a3f0d1ce017d81ba940f2457d7ae8d3b40 b/.git_disabled/objects/c8/5825a3f0d1ce017d81ba940f2457d7ae8d3b40 new file mode 100755 index 0000000..0cd3316 Binary files /dev/null and b/.git_disabled/objects/c8/5825a3f0d1ce017d81ba940f2457d7ae8d3b40 differ diff --git a/.git_disabled/objects/c8/696253ec7ffa1ac2295d4e32d2fc47d3e12bb8 b/.git_disabled/objects/c8/696253ec7ffa1ac2295d4e32d2fc47d3e12bb8 new file mode 100755 index 0000000..feefed7 Binary files /dev/null and b/.git_disabled/objects/c8/696253ec7ffa1ac2295d4e32d2fc47d3e12bb8 differ diff --git a/.git_disabled/objects/c8/7274e19f969dad037b85e01e793cddaeb2912e b/.git_disabled/objects/c8/7274e19f969dad037b85e01e793cddaeb2912e new file mode 100755 index 0000000..c9101ad Binary files /dev/null and b/.git_disabled/objects/c8/7274e19f969dad037b85e01e793cddaeb2912e differ diff --git a/.git_disabled/objects/c8/7635242a3a9a2e9dc855c4fe555d6994c1553c b/.git_disabled/objects/c8/7635242a3a9a2e9dc855c4fe555d6994c1553c new file mode 100755 index 0000000..7c798ab Binary files /dev/null and b/.git_disabled/objects/c8/7635242a3a9a2e9dc855c4fe555d6994c1553c differ diff --git a/.git_disabled/objects/c8/a11d8dda5f2d6d7fd43e2dc85b85ba4adc1bb3 b/.git_disabled/objects/c8/a11d8dda5f2d6d7fd43e2dc85b85ba4adc1bb3 new file mode 100755 index 0000000..057992b Binary files /dev/null and b/.git_disabled/objects/c8/a11d8dda5f2d6d7fd43e2dc85b85ba4adc1bb3 differ diff --git a/.git_disabled/objects/c8/a55c510a104e352997068fb5e9e15798ba474b b/.git_disabled/objects/c8/a55c510a104e352997068fb5e9e15798ba474b new file mode 100755 index 0000000..2ea21d7 Binary files /dev/null and b/.git_disabled/objects/c8/a55c510a104e352997068fb5e9e15798ba474b differ diff --git a/.git_disabled/objects/c8/b4486288c9529f55fd99d0b0203f0dd3af84f8 b/.git_disabled/objects/c8/b4486288c9529f55fd99d0b0203f0dd3af84f8 new file mode 100755 index 0000000..afd677a Binary files /dev/null and b/.git_disabled/objects/c8/b4486288c9529f55fd99d0b0203f0dd3af84f8 differ diff --git a/.git_disabled/objects/c8/dd3350588b4c5da2e98be63ce4f82073632150 b/.git_disabled/objects/c8/dd3350588b4c5da2e98be63ce4f82073632150 new file mode 100755 index 0000000..2267b1a Binary files /dev/null and b/.git_disabled/objects/c8/dd3350588b4c5da2e98be63ce4f82073632150 differ diff --git a/.git_disabled/objects/c8/e27c97f191ebe0a195fab2a29aafff183ac52b b/.git_disabled/objects/c8/e27c97f191ebe0a195fab2a29aafff183ac52b new file mode 100755 index 0000000..4cc20aa Binary files /dev/null and b/.git_disabled/objects/c8/e27c97f191ebe0a195fab2a29aafff183ac52b differ diff --git a/.git_disabled/objects/c9/0231f6c2014bbed02f320df8c970e9eedbe46a b/.git_disabled/objects/c9/0231f6c2014bbed02f320df8c970e9eedbe46a new file mode 100755 index 0000000..63129c8 Binary files /dev/null and b/.git_disabled/objects/c9/0231f6c2014bbed02f320df8c970e9eedbe46a differ diff --git a/.git_disabled/objects/c9/1adaddb32f45a02f53686aa739996968c999bd b/.git_disabled/objects/c9/1adaddb32f45a02f53686aa739996968c999bd new file mode 100755 index 0000000..9c61b5f Binary files /dev/null and b/.git_disabled/objects/c9/1adaddb32f45a02f53686aa739996968c999bd differ diff --git a/.git_disabled/objects/c9/1e3176343459a03a73024a6fb3fe3c74296a78 b/.git_disabled/objects/c9/1e3176343459a03a73024a6fb3fe3c74296a78 new file mode 100755 index 0000000..d820675 Binary files /dev/null and b/.git_disabled/objects/c9/1e3176343459a03a73024a6fb3fe3c74296a78 differ diff --git a/.git_disabled/objects/c9/248b0942516f2d47fd013ef3d1cc4105b22747 b/.git_disabled/objects/c9/248b0942516f2d47fd013ef3d1cc4105b22747 new file mode 100755 index 0000000..16574dd Binary files /dev/null and b/.git_disabled/objects/c9/248b0942516f2d47fd013ef3d1cc4105b22747 differ diff --git a/.git_disabled/objects/c9/30070eebdd6bc4ee29d1e486bebba06700a990 b/.git_disabled/objects/c9/30070eebdd6bc4ee29d1e486bebba06700a990 new file mode 100755 index 0000000..fdccaf1 Binary files /dev/null and b/.git_disabled/objects/c9/30070eebdd6bc4ee29d1e486bebba06700a990 differ diff --git a/.git_disabled/objects/c9/31de6cadf403e92151057025cf49319865613c b/.git_disabled/objects/c9/31de6cadf403e92151057025cf49319865613c new file mode 100755 index 0000000..ee8ac72 Binary files /dev/null and b/.git_disabled/objects/c9/31de6cadf403e92151057025cf49319865613c differ diff --git a/.git_disabled/objects/c9/61f3974a1cdc4b102215da5fe7832f32c7f6e9 b/.git_disabled/objects/c9/61f3974a1cdc4b102215da5fe7832f32c7f6e9 new file mode 100755 index 0000000..9c55c29 Binary files /dev/null and b/.git_disabled/objects/c9/61f3974a1cdc4b102215da5fe7832f32c7f6e9 differ diff --git a/.git_disabled/objects/c9/62226cdfe772a3363ce678d9ac75aadbed1938 b/.git_disabled/objects/c9/62226cdfe772a3363ce678d9ac75aadbed1938 new file mode 100755 index 0000000..e7af90b Binary files /dev/null and b/.git_disabled/objects/c9/62226cdfe772a3363ce678d9ac75aadbed1938 differ diff --git a/.git_disabled/objects/c9/69375d4d73d14c725dc45d98687782fe0a5804 b/.git_disabled/objects/c9/69375d4d73d14c725dc45d98687782fe0a5804 new file mode 100755 index 0000000..628b0ea Binary files /dev/null and b/.git_disabled/objects/c9/69375d4d73d14c725dc45d98687782fe0a5804 differ diff --git a/.git_disabled/objects/c9/9c5a67945b8a3a3544d481e979c791ab45fe23 b/.git_disabled/objects/c9/9c5a67945b8a3a3544d481e979c791ab45fe23 new file mode 100755 index 0000000..d676534 Binary files /dev/null and b/.git_disabled/objects/c9/9c5a67945b8a3a3544d481e979c791ab45fe23 differ diff --git a/.git_disabled/objects/c9/a2d28140aa9a63672d6a62b8ed9968340f0f08 b/.git_disabled/objects/c9/a2d28140aa9a63672d6a62b8ed9968340f0f08 new file mode 100755 index 0000000..9d12010 Binary files /dev/null and b/.git_disabled/objects/c9/a2d28140aa9a63672d6a62b8ed9968340f0f08 differ diff --git a/.git_disabled/objects/c9/d60d924d869d0afccaffe8234f956438e578ea b/.git_disabled/objects/c9/d60d924d869d0afccaffe8234f956438e578ea new file mode 100755 index 0000000..6ce05ba Binary files /dev/null and b/.git_disabled/objects/c9/d60d924d869d0afccaffe8234f956438e578ea differ diff --git a/.git_disabled/objects/c9/f5db29091797725a47a1a42d68cd3bc89e0f28 b/.git_disabled/objects/c9/f5db29091797725a47a1a42d68cd3bc89e0f28 new file mode 100755 index 0000000..e055a52 Binary files /dev/null and b/.git_disabled/objects/c9/f5db29091797725a47a1a42d68cd3bc89e0f28 differ diff --git a/.git_disabled/objects/ca/016658ef7a82429e6a4d2d8c071a041fa251f7 b/.git_disabled/objects/ca/016658ef7a82429e6a4d2d8c071a041fa251f7 new file mode 100755 index 0000000..8ef2718 Binary files /dev/null and b/.git_disabled/objects/ca/016658ef7a82429e6a4d2d8c071a041fa251f7 differ diff --git a/.git_disabled/objects/ca/037984401ed922db3c9ba8ebea897c7c3f3d5b b/.git_disabled/objects/ca/037984401ed922db3c9ba8ebea897c7c3f3d5b new file mode 100755 index 0000000..32a7e77 Binary files /dev/null and b/.git_disabled/objects/ca/037984401ed922db3c9ba8ebea897c7c3f3d5b differ diff --git a/.git_disabled/objects/ca/09c3a2f28e52eef3c03aec3cc24a658f991994 b/.git_disabled/objects/ca/09c3a2f28e52eef3c03aec3cc24a658f991994 new file mode 100755 index 0000000..23a5034 Binary files /dev/null and b/.git_disabled/objects/ca/09c3a2f28e52eef3c03aec3cc24a658f991994 differ diff --git a/.git_disabled/objects/ca/1c3adbde2c4e7710482a18e3471f91f1da610e b/.git_disabled/objects/ca/1c3adbde2c4e7710482a18e3471f91f1da610e new file mode 100755 index 0000000..b38905e Binary files /dev/null and b/.git_disabled/objects/ca/1c3adbde2c4e7710482a18e3471f91f1da610e differ diff --git a/.git_disabled/objects/ca/26d8896bf34f42743fe21a1ec108b8be85a3e0 b/.git_disabled/objects/ca/26d8896bf34f42743fe21a1ec108b8be85a3e0 new file mode 100755 index 0000000..2eb57eb Binary files /dev/null and b/.git_disabled/objects/ca/26d8896bf34f42743fe21a1ec108b8be85a3e0 differ diff --git a/.git_disabled/objects/ca/285d784aaa0273b44ef0d0da12db1eaa9cdf92 b/.git_disabled/objects/ca/285d784aaa0273b44ef0d0da12db1eaa9cdf92 new file mode 100755 index 0000000..2475024 Binary files /dev/null and b/.git_disabled/objects/ca/285d784aaa0273b44ef0d0da12db1eaa9cdf92 differ diff --git a/.git_disabled/objects/ca/37d71aba8e7db227d711f13d695984740ea07b b/.git_disabled/objects/ca/37d71aba8e7db227d711f13d695984740ea07b new file mode 100755 index 0000000..18107ca Binary files /dev/null and b/.git_disabled/objects/ca/37d71aba8e7db227d711f13d695984740ea07b differ diff --git a/.git_disabled/objects/ca/3b3d8deeaf7d50a8b77248e1a85c65a580a35b b/.git_disabled/objects/ca/3b3d8deeaf7d50a8b77248e1a85c65a580a35b new file mode 100755 index 0000000..c1a8dcc Binary files /dev/null and b/.git_disabled/objects/ca/3b3d8deeaf7d50a8b77248e1a85c65a580a35b differ diff --git a/.git_disabled/objects/ca/4a644b6e300910a78704593da592363d7db8e7 b/.git_disabled/objects/ca/4a644b6e300910a78704593da592363d7db8e7 new file mode 100755 index 0000000..88e485d Binary files /dev/null and b/.git_disabled/objects/ca/4a644b6e300910a78704593da592363d7db8e7 differ diff --git a/.git_disabled/objects/ca/574fe3ed3d3337a41b04c24b425e63a81c09cd b/.git_disabled/objects/ca/574fe3ed3d3337a41b04c24b425e63a81c09cd new file mode 100755 index 0000000..44dc16c Binary files /dev/null and b/.git_disabled/objects/ca/574fe3ed3d3337a41b04c24b425e63a81c09cd differ diff --git a/.git_disabled/objects/ca/5fb5a1a8c4d6f29457fc096ade1cd536060895 b/.git_disabled/objects/ca/5fb5a1a8c4d6f29457fc096ade1cd536060895 new file mode 100755 index 0000000..efa7001 Binary files /dev/null and b/.git_disabled/objects/ca/5fb5a1a8c4d6f29457fc096ade1cd536060895 differ diff --git a/.git_disabled/objects/ca/607af1be481edfc432c3e3e03c1e90895ebf86 b/.git_disabled/objects/ca/607af1be481edfc432c3e3e03c1e90895ebf86 new file mode 100755 index 0000000..b2df9f0 Binary files /dev/null and b/.git_disabled/objects/ca/607af1be481edfc432c3e3e03c1e90895ebf86 differ diff --git a/.git_disabled/objects/ca/8f2c8a92a7c4143cc85722161275599b6bd9d1 b/.git_disabled/objects/ca/8f2c8a92a7c4143cc85722161275599b6bd9d1 new file mode 100755 index 0000000..319feb8 Binary files /dev/null and b/.git_disabled/objects/ca/8f2c8a92a7c4143cc85722161275599b6bd9d1 differ diff --git a/.git_disabled/objects/ca/9a2e50e5598d6c6f8be2b900895edba554f611 b/.git_disabled/objects/ca/9a2e50e5598d6c6f8be2b900895edba554f611 new file mode 100755 index 0000000..767fc6f Binary files /dev/null and b/.git_disabled/objects/ca/9a2e50e5598d6c6f8be2b900895edba554f611 differ diff --git a/.git_disabled/objects/ca/a5712879a88785c19f11ccf0161a6034d54ac1 b/.git_disabled/objects/ca/a5712879a88785c19f11ccf0161a6034d54ac1 new file mode 100755 index 0000000..9db9f81 Binary files /dev/null and b/.git_disabled/objects/ca/a5712879a88785c19f11ccf0161a6034d54ac1 differ diff --git a/.git_disabled/objects/ca/b0b0b9bd216dc198a2b3a27c19efc37ffc66dd b/.git_disabled/objects/ca/b0b0b9bd216dc198a2b3a27c19efc37ffc66dd new file mode 100755 index 0000000..3493857 Binary files /dev/null and b/.git_disabled/objects/ca/b0b0b9bd216dc198a2b3a27c19efc37ffc66dd differ diff --git a/.git_disabled/objects/ca/b320563a39da094d74d0514fcd50c86aa9a6ed b/.git_disabled/objects/ca/b320563a39da094d74d0514fcd50c86aa9a6ed new file mode 100755 index 0000000..dea4ec2 Binary files /dev/null and b/.git_disabled/objects/ca/b320563a39da094d74d0514fcd50c86aa9a6ed differ diff --git a/.git_disabled/objects/ca/b87069802da9755559ea2fa6c25f301a09a41a b/.git_disabled/objects/ca/b87069802da9755559ea2fa6c25f301a09a41a new file mode 100755 index 0000000..1ca671f Binary files /dev/null and b/.git_disabled/objects/ca/b87069802da9755559ea2fa6c25f301a09a41a differ diff --git a/.git_disabled/objects/ca/d69cc6c9f2bde2b2a8fa6e6b45fec1a141bd95 b/.git_disabled/objects/ca/d69cc6c9f2bde2b2a8fa6e6b45fec1a141bd95 new file mode 100755 index 0000000..7139daa Binary files /dev/null and b/.git_disabled/objects/ca/d69cc6c9f2bde2b2a8fa6e6b45fec1a141bd95 differ diff --git a/.git_disabled/objects/ca/dd95e44cd6e129e3ea3aad6e589dec28761e39 b/.git_disabled/objects/ca/dd95e44cd6e129e3ea3aad6e589dec28761e39 new file mode 100755 index 0000000..27c1390 Binary files /dev/null and b/.git_disabled/objects/ca/dd95e44cd6e129e3ea3aad6e589dec28761e39 differ diff --git a/.git_disabled/objects/ca/e4c83639d2d37a97fc9d57bbc5b64d76c5274f b/.git_disabled/objects/ca/e4c83639d2d37a97fc9d57bbc5b64d76c5274f new file mode 100755 index 0000000..af93121 Binary files /dev/null and b/.git_disabled/objects/ca/e4c83639d2d37a97fc9d57bbc5b64d76c5274f differ diff --git a/.git_disabled/objects/ca/e7d921f0879911e5da1f911cc0186ae2f976f9 b/.git_disabled/objects/ca/e7d921f0879911e5da1f911cc0186ae2f976f9 new file mode 100755 index 0000000..1e6898a Binary files /dev/null and b/.git_disabled/objects/ca/e7d921f0879911e5da1f911cc0186ae2f976f9 differ diff --git a/.git_disabled/objects/cb/09ec58544eb3d6ca3e6dc2f63ee6d29a93b7d2 b/.git_disabled/objects/cb/09ec58544eb3d6ca3e6dc2f63ee6d29a93b7d2 new file mode 100755 index 0000000..467545b --- /dev/null +++ b/.git_disabled/objects/cb/09ec58544eb3d6ca3e6dc2f63ee6d29a93b7d2 @@ -0,0 +1,3 @@ +xMP1n0 Wt.`#Ml.)kw#-2 IT%ڭ~_%il|bQL Fr=BLMr;+JqxY/)4\˘z !a)`1*R +,r +Ⱦ[ѳE )L'VF'ۗY5޴3h]f; >{ssYpe)E9RMܿ5A@t}?]p"S(RF啐vO^8 \ No newline at end of file diff --git a/.git_disabled/objects/cb/2cb262eced1005e82ebd03fe86405d8d8d555e b/.git_disabled/objects/cb/2cb262eced1005e82ebd03fe86405d8d8d555e new file mode 100755 index 0000000..191e8e0 Binary files /dev/null and b/.git_disabled/objects/cb/2cb262eced1005e82ebd03fe86405d8d8d555e differ diff --git a/.git_disabled/objects/cb/420730f71111ca99a3487c71f424a202a95b1c b/.git_disabled/objects/cb/420730f71111ca99a3487c71f424a202a95b1c new file mode 100755 index 0000000..46efacc Binary files /dev/null and b/.git_disabled/objects/cb/420730f71111ca99a3487c71f424a202a95b1c differ diff --git a/.git_disabled/objects/cb/50115928b56a8809c19f0f430251f503d82d05 b/.git_disabled/objects/cb/50115928b56a8809c19f0f430251f503d82d05 new file mode 100755 index 0000000..4055242 Binary files /dev/null and b/.git_disabled/objects/cb/50115928b56a8809c19f0f430251f503d82d05 differ diff --git a/.git_disabled/objects/cb/5844df95776fa412813e7ce4b027bada5d4dde b/.git_disabled/objects/cb/5844df95776fa412813e7ce4b027bada5d4dde new file mode 100755 index 0000000..897eab8 Binary files /dev/null and b/.git_disabled/objects/cb/5844df95776fa412813e7ce4b027bada5d4dde differ diff --git a/.git_disabled/objects/cb/5f5e036ccdb00e5575ab653946dfebb8228716 b/.git_disabled/objects/cb/5f5e036ccdb00e5575ab653946dfebb8228716 new file mode 100755 index 0000000..6db51b9 Binary files /dev/null and b/.git_disabled/objects/cb/5f5e036ccdb00e5575ab653946dfebb8228716 differ diff --git a/.git_disabled/objects/cb/5f63e0390bf287216c6f4c33c41a6967182fc2 b/.git_disabled/objects/cb/5f63e0390bf287216c6f4c33c41a6967182fc2 new file mode 100755 index 0000000..79e4bed Binary files /dev/null and b/.git_disabled/objects/cb/5f63e0390bf287216c6f4c33c41a6967182fc2 differ diff --git a/.git_disabled/objects/cb/6770cef0d6ec49faba3105cb9ab35267d4345d b/.git_disabled/objects/cb/6770cef0d6ec49faba3105cb9ab35267d4345d new file mode 100755 index 0000000..02b34bb Binary files /dev/null and b/.git_disabled/objects/cb/6770cef0d6ec49faba3105cb9ab35267d4345d differ diff --git a/.git_disabled/objects/cb/7604030a6a3d0a8a8db98409d669c8ef25f79b b/.git_disabled/objects/cb/7604030a6a3d0a8a8db98409d669c8ef25f79b new file mode 100755 index 0000000..da928ff Binary files /dev/null and b/.git_disabled/objects/cb/7604030a6a3d0a8a8db98409d669c8ef25f79b differ diff --git a/.git_disabled/objects/cb/88bcb3b2e89a9a1f8ac0f5f7051bbb8313f296 b/.git_disabled/objects/cb/88bcb3b2e89a9a1f8ac0f5f7051bbb8313f296 new file mode 100755 index 0000000..eabcf15 Binary files /dev/null and b/.git_disabled/objects/cb/88bcb3b2e89a9a1f8ac0f5f7051bbb8313f296 differ diff --git a/.git_disabled/objects/cb/89e405b632bbb0a89ac231e14b88c336751670 b/.git_disabled/objects/cb/89e405b632bbb0a89ac231e14b88c336751670 new file mode 100755 index 0000000..3622695 Binary files /dev/null and b/.git_disabled/objects/cb/89e405b632bbb0a89ac231e14b88c336751670 differ diff --git a/.git_disabled/objects/cb/8dc2c6ec397db2525d54341f1fef5221877aeb b/.git_disabled/objects/cb/8dc2c6ec397db2525d54341f1fef5221877aeb new file mode 100755 index 0000000..0ff2d14 --- /dev/null +++ b/.git_disabled/objects/cb/8dc2c6ec397db2525d54341f1fef5221877aeb @@ -0,0 +1 @@ +xUj0 wSrCh/e J/t9$Z2i~*ݥ7O Ь/%o>Y묷uUXhuM]oVMl x9mpZl(&ُe~2n0Uj犂0QcEc&꿩  U' \ No newline at end of file diff --git a/.git_disabled/objects/cb/924c95e523f29dbece88f43bf3d0e7807af917 b/.git_disabled/objects/cb/924c95e523f29dbece88f43bf3d0e7807af917 new file mode 100755 index 0000000..1220c36 Binary files /dev/null and b/.git_disabled/objects/cb/924c95e523f29dbece88f43bf3d0e7807af917 differ diff --git a/.git_disabled/objects/cb/99e857a3bb2db6756fa1b4f36b3b77495b4bb1 b/.git_disabled/objects/cb/99e857a3bb2db6756fa1b4f36b3b77495b4bb1 new file mode 100755 index 0000000..368dcfc Binary files /dev/null and b/.git_disabled/objects/cb/99e857a3bb2db6756fa1b4f36b3b77495b4bb1 differ diff --git a/.git_disabled/objects/cb/b591da0d2e77f64c8428514ab55ec9f37562e7 b/.git_disabled/objects/cb/b591da0d2e77f64c8428514ab55ec9f37562e7 new file mode 100755 index 0000000..bdce80d Binary files /dev/null and b/.git_disabled/objects/cb/b591da0d2e77f64c8428514ab55ec9f37562e7 differ diff --git a/.git_disabled/objects/cb/bcaec0bbb7324f7c26a2199da02da8425b5e6b b/.git_disabled/objects/cb/bcaec0bbb7324f7c26a2199da02da8425b5e6b new file mode 100755 index 0000000..4c321ef Binary files /dev/null and b/.git_disabled/objects/cb/bcaec0bbb7324f7c26a2199da02da8425b5e6b differ diff --git a/.git_disabled/objects/cb/c2e4ff4ec3e2318d47615bab44ea0ca3dba978 b/.git_disabled/objects/cb/c2e4ff4ec3e2318d47615bab44ea0ca3dba978 new file mode 100755 index 0000000..918ca94 Binary files /dev/null and b/.git_disabled/objects/cb/c2e4ff4ec3e2318d47615bab44ea0ca3dba978 differ diff --git a/.git_disabled/objects/cb/d8118ad5554291e9f0177a607567c8bc84c03b b/.git_disabled/objects/cb/d8118ad5554291e9f0177a607567c8bc84c03b new file mode 100755 index 0000000..b96742d Binary files /dev/null and b/.git_disabled/objects/cb/d8118ad5554291e9f0177a607567c8bc84c03b differ diff --git a/.git_disabled/objects/cb/e0c2c8ff17cf10c7c3104d486e9960bc4e8208 b/.git_disabled/objects/cb/e0c2c8ff17cf10c7c3104d486e9960bc4e8208 new file mode 100755 index 0000000..fdfada0 Binary files /dev/null and b/.git_disabled/objects/cb/e0c2c8ff17cf10c7c3104d486e9960bc4e8208 differ diff --git a/.git_disabled/objects/cb/f0adbfe08b3ff44702089bcd7d4eb944d3bb83 b/.git_disabled/objects/cb/f0adbfe08b3ff44702089bcd7d4eb944d3bb83 new file mode 100755 index 0000000..2506b86 Binary files /dev/null and b/.git_disabled/objects/cb/f0adbfe08b3ff44702089bcd7d4eb944d3bb83 differ diff --git a/.git_disabled/objects/cb/f8e9523dd984c4bde573bef304cc51d6f32d95 b/.git_disabled/objects/cb/f8e9523dd984c4bde573bef304cc51d6f32d95 new file mode 100755 index 0000000..f5833b8 Binary files /dev/null and b/.git_disabled/objects/cb/f8e9523dd984c4bde573bef304cc51d6f32d95 differ diff --git a/.git_disabled/objects/cc/0458ed299c85baad5814a4c6bd470a29a6582c b/.git_disabled/objects/cc/0458ed299c85baad5814a4c6bd470a29a6582c new file mode 100755 index 0000000..d3619dd Binary files /dev/null and b/.git_disabled/objects/cc/0458ed299c85baad5814a4c6bd470a29a6582c differ diff --git a/.git_disabled/objects/cc/10c9de637b4aaff848ec3d9415bdd5658cb11b b/.git_disabled/objects/cc/10c9de637b4aaff848ec3d9415bdd5658cb11b new file mode 100755 index 0000000..24af52d Binary files /dev/null and b/.git_disabled/objects/cc/10c9de637b4aaff848ec3d9415bdd5658cb11b differ diff --git a/.git_disabled/objects/cc/1d3ba7da3191552d82e234546f3c225ece3ff4 b/.git_disabled/objects/cc/1d3ba7da3191552d82e234546f3c225ece3ff4 new file mode 100755 index 0000000..c1ced64 --- /dev/null +++ b/.git_disabled/objects/cc/1d3ba7da3191552d82e234546f3c225ece3ff4 @@ -0,0 +1,2 @@ +xM +0EL-HqpM\EMAE|Ӫx9|~`11 pM+T*q.D׸uUEnh>^4r[gٕeӀLKA \ No newline at end of file diff --git a/.git_disabled/objects/cc/4cf22e653aea052c05a68af1412a76342e0b35 b/.git_disabled/objects/cc/4cf22e653aea052c05a68af1412a76342e0b35 new file mode 100755 index 0000000..114aa2a Binary files /dev/null and b/.git_disabled/objects/cc/4cf22e653aea052c05a68af1412a76342e0b35 differ diff --git a/.git_disabled/objects/cc/4faff8da0d7606ab6d3c17858363517518d618 b/.git_disabled/objects/cc/4faff8da0d7606ab6d3c17858363517518d618 new file mode 100755 index 0000000..03f677b Binary files /dev/null and b/.git_disabled/objects/cc/4faff8da0d7606ab6d3c17858363517518d618 differ diff --git a/.git_disabled/objects/cc/5e846a8972bba4394ebc6565adb127b3f9e027 b/.git_disabled/objects/cc/5e846a8972bba4394ebc6565adb127b3f9e027 new file mode 100755 index 0000000..3c43bb8 --- /dev/null +++ b/.git_disabled/objects/cc/5e846a8972bba4394ebc6565adb127b3f9e027 @@ -0,0 +1 @@ +x+)JMU047f040075U00H1IIf)F)iI&)i&i&FfII g|ycɍE {:)6f%T2=MiA~낊s?u \ No newline at end of file diff --git a/.git_disabled/objects/cc/64477ed47633f6a1d9655512e187e18147315e b/.git_disabled/objects/cc/64477ed47633f6a1d9655512e187e18147315e new file mode 100755 index 0000000..dc03a12 Binary files /dev/null and b/.git_disabled/objects/cc/64477ed47633f6a1d9655512e187e18147315e differ diff --git a/.git_disabled/objects/cc/73e42af299a64f0b80362c7fe14c4e3911b1fd b/.git_disabled/objects/cc/73e42af299a64f0b80362c7fe14c4e3911b1fd new file mode 100755 index 0000000..18b269b Binary files /dev/null and b/.git_disabled/objects/cc/73e42af299a64f0b80362c7fe14c4e3911b1fd differ diff --git a/.git_disabled/objects/cc/7b8adaa8d34cbb5373a6c8801a89d2281141bc b/.git_disabled/objects/cc/7b8adaa8d34cbb5373a6c8801a89d2281141bc new file mode 100755 index 0000000..3da2ce6 Binary files /dev/null and b/.git_disabled/objects/cc/7b8adaa8d34cbb5373a6c8801a89d2281141bc differ diff --git a/.git_disabled/objects/cc/88cfaff0b25e999f310b8cdd2c2b6af97c3b58 b/.git_disabled/objects/cc/88cfaff0b25e999f310b8cdd2c2b6af97c3b58 new file mode 100755 index 0000000..53877ce Binary files /dev/null and b/.git_disabled/objects/cc/88cfaff0b25e999f310b8cdd2c2b6af97c3b58 differ diff --git a/.git_disabled/objects/cc/8af6d46492cb59c2947bfffae7db5088b42eef b/.git_disabled/objects/cc/8af6d46492cb59c2947bfffae7db5088b42eef new file mode 100755 index 0000000..369d2e4 Binary files /dev/null and b/.git_disabled/objects/cc/8af6d46492cb59c2947bfffae7db5088b42eef differ diff --git a/.git_disabled/objects/cc/8c9ed8e354a4b19739ebeaac0056aec9b41e2c b/.git_disabled/objects/cc/8c9ed8e354a4b19739ebeaac0056aec9b41e2c new file mode 100755 index 0000000..ad9359d Binary files /dev/null and b/.git_disabled/objects/cc/8c9ed8e354a4b19739ebeaac0056aec9b41e2c differ diff --git a/.git_disabled/objects/cc/9d92066e1680576846e46ccdf645a2b1dd5718 b/.git_disabled/objects/cc/9d92066e1680576846e46ccdf645a2b1dd5718 new file mode 100755 index 0000000..19e56c6 Binary files /dev/null and b/.git_disabled/objects/cc/9d92066e1680576846e46ccdf645a2b1dd5718 differ diff --git a/.git_disabled/objects/cc/a061a7914dcdb37b264a88101c2f76923884c5 b/.git_disabled/objects/cc/a061a7914dcdb37b264a88101c2f76923884c5 new file mode 100755 index 0000000..c9b371a Binary files /dev/null and b/.git_disabled/objects/cc/a061a7914dcdb37b264a88101c2f76923884c5 differ diff --git a/.git_disabled/objects/cc/b6cf64c14013e9a6b1709ed78d4aa980bda446 b/.git_disabled/objects/cc/b6cf64c14013e9a6b1709ed78d4aa980bda446 new file mode 100755 index 0000000..9f3daa0 Binary files /dev/null and b/.git_disabled/objects/cc/b6cf64c14013e9a6b1709ed78d4aa980bda446 differ diff --git a/.git_disabled/objects/cc/b8413b5243ab08eec0fdeaad8f1e247cc7e281 b/.git_disabled/objects/cc/b8413b5243ab08eec0fdeaad8f1e247cc7e281 new file mode 100755 index 0000000..47a1f08 Binary files /dev/null and b/.git_disabled/objects/cc/b8413b5243ab08eec0fdeaad8f1e247cc7e281 differ diff --git a/.git_disabled/objects/cc/b93a71bddf5a7b7aeecb711d056d914bd0fc51 b/.git_disabled/objects/cc/b93a71bddf5a7b7aeecb711d056d914bd0fc51 new file mode 100755 index 0000000..6c81206 Binary files /dev/null and b/.git_disabled/objects/cc/b93a71bddf5a7b7aeecb711d056d914bd0fc51 differ diff --git a/.git_disabled/objects/cc/c33a78f4a7917d9515464aa086a0f6668dc53e b/.git_disabled/objects/cc/c33a78f4a7917d9515464aa086a0f6668dc53e new file mode 100755 index 0000000..7c9d051 Binary files /dev/null and b/.git_disabled/objects/cc/c33a78f4a7917d9515464aa086a0f6668dc53e differ diff --git a/.git_disabled/objects/cc/c687d4e05ab88ad1f4c50eb146a0ef7e0c0695 b/.git_disabled/objects/cc/c687d4e05ab88ad1f4c50eb146a0ef7e0c0695 new file mode 100755 index 0000000..937019e Binary files /dev/null and b/.git_disabled/objects/cc/c687d4e05ab88ad1f4c50eb146a0ef7e0c0695 differ diff --git a/.git_disabled/objects/cc/ce87292fafb22e5bf48f014e322327882c2ab4 b/.git_disabled/objects/cc/ce87292fafb22e5bf48f014e322327882c2ab4 new file mode 100755 index 0000000..1d038ef Binary files /dev/null and b/.git_disabled/objects/cc/ce87292fafb22e5bf48f014e322327882c2ab4 differ diff --git a/.git_disabled/objects/cc/eb01fb7c07cfca165268734601e0562fc222c9 b/.git_disabled/objects/cc/eb01fb7c07cfca165268734601e0562fc222c9 new file mode 100755 index 0000000..71388a6 Binary files /dev/null and b/.git_disabled/objects/cc/eb01fb7c07cfca165268734601e0562fc222c9 differ diff --git a/.git_disabled/objects/cc/eb0818f9b1fb308e52dee3ea9b53bd50815fba b/.git_disabled/objects/cc/eb0818f9b1fb308e52dee3ea9b53bd50815fba new file mode 100755 index 0000000..6658477 Binary files /dev/null and b/.git_disabled/objects/cc/eb0818f9b1fb308e52dee3ea9b53bd50815fba differ diff --git a/.git_disabled/objects/cc/fc46872458225a943b4d72274fdc7f4bc86352 b/.git_disabled/objects/cc/fc46872458225a943b4d72274fdc7f4bc86352 new file mode 100755 index 0000000..ae9b4dd Binary files /dev/null and b/.git_disabled/objects/cc/fc46872458225a943b4d72274fdc7f4bc86352 differ diff --git a/.git_disabled/objects/cd/01e7be7faf48c30c03be35c707db22a2393ac2 b/.git_disabled/objects/cd/01e7be7faf48c30c03be35c707db22a2393ac2 new file mode 100755 index 0000000..2fbec98 Binary files /dev/null and b/.git_disabled/objects/cd/01e7be7faf48c30c03be35c707db22a2393ac2 differ diff --git a/.git_disabled/objects/cd/171d328906178be065cc5dfca5278ead22158b b/.git_disabled/objects/cd/171d328906178be065cc5dfca5278ead22158b new file mode 100755 index 0000000..bf1f99d --- /dev/null +++ b/.git_disabled/objects/cd/171d328906178be065cc5dfca5278ead22158b @@ -0,0 +1 @@ +xN0D9+N;cT!ҊSzQI\9X ˌFzKeZ1ɡUhq4(UdtRb !j'k,(:99,Vsih:@ ø\pB_DQv \ No newline at end of file diff --git a/.git_disabled/objects/cd/1b5b2f770a051ab5326157d5b89be2548c6c2d b/.git_disabled/objects/cd/1b5b2f770a051ab5326157d5b89be2548c6c2d new file mode 100755 index 0000000..0e74a90 Binary files /dev/null and b/.git_disabled/objects/cd/1b5b2f770a051ab5326157d5b89be2548c6c2d differ diff --git a/.git_disabled/objects/cd/221fbbab009893989f9c556ef03c8a8013d289 b/.git_disabled/objects/cd/221fbbab009893989f9c556ef03c8a8013d289 new file mode 100755 index 0000000..61eb13a Binary files /dev/null and b/.git_disabled/objects/cd/221fbbab009893989f9c556ef03c8a8013d289 differ diff --git a/.git_disabled/objects/cd/2b1db55690b7286378786341b4df8683ea522b b/.git_disabled/objects/cd/2b1db55690b7286378786341b4df8683ea522b new file mode 100755 index 0000000..e8db9e3 Binary files /dev/null and b/.git_disabled/objects/cd/2b1db55690b7286378786341b4df8683ea522b differ diff --git a/.git_disabled/objects/cd/35923c4434c0b55bf703c0298b1d7fdeb648bd b/.git_disabled/objects/cd/35923c4434c0b55bf703c0298b1d7fdeb648bd new file mode 100755 index 0000000..877380c Binary files /dev/null and b/.git_disabled/objects/cd/35923c4434c0b55bf703c0298b1d7fdeb648bd differ diff --git a/.git_disabled/objects/cd/3e087931e843b4fb822a2741f72bade0bc823a b/.git_disabled/objects/cd/3e087931e843b4fb822a2741f72bade0bc823a new file mode 100755 index 0000000..c365b57 Binary files /dev/null and b/.git_disabled/objects/cd/3e087931e843b4fb822a2741f72bade0bc823a differ diff --git a/.git_disabled/objects/cd/41b9ab2badf9b3cabf67ae7abea25b748bb781 b/.git_disabled/objects/cd/41b9ab2badf9b3cabf67ae7abea25b748bb781 new file mode 100755 index 0000000..aef0800 Binary files /dev/null and b/.git_disabled/objects/cd/41b9ab2badf9b3cabf67ae7abea25b748bb781 differ diff --git a/.git_disabled/objects/cd/4531910d54617fa2ff94a59caffb4cc61a1acf b/.git_disabled/objects/cd/4531910d54617fa2ff94a59caffb4cc61a1acf new file mode 100755 index 0000000..c40c76f Binary files /dev/null and b/.git_disabled/objects/cd/4531910d54617fa2ff94a59caffb4cc61a1acf differ diff --git a/.git_disabled/objects/cd/771187390f0fd30c74dd6153f8fb43f84c014d b/.git_disabled/objects/cd/771187390f0fd30c74dd6153f8fb43f84c014d new file mode 100755 index 0000000..fd6f88a --- /dev/null +++ b/.git_disabled/objects/cd/771187390f0fd30c74dd6153f8fb43f84c014d @@ -0,0 +1,2 @@ +x-[ +0E]w46614a RwvֲR&hZf )ӆDQ6[!Z<еR޼#jL®5{lCH{Uu_@ ܑu t i'!+y?eHOڧN: 8W,*kt[pj;蘍E| lqQ/y3Bә XV)Y R3FTB_RE v!Fg%$l8F"ڗ+nl(3n5G,nJ'sfW2GD!7^H6ZǃRVgRraV&e*} V- \ No newline at end of file diff --git a/.git_disabled/objects/ce/b3c08befb2ff4b601c90ca7e7e76c613730311 b/.git_disabled/objects/ce/b3c08befb2ff4b601c90ca7e7e76c613730311 new file mode 100755 index 0000000..3940957 Binary files /dev/null and b/.git_disabled/objects/ce/b3c08befb2ff4b601c90ca7e7e76c613730311 differ diff --git a/.git_disabled/objects/ce/bec19979ad6a771f85c832d3a74d21695202e3 b/.git_disabled/objects/ce/bec19979ad6a771f85c832d3a74d21695202e3 new file mode 100755 index 0000000..e12c413 Binary files /dev/null and b/.git_disabled/objects/ce/bec19979ad6a771f85c832d3a74d21695202e3 differ diff --git a/.git_disabled/objects/ce/c0450aa61bc72b6151e8c1a90a4021e8097f77 b/.git_disabled/objects/ce/c0450aa61bc72b6151e8c1a90a4021e8097f77 new file mode 100755 index 0000000..d3083dd Binary files /dev/null and b/.git_disabled/objects/ce/c0450aa61bc72b6151e8c1a90a4021e8097f77 differ diff --git a/.git_disabled/objects/ce/d45e2a8c86135c0c407063e113819f04ec8725 b/.git_disabled/objects/ce/d45e2a8c86135c0c407063e113819f04ec8725 new file mode 100755 index 0000000..dfd1042 Binary files /dev/null and b/.git_disabled/objects/ce/d45e2a8c86135c0c407063e113819f04ec8725 differ diff --git a/.git_disabled/objects/ce/dc2c584fed42f8bc942fda879092183b88fc4d b/.git_disabled/objects/ce/dc2c584fed42f8bc942fda879092183b88fc4d new file mode 100755 index 0000000..93dd1b5 Binary files /dev/null and b/.git_disabled/objects/ce/dc2c584fed42f8bc942fda879092183b88fc4d differ diff --git a/.git_disabled/objects/ce/f57994a16252ba6f74f753b51143f447f53b49 b/.git_disabled/objects/ce/f57994a16252ba6f74f753b51143f447f53b49 new file mode 100755 index 0000000..ebb26f9 --- /dev/null +++ b/.git_disabled/objects/ce/f57994a16252ba6f74f753b51143f447f53b49 @@ -0,0 +1 @@ +x}1O0+:ʗ^VJ,sd;8L}^7UJUօl@MKmUş>N^8:1#d{Yheuخ ^,/Nn~SpZLL>!X{[ڶ8^Xu"'9 0Wzo"?' Of? +;3+UЋj:^fu/clkm<=c=ڞfp3VaGa)wH{Q )rgdY vXYr)r`QAIxu$aC>Bn$h@k5 qHɂ&MDKا \ No newline at end of file diff --git a/.git_disabled/objects/cf/dc030a751b089fc7e38fc88093b791605d501d b/.git_disabled/objects/cf/dc030a751b089fc7e38fc88093b791605d501d new file mode 100755 index 0000000..e8c700b Binary files /dev/null and b/.git_disabled/objects/cf/dc030a751b089fc7e38fc88093b791605d501d differ diff --git a/.git_disabled/objects/cf/f4507dcf52fc0ebc24fd511d97881baa21a8cd b/.git_disabled/objects/cf/f4507dcf52fc0ebc24fd511d97881baa21a8cd new file mode 100755 index 0000000..8784324 Binary files /dev/null and b/.git_disabled/objects/cf/f4507dcf52fc0ebc24fd511d97881baa21a8cd differ diff --git a/.git_disabled/objects/cf/f9c2a5aa990779416c4d1bdaf64592d4a0bc10 b/.git_disabled/objects/cf/f9c2a5aa990779416c4d1bdaf64592d4a0bc10 new file mode 100755 index 0000000..3593b01 Binary files /dev/null and b/.git_disabled/objects/cf/f9c2a5aa990779416c4d1bdaf64592d4a0bc10 differ diff --git a/.git_disabled/objects/cf/fa4bb7db0f930f4db56653a061c4d7400ba4e6 b/.git_disabled/objects/cf/fa4bb7db0f930f4db56653a061c4d7400ba4e6 new file mode 100755 index 0000000..dbdf87f Binary files /dev/null and b/.git_disabled/objects/cf/fa4bb7db0f930f4db56653a061c4d7400ba4e6 differ diff --git a/.git_disabled/objects/cf/fbb4561f676d106b0d7c0d992c6367c4d5550b b/.git_disabled/objects/cf/fbb4561f676d106b0d7c0d992c6367c4d5550b new file mode 100755 index 0000000..3597b7a Binary files /dev/null and b/.git_disabled/objects/cf/fbb4561f676d106b0d7c0d992c6367c4d5550b differ diff --git a/.git_disabled/objects/d0/12727d4d5a2b215482ca84060d5b345f2daaad b/.git_disabled/objects/d0/12727d4d5a2b215482ca84060d5b345f2daaad new file mode 100755 index 0000000..7e49ed7 Binary files /dev/null and b/.git_disabled/objects/d0/12727d4d5a2b215482ca84060d5b345f2daaad differ diff --git a/.git_disabled/objects/d0/1823562ae7966794933fa8d1975028675f4d03 b/.git_disabled/objects/d0/1823562ae7966794933fa8d1975028675f4d03 new file mode 100755 index 0000000..2ebbae2 Binary files /dev/null and b/.git_disabled/objects/d0/1823562ae7966794933fa8d1975028675f4d03 differ diff --git a/.git_disabled/objects/d0/2a16e43426fb1c1bb286f1cda463cb9b1185ad b/.git_disabled/objects/d0/2a16e43426fb1c1bb286f1cda463cb9b1185ad new file mode 100755 index 0000000..bb19d9f Binary files /dev/null and b/.git_disabled/objects/d0/2a16e43426fb1c1bb286f1cda463cb9b1185ad differ diff --git a/.git_disabled/objects/d0/41693e84b112da08a9ce5fa6ead7ec1a6e1b11 b/.git_disabled/objects/d0/41693e84b112da08a9ce5fa6ead7ec1a6e1b11 new file mode 100755 index 0000000..0ac3f8b Binary files /dev/null and b/.git_disabled/objects/d0/41693e84b112da08a9ce5fa6ead7ec1a6e1b11 differ diff --git a/.git_disabled/objects/d0/824b8227cd4e0b0bf084d611fe04e64298c1fc b/.git_disabled/objects/d0/824b8227cd4e0b0bf084d611fe04e64298c1fc new file mode 100755 index 0000000..05f27c2 Binary files /dev/null and b/.git_disabled/objects/d0/824b8227cd4e0b0bf084d611fe04e64298c1fc differ diff --git a/.git_disabled/objects/d0/82a11448a84ddc64e137ba41df4ef783be745e b/.git_disabled/objects/d0/82a11448a84ddc64e137ba41df4ef783be745e new file mode 100755 index 0000000..beaa0f7 Binary files /dev/null and b/.git_disabled/objects/d0/82a11448a84ddc64e137ba41df4ef783be745e differ diff --git a/.git_disabled/objects/d0/8760b2d43098a909e4aa9759c043de6b6317a9 b/.git_disabled/objects/d0/8760b2d43098a909e4aa9759c043de6b6317a9 new file mode 100755 index 0000000..8ca2709 Binary files /dev/null and b/.git_disabled/objects/d0/8760b2d43098a909e4aa9759c043de6b6317a9 differ diff --git a/.git_disabled/objects/d0/a495d19f159e776d325673cf072c81d4ef9b5e b/.git_disabled/objects/d0/a495d19f159e776d325673cf072c81d4ef9b5e new file mode 100755 index 0000000..755bbdf Binary files /dev/null and b/.git_disabled/objects/d0/a495d19f159e776d325673cf072c81d4ef9b5e differ diff --git a/.git_disabled/objects/d0/a704ae05950dfae3a53627cdb9762c4ff71875 b/.git_disabled/objects/d0/a704ae05950dfae3a53627cdb9762c4ff71875 new file mode 100755 index 0000000..26650e7 Binary files /dev/null and b/.git_disabled/objects/d0/a704ae05950dfae3a53627cdb9762c4ff71875 differ diff --git a/.git_disabled/objects/d0/a915b1d64b1482ab916589be0647c5828faa26 b/.git_disabled/objects/d0/a915b1d64b1482ab916589be0647c5828faa26 new file mode 100755 index 0000000..0d49674 Binary files /dev/null and b/.git_disabled/objects/d0/a915b1d64b1482ab916589be0647c5828faa26 differ diff --git a/.git_disabled/objects/d0/b04709174c9c0eaf0bbd98b2defec0dd52f765 b/.git_disabled/objects/d0/b04709174c9c0eaf0bbd98b2defec0dd52f765 new file mode 100755 index 0000000..b417ece Binary files /dev/null and b/.git_disabled/objects/d0/b04709174c9c0eaf0bbd98b2defec0dd52f765 differ diff --git a/.git_disabled/objects/d0/d21a1635fdabf535381e28dab3ee973bb532e9 b/.git_disabled/objects/d0/d21a1635fdabf535381e28dab3ee973bb532e9 new file mode 100755 index 0000000..e17b094 Binary files /dev/null and b/.git_disabled/objects/d0/d21a1635fdabf535381e28dab3ee973bb532e9 differ diff --git a/.git_disabled/objects/d0/e11b16247145c1c2552387efbbc0be035285f2 b/.git_disabled/objects/d0/e11b16247145c1c2552387efbbc0be035285f2 new file mode 100755 index 0000000..fbd943c Binary files /dev/null and b/.git_disabled/objects/d0/e11b16247145c1c2552387efbbc0be035285f2 differ diff --git a/.git_disabled/objects/d0/eaffa4b3668b70e57a2cfdafafa4bd43df8eea b/.git_disabled/objects/d0/eaffa4b3668b70e57a2cfdafafa4bd43df8eea new file mode 100755 index 0000000..6f1c11a Binary files /dev/null and b/.git_disabled/objects/d0/eaffa4b3668b70e57a2cfdafafa4bd43df8eea differ diff --git a/.git_disabled/objects/d1/223ed8ffea373c56fd281cf10cd8add3c7bb91 b/.git_disabled/objects/d1/223ed8ffea373c56fd281cf10cd8add3c7bb91 new file mode 100755 index 0000000..4049b65 Binary files /dev/null and b/.git_disabled/objects/d1/223ed8ffea373c56fd281cf10cd8add3c7bb91 differ diff --git a/.git_disabled/objects/d1/2722ba29f9f859c19d8c900d2dab4233c18344 b/.git_disabled/objects/d1/2722ba29f9f859c19d8c900d2dab4233c18344 new file mode 100755 index 0000000..577efec Binary files /dev/null and b/.git_disabled/objects/d1/2722ba29f9f859c19d8c900d2dab4233c18344 differ diff --git a/.git_disabled/objects/d1/3303a2f4104da42141769e64ea06566fe8be12 b/.git_disabled/objects/d1/3303a2f4104da42141769e64ea06566fe8be12 new file mode 100755 index 0000000..e5385df Binary files /dev/null and b/.git_disabled/objects/d1/3303a2f4104da42141769e64ea06566fe8be12 differ diff --git a/.git_disabled/objects/d1/6f4bcc5ec6b936da5a662c11344370033a4d6a b/.git_disabled/objects/d1/6f4bcc5ec6b936da5a662c11344370033a4d6a new file mode 100755 index 0000000..538c86e Binary files /dev/null and b/.git_disabled/objects/d1/6f4bcc5ec6b936da5a662c11344370033a4d6a differ diff --git a/.git_disabled/objects/d1/78ccac145ee350555b9ce4d3d3929a90fa38f8 b/.git_disabled/objects/d1/78ccac145ee350555b9ce4d3d3929a90fa38f8 new file mode 100755 index 0000000..8ded2c0 Binary files /dev/null and b/.git_disabled/objects/d1/78ccac145ee350555b9ce4d3d3929a90fa38f8 differ diff --git a/.git_disabled/objects/d1/8737cec19817bce9aa8b98a0912287ae732c14 b/.git_disabled/objects/d1/8737cec19817bce9aa8b98a0912287ae732c14 new file mode 100755 index 0000000..e0a25b9 Binary files /dev/null and b/.git_disabled/objects/d1/8737cec19817bce9aa8b98a0912287ae732c14 differ diff --git a/.git_disabled/objects/d1/876620a5439f08fe72e7927c14ce283cb7cb80 b/.git_disabled/objects/d1/876620a5439f08fe72e7927c14ce283cb7cb80 new file mode 100755 index 0000000..e528995 Binary files /dev/null and b/.git_disabled/objects/d1/876620a5439f08fe72e7927c14ce283cb7cb80 differ diff --git a/.git_disabled/objects/d1/8aef1d4fe3a84818698230e7219a2ada70ac24 b/.git_disabled/objects/d1/8aef1d4fe3a84818698230e7219a2ada70ac24 new file mode 100755 index 0000000..94f2180 Binary files /dev/null and b/.git_disabled/objects/d1/8aef1d4fe3a84818698230e7219a2ada70ac24 differ diff --git a/.git_disabled/objects/d1/91115b2aeb67cab25bb8042ae58b2f10de76a3 b/.git_disabled/objects/d1/91115b2aeb67cab25bb8042ae58b2f10de76a3 new file mode 100755 index 0000000..a41fc5b --- /dev/null +++ b/.git_disabled/objects/d1/91115b2aeb67cab25bb8042ae58b2f10de76a3 @@ -0,0 +1,3 @@ +x]K +1D] .tP.WȄtGf&w]|9 +&2n1=g%)gF"jdBA%\^ yk]/Cn* Ʈ,$5k5jٵ"/GQ[ \ No newline at end of file diff --git a/.git_disabled/objects/d1/93f4e34770ba5d3e0cea811097c8399400e704 b/.git_disabled/objects/d1/93f4e34770ba5d3e0cea811097c8399400e704 new file mode 100755 index 0000000..88fff09 Binary files /dev/null and b/.git_disabled/objects/d1/93f4e34770ba5d3e0cea811097c8399400e704 differ diff --git a/.git_disabled/objects/d1/94b41fd09dc02d4f540ae6219b4311269d82db b/.git_disabled/objects/d1/94b41fd09dc02d4f540ae6219b4311269d82db new file mode 100755 index 0000000..5952d1d Binary files /dev/null and b/.git_disabled/objects/d1/94b41fd09dc02d4f540ae6219b4311269d82db differ diff --git a/.git_disabled/objects/d1/a4d71274ca902727f2fc77937ce752f9bda5fd b/.git_disabled/objects/d1/a4d71274ca902727f2fc77937ce752f9bda5fd new file mode 100755 index 0000000..00ce743 Binary files /dev/null and b/.git_disabled/objects/d1/a4d71274ca902727f2fc77937ce752f9bda5fd differ diff --git a/.git_disabled/objects/d1/ad5de7cd39c0908f777372c8e32a5551be09d6 b/.git_disabled/objects/d1/ad5de7cd39c0908f777372c8e32a5551be09d6 new file mode 100755 index 0000000..619e835 Binary files /dev/null and b/.git_disabled/objects/d1/ad5de7cd39c0908f777372c8e32a5551be09d6 differ diff --git a/.git_disabled/objects/d1/ba7dbd0f782cc235a0acb35c8bf941cbd961e9 b/.git_disabled/objects/d1/ba7dbd0f782cc235a0acb35c8bf941cbd961e9 new file mode 100755 index 0000000..6595525 Binary files /dev/null and b/.git_disabled/objects/d1/ba7dbd0f782cc235a0acb35c8bf941cbd961e9 differ diff --git a/.git_disabled/objects/d1/bc526a9775f95fa2c73b15fc2b3444f341ecd7 b/.git_disabled/objects/d1/bc526a9775f95fa2c73b15fc2b3444f341ecd7 new file mode 100755 index 0000000..6849f58 Binary files /dev/null and b/.git_disabled/objects/d1/bc526a9775f95fa2c73b15fc2b3444f341ecd7 differ diff --git a/.git_disabled/objects/d1/dd644bafbb93c54702d6ab37493fb4ec8eef5a b/.git_disabled/objects/d1/dd644bafbb93c54702d6ab37493fb4ec8eef5a new file mode 100755 index 0000000..32a2c04 Binary files /dev/null and b/.git_disabled/objects/d1/dd644bafbb93c54702d6ab37493fb4ec8eef5a differ diff --git a/.git_disabled/objects/d1/e6ab4f718a6f351ab95fa885976ccc99373734 b/.git_disabled/objects/d1/e6ab4f718a6f351ab95fa885976ccc99373734 new file mode 100755 index 0000000..240c201 Binary files /dev/null and b/.git_disabled/objects/d1/e6ab4f718a6f351ab95fa885976ccc99373734 differ diff --git a/.git_disabled/objects/d1/f0ed8bac640989a65c8d5bfe72ebaff3d9922f b/.git_disabled/objects/d1/f0ed8bac640989a65c8d5bfe72ebaff3d9922f new file mode 100755 index 0000000..0d54e3b Binary files /dev/null and b/.git_disabled/objects/d1/f0ed8bac640989a65c8d5bfe72ebaff3d9922f differ diff --git a/.git_disabled/objects/d2/02a64390f14e62b2d6861c56b0023c29957536 b/.git_disabled/objects/d2/02a64390f14e62b2d6861c56b0023c29957536 new file mode 100755 index 0000000..796912e --- /dev/null +++ b/.git_disabled/objects/d2/02a64390f14e62b2d6861c56b0023c29957536 @@ -0,0 +1 @@ +xm=O0+NRʂTR uIŪGi@wQ*'kia;8H;x02*`Gϻh/1# u{fC]ںo=N3M/EvС@զt8JI(r;þ8ҏ@cAI@t>hIڻH?p!՜: <2cwdsFi1cNAO2LemOsab@)%â;BZܗє f\Tgbɝ"~E \ No newline at end of file diff --git a/.git_disabled/objects/d2/04a34b704c44f251de67c001647ee55afa786f b/.git_disabled/objects/d2/04a34b704c44f251de67c001647ee55afa786f new file mode 100755 index 0000000..a169b35 Binary files /dev/null and b/.git_disabled/objects/d2/04a34b704c44f251de67c001647ee55afa786f differ diff --git a/.git_disabled/objects/d2/062e7fe1d9a88aff44de23356161646815c3c6 b/.git_disabled/objects/d2/062e7fe1d9a88aff44de23356161646815c3c6 new file mode 100755 index 0000000..a9a7f1c Binary files /dev/null and b/.git_disabled/objects/d2/062e7fe1d9a88aff44de23356161646815c3c6 differ diff --git a/.git_disabled/objects/d2/0c85cda2b7009ef53766fa75efb15b5f346788 b/.git_disabled/objects/d2/0c85cda2b7009ef53766fa75efb15b5f346788 new file mode 100755 index 0000000..db4689f --- /dev/null +++ b/.git_disabled/objects/d2/0c85cda2b7009ef53766fa75efb15b5f346788 @@ -0,0 +1 @@ +xMOk0wxcra+I0FzeEQ-v=Jobk#`ϣ{^eZ\ZYr,^|`ɲPQո_.dշ9`ɳÕX@ 4JYJ30BRu9C m#xmq+LZl'q9"wM^᷋. b 18~a/d;-C88"l,8G5 {!߯g Pdays=[̗gn4 CMck*=FPe~|8+ \ No newline at end of file diff --git a/.git_disabled/objects/d2/1228229e98497e9a144b7960fb596459b9c08a b/.git_disabled/objects/d2/1228229e98497e9a144b7960fb596459b9c08a new file mode 100755 index 0000000..8dfd762 --- /dev/null +++ b/.git_disabled/objects/d2/1228229e98497e9a144b7960fb596459b9c08a @@ -0,0 +1,2 @@ +xVj@ٯrRh&z(kK"+HYF]-}7bmJ[k$ü&Y3p\9Ĺ5m:f۹k"6\D8 \L ٚmJyH p%BXp\'FIW睆c exœ DOpiϩ(lR@*)1Li&\⛩0zIHDv +T@wx{2Ù hx&RPPA\KLX}e&QHS- 鏺3u?l9HjVS'^"g7.g?׭,$1 gr&Jj0Q>Y]VB҈t"ײ]Ϥ07?\u*->% ȯ3W \ No newline at end of file diff --git a/.git_disabled/objects/d2/14cb926e3a1a000df607dae34e8650e60e1eac b/.git_disabled/objects/d2/14cb926e3a1a000df607dae34e8650e60e1eac new file mode 100755 index 0000000..cad25b9 Binary files /dev/null and b/.git_disabled/objects/d2/14cb926e3a1a000df607dae34e8650e60e1eac differ diff --git a/.git_disabled/objects/d2/2135a912c94c1b01110773d8f445323e909743 b/.git_disabled/objects/d2/2135a912c94c1b01110773d8f445323e909743 new file mode 100755 index 0000000..24a1dde Binary files /dev/null and b/.git_disabled/objects/d2/2135a912c94c1b01110773d8f445323e909743 differ diff --git a/.git_disabled/objects/d2/3c5a5a27878561b79551da9513cf600dce5005 b/.git_disabled/objects/d2/3c5a5a27878561b79551da9513cf600dce5005 new file mode 100755 index 0000000..be8c715 Binary files /dev/null and b/.git_disabled/objects/d2/3c5a5a27878561b79551da9513cf600dce5005 differ diff --git a/.git_disabled/objects/d2/56fc05c9e95e88cd07832e0444ae6abe73c109 b/.git_disabled/objects/d2/56fc05c9e95e88cd07832e0444ae6abe73c109 new file mode 100755 index 0000000..c4fccb2 Binary files /dev/null and b/.git_disabled/objects/d2/56fc05c9e95e88cd07832e0444ae6abe73c109 differ diff --git a/.git_disabled/objects/d2/6140315796f4a3c5e62fee8cb952041bbb1a94 b/.git_disabled/objects/d2/6140315796f4a3c5e62fee8cb952041bbb1a94 new file mode 100755 index 0000000..fac5347 Binary files /dev/null and b/.git_disabled/objects/d2/6140315796f4a3c5e62fee8cb952041bbb1a94 differ diff --git a/.git_disabled/objects/d2/70e6708bca53268bf0906272a4a52d6030a72d b/.git_disabled/objects/d2/70e6708bca53268bf0906272a4a52d6030a72d new file mode 100755 index 0000000..409b7a1 Binary files /dev/null and b/.git_disabled/objects/d2/70e6708bca53268bf0906272a4a52d6030a72d differ diff --git a/.git_disabled/objects/d2/7a0a4999e94452e4bb2c7e47f88a95125f6e0a b/.git_disabled/objects/d2/7a0a4999e94452e4bb2c7e47f88a95125f6e0a new file mode 100755 index 0000000..72a32a8 Binary files /dev/null and b/.git_disabled/objects/d2/7a0a4999e94452e4bb2c7e47f88a95125f6e0a differ diff --git a/.git_disabled/objects/d2/7c133c27e29968181d78cb6a6b9cc660cdac07 b/.git_disabled/objects/d2/7c133c27e29968181d78cb6a6b9cc660cdac07 new file mode 100755 index 0000000..9fba014 Binary files /dev/null and b/.git_disabled/objects/d2/7c133c27e29968181d78cb6a6b9cc660cdac07 differ diff --git a/.git_disabled/objects/d2/80cc9cf011b0fd1e20b1b63f422ba23db44f15 b/.git_disabled/objects/d2/80cc9cf011b0fd1e20b1b63f422ba23db44f15 new file mode 100755 index 0000000..d3407b0 Binary files /dev/null and b/.git_disabled/objects/d2/80cc9cf011b0fd1e20b1b63f422ba23db44f15 differ diff --git a/.git_disabled/objects/d2/b8c4b69e2ceccbb2ec16cfa836dc511f91f4ea b/.git_disabled/objects/d2/b8c4b69e2ceccbb2ec16cfa836dc511f91f4ea new file mode 100755 index 0000000..52c5625 Binary files /dev/null and b/.git_disabled/objects/d2/b8c4b69e2ceccbb2ec16cfa836dc511f91f4ea differ diff --git a/.git_disabled/objects/d2/cd30b224fa93fafe7f30fb19c91e1b7da4305c b/.git_disabled/objects/d2/cd30b224fa93fafe7f30fb19c91e1b7da4305c new file mode 100755 index 0000000..be13065 Binary files /dev/null and b/.git_disabled/objects/d2/cd30b224fa93fafe7f30fb19c91e1b7da4305c differ diff --git a/.git_disabled/objects/d2/d28f508055c77c912f46c016b8c6a2c168d671 b/.git_disabled/objects/d2/d28f508055c77c912f46c016b8c6a2c168d671 new file mode 100755 index 0000000..049aea1 Binary files /dev/null and b/.git_disabled/objects/d2/d28f508055c77c912f46c016b8c6a2c168d671 differ diff --git a/.git_disabled/objects/d2/dbe7d38467304b16d6a630103d891c60122911 b/.git_disabled/objects/d2/dbe7d38467304b16d6a630103d891c60122911 new file mode 100755 index 0000000..c98e336 Binary files /dev/null and b/.git_disabled/objects/d2/dbe7d38467304b16d6a630103d891c60122911 differ diff --git a/.git_disabled/objects/d2/e5944483f5afb1b91a18d0b0ec16253e9af92a b/.git_disabled/objects/d2/e5944483f5afb1b91a18d0b0ec16253e9af92a new file mode 100755 index 0000000..a6bd58f Binary files /dev/null and b/.git_disabled/objects/d2/e5944483f5afb1b91a18d0b0ec16253e9af92a differ diff --git a/.git_disabled/objects/d2/e9768fa64ba1c8e56fcf7fd37147384ecf0b42 b/.git_disabled/objects/d2/e9768fa64ba1c8e56fcf7fd37147384ecf0b42 new file mode 100755 index 0000000..8a82a0f Binary files /dev/null and b/.git_disabled/objects/d2/e9768fa64ba1c8e56fcf7fd37147384ecf0b42 differ diff --git a/.git_disabled/objects/d2/f615ec3b62e3db6f66c7e81292575eb5db81f3 b/.git_disabled/objects/d2/f615ec3b62e3db6f66c7e81292575eb5db81f3 new file mode 100755 index 0000000..7c8f6b1 Binary files /dev/null and b/.git_disabled/objects/d2/f615ec3b62e3db6f66c7e81292575eb5db81f3 differ diff --git a/.git_disabled/objects/d3/0c38b6a018040ebef0d0197766281d45d59e05 b/.git_disabled/objects/d3/0c38b6a018040ebef0d0197766281d45d59e05 new file mode 100755 index 0000000..4efd7cd --- /dev/null +++ b/.git_disabled/objects/d3/0c38b6a018040ebef0d0197766281d45d59e05 @@ -0,0 +1,2 @@ +xn@ ;),DHCHT!T H|KC> ^wGȋ2l>^~ j^j_UUr( +u % _\@ri>QQa<l,iF}Ae7ȷݑdy;b9ym6WtUs8VW!,bGqglQeP.?D6u?g nu \ No newline at end of file diff --git a/.git_disabled/objects/d3/2099010e22c7f38d8e361e344de1924fb9465a b/.git_disabled/objects/d3/2099010e22c7f38d8e361e344de1924fb9465a new file mode 100755 index 0000000..6957757 Binary files /dev/null and b/.git_disabled/objects/d3/2099010e22c7f38d8e361e344de1924fb9465a differ diff --git a/.git_disabled/objects/d3/21807807b47335b8a2e72891ff1e2dcb3e9770 b/.git_disabled/objects/d3/21807807b47335b8a2e72891ff1e2dcb3e9770 new file mode 100755 index 0000000..ea092ff Binary files /dev/null and b/.git_disabled/objects/d3/21807807b47335b8a2e72891ff1e2dcb3e9770 differ diff --git a/.git_disabled/objects/d3/28b12dbe2d5c8a2ef392b952744ff6f9679bbb b/.git_disabled/objects/d3/28b12dbe2d5c8a2ef392b952744ff6f9679bbb new file mode 100755 index 0000000..3e9b409 Binary files /dev/null and b/.git_disabled/objects/d3/28b12dbe2d5c8a2ef392b952744ff6f9679bbb differ diff --git a/.git_disabled/objects/d3/4d01754aa44820b98163ab86316e3830a5c996 b/.git_disabled/objects/d3/4d01754aa44820b98163ab86316e3830a5c996 new file mode 100755 index 0000000..82e9a3e Binary files /dev/null and b/.git_disabled/objects/d3/4d01754aa44820b98163ab86316e3830a5c996 differ diff --git a/.git_disabled/objects/d3/54709ee7369ecbbcf08f2c245cff50bb434f4b b/.git_disabled/objects/d3/54709ee7369ecbbcf08f2c245cff50bb434f4b new file mode 100755 index 0000000..e0d0d41 Binary files /dev/null and b/.git_disabled/objects/d3/54709ee7369ecbbcf08f2c245cff50bb434f4b differ diff --git a/.git_disabled/objects/d3/6585ec2b97d3f4c2cf51b7995979aded053040 b/.git_disabled/objects/d3/6585ec2b97d3f4c2cf51b7995979aded053040 new file mode 100755 index 0000000..0a82068 Binary files /dev/null and b/.git_disabled/objects/d3/6585ec2b97d3f4c2cf51b7995979aded053040 differ diff --git a/.git_disabled/objects/d3/6a7eaeed4e9444a25bf31fc92a5e04880f6070 b/.git_disabled/objects/d3/6a7eaeed4e9444a25bf31fc92a5e04880f6070 new file mode 100755 index 0000000..6bbe405 Binary files /dev/null and b/.git_disabled/objects/d3/6a7eaeed4e9444a25bf31fc92a5e04880f6070 differ diff --git a/.git_disabled/objects/d3/72fff09e19d2ea9d10d4478d87650f4ddff214 b/.git_disabled/objects/d3/72fff09e19d2ea9d10d4478d87650f4ddff214 new file mode 100755 index 0000000..63e4e6f Binary files /dev/null and b/.git_disabled/objects/d3/72fff09e19d2ea9d10d4478d87650f4ddff214 differ diff --git a/.git_disabled/objects/d3/875e78fd9764639b77346ab8fb98a0bdf3f600 b/.git_disabled/objects/d3/875e78fd9764639b77346ab8fb98a0bdf3f600 new file mode 100755 index 0000000..86275e3 --- /dev/null +++ b/.git_disabled/objects/d3/875e78fd9764639b77346ab8fb98a0bdf3f600 @@ -0,0 +1,3 @@ +x09)FCS)J +TXj ','V;j71z'= n~1d[]@g4΄`q*mTB0$H\2oʨ,e0TA-W2.V"_b^J[Y"omRgV4\!ŵEA$W*d-1$b&NkKTa4~W*i9+ Qk>4nk`vݯJ vZ+ X @B` < s]cXamA \x O{Tkrx?R;4gCh~؆:| +# 6^Y.` Jjzjl*OK1t<{7Ƴt*ۦJ$<pp+!jTu5U7.ze |$,狏;@80dopѐPQs{Mrp{T©s|2Y )lS'pN+a7Wn5 \ No newline at end of file diff --git a/.git_disabled/objects/d3/88044f81ca2683038242cb49ff4184257f8f3f b/.git_disabled/objects/d3/88044f81ca2683038242cb49ff4184257f8f3f new file mode 100755 index 0000000..bd1c273 Binary files /dev/null and b/.git_disabled/objects/d3/88044f81ca2683038242cb49ff4184257f8f3f differ diff --git a/.git_disabled/objects/d3/8f1bfd18499e866adc7448efd12d28e8b208bf b/.git_disabled/objects/d3/8f1bfd18499e866adc7448efd12d28e8b208bf new file mode 100755 index 0000000..5643ca5 Binary files /dev/null and b/.git_disabled/objects/d3/8f1bfd18499e866adc7448efd12d28e8b208bf differ diff --git a/.git_disabled/objects/d3/a5607df31c2dd0d7713bc36da76c0b3444cfad b/.git_disabled/objects/d3/a5607df31c2dd0d7713bc36da76c0b3444cfad new file mode 100755 index 0000000..a1c01fc Binary files /dev/null and b/.git_disabled/objects/d3/a5607df31c2dd0d7713bc36da76c0b3444cfad differ diff --git a/.git_disabled/objects/d3/a8d152ce11f6f148577e55adfb18c17d46530c b/.git_disabled/objects/d3/a8d152ce11f6f148577e55adfb18c17d46530c new file mode 100755 index 0000000..e8d952e Binary files /dev/null and b/.git_disabled/objects/d3/a8d152ce11f6f148577e55adfb18c17d46530c differ diff --git a/.git_disabled/objects/d3/b509a2b4119c47ad86af9fc1b400ce2eb09cf1 b/.git_disabled/objects/d3/b509a2b4119c47ad86af9fc1b400ce2eb09cf1 new file mode 100755 index 0000000..9a466c5 Binary files /dev/null and b/.git_disabled/objects/d3/b509a2b4119c47ad86af9fc1b400ce2eb09cf1 differ diff --git a/.git_disabled/objects/d3/bb8ca34441955086c902160632acd0302490d5 b/.git_disabled/objects/d3/bb8ca34441955086c902160632acd0302490d5 new file mode 100755 index 0000000..638a8f8 Binary files /dev/null and b/.git_disabled/objects/d3/bb8ca34441955086c902160632acd0302490d5 differ diff --git a/.git_disabled/objects/d3/c07456db5fe5dc5694ee0daf8990582f27e683 b/.git_disabled/objects/d3/c07456db5fe5dc5694ee0daf8990582f27e683 new file mode 100755 index 0000000..2f34b28 Binary files /dev/null and b/.git_disabled/objects/d3/c07456db5fe5dc5694ee0daf8990582f27e683 differ diff --git a/.git_disabled/objects/d3/ce60d69be1247d0c87c4c361c5bdde0e11f3c2 b/.git_disabled/objects/d3/ce60d69be1247d0c87c4c361c5bdde0e11f3c2 new file mode 100755 index 0000000..2a8cc10 Binary files /dev/null and b/.git_disabled/objects/d3/ce60d69be1247d0c87c4c361c5bdde0e11f3c2 differ diff --git a/.git_disabled/objects/d3/d575f74a3daa5949fb56c3020d2967164647d1 b/.git_disabled/objects/d3/d575f74a3daa5949fb56c3020d2967164647d1 new file mode 100755 index 0000000..141857e Binary files /dev/null and b/.git_disabled/objects/d3/d575f74a3daa5949fb56c3020d2967164647d1 differ diff --git a/.git_disabled/objects/d3/ef2fe3e73cf9a88e319635b9f553dddb5c5b94 b/.git_disabled/objects/d3/ef2fe3e73cf9a88e319635b9f553dddb5c5b94 new file mode 100755 index 0000000..d392394 Binary files /dev/null and b/.git_disabled/objects/d3/ef2fe3e73cf9a88e319635b9f553dddb5c5b94 differ diff --git a/.git_disabled/objects/d4/046236a709ee3f663419e5979eeb28ea4f9060 b/.git_disabled/objects/d4/046236a709ee3f663419e5979eeb28ea4f9060 new file mode 100755 index 0000000..d6f1bee Binary files /dev/null and b/.git_disabled/objects/d4/046236a709ee3f663419e5979eeb28ea4f9060 differ diff --git a/.git_disabled/objects/d4/11a383570809a63ecfb0f7e3aad960f5395367 b/.git_disabled/objects/d4/11a383570809a63ecfb0f7e3aad960f5395367 new file mode 100755 index 0000000..759621a Binary files /dev/null and b/.git_disabled/objects/d4/11a383570809a63ecfb0f7e3aad960f5395367 differ diff --git a/.git_disabled/objects/d4/22ad8c3d930e04da4159ffaa3e8ed1e59aea6d b/.git_disabled/objects/d4/22ad8c3d930e04da4159ffaa3e8ed1e59aea6d new file mode 100755 index 0000000..17a7206 Binary files /dev/null and b/.git_disabled/objects/d4/22ad8c3d930e04da4159ffaa3e8ed1e59aea6d differ diff --git a/.git_disabled/objects/d4/39acf9a9229fd186c27642ea91f31c592c367f b/.git_disabled/objects/d4/39acf9a9229fd186c27642ea91f31c592c367f new file mode 100755 index 0000000..0c0cf1b Binary files /dev/null and b/.git_disabled/objects/d4/39acf9a9229fd186c27642ea91f31c592c367f differ diff --git a/.git_disabled/objects/d4/3a41eb57a627f42d32c2f47afb952a1780e81e b/.git_disabled/objects/d4/3a41eb57a627f42d32c2f47afb952a1780e81e new file mode 100755 index 0000000..d85b817 Binary files /dev/null and b/.git_disabled/objects/d4/3a41eb57a627f42d32c2f47afb952a1780e81e differ diff --git a/.git_disabled/objects/d4/422c2bb19f1cbffdd99be30b76bff153366bcd b/.git_disabled/objects/d4/422c2bb19f1cbffdd99be30b76bff153366bcd new file mode 100755 index 0000000..54aa9fa Binary files /dev/null and b/.git_disabled/objects/d4/422c2bb19f1cbffdd99be30b76bff153366bcd differ diff --git a/.git_disabled/objects/d4/4831e986821165aede18dd8c65244c297c4527 b/.git_disabled/objects/d4/4831e986821165aede18dd8c65244c297c4527 new file mode 100755 index 0000000..f8b69f4 Binary files /dev/null and b/.git_disabled/objects/d4/4831e986821165aede18dd8c65244c297c4527 differ diff --git a/.git_disabled/objects/d4/569ba4e6ffd785e80061a824973eaac7981524 b/.git_disabled/objects/d4/569ba4e6ffd785e80061a824973eaac7981524 new file mode 100755 index 0000000..98e8ec3 Binary files /dev/null and b/.git_disabled/objects/d4/569ba4e6ffd785e80061a824973eaac7981524 differ diff --git a/.git_disabled/objects/d4/5e6e0a4c9b7788ea29283fe65c3e7ab80ef393 b/.git_disabled/objects/d4/5e6e0a4c9b7788ea29283fe65c3e7ab80ef393 new file mode 100755 index 0000000..8f90f37 Binary files /dev/null and b/.git_disabled/objects/d4/5e6e0a4c9b7788ea29283fe65c3e7ab80ef393 differ diff --git a/.git_disabled/objects/d4/61c8436d7c135f10ff0212246a7d47304af805 b/.git_disabled/objects/d4/61c8436d7c135f10ff0212246a7d47304af805 new file mode 100755 index 0000000..d0a07ad Binary files /dev/null and b/.git_disabled/objects/d4/61c8436d7c135f10ff0212246a7d47304af805 differ diff --git a/.git_disabled/objects/d4/630540e9681401e70cb5d1e9fb65e594c06946 b/.git_disabled/objects/d4/630540e9681401e70cb5d1e9fb65e594c06946 new file mode 100755 index 0000000..9b25cd1 Binary files /dev/null and b/.git_disabled/objects/d4/630540e9681401e70cb5d1e9fb65e594c06946 differ diff --git a/.git_disabled/objects/d4/701105fb8f88820b174832db34da5b7c309a0c b/.git_disabled/objects/d4/701105fb8f88820b174832db34da5b7c309a0c new file mode 100755 index 0000000..ba9f763 Binary files /dev/null and b/.git_disabled/objects/d4/701105fb8f88820b174832db34da5b7c309a0c differ diff --git a/.git_disabled/objects/d4/8bfc4237050693fac4964ed4fadf4e0798c8ad b/.git_disabled/objects/d4/8bfc4237050693fac4964ed4fadf4e0798c8ad new file mode 100755 index 0000000..883f05c Binary files /dev/null and b/.git_disabled/objects/d4/8bfc4237050693fac4964ed4fadf4e0798c8ad differ diff --git a/.git_disabled/objects/d4/a5b23a09cb549260e5ce4221b20a1aee1e809e b/.git_disabled/objects/d4/a5b23a09cb549260e5ce4221b20a1aee1e809e new file mode 100755 index 0000000..6536e5b Binary files /dev/null and b/.git_disabled/objects/d4/a5b23a09cb549260e5ce4221b20a1aee1e809e differ diff --git a/.git_disabled/objects/d4/a66b761314f37386ea0e3766f63b02cc19fdb3 b/.git_disabled/objects/d4/a66b761314f37386ea0e3766f63b02cc19fdb3 new file mode 100755 index 0000000..d3ea918 Binary files /dev/null and b/.git_disabled/objects/d4/a66b761314f37386ea0e3766f63b02cc19fdb3 differ diff --git a/.git_disabled/objects/d4/af932bd58e23f40251ca3e2ed4db2b26426d2a b/.git_disabled/objects/d4/af932bd58e23f40251ca3e2ed4db2b26426d2a new file mode 100755 index 0000000..338eae3 Binary files /dev/null and b/.git_disabled/objects/d4/af932bd58e23f40251ca3e2ed4db2b26426d2a differ diff --git a/.git_disabled/objects/d4/c21efeb4894a5a9c4df54c87d9bf34da7019e9 b/.git_disabled/objects/d4/c21efeb4894a5a9c4df54c87d9bf34da7019e9 new file mode 100755 index 0000000..e2dec4e Binary files /dev/null and b/.git_disabled/objects/d4/c21efeb4894a5a9c4df54c87d9bf34da7019e9 differ diff --git a/.git_disabled/objects/d4/c601c4147d87e3e98850218b378aabb1563b00 b/.git_disabled/objects/d4/c601c4147d87e3e98850218b378aabb1563b00 new file mode 100755 index 0000000..f6642d7 Binary files /dev/null and b/.git_disabled/objects/d4/c601c4147d87e3e98850218b378aabb1563b00 differ diff --git a/.git_disabled/objects/d4/d3b95078300096c0ee9687bce00871d540ee41 b/.git_disabled/objects/d4/d3b95078300096c0ee9687bce00871d540ee41 new file mode 100755 index 0000000..53bea22 Binary files /dev/null and b/.git_disabled/objects/d4/d3b95078300096c0ee9687bce00871d540ee41 differ diff --git a/.git_disabled/objects/d4/f18a63c172a8cc7da4a454c5a31dca048d2e61 b/.git_disabled/objects/d4/f18a63c172a8cc7da4a454c5a31dca048d2e61 new file mode 100755 index 0000000..cf57e6b Binary files /dev/null and b/.git_disabled/objects/d4/f18a63c172a8cc7da4a454c5a31dca048d2e61 differ diff --git a/.git_disabled/objects/d4/f59c4058b1b7e9c35d12ef8eddac0a5d4fd569 b/.git_disabled/objects/d4/f59c4058b1b7e9c35d12ef8eddac0a5d4fd569 new file mode 100755 index 0000000..e204ab0 Binary files /dev/null and b/.git_disabled/objects/d4/f59c4058b1b7e9c35d12ef8eddac0a5d4fd569 differ diff --git a/.git_disabled/objects/d5/02974b91fa8eb6ed5154bb53c39e77898b1270 b/.git_disabled/objects/d5/02974b91fa8eb6ed5154bb53c39e77898b1270 new file mode 100755 index 0000000..a6aed89 Binary files /dev/null and b/.git_disabled/objects/d5/02974b91fa8eb6ed5154bb53c39e77898b1270 differ diff --git a/.git_disabled/objects/d5/0761968b338337f61f4b4f0aa892ea40ee0368 b/.git_disabled/objects/d5/0761968b338337f61f4b4f0aa892ea40ee0368 new file mode 100755 index 0000000..2c5a115 Binary files /dev/null and b/.git_disabled/objects/d5/0761968b338337f61f4b4f0aa892ea40ee0368 differ diff --git a/.git_disabled/objects/d5/11af568a7896324575721f7d78323b0a9c01a1 b/.git_disabled/objects/d5/11af568a7896324575721f7d78323b0a9c01a1 new file mode 100755 index 0000000..645a7f0 Binary files /dev/null and b/.git_disabled/objects/d5/11af568a7896324575721f7d78323b0a9c01a1 differ diff --git a/.git_disabled/objects/d5/156dbf1eafd0dfd75053d0641ac72105b9348f b/.git_disabled/objects/d5/156dbf1eafd0dfd75053d0641ac72105b9348f new file mode 100755 index 0000000..c668d7a Binary files /dev/null and b/.git_disabled/objects/d5/156dbf1eafd0dfd75053d0641ac72105b9348f differ diff --git a/.git_disabled/objects/d5/205b0805d0a917f89c40c5196c1f44ed763597 b/.git_disabled/objects/d5/205b0805d0a917f89c40c5196c1f44ed763597 new file mode 100755 index 0000000..a3a7c94 Binary files /dev/null and b/.git_disabled/objects/d5/205b0805d0a917f89c40c5196c1f44ed763597 differ diff --git a/.git_disabled/objects/d5/49b8ef9ce1a1448de27f31870fe479d8ff5c53 b/.git_disabled/objects/d5/49b8ef9ce1a1448de27f31870fe479d8ff5c53 new file mode 100755 index 0000000..2649028 Binary files /dev/null and b/.git_disabled/objects/d5/49b8ef9ce1a1448de27f31870fe479d8ff5c53 differ diff --git a/.git_disabled/objects/d5/4f145c58ee42c78c10f73ea0de819b21a3dc5c b/.git_disabled/objects/d5/4f145c58ee42c78c10f73ea0de819b21a3dc5c new file mode 100755 index 0000000..ab5132d Binary files /dev/null and b/.git_disabled/objects/d5/4f145c58ee42c78c10f73ea0de819b21a3dc5c differ diff --git a/.git_disabled/objects/d5/5cdcfd477b354b52e56b4c48722650f74302f2 b/.git_disabled/objects/d5/5cdcfd477b354b52e56b4c48722650f74302f2 new file mode 100755 index 0000000..9b3c17f Binary files /dev/null and b/.git_disabled/objects/d5/5cdcfd477b354b52e56b4c48722650f74302f2 differ diff --git a/.git_disabled/objects/d5/5db522fc0bebe1b4e7b2830cf864252c9edfd3 b/.git_disabled/objects/d5/5db522fc0bebe1b4e7b2830cf864252c9edfd3 new file mode 100755 index 0000000..f783b97 Binary files /dev/null and b/.git_disabled/objects/d5/5db522fc0bebe1b4e7b2830cf864252c9edfd3 differ diff --git a/.git_disabled/objects/d5/60ce3f1fa45a7ee4a3bc8958aa59702caa9d0c b/.git_disabled/objects/d5/60ce3f1fa45a7ee4a3bc8958aa59702caa9d0c new file mode 100755 index 0000000..2bdf610 --- /dev/null +++ b/.git_disabled/objects/d5/60ce3f1fa45a7ee4a3bc8958aa59702caa9d0c @@ -0,0 +1,6 @@ +xV0홯K"zJ=dwjU%Ro$qcldү$y3xl\O_H +S("²\*CPäAPń0\ʼ R$w49H դk7$Z*#je5@CUMKB@b }y+e^W??PCfc: &Mqi&I6%zV:7(6fOLl Q@3OrwekiIש Rzn$H8t|{^ZjoDyWA<} vrub귍Ƽ:=~7E(:1qo=VXd_ӻovl V&Fxΐ}v%9Z[oEVzmn[dtVk"?5#Kr7)zrm n"ΕlcP}ng4~(Y65&C8uV 0qlfg4w W[A3 + FUI"qfJgcy8( +?'%WIMe@wOs˘qe "ev̲“ n-W{ B!{h~Š,`5({*Dc6,;EC@ڬcRBMGzݭIhI Jpvį I D&ش3=B`$^)/80KN^ +Ƈת@gèeMYEe2-8N P~c\PQ28 ݲz*A + ]U \ No newline at end of file diff --git a/.git_disabled/objects/d5/6746508fb0a715ac68a1c088eb91eba8ebfef3 b/.git_disabled/objects/d5/6746508fb0a715ac68a1c088eb91eba8ebfef3 new file mode 100755 index 0000000..c0d44d6 Binary files /dev/null and b/.git_disabled/objects/d5/6746508fb0a715ac68a1c088eb91eba8ebfef3 differ diff --git a/.git_disabled/objects/d5/74d3297db422057a451c085919942d3645f1f2 b/.git_disabled/objects/d5/74d3297db422057a451c085919942d3645f1f2 new file mode 100755 index 0000000..30754ba --- /dev/null +++ b/.git_disabled/objects/d5/74d3297db422057a451c085919942d3645f1f2 @@ -0,0 +1 @@ +xKN0DY'l'!ĞS퉅lg#N@JzR±mrf0(&Z)-f N͒'Q;ix/LȞ%oIyA\hGϴ޾uÔ/A#Pv,q ]^ w.+^ QV[fƜӎ{H!3];Ap_O7Gm ?`bE \ No newline at end of file diff --git a/.git_disabled/objects/d5/a76ca4c9c84290e7034a605b66675d1bb1158d b/.git_disabled/objects/d5/a76ca4c9c84290e7034a605b66675d1bb1158d new file mode 100755 index 0000000..b1bfcdf Binary files /dev/null and b/.git_disabled/objects/d5/a76ca4c9c84290e7034a605b66675d1bb1158d differ diff --git a/.git_disabled/objects/d5/aa05ff234fd3fbf4fee88c4a7d3e3c151a538f b/.git_disabled/objects/d5/aa05ff234fd3fbf4fee88c4a7d3e3c151a538f new file mode 100755 index 0000000..47a7958 Binary files /dev/null and b/.git_disabled/objects/d5/aa05ff234fd3fbf4fee88c4a7d3e3c151a538f differ diff --git a/.git_disabled/objects/d5/f876cb0d89e509ff4c00e8477cf0e1d2d8ee94 b/.git_disabled/objects/d5/f876cb0d89e509ff4c00e8477cf0e1d2d8ee94 new file mode 100755 index 0000000..9a83404 Binary files /dev/null and b/.git_disabled/objects/d5/f876cb0d89e509ff4c00e8477cf0e1d2d8ee94 differ diff --git a/.git_disabled/objects/d5/fc236eb8e4397df6372c512090c775b578c9a4 b/.git_disabled/objects/d5/fc236eb8e4397df6372c512090c775b578c9a4 new file mode 100755 index 0000000..2f6c60f Binary files /dev/null and b/.git_disabled/objects/d5/fc236eb8e4397df6372c512090c775b578c9a4 differ diff --git a/.git_disabled/objects/d6/0d938ae2cedb50d0eb6440f5b4f46d3006f306 b/.git_disabled/objects/d6/0d938ae2cedb50d0eb6440f5b4f46d3006f306 new file mode 100755 index 0000000..dc7d569 --- /dev/null +++ b/.git_disabled/objects/d6/0d938ae2cedb50d0eb6440f5b4f46d3006f306 @@ -0,0 +1 @@ +xMk0_1Ѓ_rj'BOӲ,4E)G?NS. :H33︑X-qF&dYS*+N[upY Qߌf!˳f;RKiEsDg(ÍӆV5oңѻSF^0ȓ%!CM(%9q/wV }S:TN0Y?԰9>=û">|8亚 78rƏbE ;zQ*ҚmEì]v?}9LiƷt,W6ÓPv4iŘi*XrC +4 [ԦC)*9n}]EIgpljHT>+ 4 \ No newline at end of file diff --git a/.git_disabled/objects/d6/16a626d992848842637881189d48d4512ad36b b/.git_disabled/objects/d6/16a626d992848842637881189d48d4512ad36b new file mode 100755 index 0000000..f61d443 Binary files /dev/null and b/.git_disabled/objects/d6/16a626d992848842637881189d48d4512ad36b differ diff --git a/.git_disabled/objects/d6/1be1846be04e5603b6cc8987e1b2c2e824312e b/.git_disabled/objects/d6/1be1846be04e5603b6cc8987e1b2c2e824312e new file mode 100755 index 0000000..6a9a913 Binary files /dev/null and b/.git_disabled/objects/d6/1be1846be04e5603b6cc8987e1b2c2e824312e differ diff --git a/.git_disabled/objects/d6/53113c6a4eb841d723cb2d0e68eff99997e0a7 b/.git_disabled/objects/d6/53113c6a4eb841d723cb2d0e68eff99997e0a7 new file mode 100755 index 0000000..b53b04f Binary files /dev/null and b/.git_disabled/objects/d6/53113c6a4eb841d723cb2d0e68eff99997e0a7 differ diff --git a/.git_disabled/objects/d6/6ba7393ff3ff28654c9b2d1a1e424482d9cf02 b/.git_disabled/objects/d6/6ba7393ff3ff28654c9b2d1a1e424482d9cf02 new file mode 100755 index 0000000..aa8015d Binary files /dev/null and b/.git_disabled/objects/d6/6ba7393ff3ff28654c9b2d1a1e424482d9cf02 differ diff --git a/.git_disabled/objects/d6/6e10f0d373dea325938d11869feec76931e59f b/.git_disabled/objects/d6/6e10f0d373dea325938d11869feec76931e59f new file mode 100755 index 0000000..b949ce5 Binary files /dev/null and b/.git_disabled/objects/d6/6e10f0d373dea325938d11869feec76931e59f differ diff --git a/.git_disabled/objects/d6/7b7ef1c9ed49b8b1a1ce562395fbac6bb74dba b/.git_disabled/objects/d6/7b7ef1c9ed49b8b1a1ce562395fbac6bb74dba new file mode 100755 index 0000000..1bdf5af Binary files /dev/null and b/.git_disabled/objects/d6/7b7ef1c9ed49b8b1a1ce562395fbac6bb74dba differ diff --git a/.git_disabled/objects/d6/852212334b5460ebe28d8f4042e49626121d7b b/.git_disabled/objects/d6/852212334b5460ebe28d8f4042e49626121d7b new file mode 100755 index 0000000..475ac22 Binary files /dev/null and b/.git_disabled/objects/d6/852212334b5460ebe28d8f4042e49626121d7b differ diff --git a/.git_disabled/objects/d6/b8327eca045b8374376f08a56f42e623197bf4 b/.git_disabled/objects/d6/b8327eca045b8374376f08a56f42e623197bf4 new file mode 100755 index 0000000..795923d Binary files /dev/null and b/.git_disabled/objects/d6/b8327eca045b8374376f08a56f42e623197bf4 differ diff --git a/.git_disabled/objects/d6/bbbce7c09c38e8fcb63be2da3d0844de49185a b/.git_disabled/objects/d6/bbbce7c09c38e8fcb63be2da3d0844de49185a new file mode 100755 index 0000000..b4ccad0 Binary files /dev/null and b/.git_disabled/objects/d6/bbbce7c09c38e8fcb63be2da3d0844de49185a differ diff --git a/.git_disabled/objects/d6/d55289b2f31580e2b3c993ccbcfa2035fb4201 b/.git_disabled/objects/d6/d55289b2f31580e2b3c993ccbcfa2035fb4201 new file mode 100755 index 0000000..7705874 Binary files /dev/null and b/.git_disabled/objects/d6/d55289b2f31580e2b3c993ccbcfa2035fb4201 differ diff --git a/.git_disabled/objects/d6/eb752b6e4f6db3d13688a670a7585e9f8bac14 b/.git_disabled/objects/d6/eb752b6e4f6db3d13688a670a7585e9f8bac14 new file mode 100755 index 0000000..441560a Binary files /dev/null and b/.git_disabled/objects/d6/eb752b6e4f6db3d13688a670a7585e9f8bac14 differ diff --git a/.git_disabled/objects/d6/f863b21b577ef32f3a24eaa5d9ded7ce7b349c b/.git_disabled/objects/d6/f863b21b577ef32f3a24eaa5d9ded7ce7b349c new file mode 100755 index 0000000..2264e05 Binary files /dev/null and b/.git_disabled/objects/d6/f863b21b577ef32f3a24eaa5d9ded7ce7b349c differ diff --git a/.git_disabled/objects/d6/fd5706f2bd5727499589a17d25303993685377 b/.git_disabled/objects/d6/fd5706f2bd5727499589a17d25303993685377 new file mode 100755 index 0000000..1b5fafd Binary files /dev/null and b/.git_disabled/objects/d6/fd5706f2bd5727499589a17d25303993685377 differ diff --git a/.git_disabled/objects/d7/05a0cca1a8fbe7770b8da4795e111474722670 b/.git_disabled/objects/d7/05a0cca1a8fbe7770b8da4795e111474722670 new file mode 100755 index 0000000..913b88e Binary files /dev/null and b/.git_disabled/objects/d7/05a0cca1a8fbe7770b8da4795e111474722670 differ diff --git a/.git_disabled/objects/d7/08d469b991a19806f3b29b9587fd05530fc804 b/.git_disabled/objects/d7/08d469b991a19806f3b29b9587fd05530fc804 new file mode 100755 index 0000000..16bdc8c Binary files /dev/null and b/.git_disabled/objects/d7/08d469b991a19806f3b29b9587fd05530fc804 differ diff --git a/.git_disabled/objects/d7/138eed5b65f578d881362263e99e0c944582b0 b/.git_disabled/objects/d7/138eed5b65f578d881362263e99e0c944582b0 new file mode 100755 index 0000000..fd9be63 Binary files /dev/null and b/.git_disabled/objects/d7/138eed5b65f578d881362263e99e0c944582b0 differ diff --git a/.git_disabled/objects/d7/1633706c54020e7dba9754c34151dc5c5a6096 b/.git_disabled/objects/d7/1633706c54020e7dba9754c34151dc5c5a6096 new file mode 100755 index 0000000..88bab6e Binary files /dev/null and b/.git_disabled/objects/d7/1633706c54020e7dba9754c34151dc5c5a6096 differ diff --git a/.git_disabled/objects/d7/1ce86fea0bc0afc32b0674e95a1a687ddc232a b/.git_disabled/objects/d7/1ce86fea0bc0afc32b0674e95a1a687ddc232a new file mode 100755 index 0000000..c3374c1 Binary files /dev/null and b/.git_disabled/objects/d7/1ce86fea0bc0afc32b0674e95a1a687ddc232a differ diff --git a/.git_disabled/objects/d7/22d7e1f255796e35c4a3804fc7aebf3318b73c b/.git_disabled/objects/d7/22d7e1f255796e35c4a3804fc7aebf3318b73c new file mode 100755 index 0000000..8dcd862 Binary files /dev/null and b/.git_disabled/objects/d7/22d7e1f255796e35c4a3804fc7aebf3318b73c differ diff --git a/.git_disabled/objects/d7/2cfc3eddf622ae73c4bd9a52b490bc9f3d3bbe b/.git_disabled/objects/d7/2cfc3eddf622ae73c4bd9a52b490bc9f3d3bbe new file mode 100755 index 0000000..597c9ad Binary files /dev/null and b/.git_disabled/objects/d7/2cfc3eddf622ae73c4bd9a52b490bc9f3d3bbe differ diff --git a/.git_disabled/objects/d7/464b0b8cc31ed05d2ee8fe6d600044a72e84c7 b/.git_disabled/objects/d7/464b0b8cc31ed05d2ee8fe6d600044a72e84c7 new file mode 100755 index 0000000..abc73ea Binary files /dev/null and b/.git_disabled/objects/d7/464b0b8cc31ed05d2ee8fe6d600044a72e84c7 differ diff --git a/.git_disabled/objects/d7/482e8092e7ce017c594006aa2bcc955d18e239 b/.git_disabled/objects/d7/482e8092e7ce017c594006aa2bcc955d18e239 new file mode 100755 index 0000000..2c97bd7 Binary files /dev/null and b/.git_disabled/objects/d7/482e8092e7ce017c594006aa2bcc955d18e239 differ diff --git a/.git_disabled/objects/d7/4867b5a0a2cf74751d1629df6db32dc32974db b/.git_disabled/objects/d7/4867b5a0a2cf74751d1629df6db32dc32974db new file mode 100755 index 0000000..89f19d1 Binary files /dev/null and b/.git_disabled/objects/d7/4867b5a0a2cf74751d1629df6db32dc32974db differ diff --git a/.git_disabled/objects/d7/4f3505c0673b66045e4341adb3edd4992e2579 b/.git_disabled/objects/d7/4f3505c0673b66045e4341adb3edd4992e2579 new file mode 100755 index 0000000..731767c Binary files /dev/null and b/.git_disabled/objects/d7/4f3505c0673b66045e4341adb3edd4992e2579 differ diff --git a/.git_disabled/objects/d7/7a7df4f0174f18d3f2eb2dc8aaae73e2a40cb6 b/.git_disabled/objects/d7/7a7df4f0174f18d3f2eb2dc8aaae73e2a40cb6 new file mode 100755 index 0000000..e3cfe0f --- /dev/null +++ b/.git_disabled/objects/d7/7a7df4f0174f18d3f2eb2dc8aaae73e2a40cb6 @@ -0,0 +1,4 @@ +xTN0ybd + +iP@(T=FN2uvRGz"e쪢9XyBŰfUZ0̱h+Qr  .218Sg s nVğ$fG?$W8 (,(YQSjәq?Ka),9pyJ^W,Լ`rl"i\xG.2+Bh_51J aPK R+KW^&LM- +n!jz5hn^O؟˄+I YsEYMO,"oWF@B RL(Tb!\vee|;{z^!<|fY"M/K[P主oQj XAe-ꚷy 4<'ʇsI{LD*UZF;86}yTAփ]_8Fi_ zNg@`6c@OiU}Bo!nEc>vYDMɩH뚡n]C \ No newline at end of file diff --git a/.git_disabled/objects/d7/896e410f3609e360f0daaf9dafaabb8fd94e47 b/.git_disabled/objects/d7/896e410f3609e360f0daaf9dafaabb8fd94e47 new file mode 100755 index 0000000..52b994b Binary files /dev/null and b/.git_disabled/objects/d7/896e410f3609e360f0daaf9dafaabb8fd94e47 differ diff --git a/.git_disabled/objects/d7/897de2722f188ee6aa3666cde9ef260c42b2d2 b/.git_disabled/objects/d7/897de2722f188ee6aa3666cde9ef260c42b2d2 new file mode 100755 index 0000000..2bab976 Binary files /dev/null and b/.git_disabled/objects/d7/897de2722f188ee6aa3666cde9ef260c42b2d2 differ diff --git a/.git_disabled/objects/d7/92b51eb73f0ab5a734b55b14b2429e1251ba93 b/.git_disabled/objects/d7/92b51eb73f0ab5a734b55b14b2429e1251ba93 new file mode 100755 index 0000000..63fa05b Binary files /dev/null and b/.git_disabled/objects/d7/92b51eb73f0ab5a734b55b14b2429e1251ba93 differ diff --git a/.git_disabled/objects/d7/997ca73cada521f54ad7a69e0fb82f818cff7e b/.git_disabled/objects/d7/997ca73cada521f54ad7a69e0fb82f818cff7e new file mode 100755 index 0000000..a749eb2 Binary files /dev/null and b/.git_disabled/objects/d7/997ca73cada521f54ad7a69e0fb82f818cff7e differ diff --git a/.git_disabled/objects/d7/a96e65e5f9043cb2165e13cc14ed4a49dc334f b/.git_disabled/objects/d7/a96e65e5f9043cb2165e13cc14ed4a49dc334f new file mode 100755 index 0000000..03b5fe8 Binary files /dev/null and b/.git_disabled/objects/d7/a96e65e5f9043cb2165e13cc14ed4a49dc334f differ diff --git a/.git_disabled/objects/d7/ae0128fe1462474c843de77e2cd6bd4ede9453 b/.git_disabled/objects/d7/ae0128fe1462474c843de77e2cd6bd4ede9453 new file mode 100755 index 0000000..5c50d51 --- /dev/null +++ b/.git_disabled/objects/d7/ae0128fe1462474c843de77e2cd6bd4ede9453 @@ -0,0 +1 @@ +x+)JMU05f040075Up,(MRp,-H+LN,Og8hMtYY;uJ]ph \ No newline at end of file diff --git a/.git_disabled/objects/d7/bc6625866774d51d0490d522c32146bd37d80a b/.git_disabled/objects/d7/bc6625866774d51d0490d522c32146bd37d80a new file mode 100755 index 0000000..1b51f15 Binary files /dev/null and b/.git_disabled/objects/d7/bc6625866774d51d0490d522c32146bd37d80a differ diff --git a/.git_disabled/objects/d7/bedb2de03e6315178149667e1577dfc084000f b/.git_disabled/objects/d7/bedb2de03e6315178149667e1577dfc084000f new file mode 100755 index 0000000..b484f0d Binary files /dev/null and b/.git_disabled/objects/d7/bedb2de03e6315178149667e1577dfc084000f differ diff --git a/.git_disabled/objects/d7/d1781e78ac684d57fdc395666ef660ca788b3f b/.git_disabled/objects/d7/d1781e78ac684d57fdc395666ef660ca788b3f new file mode 100755 index 0000000..df80bc8 Binary files /dev/null and b/.git_disabled/objects/d7/d1781e78ac684d57fdc395666ef660ca788b3f differ diff --git a/.git_disabled/objects/d7/e4b321553752f702c4309c9e558b7a0a919d7f b/.git_disabled/objects/d7/e4b321553752f702c4309c9e558b7a0a919d7f new file mode 100755 index 0000000..c6afe0a Binary files /dev/null and b/.git_disabled/objects/d7/e4b321553752f702c4309c9e558b7a0a919d7f differ diff --git a/.git_disabled/objects/d7/f03dce21e888adeb65fddde48bdf7857615e89 b/.git_disabled/objects/d7/f03dce21e888adeb65fddde48bdf7857615e89 new file mode 100755 index 0000000..49eb01a Binary files /dev/null and b/.git_disabled/objects/d7/f03dce21e888adeb65fddde48bdf7857615e89 differ diff --git a/.git_disabled/objects/d8/001c8ccdae72ce4d968040f090047bf720717a b/.git_disabled/objects/d8/001c8ccdae72ce4d968040f090047bf720717a new file mode 100755 index 0000000..3cabed0 Binary files /dev/null and b/.git_disabled/objects/d8/001c8ccdae72ce4d968040f090047bf720717a differ diff --git a/.git_disabled/objects/d8/329ea484ece32bc685541fe0f1f0862cabb1ef b/.git_disabled/objects/d8/329ea484ece32bc685541fe0f1f0862cabb1ef new file mode 100755 index 0000000..e6ed25b Binary files /dev/null and b/.git_disabled/objects/d8/329ea484ece32bc685541fe0f1f0862cabb1ef differ diff --git a/.git_disabled/objects/d8/4d716392bd6dacf3c4f90ad599c392f2b37c66 b/.git_disabled/objects/d8/4d716392bd6dacf3c4f90ad599c392f2b37c66 new file mode 100755 index 0000000..240f05d Binary files /dev/null and b/.git_disabled/objects/d8/4d716392bd6dacf3c4f90ad599c392f2b37c66 differ diff --git a/.git_disabled/objects/d8/4fb57806a5b3838f152e954c4da22fa1c237f7 b/.git_disabled/objects/d8/4fb57806a5b3838f152e954c4da22fa1c237f7 new file mode 100755 index 0000000..91274d1 Binary files /dev/null and b/.git_disabled/objects/d8/4fb57806a5b3838f152e954c4da22fa1c237f7 differ diff --git a/.git_disabled/objects/d8/6d85f9313a643c44864b3945c77e85e63a10a2 b/.git_disabled/objects/d8/6d85f9313a643c44864b3945c77e85e63a10a2 new file mode 100755 index 0000000..28425a8 Binary files /dev/null and b/.git_disabled/objects/d8/6d85f9313a643c44864b3945c77e85e63a10a2 differ diff --git a/.git_disabled/objects/d8/6e232ee425acd3e2b478f94dbfdccb7886f371 b/.git_disabled/objects/d8/6e232ee425acd3e2b478f94dbfdccb7886f371 new file mode 100755 index 0000000..e928b41 Binary files /dev/null and b/.git_disabled/objects/d8/6e232ee425acd3e2b478f94dbfdccb7886f371 differ diff --git a/.git_disabled/objects/d8/6f57f9ce5494c35dc1848462ef63085aa84d96 b/.git_disabled/objects/d8/6f57f9ce5494c35dc1848462ef63085aa84d96 new file mode 100755 index 0000000..5ade402 Binary files /dev/null and b/.git_disabled/objects/d8/6f57f9ce5494c35dc1848462ef63085aa84d96 differ diff --git a/.git_disabled/objects/d8/86b67317fe0675cd5e13b22764b53d9db0d49b b/.git_disabled/objects/d8/86b67317fe0675cd5e13b22764b53d9db0d49b new file mode 100755 index 0000000..dad25e2 Binary files /dev/null and b/.git_disabled/objects/d8/86b67317fe0675cd5e13b22764b53d9db0d49b differ diff --git a/.git_disabled/objects/d8/8f26d16eed5b4d4e9070f6e8c4710627bd925b b/.git_disabled/objects/d8/8f26d16eed5b4d4e9070f6e8c4710627bd925b new file mode 100755 index 0000000..7030b61 Binary files /dev/null and b/.git_disabled/objects/d8/8f26d16eed5b4d4e9070f6e8c4710627bd925b differ diff --git a/.git_disabled/objects/d8/982ff5b4e56579614dfa929f9ae6fb7271e215 b/.git_disabled/objects/d8/982ff5b4e56579614dfa929f9ae6fb7271e215 new file mode 100755 index 0000000..09ec2ff Binary files /dev/null and b/.git_disabled/objects/d8/982ff5b4e56579614dfa929f9ae6fb7271e215 differ diff --git a/.git_disabled/objects/d8/b7b899d55d6188c092c232caa74427558354cf b/.git_disabled/objects/d8/b7b899d55d6188c092c232caa74427558354cf new file mode 100755 index 0000000..a2215d5 Binary files /dev/null and b/.git_disabled/objects/d8/b7b899d55d6188c092c232caa74427558354cf differ diff --git a/.git_disabled/objects/d8/b9936dad9ab2513fa6979f411560d3b6b57e37 b/.git_disabled/objects/d8/b9936dad9ab2513fa6979f411560d3b6b57e37 new file mode 100755 index 0000000..11d067e Binary files /dev/null and b/.git_disabled/objects/d8/b9936dad9ab2513fa6979f411560d3b6b57e37 differ diff --git a/.git_disabled/objects/d8/d38be719bad6e93e98a7eb0ffb4540c7c71731 b/.git_disabled/objects/d8/d38be719bad6e93e98a7eb0ffb4540c7c71731 new file mode 100755 index 0000000..bb561b5 Binary files /dev/null and b/.git_disabled/objects/d8/d38be719bad6e93e98a7eb0ffb4540c7c71731 differ diff --git a/.git_disabled/objects/d9/1499096740270e42b998190ed1a318872a77d0 b/.git_disabled/objects/d9/1499096740270e42b998190ed1a318872a77d0 new file mode 100755 index 0000000..2e06d05 Binary files /dev/null and b/.git_disabled/objects/d9/1499096740270e42b998190ed1a318872a77d0 differ diff --git a/.git_disabled/objects/d9/28a48ac25f3879c68b255a70d1e99540a65be9 b/.git_disabled/objects/d9/28a48ac25f3879c68b255a70d1e99540a65be9 new file mode 100755 index 0000000..b6f6ccc Binary files /dev/null and b/.git_disabled/objects/d9/28a48ac25f3879c68b255a70d1e99540a65be9 differ diff --git a/.git_disabled/objects/d9/31386122bbcedb3bd8a39345d034ff836ed467 b/.git_disabled/objects/d9/31386122bbcedb3bd8a39345d034ff836ed467 new file mode 100755 index 0000000..eedac5a Binary files /dev/null and b/.git_disabled/objects/d9/31386122bbcedb3bd8a39345d034ff836ed467 differ diff --git a/.git_disabled/objects/d9/3c73728b888e7206b8a2f5323db145bb4860ec b/.git_disabled/objects/d9/3c73728b888e7206b8a2f5323db145bb4860ec new file mode 100755 index 0000000..68d8ea3 Binary files /dev/null and b/.git_disabled/objects/d9/3c73728b888e7206b8a2f5323db145bb4860ec differ diff --git a/.git_disabled/objects/d9/5040c914e5421613957a5869ed8b89d978c60e b/.git_disabled/objects/d9/5040c914e5421613957a5869ed8b89d978c60e new file mode 100755 index 0000000..3cce793 Binary files /dev/null and b/.git_disabled/objects/d9/5040c914e5421613957a5869ed8b89d978c60e differ diff --git a/.git_disabled/objects/d9/59863195439e23190f5e43c5745a9bca5884c5 b/.git_disabled/objects/d9/59863195439e23190f5e43c5745a9bca5884c5 new file mode 100755 index 0000000..cb66a77 Binary files /dev/null and b/.git_disabled/objects/d9/59863195439e23190f5e43c5745a9bca5884c5 differ diff --git a/.git_disabled/objects/d9/6107cc58f20f039847dbbc9216da0e4faec7c9 b/.git_disabled/objects/d9/6107cc58f20f039847dbbc9216da0e4faec7c9 new file mode 100755 index 0000000..a91f603 Binary files /dev/null and b/.git_disabled/objects/d9/6107cc58f20f039847dbbc9216da0e4faec7c9 differ diff --git a/.git_disabled/objects/d9/67f7612f081e95c8dc22d05ff9334e8a47ee03 b/.git_disabled/objects/d9/67f7612f081e95c8dc22d05ff9334e8a47ee03 new file mode 100755 index 0000000..039cfd6 Binary files /dev/null and b/.git_disabled/objects/d9/67f7612f081e95c8dc22d05ff9334e8a47ee03 differ diff --git a/.git_disabled/objects/d9/747de579da942662e3820798278b587cc841d1 b/.git_disabled/objects/d9/747de579da942662e3820798278b587cc841d1 new file mode 100755 index 0000000..f6a5f8e Binary files /dev/null and b/.git_disabled/objects/d9/747de579da942662e3820798278b587cc841d1 differ diff --git a/.git_disabled/objects/d9/a7360ee06203bd50eab09e556b376ed57bc492 b/.git_disabled/objects/d9/a7360ee06203bd50eab09e556b376ed57bc492 new file mode 100755 index 0000000..e867d6f --- /dev/null +++ b/.git_disabled/objects/d9/a7360ee06203bd50eab09e556b376ed57bc492 @@ -0,0 +1 @@ +xKOR01fRPPLQRP20O2KI2T%概D RKjH6 G \ No newline at end of file diff --git a/.git_disabled/objects/d9/b7d0a71696c45abe1c59f3a4c7f477b139ee06 b/.git_disabled/objects/d9/b7d0a71696c45abe1c59f3a4c7f477b139ee06 new file mode 100755 index 0000000..69a37e4 Binary files /dev/null and b/.git_disabled/objects/d9/b7d0a71696c45abe1c59f3a4c7f477b139ee06 differ diff --git a/.git_disabled/objects/d9/cdbf9b81de50ef4a00ee2ef30e3f8144e9b99d b/.git_disabled/objects/d9/cdbf9b81de50ef4a00ee2ef30e3f8144e9b99d new file mode 100755 index 0000000..c4f8343 Binary files /dev/null and b/.git_disabled/objects/d9/cdbf9b81de50ef4a00ee2ef30e3f8144e9b99d differ diff --git a/.git_disabled/objects/d9/cf3c98f908beb07d2bb8ae0b306952e7fe0f96 b/.git_disabled/objects/d9/cf3c98f908beb07d2bb8ae0b306952e7fe0f96 new file mode 100755 index 0000000..463e59a Binary files /dev/null and b/.git_disabled/objects/d9/cf3c98f908beb07d2bb8ae0b306952e7fe0f96 differ diff --git a/.git_disabled/objects/d9/d481bfc680dcc3d62e7d7ca210da8a0536c0aa b/.git_disabled/objects/d9/d481bfc680dcc3d62e7d7ca210da8a0536c0aa new file mode 100755 index 0000000..4fa4558 Binary files /dev/null and b/.git_disabled/objects/d9/d481bfc680dcc3d62e7d7ca210da8a0536c0aa differ diff --git a/.git_disabled/objects/d9/dd94ff3ae018107559f1e16355c47f1bbf0544 b/.git_disabled/objects/d9/dd94ff3ae018107559f1e16355c47f1bbf0544 new file mode 100755 index 0000000..e793587 Binary files /dev/null and b/.git_disabled/objects/d9/dd94ff3ae018107559f1e16355c47f1bbf0544 differ diff --git a/.git_disabled/objects/d9/ef62ea92e8bccdd8968a55dc9da917771d5280 b/.git_disabled/objects/d9/ef62ea92e8bccdd8968a55dc9da917771d5280 new file mode 100755 index 0000000..b3bcb3a Binary files /dev/null and b/.git_disabled/objects/d9/ef62ea92e8bccdd8968a55dc9da917771d5280 differ diff --git a/.git_disabled/objects/d9/f3c3b71e0100bc00a180ea6a52fa4983388942 b/.git_disabled/objects/d9/f3c3b71e0100bc00a180ea6a52fa4983388942 new file mode 100755 index 0000000..d3bd17c Binary files /dev/null and b/.git_disabled/objects/d9/f3c3b71e0100bc00a180ea6a52fa4983388942 differ diff --git a/.git_disabled/objects/da/087eed5c75a3d80dd924ab27fcc23f620a2838 b/.git_disabled/objects/da/087eed5c75a3d80dd924ab27fcc23f620a2838 new file mode 100755 index 0000000..42fe8d1 Binary files /dev/null and b/.git_disabled/objects/da/087eed5c75a3d80dd924ab27fcc23f620a2838 differ diff --git a/.git_disabled/objects/da/0a4c7d9f39008b33a39c369f7179b73654bde1 b/.git_disabled/objects/da/0a4c7d9f39008b33a39c369f7179b73654bde1 new file mode 100755 index 0000000..9bc1e4a Binary files /dev/null and b/.git_disabled/objects/da/0a4c7d9f39008b33a39c369f7179b73654bde1 differ diff --git a/.git_disabled/objects/da/276826cef30e3ec7622856bce42cb354529812 b/.git_disabled/objects/da/276826cef30e3ec7622856bce42cb354529812 new file mode 100755 index 0000000..0a1df56 Binary files /dev/null and b/.git_disabled/objects/da/276826cef30e3ec7622856bce42cb354529812 differ diff --git a/.git_disabled/objects/da/43d414d1320b9ee4be8dcb8774a3de6036a5ff b/.git_disabled/objects/da/43d414d1320b9ee4be8dcb8774a3de6036a5ff new file mode 100755 index 0000000..1216b0c Binary files /dev/null and b/.git_disabled/objects/da/43d414d1320b9ee4be8dcb8774a3de6036a5ff differ diff --git a/.git_disabled/objects/da/4ab81a386f4f368801d6cf5eb735d97153f08d b/.git_disabled/objects/da/4ab81a386f4f368801d6cf5eb735d97153f08d new file mode 100755 index 0000000..e4376d6 Binary files /dev/null and b/.git_disabled/objects/da/4ab81a386f4f368801d6cf5eb735d97153f08d differ diff --git a/.git_disabled/objects/da/69616dc4644a6d666e6ca357b9fb1d16008cd9 b/.git_disabled/objects/da/69616dc4644a6d666e6ca357b9fb1d16008cd9 new file mode 100755 index 0000000..007f25f Binary files /dev/null and b/.git_disabled/objects/da/69616dc4644a6d666e6ca357b9fb1d16008cd9 differ diff --git a/.git_disabled/objects/da/69cb7fae3d0ea02e0a07246fb9bef42dda7016 b/.git_disabled/objects/da/69cb7fae3d0ea02e0a07246fb9bef42dda7016 new file mode 100755 index 0000000..7f90138 Binary files /dev/null and b/.git_disabled/objects/da/69cb7fae3d0ea02e0a07246fb9bef42dda7016 differ diff --git a/.git_disabled/objects/da/6c7065d7d53aa023220c578b37f3fe0cb04c8d b/.git_disabled/objects/da/6c7065d7d53aa023220c578b37f3fe0cb04c8d new file mode 100755 index 0000000..fd91052 Binary files /dev/null and b/.git_disabled/objects/da/6c7065d7d53aa023220c578b37f3fe0cb04c8d differ diff --git a/.git_disabled/objects/da/761c2da81825aad0463af2c5864c2d9d8580e2 b/.git_disabled/objects/da/761c2da81825aad0463af2c5864c2d9d8580e2 new file mode 100755 index 0000000..b419a16 Binary files /dev/null and b/.git_disabled/objects/da/761c2da81825aad0463af2c5864c2d9d8580e2 differ diff --git a/.git_disabled/objects/da/7ae9af2779d692c82049a1f2aa75c9a75dff9a b/.git_disabled/objects/da/7ae9af2779d692c82049a1f2aa75c9a75dff9a new file mode 100755 index 0000000..f2a22e5 Binary files /dev/null and b/.git_disabled/objects/da/7ae9af2779d692c82049a1f2aa75c9a75dff9a differ diff --git a/.git_disabled/objects/da/96c4128fbfd6ee356827fb713ffd20d39075be b/.git_disabled/objects/da/96c4128fbfd6ee356827fb713ffd20d39075be new file mode 100755 index 0000000..76b405c Binary files /dev/null and b/.git_disabled/objects/da/96c4128fbfd6ee356827fb713ffd20d39075be differ diff --git a/.git_disabled/objects/da/b67774b437c5b44b025916fabddf6c1d485315 b/.git_disabled/objects/da/b67774b437c5b44b025916fabddf6c1d485315 new file mode 100755 index 0000000..d8c731d Binary files /dev/null and b/.git_disabled/objects/da/b67774b437c5b44b025916fabddf6c1d485315 differ diff --git a/.git_disabled/objects/da/d615cbf0719d4ae762886a42d4d72aa05fd4bb b/.git_disabled/objects/da/d615cbf0719d4ae762886a42d4d72aa05fd4bb new file mode 100755 index 0000000..821d5f4 Binary files /dev/null and b/.git_disabled/objects/da/d615cbf0719d4ae762886a42d4d72aa05fd4bb differ diff --git a/.git_disabled/objects/da/f415899967f00a43b6df1b8b40cd44b6c71f53 b/.git_disabled/objects/da/f415899967f00a43b6df1b8b40cd44b6c71f53 new file mode 100755 index 0000000..d1bb3ec Binary files /dev/null and b/.git_disabled/objects/da/f415899967f00a43b6df1b8b40cd44b6c71f53 differ diff --git a/.git_disabled/objects/da/fd04bc1c7fa14d8f1bb9161e9071a4f2bde600 b/.git_disabled/objects/da/fd04bc1c7fa14d8f1bb9161e9071a4f2bde600 new file mode 100755 index 0000000..2782533 Binary files /dev/null and b/.git_disabled/objects/da/fd04bc1c7fa14d8f1bb9161e9071a4f2bde600 differ diff --git a/.git_disabled/objects/db/04618c9b5cd359c6d39f9dc3281003c2373c6b b/.git_disabled/objects/db/04618c9b5cd359c6d39f9dc3281003c2373c6b new file mode 100755 index 0000000..fa725fd Binary files /dev/null and b/.git_disabled/objects/db/04618c9b5cd359c6d39f9dc3281003c2373c6b differ diff --git a/.git_disabled/objects/db/09972a485ae38220ab89fa9fea79d0754976b6 b/.git_disabled/objects/db/09972a485ae38220ab89fa9fea79d0754976b6 new file mode 100755 index 0000000..89bfbe3 Binary files /dev/null and b/.git_disabled/objects/db/09972a485ae38220ab89fa9fea79d0754976b6 differ diff --git a/.git_disabled/objects/db/0a9fc48db849d6319b90f3594ff4faeaef48ad b/.git_disabled/objects/db/0a9fc48db849d6319b90f3594ff4faeaef48ad new file mode 100755 index 0000000..02f653d Binary files /dev/null and b/.git_disabled/objects/db/0a9fc48db849d6319b90f3594ff4faeaef48ad differ diff --git a/.git_disabled/objects/db/1ccf8f3733c65d4372d57a2bdbaba898621627 b/.git_disabled/objects/db/1ccf8f3733c65d4372d57a2bdbaba898621627 new file mode 100755 index 0000000..b3b4329 Binary files /dev/null and b/.git_disabled/objects/db/1ccf8f3733c65d4372d57a2bdbaba898621627 differ diff --git a/.git_disabled/objects/db/2ba3a088df0d4bb6d4ed8f2a37c5d50338f487 b/.git_disabled/objects/db/2ba3a088df0d4bb6d4ed8f2a37c5d50338f487 new file mode 100755 index 0000000..4aa55b7 Binary files /dev/null and b/.git_disabled/objects/db/2ba3a088df0d4bb6d4ed8f2a37c5d50338f487 differ diff --git a/.git_disabled/objects/db/6c8e4fb8b3955ccc8e14b009da435edb74489c b/.git_disabled/objects/db/6c8e4fb8b3955ccc8e14b009da435edb74489c new file mode 100755 index 0000000..9ca0aff Binary files /dev/null and b/.git_disabled/objects/db/6c8e4fb8b3955ccc8e14b009da435edb74489c differ diff --git a/.git_disabled/objects/db/6c8fe4604224ecd322ff1ecf75d2f63c11c642 b/.git_disabled/objects/db/6c8fe4604224ecd322ff1ecf75d2f63c11c642 new file mode 100755 index 0000000..8230809 Binary files /dev/null and b/.git_disabled/objects/db/6c8fe4604224ecd322ff1ecf75d2f63c11c642 differ diff --git a/.git_disabled/objects/db/77b17e305acac755f6220a6ef65cc05ae94368 b/.git_disabled/objects/db/77b17e305acac755f6220a6ef65cc05ae94368 new file mode 100755 index 0000000..6b349f3 Binary files /dev/null and b/.git_disabled/objects/db/77b17e305acac755f6220a6ef65cc05ae94368 differ diff --git a/.git_disabled/objects/db/83aa03d7668e8519002319d90818387a1d3eb1 b/.git_disabled/objects/db/83aa03d7668e8519002319d90818387a1d3eb1 new file mode 100755 index 0000000..43cde2d Binary files /dev/null and b/.git_disabled/objects/db/83aa03d7668e8519002319d90818387a1d3eb1 differ diff --git a/.git_disabled/objects/db/8c74e98d2e456d7c9602a314bd171ae84cc102 b/.git_disabled/objects/db/8c74e98d2e456d7c9602a314bd171ae84cc102 new file mode 100755 index 0000000..44f8f31 Binary files /dev/null and b/.git_disabled/objects/db/8c74e98d2e456d7c9602a314bd171ae84cc102 differ diff --git a/.git_disabled/objects/db/aba2ed6bef0bbac4cfb3bf2896d59c45f1004e b/.git_disabled/objects/db/aba2ed6bef0bbac4cfb3bf2896d59c45f1004e new file mode 100755 index 0000000..3074efa Binary files /dev/null and b/.git_disabled/objects/db/aba2ed6bef0bbac4cfb3bf2896d59c45f1004e differ diff --git a/.git_disabled/objects/db/b19621ab9230e1602794b2ae35dfd706c2cfb5 b/.git_disabled/objects/db/b19621ab9230e1602794b2ae35dfd706c2cfb5 new file mode 100755 index 0000000..50f094c Binary files /dev/null and b/.git_disabled/objects/db/b19621ab9230e1602794b2ae35dfd706c2cfb5 differ diff --git a/.git_disabled/objects/db/bca0b4a529f98170faf475874dbd58c6db2486 b/.git_disabled/objects/db/bca0b4a529f98170faf475874dbd58c6db2486 new file mode 100755 index 0000000..6484432 Binary files /dev/null and b/.git_disabled/objects/db/bca0b4a529f98170faf475874dbd58c6db2486 differ diff --git a/.git_disabled/objects/db/d0beeb4da32d8c0175d412fa442eae8f837723 b/.git_disabled/objects/db/d0beeb4da32d8c0175d412fa442eae8f837723 new file mode 100755 index 0000000..464056c Binary files /dev/null and b/.git_disabled/objects/db/d0beeb4da32d8c0175d412fa442eae8f837723 differ diff --git a/.git_disabled/objects/db/d0ce37417c86d3dcb2bff361eb608d456351aa b/.git_disabled/objects/db/d0ce37417c86d3dcb2bff361eb608d456351aa new file mode 100755 index 0000000..961bc7f Binary files /dev/null and b/.git_disabled/objects/db/d0ce37417c86d3dcb2bff361eb608d456351aa differ diff --git a/.git_disabled/objects/db/d3751d2eac096470b935284ceb7218d65158e7 b/.git_disabled/objects/db/d3751d2eac096470b935284ceb7218d65158e7 new file mode 100755 index 0000000..48d62d4 Binary files /dev/null and b/.git_disabled/objects/db/d3751d2eac096470b935284ceb7218d65158e7 differ diff --git a/.git_disabled/objects/db/eb1989ba35da34a15e015e0225304dcd140331 b/.git_disabled/objects/db/eb1989ba35da34a15e015e0225304dcd140331 new file mode 100755 index 0000000..fceabd1 Binary files /dev/null and b/.git_disabled/objects/db/eb1989ba35da34a15e015e0225304dcd140331 differ diff --git a/.git_disabled/objects/db/f45f473bcb7f9204b5438d4f9f15c46718de66 b/.git_disabled/objects/db/f45f473bcb7f9204b5438d4f9f15c46718de66 new file mode 100755 index 0000000..c83e6fc Binary files /dev/null and b/.git_disabled/objects/db/f45f473bcb7f9204b5438d4f9f15c46718de66 differ diff --git a/.git_disabled/objects/db/fa219a0bf4931e5358b4adc59290b9e79a3eaf b/.git_disabled/objects/db/fa219a0bf4931e5358b4adc59290b9e79a3eaf new file mode 100755 index 0000000..4312629 Binary files /dev/null and b/.git_disabled/objects/db/fa219a0bf4931e5358b4adc59290b9e79a3eaf differ diff --git a/.git_disabled/objects/dc/13ed45ad9942776352e5a7eeb2dd6a7d641e0f b/.git_disabled/objects/dc/13ed45ad9942776352e5a7eeb2dd6a7d641e0f new file mode 100755 index 0000000..72c7be0 Binary files /dev/null and b/.git_disabled/objects/dc/13ed45ad9942776352e5a7eeb2dd6a7d641e0f differ diff --git a/.git_disabled/objects/dc/1e093002cb296865b343cc9797a548a97e2f57 b/.git_disabled/objects/dc/1e093002cb296865b343cc9797a548a97e2f57 new file mode 100755 index 0000000..57ac90c Binary files /dev/null and b/.git_disabled/objects/dc/1e093002cb296865b343cc9797a548a97e2f57 differ diff --git a/.git_disabled/objects/dc/3014cc7353c731ab78c8b25265ae52fc34b1df b/.git_disabled/objects/dc/3014cc7353c731ab78c8b25265ae52fc34b1df new file mode 100755 index 0000000..fab43cb Binary files /dev/null and b/.git_disabled/objects/dc/3014cc7353c731ab78c8b25265ae52fc34b1df differ diff --git a/.git_disabled/objects/dc/36f69ae2aa8bad702fee0eb44dcaa61a10c505 b/.git_disabled/objects/dc/36f69ae2aa8bad702fee0eb44dcaa61a10c505 new file mode 100755 index 0000000..06045be Binary files /dev/null and b/.git_disabled/objects/dc/36f69ae2aa8bad702fee0eb44dcaa61a10c505 differ diff --git a/.git_disabled/objects/dc/6ccd002fdc927474fc779a3fcd982111d938e8 b/.git_disabled/objects/dc/6ccd002fdc927474fc779a3fcd982111d938e8 new file mode 100755 index 0000000..b93fafa Binary files /dev/null and b/.git_disabled/objects/dc/6ccd002fdc927474fc779a3fcd982111d938e8 differ diff --git a/.git_disabled/objects/dc/782141bf94537868517f63dd1453775ecd32cf b/.git_disabled/objects/dc/782141bf94537868517f63dd1453775ecd32cf new file mode 100755 index 0000000..880b390 Binary files /dev/null and b/.git_disabled/objects/dc/782141bf94537868517f63dd1453775ecd32cf differ diff --git a/.git_disabled/objects/dc/7dee13b12821e29f3216f9e0721e96d8a078d5 b/.git_disabled/objects/dc/7dee13b12821e29f3216f9e0721e96d8a078d5 new file mode 100755 index 0000000..0f63754 Binary files /dev/null and b/.git_disabled/objects/dc/7dee13b12821e29f3216f9e0721e96d8a078d5 differ diff --git a/.git_disabled/objects/dc/9bf361ed70572d96968c11928536915d2f084e b/.git_disabled/objects/dc/9bf361ed70572d96968c11928536915d2f084e new file mode 100755 index 0000000..e1ac257 Binary files /dev/null and b/.git_disabled/objects/dc/9bf361ed70572d96968c11928536915d2f084e differ diff --git a/.git_disabled/objects/dc/bc9c9a1bf752f565e2fba107657876a5e161df b/.git_disabled/objects/dc/bc9c9a1bf752f565e2fba107657876a5e161df new file mode 100755 index 0000000..86b7303 Binary files /dev/null and b/.git_disabled/objects/dc/bc9c9a1bf752f565e2fba107657876a5e161df differ diff --git a/.git_disabled/objects/dc/f3c65a9985fc54d9f84dd1ccc35c887cdabbfa b/.git_disabled/objects/dc/f3c65a9985fc54d9f84dd1ccc35c887cdabbfa new file mode 100755 index 0000000..533c5b3 Binary files /dev/null and b/.git_disabled/objects/dc/f3c65a9985fc54d9f84dd1ccc35c887cdabbfa differ diff --git a/.git_disabled/objects/dd/058949c44a9d88dfed7f4bb3ba6b5168606bb5 b/.git_disabled/objects/dd/058949c44a9d88dfed7f4bb3ba6b5168606bb5 new file mode 100755 index 0000000..fbf1eb4 Binary files /dev/null and b/.git_disabled/objects/dd/058949c44a9d88dfed7f4bb3ba6b5168606bb5 differ diff --git a/.git_disabled/objects/dd/07d8ebcad653106cc1dc247740758525556023 b/.git_disabled/objects/dd/07d8ebcad653106cc1dc247740758525556023 new file mode 100755 index 0000000..be34ee9 Binary files /dev/null and b/.git_disabled/objects/dd/07d8ebcad653106cc1dc247740758525556023 differ diff --git a/.git_disabled/objects/dd/1ccf2eb014ae34415945d4a32154029605d7fa b/.git_disabled/objects/dd/1ccf2eb014ae34415945d4a32154029605d7fa new file mode 100755 index 0000000..665a98d --- /dev/null +++ b/.git_disabled/objects/dd/1ccf2eb014ae34415945d4a32154029605d7fa @@ -0,0 +1,2 @@ +xMS0=+vz& ޼wvzԥCU}6φtUgw#chp鋈࢘Zan*]T+0h+~b 9"]0 zaPa0V0ե5X,2m-L$errcQg,- +ʂB(Rߴ݁zPާknMOz"}{#ȖʕzԠ1 #I<&MUAC#m2D(&ñB#dJ1Vxו-i'L4`@T- PzWga\U7+*Cy 7W \ No newline at end of file diff --git a/.git_disabled/objects/de/882931374310a1fcd41f4e7f67dd4078b3a68c b/.git_disabled/objects/de/882931374310a1fcd41f4e7f67dd4078b3a68c new file mode 100755 index 0000000..7714f1e Binary files /dev/null and b/.git_disabled/objects/de/882931374310a1fcd41f4e7f67dd4078b3a68c differ diff --git a/.git_disabled/objects/de/9f99739227cef9096a372ceb49bb574c2cfe4b b/.git_disabled/objects/de/9f99739227cef9096a372ceb49bb574c2cfe4b new file mode 100755 index 0000000..0fc1453 Binary files /dev/null and b/.git_disabled/objects/de/9f99739227cef9096a372ceb49bb574c2cfe4b differ diff --git a/.git_disabled/objects/de/d47cae0b16977aae69f3895ecfe8b8980f58d0 b/.git_disabled/objects/de/d47cae0b16977aae69f3895ecfe8b8980f58d0 new file mode 100755 index 0000000..b46b5a3 Binary files /dev/null and b/.git_disabled/objects/de/d47cae0b16977aae69f3895ecfe8b8980f58d0 differ diff --git a/.git_disabled/objects/de/e26169ba8c9304797fee1dd749e9d6d5f56ecb b/.git_disabled/objects/de/e26169ba8c9304797fee1dd749e9d6d5f56ecb new file mode 100755 index 0000000..d7a60f2 Binary files /dev/null and b/.git_disabled/objects/de/e26169ba8c9304797fee1dd749e9d6d5f56ecb differ diff --git a/.git_disabled/objects/de/e5f13a3629cbaadb0338b33e23eb6e97c0b823 b/.git_disabled/objects/de/e5f13a3629cbaadb0338b33e23eb6e97c0b823 new file mode 100755 index 0000000..2789f32 Binary files /dev/null and b/.git_disabled/objects/de/e5f13a3629cbaadb0338b33e23eb6e97c0b823 differ diff --git a/.git_disabled/objects/de/e737342032682612e778fb12d6256b5290fb11 b/.git_disabled/objects/de/e737342032682612e778fb12d6256b5290fb11 new file mode 100755 index 0000000..8bfd1fb Binary files /dev/null and b/.git_disabled/objects/de/e737342032682612e778fb12d6256b5290fb11 differ diff --git a/.git_disabled/objects/df/066c7a7bac55bad98ef963f6b7083da74d51d3 b/.git_disabled/objects/df/066c7a7bac55bad98ef963f6b7083da74d51d3 new file mode 100755 index 0000000..063f2fd Binary files /dev/null and b/.git_disabled/objects/df/066c7a7bac55bad98ef963f6b7083da74d51d3 differ diff --git a/.git_disabled/objects/df/0ec4b95b38dd6ecb748e61e376ce894b43c0c4 b/.git_disabled/objects/df/0ec4b95b38dd6ecb748e61e376ce894b43c0c4 new file mode 100755 index 0000000..f47548c Binary files /dev/null and b/.git_disabled/objects/df/0ec4b95b38dd6ecb748e61e376ce894b43c0c4 differ diff --git a/.git_disabled/objects/df/0f8c38fba1377eb98fbec2520b4fde60b185bf b/.git_disabled/objects/df/0f8c38fba1377eb98fbec2520b4fde60b185bf new file mode 100755 index 0000000..80bd1e3 Binary files /dev/null and b/.git_disabled/objects/df/0f8c38fba1377eb98fbec2520b4fde60b185bf differ diff --git a/.git_disabled/objects/df/1b866bb626bee78a35f32915dd3200acfaae6c b/.git_disabled/objects/df/1b866bb626bee78a35f32915dd3200acfaae6c new file mode 100755 index 0000000..869388f --- /dev/null +++ b/.git_disabled/objects/df/1b866bb626bee78a35f32915dd3200acfaae6c @@ -0,0 +1 @@ +xMn0)8@J]WݦJQ3c[! iSU4{7)*a@csN$%`X,*n|cT(L,' I4vD>pZ!ۏh^,d;x@gS *zW euXeYnXVY (׎feL绕X1X׌oh/rP:4[d͛?AʜbK"Tczh(]ҧšXoL/:(\~Ck(!]&yrs82 7wpmՁ>hj^*m' \ No newline at end of file diff --git a/.git_disabled/objects/df/33df23f1c6a85040e5988706132591847a1839 b/.git_disabled/objects/df/33df23f1c6a85040e5988706132591847a1839 new file mode 100755 index 0000000..d7b38f5 Binary files /dev/null and b/.git_disabled/objects/df/33df23f1c6a85040e5988706132591847a1839 differ diff --git a/.git_disabled/objects/df/51efa3e4802de117c07ef0a36a1b032e77ca5b b/.git_disabled/objects/df/51efa3e4802de117c07ef0a36a1b032e77ca5b new file mode 100755 index 0000000..67653a1 Binary files /dev/null and b/.git_disabled/objects/df/51efa3e4802de117c07ef0a36a1b032e77ca5b differ diff --git a/.git_disabled/objects/df/6cd805b497cfd1fecf0310f6baff46181e08cb b/.git_disabled/objects/df/6cd805b497cfd1fecf0310f6baff46181e08cb new file mode 100755 index 0000000..8c9f6e8 --- /dev/null +++ b/.git_disabled/objects/df/6cd805b497cfd1fecf0310f6baff46181e08cb @@ -0,0 +1,4 @@ +xSn0_6E[Q!=:{dj%aHaIߗzEnDMnr03;IO7_>LAg7(b3W +_ >E QIWŅsT +*K/03#c{#T=qoApTvj WMAnStfP(ѬcװnhRF]Z L`R +$\@TB+0R+flbi"DM&-\׭A׋Dqx[8ssT).ېcyTm^`ݹworY8N혹ĄX!v| +j",%X˰W`_u4E|%|v]gW]{ή>xxMua{lRLB-x67Ń0[?q/6P2D 8<('m =MsK  _)t2v~$rm l,SsCwm ي3^(TF~H_;gB تOťl ũNі{ӱz,.5z)~8S,`ͱ@^c81n\\@WvB0$ƀ@z(h?@ˑ.[fmP Jt/e #A]I&XQ>p;ئ?uAw?oe-]{49L +EҵS:9d2%* S85]#I$7"nA$h ffЇo#<"2 +]HU5nz灻zt#.Ib=kNlI bR&Uo9"Xs2[m;$MW0"kj.2?kDW{so8ا1vG[gW!j<|3_̶n +y;z͎ؓL0kR\@Wuo2q'p \ No newline at end of file diff --git a/.git_disabled/objects/e1/51b19a65d059fe8d392cd415811f3c6deb9903 b/.git_disabled/objects/e1/51b19a65d059fe8d392cd415811f3c6deb9903 new file mode 100755 index 0000000..de60de0 Binary files /dev/null and b/.git_disabled/objects/e1/51b19a65d059fe8d392cd415811f3c6deb9903 differ diff --git a/.git_disabled/objects/e1/55f77b7ed955d3030a6245648aabb539f2ad7b b/.git_disabled/objects/e1/55f77b7ed955d3030a6245648aabb539f2ad7b new file mode 100755 index 0000000..9e9b8dc Binary files /dev/null and b/.git_disabled/objects/e1/55f77b7ed955d3030a6245648aabb539f2ad7b differ diff --git a/.git_disabled/objects/e1/651af24d9b636efa739fa3787fda1ac450b97e b/.git_disabled/objects/e1/651af24d9b636efa739fa3787fda1ac450b97e new file mode 100755 index 0000000..7c06ec1 --- /dev/null +++ b/.git_disabled/objects/e1/651af24d9b636efa739fa3787fda1ac450b97e @@ -0,0 +1,3 @@ +xn@9)A+hJJ$4bmx mF=8 nrSo\Wr#{jfvJrkSy" *OEsF&YE_KrF`(TOBj45O>/TRY/U2Ua4ݿhwh]|qG~yOqİA*W>^!a؁c x^ L".م*X 8 K!r +·?܀LO*QB\k cؙOg0:ܕ .Mz5(36aj2mvzn:٤EB};0̭?ݘh +^8 , '$ݴ6cg~} 7岁ׅ8Un82,빀Gѣm'-Gp%=?{y^U}/Dvee4HHC]ezbJ/N\ \ No newline at end of file diff --git a/.git_disabled/objects/e2/61647b925b5a8e236cd1598f053d0f12597b02 b/.git_disabled/objects/e2/61647b925b5a8e236cd1598f053d0f12597b02 new file mode 100755 index 0000000..bee2d12 Binary files /dev/null and b/.git_disabled/objects/e2/61647b925b5a8e236cd1598f053d0f12597b02 differ diff --git a/.git_disabled/objects/e2/7882e9d0b6ae459c1eb4b9febe106243e85c4c b/.git_disabled/objects/e2/7882e9d0b6ae459c1eb4b9febe106243e85c4c new file mode 100755 index 0000000..06a60b1 Binary files /dev/null and b/.git_disabled/objects/e2/7882e9d0b6ae459c1eb4b9febe106243e85c4c differ diff --git a/.git_disabled/objects/e2/86b6ae81a4655b97cff035e4b16bf05f0e50a4 b/.git_disabled/objects/e2/86b6ae81a4655b97cff035e4b16bf05f0e50a4 new file mode 100755 index 0000000..43b2ff1 Binary files /dev/null and b/.git_disabled/objects/e2/86b6ae81a4655b97cff035e4b16bf05f0e50a4 differ diff --git a/.git_disabled/objects/e2/8943744a1c85a8b40b8548188528d354f2f984 b/.git_disabled/objects/e2/8943744a1c85a8b40b8548188528d354f2f984 new file mode 100755 index 0000000..3862891 Binary files /dev/null and b/.git_disabled/objects/e2/8943744a1c85a8b40b8548188528d354f2f984 differ diff --git a/.git_disabled/objects/e2/93c6bf922bf907e233edc5ca0250ee3a24589e b/.git_disabled/objects/e2/93c6bf922bf907e233edc5ca0250ee3a24589e new file mode 100755 index 0000000..31513a1 Binary files /dev/null and b/.git_disabled/objects/e2/93c6bf922bf907e233edc5ca0250ee3a24589e differ diff --git a/.git_disabled/objects/e2/d95dcb1080bde8db0adad52d853124d39c8b54 b/.git_disabled/objects/e2/d95dcb1080bde8db0adad52d853124d39c8b54 new file mode 100755 index 0000000..6050eda Binary files /dev/null and b/.git_disabled/objects/e2/d95dcb1080bde8db0adad52d853124d39c8b54 differ diff --git a/.git_disabled/objects/e2/ee2efe8f90244f3abbadc75913c2f5b341c86e b/.git_disabled/objects/e2/ee2efe8f90244f3abbadc75913c2f5b341c86e new file mode 100755 index 0000000..53a1696 Binary files /dev/null and b/.git_disabled/objects/e2/ee2efe8f90244f3abbadc75913c2f5b341c86e differ diff --git a/.git_disabled/objects/e3/0cca232629c38cf42df80af91b50d4daeb1f63 b/.git_disabled/objects/e3/0cca232629c38cf42df80af91b50d4daeb1f63 new file mode 100755 index 0000000..fdea01a Binary files /dev/null and b/.git_disabled/objects/e3/0cca232629c38cf42df80af91b50d4daeb1f63 differ diff --git a/.git_disabled/objects/e3/32e4f248a97b545fc7fa5f4c0a3ccfbd71dfe0 b/.git_disabled/objects/e3/32e4f248a97b545fc7fa5f4c0a3ccfbd71dfe0 new file mode 100755 index 0000000..2325545 Binary files /dev/null and b/.git_disabled/objects/e3/32e4f248a97b545fc7fa5f4c0a3ccfbd71dfe0 differ diff --git a/.git_disabled/objects/e3/466a7a21b1b5f47052ab88011f6ed3bb91be90 b/.git_disabled/objects/e3/466a7a21b1b5f47052ab88011f6ed3bb91be90 new file mode 100755 index 0000000..d4416eb Binary files /dev/null and b/.git_disabled/objects/e3/466a7a21b1b5f47052ab88011f6ed3bb91be90 differ diff --git a/.git_disabled/objects/e3/697e7bf8221e9e20df671fdaef5f610b242ab1 b/.git_disabled/objects/e3/697e7bf8221e9e20df671fdaef5f610b242ab1 new file mode 100755 index 0000000..df30ea9 Binary files /dev/null and b/.git_disabled/objects/e3/697e7bf8221e9e20df671fdaef5f610b242ab1 differ diff --git a/.git_disabled/objects/e3/70ca3021d90e26a30817b9ae576b7f111587b1 b/.git_disabled/objects/e3/70ca3021d90e26a30817b9ae576b7f111587b1 new file mode 100755 index 0000000..7929de1 Binary files /dev/null and b/.git_disabled/objects/e3/70ca3021d90e26a30817b9ae576b7f111587b1 differ diff --git a/.git_disabled/objects/e3/7d82a82a882c072cb938a90eb4486b51cdad99 b/.git_disabled/objects/e3/7d82a82a882c072cb938a90eb4486b51cdad99 new file mode 100755 index 0000000..cbe8a06 Binary files /dev/null and b/.git_disabled/objects/e3/7d82a82a882c072cb938a90eb4486b51cdad99 differ diff --git a/.git_disabled/objects/e3/c4b560b6c702d7e3fd528d1646f578328ba81c b/.git_disabled/objects/e3/c4b560b6c702d7e3fd528d1646f578328ba81c new file mode 100755 index 0000000..dd81a0e Binary files /dev/null and b/.git_disabled/objects/e3/c4b560b6c702d7e3fd528d1646f578328ba81c differ diff --git a/.git_disabled/objects/e3/f109db3b55db646842625396b0f76b7218da2e b/.git_disabled/objects/e3/f109db3b55db646842625396b0f76b7218da2e new file mode 100755 index 0000000..7ebb41d Binary files /dev/null and b/.git_disabled/objects/e3/f109db3b55db646842625396b0f76b7218da2e differ diff --git a/.git_disabled/objects/e4/092696216c520734a671f94217689109d1178a b/.git_disabled/objects/e4/092696216c520734a671f94217689109d1178a new file mode 100755 index 0000000..7f48cd3 --- /dev/null +++ b/.git_disabled/objects/e4/092696216c520734a671f94217689109d1178a @@ -0,0 +1,3 @@ +xR0)P5~ +:zf[BLXYx8!68[y|W٢"//cqa V ƥ@\^Zrc @T,;k7dW@~\X^p]ۖR6y`6.ť:\uCUzf6%hǴ@~깇#**9w_~ϽBB=i?ŝl4End%'ֽ%hwh"J=n BL$cJH?36w>u#M!gҽ!2QuN?M(Ҕ"s'k̥xw v>틺qݣr~Qw+U| +6eeJ$U5e{D?Q߾,i_>,y~Lx?Hx?荭R \ No newline at end of file diff --git a/.git_disabled/objects/e4/0d4d34cabe9427d13a7468938e2f6ccdeb65a8 b/.git_disabled/objects/e4/0d4d34cabe9427d13a7468938e2f6ccdeb65a8 new file mode 100755 index 0000000..ec61ecd Binary files /dev/null and b/.git_disabled/objects/e4/0d4d34cabe9427d13a7468938e2f6ccdeb65a8 differ diff --git a/.git_disabled/objects/e4/100d7c25e25588bf2e0ba219e784459685f7e6 b/.git_disabled/objects/e4/100d7c25e25588bf2e0ba219e784459685f7e6 new file mode 100755 index 0000000..31b3e16 Binary files /dev/null and b/.git_disabled/objects/e4/100d7c25e25588bf2e0ba219e784459685f7e6 differ diff --git a/.git_disabled/objects/e4/16e9a7bfabc0db10cfbd5c5ef4847a7a6961f5 b/.git_disabled/objects/e4/16e9a7bfabc0db10cfbd5c5ef4847a7a6961f5 new file mode 100755 index 0000000..22fa4fa Binary files /dev/null and b/.git_disabled/objects/e4/16e9a7bfabc0db10cfbd5c5ef4847a7a6961f5 differ diff --git a/.git_disabled/objects/e4/31c3a03c435522a3161c6ce72596692bb6cbdb b/.git_disabled/objects/e4/31c3a03c435522a3161c6ce72596692bb6cbdb new file mode 100755 index 0000000..0898a4a1 Binary files /dev/null and b/.git_disabled/objects/e4/31c3a03c435522a3161c6ce72596692bb6cbdb differ diff --git a/.git_disabled/objects/e4/4050abe325af032f3aa10070df753947ed2117 b/.git_disabled/objects/e4/4050abe325af032f3aa10070df753947ed2117 new file mode 100755 index 0000000..6f44264 Binary files /dev/null and b/.git_disabled/objects/e4/4050abe325af032f3aa10070df753947ed2117 differ diff --git a/.git_disabled/objects/e4/406d62322854379aa16575c699e69709463940 b/.git_disabled/objects/e4/406d62322854379aa16575c699e69709463940 new file mode 100755 index 0000000..f7daf7f Binary files /dev/null and b/.git_disabled/objects/e4/406d62322854379aa16575c699e69709463940 differ diff --git a/.git_disabled/objects/e4/6125399d29d7cfe4e61319285ec2fc1c3ba752 b/.git_disabled/objects/e4/6125399d29d7cfe4e61319285ec2fc1c3ba752 new file mode 100755 index 0000000..baad116 Binary files /dev/null and b/.git_disabled/objects/e4/6125399d29d7cfe4e61319285ec2fc1c3ba752 differ diff --git a/.git_disabled/objects/e4/77ab67f09f98a0b105c02b28ca6dd127831d9d b/.git_disabled/objects/e4/77ab67f09f98a0b105c02b28ca6dd127831d9d new file mode 100755 index 0000000..4c1410e Binary files /dev/null and b/.git_disabled/objects/e4/77ab67f09f98a0b105c02b28ca6dd127831d9d differ diff --git a/.git_disabled/objects/e4/7c5c0fdac8f26a493c19fce257655d570f1b52 b/.git_disabled/objects/e4/7c5c0fdac8f26a493c19fce257655d570f1b52 new file mode 100755 index 0000000..69e31c7 Binary files /dev/null and b/.git_disabled/objects/e4/7c5c0fdac8f26a493c19fce257655d570f1b52 differ diff --git a/.git_disabled/objects/e4/8b51aceea697b625f312f71599adff005a72da b/.git_disabled/objects/e4/8b51aceea697b625f312f71599adff005a72da new file mode 100755 index 0000000..875a54d Binary files /dev/null and b/.git_disabled/objects/e4/8b51aceea697b625f312f71599adff005a72da differ diff --git a/.git_disabled/objects/e4/8f0c6fd3ab82807eaef838c6f57a11701dabb9 b/.git_disabled/objects/e4/8f0c6fd3ab82807eaef838c6f57a11701dabb9 new file mode 100755 index 0000000..21011b3 Binary files /dev/null and b/.git_disabled/objects/e4/8f0c6fd3ab82807eaef838c6f57a11701dabb9 differ diff --git a/.git_disabled/objects/e4/952c2c914d5735a3b2e7fe71254a65d5350c26 b/.git_disabled/objects/e4/952c2c914d5735a3b2e7fe71254a65d5350c26 new file mode 100755 index 0000000..08c2fa7 Binary files /dev/null and b/.git_disabled/objects/e4/952c2c914d5735a3b2e7fe71254a65d5350c26 differ diff --git a/.git_disabled/objects/e4/99efa91aaf6adb3930aa3c962bb2bd17efe66d b/.git_disabled/objects/e4/99efa91aaf6adb3930aa3c962bb2bd17efe66d new file mode 100755 index 0000000..536e8b7 Binary files /dev/null and b/.git_disabled/objects/e4/99efa91aaf6adb3930aa3c962bb2bd17efe66d differ diff --git a/.git_disabled/objects/e4/9d28be9afb90e49e5acb255c1ed7b82b369c53 b/.git_disabled/objects/e4/9d28be9afb90e49e5acb255c1ed7b82b369c53 new file mode 100755 index 0000000..27c7244 Binary files /dev/null and b/.git_disabled/objects/e4/9d28be9afb90e49e5acb255c1ed7b82b369c53 differ diff --git a/.git_disabled/objects/e4/a6299ffaf87f86a5ab0f1332c5425343cc66ac b/.git_disabled/objects/e4/a6299ffaf87f86a5ab0f1332c5425343cc66ac new file mode 100755 index 0000000..1f5d4ca Binary files /dev/null and b/.git_disabled/objects/e4/a6299ffaf87f86a5ab0f1332c5425343cc66ac differ diff --git a/.git_disabled/objects/e4/abfb75880defec8ec007960f9d0c81dd31b5bd b/.git_disabled/objects/e4/abfb75880defec8ec007960f9d0c81dd31b5bd new file mode 100755 index 0000000..6ead0bf Binary files /dev/null and b/.git_disabled/objects/e4/abfb75880defec8ec007960f9d0c81dd31b5bd differ diff --git a/.git_disabled/objects/e4/b5011c6cc1aae3161fc596da98aaa17035000f b/.git_disabled/objects/e4/b5011c6cc1aae3161fc596da98aaa17035000f new file mode 100755 index 0000000..6b71c79 Binary files /dev/null and b/.git_disabled/objects/e4/b5011c6cc1aae3161fc596da98aaa17035000f differ diff --git a/.git_disabled/objects/e4/bc6615b7091e9189e7d9fb26d5fc2c62814e89 b/.git_disabled/objects/e4/bc6615b7091e9189e7d9fb26d5fc2c62814e89 new file mode 100755 index 0000000..0286c3b Binary files /dev/null and b/.git_disabled/objects/e4/bc6615b7091e9189e7d9fb26d5fc2c62814e89 differ diff --git a/.git_disabled/objects/e4/c0a14bc43da18fd2984ce026f9e19c875255c0 b/.git_disabled/objects/e4/c0a14bc43da18fd2984ce026f9e19c875255c0 new file mode 100755 index 0000000..6591cd0 Binary files /dev/null and b/.git_disabled/objects/e4/c0a14bc43da18fd2984ce026f9e19c875255c0 differ diff --git a/.git_disabled/objects/e4/c74dbc44594e5d9687c54e06c1d65235453c7a b/.git_disabled/objects/e4/c74dbc44594e5d9687c54e06c1d65235453c7a new file mode 100755 index 0000000..3a51486 --- /dev/null +++ b/.git_disabled/objects/e4/c74dbc44594e5d9687c54e06c1d65235453c7a @@ -0,0 +1,3 @@ +xeRn0dPt m8AP(. J:I%RF K +d&JQ]##u|݋KٻW ɔP)|e_?>M ,kTWÛ;NE[nQ'Ls)%zZH hFaUHr:,ue +.w Ֆ'qk% yb+SGΚ @/ S+ÚbFMh0ё9Ғ[ŜSUџ@}"te"627,ڟ}nrY[=zu:%16}2Uiͅ&)519\Nà@B,Z4  lv\;ݏf7Ǫ2:OTLu$خZv܌tR$Ŗ+)._.n/&eyXBd(`an7B`xTU+2/ͭ )%+  n \ No newline at end of file diff --git a/.git_disabled/objects/e4/e182f86914333e43e35f2282d899081004f0af b/.git_disabled/objects/e4/e182f86914333e43e35f2282d899081004f0af new file mode 100755 index 0000000..575e8bc Binary files /dev/null and b/.git_disabled/objects/e4/e182f86914333e43e35f2282d899081004f0af differ diff --git a/.git_disabled/objects/e4/f7add4ed94dec93d9aedae8ea0eaa70a386a2b b/.git_disabled/objects/e4/f7add4ed94dec93d9aedae8ea0eaa70a386a2b new file mode 100755 index 0000000..0e91245 Binary files /dev/null and b/.git_disabled/objects/e4/f7add4ed94dec93d9aedae8ea0eaa70a386a2b differ diff --git a/.git_disabled/objects/e4/fd6c90374d2f73ce044466bf7396e6314e0482 b/.git_disabled/objects/e4/fd6c90374d2f73ce044466bf7396e6314e0482 new file mode 100755 index 0000000..0c95fec Binary files /dev/null and b/.git_disabled/objects/e4/fd6c90374d2f73ce044466bf7396e6314e0482 differ diff --git a/.git_disabled/objects/e5/05258aa22dbe599950ba929d8f7ae600074eab b/.git_disabled/objects/e5/05258aa22dbe599950ba929d8f7ae600074eab new file mode 100755 index 0000000..f752004 Binary files /dev/null and b/.git_disabled/objects/e5/05258aa22dbe599950ba929d8f7ae600074eab differ diff --git a/.git_disabled/objects/e5/2798fbd3df55e962d0cfea4934e975a080c64e b/.git_disabled/objects/e5/2798fbd3df55e962d0cfea4934e975a080c64e new file mode 100755 index 0000000..b159f48 Binary files /dev/null and b/.git_disabled/objects/e5/2798fbd3df55e962d0cfea4934e975a080c64e differ diff --git a/.git_disabled/objects/e5/64d1e1ac377daf247664b8239b974bf6741307 b/.git_disabled/objects/e5/64d1e1ac377daf247664b8239b974bf6741307 new file mode 100755 index 0000000..322189f Binary files /dev/null and b/.git_disabled/objects/e5/64d1e1ac377daf247664b8239b974bf6741307 differ diff --git a/.git_disabled/objects/e5/6abe24822fc4dd402c8f638d0900f6240e9ab6 b/.git_disabled/objects/e5/6abe24822fc4dd402c8f638d0900f6240e9ab6 new file mode 100755 index 0000000..c73f964 Binary files /dev/null and b/.git_disabled/objects/e5/6abe24822fc4dd402c8f638d0900f6240e9ab6 differ diff --git a/.git_disabled/objects/e5/86193a2ffd9bb10fa1cbf7e751b07c66c62585 b/.git_disabled/objects/e5/86193a2ffd9bb10fa1cbf7e751b07c66c62585 new file mode 100755 index 0000000..4d67b01 Binary files /dev/null and b/.git_disabled/objects/e5/86193a2ffd9bb10fa1cbf7e751b07c66c62585 differ diff --git a/.git_disabled/objects/e5/97f616b120978a68432bf79f6cf0d053b46b34 b/.git_disabled/objects/e5/97f616b120978a68432bf79f6cf0d053b46b34 new file mode 100755 index 0000000..1a81d9b Binary files /dev/null and b/.git_disabled/objects/e5/97f616b120978a68432bf79f6cf0d053b46b34 differ diff --git a/.git_disabled/objects/e5/b15f4b3b1945e819664ac5e169a9530837b283 b/.git_disabled/objects/e5/b15f4b3b1945e819664ac5e169a9530837b283 new file mode 100755 index 0000000..e38e04f Binary files /dev/null and b/.git_disabled/objects/e5/b15f4b3b1945e819664ac5e169a9530837b283 differ diff --git a/.git_disabled/objects/e5/c4e08a56f5081e87103f38b4add6ce1b730204 b/.git_disabled/objects/e5/c4e08a56f5081e87103f38b4add6ce1b730204 new file mode 100755 index 0000000..e2a4239 Binary files /dev/null and b/.git_disabled/objects/e5/c4e08a56f5081e87103f38b4add6ce1b730204 differ diff --git a/.git_disabled/objects/e5/cac72343fdc05cec979ccd08c44899f68c44de b/.git_disabled/objects/e5/cac72343fdc05cec979ccd08c44899f68c44de new file mode 100755 index 0000000..eb0a1d1 Binary files /dev/null and b/.git_disabled/objects/e5/cac72343fdc05cec979ccd08c44899f68c44de differ diff --git a/.git_disabled/objects/e5/cd372c66aa4a749340891086e05437ae228693 b/.git_disabled/objects/e5/cd372c66aa4a749340891086e05437ae228693 new file mode 100755 index 0000000..32ba0a2 Binary files /dev/null and b/.git_disabled/objects/e5/cd372c66aa4a749340891086e05437ae228693 differ diff --git a/.git_disabled/objects/e6/54a61941dfd3ca95610a2b3aa4317ee23e0f0d b/.git_disabled/objects/e6/54a61941dfd3ca95610a2b3aa4317ee23e0f0d new file mode 100755 index 0000000..872a534 Binary files /dev/null and b/.git_disabled/objects/e6/54a61941dfd3ca95610a2b3aa4317ee23e0f0d differ diff --git a/.git_disabled/objects/e6/73d4cc1b1dd7e7ecdbde91fd6ada386c3de03f b/.git_disabled/objects/e6/73d4cc1b1dd7e7ecdbde91fd6ada386c3de03f new file mode 100755 index 0000000..12bbad1 Binary files /dev/null and b/.git_disabled/objects/e6/73d4cc1b1dd7e7ecdbde91fd6ada386c3de03f differ diff --git a/.git_disabled/objects/e6/80e9339bea134a6ed6935806f7dc7f1ca54e94 b/.git_disabled/objects/e6/80e9339bea134a6ed6935806f7dc7f1ca54e94 new file mode 100755 index 0000000..f0ebf19 Binary files /dev/null and b/.git_disabled/objects/e6/80e9339bea134a6ed6935806f7dc7f1ca54e94 differ diff --git a/.git_disabled/objects/e6/90122a3e379ca72447232f621dea569dda11ce b/.git_disabled/objects/e6/90122a3e379ca72447232f621dea569dda11ce new file mode 100755 index 0000000..57ba5f7 Binary files /dev/null and b/.git_disabled/objects/e6/90122a3e379ca72447232f621dea569dda11ce differ diff --git a/.git_disabled/objects/e6/9bc64524d7539bc54d41c99093a7ec9669349b b/.git_disabled/objects/e6/9bc64524d7539bc54d41c99093a7ec9669349b new file mode 100755 index 0000000..275b933 Binary files /dev/null and b/.git_disabled/objects/e6/9bc64524d7539bc54d41c99093a7ec9669349b differ diff --git a/.git_disabled/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 b/.git_disabled/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 new file mode 100755 index 0000000..7112238 Binary files /dev/null and b/.git_disabled/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 differ diff --git a/.git_disabled/objects/e6/a2961b9af8c9d52595c8cb916762cc2475365f b/.git_disabled/objects/e6/a2961b9af8c9d52595c8cb916762cc2475365f new file mode 100755 index 0000000..2de9dc4 Binary files /dev/null and b/.git_disabled/objects/e6/a2961b9af8c9d52595c8cb916762cc2475365f differ diff --git a/.git_disabled/objects/e6/bc29521ab1d9072a5c4010edad5ae9868476b2 b/.git_disabled/objects/e6/bc29521ab1d9072a5c4010edad5ae9868476b2 new file mode 100755 index 0000000..5a47599 Binary files /dev/null and b/.git_disabled/objects/e6/bc29521ab1d9072a5c4010edad5ae9868476b2 differ diff --git a/.git_disabled/objects/e6/be2056c1b72524c60f1827a71b74799cab2adb b/.git_disabled/objects/e6/be2056c1b72524c60f1827a71b74799cab2adb new file mode 100755 index 0000000..5f41a64 Binary files /dev/null and b/.git_disabled/objects/e6/be2056c1b72524c60f1827a71b74799cab2adb differ diff --git a/.git_disabled/objects/e6/c26a99a6657f79ac6f41fdace68619b2cc84ef b/.git_disabled/objects/e6/c26a99a6657f79ac6f41fdace68619b2cc84ef new file mode 100755 index 0000000..f6a6627 Binary files /dev/null and b/.git_disabled/objects/e6/c26a99a6657f79ac6f41fdace68619b2cc84ef differ diff --git a/.git_disabled/objects/e6/c325aa985d39a2bfa9ce1500acb1ca380793d3 b/.git_disabled/objects/e6/c325aa985d39a2bfa9ce1500acb1ca380793d3 new file mode 100755 index 0000000..dc6fee1 Binary files /dev/null and b/.git_disabled/objects/e6/c325aa985d39a2bfa9ce1500acb1ca380793d3 differ diff --git a/.git_disabled/objects/e6/d6d709852b137a862cfe2b3af42dc790fa705d b/.git_disabled/objects/e6/d6d709852b137a862cfe2b3af42dc790fa705d new file mode 100755 index 0000000..b9bd1fb Binary files /dev/null and b/.git_disabled/objects/e6/d6d709852b137a862cfe2b3af42dc790fa705d differ diff --git a/.git_disabled/objects/e6/ea9ced9f614a516079c903043c42c6c44c5e57 b/.git_disabled/objects/e6/ea9ced9f614a516079c903043c42c6c44c5e57 new file mode 100755 index 0000000..d02b4f6 Binary files /dev/null and b/.git_disabled/objects/e6/ea9ced9f614a516079c903043c42c6c44c5e57 differ diff --git a/.git_disabled/objects/e7/329bba002d93708ff02756d42ced27a54bf6a4 b/.git_disabled/objects/e7/329bba002d93708ff02756d42ced27a54bf6a4 new file mode 100755 index 0000000..fcc3638 Binary files /dev/null and b/.git_disabled/objects/e7/329bba002d93708ff02756d42ced27a54bf6a4 differ diff --git a/.git_disabled/objects/e7/37d668afc9ce1d4b8269cd072b875e86640ed7 b/.git_disabled/objects/e7/37d668afc9ce1d4b8269cd072b875e86640ed7 new file mode 100755 index 0000000..29de4ab Binary files /dev/null and b/.git_disabled/objects/e7/37d668afc9ce1d4b8269cd072b875e86640ed7 differ diff --git a/.git_disabled/objects/e7/435c13d65cbec86056765de44eecf00c75ea1f b/.git_disabled/objects/e7/435c13d65cbec86056765de44eecf00c75ea1f new file mode 100755 index 0000000..93e84ce Binary files /dev/null and b/.git_disabled/objects/e7/435c13d65cbec86056765de44eecf00c75ea1f differ diff --git a/.git_disabled/objects/e7/444ef90426af68fd99569aef260ab6656f07b8 b/.git_disabled/objects/e7/444ef90426af68fd99569aef260ab6656f07b8 new file mode 100755 index 0000000..2d6bd65 Binary files /dev/null and b/.git_disabled/objects/e7/444ef90426af68fd99569aef260ab6656f07b8 differ diff --git a/.git_disabled/objects/e7/5db0c03912bd152a0561cb050311a131ffde74 b/.git_disabled/objects/e7/5db0c03912bd152a0561cb050311a131ffde74 new file mode 100755 index 0000000..e910c7b Binary files /dev/null and b/.git_disabled/objects/e7/5db0c03912bd152a0561cb050311a131ffde74 differ diff --git a/.git_disabled/objects/e7/666ed31d88eca0478b19d70238ead0b9541138 b/.git_disabled/objects/e7/666ed31d88eca0478b19d70238ead0b9541138 new file mode 100755 index 0000000..9998c3c Binary files /dev/null and b/.git_disabled/objects/e7/666ed31d88eca0478b19d70238ead0b9541138 differ diff --git a/.git_disabled/objects/e7/b8dfb1b2a60bd50538bec9f876511b9cac21e3 b/.git_disabled/objects/e7/b8dfb1b2a60bd50538bec9f876511b9cac21e3 new file mode 100755 index 0000000..55813be Binary files /dev/null and b/.git_disabled/objects/e7/b8dfb1b2a60bd50538bec9f876511b9cac21e3 differ diff --git a/.git_disabled/objects/e7/bef6bc5b6615da156334cbdc8e3c9dfce91c36 b/.git_disabled/objects/e7/bef6bc5b6615da156334cbdc8e3c9dfce91c36 new file mode 100755 index 0000000..56aa3fc Binary files /dev/null and b/.git_disabled/objects/e7/bef6bc5b6615da156334cbdc8e3c9dfce91c36 differ diff --git a/.git_disabled/objects/e7/c0e8c34f81c8b03f7087c50a0683ae0eaea0f0 b/.git_disabled/objects/e7/c0e8c34f81c8b03f7087c50a0683ae0eaea0f0 new file mode 100755 index 0000000..595b11f Binary files /dev/null and b/.git_disabled/objects/e7/c0e8c34f81c8b03f7087c50a0683ae0eaea0f0 differ diff --git a/.git_disabled/objects/e7/cd6369aa060fb2ed7c063fdec9da4fb8929bc2 b/.git_disabled/objects/e7/cd6369aa060fb2ed7c063fdec9da4fb8929bc2 new file mode 100755 index 0000000..d72a818 --- /dev/null +++ b/.git_disabled/objects/e7/cd6369aa060fb2ed7c063fdec9da4fb8929bc2 @@ -0,0 +1,2 @@ +x}@ =S +Ra< {ڃ ^YFH` 3[*,xMߟ,ˑ \51O@`r0(n[d&bCLJu7?ArP>T1$&pKI8Q}ɕDHA5y/-zҭf<Ӑ5٠+;JTP6?ewu; \ No newline at end of file diff --git a/.git_disabled/objects/e7/d48ea4a9cbbb8a7bba7882486db93ef8f0fa0a b/.git_disabled/objects/e7/d48ea4a9cbbb8a7bba7882486db93ef8f0fa0a new file mode 100755 index 0000000..cd8d45b Binary files /dev/null and b/.git_disabled/objects/e7/d48ea4a9cbbb8a7bba7882486db93ef8f0fa0a differ diff --git a/.git_disabled/objects/e7/e0b87764c929c13fa01aa976b53db89562edfd b/.git_disabled/objects/e7/e0b87764c929c13fa01aa976b53db89562edfd new file mode 100755 index 0000000..f28f1d8 Binary files /dev/null and b/.git_disabled/objects/e7/e0b87764c929c13fa01aa976b53db89562edfd differ diff --git a/.git_disabled/objects/e7/e92471d7c841ec23f7e81a147b33ffb91b8913 b/.git_disabled/objects/e7/e92471d7c841ec23f7e81a147b33ffb91b8913 new file mode 100755 index 0000000..626227c Binary files /dev/null and b/.git_disabled/objects/e7/e92471d7c841ec23f7e81a147b33ffb91b8913 differ diff --git a/.git_disabled/objects/e7/eec25ed1627746610756b060b683fddd13f026 b/.git_disabled/objects/e7/eec25ed1627746610756b060b683fddd13f026 new file mode 100755 index 0000000..c3744e6 --- /dev/null +++ b/.git_disabled/objects/e7/eec25ed1627746610756b060b683fddd13f026 @@ -0,0 +1,3 @@ +xMo0 w "nط:`vYS1 LBd)Gڟ?)nqNlQ|H|]sYCZ$,Ɋ0Il Y^EQVGB3)3=lYi Q;t㋤b%#.)˜Cj*T%F*a.s궥N>|T{6,LkQ7԰1T!CJuHQFq/Zp cvs*#[Ԧ/ f!E2ur&dXϱ2b] J +ʜ'>DgwR7c$w= y?b\dȉe'&[TT3j (ˣ(}M CmέyHQ9, vjIVU%;7Lt(va@\UrpE +>业:\+QΩc8ѠӈYB3"Ig?>2ߜw}߉x \ No newline at end of file diff --git a/.git_disabled/objects/e7/fa31b6f3f78deb1022c1f7927f07d4d16da822 b/.git_disabled/objects/e7/fa31b6f3f78deb1022c1f7927f07d4d16da822 new file mode 100755 index 0000000..f7cd92e Binary files /dev/null and b/.git_disabled/objects/e7/fa31b6f3f78deb1022c1f7927f07d4d16da822 differ diff --git a/.git_disabled/objects/e8/120eb4a4e47b4f8dea6caf279f6494f8e86cad b/.git_disabled/objects/e8/120eb4a4e47b4f8dea6caf279f6494f8e86cad new file mode 100755 index 0000000..e7cad76 --- /dev/null +++ b/.git_disabled/objects/e8/120eb4a4e47b4f8dea6caf279f6494f8e86cad @@ -0,0 +1 @@ +x]@{B3M&߹(-. DF@ qkMHD/Fas>朓iʦtCn`끥#W J!H- 4 `$i뙤ɜ$_@̖$'Z=L=KԸgs9HHΈ'opAJAM'>NI_&XD8&"͙3dg% <,  2iBK'VM(XCIJ4D2&_Ge! 'Fw%|ޯΩ^>.U5n.u||)ӖS0O@9b5q}u2c[s n>JU@FMd3ɡJdmr냏0KKjS iasӽy܊tOlu.}ӎHGEfcME%rĪ8Uubﶎj:wDNl#Rš5y#uby&&wDK`y`:|\!eb ݚ7`Oؒ/⏨NkⵈL^'ubDN#ubn.xG[ĿԒ \ No newline at end of file diff --git a/.git_disabled/objects/e8/2f1e51ba9f37a44a9a1ade03390bffd9a7261f b/.git_disabled/objects/e8/2f1e51ba9f37a44a9a1ade03390bffd9a7261f new file mode 100755 index 0000000..64594a1 Binary files /dev/null and b/.git_disabled/objects/e8/2f1e51ba9f37a44a9a1ade03390bffd9a7261f differ diff --git a/.git_disabled/objects/e8/3040be1fd235ed71f298cc6c911d8ca47c605a b/.git_disabled/objects/e8/3040be1fd235ed71f298cc6c911d8ca47c605a new file mode 100755 index 0000000..ebec3a4 Binary files /dev/null and b/.git_disabled/objects/e8/3040be1fd235ed71f298cc6c911d8ca47c605a differ diff --git a/.git_disabled/objects/e8/3ad70a5f868265e9b1edaf27cd26feddfdf153 b/.git_disabled/objects/e8/3ad70a5f868265e9b1edaf27cd26feddfdf153 new file mode 100755 index 0000000..96e69e8 Binary files /dev/null and b/.git_disabled/objects/e8/3ad70a5f868265e9b1edaf27cd26feddfdf153 differ diff --git a/.git_disabled/objects/e8/4be08bbc17d4c021d3f68566b9bd72119e4232 b/.git_disabled/objects/e8/4be08bbc17d4c021d3f68566b9bd72119e4232 new file mode 100755 index 0000000..c7c209b Binary files /dev/null and b/.git_disabled/objects/e8/4be08bbc17d4c021d3f68566b9bd72119e4232 differ diff --git a/.git_disabled/objects/e8/4ddebb21273e1d90e8326455ecacc765681d6a b/.git_disabled/objects/e8/4ddebb21273e1d90e8326455ecacc765681d6a new file mode 100755 index 0000000..748a2e1 Binary files /dev/null and b/.git_disabled/objects/e8/4ddebb21273e1d90e8326455ecacc765681d6a differ diff --git a/.git_disabled/objects/e8/4e98d9e98a89ed3aeb7f65c72d03ebd0b7c453 b/.git_disabled/objects/e8/4e98d9e98a89ed3aeb7f65c72d03ebd0b7c453 new file mode 100755 index 0000000..e09fdcb Binary files /dev/null and b/.git_disabled/objects/e8/4e98d9e98a89ed3aeb7f65c72d03ebd0b7c453 differ diff --git a/.git_disabled/objects/e8/5d9812e8f50de1467d4a2671e015a15a198e18 b/.git_disabled/objects/e8/5d9812e8f50de1467d4a2671e015a15a198e18 new file mode 100755 index 0000000..3944cba Binary files /dev/null and b/.git_disabled/objects/e8/5d9812e8f50de1467d4a2671e015a15a198e18 differ diff --git a/.git_disabled/objects/e8/811a9d6a9906728bdf9bfa8893b5d5a4ea8140 b/.git_disabled/objects/e8/811a9d6a9906728bdf9bfa8893b5d5a4ea8140 new file mode 100755 index 0000000..bd07e24 Binary files /dev/null and b/.git_disabled/objects/e8/811a9d6a9906728bdf9bfa8893b5d5a4ea8140 differ diff --git a/.git_disabled/objects/e8/827c4355652676a23b1d4fd1f2258aa7afd9dc b/.git_disabled/objects/e8/827c4355652676a23b1d4fd1f2258aa7afd9dc new file mode 100755 index 0000000..fba0c12 Binary files /dev/null and b/.git_disabled/objects/e8/827c4355652676a23b1d4fd1f2258aa7afd9dc differ diff --git a/.git_disabled/objects/e8/850f9f403e2eb2d8a3e502336a6f03bdaa7dc7 b/.git_disabled/objects/e8/850f9f403e2eb2d8a3e502336a6f03bdaa7dc7 new file mode 100755 index 0000000..cb0c1b5 Binary files /dev/null and b/.git_disabled/objects/e8/850f9f403e2eb2d8a3e502336a6f03bdaa7dc7 differ diff --git a/.git_disabled/objects/e8/86db4392fdc33828d3c59952409faa84a19edd b/.git_disabled/objects/e8/86db4392fdc33828d3c59952409faa84a19edd new file mode 100755 index 0000000..0d5984a --- /dev/null +++ b/.git_disabled/objects/e8/86db4392fdc33828d3c59952409faa84a19edd @@ -0,0 +1,4 @@ +xTj0s⢾إu4PX0hб=":%OR&cOc$;MB Ēν莄Ah0x(fJgA,jLS.ꨘwx^(mZ` +& mڃtwh Wƻ +Q2L[AUq9 gO>^2xN'.Vp㽱8G;QIRS0 [M\ | !d(XQ.E|YA4`_Ԩ R~KܖK0rU9kzo~'9ːNNTbT ?D_;?sӜI1 .>B;eJ(U N9c&7_Diӹ:z>s +~7qdNg%23cN[w̶y8km_D3n'N󕡃=HFNn1w>hXt/PbQ@K c5:K ~2a4ƠöUk7>4Ch7-Mn24F8@: >rc `3ƭ&LFr/Di*NSB}O+Œ!y9lh$_ӌUsKYAq9-ZH8jJ#^:Biθ4Wm9S4kĭvk \ No newline at end of file diff --git a/.git_disabled/objects/e8/8ab6ca8d31f2e43731b8af023e80384d5c8703 b/.git_disabled/objects/e8/8ab6ca8d31f2e43731b8af023e80384d5c8703 new file mode 100755 index 0000000..e74278e Binary files /dev/null and b/.git_disabled/objects/e8/8ab6ca8d31f2e43731b8af023e80384d5c8703 differ diff --git a/.git_disabled/objects/e8/935579c7fee5fd114591756f4ffdad08fb825f b/.git_disabled/objects/e8/935579c7fee5fd114591756f4ffdad08fb825f new file mode 100755 index 0000000..0e785f8 Binary files /dev/null and b/.git_disabled/objects/e8/935579c7fee5fd114591756f4ffdad08fb825f differ diff --git a/.git_disabled/objects/e8/9a00a837f1031464fc7fc5d9fc74d56a89d815 b/.git_disabled/objects/e8/9a00a837f1031464fc7fc5d9fc74d56a89d815 new file mode 100755 index 0000000..7a6d661 Binary files /dev/null and b/.git_disabled/objects/e8/9a00a837f1031464fc7fc5d9fc74d56a89d815 differ diff --git a/.git_disabled/objects/e8/a13e5ecf647179aa75920b0216120067777538 b/.git_disabled/objects/e8/a13e5ecf647179aa75920b0216120067777538 new file mode 100755 index 0000000..f37546f Binary files /dev/null and b/.git_disabled/objects/e8/a13e5ecf647179aa75920b0216120067777538 differ diff --git a/.git_disabled/objects/e8/a1432b4c75f23c9a7e9f8a8d8aa1fe062feeac b/.git_disabled/objects/e8/a1432b4c75f23c9a7e9f8a8d8aa1fe062feeac new file mode 100755 index 0000000..c6cf059 Binary files /dev/null and b/.git_disabled/objects/e8/a1432b4c75f23c9a7e9f8a8d8aa1fe062feeac differ diff --git a/.git_disabled/objects/e8/a9ce268d9e44c0f98b12bcec964488a0b3c593 b/.git_disabled/objects/e8/a9ce268d9e44c0f98b12bcec964488a0b3c593 new file mode 100755 index 0000000..5699042 Binary files /dev/null and b/.git_disabled/objects/e8/a9ce268d9e44c0f98b12bcec964488a0b3c593 differ diff --git a/.git_disabled/objects/e8/b81377014473a8c8934ef682d67c7bec065090 b/.git_disabled/objects/e8/b81377014473a8c8934ef682d67c7bec065090 new file mode 100755 index 0000000..bc00b96 Binary files /dev/null and b/.git_disabled/objects/e8/b81377014473a8c8934ef682d67c7bec065090 differ diff --git a/.git_disabled/objects/e8/bc2471bad1d49b80620e1e29d77bb3652f35b2 b/.git_disabled/objects/e8/bc2471bad1d49b80620e1e29d77bb3652f35b2 new file mode 100755 index 0000000..570e46f Binary files /dev/null and b/.git_disabled/objects/e8/bc2471bad1d49b80620e1e29d77bb3652f35b2 differ diff --git a/.git_disabled/objects/e8/bd4e0e0562116673b6c4fc4503fad3ca57e044 b/.git_disabled/objects/e8/bd4e0e0562116673b6c4fc4503fad3ca57e044 new file mode 100755 index 0000000..ae35cf7 Binary files /dev/null and b/.git_disabled/objects/e8/bd4e0e0562116673b6c4fc4503fad3ca57e044 differ diff --git a/.git_disabled/objects/e8/c48da666533a36011f4ac57a7d3742926f66ba b/.git_disabled/objects/e8/c48da666533a36011f4ac57a7d3742926f66ba new file mode 100755 index 0000000..f45d95f Binary files /dev/null and b/.git_disabled/objects/e8/c48da666533a36011f4ac57a7d3742926f66ba differ diff --git a/.git_disabled/objects/e8/cbe9ed0e76ff030f2b46f4f69723a18c47a66a b/.git_disabled/objects/e8/cbe9ed0e76ff030f2b46f4f69723a18c47a66a new file mode 100755 index 0000000..dd40608 Binary files /dev/null and b/.git_disabled/objects/e8/cbe9ed0e76ff030f2b46f4f69723a18c47a66a differ diff --git a/.git_disabled/objects/e8/d4f2fabb22c903fb24670227964ddb5d43440c b/.git_disabled/objects/e8/d4f2fabb22c903fb24670227964ddb5d43440c new file mode 100755 index 0000000..f28ce1f Binary files /dev/null and b/.git_disabled/objects/e8/d4f2fabb22c903fb24670227964ddb5d43440c differ diff --git a/.git_disabled/objects/e8/d55dc1ad807869be8b87da44ae606393cb695c b/.git_disabled/objects/e8/d55dc1ad807869be8b87da44ae606393cb695c new file mode 100755 index 0000000..7eabd4e Binary files /dev/null and b/.git_disabled/objects/e8/d55dc1ad807869be8b87da44ae606393cb695c differ diff --git a/.git_disabled/objects/e8/d893d013afa3346372ee44be89aca31ee56bab b/.git_disabled/objects/e8/d893d013afa3346372ee44be89aca31ee56bab new file mode 100755 index 0000000..ac4c07a Binary files /dev/null and b/.git_disabled/objects/e8/d893d013afa3346372ee44be89aca31ee56bab differ diff --git a/.git_disabled/objects/e8/e73a235b6bf13e4121bb72773b1cbb795a831c b/.git_disabled/objects/e8/e73a235b6bf13e4121bb72773b1cbb795a831c new file mode 100755 index 0000000..e10601c --- /dev/null +++ b/.git_disabled/objects/e8/e73a235b6bf13e4121bb72773b1cbb795a831c @@ -0,0 +1 @@ +xInpF(egpU*ɒe`uD#xLVsr,Y>/}`/ғղ ;w^ijl~{^k KŵW, 4@Hi 4@Hi 4@Hi 4@6~7*0)L1! *jf0 t004PC+f0 t004PC f0 t004PC3f0 t004PCf0 t004PC#f0 t004PC|4@Hi 4@Hi 4@ 茪wӶO޴} >f{U+KE;/m3Om?#m?}=wm߱}6OF~E۶oپi붯پj{ۗm_}m]>k;PCQ(P{(=bECQ(P{ ؃{bRA=H) ؃{bRA=H) d=H) ؃{bRA=H) ؃{b@=>z AփYd=z A=0\7:w \ No newline at end of file diff --git a/.git_disabled/objects/e8/eea012257becd582f199eb620b18f26ec3328a b/.git_disabled/objects/e8/eea012257becd582f199eb620b18f26ec3328a new file mode 100755 index 0000000..014a5e5 Binary files /dev/null and b/.git_disabled/objects/e8/eea012257becd582f199eb620b18f26ec3328a differ diff --git a/.git_disabled/objects/e9/06ffa412bbb9fb4f4dc94180ccbcb31516aed7 b/.git_disabled/objects/e9/06ffa412bbb9fb4f4dc94180ccbcb31516aed7 new file mode 100755 index 0000000..f93fc8a Binary files /dev/null and b/.git_disabled/objects/e9/06ffa412bbb9fb4f4dc94180ccbcb31516aed7 differ diff --git a/.git_disabled/objects/e9/0a8cd0b1001e81ded91d9f6cdc8ccfaee061cb b/.git_disabled/objects/e9/0a8cd0b1001e81ded91d9f6cdc8ccfaee061cb new file mode 100755 index 0000000..ce27bc3 Binary files /dev/null and b/.git_disabled/objects/e9/0a8cd0b1001e81ded91d9f6cdc8ccfaee061cb differ diff --git a/.git_disabled/objects/e9/10ab1cdab16a642333a9d36ac4df2288000d88 b/.git_disabled/objects/e9/10ab1cdab16a642333a9d36ac4df2288000d88 new file mode 100755 index 0000000..970d5eb Binary files /dev/null and b/.git_disabled/objects/e9/10ab1cdab16a642333a9d36ac4df2288000d88 differ diff --git a/.git_disabled/objects/e9/2395d8935e3847e43210030509f06faf22c4d6 b/.git_disabled/objects/e9/2395d8935e3847e43210030509f06faf22c4d6 new file mode 100755 index 0000000..9cc4f5b Binary files /dev/null and b/.git_disabled/objects/e9/2395d8935e3847e43210030509f06faf22c4d6 differ diff --git a/.git_disabled/objects/e9/3c1b26951a9795591b168d57ec55cd8b68b990 b/.git_disabled/objects/e9/3c1b26951a9795591b168d57ec55cd8b68b990 new file mode 100755 index 0000000..e5f5e30 Binary files /dev/null and b/.git_disabled/objects/e9/3c1b26951a9795591b168d57ec55cd8b68b990 differ diff --git a/.git_disabled/objects/e9/5c1435faa98c84e5d16599f92484bdcb07b30d b/.git_disabled/objects/e9/5c1435faa98c84e5d16599f92484bdcb07b30d new file mode 100755 index 0000000..d696f2e Binary files /dev/null and b/.git_disabled/objects/e9/5c1435faa98c84e5d16599f92484bdcb07b30d differ diff --git a/.git_disabled/objects/e9/6d01c9a0a33ceb4f5df26ea429b9d5d7097d45 b/.git_disabled/objects/e9/6d01c9a0a33ceb4f5df26ea429b9d5d7097d45 new file mode 100755 index 0000000..c005dea Binary files /dev/null and b/.git_disabled/objects/e9/6d01c9a0a33ceb4f5df26ea429b9d5d7097d45 differ diff --git a/.git_disabled/objects/e9/6d6cc9bc97cfc8dc05c4fcf81861f74f9cb408 b/.git_disabled/objects/e9/6d6cc9bc97cfc8dc05c4fcf81861f74f9cb408 new file mode 100755 index 0000000..d5b82d4 Binary files /dev/null and b/.git_disabled/objects/e9/6d6cc9bc97cfc8dc05c4fcf81861f74f9cb408 differ diff --git a/.git_disabled/objects/e9/7342be71b5b2460bd2912132abb2c5868cc746 b/.git_disabled/objects/e9/7342be71b5b2460bd2912132abb2c5868cc746 new file mode 100755 index 0000000..c179ef9 Binary files /dev/null and b/.git_disabled/objects/e9/7342be71b5b2460bd2912132abb2c5868cc746 differ diff --git a/.git_disabled/objects/e9/7c210fb8587452476cd6880487332765cfc953 b/.git_disabled/objects/e9/7c210fb8587452476cd6880487332765cfc953 new file mode 100755 index 0000000..8e22cf0 Binary files /dev/null and b/.git_disabled/objects/e9/7c210fb8587452476cd6880487332765cfc953 differ diff --git a/.git_disabled/objects/e9/9aed6d6a5098d98601814aa9a85ba82e0484d0 b/.git_disabled/objects/e9/9aed6d6a5098d98601814aa9a85ba82e0484d0 new file mode 100755 index 0000000..e82c6b3 Binary files /dev/null and b/.git_disabled/objects/e9/9aed6d6a5098d98601814aa9a85ba82e0484d0 differ diff --git a/.git_disabled/objects/e9/addde071f81758baf350c4ab6bde2556340131 b/.git_disabled/objects/e9/addde071f81758baf350c4ab6bde2556340131 new file mode 100755 index 0000000..cae7518 --- /dev/null +++ b/.git_disabled/objects/e9/addde071f81758baf350c4ab6bde2556340131 @@ -0,0 +1,4 @@ +xuVMo0 ٿBM@w`4[ E*3P[$(9Rb;zz|(K_ؗ˯F"MXU2Y K 0DsHS^2X~X(r +Vk9):lϤ}"ʦvh'Ae]$hqF +契NfGV))̈́&^$5sVkɘɍ<9ߖmcHHq`E,w(X.m]ETdco% dlˠT<⏺lE;ހͮkJacV2ٙ}>;0/`'qx9J$M=7N/K:@W_P? 4} Y.1u R\z۾& .V +{l) Us): $A'GHͩ. ӂF:oɹ 6wZkKE7S,E-Ɣ]<\^)-:̡'}YA7O.;^t0Yl,94Ͷ:_QhVU@műpMixzBK︪Ѡ҉r`J@p~^O^f@z4 Ngcpl>d n<ӗS&~74utyH3u0j8i@fSc|ΈHq3 h`=. \ No newline at end of file diff --git a/.git_disabled/objects/e9/b1629038280a87a5d494ba06bce4c72fa50b01 b/.git_disabled/objects/e9/b1629038280a87a5d494ba06bce4c72fa50b01 new file mode 100755 index 0000000..2927204 Binary files /dev/null and b/.git_disabled/objects/e9/b1629038280a87a5d494ba06bce4c72fa50b01 differ diff --git a/.git_disabled/objects/e9/b2036aaac2774f9d5862a381ee0e5e36641a3d b/.git_disabled/objects/e9/b2036aaac2774f9d5862a381ee0e5e36641a3d new file mode 100755 index 0000000..eba44ad Binary files /dev/null and b/.git_disabled/objects/e9/b2036aaac2774f9d5862a381ee0e5e36641a3d differ diff --git a/.git_disabled/objects/e9/bd671315d48aadfa1ef3c0ff5811f4f485449d b/.git_disabled/objects/e9/bd671315d48aadfa1ef3c0ff5811f4f485449d new file mode 100755 index 0000000..0dd108f Binary files /dev/null and b/.git_disabled/objects/e9/bd671315d48aadfa1ef3c0ff5811f4f485449d differ diff --git a/.git_disabled/objects/e9/c31273cc6c4c1738a1d88c819356844231919f b/.git_disabled/objects/e9/c31273cc6c4c1738a1d88c819356844231919f new file mode 100755 index 0000000..a4f8d17 Binary files /dev/null and b/.git_disabled/objects/e9/c31273cc6c4c1738a1d88c819356844231919f differ diff --git a/.git_disabled/objects/e9/dd1c0b33831ea68f097e934459c6262c9aeeb5 b/.git_disabled/objects/e9/dd1c0b33831ea68f097e934459c6262c9aeeb5 new file mode 100755 index 0000000..e7469b5 Binary files /dev/null and b/.git_disabled/objects/e9/dd1c0b33831ea68f097e934459c6262c9aeeb5 differ diff --git a/.git_disabled/objects/e9/ea2e914b6a32c16d8a10d484f3a5153c1f92c1 b/.git_disabled/objects/e9/ea2e914b6a32c16d8a10d484f3a5153c1f92c1 new file mode 100755 index 0000000..b939eb2 Binary files /dev/null and b/.git_disabled/objects/e9/ea2e914b6a32c16d8a10d484f3a5153c1f92c1 differ diff --git a/.git_disabled/objects/e9/f6fdd6d5690e9bca9e7b6a2ce394aae93d9b04 b/.git_disabled/objects/e9/f6fdd6d5690e9bca9e7b6a2ce394aae93d9b04 new file mode 100755 index 0000000..5ef054f Binary files /dev/null and b/.git_disabled/objects/e9/f6fdd6d5690e9bca9e7b6a2ce394aae93d9b04 differ diff --git a/.git_disabled/objects/ea/1f20d90b1bfbdaebed007acce95ca3585d584c b/.git_disabled/objects/ea/1f20d90b1bfbdaebed007acce95ca3585d584c new file mode 100755 index 0000000..792cfa7 Binary files /dev/null and b/.git_disabled/objects/ea/1f20d90b1bfbdaebed007acce95ca3585d584c differ diff --git a/.git_disabled/objects/ea/2345f77ac0e5d75b6fc47d20819a63c4fd1b23 b/.git_disabled/objects/ea/2345f77ac0e5d75b6fc47d20819a63c4fd1b23 new file mode 100755 index 0000000..a636fd8 Binary files /dev/null and b/.git_disabled/objects/ea/2345f77ac0e5d75b6fc47d20819a63c4fd1b23 differ diff --git a/.git_disabled/objects/ea/31264cd30dc26ee53296caf7d96879b3daa0dc b/.git_disabled/objects/ea/31264cd30dc26ee53296caf7d96879b3daa0dc new file mode 100755 index 0000000..31a8ea0 Binary files /dev/null and b/.git_disabled/objects/ea/31264cd30dc26ee53296caf7d96879b3daa0dc differ diff --git a/.git_disabled/objects/ea/43621efe577662fd2544ab5e9d76d591d0094a b/.git_disabled/objects/ea/43621efe577662fd2544ab5e9d76d591d0094a new file mode 100755 index 0000000..ecde86f Binary files /dev/null and b/.git_disabled/objects/ea/43621efe577662fd2544ab5e9d76d591d0094a differ diff --git a/.git_disabled/objects/ea/453599e29d7653b923b0146844d136bd22fd4b b/.git_disabled/objects/ea/453599e29d7653b923b0146844d136bd22fd4b new file mode 100755 index 0000000..6e9b0b3 Binary files /dev/null and b/.git_disabled/objects/ea/453599e29d7653b923b0146844d136bd22fd4b differ diff --git a/.git_disabled/objects/ea/85c64096b890318b0f4d9dd44f943face060cf b/.git_disabled/objects/ea/85c64096b890318b0f4d9dd44f943face060cf new file mode 100755 index 0000000..9e4a156 Binary files /dev/null and b/.git_disabled/objects/ea/85c64096b890318b0f4d9dd44f943face060cf differ diff --git a/.git_disabled/objects/ea/8ebdfdd2b09be22798ed84ea41cd04b7d88e7b b/.git_disabled/objects/ea/8ebdfdd2b09be22798ed84ea41cd04b7d88e7b new file mode 100755 index 0000000..7446d7b Binary files /dev/null and b/.git_disabled/objects/ea/8ebdfdd2b09be22798ed84ea41cd04b7d88e7b differ diff --git a/.git_disabled/objects/ea/bf10c3ac8523821a609e1127730998c27d4e5f b/.git_disabled/objects/ea/bf10c3ac8523821a609e1127730998c27d4e5f new file mode 100755 index 0000000..b8f55c0 Binary files /dev/null and b/.git_disabled/objects/ea/bf10c3ac8523821a609e1127730998c27d4e5f differ diff --git a/.git_disabled/objects/ea/d012cdbfc51345646910557a25d9b4a29910a6 b/.git_disabled/objects/ea/d012cdbfc51345646910557a25d9b4a29910a6 new file mode 100755 index 0000000..950c514 Binary files /dev/null and b/.git_disabled/objects/ea/d012cdbfc51345646910557a25d9b4a29910a6 differ diff --git a/.git_disabled/objects/ea/db4e818754f184d5f71d82513ff8a3982587e0 b/.git_disabled/objects/ea/db4e818754f184d5f71d82513ff8a3982587e0 new file mode 100755 index 0000000..684bad3 Binary files /dev/null and b/.git_disabled/objects/ea/db4e818754f184d5f71d82513ff8a3982587e0 differ diff --git a/.git_disabled/objects/ea/df72af57ffab2b38ac74b9eecd4400af7149eb b/.git_disabled/objects/ea/df72af57ffab2b38ac74b9eecd4400af7149eb new file mode 100755 index 0000000..8414f0a Binary files /dev/null and b/.git_disabled/objects/ea/df72af57ffab2b38ac74b9eecd4400af7149eb differ diff --git a/.git_disabled/objects/eb/002517595b44c093851692f3e4240976d3565b b/.git_disabled/objects/eb/002517595b44c093851692f3e4240976d3565b new file mode 100755 index 0000000..f5d3010 Binary files /dev/null and b/.git_disabled/objects/eb/002517595b44c093851692f3e4240976d3565b differ diff --git a/.git_disabled/objects/eb/09a2dcaee5acc60283acfbd8965f02a9bfdd9e b/.git_disabled/objects/eb/09a2dcaee5acc60283acfbd8965f02a9bfdd9e new file mode 100755 index 0000000..bbb3473 Binary files /dev/null and b/.git_disabled/objects/eb/09a2dcaee5acc60283acfbd8965f02a9bfdd9e differ diff --git a/.git_disabled/objects/eb/0b32aaec2bfb27ced9fa654abf1043e8d66bfc b/.git_disabled/objects/eb/0b32aaec2bfb27ced9fa654abf1043e8d66bfc new file mode 100755 index 0000000..45f8d2b Binary files /dev/null and b/.git_disabled/objects/eb/0b32aaec2bfb27ced9fa654abf1043e8d66bfc differ diff --git a/.git_disabled/objects/eb/0c53c36f559d00d459b6433972d43c95390ea6 b/.git_disabled/objects/eb/0c53c36f559d00d459b6433972d43c95390ea6 new file mode 100755 index 0000000..a9855cb Binary files /dev/null and b/.git_disabled/objects/eb/0c53c36f559d00d459b6433972d43c95390ea6 differ diff --git a/.git_disabled/objects/eb/0c6cffd6707373698ebd26d5b37c66143b1bd6 b/.git_disabled/objects/eb/0c6cffd6707373698ebd26d5b37c66143b1bd6 new file mode 100755 index 0000000..83dad40 Binary files /dev/null and b/.git_disabled/objects/eb/0c6cffd6707373698ebd26d5b37c66143b1bd6 differ diff --git a/.git_disabled/objects/eb/0f49a6ef51f4536fd72288796923ead48d22c9 b/.git_disabled/objects/eb/0f49a6ef51f4536fd72288796923ead48d22c9 new file mode 100755 index 0000000..6d1e1f9 Binary files /dev/null and b/.git_disabled/objects/eb/0f49a6ef51f4536fd72288796923ead48d22c9 differ diff --git a/.git_disabled/objects/eb/100b478cc1383eeaad53c6fbf39b9cf7c6b2be b/.git_disabled/objects/eb/100b478cc1383eeaad53c6fbf39b9cf7c6b2be new file mode 100755 index 0000000..9be6dde Binary files /dev/null and b/.git_disabled/objects/eb/100b478cc1383eeaad53c6fbf39b9cf7c6b2be differ diff --git a/.git_disabled/objects/eb/218170be144d80ed909c2701548af714819951 b/.git_disabled/objects/eb/218170be144d80ed909c2701548af714819951 new file mode 100755 index 0000000..caa05d9 Binary files /dev/null and b/.git_disabled/objects/eb/218170be144d80ed909c2701548af714819951 differ diff --git a/.git_disabled/objects/eb/343f3d76b9d1353c15fd584ce41bc4614ff905 b/.git_disabled/objects/eb/343f3d76b9d1353c15fd584ce41bc4614ff905 new file mode 100755 index 0000000..2b804e3 Binary files /dev/null and b/.git_disabled/objects/eb/343f3d76b9d1353c15fd584ce41bc4614ff905 differ diff --git a/.git_disabled/objects/eb/3a3b50319b77dea916bc3290e4bcac156c04dc b/.git_disabled/objects/eb/3a3b50319b77dea916bc3290e4bcac156c04dc new file mode 100755 index 0000000..a477422 Binary files /dev/null and b/.git_disabled/objects/eb/3a3b50319b77dea916bc3290e4bcac156c04dc differ diff --git a/.git_disabled/objects/eb/3f97b462dbf59b18cf5aebde636a6ecf70834d b/.git_disabled/objects/eb/3f97b462dbf59b18cf5aebde636a6ecf70834d new file mode 100755 index 0000000..914b42b Binary files /dev/null and b/.git_disabled/objects/eb/3f97b462dbf59b18cf5aebde636a6ecf70834d differ diff --git a/.git_disabled/objects/eb/65060a637121aff029fcb3ee8411c5a5f6c25d b/.git_disabled/objects/eb/65060a637121aff029fcb3ee8411c5a5f6c25d new file mode 100755 index 0000000..54eeb48 Binary files /dev/null and b/.git_disabled/objects/eb/65060a637121aff029fcb3ee8411c5a5f6c25d differ diff --git a/.git_disabled/objects/eb/6a60e5ad3498b3e5b2a6abfedd16d25c785ea9 b/.git_disabled/objects/eb/6a60e5ad3498b3e5b2a6abfedd16d25c785ea9 new file mode 100755 index 0000000..ae5f4d4 Binary files /dev/null and b/.git_disabled/objects/eb/6a60e5ad3498b3e5b2a6abfedd16d25c785ea9 differ diff --git a/.git_disabled/objects/eb/76a244ce4226fe733a6b9d7987609ac204f64e b/.git_disabled/objects/eb/76a244ce4226fe733a6b9d7987609ac204f64e new file mode 100755 index 0000000..6600907 Binary files /dev/null and b/.git_disabled/objects/eb/76a244ce4226fe733a6b9d7987609ac204f64e differ diff --git a/.git_disabled/objects/eb/8f0fa6a95cdb4bd1b4d4811b825e5d3fba247e b/.git_disabled/objects/eb/8f0fa6a95cdb4bd1b4d4811b825e5d3fba247e new file mode 100755 index 0000000..eb654d9 Binary files /dev/null and b/.git_disabled/objects/eb/8f0fa6a95cdb4bd1b4d4811b825e5d3fba247e differ diff --git a/.git_disabled/objects/eb/9cba3459b91e79b9dbc0c00387f75273fa75e3 b/.git_disabled/objects/eb/9cba3459b91e79b9dbc0c00387f75273fa75e3 new file mode 100755 index 0000000..e3ed16b Binary files /dev/null and b/.git_disabled/objects/eb/9cba3459b91e79b9dbc0c00387f75273fa75e3 differ diff --git a/.git_disabled/objects/eb/a1020485019e86f49d7c19863dafb3809d40e7 b/.git_disabled/objects/eb/a1020485019e86f49d7c19863dafb3809d40e7 new file mode 100755 index 0000000..1187137 Binary files /dev/null and b/.git_disabled/objects/eb/a1020485019e86f49d7c19863dafb3809d40e7 differ diff --git a/.git_disabled/objects/eb/b70b57fb38c0741491e458901df0eea45f4ce9 b/.git_disabled/objects/eb/b70b57fb38c0741491e458901df0eea45f4ce9 new file mode 100755 index 0000000..af114bd --- /dev/null +++ b/.git_disabled/objects/eb/b70b57fb38c0741491e458901df0eea45f4ce9 @@ -0,0 +1 @@ +xmk0=W-h7F*[e;8`/i_o_vrǬs6СW@V~8on \ No newline at end of file diff --git a/.git_disabled/objects/eb/c04973cdf51fd45c14fd2f28d85d924de3cbe8 b/.git_disabled/objects/eb/c04973cdf51fd45c14fd2f28d85d924de3cbe8 new file mode 100755 index 0000000..0e7ab41 Binary files /dev/null and b/.git_disabled/objects/eb/c04973cdf51fd45c14fd2f28d85d924de3cbe8 differ diff --git a/.git_disabled/objects/eb/cafcba991ecc41c14ca1718641db9a9f7fa90e b/.git_disabled/objects/eb/cafcba991ecc41c14ca1718641db9a9f7fa90e new file mode 100755 index 0000000..e8d18e3 Binary files /dev/null and b/.git_disabled/objects/eb/cafcba991ecc41c14ca1718641db9a9f7fa90e differ diff --git a/.git_disabled/objects/eb/d33a3b7b169bf5d2ffa8108882109f51b65897 b/.git_disabled/objects/eb/d33a3b7b169bf5d2ffa8108882109f51b65897 new file mode 100755 index 0000000..dfbbfe6 Binary files /dev/null and b/.git_disabled/objects/eb/d33a3b7b169bf5d2ffa8108882109f51b65897 differ diff --git a/.git_disabled/objects/eb/d3a97480c720d418acb1285a7b75da19b62c8c b/.git_disabled/objects/eb/d3a97480c720d418acb1285a7b75da19b62c8c new file mode 100755 index 0000000..70f400e Binary files /dev/null and b/.git_disabled/objects/eb/d3a97480c720d418acb1285a7b75da19b62c8c differ diff --git a/.git_disabled/objects/eb/ed6a8b1b8231cca5b49338ddd416a1cfb365e7 b/.git_disabled/objects/eb/ed6a8b1b8231cca5b49338ddd416a1cfb365e7 new file mode 100755 index 0000000..f05c602 Binary files /dev/null and b/.git_disabled/objects/eb/ed6a8b1b8231cca5b49338ddd416a1cfb365e7 differ diff --git a/.git_disabled/objects/eb/f9acd997b20f694ea8fd5320bd8caf4c36ec24 b/.git_disabled/objects/eb/f9acd997b20f694ea8fd5320bd8caf4c36ec24 new file mode 100755 index 0000000..261590a Binary files /dev/null and b/.git_disabled/objects/eb/f9acd997b20f694ea8fd5320bd8caf4c36ec24 differ diff --git a/.git_disabled/objects/ec/0494651fa8785e1239bcc2b75e72ecb07bae73 b/.git_disabled/objects/ec/0494651fa8785e1239bcc2b75e72ecb07bae73 new file mode 100755 index 0000000..b282d5b Binary files /dev/null and b/.git_disabled/objects/ec/0494651fa8785e1239bcc2b75e72ecb07bae73 differ diff --git a/.git_disabled/objects/ec/0662b08d38abf5997b4c51b20e21bfe8c201b2 b/.git_disabled/objects/ec/0662b08d38abf5997b4c51b20e21bfe8c201b2 new file mode 100755 index 0000000..55b1865 Binary files /dev/null and b/.git_disabled/objects/ec/0662b08d38abf5997b4c51b20e21bfe8c201b2 differ diff --git a/.git_disabled/objects/ec/09dd0525ed8806b76f700a731f3b49e932a5f4 b/.git_disabled/objects/ec/09dd0525ed8806b76f700a731f3b49e932a5f4 new file mode 100755 index 0000000..dc51437 --- /dev/null +++ b/.git_disabled/objects/ec/09dd0525ed8806b76f700a731f3b49e932a5f4 @@ -0,0 +1,2 @@ +xE + E[z(B#EC>ͦ幜s-(%c|;!]cc=$d^wH98ǰЌ\p <Rk!2hE;CC\赭0T?{$ \ No newline at end of file diff --git a/.git_disabled/objects/ec/0cfe7878e4df62def46ed991570cffc614b292 b/.git_disabled/objects/ec/0cfe7878e4df62def46ed991570cffc614b292 new file mode 100755 index 0000000..0a97106 Binary files /dev/null and b/.git_disabled/objects/ec/0cfe7878e4df62def46ed991570cffc614b292 differ diff --git a/.git_disabled/objects/ec/117b1e5addf39a4e824bf88f7e49d261339f94 b/.git_disabled/objects/ec/117b1e5addf39a4e824bf88f7e49d261339f94 new file mode 100755 index 0000000..85bf6f7 Binary files /dev/null and b/.git_disabled/objects/ec/117b1e5addf39a4e824bf88f7e49d261339f94 differ diff --git a/.git_disabled/objects/ec/2f3fbf2c15382b62ffb83a58439f9cef843932 b/.git_disabled/objects/ec/2f3fbf2c15382b62ffb83a58439f9cef843932 new file mode 100755 index 0000000..211fef6 Binary files /dev/null and b/.git_disabled/objects/ec/2f3fbf2c15382b62ffb83a58439f9cef843932 differ diff --git a/.git_disabled/objects/ec/3c5f0e0f2e319047b5b00ba8e0cba9b2ab690e b/.git_disabled/objects/ec/3c5f0e0f2e319047b5b00ba8e0cba9b2ab690e new file mode 100755 index 0000000..27b0f35 Binary files /dev/null and b/.git_disabled/objects/ec/3c5f0e0f2e319047b5b00ba8e0cba9b2ab690e differ diff --git a/.git_disabled/objects/ec/43fd37f6529b5dcd5f2aeca1b2d95e2cb24def b/.git_disabled/objects/ec/43fd37f6529b5dcd5f2aeca1b2d95e2cb24def new file mode 100755 index 0000000..3aec795 Binary files /dev/null and b/.git_disabled/objects/ec/43fd37f6529b5dcd5f2aeca1b2d95e2cb24def differ diff --git a/.git_disabled/objects/ec/451b0faa19e68a3dd6b77b091d15d76265ccba b/.git_disabled/objects/ec/451b0faa19e68a3dd6b77b091d15d76265ccba new file mode 100755 index 0000000..4f50d36 Binary files /dev/null and b/.git_disabled/objects/ec/451b0faa19e68a3dd6b77b091d15d76265ccba differ diff --git a/.git_disabled/objects/ec/47c33ad2162a8cf6974accfc68cdacb72fad5e b/.git_disabled/objects/ec/47c33ad2162a8cf6974accfc68cdacb72fad5e new file mode 100755 index 0000000..fd4e461 Binary files /dev/null and b/.git_disabled/objects/ec/47c33ad2162a8cf6974accfc68cdacb72fad5e differ diff --git a/.git_disabled/objects/ec/50041a0fd3392a760e166982f3c6c6b3df281f b/.git_disabled/objects/ec/50041a0fd3392a760e166982f3c6c6b3df281f new file mode 100755 index 0000000..6004cb6 Binary files /dev/null and b/.git_disabled/objects/ec/50041a0fd3392a760e166982f3c6c6b3df281f differ diff --git a/.git_disabled/objects/ec/544af33b87662f42f204711b18b8ef6520764a b/.git_disabled/objects/ec/544af33b87662f42f204711b18b8ef6520764a new file mode 100755 index 0000000..6d7acd7 Binary files /dev/null and b/.git_disabled/objects/ec/544af33b87662f42f204711b18b8ef6520764a differ diff --git a/.git_disabled/objects/ec/643d0acfb892742d2db8a6ec701c222db0015d b/.git_disabled/objects/ec/643d0acfb892742d2db8a6ec701c222db0015d new file mode 100755 index 0000000..fb8bc38 Binary files /dev/null and b/.git_disabled/objects/ec/643d0acfb892742d2db8a6ec701c222db0015d differ diff --git a/.git_disabled/objects/ec/685e77e8f27b34cc921a19bbf0df2f5fe6204b b/.git_disabled/objects/ec/685e77e8f27b34cc921a19bbf0df2f5fe6204b new file mode 100755 index 0000000..4943365 Binary files /dev/null and b/.git_disabled/objects/ec/685e77e8f27b34cc921a19bbf0df2f5fe6204b differ diff --git a/.git_disabled/objects/ec/6c3cf21384e0824a9310348548f36459f28ec0 b/.git_disabled/objects/ec/6c3cf21384e0824a9310348548f36459f28ec0 new file mode 100755 index 0000000..a4c4fa0 Binary files /dev/null and b/.git_disabled/objects/ec/6c3cf21384e0824a9310348548f36459f28ec0 differ diff --git a/.git_disabled/objects/ec/7f6405a44d5b2f5ed2bfb9ae6e75ff11cce1e9 b/.git_disabled/objects/ec/7f6405a44d5b2f5ed2bfb9ae6e75ff11cce1e9 new file mode 100755 index 0000000..923ab16 --- /dev/null +++ b/.git_disabled/objects/ec/7f6405a44d5b2f5ed2bfb9ae6e75ff11cce1e9 @@ -0,0 +1,3 @@ +xu11h]cuLF#Vv"ȥH{ ] ֛.'߫мB<,O\j +#(XV_^!Vƺ Kł M ֘DRpXstj +B(ЪmDBn0$ʏ?cq?"5wd gGI@D\XV+h}c \ No newline at end of file diff --git a/.git_disabled/objects/ec/b95aa501e5a8c1f661c100a11bad04000d7ca1 b/.git_disabled/objects/ec/b95aa501e5a8c1f661c100a11bad04000d7ca1 new file mode 100755 index 0000000..aa93727 Binary files /dev/null and b/.git_disabled/objects/ec/b95aa501e5a8c1f661c100a11bad04000d7ca1 differ diff --git a/.git_disabled/objects/ec/bcb5fa0b020ebe9445d4efd496cfaa59e52e9d b/.git_disabled/objects/ec/bcb5fa0b020ebe9445d4efd496cfaa59e52e9d new file mode 100755 index 0000000..1add463 Binary files /dev/null and b/.git_disabled/objects/ec/bcb5fa0b020ebe9445d4efd496cfaa59e52e9d differ diff --git a/.git_disabled/objects/ec/c44a61115446b8b56fea839903d5bed2c03899 b/.git_disabled/objects/ec/c44a61115446b8b56fea839903d5bed2c03899 new file mode 100755 index 0000000..e3d716d Binary files /dev/null and b/.git_disabled/objects/ec/c44a61115446b8b56fea839903d5bed2c03899 differ diff --git a/.git_disabled/objects/ec/c8b0f4f3b322c8e8f3740c1fb770bbb1fb6cb5 b/.git_disabled/objects/ec/c8b0f4f3b322c8e8f3740c1fb770bbb1fb6cb5 new file mode 100755 index 0000000..3b14aff Binary files /dev/null and b/.git_disabled/objects/ec/c8b0f4f3b322c8e8f3740c1fb770bbb1fb6cb5 differ diff --git a/.git_disabled/objects/ec/ca88f7dc93b78f2aa26f16cf29d17a8a83ae27 b/.git_disabled/objects/ec/ca88f7dc93b78f2aa26f16cf29d17a8a83ae27 new file mode 100755 index 0000000..7e53c2f Binary files /dev/null and b/.git_disabled/objects/ec/ca88f7dc93b78f2aa26f16cf29d17a8a83ae27 differ diff --git a/.git_disabled/objects/ec/cc30571e119b2e6daf45afe0f1247f307e48c5 b/.git_disabled/objects/ec/cc30571e119b2e6daf45afe0f1247f307e48c5 new file mode 100755 index 0000000..855cd68 Binary files /dev/null and b/.git_disabled/objects/ec/cc30571e119b2e6daf45afe0f1247f307e48c5 differ diff --git a/.git_disabled/objects/ec/ea1045c9f981606f974f9b3dab796c3126b647 b/.git_disabled/objects/ec/ea1045c9f981606f974f9b3dab796c3126b647 new file mode 100755 index 0000000..b805d9b Binary files /dev/null and b/.git_disabled/objects/ec/ea1045c9f981606f974f9b3dab796c3126b647 differ diff --git a/.git_disabled/objects/ec/f2b30003b56c029b8a3c0e2f719d59209c264e b/.git_disabled/objects/ec/f2b30003b56c029b8a3c0e2f719d59209c264e new file mode 100755 index 0000000..cce9a95 Binary files /dev/null and b/.git_disabled/objects/ec/f2b30003b56c029b8a3c0e2f719d59209c264e differ diff --git a/.git_disabled/objects/ed/076c81051f04d799197685a3cefc91d723f96b b/.git_disabled/objects/ed/076c81051f04d799197685a3cefc91d723f96b new file mode 100755 index 0000000..3608e48 Binary files /dev/null and b/.git_disabled/objects/ed/076c81051f04d799197685a3cefc91d723f96b differ diff --git a/.git_disabled/objects/ed/27f918a7bc42012be167f8fcc804467c1f36b0 b/.git_disabled/objects/ed/27f918a7bc42012be167f8fcc804467c1f36b0 new file mode 100755 index 0000000..1b2e510 Binary files /dev/null and b/.git_disabled/objects/ed/27f918a7bc42012be167f8fcc804467c1f36b0 differ diff --git a/.git_disabled/objects/ed/3bca60b1da31544a88bb5abf6e9922c075e417 b/.git_disabled/objects/ed/3bca60b1da31544a88bb5abf6e9922c075e417 new file mode 100755 index 0000000..a4bcfa4 Binary files /dev/null and b/.git_disabled/objects/ed/3bca60b1da31544a88bb5abf6e9922c075e417 differ diff --git a/.git_disabled/objects/ed/42b8e858104eba24ab3a93ccdde0446140693f b/.git_disabled/objects/ed/42b8e858104eba24ab3a93ccdde0446140693f new file mode 100755 index 0000000..817b3bf Binary files /dev/null and b/.git_disabled/objects/ed/42b8e858104eba24ab3a93ccdde0446140693f differ diff --git a/.git_disabled/objects/ed/4d7c115ab657f8a83da40c04fcd321cee0151f b/.git_disabled/objects/ed/4d7c115ab657f8a83da40c04fcd321cee0151f new file mode 100755 index 0000000..fe5efbf Binary files /dev/null and b/.git_disabled/objects/ed/4d7c115ab657f8a83da40c04fcd321cee0151f differ diff --git a/.git_disabled/objects/ed/57fc6f409d608fe8ee0206c03cd66179edb420 b/.git_disabled/objects/ed/57fc6f409d608fe8ee0206c03cd66179edb420 new file mode 100755 index 0000000..e7449ef Binary files /dev/null and b/.git_disabled/objects/ed/57fc6f409d608fe8ee0206c03cd66179edb420 differ diff --git a/.git_disabled/objects/ed/5afcff04688477ca62efe05d386716f087aeea b/.git_disabled/objects/ed/5afcff04688477ca62efe05d386716f087aeea new file mode 100755 index 0000000..e23f27e Binary files /dev/null and b/.git_disabled/objects/ed/5afcff04688477ca62efe05d386716f087aeea differ diff --git a/.git_disabled/objects/ed/6517b34c9e878266873265ececb96bea96982e b/.git_disabled/objects/ed/6517b34c9e878266873265ececb96bea96982e new file mode 100755 index 0000000..c9e3008 Binary files /dev/null and b/.git_disabled/objects/ed/6517b34c9e878266873265ececb96bea96982e differ diff --git a/.git_disabled/objects/ed/6a25b2b2febcaf0bc2f738bcef6e992c86987a b/.git_disabled/objects/ed/6a25b2b2febcaf0bc2f738bcef6e992c86987a new file mode 100755 index 0000000..d38bf6d Binary files /dev/null and b/.git_disabled/objects/ed/6a25b2b2febcaf0bc2f738bcef6e992c86987a differ diff --git a/.git_disabled/objects/ed/6d41441dcf62c97ffd7e6a62b0c4279d9c25b1 b/.git_disabled/objects/ed/6d41441dcf62c97ffd7e6a62b0c4279d9c25b1 new file mode 100755 index 0000000..469d82c Binary files /dev/null and b/.git_disabled/objects/ed/6d41441dcf62c97ffd7e6a62b0c4279d9c25b1 differ diff --git a/.git_disabled/objects/ed/928fb946ae8eb070dc0a96f50f7ed10adacb8e b/.git_disabled/objects/ed/928fb946ae8eb070dc0a96f50f7ed10adacb8e new file mode 100755 index 0000000..10c5b85 Binary files /dev/null and b/.git_disabled/objects/ed/928fb946ae8eb070dc0a96f50f7ed10adacb8e differ diff --git a/.git_disabled/objects/ed/973b7966bb6dc6cedcf20871053899af5faa3d b/.git_disabled/objects/ed/973b7966bb6dc6cedcf20871053899af5faa3d new file mode 100755 index 0000000..0c82cf0 Binary files /dev/null and b/.git_disabled/objects/ed/973b7966bb6dc6cedcf20871053899af5faa3d differ diff --git a/.git_disabled/objects/ed/9e9c74bd148c7e5387fcb4f990e90164033a12 b/.git_disabled/objects/ed/9e9c74bd148c7e5387fcb4f990e90164033a12 new file mode 100755 index 0000000..0fc384a Binary files /dev/null and b/.git_disabled/objects/ed/9e9c74bd148c7e5387fcb4f990e90164033a12 differ diff --git a/.git_disabled/objects/ed/a77ea1e959d7cb76eda562ff2fb88e73636c3f b/.git_disabled/objects/ed/a77ea1e959d7cb76eda562ff2fb88e73636c3f new file mode 100755 index 0000000..5cea034 Binary files /dev/null and b/.git_disabled/objects/ed/a77ea1e959d7cb76eda562ff2fb88e73636c3f differ diff --git a/.git_disabled/objects/ed/aef6e4462e056900c03f76439d4e2e30f019f2 b/.git_disabled/objects/ed/aef6e4462e056900c03f76439d4e2e30f019f2 new file mode 100755 index 0000000..61e4743 Binary files /dev/null and b/.git_disabled/objects/ed/aef6e4462e056900c03f76439d4e2e30f019f2 differ diff --git a/.git_disabled/objects/ed/b5db72a38c921ff7c27526f5d6be4e2f0274fa b/.git_disabled/objects/ed/b5db72a38c921ff7c27526f5d6be4e2f0274fa new file mode 100755 index 0000000..288c7c0 Binary files /dev/null and b/.git_disabled/objects/ed/b5db72a38c921ff7c27526f5d6be4e2f0274fa differ diff --git a/.git_disabled/objects/ed/bd087644236fa945450620901841dd6600b45f b/.git_disabled/objects/ed/bd087644236fa945450620901841dd6600b45f new file mode 100755 index 0000000..f8528f6 Binary files /dev/null and b/.git_disabled/objects/ed/bd087644236fa945450620901841dd6600b45f differ diff --git a/.git_disabled/objects/ed/c5eb39dc05a0d640f706ff602935fc11e99aba b/.git_disabled/objects/ed/c5eb39dc05a0d640f706ff602935fc11e99aba new file mode 100755 index 0000000..414b71d Binary files /dev/null and b/.git_disabled/objects/ed/c5eb39dc05a0d640f706ff602935fc11e99aba differ diff --git a/.git_disabled/objects/ed/c815ba56d4c57788fded6af0e5a911bcaf9215 b/.git_disabled/objects/ed/c815ba56d4c57788fded6af0e5a911bcaf9215 new file mode 100755 index 0000000..592836e Binary files /dev/null and b/.git_disabled/objects/ed/c815ba56d4c57788fded6af0e5a911bcaf9215 differ diff --git a/.git_disabled/objects/ed/d7e7de976754061a2fb75caa43f58100dc4f62 b/.git_disabled/objects/ed/d7e7de976754061a2fb75caa43f58100dc4f62 new file mode 100755 index 0000000..96e25bd Binary files /dev/null and b/.git_disabled/objects/ed/d7e7de976754061a2fb75caa43f58100dc4f62 differ diff --git a/.git_disabled/objects/ed/f86636751dea210c22ecde54a9f9e17ffc40bf b/.git_disabled/objects/ed/f86636751dea210c22ecde54a9f9e17ffc40bf new file mode 100755 index 0000000..fa54de5 Binary files /dev/null and b/.git_disabled/objects/ed/f86636751dea210c22ecde54a9f9e17ffc40bf differ diff --git a/.git_disabled/objects/ed/fb52572817b09f7bd16061427cbf51dea1de47 b/.git_disabled/objects/ed/fb52572817b09f7bd16061427cbf51dea1de47 new file mode 100755 index 0000000..a5ab817 Binary files /dev/null and b/.git_disabled/objects/ed/fb52572817b09f7bd16061427cbf51dea1de47 differ diff --git a/.git_disabled/objects/ee/01481213c660f820ac2a95f8e119e246b48815 b/.git_disabled/objects/ee/01481213c660f820ac2a95f8e119e246b48815 new file mode 100755 index 0000000..d57adb8 Binary files /dev/null and b/.git_disabled/objects/ee/01481213c660f820ac2a95f8e119e246b48815 differ diff --git a/.git_disabled/objects/ee/29876e994c6bb5951c953215b075151c44e17a b/.git_disabled/objects/ee/29876e994c6bb5951c953215b075151c44e17a new file mode 100755 index 0000000..1cf49fc Binary files /dev/null and b/.git_disabled/objects/ee/29876e994c6bb5951c953215b075151c44e17a differ diff --git a/.git_disabled/objects/ee/2af549f7e1b462dfb7580655a916ccfae8cb7d b/.git_disabled/objects/ee/2af549f7e1b462dfb7580655a916ccfae8cb7d new file mode 100755 index 0000000..995ddd0 Binary files /dev/null and b/.git_disabled/objects/ee/2af549f7e1b462dfb7580655a916ccfae8cb7d differ diff --git a/.git_disabled/objects/ee/30e2ee88c991289464fbc459ff014a73c058c9 b/.git_disabled/objects/ee/30e2ee88c991289464fbc459ff014a73c058c9 new file mode 100755 index 0000000..602bdd6 Binary files /dev/null and b/.git_disabled/objects/ee/30e2ee88c991289464fbc459ff014a73c058c9 differ diff --git a/.git_disabled/objects/ee/366730b25b6c99bdd8f297c2bb07ee0825fbfa b/.git_disabled/objects/ee/366730b25b6c99bdd8f297c2bb07ee0825fbfa new file mode 100755 index 0000000..81046cf Binary files /dev/null and b/.git_disabled/objects/ee/366730b25b6c99bdd8f297c2bb07ee0825fbfa differ diff --git a/.git_disabled/objects/ee/41e6b39b319e555aed57509d9a6638479d4979 b/.git_disabled/objects/ee/41e6b39b319e555aed57509d9a6638479d4979 new file mode 100755 index 0000000..7ace5cd Binary files /dev/null and b/.git_disabled/objects/ee/41e6b39b319e555aed57509d9a6638479d4979 differ diff --git a/.git_disabled/objects/ee/50883cd8326fa50af93419bdd801c0c0169ed3 b/.git_disabled/objects/ee/50883cd8326fa50af93419bdd801c0c0169ed3 new file mode 100755 index 0000000..3cb5ae8 Binary files /dev/null and b/.git_disabled/objects/ee/50883cd8326fa50af93419bdd801c0c0169ed3 differ diff --git a/.git_disabled/objects/ee/513ee73c89385263f0292c653be4f9115de526 b/.git_disabled/objects/ee/513ee73c89385263f0292c653be4f9115de526 new file mode 100755 index 0000000..25d7a79 Binary files /dev/null and b/.git_disabled/objects/ee/513ee73c89385263f0292c653be4f9115de526 differ diff --git a/.git_disabled/objects/ee/8fcb643f2b558ad5180e72cbe38c3968487841 b/.git_disabled/objects/ee/8fcb643f2b558ad5180e72cbe38c3968487841 new file mode 100755 index 0000000..247e640 Binary files /dev/null and b/.git_disabled/objects/ee/8fcb643f2b558ad5180e72cbe38c3968487841 differ diff --git a/.git_disabled/objects/ee/91fc06ea73d3facd43e654623e08beec1cdacd b/.git_disabled/objects/ee/91fc06ea73d3facd43e654623e08beec1cdacd new file mode 100755 index 0000000..d4caeb0 Binary files /dev/null and b/.git_disabled/objects/ee/91fc06ea73d3facd43e654623e08beec1cdacd differ diff --git a/.git_disabled/objects/ee/9647b42dd4daab34484369c8644c3e80b5cf77 b/.git_disabled/objects/ee/9647b42dd4daab34484369c8644c3e80b5cf77 new file mode 100755 index 0000000..a2ab98e Binary files /dev/null and b/.git_disabled/objects/ee/9647b42dd4daab34484369c8644c3e80b5cf77 differ diff --git a/.git_disabled/objects/ee/9ec45843d74d99392a28ee92d93aad938e0359 b/.git_disabled/objects/ee/9ec45843d74d99392a28ee92d93aad938e0359 new file mode 100755 index 0000000..ef89eaa --- /dev/null +++ b/.git_disabled/objects/ee/9ec45843d74d99392a28ee92d93aad938e0359 @@ -0,0 +1,5 @@ +x]Kk0 wίe5RؠlvJbpmctSn='aհOr870Lc0%Aijs! +tESDc6pt*&/k ED* \]{!i6 +:"*TtB[!fߎ&2!ǰ\\=HmI +aT?bnBNsuj PƲTUÍo;4v \ No newline at end of file diff --git a/.git_disabled/objects/ee/a3f69d833ebc70572dd44929b78e032a3e5eae b/.git_disabled/objects/ee/a3f69d833ebc70572dd44929b78e032a3e5eae new file mode 100755 index 0000000..086b405 Binary files /dev/null and b/.git_disabled/objects/ee/a3f69d833ebc70572dd44929b78e032a3e5eae differ diff --git a/.git_disabled/objects/ee/a4965872e48f01cbf1fbee02744f85f360550a b/.git_disabled/objects/ee/a4965872e48f01cbf1fbee02744f85f360550a new file mode 100755 index 0000000..b7361b4 Binary files /dev/null and b/.git_disabled/objects/ee/a4965872e48f01cbf1fbee02744f85f360550a differ diff --git a/.git_disabled/objects/ee/aa7eaaf5a1c44d5bb29649fe8d78c3e05b7f40 b/.git_disabled/objects/ee/aa7eaaf5a1c44d5bb29649fe8d78c3e05b7f40 new file mode 100755 index 0000000..20d73c7 Binary files /dev/null and b/.git_disabled/objects/ee/aa7eaaf5a1c44d5bb29649fe8d78c3e05b7f40 differ diff --git a/.git_disabled/objects/ee/b194d71d83ea929218a1fe830dc74410949e70 b/.git_disabled/objects/ee/b194d71d83ea929218a1fe830dc74410949e70 new file mode 100755 index 0000000..375ae7d Binary files /dev/null and b/.git_disabled/objects/ee/b194d71d83ea929218a1fe830dc74410949e70 differ diff --git a/.git_disabled/objects/ee/b7604f796da1037f4acff17cc33314b9c2b111 b/.git_disabled/objects/ee/b7604f796da1037f4acff17cc33314b9c2b111 new file mode 100755 index 0000000..325b345 Binary files /dev/null and b/.git_disabled/objects/ee/b7604f796da1037f4acff17cc33314b9c2b111 differ diff --git a/.git_disabled/objects/ee/bc867de3b3f58e1c41a05d24c3da7ceaa532eb b/.git_disabled/objects/ee/bc867de3b3f58e1c41a05d24c3da7ceaa532eb new file mode 100755 index 0000000..2232103 Binary files /dev/null and b/.git_disabled/objects/ee/bc867de3b3f58e1c41a05d24c3da7ceaa532eb differ diff --git a/.git_disabled/objects/ee/c8dc3a203e14b33b240b5a6e01b5e4a2da5438 b/.git_disabled/objects/ee/c8dc3a203e14b33b240b5a6e01b5e4a2da5438 new file mode 100755 index 0000000..b23451c Binary files /dev/null and b/.git_disabled/objects/ee/c8dc3a203e14b33b240b5a6e01b5e4a2da5438 differ diff --git a/.git_disabled/objects/ee/e97bf52be39c767029a21107ef4bd17cc48244 b/.git_disabled/objects/ee/e97bf52be39c767029a21107ef4bd17cc48244 new file mode 100755 index 0000000..ecf2245 Binary files /dev/null and b/.git_disabled/objects/ee/e97bf52be39c767029a21107ef4bd17cc48244 differ diff --git a/.git_disabled/objects/ef/131b98169dd66f5e06f6ce9124d11b813fc868 b/.git_disabled/objects/ef/131b98169dd66f5e06f6ce9124d11b813fc868 new file mode 100755 index 0000000..bbd1d23 Binary files /dev/null and b/.git_disabled/objects/ef/131b98169dd66f5e06f6ce9124d11b813fc868 differ diff --git a/.git_disabled/objects/ef/32f56e3238808c9325366a62b4c43f129973f6 b/.git_disabled/objects/ef/32f56e3238808c9325366a62b4c43f129973f6 new file mode 100755 index 0000000..e4503c8 Binary files /dev/null and b/.git_disabled/objects/ef/32f56e3238808c9325366a62b4c43f129973f6 differ diff --git a/.git_disabled/objects/ef/59e3f0ca2bb769800b8bbb254a8991cbabf49e b/.git_disabled/objects/ef/59e3f0ca2bb769800b8bbb254a8991cbabf49e new file mode 100755 index 0000000..8afabc0 Binary files /dev/null and b/.git_disabled/objects/ef/59e3f0ca2bb769800b8bbb254a8991cbabf49e differ diff --git a/.git_disabled/objects/ef/5e330b2c9dd9ddfc64d7ca98000b1418338732 b/.git_disabled/objects/ef/5e330b2c9dd9ddfc64d7ca98000b1418338732 new file mode 100755 index 0000000..6a71517 Binary files /dev/null and b/.git_disabled/objects/ef/5e330b2c9dd9ddfc64d7ca98000b1418338732 differ diff --git a/.git_disabled/objects/ef/700e60d4779f39080390a85e9370092175e27b b/.git_disabled/objects/ef/700e60d4779f39080390a85e9370092175e27b new file mode 100755 index 0000000..8cb41a6 Binary files /dev/null and b/.git_disabled/objects/ef/700e60d4779f39080390a85e9370092175e27b differ diff --git a/.git_disabled/objects/ef/75408530e7f4c568f232fcde5aa4d4328c7e5f b/.git_disabled/objects/ef/75408530e7f4c568f232fcde5aa4d4328c7e5f new file mode 100755 index 0000000..b586b74 Binary files /dev/null and b/.git_disabled/objects/ef/75408530e7f4c568f232fcde5aa4d4328c7e5f differ diff --git a/.git_disabled/objects/ef/79319029c8dcb2397a8a6ac6bcabfcd7c97276 b/.git_disabled/objects/ef/79319029c8dcb2397a8a6ac6bcabfcd7c97276 new file mode 100755 index 0000000..fd04993 Binary files /dev/null and b/.git_disabled/objects/ef/79319029c8dcb2397a8a6ac6bcabfcd7c97276 differ diff --git a/.git_disabled/objects/ef/81e1909935648e52825d04510c95f1ab3ab4d0 b/.git_disabled/objects/ef/81e1909935648e52825d04510c95f1ab3ab4d0 new file mode 100755 index 0000000..1bb7178 --- /dev/null +++ b/.git_disabled/objects/ef/81e1909935648e52825d04510c95f1ab3ab4d0 @@ -0,0 +1,3 @@ +xOO@=)&P,-BoI톲[݂EUZCJYLb \ No newline at end of file diff --git a/.git_disabled/objects/ef/896dba3f1da5d207bdcac0e4b929217fbe4b92 b/.git_disabled/objects/ef/896dba3f1da5d207bdcac0e4b929217fbe4b92 new file mode 100755 index 0000000..9d410bd Binary files /dev/null and b/.git_disabled/objects/ef/896dba3f1da5d207bdcac0e4b929217fbe4b92 differ diff --git a/.git_disabled/objects/ef/938225a3050d4376c516d83cd67f45b078432a b/.git_disabled/objects/ef/938225a3050d4376c516d83cd67f45b078432a new file mode 100755 index 0000000..d2172e5 Binary files /dev/null and b/.git_disabled/objects/ef/938225a3050d4376c516d83cd67f45b078432a differ diff --git a/.git_disabled/objects/ef/9afb1a52bade15a1bd800dd7b359cfca5fbe09 b/.git_disabled/objects/ef/9afb1a52bade15a1bd800dd7b359cfca5fbe09 new file mode 100755 index 0000000..343c681 --- /dev/null +++ b/.git_disabled/objects/ef/9afb1a52bade15a1bd800dd7b359cfca5fbe09 @@ -0,0 +1,5 @@ +xmQMk0 ٿBP' RƠ +hw$l?tBo{ve}n M0+K b ;?i;y^ygP:"(W1 +Oߧ#4X2|L"p5@+MI@*b xs:?ht7 qe8J?0S(}h3;sbZ]9tŢ9l?РG)]*"\0 8?B$ΪBK,%{Z8O?xΡ&ݤ$.(0 +2_c\]H2XYF~6MXD +IOmOJ' \ No newline at end of file diff --git a/.git_disabled/objects/ef/9d519d2c1a485ce0efc180b6e065a0122c7f99 b/.git_disabled/objects/ef/9d519d2c1a485ce0efc180b6e065a0122c7f99 new file mode 100755 index 0000000..2d713b0 Binary files /dev/null and b/.git_disabled/objects/ef/9d519d2c1a485ce0efc180b6e065a0122c7f99 differ diff --git a/.git_disabled/objects/ef/aaba5800130f1a3aeb35c0de252567989eff52 b/.git_disabled/objects/ef/aaba5800130f1a3aeb35c0de252567989eff52 new file mode 100755 index 0000000..51ebcf7 Binary files /dev/null and b/.git_disabled/objects/ef/aaba5800130f1a3aeb35c0de252567989eff52 differ diff --git a/.git_disabled/objects/ef/b8cd20852b7cf8fc4d747923a9dc6fcc2d8a17 b/.git_disabled/objects/ef/b8cd20852b7cf8fc4d747923a9dc6fcc2d8a17 new file mode 100755 index 0000000..afa0cb4 Binary files /dev/null and b/.git_disabled/objects/ef/b8cd20852b7cf8fc4d747923a9dc6fcc2d8a17 differ diff --git a/.git_disabled/objects/ef/c256d40133c78e11b66d20feb1ab7e9b4bd644 b/.git_disabled/objects/ef/c256d40133c78e11b66d20feb1ab7e9b4bd644 new file mode 100755 index 0000000..c4e17b5 Binary files /dev/null and b/.git_disabled/objects/ef/c256d40133c78e11b66d20feb1ab7e9b4bd644 differ diff --git a/.git_disabled/objects/ef/dd68dd5088d4006cef2c23548ba0f4e38480e1 b/.git_disabled/objects/ef/dd68dd5088d4006cef2c23548ba0f4e38480e1 new file mode 100755 index 0000000..6a57333 Binary files /dev/null and b/.git_disabled/objects/ef/dd68dd5088d4006cef2c23548ba0f4e38480e1 differ diff --git a/.git_disabled/objects/ef/e3ef5eeeb79427de06f56c5c77856e8ae839bd b/.git_disabled/objects/ef/e3ef5eeeb79427de06f56c5c77856e8ae839bd new file mode 100755 index 0000000..0ed67d5 Binary files /dev/null and b/.git_disabled/objects/ef/e3ef5eeeb79427de06f56c5c77856e8ae839bd differ diff --git a/.git_disabled/objects/ef/e867a865e0509104ad3d6ef08b66101ae1b712 b/.git_disabled/objects/ef/e867a865e0509104ad3d6ef08b66101ae1b712 new file mode 100755 index 0000000..1cf0119 Binary files /dev/null and b/.git_disabled/objects/ef/e867a865e0509104ad3d6ef08b66101ae1b712 differ diff --git a/.git_disabled/objects/ef/f4a4060bf1b0ca8f908971039fe37af5f34250 b/.git_disabled/objects/ef/f4a4060bf1b0ca8f908971039fe37af5f34250 new file mode 100755 index 0000000..d0dfeb2 Binary files /dev/null and b/.git_disabled/objects/ef/f4a4060bf1b0ca8f908971039fe37af5f34250 differ diff --git a/.git_disabled/objects/ef/fe85ffca955a375e05d54398cec4b95716d32b b/.git_disabled/objects/ef/fe85ffca955a375e05d54398cec4b95716d32b new file mode 100755 index 0000000..10ce3f1 Binary files /dev/null and b/.git_disabled/objects/ef/fe85ffca955a375e05d54398cec4b95716d32b differ diff --git a/.git_disabled/objects/f0/15455988000349305c49e56fd3b1e85c6e3d84 b/.git_disabled/objects/f0/15455988000349305c49e56fd3b1e85c6e3d84 new file mode 100755 index 0000000..aa2970d Binary files /dev/null and b/.git_disabled/objects/f0/15455988000349305c49e56fd3b1e85c6e3d84 differ diff --git a/.git_disabled/objects/f0/205d72d09052050c9b696133489777122e10fa b/.git_disabled/objects/f0/205d72d09052050c9b696133489777122e10fa new file mode 100755 index 0000000..94abbfb Binary files /dev/null and b/.git_disabled/objects/f0/205d72d09052050c9b696133489777122e10fa differ diff --git a/.git_disabled/objects/f0/278bce29265670ec141c2c1be68e99befbedc2 b/.git_disabled/objects/f0/278bce29265670ec141c2c1be68e99befbedc2 new file mode 100755 index 0000000..2138b9c Binary files /dev/null and b/.git_disabled/objects/f0/278bce29265670ec141c2c1be68e99befbedc2 differ diff --git a/.git_disabled/objects/f0/2aad8c07707a3d20887cea8458fe3305518900 b/.git_disabled/objects/f0/2aad8c07707a3d20887cea8458fe3305518900 new file mode 100755 index 0000000..3270e49 Binary files /dev/null and b/.git_disabled/objects/f0/2aad8c07707a3d20887cea8458fe3305518900 differ diff --git a/.git_disabled/objects/f0/36e18d1114ccc74ad6abb3d029627a0c20f277 b/.git_disabled/objects/f0/36e18d1114ccc74ad6abb3d029627a0c20f277 new file mode 100755 index 0000000..5ce9c8a Binary files /dev/null and b/.git_disabled/objects/f0/36e18d1114ccc74ad6abb3d029627a0c20f277 differ diff --git a/.git_disabled/objects/f0/57bd14cb42994d748e88eabd3b172361b95ad0 b/.git_disabled/objects/f0/57bd14cb42994d748e88eabd3b172361b95ad0 new file mode 100755 index 0000000..2eb08d8 Binary files /dev/null and b/.git_disabled/objects/f0/57bd14cb42994d748e88eabd3b172361b95ad0 differ diff --git a/.git_disabled/objects/f0/5adf65fbe09c998d89c6ac6eb7c68915f06676 b/.git_disabled/objects/f0/5adf65fbe09c998d89c6ac6eb7c68915f06676 new file mode 100755 index 0000000..fa9bd4f Binary files /dev/null and b/.git_disabled/objects/f0/5adf65fbe09c998d89c6ac6eb7c68915f06676 differ diff --git a/.git_disabled/objects/f0/73d91c372812b4d159a37e31ede5a0fb73b106 b/.git_disabled/objects/f0/73d91c372812b4d159a37e31ede5a0fb73b106 new file mode 100755 index 0000000..b17beef Binary files /dev/null and b/.git_disabled/objects/f0/73d91c372812b4d159a37e31ede5a0fb73b106 differ diff --git a/.git_disabled/objects/f0/7ee974bffef6475801e3d532737135987d419f b/.git_disabled/objects/f0/7ee974bffef6475801e3d532737135987d419f new file mode 100755 index 0000000..13c32b4 Binary files /dev/null and b/.git_disabled/objects/f0/7ee974bffef6475801e3d532737135987d419f differ diff --git a/.git_disabled/objects/f0/80b23490805ecea2074d94f2ea8331f9e8fc28 b/.git_disabled/objects/f0/80b23490805ecea2074d94f2ea8331f9e8fc28 new file mode 100755 index 0000000..357e359 Binary files /dev/null and b/.git_disabled/objects/f0/80b23490805ecea2074d94f2ea8331f9e8fc28 differ diff --git a/.git_disabled/objects/f0/86d7d6ea5883d410938b58a08d2610840009e7 b/.git_disabled/objects/f0/86d7d6ea5883d410938b58a08d2610840009e7 new file mode 100755 index 0000000..352c05f Binary files /dev/null and b/.git_disabled/objects/f0/86d7d6ea5883d410938b58a08d2610840009e7 differ diff --git a/.git_disabled/objects/f0/c0d5c96d845c735532f396094bfe3ab1dd6147 b/.git_disabled/objects/f0/c0d5c96d845c735532f396094bfe3ab1dd6147 new file mode 100755 index 0000000..89fb9d2 Binary files /dev/null and b/.git_disabled/objects/f0/c0d5c96d845c735532f396094bfe3ab1dd6147 differ diff --git a/.git_disabled/objects/f0/f4aa32faa3860bc42392f26cddd93dff928a3b b/.git_disabled/objects/f0/f4aa32faa3860bc42392f26cddd93dff928a3b new file mode 100755 index 0000000..dd9d080 Binary files /dev/null and b/.git_disabled/objects/f0/f4aa32faa3860bc42392f26cddd93dff928a3b differ diff --git a/.git_disabled/objects/f1/00aa34c334dcde0c539c2fd420a4a6a72257bc b/.git_disabled/objects/f1/00aa34c334dcde0c539c2fd420a4a6a72257bc new file mode 100755 index 0000000..f59be98 Binary files /dev/null and b/.git_disabled/objects/f1/00aa34c334dcde0c539c2fd420a4a6a72257bc differ diff --git a/.git_disabled/objects/f1/02efd859d2bff43643e1a166afb7cdf072620f b/.git_disabled/objects/f1/02efd859d2bff43643e1a166afb7cdf072620f new file mode 100755 index 0000000..8c73680 Binary files /dev/null and b/.git_disabled/objects/f1/02efd859d2bff43643e1a166afb7cdf072620f differ diff --git a/.git_disabled/objects/f1/1f6b926c61029a2a078db597d45b458965b1c8 b/.git_disabled/objects/f1/1f6b926c61029a2a078db597d45b458965b1c8 new file mode 100755 index 0000000..ec22390 --- /dev/null +++ b/.git_disabled/objects/f1/1f6b926c61029a2a078db597d45b458965b1c8 @@ -0,0 +1,5 @@ +x]K0}_qm9D`PHK..e̱t +|w9܌.z0́]Ẏ0_ߎFA +*-2M gMO]ކTfoqzo*'E[#[9(b`-Qօm1IưtI0*&K~s;\O[|^F)e +w4,f>Zd +Dn0SY vu8rp̞gEIvuV,٢N'eiGJ8FC % \ No newline at end of file diff --git a/.git_disabled/objects/f1/2b3ce76d7e422f27eb873b155506de68239ef3 b/.git_disabled/objects/f1/2b3ce76d7e422f27eb873b155506de68239ef3 new file mode 100755 index 0000000..a01521f Binary files /dev/null and b/.git_disabled/objects/f1/2b3ce76d7e422f27eb873b155506de68239ef3 differ diff --git a/.git_disabled/objects/f1/4123d2f292d5981538c0d0526d50df21a023a3 b/.git_disabled/objects/f1/4123d2f292d5981538c0d0526d50df21a023a3 new file mode 100755 index 0000000..b2d0993 Binary files /dev/null and b/.git_disabled/objects/f1/4123d2f292d5981538c0d0526d50df21a023a3 differ diff --git a/.git_disabled/objects/f1/456753b0e8841ca544ed10a0981ee36039d802 b/.git_disabled/objects/f1/456753b0e8841ca544ed10a0981ee36039d802 new file mode 100755 index 0000000..f1ad8b5 Binary files /dev/null and b/.git_disabled/objects/f1/456753b0e8841ca544ed10a0981ee36039d802 differ diff --git a/.git_disabled/objects/f1/4c089bb56a4144bd17d05a8a0a157dd09fdc11 b/.git_disabled/objects/f1/4c089bb56a4144bd17d05a8a0a157dd09fdc11 new file mode 100755 index 0000000..a9bada5 Binary files /dev/null and b/.git_disabled/objects/f1/4c089bb56a4144bd17d05a8a0a157dd09fdc11 differ diff --git a/.git_disabled/objects/f1/76ee0f92d11f8450bc10253970d44b7f3789b0 b/.git_disabled/objects/f1/76ee0f92d11f8450bc10253970d44b7f3789b0 new file mode 100755 index 0000000..9bb14b8 Binary files /dev/null and b/.git_disabled/objects/f1/76ee0f92d11f8450bc10253970d44b7f3789b0 differ diff --git a/.git_disabled/objects/f1/7a5db2e46f0ceee8b0e4070fe1d5a1c4f357a3 b/.git_disabled/objects/f1/7a5db2e46f0ceee8b0e4070fe1d5a1c4f357a3 new file mode 100755 index 0000000..9f023cf Binary files /dev/null and b/.git_disabled/objects/f1/7a5db2e46f0ceee8b0e4070fe1d5a1c4f357a3 differ diff --git a/.git_disabled/objects/f1/bdc28287430256b47660b81abb7b955c9d29df b/.git_disabled/objects/f1/bdc28287430256b47660b81abb7b955c9d29df new file mode 100755 index 0000000..1b458a6 Binary files /dev/null and b/.git_disabled/objects/f1/bdc28287430256b47660b81abb7b955c9d29df differ diff --git a/.git_disabled/objects/f1/cf55b6d032e38deb9f60c408339ec92286d589 b/.git_disabled/objects/f1/cf55b6d032e38deb9f60c408339ec92286d589 new file mode 100755 index 0000000..ea6b05c Binary files /dev/null and b/.git_disabled/objects/f1/cf55b6d032e38deb9f60c408339ec92286d589 differ diff --git a/.git_disabled/objects/f1/d21d787e5d0d13980bcf828a9f2a23d65002d2 b/.git_disabled/objects/f1/d21d787e5d0d13980bcf828a9f2a23d65002d2 new file mode 100755 index 0000000..9b68634 Binary files /dev/null and b/.git_disabled/objects/f1/d21d787e5d0d13980bcf828a9f2a23d65002d2 differ diff --git a/.git_disabled/objects/f1/e4de61ef203585758771409dcb93654c32c452 b/.git_disabled/objects/f1/e4de61ef203585758771409dcb93654c32c452 new file mode 100755 index 0000000..7db27fb Binary files /dev/null and b/.git_disabled/objects/f1/e4de61ef203585758771409dcb93654c32c452 differ diff --git a/.git_disabled/objects/f1/e8d9af449b2c2866e5b05d7f35b03ffeef9d8e b/.git_disabled/objects/f1/e8d9af449b2c2866e5b05d7f35b03ffeef9d8e new file mode 100755 index 0000000..be6a797 Binary files /dev/null and b/.git_disabled/objects/f1/e8d9af449b2c2866e5b05d7f35b03ffeef9d8e differ diff --git a/.git_disabled/objects/f1/e909188ef0b2b17fe296c1c1c2d549bd3442f4 b/.git_disabled/objects/f1/e909188ef0b2b17fe296c1c1c2d549bd3442f4 new file mode 100755 index 0000000..e37da2e --- /dev/null +++ b/.git_disabled/objects/f1/e909188ef0b2b17fe296c1c1c2d549bd3442f4 @@ -0,0 +1,3 @@ +x%A +0{ j)JjkDAĻ t#wWYN+|x"#x 2=n#R,TfY +S+U; E^X6nyy0E? y4g*=QBl|Te*<> : \ No newline at end of file diff --git a/.git_disabled/objects/f1/fb880ac83a76e4b1a603a6d73b52808723e5b6 b/.git_disabled/objects/f1/fb880ac83a76e4b1a603a6d73b52808723e5b6 new file mode 100755 index 0000000..decab76 --- /dev/null +++ b/.git_disabled/objects/f1/fb880ac83a76e4b1a603a6d73b52808723e5b6 @@ -0,0 +1 @@ +x+)JMU044`040075U0qN++d0H4c-$:꤄P%9! %s =gmϋkH>YtrR*^{MQfWW?GRoZ>!E!E~4fd6]o~ߨ8+(Nn:fDp{qTy4f:΃O8= + +:]Ȑzc DM8{KAL1+l}CrN7\)7eτ/dE@NT\Bpk)90';;j㶝 \ No newline at end of file diff --git a/.git_disabled/objects/f2/992582b57ec1445cdd51017c5e27d93df2c572 b/.git_disabled/objects/f2/992582b57ec1445cdd51017c5e27d93df2c572 new file mode 100755 index 0000000..d2f1c83 Binary files /dev/null and b/.git_disabled/objects/f2/992582b57ec1445cdd51017c5e27d93df2c572 differ diff --git a/.git_disabled/objects/f2/a988ef38c971286a379a2efed8b83c8d7eae7c b/.git_disabled/objects/f2/a988ef38c971286a379a2efed8b83c8d7eae7c new file mode 100755 index 0000000..09a4150 Binary files /dev/null and b/.git_disabled/objects/f2/a988ef38c971286a379a2efed8b83c8d7eae7c differ diff --git a/.git_disabled/objects/f2/b15d5fa3f8cc240f8fff066bc2338559e9cc60 b/.git_disabled/objects/f2/b15d5fa3f8cc240f8fff066bc2338559e9cc60 new file mode 100755 index 0000000..987a9ff Binary files /dev/null and b/.git_disabled/objects/f2/b15d5fa3f8cc240f8fff066bc2338559e9cc60 differ diff --git a/.git_disabled/objects/f2/b47efad7c2cc8534bb2c2236f267ff71caa3ab b/.git_disabled/objects/f2/b47efad7c2cc8534bb2c2236f267ff71caa3ab new file mode 100755 index 0000000..e915488 Binary files /dev/null and b/.git_disabled/objects/f2/b47efad7c2cc8534bb2c2236f267ff71caa3ab differ diff --git a/.git_disabled/objects/f2/b7187df9ade92ae69532c2e6fe7f646d0326fd b/.git_disabled/objects/f2/b7187df9ade92ae69532c2e6fe7f646d0326fd new file mode 100755 index 0000000..199598c Binary files /dev/null and b/.git_disabled/objects/f2/b7187df9ade92ae69532c2e6fe7f646d0326fd differ diff --git a/.git_disabled/objects/f2/dcf7df306b7a29f9d8ce3bdfd2cde58bd459f4 b/.git_disabled/objects/f2/dcf7df306b7a29f9d8ce3bdfd2cde58bd459f4 new file mode 100755 index 0000000..067d76b Binary files /dev/null and b/.git_disabled/objects/f2/dcf7df306b7a29f9d8ce3bdfd2cde58bd459f4 differ diff --git a/.git_disabled/objects/f2/eca9f05a1eb3bddc9d1d22641bb57bfdb9e499 b/.git_disabled/objects/f2/eca9f05a1eb3bddc9d1d22641bb57bfdb9e499 new file mode 100755 index 0000000..dfc59ab --- /dev/null +++ b/.git_disabled/objects/f2/eca9f05a1eb3bddc9d1d22641bb57bfdb9e499 @@ -0,0 +1 @@ +x+)JMU0`040075Up,(MOg(;pQGC% iEw \ No newline at end of file diff --git a/.git_disabled/objects/f3/1586ef7e2782bb40a8b3b816eb6cd12c2fb7c4 b/.git_disabled/objects/f3/1586ef7e2782bb40a8b3b816eb6cd12c2fb7c4 new file mode 100755 index 0000000..7afcaf8 Binary files /dev/null and b/.git_disabled/objects/f3/1586ef7e2782bb40a8b3b816eb6cd12c2fb7c4 differ diff --git a/.git_disabled/objects/f3/1e0f1b7b9ba68ceae228eadb2d6281a75866e5 b/.git_disabled/objects/f3/1e0f1b7b9ba68ceae228eadb2d6281a75866e5 new file mode 100755 index 0000000..42bec02 Binary files /dev/null and b/.git_disabled/objects/f3/1e0f1b7b9ba68ceae228eadb2d6281a75866e5 differ diff --git a/.git_disabled/objects/f3/1f6380066000eff50f4a66c631721838fed7d0 b/.git_disabled/objects/f3/1f6380066000eff50f4a66c631721838fed7d0 new file mode 100755 index 0000000..4500a39 Binary files /dev/null and b/.git_disabled/objects/f3/1f6380066000eff50f4a66c631721838fed7d0 differ diff --git a/.git_disabled/objects/f3/2c23e9d3a835da4926f85bfeae5adc2d0ea80c b/.git_disabled/objects/f3/2c23e9d3a835da4926f85bfeae5adc2d0ea80c new file mode 100755 index 0000000..9fca2ca Binary files /dev/null and b/.git_disabled/objects/f3/2c23e9d3a835da4926f85bfeae5adc2d0ea80c differ diff --git a/.git_disabled/objects/f3/2cc37cc3c436f23c3bc8b981a0d2080da366b9 b/.git_disabled/objects/f3/2cc37cc3c436f23c3bc8b981a0d2080da366b9 new file mode 100755 index 0000000..ca130c5 Binary files /dev/null and b/.git_disabled/objects/f3/2cc37cc3c436f23c3bc8b981a0d2080da366b9 differ diff --git a/.git_disabled/objects/f3/34cc5c8c702e22ab2d10240068d202ed0ad42d b/.git_disabled/objects/f3/34cc5c8c702e22ab2d10240068d202ed0ad42d new file mode 100755 index 0000000..8cc5fd8 Binary files /dev/null and b/.git_disabled/objects/f3/34cc5c8c702e22ab2d10240068d202ed0ad42d differ diff --git a/.git_disabled/objects/f3/4a9c72918c9210be315dbc4f7256ef8291d99a b/.git_disabled/objects/f3/4a9c72918c9210be315dbc4f7256ef8291d99a new file mode 100755 index 0000000..c6a8a6e Binary files /dev/null and b/.git_disabled/objects/f3/4a9c72918c9210be315dbc4f7256ef8291d99a differ diff --git a/.git_disabled/objects/f3/58a448cb12739fd4eda4f4859d3a24ddd1de63 b/.git_disabled/objects/f3/58a448cb12739fd4eda4f4859d3a24ddd1de63 new file mode 100755 index 0000000..f351229 Binary files /dev/null and b/.git_disabled/objects/f3/58a448cb12739fd4eda4f4859d3a24ddd1de63 differ diff --git a/.git_disabled/objects/f3/5bb4fc1982323adfc6d1e06549bcbfb002c1f7 b/.git_disabled/objects/f3/5bb4fc1982323adfc6d1e06549bcbfb002c1f7 new file mode 100755 index 0000000..f4fea11 Binary files /dev/null and b/.git_disabled/objects/f3/5bb4fc1982323adfc6d1e06549bcbfb002c1f7 differ diff --git a/.git_disabled/objects/f3/7530c0af94bc80c985f16f08f06236eac39bcb b/.git_disabled/objects/f3/7530c0af94bc80c985f16f08f06236eac39bcb new file mode 100755 index 0000000..e01a6da Binary files /dev/null and b/.git_disabled/objects/f3/7530c0af94bc80c985f16f08f06236eac39bcb differ diff --git a/.git_disabled/objects/f3/79e3c0a3649b79b3e615436d1bd95b50235003 b/.git_disabled/objects/f3/79e3c0a3649b79b3e615436d1bd95b50235003 new file mode 100755 index 0000000..6333b26 Binary files /dev/null and b/.git_disabled/objects/f3/79e3c0a3649b79b3e615436d1bd95b50235003 differ diff --git a/.git_disabled/objects/f3/8a75a02505d8336fb80f09b15eef476faea5f9 b/.git_disabled/objects/f3/8a75a02505d8336fb80f09b15eef476faea5f9 new file mode 100755 index 0000000..a208af0 --- /dev/null +++ b/.git_disabled/objects/f3/8a75a02505d8336fb80f09b15eef476faea5f9 @@ -0,0 +1,2 @@ +xNAn 9cF+`jUWa Q6LDȶ/U_Pbٲem[*V=BA+7YiR6hqƨQnrPRH0ȠQiWtD!H=LWR?>p[Gr o0#R*x ]s۹Ju|}.5 s (!fW)(XTb (*oc.dGw3pJO.=cHmڪL_^l= \ No newline at end of file diff --git a/.git_disabled/objects/f4/0b064aef952e68e40297cff356530040e89a87 b/.git_disabled/objects/f4/0b064aef952e68e40297cff356530040e89a87 new file mode 100755 index 0000000..506b70a Binary files /dev/null and b/.git_disabled/objects/f4/0b064aef952e68e40297cff356530040e89a87 differ diff --git a/.git_disabled/objects/f4/193357412d58b33d407a8bc75082941ba957d4 b/.git_disabled/objects/f4/193357412d58b33d407a8bc75082941ba957d4 new file mode 100755 index 0000000..c4e11d2 Binary files /dev/null and b/.git_disabled/objects/f4/193357412d58b33d407a8bc75082941ba957d4 differ diff --git a/.git_disabled/objects/f4/205d892600bde3f96321ae03084f166a26ca2d b/.git_disabled/objects/f4/205d892600bde3f96321ae03084f166a26ca2d new file mode 100755 index 0000000..0bb36bd Binary files /dev/null and b/.git_disabled/objects/f4/205d892600bde3f96321ae03084f166a26ca2d differ diff --git a/.git_disabled/objects/f4/251e74e020be4c3154c4659f3c9595859061c2 b/.git_disabled/objects/f4/251e74e020be4c3154c4659f3c9595859061c2 new file mode 100755 index 0000000..cfa4cbf Binary files /dev/null and b/.git_disabled/objects/f4/251e74e020be4c3154c4659f3c9595859061c2 differ diff --git a/.git_disabled/objects/f4/409a32bd13f3b2b92fa41440a86f5e8eb508a0 b/.git_disabled/objects/f4/409a32bd13f3b2b92fa41440a86f5e8eb508a0 new file mode 100755 index 0000000..0acab21 Binary files /dev/null and b/.git_disabled/objects/f4/409a32bd13f3b2b92fa41440a86f5e8eb508a0 differ diff --git a/.git_disabled/objects/f4/4fca4a73232cf396232ee678eb2a81fd3a7a37 b/.git_disabled/objects/f4/4fca4a73232cf396232ee678eb2a81fd3a7a37 new file mode 100755 index 0000000..e38395a Binary files /dev/null and b/.git_disabled/objects/f4/4fca4a73232cf396232ee678eb2a81fd3a7a37 differ diff --git a/.git_disabled/objects/f4/5361e4dee1d292712a7d872d8d87c3824bd893 b/.git_disabled/objects/f4/5361e4dee1d292712a7d872d8d87c3824bd893 new file mode 100755 index 0000000..0c41db2 Binary files /dev/null and b/.git_disabled/objects/f4/5361e4dee1d292712a7d872d8d87c3824bd893 differ diff --git a/.git_disabled/objects/f4/60a7f5e0072a8cec103dfb8f4887d15fa666d0 b/.git_disabled/objects/f4/60a7f5e0072a8cec103dfb8f4887d15fa666d0 new file mode 100755 index 0000000..10c3b93 Binary files /dev/null and b/.git_disabled/objects/f4/60a7f5e0072a8cec103dfb8f4887d15fa666d0 differ diff --git a/.git_disabled/objects/f4/6f3254c6ef22c73a0b7364a3c894182f4a2db8 b/.git_disabled/objects/f4/6f3254c6ef22c73a0b7364a3c894182f4a2db8 new file mode 100755 index 0000000..4910b07 Binary files /dev/null and b/.git_disabled/objects/f4/6f3254c6ef22c73a0b7364a3c894182f4a2db8 differ diff --git a/.git_disabled/objects/f4/8c93b1c1a108a566fb8596bc5269406cfcd1e2 b/.git_disabled/objects/f4/8c93b1c1a108a566fb8596bc5269406cfcd1e2 new file mode 100755 index 0000000..9fea98d Binary files /dev/null and b/.git_disabled/objects/f4/8c93b1c1a108a566fb8596bc5269406cfcd1e2 differ diff --git a/.git_disabled/objects/f4/af4e806beb97b0bc185507eb91f4b66f8d8bad b/.git_disabled/objects/f4/af4e806beb97b0bc185507eb91f4b66f8d8bad new file mode 100755 index 0000000..1ad68c2 Binary files /dev/null and b/.git_disabled/objects/f4/af4e806beb97b0bc185507eb91f4b66f8d8bad differ diff --git a/.git_disabled/objects/f4/b0f55a26c6f8471db6d6ab17c62d9950bdb3b7 b/.git_disabled/objects/f4/b0f55a26c6f8471db6d6ab17c62d9950bdb3b7 new file mode 100755 index 0000000..33b8c52 Binary files /dev/null and b/.git_disabled/objects/f4/b0f55a26c6f8471db6d6ab17c62d9950bdb3b7 differ diff --git a/.git_disabled/objects/f4/b14715fb73737973550b5c0fce2446bd044134 b/.git_disabled/objects/f4/b14715fb73737973550b5c0fce2446bd044134 new file mode 100644 index 0000000..a26a561 Binary files /dev/null and b/.git_disabled/objects/f4/b14715fb73737973550b5c0fce2446bd044134 differ diff --git a/.git_disabled/objects/f4/e92c3ffeda3f37da2920ed90dc20ab60645f0e b/.git_disabled/objects/f4/e92c3ffeda3f37da2920ed90dc20ab60645f0e new file mode 100755 index 0000000..1aeeac7 Binary files /dev/null and b/.git_disabled/objects/f4/e92c3ffeda3f37da2920ed90dc20ab60645f0e differ diff --git a/.git_disabled/objects/f4/f9a140293d5a09b4503687d835c8e5cc9ad30d b/.git_disabled/objects/f4/f9a140293d5a09b4503687d835c8e5cc9ad30d new file mode 100755 index 0000000..3d0a3c0 Binary files /dev/null and b/.git_disabled/objects/f4/f9a140293d5a09b4503687d835c8e5cc9ad30d differ diff --git a/.git_disabled/objects/f5/09dcdd570c79086bd155696c6f59f8ab332084 b/.git_disabled/objects/f5/09dcdd570c79086bd155696c6f59f8ab332084 new file mode 100755 index 0000000..fd822b1 --- /dev/null +++ b/.git_disabled/objects/f5/09dcdd570c79086bd155696c6f59f8ab332084 @@ -0,0 +1,2 @@ +xM[ +0D*TH"!B\ښ Io * 3̩閭}v\Et.Nz$xCcnRw9 OKCpI댂>;gWD+%(".5" ̚I%B1?QINWQD28'o(#B \ No newline at end of file diff --git a/.git_disabled/objects/f5/225f26cdf2ce8843b243e9a7ea90c676193324 b/.git_disabled/objects/f5/225f26cdf2ce8843b243e9a7ea90c676193324 new file mode 100755 index 0000000..6b04ef0 Binary files /dev/null and b/.git_disabled/objects/f5/225f26cdf2ce8843b243e9a7ea90c676193324 differ diff --git a/.git_disabled/objects/f5/4925903a986269089fd6a76f3e1221cd138573 b/.git_disabled/objects/f5/4925903a986269089fd6a76f3e1221cd138573 new file mode 100755 index 0000000..abef7fc Binary files /dev/null and b/.git_disabled/objects/f5/4925903a986269089fd6a76f3e1221cd138573 differ diff --git a/.git_disabled/objects/f5/53acbaa9b24c113be99f3cb1f77fcba6b5739a b/.git_disabled/objects/f5/53acbaa9b24c113be99f3cb1f77fcba6b5739a new file mode 100755 index 0000000..80bc2c9 Binary files /dev/null and b/.git_disabled/objects/f5/53acbaa9b24c113be99f3cb1f77fcba6b5739a differ diff --git a/.git_disabled/objects/f5/5b0a0f0a5455b31b83eebcba3a89c76a02faad b/.git_disabled/objects/f5/5b0a0f0a5455b31b83eebcba3a89c76a02faad new file mode 100755 index 0000000..b618aef Binary files /dev/null and b/.git_disabled/objects/f5/5b0a0f0a5455b31b83eebcba3a89c76a02faad differ diff --git a/.git_disabled/objects/f5/5e75491a2d5e88903d1f468d8a921f9f7da3f3 b/.git_disabled/objects/f5/5e75491a2d5e88903d1f468d8a921f9f7da3f3 new file mode 100755 index 0000000..e682d9c Binary files /dev/null and b/.git_disabled/objects/f5/5e75491a2d5e88903d1f468d8a921f9f7da3f3 differ diff --git a/.git_disabled/objects/f5/642f79f21d872f010979dcf6f0c4a415acc19d b/.git_disabled/objects/f5/642f79f21d872f010979dcf6f0c4a415acc19d new file mode 100755 index 0000000..7e2c954 Binary files /dev/null and b/.git_disabled/objects/f5/642f79f21d872f010979dcf6f0c4a415acc19d differ diff --git a/.git_disabled/objects/f5/72c60ef248fba9d6e95ef48e58c4f5d102acb2 b/.git_disabled/objects/f5/72c60ef248fba9d6e95ef48e58c4f5d102acb2 new file mode 100755 index 0000000..49e4f2f Binary files /dev/null and b/.git_disabled/objects/f5/72c60ef248fba9d6e95ef48e58c4f5d102acb2 differ diff --git a/.git_disabled/objects/f5/8ba9983160fb865f80448150f3ed3d0e3be9ff b/.git_disabled/objects/f5/8ba9983160fb865f80448150f3ed3d0e3be9ff new file mode 100755 index 0000000..bb28973 Binary files /dev/null and b/.git_disabled/objects/f5/8ba9983160fb865f80448150f3ed3d0e3be9ff differ diff --git a/.git_disabled/objects/f5/9bf8ff40eec530d3303356e796ad4a7b950e01 b/.git_disabled/objects/f5/9bf8ff40eec530d3303356e796ad4a7b950e01 new file mode 100755 index 0000000..0175eed Binary files /dev/null and b/.git_disabled/objects/f5/9bf8ff40eec530d3303356e796ad4a7b950e01 differ diff --git a/.git_disabled/objects/f5/a631f1e67072073d342c718554cac41675a5ff b/.git_disabled/objects/f5/a631f1e67072073d342c718554cac41675a5ff new file mode 100755 index 0000000..b0b0b95 Binary files /dev/null and b/.git_disabled/objects/f5/a631f1e67072073d342c718554cac41675a5ff differ diff --git a/.git_disabled/objects/f5/b8505353080d22df897bfc67af245be1d34fcc b/.git_disabled/objects/f5/b8505353080d22df897bfc67af245be1d34fcc new file mode 100755 index 0000000..c3eec92 Binary files /dev/null and b/.git_disabled/objects/f5/b8505353080d22df897bfc67af245be1d34fcc differ diff --git a/.git_disabled/objects/f5/c72a27d5a020ce0d21553de5d7b3c6a1db4fdc b/.git_disabled/objects/f5/c72a27d5a020ce0d21553de5d7b3c6a1db4fdc new file mode 100755 index 0000000..7a83360 Binary files /dev/null and b/.git_disabled/objects/f5/c72a27d5a020ce0d21553de5d7b3c6a1db4fdc differ diff --git a/.git_disabled/objects/f5/c9e309cace9f4fcd21070d10a7e25cbcf56bd4 b/.git_disabled/objects/f5/c9e309cace9f4fcd21070d10a7e25cbcf56bd4 new file mode 100755 index 0000000..0a83f3f Binary files /dev/null and b/.git_disabled/objects/f5/c9e309cace9f4fcd21070d10a7e25cbcf56bd4 differ diff --git a/.git_disabled/objects/f5/cb6b29da7c7bca886b1cf840b5c0922df08436 b/.git_disabled/objects/f5/cb6b29da7c7bca886b1cf840b5c0922df08436 new file mode 100755 index 0000000..dc05e18 Binary files /dev/null and b/.git_disabled/objects/f5/cb6b29da7c7bca886b1cf840b5c0922df08436 differ diff --git a/.git_disabled/objects/f5/ccfe9bb2a658f1a238a6bf96c090f2bd9cc3c4 b/.git_disabled/objects/f5/ccfe9bb2a658f1a238a6bf96c090f2bd9cc3c4 new file mode 100755 index 0000000..5c3dae1 Binary files /dev/null and b/.git_disabled/objects/f5/ccfe9bb2a658f1a238a6bf96c090f2bd9cc3c4 differ diff --git a/.git_disabled/objects/f5/ed49c66800f4770f80b3f6340f6546f5e72d16 b/.git_disabled/objects/f5/ed49c66800f4770f80b3f6340f6546f5e72d16 new file mode 100755 index 0000000..eb75342 Binary files /dev/null and b/.git_disabled/objects/f5/ed49c66800f4770f80b3f6340f6546f5e72d16 differ diff --git a/.git_disabled/objects/f6/01b9c6d444745743f32730f983255e513b8bee b/.git_disabled/objects/f6/01b9c6d444745743f32730f983255e513b8bee new file mode 100755 index 0000000..0d33f6e Binary files /dev/null and b/.git_disabled/objects/f6/01b9c6d444745743f32730f983255e513b8bee differ diff --git a/.git_disabled/objects/f6/043c370e8a64e5f1458a9b32bfe9efe5c69204 b/.git_disabled/objects/f6/043c370e8a64e5f1458a9b32bfe9efe5c69204 new file mode 100755 index 0000000..6c48854 Binary files /dev/null and b/.git_disabled/objects/f6/043c370e8a64e5f1458a9b32bfe9efe5c69204 differ diff --git a/.git_disabled/objects/f6/06b674de8ddc1b411bd29301e4cebfcdaa4193 b/.git_disabled/objects/f6/06b674de8ddc1b411bd29301e4cebfcdaa4193 new file mode 100755 index 0000000..f6836e2 Binary files /dev/null and b/.git_disabled/objects/f6/06b674de8ddc1b411bd29301e4cebfcdaa4193 differ diff --git a/.git_disabled/objects/f6/2a61d39793220677ee13adeae9715f7ffd51b1 b/.git_disabled/objects/f6/2a61d39793220677ee13adeae9715f7ffd51b1 new file mode 100755 index 0000000..7ac6807 Binary files /dev/null and b/.git_disabled/objects/f6/2a61d39793220677ee13adeae9715f7ffd51b1 differ diff --git a/.git_disabled/objects/f6/335012cddc87c03b2a0043e857fcc3dfb8c436 b/.git_disabled/objects/f6/335012cddc87c03b2a0043e857fcc3dfb8c436 new file mode 100755 index 0000000..17ff918 Binary files /dev/null and b/.git_disabled/objects/f6/335012cddc87c03b2a0043e857fcc3dfb8c436 differ diff --git a/.git_disabled/objects/f6/390d60b3254545fa5f3a514997ed2f0993795a b/.git_disabled/objects/f6/390d60b3254545fa5f3a514997ed2f0993795a new file mode 100755 index 0000000..0bb1986 --- /dev/null +++ b/.git_disabled/objects/f6/390d60b3254545fa5f3a514997ed2f0993795a @@ -0,0 +1 @@ +x% s%ܺ5PTyhŸ>3tdB6X1e>>*jY@NjOq^yIQ'(JE;>NK9e?Ol fljzAEL9-u>堒9z&MO()Y14ӓ)אf%ךj)aCvCmi4khv% WS2 wGFc'/K01#X{Pb&2n'[Y"3aUmj]#6j0oVMPkQw&{.~Xyc/1v>Ƿ5,@.thyE! /Qԡ)P(bFi"c,$u0\"15iL;O +xy k1y]^w7i 1 M&nFJŧ%(#4L8魝$.޻snY\vۆN{#/pc4.dD˩i{ϫnܛdƗ*f#)j3^n` X m)^Oy^4 jS+?Fi\؅MRS&︭Cq6SBchؼ +t#XWwAhÃ۹Pti!<&[ Ý Ug&ko' +RrBd5ՙK Z&=k<,6 |Yߛ,1&^9_a2V"  [)a6C!@I~ñC1_N.WsTm\d%>lsppKta)Fp7PVa:e3D>={x!ysFpb9|<-DQ" )jr@~*C;؈ICܧOrˎb{$Y~$>QnedN5\S6EGL5H;v&R8r +y,_6d 8✠C:'dOv+й]|'nr?[!)ȯ``N :c($Kk/iwuF 5t?`}FSt3:C$ DHg( \ No newline at end of file diff --git a/.git_disabled/objects/f8/8361cad07b883c92bf3ae207f29d212bbc6766 b/.git_disabled/objects/f8/8361cad07b883c92bf3ae207f29d212bbc6766 new file mode 100755 index 0000000..94b49bf --- /dev/null +++ b/.git_disabled/objects/f8/8361cad07b883c92bf3ae207f29d212bbc6766 @@ -0,0 +1,4 @@ +x-@S)&1N0Et)\,^"{L/.mD*SG/66t厴G"l{-߿d<y> =Ղ&kX%ׁEk[nmY[tԆ7Ќ$fJR"笍}'U͐bsj_bSMZ/2½"cvb)y#vg/m?֪>;LUZsj h +{*Ae+z\Hd1܃b4.} kmvS܅f:?(vgs](ASpSYb'lc,!u +֍ʝMJ0b(yPRDS-T25J.ԃAǛ( I-BgXڗH <ڪ +c 5IO;@lܩ Np/:!S"&"X_w>( \ No newline at end of file diff --git a/.git_disabled/objects/f8/92bc3e7861b29923c3d56316eb9fba2bc397be b/.git_disabled/objects/f8/92bc3e7861b29923c3d56316eb9fba2bc397be new file mode 100755 index 0000000..88b474f Binary files /dev/null and b/.git_disabled/objects/f8/92bc3e7861b29923c3d56316eb9fba2bc397be differ diff --git a/.git_disabled/objects/f8/98bae04737302ddff8943e07d86fab2201f380 b/.git_disabled/objects/f8/98bae04737302ddff8943e07d86fab2201f380 new file mode 100755 index 0000000..60570c8 Binary files /dev/null and b/.git_disabled/objects/f8/98bae04737302ddff8943e07d86fab2201f380 differ diff --git a/.git_disabled/objects/f8/9914570edd84721c32d6edc1c5f2e410bb7431 b/.git_disabled/objects/f8/9914570edd84721c32d6edc1c5f2e410bb7431 new file mode 100755 index 0000000..3e9ae7f Binary files /dev/null and b/.git_disabled/objects/f8/9914570edd84721c32d6edc1c5f2e410bb7431 differ diff --git a/.git_disabled/objects/f8/d9b893942bdd4aac8e57a6db08dd4783a75e6c b/.git_disabled/objects/f8/d9b893942bdd4aac8e57a6db08dd4783a75e6c new file mode 100755 index 0000000..d3e9a8c Binary files /dev/null and b/.git_disabled/objects/f8/d9b893942bdd4aac8e57a6db08dd4783a75e6c differ diff --git a/.git_disabled/objects/f8/f9b8dd261d64b38eb91a2cf7bd9bc2beae9c42 b/.git_disabled/objects/f8/f9b8dd261d64b38eb91a2cf7bd9bc2beae9c42 new file mode 100755 index 0000000..cd0eb6b Binary files /dev/null and b/.git_disabled/objects/f8/f9b8dd261d64b38eb91a2cf7bd9bc2beae9c42 differ diff --git a/.git_disabled/objects/f9/0102e524feb4aa10b0d6be56d4bae3fb569b35 b/.git_disabled/objects/f9/0102e524feb4aa10b0d6be56d4bae3fb569b35 new file mode 100755 index 0000000..cdc3ffa Binary files /dev/null and b/.git_disabled/objects/f9/0102e524feb4aa10b0d6be56d4bae3fb569b35 differ diff --git a/.git_disabled/objects/f9/1467dd8f5bdee90cd39b33a2b2b6fcdbc02e41 b/.git_disabled/objects/f9/1467dd8f5bdee90cd39b33a2b2b6fcdbc02e41 new file mode 100755 index 0000000..3195684 Binary files /dev/null and b/.git_disabled/objects/f9/1467dd8f5bdee90cd39b33a2b2b6fcdbc02e41 differ diff --git a/.git_disabled/objects/f9/20070f0065c8da457051343acd3f62c8e54894 b/.git_disabled/objects/f9/20070f0065c8da457051343acd3f62c8e54894 new file mode 100755 index 0000000..54147bb Binary files /dev/null and b/.git_disabled/objects/f9/20070f0065c8da457051343acd3f62c8e54894 differ diff --git a/.git_disabled/objects/f9/2585840115b731fb281dbea6777655110b5f29 b/.git_disabled/objects/f9/2585840115b731fb281dbea6777655110b5f29 new file mode 100755 index 0000000..20efb2f Binary files /dev/null and b/.git_disabled/objects/f9/2585840115b731fb281dbea6777655110b5f29 differ diff --git a/.git_disabled/objects/f9/2630d04d9d785b4ad696feaa14dd390a2c0a04 b/.git_disabled/objects/f9/2630d04d9d785b4ad696feaa14dd390a2c0a04 new file mode 100755 index 0000000..39d903c Binary files /dev/null and b/.git_disabled/objects/f9/2630d04d9d785b4ad696feaa14dd390a2c0a04 differ diff --git a/.git_disabled/objects/f9/3155ec5ddeb8b97314edb5cdaf732aea88de4b b/.git_disabled/objects/f9/3155ec5ddeb8b97314edb5cdaf732aea88de4b new file mode 100755 index 0000000..b81ff74 Binary files /dev/null and b/.git_disabled/objects/f9/3155ec5ddeb8b97314edb5cdaf732aea88de4b differ diff --git a/.git_disabled/objects/f9/3637b5fa6f0dfa2d02551c2b447f96344d4c8b b/.git_disabled/objects/f9/3637b5fa6f0dfa2d02551c2b447f96344d4c8b new file mode 100755 index 0000000..fdeafbd Binary files /dev/null and b/.git_disabled/objects/f9/3637b5fa6f0dfa2d02551c2b447f96344d4c8b differ diff --git a/.git_disabled/objects/f9/38f7fcbf75a5f22a87fba2dea985dcaf23ad98 b/.git_disabled/objects/f9/38f7fcbf75a5f22a87fba2dea985dcaf23ad98 new file mode 100755 index 0000000..cd74ba8 Binary files /dev/null and b/.git_disabled/objects/f9/38f7fcbf75a5f22a87fba2dea985dcaf23ad98 differ diff --git a/.git_disabled/objects/f9/54fbd1d38c323b90fb2a308829bc5845470693 b/.git_disabled/objects/f9/54fbd1d38c323b90fb2a308829bc5845470693 new file mode 100755 index 0000000..422a33e --- /dev/null +++ b/.git_disabled/objects/f9/54fbd1d38c323b90fb2a308829bc5845470693 @@ -0,0 +1 @@ +xEI0s{f fP3c_7Bw lE'-T,1*hBIv4Vw݆hgt<@U664e_ t\?d$J \ No newline at end of file diff --git a/.git_disabled/objects/f9/77333b053886009352f30b41257f8a4c5dc9f8 b/.git_disabled/objects/f9/77333b053886009352f30b41257f8a4c5dc9f8 new file mode 100755 index 0000000..dd09b9f Binary files /dev/null and b/.git_disabled/objects/f9/77333b053886009352f30b41257f8a4c5dc9f8 differ diff --git a/.git_disabled/objects/f9/8082441061224405b1471e78a16647fc39e192 b/.git_disabled/objects/f9/8082441061224405b1471e78a16647fc39e192 new file mode 100755 index 0000000..a5883c0 Binary files /dev/null and b/.git_disabled/objects/f9/8082441061224405b1471e78a16647fc39e192 differ diff --git a/.git_disabled/objects/f9/a6668df4f395946c1b765b5c4118861e0ccd44 b/.git_disabled/objects/f9/a6668df4f395946c1b765b5c4118861e0ccd44 new file mode 100755 index 0000000..157368e Binary files /dev/null and b/.git_disabled/objects/f9/a6668df4f395946c1b765b5c4118861e0ccd44 differ diff --git a/.git_disabled/objects/f9/c6262ce0df2544411f43c4a98e57f396c746c5 b/.git_disabled/objects/f9/c6262ce0df2544411f43c4a98e57f396c746c5 new file mode 100755 index 0000000..4537ec6 Binary files /dev/null and b/.git_disabled/objects/f9/c6262ce0df2544411f43c4a98e57f396c746c5 differ diff --git a/.git_disabled/objects/f9/c76c60d808931a02a3fe8feab1bf4a7382855a b/.git_disabled/objects/f9/c76c60d808931a02a3fe8feab1bf4a7382855a new file mode 100755 index 0000000..813fad2 Binary files /dev/null and b/.git_disabled/objects/f9/c76c60d808931a02a3fe8feab1bf4a7382855a differ diff --git a/.git_disabled/objects/f9/f0124c4fd3b0b0f1d5e2d728b5bc3840e20f92 b/.git_disabled/objects/f9/f0124c4fd3b0b0f1d5e2d728b5bc3840e20f92 new file mode 100755 index 0000000..374baab Binary files /dev/null and b/.git_disabled/objects/f9/f0124c4fd3b0b0f1d5e2d728b5bc3840e20f92 differ diff --git a/.git_disabled/objects/f9/f0e5274e24fce92c808b437b43f5e1aed75b82 b/.git_disabled/objects/f9/f0e5274e24fce92c808b437b43f5e1aed75b82 new file mode 100755 index 0000000..0f10f33 Binary files /dev/null and b/.git_disabled/objects/f9/f0e5274e24fce92c808b437b43f5e1aed75b82 differ diff --git a/.git_disabled/objects/f9/fa52d904bbee7904a731094f817adfbb7c06aa b/.git_disabled/objects/f9/fa52d904bbee7904a731094f817adfbb7c06aa new file mode 100755 index 0000000..905c0d9 Binary files /dev/null and b/.git_disabled/objects/f9/fa52d904bbee7904a731094f817adfbb7c06aa differ diff --git a/.git_disabled/objects/fa/047a1ea34ddbd2204921a55e29a5856772af1a b/.git_disabled/objects/fa/047a1ea34ddbd2204921a55e29a5856772af1a new file mode 100755 index 0000000..b8142b6 Binary files /dev/null and b/.git_disabled/objects/fa/047a1ea34ddbd2204921a55e29a5856772af1a differ diff --git a/.git_disabled/objects/fa/1072ba0c3215074a64e12fe9c7ca1b4acc369d b/.git_disabled/objects/fa/1072ba0c3215074a64e12fe9c7ca1b4acc369d new file mode 100755 index 0000000..a7de7cc Binary files /dev/null and b/.git_disabled/objects/fa/1072ba0c3215074a64e12fe9c7ca1b4acc369d differ diff --git a/.git_disabled/objects/fa/11241c233ea94b52a35671376b7ab00dee049d b/.git_disabled/objects/fa/11241c233ea94b52a35671376b7ab00dee049d new file mode 100755 index 0000000..c7abf3c Binary files /dev/null and b/.git_disabled/objects/fa/11241c233ea94b52a35671376b7ab00dee049d differ diff --git a/.git_disabled/objects/fa/126f1f42beae8091500b8f01ed60757682d749 b/.git_disabled/objects/fa/126f1f42beae8091500b8f01ed60757682d749 new file mode 100755 index 0000000..5fdeb52 Binary files /dev/null and b/.git_disabled/objects/fa/126f1f42beae8091500b8f01ed60757682d749 differ diff --git a/.git_disabled/objects/fa/16b75e15c9b720bbc49c6cd9a53938dc82676f b/.git_disabled/objects/fa/16b75e15c9b720bbc49c6cd9a53938dc82676f new file mode 100755 index 0000000..ed58c01 Binary files /dev/null and b/.git_disabled/objects/fa/16b75e15c9b720bbc49c6cd9a53938dc82676f differ diff --git a/.git_disabled/objects/fa/1c160f4da9b94547c9f54a7ec70a3f7084551a b/.git_disabled/objects/fa/1c160f4da9b94547c9f54a7ec70a3f7084551a new file mode 100755 index 0000000..837c055 Binary files /dev/null and b/.git_disabled/objects/fa/1c160f4da9b94547c9f54a7ec70a3f7084551a differ diff --git a/.git_disabled/objects/fa/2423fd9b6d19d5a6087d602d35fdc3eecd7629 b/.git_disabled/objects/fa/2423fd9b6d19d5a6087d602d35fdc3eecd7629 new file mode 100755 index 0000000..5095ca8 Binary files /dev/null and b/.git_disabled/objects/fa/2423fd9b6d19d5a6087d602d35fdc3eecd7629 differ diff --git a/.git_disabled/objects/fa/256d90239224b95267001a23a653bee66308a2 b/.git_disabled/objects/fa/256d90239224b95267001a23a653bee66308a2 new file mode 100755 index 0000000..565d798 Binary files /dev/null and b/.git_disabled/objects/fa/256d90239224b95267001a23a653bee66308a2 differ diff --git a/.git_disabled/objects/fa/2f0bd3184a69f28cf19cdf53bf2fb6267445bc b/.git_disabled/objects/fa/2f0bd3184a69f28cf19cdf53bf2fb6267445bc new file mode 100755 index 0000000..209f5af Binary files /dev/null and b/.git_disabled/objects/fa/2f0bd3184a69f28cf19cdf53bf2fb6267445bc differ diff --git a/.git_disabled/objects/fa/326bb1ee23115a7a909e5ed4949e1f35e82b48 b/.git_disabled/objects/fa/326bb1ee23115a7a909e5ed4949e1f35e82b48 new file mode 100755 index 0000000..f310d50 Binary files /dev/null and b/.git_disabled/objects/fa/326bb1ee23115a7a909e5ed4949e1f35e82b48 differ diff --git a/.git_disabled/objects/fa/359f4e73dc47b6bb111af32a95249f9e1e9dd1 b/.git_disabled/objects/fa/359f4e73dc47b6bb111af32a95249f9e1e9dd1 new file mode 100755 index 0000000..6c5c798 Binary files /dev/null and b/.git_disabled/objects/fa/359f4e73dc47b6bb111af32a95249f9e1e9dd1 differ diff --git a/.git_disabled/objects/fa/4dc2eb3e8597eedfe943cb02c0c5ee628e3c49 b/.git_disabled/objects/fa/4dc2eb3e8597eedfe943cb02c0c5ee628e3c49 new file mode 100755 index 0000000..2e7ac0a Binary files /dev/null and b/.git_disabled/objects/fa/4dc2eb3e8597eedfe943cb02c0c5ee628e3c49 differ diff --git a/.git_disabled/objects/fa/5dac7f3c2b504d7ebe1c792c2412c104d66795 b/.git_disabled/objects/fa/5dac7f3c2b504d7ebe1c792c2412c104d66795 new file mode 100755 index 0000000..a4bd1b7 Binary files /dev/null and b/.git_disabled/objects/fa/5dac7f3c2b504d7ebe1c792c2412c104d66795 differ diff --git a/.git_disabled/objects/fa/66869d44e0faaaf80f57f42ada60cf96f044a9 b/.git_disabled/objects/fa/66869d44e0faaaf80f57f42ada60cf96f044a9 new file mode 100755 index 0000000..3854106 Binary files /dev/null and b/.git_disabled/objects/fa/66869d44e0faaaf80f57f42ada60cf96f044a9 differ diff --git a/.git_disabled/objects/fa/8508fcd1fbc51354f964ba7f610b8fe3026ffb b/.git_disabled/objects/fa/8508fcd1fbc51354f964ba7f610b8fe3026ffb new file mode 100755 index 0000000..82061c6 Binary files /dev/null and b/.git_disabled/objects/fa/8508fcd1fbc51354f964ba7f610b8fe3026ffb differ diff --git a/.git_disabled/objects/fa/868bf77faf76e412f5203bc25edac6a907fbcb b/.git_disabled/objects/fa/868bf77faf76e412f5203bc25edac6a907fbcb new file mode 100755 index 0000000..44829d1 Binary files /dev/null and b/.git_disabled/objects/fa/868bf77faf76e412f5203bc25edac6a907fbcb differ diff --git a/.git_disabled/objects/fa/8b362aa7ceb04bcf15a9f21fa7877235caff87 b/.git_disabled/objects/fa/8b362aa7ceb04bcf15a9f21fa7877235caff87 new file mode 100755 index 0000000..b1d3242 Binary files /dev/null and b/.git_disabled/objects/fa/8b362aa7ceb04bcf15a9f21fa7877235caff87 differ diff --git a/.git_disabled/objects/fa/940deef493b5048fb20ac1b9f0c97564330af6 b/.git_disabled/objects/fa/940deef493b5048fb20ac1b9f0c97564330af6 new file mode 100755 index 0000000..e2602d9 Binary files /dev/null and b/.git_disabled/objects/fa/940deef493b5048fb20ac1b9f0c97564330af6 differ diff --git a/.git_disabled/objects/fa/978950e0ddfe11f1c17cbeab498160f803accb b/.git_disabled/objects/fa/978950e0ddfe11f1c17cbeab498160f803accb new file mode 100755 index 0000000..4d2e108 Binary files /dev/null and b/.git_disabled/objects/fa/978950e0ddfe11f1c17cbeab498160f803accb differ diff --git a/.git_disabled/objects/fa/9e140440a56a1b994277f5f797888bde1508e6 b/.git_disabled/objects/fa/9e140440a56a1b994277f5f797888bde1508e6 new file mode 100755 index 0000000..b13da71 Binary files /dev/null and b/.git_disabled/objects/fa/9e140440a56a1b994277f5f797888bde1508e6 differ diff --git a/.git_disabled/objects/fa/a3b905759a57b7feee8d698192e63465e0f3a0 b/.git_disabled/objects/fa/a3b905759a57b7feee8d698192e63465e0f3a0 new file mode 100755 index 0000000..b1b755b Binary files /dev/null and b/.git_disabled/objects/fa/a3b905759a57b7feee8d698192e63465e0f3a0 differ diff --git a/.git_disabled/objects/fa/aee39467f457b0310495b91132018283de40bd b/.git_disabled/objects/fa/aee39467f457b0310495b91132018283de40bd new file mode 100755 index 0000000..9148fe3 Binary files /dev/null and b/.git_disabled/objects/fa/aee39467f457b0310495b91132018283de40bd differ diff --git a/.git_disabled/objects/fa/b30ebca70f37ba71e6af48357567b474fc3813 b/.git_disabled/objects/fa/b30ebca70f37ba71e6af48357567b474fc3813 new file mode 100755 index 0000000..84be770 Binary files /dev/null and b/.git_disabled/objects/fa/b30ebca70f37ba71e6af48357567b474fc3813 differ diff --git a/.git_disabled/objects/fa/b500df363dba75a1dab46c5677add2bab73463 b/.git_disabled/objects/fa/b500df363dba75a1dab46c5677add2bab73463 new file mode 100755 index 0000000..2d5cce5 Binary files /dev/null and b/.git_disabled/objects/fa/b500df363dba75a1dab46c5677add2bab73463 differ diff --git a/.git_disabled/objects/fa/b569e72835c37d6c5b61a9a3126b71f1e48001 b/.git_disabled/objects/fa/b569e72835c37d6c5b61a9a3126b71f1e48001 new file mode 100755 index 0000000..8e823c4 Binary files /dev/null and b/.git_disabled/objects/fa/b569e72835c37d6c5b61a9a3126b71f1e48001 differ diff --git a/.git_disabled/objects/fa/b6153016c46fed195fb39770dd41c20c5fd04f b/.git_disabled/objects/fa/b6153016c46fed195fb39770dd41c20c5fd04f new file mode 100755 index 0000000..e4fc038 --- /dev/null +++ b/.git_disabled/objects/fa/b6153016c46fed195fb39770dd41c20c5fd04f @@ -0,0 +1 @@ +xkoA쯘EٙٝZZ(k4fYve`Y~Z4BRf7\n=s&* ͓ 1aNYmC/\n#"3t*'L\y0(PJ$3aMSg 7iqe>(}Kf]=͑"шYaF[t3\x unR1A4-'JB-P7 2h(JJЋ,ڦYVB/kqZe"GZ!FǞ]pTm8PMm0=d dX}\M.6W{h\k^4FT8*pm4 W(۾ *1.[yvm[ ˋ^ʉUy9((yctTtQ[ÍRe8("(qCe_GSXtR(imOI~x@eoftWHQ8.r}vtu<:2N;&ijsXMKg}1  Ģw0BE"ڷphZ@/Ū2,1@!&6}+R3b{KJ*r֞ɱa)1&2?^"%D8OQ0# rug \ No newline at end of file diff --git a/.git_disabled/objects/fa/c50b5808c9343ab34316648ba03a895a33b1ee b/.git_disabled/objects/fa/c50b5808c9343ab34316648ba03a895a33b1ee new file mode 100755 index 0000000..de27761 Binary files /dev/null and b/.git_disabled/objects/fa/c50b5808c9343ab34316648ba03a895a33b1ee differ diff --git a/.git_disabled/objects/fa/c9a677f9d4e304d918c4cf8a75f3d9674ca892 b/.git_disabled/objects/fa/c9a677f9d4e304d918c4cf8a75f3d9674ca892 new file mode 100755 index 0000000..cf469e7 Binary files /dev/null and b/.git_disabled/objects/fa/c9a677f9d4e304d918c4cf8a75f3d9674ca892 differ diff --git a/.git_disabled/objects/fa/e8f445df2bfe3422982bd26248d9b9c5e8b402 b/.git_disabled/objects/fa/e8f445df2bfe3422982bd26248d9b9c5e8b402 new file mode 100755 index 0000000..3ba0a02 Binary files /dev/null and b/.git_disabled/objects/fa/e8f445df2bfe3422982bd26248d9b9c5e8b402 differ diff --git a/.git_disabled/objects/fa/fa11035f2799f714797e73bf018bed7a0b8864 b/.git_disabled/objects/fa/fa11035f2799f714797e73bf018bed7a0b8864 new file mode 100755 index 0000000..54ef0e2 Binary files /dev/null and b/.git_disabled/objects/fa/fa11035f2799f714797e73bf018bed7a0b8864 differ diff --git a/.git_disabled/objects/fb/20d36b56da439746493a5e8e9d76c66dad1013 b/.git_disabled/objects/fb/20d36b56da439746493a5e8e9d76c66dad1013 new file mode 100755 index 0000000..a779cc3 Binary files /dev/null and b/.git_disabled/objects/fb/20d36b56da439746493a5e8e9d76c66dad1013 differ diff --git a/.git_disabled/objects/fb/27f06d5d8fedc46718cfe482a0c15a554363d0 b/.git_disabled/objects/fb/27f06d5d8fedc46718cfe482a0c15a554363d0 new file mode 100755 index 0000000..daad7a9 Binary files /dev/null and b/.git_disabled/objects/fb/27f06d5d8fedc46718cfe482a0c15a554363d0 differ diff --git a/.git_disabled/objects/fb/32aea8257b2f3aa5e65ff116ae443ce0ad0ddb b/.git_disabled/objects/fb/32aea8257b2f3aa5e65ff116ae443ce0ad0ddb new file mode 100755 index 0000000..ae2311e Binary files /dev/null and b/.git_disabled/objects/fb/32aea8257b2f3aa5e65ff116ae443ce0ad0ddb differ diff --git a/.git_disabled/objects/fb/534d5e1a19921666fb92bfd79fc86617b3dcdf b/.git_disabled/objects/fb/534d5e1a19921666fb92bfd79fc86617b3dcdf new file mode 100755 index 0000000..976ccf6 Binary files /dev/null and b/.git_disabled/objects/fb/534d5e1a19921666fb92bfd79fc86617b3dcdf differ diff --git a/.git_disabled/objects/fb/59ddb89b9adaecde7384a95ea6ecfdf983e8ce b/.git_disabled/objects/fb/59ddb89b9adaecde7384a95ea6ecfdf983e8ce new file mode 100755 index 0000000..a29628f Binary files /dev/null and b/.git_disabled/objects/fb/59ddb89b9adaecde7384a95ea6ecfdf983e8ce differ diff --git a/.git_disabled/objects/fb/7c4c6395f2fd56a05167e3f0904a5eff72b008 b/.git_disabled/objects/fb/7c4c6395f2fd56a05167e3f0904a5eff72b008 new file mode 100755 index 0000000..764b4b5 Binary files /dev/null and b/.git_disabled/objects/fb/7c4c6395f2fd56a05167e3f0904a5eff72b008 differ diff --git a/.git_disabled/objects/fb/9d913e9fcec588e993fcfb9969dec06ab03afe b/.git_disabled/objects/fb/9d913e9fcec588e993fcfb9969dec06ab03afe new file mode 100755 index 0000000..992185d Binary files /dev/null and b/.git_disabled/objects/fb/9d913e9fcec588e993fcfb9969dec06ab03afe differ diff --git a/.git_disabled/objects/fb/a21a706bc007904464eb36136590da8bfb0036 b/.git_disabled/objects/fb/a21a706bc007904464eb36136590da8bfb0036 new file mode 100755 index 0000000..e5e4fc1 Binary files /dev/null and b/.git_disabled/objects/fb/a21a706bc007904464eb36136590da8bfb0036 differ diff --git a/.git_disabled/objects/fb/b51338e3de7fb8b2daecbf9b7f90c64bb7cd25 b/.git_disabled/objects/fb/b51338e3de7fb8b2daecbf9b7f90c64bb7cd25 new file mode 100755 index 0000000..181dc76 Binary files /dev/null and b/.git_disabled/objects/fb/b51338e3de7fb8b2daecbf9b7f90c64bb7cd25 differ diff --git a/.git_disabled/objects/fb/b6b14a9a8eae9dcaa66eb68ac36d2084617877 b/.git_disabled/objects/fb/b6b14a9a8eae9dcaa66eb68ac36d2084617877 new file mode 100755 index 0000000..3668b2a Binary files /dev/null and b/.git_disabled/objects/fb/b6b14a9a8eae9dcaa66eb68ac36d2084617877 differ diff --git a/.git_disabled/objects/fb/bf23fb1d3bca449f701884832b3eda13a5439c b/.git_disabled/objects/fb/bf23fb1d3bca449f701884832b3eda13a5439c new file mode 100755 index 0000000..c433f45 Binary files /dev/null and b/.git_disabled/objects/fb/bf23fb1d3bca449f701884832b3eda13a5439c differ diff --git a/.git_disabled/objects/fb/bf5ff607d8384c50c85a400b4b2350e54ee6c7 b/.git_disabled/objects/fb/bf5ff607d8384c50c85a400b4b2350e54ee6c7 new file mode 100755 index 0000000..abc0d81 Binary files /dev/null and b/.git_disabled/objects/fb/bf5ff607d8384c50c85a400b4b2350e54ee6c7 differ diff --git a/.git_disabled/objects/fb/c7cda41d913d256506cd569e875c5f4e7f0b23 b/.git_disabled/objects/fb/c7cda41d913d256506cd569e875c5f4e7f0b23 new file mode 100755 index 0000000..4938740 Binary files /dev/null and b/.git_disabled/objects/fb/c7cda41d913d256506cd569e875c5f4e7f0b23 differ diff --git a/.git_disabled/objects/fb/d38e7bd54538bd2a4bdda0a8e2f6def4fcffc5 b/.git_disabled/objects/fb/d38e7bd54538bd2a4bdda0a8e2f6def4fcffc5 new file mode 100755 index 0000000..182a633 Binary files /dev/null and b/.git_disabled/objects/fb/d38e7bd54538bd2a4bdda0a8e2f6def4fcffc5 differ diff --git a/.git_disabled/objects/fb/e14326eeaa18d54c8fb03949f317cbdde832d8 b/.git_disabled/objects/fb/e14326eeaa18d54c8fb03949f317cbdde832d8 new file mode 100755 index 0000000..396216b Binary files /dev/null and b/.git_disabled/objects/fb/e14326eeaa18d54c8fb03949f317cbdde832d8 differ diff --git a/.git_disabled/objects/fb/f5bbec5fe3b33d915577f61350198cf543dc8b b/.git_disabled/objects/fb/f5bbec5fe3b33d915577f61350198cf543dc8b new file mode 100755 index 0000000..338d0fb Binary files /dev/null and b/.git_disabled/objects/fb/f5bbec5fe3b33d915577f61350198cf543dc8b differ diff --git a/.git_disabled/objects/fb/fa6b2fcb5006fcbe9305bd641191cca4b59579 b/.git_disabled/objects/fb/fa6b2fcb5006fcbe9305bd641191cca4b59579 new file mode 100755 index 0000000..572b1c5 Binary files /dev/null and b/.git_disabled/objects/fb/fa6b2fcb5006fcbe9305bd641191cca4b59579 differ diff --git a/.git_disabled/objects/fc/26c94aa350596a07013878345f5f86067e7498 b/.git_disabled/objects/fc/26c94aa350596a07013878345f5f86067e7498 new file mode 100755 index 0000000..81b0f31 Binary files /dev/null and b/.git_disabled/objects/fc/26c94aa350596a07013878345f5f86067e7498 differ diff --git a/.git_disabled/objects/fc/39d13c9d1309671b0966592258569a5b7008bb b/.git_disabled/objects/fc/39d13c9d1309671b0966592258569a5b7008bb new file mode 100755 index 0000000..cccc84d Binary files /dev/null and b/.git_disabled/objects/fc/39d13c9d1309671b0966592258569a5b7008bb differ diff --git a/.git_disabled/objects/fc/3b3f467eca0961d0364030e9aa7b85d5ffb267 b/.git_disabled/objects/fc/3b3f467eca0961d0364030e9aa7b85d5ffb267 new file mode 100755 index 0000000..9930f2a Binary files /dev/null and b/.git_disabled/objects/fc/3b3f467eca0961d0364030e9aa7b85d5ffb267 differ diff --git a/.git_disabled/objects/fc/44ca8029f3fd1c436f986cf93a958ac0fd3247 b/.git_disabled/objects/fc/44ca8029f3fd1c436f986cf93a958ac0fd3247 new file mode 100755 index 0000000..a0bb179 Binary files /dev/null and b/.git_disabled/objects/fc/44ca8029f3fd1c436f986cf93a958ac0fd3247 differ diff --git a/.git_disabled/objects/fc/5e2ff2689a0ed436777d14771d055bd85f8826 b/.git_disabled/objects/fc/5e2ff2689a0ed436777d14771d055bd85f8826 new file mode 100755 index 0000000..6bcbe09 Binary files /dev/null and b/.git_disabled/objects/fc/5e2ff2689a0ed436777d14771d055bd85f8826 differ diff --git a/.git_disabled/objects/fc/8cd03d646b8ee8b60778e04e8c2b9a575311aa b/.git_disabled/objects/fc/8cd03d646b8ee8b60778e04e8c2b9a575311aa new file mode 100755 index 0000000..c04340e Binary files /dev/null and b/.git_disabled/objects/fc/8cd03d646b8ee8b60778e04e8c2b9a575311aa differ diff --git a/.git_disabled/objects/fc/a242a71aba62ca71493b031b51bd9c383e8e3e b/.git_disabled/objects/fc/a242a71aba62ca71493b031b51bd9c383e8e3e new file mode 100755 index 0000000..8150a2d Binary files /dev/null and b/.git_disabled/objects/fc/a242a71aba62ca71493b031b51bd9c383e8e3e differ diff --git a/.git_disabled/objects/fc/a4b937f3abecacc1e156040780686d6064746d b/.git_disabled/objects/fc/a4b937f3abecacc1e156040780686d6064746d new file mode 100755 index 0000000..a18cdda Binary files /dev/null and b/.git_disabled/objects/fc/a4b937f3abecacc1e156040780686d6064746d differ diff --git a/.git_disabled/objects/fc/ab3ecbed7369040ab770996aa0c480394b2353 b/.git_disabled/objects/fc/ab3ecbed7369040ab770996aa0c480394b2353 new file mode 100755 index 0000000..6937504 Binary files /dev/null and b/.git_disabled/objects/fc/ab3ecbed7369040ab770996aa0c480394b2353 differ diff --git a/.git_disabled/objects/fc/b96b96975d12f3eb20f459b8f9b44b287b43d0 b/.git_disabled/objects/fc/b96b96975d12f3eb20f459b8f9b44b287b43d0 new file mode 100755 index 0000000..cc794ef Binary files /dev/null and b/.git_disabled/objects/fc/b96b96975d12f3eb20f459b8f9b44b287b43d0 differ diff --git a/.git_disabled/objects/fc/bd332f1bb39f87a83e9ed8163d86a00bccc9e8 b/.git_disabled/objects/fc/bd332f1bb39f87a83e9ed8163d86a00bccc9e8 new file mode 100755 index 0000000..ca9960d Binary files /dev/null and b/.git_disabled/objects/fc/bd332f1bb39f87a83e9ed8163d86a00bccc9e8 differ diff --git a/.git_disabled/objects/fd/04670a19fd749a366c004594a3258b40127ab2 b/.git_disabled/objects/fd/04670a19fd749a366c004594a3258b40127ab2 new file mode 100755 index 0000000..6b39cd4 Binary files /dev/null and b/.git_disabled/objects/fd/04670a19fd749a366c004594a3258b40127ab2 differ diff --git a/.git_disabled/objects/fd/1f9b49044b1d539f702a532f7b3a4d8fd39917 b/.git_disabled/objects/fd/1f9b49044b1d539f702a532f7b3a4d8fd39917 new file mode 100755 index 0000000..ffbeec2 --- /dev/null +++ b/.git_disabled/objects/fd/1f9b49044b1d539f702a532f7b3a4d8fd39917 @@ -0,0 +1,3 @@ +xTn@홯RH%GT!`ca|pab +tw|[~z 3o{˺k]}yVj3A<^VRLƹ̱_2^,H "w,vUĥ`<9#$^bώ!,.,xQXui KƸP]|Pt0ּzV/JIh4@EZ?s)D 53[Rifhڞ.Ϝ6OOrn9D4ij ix'zcNRQX O?:OF`=f2{)Q ڟRQ׊]ZۣofOUF`*:\6 +-*:'CHfڵ14Kl)q?^Jׯ^@?HuB;HvފLt$ 3Nfuw0zX,f4^hՇ)ju}"_] bR4Ii-*PYc"_¯VQ2*wN"s0?u3cCRXLcZ c +P[V#鰷&fꥂwp_ZϢSUpVKd4>},Z|.OiW[6Н!8{{|".fD!rсx`dїV–#T(^U逄DlpXml&3U\p\rsS{4!Ķ6Mgx>|\1}rYomnov?ąv{P_xvY +xBt:Ó=rE3=*@fw l?l(Fi fSAt՜tnRH^#ןf-I\h뢺29r$j.!eAgwҞ.QF9M/H>ݡJBP֛oѹvn{!]#t \ No newline at end of file diff --git a/.git_disabled/objects/fd/7eb2d956b4d6ae0b61e6212c18ec5a1a7f2f48 b/.git_disabled/objects/fd/7eb2d956b4d6ae0b61e6212c18ec5a1a7f2f48 new file mode 100755 index 0000000..ca299b0 Binary files /dev/null and b/.git_disabled/objects/fd/7eb2d956b4d6ae0b61e6212c18ec5a1a7f2f48 differ diff --git a/.git_disabled/objects/fd/82e9ababf39eb32e41d41890b5e353b59601f3 b/.git_disabled/objects/fd/82e9ababf39eb32e41d41890b5e353b59601f3 new file mode 100755 index 0000000..e07bf12 Binary files /dev/null and b/.git_disabled/objects/fd/82e9ababf39eb32e41d41890b5e353b59601f3 differ diff --git a/.git_disabled/objects/fd/89a0b18fe986784a983c6b20fd441539138275 b/.git_disabled/objects/fd/89a0b18fe986784a983c6b20fd441539138275 new file mode 100755 index 0000000..62bce74 Binary files /dev/null and b/.git_disabled/objects/fd/89a0b18fe986784a983c6b20fd441539138275 differ diff --git a/.git_disabled/objects/fd/a6d3b3a28a442904966a94f430a9753dfc4cd2 b/.git_disabled/objects/fd/a6d3b3a28a442904966a94f430a9753dfc4cd2 new file mode 100755 index 0000000..be5a393 Binary files /dev/null and b/.git_disabled/objects/fd/a6d3b3a28a442904966a94f430a9753dfc4cd2 differ diff --git a/.git_disabled/objects/fd/cc46a637b36065824d6062df711f60b0300b8f b/.git_disabled/objects/fd/cc46a637b36065824d6062df711f60b0300b8f new file mode 100755 index 0000000..e2356c0 Binary files /dev/null and b/.git_disabled/objects/fd/cc46a637b36065824d6062df711f60b0300b8f differ diff --git a/.git_disabled/objects/fd/d35cba6d73e855cb124666c78e235142507d97 b/.git_disabled/objects/fd/d35cba6d73e855cb124666c78e235142507d97 new file mode 100755 index 0000000..cd7e454 Binary files /dev/null and b/.git_disabled/objects/fd/d35cba6d73e855cb124666c78e235142507d97 differ diff --git a/.git_disabled/objects/fd/ea21de51412772067e198f0cdd1eb34046b203 b/.git_disabled/objects/fd/ea21de51412772067e198f0cdd1eb34046b203 new file mode 100755 index 0000000..99ef289 Binary files /dev/null and b/.git_disabled/objects/fd/ea21de51412772067e198f0cdd1eb34046b203 differ diff --git a/.git_disabled/objects/fd/eebbde7f69bb358a50240b6bb292901af4d866 b/.git_disabled/objects/fd/eebbde7f69bb358a50240b6bb292901af4d866 new file mode 100755 index 0000000..5c9f0f8 Binary files /dev/null and b/.git_disabled/objects/fd/eebbde7f69bb358a50240b6bb292901af4d866 differ diff --git a/.git_disabled/objects/fe/201e04d9734efd772cf059da2d8954f7fd4cbe b/.git_disabled/objects/fe/201e04d9734efd772cf059da2d8954f7fd4cbe new file mode 100755 index 0000000..3aa9077 Binary files /dev/null and b/.git_disabled/objects/fe/201e04d9734efd772cf059da2d8954f7fd4cbe differ diff --git a/.git_disabled/objects/fe/27fdfc195d7befe9c66f7b4a8d06f105fc812e b/.git_disabled/objects/fe/27fdfc195d7befe9c66f7b4a8d06f105fc812e new file mode 100755 index 0000000..da75268 Binary files /dev/null and b/.git_disabled/objects/fe/27fdfc195d7befe9c66f7b4a8d06f105fc812e differ diff --git a/.git_disabled/objects/fe/2d1ef6ff8dea9c70c3ce452d60ed286c3bfade b/.git_disabled/objects/fe/2d1ef6ff8dea9c70c3ce452d60ed286c3bfade new file mode 100755 index 0000000..9d5c715 Binary files /dev/null and b/.git_disabled/objects/fe/2d1ef6ff8dea9c70c3ce452d60ed286c3bfade differ diff --git a/.git_disabled/objects/fe/36bb1a613ed02302286f938c7a46cc422a9131 b/.git_disabled/objects/fe/36bb1a613ed02302286f938c7a46cc422a9131 new file mode 100755 index 0000000..86f9458 Binary files /dev/null and b/.git_disabled/objects/fe/36bb1a613ed02302286f938c7a46cc422a9131 differ diff --git a/.git_disabled/objects/fe/4d89368419484d25a6bb594100476d4678cd01 b/.git_disabled/objects/fe/4d89368419484d25a6bb594100476d4678cd01 new file mode 100755 index 0000000..8aa5174 Binary files /dev/null and b/.git_disabled/objects/fe/4d89368419484d25a6bb594100476d4678cd01 differ diff --git a/.git_disabled/objects/fe/52a6cf9f097aafc97e7bd8d945c5682ced9bc3 b/.git_disabled/objects/fe/52a6cf9f097aafc97e7bd8d945c5682ced9bc3 new file mode 100755 index 0000000..84600d6 Binary files /dev/null and b/.git_disabled/objects/fe/52a6cf9f097aafc97e7bd8d945c5682ced9bc3 differ diff --git a/.git_disabled/objects/fe/62f231ee16f6163eb91026656023c3ac2c2670 b/.git_disabled/objects/fe/62f231ee16f6163eb91026656023c3ac2c2670 new file mode 100755 index 0000000..38b1490 --- /dev/null +++ b/.git_disabled/objects/fe/62f231ee16f6163eb91026656023c3ac2c2670 @@ -0,0 +1,3 @@ +xuOv)Q`)%FM@[!pX48KRy/Ϙ__|g^{÷ƛGM a}ĬY7e]`o156f_̜fof)Ĭ?j1k5f>Y̚fͿ5k5͚N?c5f +Y̚fs/0/1ߏu_6 +-f:wYڬzzzzefobcm}z߿OzCfwYϬc>he6}oXx|2e> o3|I|YrYrYqcfڗ//2k_n־o־1k_6k_`־6k_4k_N5k_ReҬ}Yn־k־L/Kڗ3cA YYYYSSnNf&iƬ}h>MOWOOO7kڧ ڧwO0k֙Oo2kVOgO+ڧԬ}:ެ}^OOOÊ>=m>=e>=i>=a>1kl>=n>6kd>Ѭ}Ü 2|5147W_W__uuu4~a=3u?72zaYY3~fO̺u?23~h={Y=^31k=|Ǭ{۬{ˬ{m=i=|۬{YMf;̺u_5Zv+f×ͺ/u_4n3n5n1n6n2`=|ެ{Ѭ{{ެ{h̺̺]fõfNaYݬ{f=l5f̺-f5ffaYѬ{6jjaY9aYY*3fÕfçͺ+̺ͺ̺Ogm_ o{ \ No newline at end of file diff --git a/.git_disabled/objects/fe/6c21f74ed78bb29b7cbb678d856c44fb0dccbc b/.git_disabled/objects/fe/6c21f74ed78bb29b7cbb678d856c44fb0dccbc new file mode 100755 index 0000000..694b117 Binary files /dev/null and b/.git_disabled/objects/fe/6c21f74ed78bb29b7cbb678d856c44fb0dccbc differ diff --git a/.git_disabled/objects/fe/71daf0cef54ac832e8ffe676ba46e0fff0a4dd b/.git_disabled/objects/fe/71daf0cef54ac832e8ffe676ba46e0fff0a4dd new file mode 100755 index 0000000..c076e97 Binary files /dev/null and b/.git_disabled/objects/fe/71daf0cef54ac832e8ffe676ba46e0fff0a4dd differ diff --git a/.git_disabled/objects/fe/733c77a47cf4e65853aad89a0317e3f0ea0bf2 b/.git_disabled/objects/fe/733c77a47cf4e65853aad89a0317e3f0ea0bf2 new file mode 100755 index 0000000..9a2000b Binary files /dev/null and b/.git_disabled/objects/fe/733c77a47cf4e65853aad89a0317e3f0ea0bf2 differ diff --git a/.git_disabled/objects/fe/7c01aa90e2b2c3c1794c9e1c00aaa360b25358 b/.git_disabled/objects/fe/7c01aa90e2b2c3c1794c9e1c00aaa360b25358 new file mode 100755 index 0000000..cefade2 Binary files /dev/null and b/.git_disabled/objects/fe/7c01aa90e2b2c3c1794c9e1c00aaa360b25358 differ diff --git a/.git_disabled/objects/fe/7f3c7a4009450dec7e4d934a4b4e42956cd098 b/.git_disabled/objects/fe/7f3c7a4009450dec7e4d934a4b4e42956cd098 new file mode 100755 index 0000000..110bfd1 Binary files /dev/null and b/.git_disabled/objects/fe/7f3c7a4009450dec7e4d934a4b4e42956cd098 differ diff --git a/.git_disabled/objects/fe/9c90fdb7b4dee03f695887e68251f455ea2de2 b/.git_disabled/objects/fe/9c90fdb7b4dee03f695887e68251f455ea2de2 new file mode 100755 index 0000000..4a9c043 --- /dev/null +++ b/.git_disabled/objects/fe/9c90fdb7b4dee03f695887e68251f455ea2de2 @@ -0,0 +1 @@ +x=P@8@()atsvm&Q)))dƆJKpk;ygDImnn2Zw<Š Kód elkészítése -> Automatikus tesztelés (Terminal) -> Technikai leírás. + + Ha a tesztek sikeresek: Külső működés ellenőrzése -> Naplózás -> Dokumentáció véglegesítése (Manual & Wiki). + + Az Igazság Forrása (2A): Mindig a kód a mérvadó. Ha eltérést találsz a kód és a Wiki között, a kódból indulj ki, és javasold a Wiki frissítését. + + Vizualizáció: Használj Mermaid diagramokat a robotok logikai folyamatainak tisztázására. Kerüld az idézőjeleket "" és zárójeleket () a Mermaid szögletes zárójelein [] belül. + + Módváltás: A tervezés és jóváhagyás után használd a switch_mode eszközt az implementációhoz (Act mode). + + Fájlkezelés: Minden tervet és plan.md fájlt a /plans könyvtárba ments el. + + Szigorú tiltás: Soha ne becsülj meg munkaidőt (óra, nap). Csak a logikai lépéseket és a készültségi állapotot kezeld. \ No newline at end of file diff --git a/.roo/rules-code/fast-coder.md b/.roo/rules-code/fast-coder.md new file mode 100644 index 0000000..a3fb038 --- /dev/null +++ b/.roo/rules-code/fast-coder.md @@ -0,0 +1,12 @@ +# 💻 Service Finder Core Developer (Fast Coder) Protokoll + +## ⚡ Implementációs Irányelvek +1. **Surgical Coding:** Csak a `logic_spec_*.md` fájlban kijelölt részeket módosítsd. Használd a FastAPI best practice-eket. +2. **Adatbázis Műveletek:** - Generáld le az Alembic migrációt. + - Ellenőrizd a Twin-technika és Soft-delete érvényesülését. +3. **Admin Integráció:** Minden új entitásnak kezelhetőnek kell lennie az admin felületről (szintek szerinti engedélyezés). +4. **Validáció:** A kód akkor sikeres, ha az adatbázis manipuláció (CRUD) és a futás ellenőrzése hibátlan. + +## 📝 Naplózás és Tesztelés +- Minden folyamatot dedikált log fájlokba naplózz. +- A kód elkészítése után futtass ellenőrzést. Ha hiba van, jelezd a Debuggernek vagy kérj segítséget az Architecttől. \ No newline at end of file diff --git a/.roo/rules-debug/debugger.md b/.roo/rules-debug/debugger.md new file mode 100644 index 0000000..2224c32 --- /dev/null +++ b/.roo/rules-debug/debugger.md @@ -0,0 +1,10 @@ +# 🔍 Service Finder Debugger & QA Protokoll + +## 🛡️ Minőségbiztosítási Feladatok +1. **Logikai Konzisztenia Audit:** Ellenőrizd, hogy a kód megfelel-e a MasterBook2 és a `logic_spec` logikájának. +2. **Adatbázis Ellenőrzés:** SQL lekérdezésekkel vizsgáld meg, hogy az Alembic migráció és a Twin-adatok rendben vannak-e. +3. **Záró Dokumentáció (MD alapú):** + - **Wiki:** Frissítsd a modul leírását. + - **User Manual:** Készíts útmutatót egyéni és kis cégek számára. + - **Tech Doc:** Részletes leírás fejlesztőknek a gyors hibakereséshez. +4. **Kanban Lezárás:** Csak minden dokumentum elkészülte után mozgasd a kártyát "Done" státuszba. \ No newline at end of file diff --git a/.roo/rules-robots/logic_spec_robot_0_gb_discovery.md b/.roo/rules-robots/logic_spec_robot_0_gb_discovery.md new file mode 100644 index 0000000..7ba8350 --- /dev/null +++ b/.roo/rules-robots/logic_spec_robot_0_gb_discovery.md @@ -0,0 +1,11 @@ +# 🤖 Robot-0-GB: GB Discovery Engine (A Brit Felfedező) + +## 🎯 Cél +Az angol piac speciális betöltője. Mivel a DVLA API nem listázható típusok szerint (csak rendszám alapján), ez a robot egy nyílt adathalmazt (UK MOT CSV) olvas be. A CSV-ből kinyeri az elsődleges rendszámokat és modellneveket, és egy dedikált `gb_catalog_discovery` várólistára teszi őket, de csak azokat, amelyek még nincsenek a mesterkatalógusunkban! + +## 🗄️ Adatbázis Érintettség +- Létrehozza és tölti a `data.gb_catalog_discovery` (id, vrm, make, model, status) táblát. +- Differential Sync (Különbözeti Szinkron): Szűr a `data.vehicle_model_definitions` tábla `gold_enriched` státusza alapján. + +## ⚙️ Folyamat +Napi egyszer lefut, végignyálazza a helyi `/mnt/nas/app_data/uk_mot_data.csv` fájlt. Ha új modellt lát, beírja a rendszámát `pending` státusszal. \ No newline at end of file diff --git a/.roo/rules-robots/logic_spec_robot_1_gb_hunter.md b/.roo/rules-robots/logic_spec_robot_1_gb_hunter.md new file mode 100644 index 0000000..b3c9f3d --- /dev/null +++ b/.roo/rules-robots/logic_spec_robot_1_gb_hunter.md @@ -0,0 +1,12 @@ +# 🤖 Robot-1-GB: GB Hunter (A DVLA Mesterlövész) + +## 🎯 Cél +A `gb_catalog_discovery` táblában lévő `pending` rendszámokra küld lekérdezést a hivatalos brit kormányszerver felé (DVLA VES API). Az így kapott 100%-ig hiteles technikai adatokat (lökettérfogat, üzemanyag, CO2, évjárat) betölti az európai mestertáblába (`vehicle_model_definitions`) `ACTIVE` státusszal. + +## 🗄️ Adatbázis Érintettség +- **Atomi zárolás:** `FOR UPDATE SKIP LOCKED` a `gb_catalog_discovery` táblán. +- **Írás:** `data.vehicle_model_definitions` (`INSERT ... ON CONFLICT DO NOTHING`). + +## 🧠 Biztonság és API +- **Kvóta Védelem:** A `QuotaManager` naplózza a futásokat a `.quota_dvla.json` fájlban. Szigorúan figyeli a `DVLA_DAILY_LIMIT` (pl. 1000) változót az `.env` fájlból. +- **Hibatűrés:** Kezeli a 404 (Érvénytelen rendszám), 403 (Rossz API kulcs) és 429 (Rate Limit) hibákat anélkül, hogy összeomlana. \ No newline at end of file diff --git a/.roo/rules/global.md b/.roo/rules/global.md new file mode 100644 index 0000000..c192c8e --- /dev/null +++ b/.roo/rules/global.md @@ -0,0 +1,23 @@ +# Service Finder Projekt Alkotmány + +## 1. Működési Alapelvek +- **Elsődleges Igazság (2A):** A forráskód a mérvadó. A Wiki.js dokumentációnak követnie kell a kódot. +- **Munkafolyamat (1B):** Terv (Architect) -> Jóváhagyás -> Megvalósítás (Code) -> Tesztelés -> Dokumentálás. +- **Granularitás (3A):** Minden logikai egység (robot funkció) külön Focalboard kártyát kap. + +## 2. Eszközhasználati Szabályok +- **Focalboard:** Minden munkafázist (Doing, Testing, Done) itt kell követni. +- **Gitea:** Minden sikeres teszt után kötelező a commit, a kártya sorszámával a leírásban. +- **Postgres:** A Wiki.js (postgres-wiki) tartalmát minden módosítás után ellenőrizni és frissíteni kell. + +## 3. Minőségbiztosítás (4-igen) +- Nincs késznek jelentett kód automatizált tesztelés nélkül. +- A terminálban futtatott tesztek kimenetét csatolni kell a feladat lezárásához. +- A dokumentációs lánc kötelező elemei: + 1. Technikai leírás (kódban) + 2. Felhasználói manual vázlat (chatben) + 3. Wiki.js frissítés (Postgres-en keresztül). + +## 4. Architect vs. Code elkülönítés +- **Architect (Reasoner R1):** Tervez, auditál, adatbázist elemez, Mermaid diagramokat rajzol, és `/plans/plan.md` fájlokat hoz létre. +- **Code (Fast Coder/Chat):** Szigorúan a `/plans` mappából dolgozik, kódot ír, tesztel és commitol. \ No newline at end of file diff --git a/.vscode_config/.bashrc b/.vscode_config/.bashrc new file mode 100755 index 0000000..8606bd4 --- /dev/null +++ b/.vscode_config/.bashrc @@ -0,0 +1 @@ +export DOCKER_API_VERSION=1.41 diff --git a/.vscode_config/.cache/Microsoft/DeveloperTools/deviceid b/.vscode_config/.cache/Microsoft/DeveloperTools/deviceid new file mode 100755 index 0000000..13ac7fc --- /dev/null +++ b/.vscode_config/.cache/Microsoft/DeveloperTools/deviceid @@ -0,0 +1 @@ +d1ac84bc-108c-489c-87af-0afe360c0c05 \ No newline at end of file diff --git a/.vscode_config/.cache/typescript/5.9/package.json b/.vscode_config/.cache/typescript/5.9/package.json new file mode 100755 index 0000000..cc0458e --- /dev/null +++ b/.vscode_config/.cache/typescript/5.9/package.json @@ -0,0 +1 @@ +{ "private": true } \ No newline at end of file diff --git a/.vscode_config/.config/code-server/config.yaml b/.vscode_config/.config/code-server/config.yaml new file mode 100755 index 0000000..1c80291 --- /dev/null +++ b/.vscode_config/.config/code-server/config.yaml @@ -0,0 +1,4 @@ +bind-addr: 127.0.0.1:8080 +auth: password +password: c57656fba2427a75970869df +cert: false diff --git a/.vscode_config/.local/share/code-server/CachedProfilesData/__default__profile__/extensions.builtin.cache b/.vscode_config/.local/share/code-server/CachedProfilesData/__default__profile__/extensions.builtin.cache new file mode 100755 index 0000000..3c82b37 --- /dev/null +++ b/.vscode_config/.local/share/code-server/CachedProfilesData/__default__profile__/extensions.builtin.cache @@ -0,0 +1 @@ +{"input":{"location":{"$mid":1,"fsPath":"/usr/lib/code-server/lib/vscode/extensions","path":"/usr/lib/code-server/lib/vscode/extensions","scheme":"file"},"mtime":1768623069000,"profile":false,"type":0,"validate":true,"productVersion":"1.108.1","productDate":"2026-01-17T02:07:59.304Z","productCommit":"ba588b47099b31ad9734ef05534e9813bae22c64","devMode":false,"language":"en","translations":{}},"result":[{"type":0,"identifier":{"id":"vscode.bat"},"manifest":{"name":"bat","displayName":"Windows Bat Language Basics","description":"Provides snippets, syntax highlighting, bracket matching and folding in Windows batch files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"^1.52.0"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin mmims/language-batchfile grammars/batchfile.cson ./syntaxes/batchfile.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"bat","extensions":[".bat",".cmd"],"aliases":["Batch","bat"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"bat","scopeName":"source.batchfile","path":"./syntaxes/batchfile.tmLanguage.json"}],"snippets":[{"language":"bat","path":"./snippets/batchfile.code-snippets"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/bat","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.clojure"},"manifest":{"name":"clojure","displayName":"Clojure Language Basics","description":"Provides syntax highlighting and bracket matching in Clojure files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin atom/language-clojure grammars/clojure.cson ./syntaxes/clojure.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"clojure","aliases":["Clojure","clojure"],"extensions":[".clj",".cljs",".cljc",".cljx",".clojure",".edn"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"clojure","scopeName":"source.clojure","path":"./syntaxes/clojure.tmLanguage.json"}],"configurationDefaults":{"[clojure]":{"diffEditor.ignoreTrimWhitespace":false}}},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/clojure","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.coffeescript"},"manifest":{"name":"coffeescript","displayName":"CoffeeScript Language Basics","description":"Provides snippets, syntax highlighting, bracket matching and folding in CoffeeScript files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin atom/language-coffee-script grammars/coffeescript.cson ./syntaxes/coffeescript.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"coffeescript","extensions":[".coffee",".cson",".iced"],"aliases":["CoffeeScript","coffeescript","coffee"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"coffeescript","scopeName":"source.coffee","path":"./syntaxes/coffeescript.tmLanguage.json"}],"breakpoints":[{"language":"coffeescript"}],"snippets":[{"language":"coffeescript","path":"./snippets/coffeescript.code-snippets"}],"configurationDefaults":{"[coffeescript]":{"diffEditor.ignoreTrimWhitespace":false,"editor.defaultColorDecorators":"never"}}},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/coffeescript","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.configuration-editing"},"manifest":{"name":"configuration-editing","displayName":"Configuration Editing","description":"Provides capabilities (advanced IntelliSense, auto-fixing) in configuration files like settings, launch, and extension recommendation files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"^1.0.0"},"icon":"images/icon.png","activationEvents":["onProfile","onProfile:github","onLanguage:json","onLanguage:jsonc"],"enabledApiProposals":["profileContentHandlers"],"main":"./dist/configurationEditingMain","browser":"./dist/browser/configurationEditingMain","capabilities":{"virtualWorkspaces":true,"untrustedWorkspaces":{"supported":true}},"contributes":{"languages":[{"id":"jsonc","extensions":[".code-workspace","language-configuration.json","icon-theme.json","color-theme.json"],"filenames":["settings.json","launch.json","tasks.json","mcp.json","keybindings.json","extensions.json","argv.json","profiles.json","devcontainer.json",".devcontainer.json"]},{"id":"json","extensions":[".code-profile"]}],"jsonValidation":[{"fileMatch":"vscode://defaultsettings/keybindings.json","url":"vscode://schemas/keybindings"},{"fileMatch":"%APP_SETTINGS_HOME%/keybindings.json","url":"vscode://schemas/keybindings"},{"fileMatch":"%APP_SETTINGS_HOME%/profiles/*/keybindings.json","url":"vscode://schemas/keybindings"},{"fileMatch":"vscode://defaultsettings/*.json","url":"vscode://schemas/settings/default"},{"fileMatch":"%APP_SETTINGS_HOME%/settings.json","url":"vscode://schemas/settings/user"},{"fileMatch":"%APP_SETTINGS_HOME%/profiles/*/settings.json","url":"vscode://schemas/settings/profile"},{"fileMatch":"%MACHINE_SETTINGS_HOME%/settings.json","url":"vscode://schemas/settings/machine"},{"fileMatch":"%APP_WORKSPACES_HOME%/*/workspace.json","url":"vscode://schemas/workspaceConfig"},{"fileMatch":"**/*.code-workspace","url":"vscode://schemas/workspaceConfig"},{"fileMatch":"**/argv.json","url":"vscode://schemas/argv"},{"fileMatch":"/.vscode/settings.json","url":"vscode://schemas/settings/folder"},{"fileMatch":"/.vscode/launch.json","url":"vscode://schemas/launch"},{"fileMatch":"/.vscode/tasks.json","url":"vscode://schemas/tasks"},{"fileMatch":"/.vscode/mcp.json","url":"vscode://schemas/mcp"},{"fileMatch":"%APP_SETTINGS_HOME%/tasks.json","url":"vscode://schemas/tasks"},{"fileMatch":"%APP_SETTINGS_HOME%/snippets/*.json","url":"vscode://schemas/snippets"},{"fileMatch":"%APP_SETTINGS_HOME%/prompts/*.toolsets.jsonc","url":"vscode://schemas/toolsets"},{"fileMatch":"%APP_SETTINGS_HOME%/profiles/*/snippets/.json","url":"vscode://schemas/snippets"},{"fileMatch":"%APP_SETTINGS_HOME%/sync/snippets/preview/*.json","url":"vscode://schemas/snippets"},{"fileMatch":"**/*.code-snippets","url":"vscode://schemas/global-snippets"},{"fileMatch":"/.vscode/extensions.json","url":"vscode://schemas/extensions"},{"fileMatch":"devcontainer.json","url":"https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.schema.json"},{"fileMatch":".devcontainer.json","url":"https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.schema.json"},{"fileMatch":"%APP_SETTINGS_HOME%/globalStorage/ms-vscode-remote.remote-containers/nameConfigs/*.json","url":"./schemas/attachContainer.schema.json"},{"fileMatch":"%APP_SETTINGS_HOME%/globalStorage/ms-vscode-remote.remote-containers/imageConfigs/*.json","url":"./schemas/attachContainer.schema.json"},{"fileMatch":"**/quality/*/product.json","url":"vscode://schemas/vscode-product"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/configuration-editing","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.cpp"},"manifest":{"name":"cpp","displayName":"C/C++ Language Basics","description":"Provides snippets, syntax highlighting, bracket matching and folding in C/C++ files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ./build/update-grammars.js"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"c","extensions":[".c",".i"],"aliases":["C","c"],"configuration":"./language-configuration.json"},{"id":"cpp","extensions":[".cpp",".cppm",".cc",".ccm",".cxx",".cxxm",".c++",".c++m",".hpp",".hh",".hxx",".h++",".h",".ii",".ino",".inl",".ipp",".ixx",".tpp",".txx",".hpp.in",".h.in"],"aliases":["C++","Cpp","cpp"],"configuration":"./language-configuration.json"},{"id":"cuda-cpp","extensions":[".cu",".cuh"],"aliases":["CUDA C++"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"c","scopeName":"source.c","path":"./syntaxes/c.tmLanguage.json"},{"language":"cpp","scopeName":"source.cpp.embedded.macro","path":"./syntaxes/cpp.embedded.macro.tmLanguage.json"},{"language":"cpp","scopeName":"source.cpp","path":"./syntaxes/cpp.tmLanguage.json"},{"scopeName":"source.c.platform","path":"./syntaxes/platform.tmLanguage.json"},{"language":"cuda-cpp","scopeName":"source.cuda-cpp","path":"./syntaxes/cuda-cpp.tmLanguage.json"}],"problemPatterns":[{"name":"nvcc-location","regexp":"^(.*)\\((\\d+)\\):\\s+(warning|error):\\s+(.*)","kind":"location","file":1,"location":2,"severity":3,"message":4}],"problemMatchers":[{"name":"nvcc","owner":"cuda-cpp","fileLocation":["relative","${workspaceFolder}"],"pattern":"$nvcc-location"}],"snippets":[{"language":"c","path":"./snippets/c.code-snippets"},{"language":"cpp","path":"./snippets/cpp.code-snippets"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/cpp","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.csharp"},"manifest":{"name":"csharp","displayName":"C# Language Basics","description":"Provides snippets, syntax highlighting, bracket matching and folding in C# files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"0.10.x"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin dotnet/csharp-tmLanguage grammars/csharp.tmLanguage ./syntaxes/csharp.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"configurationDefaults":{"[csharp]":{"editor.maxTokenizationLineLength":2500}},"languages":[{"id":"csharp","extensions":[".cs",".csx",".cake"],"aliases":["C#","csharp"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"csharp","scopeName":"source.cs","path":"./syntaxes/csharp.tmLanguage.json","tokenTypes":{"meta.interpolation":"other"},"unbalancedBracketScopes":["keyword.operator.relational.cs","keyword.operator.arrow.cs","punctuation.accessor.pointer.cs","keyword.operator.bitwise.shift.cs","keyword.operator.assignment.compound.bitwise.cs"]}],"snippets":[{"language":"csharp","path":"./snippets/csharp.code-snippets"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/csharp","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.css"},"manifest":{"name":"css","displayName":"CSS Language Basics","description":"Provides syntax highlighting and bracket matching for CSS, LESS and SCSS files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"0.10.x"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin microsoft/vscode-css grammars/css.cson ./syntaxes/css.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"css","aliases":["CSS","css"],"extensions":[".css"],"mimetypes":["text/css"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"css","scopeName":"source.css","path":"./syntaxes/css.tmLanguage.json","tokenTypes":{"meta.function.url string.quoted":"other"}}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/css","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.css-language-features"},"manifest":{"name":"css-language-features","displayName":"CSS Language Features","description":"Provides rich language support for CSS, LESS and SCSS files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"^1.77.0"},"icon":"icons/css.png","activationEvents":["onLanguage:css","onLanguage:less","onLanguage:scss","onCommand:_css.applyCodeAction"],"main":"./client/dist/node/cssClientMain","browser":"./client/dist/browser/cssClientMain","capabilities":{"virtualWorkspaces":true,"untrustedWorkspaces":{"supported":true}},"categories":["Programming Languages"],"contributes":{"configuration":[{"order":22,"id":"css","title":"CSS","properties":{"css.customData":{"type":"array","markdownDescription":"A list of relative file paths pointing to JSON files following the [custom data format](https://github.com/microsoft/vscode-css-languageservice/blob/master/docs/customData.md).\n\nVS Code loads custom data on startup to enhance its CSS support for CSS custom properties (variables), at-rules, pseudo-classes, and pseudo-elements you specify in the JSON files.\n\nThe file paths are relative to workspace and only workspace folder settings are considered.","default":[],"items":{"type":"string"},"scope":"resource"},"css.completion.triggerPropertyValueCompletion":{"type":"boolean","scope":"resource","default":true,"description":"By default, VS Code triggers property value completion after selecting a CSS property. Use this setting to disable this behavior."},"css.completion.completePropertyWithSemicolon":{"type":"boolean","scope":"resource","default":true,"description":"Insert semicolon at end of line when completing CSS properties."},"css.validate":{"type":"boolean","scope":"resource","default":true,"description":"Enables or disables all validations."},"css.hover.documentation":{"type":"boolean","scope":"resource","default":true,"description":"Show property and value documentation in CSS hovers."},"css.hover.references":{"type":"boolean","scope":"resource","default":true,"description":"Show references to MDN in CSS hovers."},"css.lint.compatibleVendorPrefixes":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","description":"When using a vendor-specific prefix make sure to also include all other vendor-specific properties."},"css.lint.vendorPrefix":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"warning","description":"When using a vendor-specific prefix, also include the standard property."},"css.lint.duplicateProperties":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","description":"Do not use duplicate style definitions."},"css.lint.emptyRules":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"warning","description":"Do not use empty rulesets."},"css.lint.importStatement":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","description":"Import statements do not load in parallel."},"css.lint.boxModel":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","markdownDescription":"Do not use `width` or `height` when using `padding` or `border`."},"css.lint.universalSelector":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","markdownDescription":"The universal selector (`*`) is known to be slow."},"css.lint.zeroUnits":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","description":"No unit for zero needed."},"css.lint.fontFaceProperties":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"warning","markdownDescription":"`@font-face` rule must define `src` and `font-family` properties."},"css.lint.hexColorLength":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"error","description":"Hex colors must consist of 3, 4, 6 or 8 hex numbers."},"css.lint.argumentsInColorFunction":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"error","description":"Invalid number of parameters."},"css.lint.unknownProperties":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"warning","description":"Unknown property."},"css.lint.validProperties":{"type":"array","uniqueItems":true,"items":{"type":"string"},"scope":"resource","default":[],"description":"A list of properties that are not validated against the `unknownProperties` rule."},"css.lint.ieHack":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","description":"IE hacks are only necessary when supporting IE7 and older."},"css.lint.unknownVendorSpecificProperties":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","description":"Unknown vendor specific property."},"css.lint.propertyIgnoredDueToDisplay":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"warning","markdownDescription":"Property is ignored due to the display. E.g. with `display: inline`, the `width`, `height`, `margin-top`, `margin-bottom`, and `float` properties have no effect."},"css.lint.important":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","markdownDescription":"Avoid using `!important`. It is an indication that the specificity of the entire CSS has gotten out of control and needs to be refactored."},"css.lint.float":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","markdownDescription":"Avoid using `float`. Floats lead to fragile CSS that is easy to break if one aspect of the layout changes."},"css.lint.idSelector":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","description":"Selectors should not contain IDs because these rules are too tightly coupled with the HTML."},"css.lint.unknownAtRules":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"warning","description":"Unknown at-rule."},"css.trace.server":{"type":"string","scope":"window","enum":["off","messages","verbose"],"default":"off","description":"Traces the communication between VS Code and the CSS language server."},"css.format.enable":{"type":"boolean","scope":"window","default":true,"description":"Enable/disable default CSS formatter."},"css.format.newlineBetweenSelectors":{"type":"boolean","scope":"resource","default":true,"markdownDescription":"Separate selectors with a new line."},"css.format.newlineBetweenRules":{"type":"boolean","scope":"resource","default":true,"markdownDescription":"Separate rulesets by a blank line."},"css.format.spaceAroundSelectorSeparator":{"type":"boolean","scope":"resource","default":false,"markdownDescription":"Ensure a space character around selector separators '>', '+', '~' (e.g. `a > b`)."},"css.format.braceStyle":{"type":"string","scope":"resource","default":"collapse","enum":["collapse","expand"],"markdownDescription":"Put braces on the same line as rules (`collapse`) or put braces on own line (`expand`)."},"css.format.preserveNewLines":{"type":"boolean","scope":"resource","default":true,"markdownDescription":"Whether existing line breaks before rules and declarations should be preserved."},"css.format.maxPreserveNewLines":{"type":["number","null"],"scope":"resource","default":null,"markdownDescription":"Maximum number of line breaks to be preserved in one chunk, when `#css.format.preserveNewLines#` is enabled."}}},{"id":"scss","order":24,"title":"SCSS (Sass)","properties":{"scss.completion.triggerPropertyValueCompletion":{"type":"boolean","scope":"resource","default":true,"description":"By default, VS Code triggers property value completion after selecting a CSS property. Use this setting to disable this behavior."},"scss.completion.completePropertyWithSemicolon":{"type":"boolean","scope":"resource","default":true,"description":"Insert semicolon at end of line when completing CSS properties."},"scss.validate":{"type":"boolean","scope":"resource","default":true,"description":"Enables or disables all validations."},"scss.hover.documentation":{"type":"boolean","scope":"resource","default":true,"description":"Show property and value documentation in SCSS hovers."},"scss.hover.references":{"type":"boolean","scope":"resource","default":true,"description":"Show references to MDN in SCSS hovers."},"scss.lint.compatibleVendorPrefixes":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","description":"When using a vendor-specific prefix make sure to also include all other vendor-specific properties."},"scss.lint.vendorPrefix":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"warning","description":"When using a vendor-specific prefix, also include the standard property."},"scss.lint.duplicateProperties":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","description":"Do not use duplicate style definitions."},"scss.lint.emptyRules":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"warning","description":"Do not use empty rulesets."},"scss.lint.importStatement":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","description":"Import statements do not load in parallel."},"scss.lint.boxModel":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","markdownDescription":"Do not use `width` or `height` when using `padding` or `border`."},"scss.lint.universalSelector":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","markdownDescription":"The universal selector (`*`) is known to be slow."},"scss.lint.zeroUnits":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","description":"No unit for zero needed."},"scss.lint.fontFaceProperties":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"warning","markdownDescription":"`@font-face` rule must define `src` and `font-family` properties."},"scss.lint.hexColorLength":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"error","description":"Hex colors must consist of 3, 4, 6 or 8 hex numbers."},"scss.lint.argumentsInColorFunction":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"error","description":"Invalid number of parameters."},"scss.lint.unknownProperties":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"warning","description":"Unknown property."},"scss.lint.validProperties":{"type":"array","uniqueItems":true,"items":{"type":"string"},"scope":"resource","default":[],"description":"A list of properties that are not validated against the `unknownProperties` rule."},"scss.lint.ieHack":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","description":"IE hacks are only necessary when supporting IE7 and older."},"scss.lint.unknownVendorSpecificProperties":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","description":"Unknown vendor specific property."},"scss.lint.propertyIgnoredDueToDisplay":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"warning","markdownDescription":"Property is ignored due to the display. E.g. with `display: inline`, the `width`, `height`, `margin-top`, `margin-bottom`, and `float` properties have no effect."},"scss.lint.important":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","markdownDescription":"Avoid using `!important`. It is an indication that the specificity of the entire CSS has gotten out of control and needs to be refactored."},"scss.lint.float":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","markdownDescription":"Avoid using `float`. Floats lead to fragile CSS that is easy to break if one aspect of the layout changes."},"scss.lint.idSelector":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","description":"Selectors should not contain IDs because these rules are too tightly coupled with the HTML."},"scss.lint.unknownAtRules":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"warning","description":"Unknown at-rule."},"scss.format.enable":{"type":"boolean","scope":"window","default":true,"description":"Enable/disable default SCSS formatter."},"scss.format.newlineBetweenSelectors":{"type":"boolean","scope":"resource","default":true,"markdownDescription":"Separate selectors with a new line."},"scss.format.newlineBetweenRules":{"type":"boolean","scope":"resource","default":true,"markdownDescription":"Separate rulesets by a blank line."},"scss.format.spaceAroundSelectorSeparator":{"type":"boolean","scope":"resource","default":false,"markdownDescription":"Ensure a space character around selector separators '>', '+', '~' (e.g. `a > b`)."},"scss.format.braceStyle":{"type":"string","scope":"resource","default":"collapse","enum":["collapse","expand"],"markdownDescription":"Put braces on the same line as rules (`collapse`) or put braces on own line (`expand`)."},"scss.format.preserveNewLines":{"type":"boolean","scope":"resource","default":true,"markdownDescription":"Whether existing line breaks before rules and declarations should be preserved."},"scss.format.maxPreserveNewLines":{"type":["number","null"],"scope":"resource","default":null,"markdownDescription":"Maximum number of line breaks to be preserved in one chunk, when `#scss.format.preserveNewLines#` is enabled."}}},{"id":"less","order":23,"type":"object","title":"LESS","properties":{"less.completion.triggerPropertyValueCompletion":{"type":"boolean","scope":"resource","default":true,"description":"By default, VS Code triggers property value completion after selecting a CSS property. Use this setting to disable this behavior."},"less.completion.completePropertyWithSemicolon":{"type":"boolean","scope":"resource","default":true,"description":"Insert semicolon at end of line when completing CSS properties."},"less.validate":{"type":"boolean","scope":"resource","default":true,"description":"Enables or disables all validations."},"less.hover.documentation":{"type":"boolean","scope":"resource","default":true,"description":"Show property and value documentation in LESS hovers."},"less.hover.references":{"type":"boolean","scope":"resource","default":true,"description":"Show references to MDN in LESS hovers."},"less.lint.compatibleVendorPrefixes":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","description":"When using a vendor-specific prefix make sure to also include all other vendor-specific properties."},"less.lint.vendorPrefix":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"warning","description":"When using a vendor-specific prefix, also include the standard property."},"less.lint.duplicateProperties":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","description":"Do not use duplicate style definitions."},"less.lint.emptyRules":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"warning","description":"Do not use empty rulesets."},"less.lint.importStatement":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","description":"Import statements do not load in parallel."},"less.lint.boxModel":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","markdownDescription":"Do not use `width` or `height` when using `padding` or `border`."},"less.lint.universalSelector":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","markdownDescription":"The universal selector (`*`) is known to be slow."},"less.lint.zeroUnits":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","description":"No unit for zero needed."},"less.lint.fontFaceProperties":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"warning","markdownDescription":"`@font-face` rule must define `src` and `font-family` properties."},"less.lint.hexColorLength":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"error","description":"Hex colors must consist of 3, 4, 6 or 8 hex numbers."},"less.lint.argumentsInColorFunction":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"error","description":"Invalid number of parameters."},"less.lint.unknownProperties":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"warning","description":"Unknown property."},"less.lint.validProperties":{"type":"array","uniqueItems":true,"items":{"type":"string"},"scope":"resource","default":[],"description":"A list of properties that are not validated against the `unknownProperties` rule."},"less.lint.ieHack":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","description":"IE hacks are only necessary when supporting IE7 and older."},"less.lint.unknownVendorSpecificProperties":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","description":"Unknown vendor specific property."},"less.lint.propertyIgnoredDueToDisplay":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"warning","markdownDescription":"Property is ignored due to the display. E.g. with `display: inline`, the `width`, `height`, `margin-top`, `margin-bottom`, and `float` properties have no effect."},"less.lint.important":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","markdownDescription":"Avoid using `!important`. It is an indication that the specificity of the entire CSS has gotten out of control and needs to be refactored."},"less.lint.float":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","markdownDescription":"Avoid using `float`. Floats lead to fragile CSS that is easy to break if one aspect of the layout changes."},"less.lint.idSelector":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"ignore","description":"Selectors should not contain IDs because these rules are too tightly coupled with the HTML."},"less.lint.unknownAtRules":{"type":"string","scope":"resource","enum":["ignore","warning","error"],"default":"warning","description":"Unknown at-rule."},"less.format.enable":{"type":"boolean","scope":"window","default":true,"description":"Enable/disable default LESS formatter."},"less.format.newlineBetweenSelectors":{"type":"boolean","scope":"resource","default":true,"markdownDescription":"Separate selectors with a new line."},"less.format.newlineBetweenRules":{"type":"boolean","scope":"resource","default":true,"markdownDescription":"Separate rulesets by a blank line."},"less.format.spaceAroundSelectorSeparator":{"type":"boolean","scope":"resource","default":false,"markdownDescription":"Ensure a space character around selector separators '>', '+', '~' (e.g. `a > b`)."},"less.format.braceStyle":{"type":"string","scope":"resource","default":"collapse","enum":["collapse","expand"],"markdownDescription":"Put braces on the same line as rules (`collapse`) or put braces on own line (`expand`)."},"less.format.preserveNewLines":{"type":"boolean","scope":"resource","default":true,"markdownDescription":"Whether existing line breaks before rules and declarations should be preserved."},"less.format.maxPreserveNewLines":{"type":["number","null"],"scope":"resource","default":null,"markdownDescription":"Maximum number of line breaks to be preserved in one chunk, when `#less.format.preserveNewLines#` is enabled."}}}],"configurationDefaults":{"[css]":{"editor.suggest.insertMode":"replace"},"[scss]":{"editor.suggest.insertMode":"replace"},"[less]":{"editor.suggest.insertMode":"replace"}},"jsonValidation":[{"fileMatch":"*.css-data.json","url":"https://raw.githubusercontent.com/microsoft/vscode-css-languageservice/master/docs/customData.schema.json"},{"fileMatch":"package.json","url":"./schemas/package.schema.json"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/css-language-features","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.dart"},"manifest":{"name":"dart","displayName":"Dart Language Basics","description":"Provides syntax highlighting & bracket matching in Dart files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"0.10.x"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin dart-lang/dart-syntax-highlight grammars/dart.json ./syntaxes/dart.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"dart","extensions":[".dart"],"aliases":["Dart"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"dart","scopeName":"source.dart","path":"./syntaxes/dart.tmLanguage.json"}]}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/dart","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.debug-auto-launch"},"manifest":{"name":"debug-auto-launch","displayName":"Node Debug Auto-attach","description":"Helper for auto-attach feature when node-debug extensions are not active.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"^1.5.0"},"icon":"media/icon.png","capabilities":{"virtualWorkspaces":false,"untrustedWorkspaces":{"supported":true}},"activationEvents":["onStartupFinished"],"main":"./dist/extension","contributes":{"commands":[{"command":"extension.node-debug.toggleAutoAttach","title":"Toggle Auto Attach","category":"Debug"}]},"prettier":{"printWidth":100,"trailingComma":"all","singleQuote":true,"arrowParens":"avoid"},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/debug-auto-launch","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.debug-server-ready"},"manifest":{"name":"debug-server-ready","displayName":"Server Ready Action","description":"Open URI in browser if server under debugging is ready.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"^1.32.0"},"icon":"media/icon.png","activationEvents":["onDebugResolve"],"capabilities":{"virtualWorkspaces":false,"untrustedWorkspaces":{"supported":true}},"enabledApiProposals":["terminalDataWriteEvent"],"main":"./dist/extension","contributes":{"debuggers":[{"type":"*","configurationAttributes":{"launch":{"properties":{"serverReadyAction":{"oneOf":[{"type":"object","additionalProperties":false,"markdownDescription":"Act upon a URI when a server program under debugging is ready (indicated by sending output of the form 'listening on port 3000' or 'Now listening on: https://localhost:5001' to the debug console.)","default":{"action":"openExternally","killOnServerStop":false},"properties":{"action":{"type":"string","enum":["openExternally"],"enumDescriptions":["Open URI externally with the default application."],"markdownDescription":"What to do with the URI when the server is ready.","default":"openExternally"},"pattern":{"type":"string","markdownDescription":"Server is ready if this pattern appears on the debug console. The first capture group must include a URI or a port number.","default":"listening on port ([0-9]+)"},"uriFormat":{"type":"string","markdownDescription":"A format string used when constructing the URI from a port number. The first '%s' is substituted with the port number.","default":"http://localhost:%s"},"killOnServerStop":{"type":"boolean","markdownDescription":"Stop the child session when the parent session stopped.","default":false}}},{"type":"object","additionalProperties":false,"markdownDescription":"Act upon a URI when a server program under debugging is ready (indicated by sending output of the form 'listening on port 3000' or 'Now listening on: https://localhost:5001' to the debug console.)","default":{"action":"debugWithEdge","pattern":"listening on port ([0-9]+)","uriFormat":"http://localhost:%s","webRoot":"${workspaceFolder}","killOnServerStop":false},"properties":{"action":{"type":"string","enum":["debugWithChrome","debugWithEdge"],"enumDescriptions":["Start debugging with the 'Debugger for Chrome'."],"markdownDescription":"What to do with the URI when the server is ready.","default":"debugWithEdge"},"pattern":{"type":"string","markdownDescription":"Server is ready if this pattern appears on the debug console. The first capture group must include a URI or a port number.","default":"listening on port ([0-9]+)"},"uriFormat":{"type":"string","markdownDescription":"A format string used when constructing the URI from a port number. The first '%s' is substituted with the port number.","default":"http://localhost:%s"},"webRoot":{"type":"string","markdownDescription":"Value passed to the debug configuration for the 'Debugger for Chrome'.","default":"${workspaceFolder}"},"killOnServerStop":{"type":"boolean","markdownDescription":"Stop the child session when the parent session stopped.","default":false}}},{"type":"object","additionalProperties":false,"markdownDescription":"Act upon a URI when a server program under debugging is ready (indicated by sending output of the form 'listening on port 3000' or 'Now listening on: https://localhost:5001' to the debug console.)","default":{"action":"startDebugging","name":"","killOnServerStop":false},"required":["name"],"properties":{"action":{"type":"string","enum":["startDebugging"],"enumDescriptions":["Run another launch configuration."],"markdownDescription":"What to do with the URI when the server is ready.","default":"startDebugging"},"pattern":{"type":"string","markdownDescription":"Server is ready if this pattern appears on the debug console. The first capture group must include a URI or a port number.","default":"listening on port ([0-9]+)"},"name":{"type":"string","markdownDescription":"Name of the launch configuration to run.","default":"Launch Browser"},"killOnServerStop":{"type":"boolean","markdownDescription":"Stop the child session when the parent session stopped.","default":false}}},{"type":"object","additionalProperties":false,"markdownDescription":"Act upon a URI when a server program under debugging is ready (indicated by sending output of the form 'listening on port 3000' or 'Now listening on: https://localhost:5001' to the debug console.)","default":{"action":"startDebugging","config":{"type":"node","request":"launch"},"killOnServerStop":false},"required":["config"],"properties":{"action":{"type":"string","enum":["startDebugging"],"enumDescriptions":["Run another launch configuration."],"markdownDescription":"What to do with the URI when the server is ready.","default":"startDebugging"},"pattern":{"type":"string","markdownDescription":"Server is ready if this pattern appears on the debug console. The first capture group must include a URI or a port number.","default":"listening on port ([0-9]+)"},"config":{"type":"object","markdownDescription":"The debug configuration to run.","default":{}},"killOnServerStop":{"type":"boolean","markdownDescription":"Stop the child session when the parent session stopped.","default":false}}}]}}}}}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/debug-server-ready","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.diff"},"manifest":{"name":"diff","displayName":"Diff Language Basics","description":"Provides syntax highlighting & bracket matching in Diff files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"0.10.x"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin textmate/diff.tmbundle Syntaxes/Diff.plist ./syntaxes/diff.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"diff","aliases":["Diff","diff"],"extensions":[".diff",".patch",".rej"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"diff","scopeName":"source.diff","path":"./syntaxes/diff.tmLanguage.json"}]}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/diff","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.docker"},"manifest":{"name":"docker","displayName":"Docker Language Basics","description":"Provides syntax highlighting and bracket matching in Docker files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"dockerfile","extensions":[".dockerfile",".containerfile"],"filenames":["Dockerfile","Containerfile"],"filenamePatterns":["Dockerfile.*","Containerfile.*"],"aliases":["Docker","Dockerfile","Containerfile"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"dockerfile","scopeName":"source.dockerfile","path":"./syntaxes/docker.tmLanguage.json"}],"configurationDefaults":{"[dockerfile]":{"editor.quickSuggestions":{"strings":true}}}},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/docker","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.dotenv"},"manifest":{"name":"dotenv","displayName":"Dotenv Language Basics","description":"Provides syntax highlighting and bracket matching in dotenv files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin dotenv-org/dotenv-vscode syntaxes/dotenv.tmLanguage.json ./syntaxes/dotenv.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"dotenv","extensions":[".env"],"filenames":[".env",".flaskenv","user-dirs.dirs"],"filenamePatterns":[".env.*"],"aliases":["Dotenv"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"dotenv","scopeName":"source.dotenv","path":"./syntaxes/dotenv.tmLanguage.json"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/dotenv","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.emmet"},"manifest":{"name":"emmet","displayName":"Emmet","description":"Emmet support for VS Code","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"^1.13.0"},"icon":"images/icon.png","categories":["Other"],"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"},"activationEvents":["onCommand:emmet.expandAbbreviation","onLanguage"],"main":"./dist/node/emmetNodeMain","browser":"./dist/browser/emmetBrowserMain","contributes":{"configuration":{"type":"object","title":"Emmet","properties":{"emmet.showExpandedAbbreviation":{"type":["string"],"enum":["never","always","inMarkupAndStylesheetFilesOnly"],"default":"always","markdownDescription":"Shows expanded Emmet abbreviations as suggestions.\nThe option `\"inMarkupAndStylesheetFilesOnly\"` applies to html, haml, jade, slim, xml, xsl, css, scss, sass, less and stylus.\nThe option `\"always\"` applies to all parts of the file regardless of markup/css."},"emmet.showAbbreviationSuggestions":{"type":"boolean","default":true,"scope":"language-overridable","markdownDescription":"Shows possible Emmet abbreviations as suggestions. Not applicable in stylesheets or when emmet.showExpandedAbbreviation is set to `\"never\"`."},"emmet.includeLanguages":{"type":"object","additionalProperties":{"type":"string"},"default":{},"markdownDescription":"Enable Emmet abbreviations in languages that are not supported by default. Add a mapping here between the language and Emmet supported language.\n For example: `{\"vue-html\": \"html\", \"javascript\": \"javascriptreact\"}`"},"emmet.variables":{"type":"object","properties":{"lang":{"type":"string","default":"en"},"charset":{"type":"string","default":"UTF-8"}},"additionalProperties":{"type":"string"},"default":{},"markdownDescription":"Variables to be used in Emmet snippets."},"emmet.syntaxProfiles":{"type":"object","default":{},"markdownDescription":"Define profile for specified syntax or use your own profile with specific rules."},"emmet.excludeLanguages":{"type":"array","items":{"type":"string"},"default":["markdown"],"markdownDescription":"An array of languages where Emmet abbreviations should not be expanded."},"emmet.extensionsPath":{"type":"array","items":{"type":"string","markdownDescription":"A path containing Emmet syntaxProfiles and/or snippets."},"default":[],"scope":"machine-overridable","markdownDescription":"An array of paths, where each path can contain Emmet syntaxProfiles and/or snippet files.\nIn case of conflicts, the profiles/snippets of later paths will override those of earlier paths.\nSee https://code.visualstudio.com/docs/editor/emmet for more information and an example snippet file."},"emmet.triggerExpansionOnTab":{"type":"boolean","default":false,"scope":"language-overridable","markdownDescription":"When enabled, Emmet abbreviations are expanded when pressing TAB, even when completions do not show up. When disabled, completions that show up can still be accepted by pressing TAB."},"emmet.useInlineCompletions":{"type":"boolean","default":false,"markdownDescription":"If `true`, Emmet will use inline completions to suggest expansions. To prevent the non-inline completion item provider from showing up as often while this setting is `true`, turn `#editor.quickSuggestions#` to `inline` or `off` for the `other` item."},"emmet.preferences":{"type":"object","default":{},"markdownDescription":"Preferences used to modify behavior of some actions and resolvers of Emmet.","properties":{"css.intUnit":{"type":"string","default":"px","markdownDescription":"Default unit for integer values."},"css.floatUnit":{"type":"string","default":"em","markdownDescription":"Default unit for float values."},"css.propertyEnd":{"type":"string","default":";","markdownDescription":"Symbol to be placed at the end of CSS property when expanding CSS abbreviations."},"sass.propertyEnd":{"type":"string","default":"","markdownDescription":"Symbol to be placed at the end of CSS property when expanding CSS abbreviations in Sass files."},"stylus.propertyEnd":{"type":"string","default":"","markdownDescription":"Symbol to be placed at the end of CSS property when expanding CSS abbreviations in Stylus files."},"css.valueSeparator":{"type":"string","default":": ","markdownDescription":"Symbol to be placed at the between CSS property and value when expanding CSS abbreviations."},"sass.valueSeparator":{"type":"string","default":": ","markdownDescription":"Symbol to be placed at the between CSS property and value when expanding CSS abbreviations in Sass files."},"stylus.valueSeparator":{"type":"string","default":" ","markdownDescription":"Symbol to be placed at the between CSS property and value when expanding CSS abbreviations in Stylus files."},"bem.elementSeparator":{"type":"string","default":"__","markdownDescription":"Element separator used for classes when using the BEM filter."},"bem.modifierSeparator":{"type":"string","default":"_","markdownDescription":"Modifier separator used for classes when using the BEM filter."},"filter.commentBefore":{"type":"string","default":"","markdownDescription":"A definition of comment that should be placed before matched element when comment filter is applied."},"filter.commentAfter":{"type":"string","default":"\n","markdownDescription":"A definition of comment that should be placed after matched element when comment filter is applied."},"filter.commentTrigger":{"type":"array","default":["id","class"],"markdownDescription":"A comma-separated list of attribute names that should exist in the abbreviation for the comment filter to be applied."},"format.noIndentTags":{"type":"array","default":["html"],"markdownDescription":"An array of tag names that should never get inner indentation."},"format.forceIndentationForTags":{"type":"array","default":["body"],"markdownDescription":"An array of tag names that should always get inner indentation."},"profile.allowCompactBoolean":{"type":"boolean","default":false,"markdownDescription":"If `true`, compact notation of boolean attributes are produced."},"css.webkitProperties":{"type":"string","default":null,"markdownDescription":"Comma separated CSS properties that get the 'webkit' vendor prefix when used in Emmet abbreviation that starts with `-`. Set to empty string to always avoid the 'webkit' prefix."},"css.mozProperties":{"type":"string","default":null,"markdownDescription":"Comma separated CSS properties that get the 'moz' vendor prefix when used in Emmet abbreviation that starts with `-`. Set to empty string to always avoid the 'moz' prefix."},"css.oProperties":{"type":"string","default":null,"markdownDescription":"Comma separated CSS properties that get the 'o' vendor prefix when used in Emmet abbreviation that starts with `-`. Set to empty string to always avoid the 'o' prefix."},"css.msProperties":{"type":"string","default":null,"markdownDescription":"Comma separated CSS properties that get the 'ms' vendor prefix when used in Emmet abbreviation that starts with `-`. Set to empty string to always avoid the 'ms' prefix."},"css.fuzzySearchMinScore":{"type":"number","default":0.3,"markdownDescription":"The minimum score (from 0 to 1) that fuzzy-matched abbreviation should achieve. Lower values may produce many false-positive matches, higher values may reduce possible matches."},"output.inlineBreak":{"type":"number","default":0,"markdownDescription":"The number of sibling inline elements needed for line breaks to be placed between those elements. If `0`, inline elements are always expanded onto a single line."},"output.reverseAttributes":{"type":"boolean","default":false,"markdownDescription":"If `true`, reverses attribute merging directions when resolving snippets."},"output.selfClosingStyle":{"type":"string","enum":["html","xhtml","xml"],"default":"html","markdownDescription":"Style of self-closing tags: html (`
`), xml (`
`) or xhtml (`
`)."},"css.color.short":{"type":"boolean","default":true,"markdownDescription":"If `true`, color values like `#f` will be expanded to `#fff` instead of `#ffffff`."}}},"emmet.showSuggestionsAsSnippets":{"type":"boolean","default":false,"markdownDescription":"If `true`, then Emmet suggestions will show up as snippets allowing you to order them as per `#editor.snippetSuggestions#` setting."},"emmet.optimizeStylesheetParsing":{"type":"boolean","default":true,"markdownDescription":"When set to `false`, the whole file is parsed to determine if current position is valid for expanding Emmet abbreviations. When set to `true`, only the content around the current position in CSS/SCSS/Less files is parsed."}}},"commands":[{"command":"editor.emmet.action.wrapWithAbbreviation","title":"Wrap with Abbreviation","category":"Emmet"},{"command":"editor.emmet.action.removeTag","title":"Remove Tag","category":"Emmet"},{"command":"editor.emmet.action.updateTag","title":"Update Tag","category":"Emmet"},{"command":"editor.emmet.action.matchTag","title":"Go to Matching Pair","category":"Emmet"},{"command":"editor.emmet.action.balanceIn","title":"Balance (inward)","category":"Emmet"},{"command":"editor.emmet.action.balanceOut","title":"Balance (outward)","category":"Emmet"},{"command":"editor.emmet.action.prevEditPoint","title":"Go to Previous Edit Point","category":"Emmet"},{"command":"editor.emmet.action.nextEditPoint","title":"Go to Next Edit Point","category":"Emmet"},{"command":"editor.emmet.action.mergeLines","title":"Merge Lines","category":"Emmet"},{"command":"editor.emmet.action.selectPrevItem","title":"Select Previous Item","category":"Emmet"},{"command":"editor.emmet.action.selectNextItem","title":"Select Next Item","category":"Emmet"},{"command":"editor.emmet.action.splitJoinTag","title":"Split/Join Tag","category":"Emmet"},{"command":"editor.emmet.action.toggleComment","title":"Toggle Comment","category":"Emmet"},{"command":"editor.emmet.action.evaluateMathExpression","title":"Evaluate Math Expression","category":"Emmet"},{"command":"editor.emmet.action.updateImageSize","title":"Update Image Size","category":"Emmet"},{"command":"editor.emmet.action.incrementNumberByOneTenth","title":"Increment by 0.1","category":"Emmet"},{"command":"editor.emmet.action.incrementNumberByOne","title":"Increment by 1","category":"Emmet"},{"command":"editor.emmet.action.incrementNumberByTen","title":"Increment by 10","category":"Emmet"},{"command":"editor.emmet.action.decrementNumberByOneTenth","title":"Decrement by 0.1","category":"Emmet"},{"command":"editor.emmet.action.decrementNumberByOne","title":"Decrement by 1","category":"Emmet"},{"command":"editor.emmet.action.decrementNumberByTen","title":"Decrement by 10","category":"Emmet"},{"command":"editor.emmet.action.reflectCSSValue","title":"Reflect CSS Value","category":"Emmet"},{"command":"workbench.action.showEmmetCommands","title":"Show Emmet Commands","category":""}],"menus":{"commandPalette":[{"command":"editor.emmet.action.wrapWithAbbreviation","when":"!activeEditorIsReadonly"},{"command":"editor.emmet.action.removeTag","when":"!activeEditorIsReadonly"},{"command":"editor.emmet.action.updateTag","when":"!activeEditorIsReadonly"},{"command":"editor.emmet.action.matchTag","when":"!activeEditorIsReadonly"},{"command":"editor.emmet.action.balanceIn","when":"!activeEditorIsReadonly"},{"command":"editor.emmet.action.balanceOut","when":"!activeEditorIsReadonly"},{"command":"editor.emmet.action.prevEditPoint","when":"!activeEditorIsReadonly"},{"command":"editor.emmet.action.nextEditPoint","when":"!activeEditorIsReadonly"},{"command":"editor.emmet.action.mergeLines","when":"!activeEditorIsReadonly"},{"command":"editor.emmet.action.selectPrevItem","when":"!activeEditorIsReadonly"},{"command":"editor.emmet.action.selectNextItem","when":"!activeEditorIsReadonly"},{"command":"editor.emmet.action.splitJoinTag","when":"!activeEditorIsReadonly"},{"command":"editor.emmet.action.toggleComment","when":"!activeEditorIsReadonly"},{"command":"editor.emmet.action.evaluateMathExpression","when":"!activeEditorIsReadonly"},{"command":"editor.emmet.action.updateImageSize","when":"!activeEditorIsReadonly"},{"command":"editor.emmet.action.incrementNumberByOneTenth","when":"!activeEditorIsReadonly"},{"command":"editor.emmet.action.incrementNumberByOne","when":"!activeEditorIsReadonly"},{"command":"editor.emmet.action.incrementNumberByTen","when":"!activeEditorIsReadonly"},{"command":"editor.emmet.action.decrementNumberByOneTenth","when":"!activeEditorIsReadonly"},{"command":"editor.emmet.action.decrementNumberByOne","when":"!activeEditorIsReadonly"},{"command":"editor.emmet.action.decrementNumberByTen","when":"!activeEditorIsReadonly"},{"command":"editor.emmet.action.reflectCSSValue","when":"!activeEditorIsReadonly"}]}},"capabilities":{"virtualWorkspaces":true,"untrustedWorkspaces":{"supported":true}}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/emmet","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.extension-editing"},"manifest":{"name":"extension-editing","displayName":"Extension Authoring","description":"Provides linting capabilities for authoring extensions.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"^1.4.0"},"icon":"images/icon.png","activationEvents":["onLanguage:json","onLanguage:markdown"],"main":"./dist/extensionEditingMain","browser":"./dist/browser/extensionEditingBrowserMain","capabilities":{"virtualWorkspaces":true,"untrustedWorkspaces":{"supported":true}},"contributes":{"jsonValidation":[{"fileMatch":"package.json","url":"vscode://schemas/vscode-extensions"},{"fileMatch":"*language-configuration.json","url":"vscode://schemas/language-configuration"},{"fileMatch":["*icon-theme.json","!*product-icon-theme.json"],"url":"vscode://schemas/icon-theme"},{"fileMatch":"*product-icon-theme.json","url":"vscode://schemas/product-icon-theme"},{"fileMatch":"*color-theme.json","url":"vscode://schemas/color-theme"}],"languages":[{"id":"ignore","filenames":[".vscodeignore"]}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/extension-editing","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.fsharp"},"manifest":{"name":"fsharp","displayName":"F# Language Basics","description":"Provides snippets, syntax highlighting, bracket matching and folding in F# files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin ionide/ionide-fsgrammar grammars/fsharp.json ./syntaxes/fsharp.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"fsharp","extensions":[".fs",".fsi",".fsx",".fsscript"],"aliases":["F#","FSharp","fsharp"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"fsharp","scopeName":"source.fsharp","path":"./syntaxes/fsharp.tmLanguage.json"}],"snippets":[{"language":"fsharp","path":"./snippets/fsharp.code-snippets"}],"configurationDefaults":{"[fsharp]":{"diffEditor.ignoreTrimWhitespace":false}}},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/fsharp","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.git"},"manifest":{"name":"git","displayName":"Git","description":"Git SCM Integration","publisher":"vscode","license":"MIT","version":"1.0.0","engines":{"vscode":"^1.5.0"},"aiKey":"0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255","enabledApiProposals":["canonicalUriProvider","contribEditSessions","contribEditorContentMenu","contribMergeEditorMenus","contribMultiDiffEditorMenus","contribDiffEditorGutterToolBarMenus","contribSourceControlArtifactGroupMenu","contribSourceControlArtifactMenu","contribSourceControlHistoryItemMenu","contribSourceControlHistoryTitleMenu","contribSourceControlInputBoxMenu","contribSourceControlTitleMenu","contribViewsWelcome","editSessionIdentityProvider","quickDiffProvider","quickInputButtonLocation","quickPickSortByLabel","scmActionButton","scmArtifactProvider","scmHistoryProvider","scmMultiDiffEditor","scmProviderOptions","scmSelectedProvider","scmTextDocument","scmValidation","statusBarItemTooltip","tabInputMultiDiff","tabInputTextMerge","textEditorDiffInformation","timeline"],"categories":["Other"],"activationEvents":["*","onEditSession:file","onFileSystem:git","onFileSystem:git-show"],"extensionDependencies":["vscode.git-base"],"main":"./dist/main","icon":"resources/icons/git.png","capabilities":{"virtualWorkspaces":true,"untrustedWorkspaces":{"supported":false}},"contributes":{"commands":[{"command":"git.continueInLocalClone","title":"Clone Repository Locally and Open on Desktop...","category":"Git","icon":"$(repo-clone)","enablement":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && remoteName"},{"command":"git.clone","title":"Clone","category":"Git","enablement":"!operationInProgress"},{"command":"git.cloneRecursive","title":"Clone (Recursive)","category":"Git","enablement":"!operationInProgress"},{"command":"git.init","title":"Initialize Repository","category":"Git","icon":"$(add)","enablement":"!operationInProgress"},{"command":"git.openRepository","title":"Open Repository","category":"Git","enablement":"!operationInProgress"},{"command":"git.reopenClosedRepositories","title":"Reopen Closed Repositories...","icon":"$(repo)","category":"Git","enablement":"!operationInProgress && git.closedRepositoryCount != 0"},{"command":"git.close","title":"Close Repository","category":"Git","enablement":"!operationInProgress"},{"command":"git.closeOtherRepositories","title":"Close Other Repositories","category":"Git","enablement":"!operationInProgress"},{"command":"git.openWorktree","title":"Open Worktree in Current Window","category":"Git","enablement":"!operationInProgress"},{"command":"git.openWorktreeInNewWindow","title":"Open Worktree in New Window","category":"Git","enablement":"!operationInProgress"},{"command":"git.refresh","title":"Refresh","category":"Git","icon":"$(refresh)","enablement":"!operationInProgress"},{"command":"git.compareWithWorkspace","title":"Compare with Workspace","category":"Git"},{"command":"git.openChange","title":"Open Changes","category":"Git","icon":"$(compare-changes)"},{"command":"git.openAllChanges","title":"Open All Changes","category":"Git"},{"command":"git.openFile","title":"Open File","category":"Git","icon":"$(go-to-file)"},{"command":"git.openFile2","title":"Open File","category":"Git","icon":"$(go-to-file)"},{"command":"git.openHEADFile","title":"Open File (HEAD)","category":"Git"},{"command":"git.stage","title":"Stage Changes","category":"Git","icon":"$(add)","enablement":"!operationInProgress"},{"command":"git.stageAll","title":"Stage All Changes","category":"Git","icon":"$(add)","enablement":"!operationInProgress"},{"command":"git.stageAllTracked","title":"Stage All Tracked Changes","category":"Git","icon":"$(add)","enablement":"!operationInProgress"},{"command":"git.stageAllUntracked","title":"Stage All Untracked Changes","category":"Git","icon":"$(add)","enablement":"!operationInProgress"},{"command":"git.stageAllMerge","title":"Stage All Merge Changes","category":"Git","icon":"$(add)","enablement":"!operationInProgress"},{"command":"git.stageSelectedRanges","title":"Stage Selected Ranges","category":"Git","enablement":"!operationInProgress"},{"command":"git.diff.stageHunk","title":"Stage Block","category":"Git","icon":"$(plus)"},{"command":"git.diff.stageSelection","title":"Stage Selection","category":"Git","icon":"$(plus)"},{"command":"git.revertSelectedRanges","title":"Revert Selected Ranges","category":"Git","enablement":"!operationInProgress"},{"command":"git.stageChange","title":"Stage Change","category":"Git","icon":"$(add)","enablement":"!operationInProgress"},{"command":"git.stageFile","title":"Stage Changes","category":"Git","icon":"$(add)","enablement":"!operationInProgress"},{"command":"git.revertChange","title":"Revert Change","category":"Git","icon":"$(discard)","enablement":"!operationInProgress"},{"command":"git.unstage","title":"Unstage Changes","category":"Git","icon":"$(remove)","enablement":"!operationInProgress"},{"command":"git.unstageAll","title":"Unstage All Changes","category":"Git","icon":"$(remove)","enablement":"!operationInProgress"},{"command":"git.unstageSelectedRanges","title":"Unstage Selected Ranges","category":"Git","enablement":"!operationInProgress"},{"command":"git.unstageChange","title":"Unstage Change","category":"Git","icon":"$(remove)","enablement":"!operationInProgress"},{"command":"git.unstageFile","title":"Unstage Changes","category":"Git","icon":"$(remove)","enablement":"!operationInProgress"},{"command":"git.clean","title":"Discard Changes","category":"Git","icon":"$(discard)","enablement":"!operationInProgress"},{"command":"git.cleanAll","title":"Discard All Changes","category":"Git","icon":"$(discard)","enablement":"!operationInProgress"},{"command":"git.cleanAllTracked","title":"Discard All Tracked Changes","category":"Git","icon":"$(discard)","enablement":"!operationInProgress"},{"command":"git.cleanAllUntracked","title":"Discard All Untracked Changes","category":"Git","icon":"$(discard)","enablement":"!operationInProgress"},{"command":"git.rename","title":"Rename","category":"Git","icon":"$(discard)","enablement":"!operationInProgress"},{"command":"git.commit","title":"Commit","category":"Git","icon":"$(check)","enablement":"!operationInProgress"},{"command":"git.commitAmend","title":"Commit (Amend)","category":"Git","icon":"$(check)","enablement":"!operationInProgress"},{"command":"git.commitSigned","title":"Commit (Signed Off)","category":"Git","icon":"$(check)","enablement":"!operationInProgress"},{"command":"git.commitStaged","title":"Commit Staged","category":"Git","enablement":"!operationInProgress"},{"command":"git.commitEmpty","title":"Commit Empty","category":"Git","enablement":"!operationInProgress"},{"command":"git.commitStagedSigned","title":"Commit Staged (Signed Off)","category":"Git","enablement":"!operationInProgress"},{"command":"git.commitStagedAmend","title":"Commit Staged (Amend)","category":"Git","enablement":"!operationInProgress"},{"command":"git.commitAll","title":"Commit All","category":"Git","enablement":"!operationInProgress"},{"command":"git.commitAllSigned","title":"Commit All (Signed Off)","category":"Git","enablement":"!operationInProgress"},{"command":"git.commitAllAmend","title":"Commit All (Amend)","category":"Git","enablement":"!operationInProgress"},{"command":"git.commitNoVerify","title":"Commit (No Verify)","category":"Git","icon":"$(check)","enablement":"!operationInProgress"},{"command":"git.commitStagedNoVerify","title":"Commit Staged (No Verify)","category":"Git","enablement":"!operationInProgress"},{"command":"git.commitEmptyNoVerify","title":"Commit Empty (No Verify)","category":"Git","enablement":"!operationInProgress"},{"command":"git.commitStagedSignedNoVerify","title":"Commit Staged (Signed Off, No Verify)","category":"Git","enablement":"!operationInProgress"},{"command":"git.commitAmendNoVerify","title":"Commit (Amend, No Verify)","category":"Git","enablement":"!operationInProgress"},{"command":"git.commitSignedNoVerify","title":"Commit (Signed Off, No Verify)","category":"Git","enablement":"!operationInProgress"},{"command":"git.commitStagedAmendNoVerify","title":"Commit Staged (Amend, No Verify)","category":"Git","enablement":"!operationInProgress"},{"command":"git.commitAllNoVerify","title":"Commit All (No Verify)","category":"Git","enablement":"!operationInProgress"},{"command":"git.commitAllSignedNoVerify","title":"Commit All (Signed Off, No Verify)","category":"Git","enablement":"!operationInProgress"},{"command":"git.commitAllAmendNoVerify","title":"Commit All (Amend, No Verify)","category":"Git","enablement":"!operationInProgress"},{"command":"git.commitMessageAccept","title":"Commit","category":"Git"},{"command":"git.commitMessageDiscard","title":"Cancel","icon":"$(close)","category":"Git"},{"command":"git.restoreCommitTemplate","title":"Restore Commit Template","category":"Git","enablement":"!operationInProgress"},{"command":"git.undoCommit","title":"Undo Last Commit","category":"Git","enablement":"!operationInProgress"},{"command":"git.checkout","title":"Checkout to...","category":"Git","enablement":"!operationInProgress"},{"command":"git.graph.checkout","title":"Checkout","category":"Git","enablement":"!operationInProgress"},{"command":"git.checkoutDetached","title":"Checkout to (Detached)...","category":"Git","enablement":"!operationInProgress"},{"command":"git.graph.checkoutDetached","title":"Checkout (Detached)","category":"Git","enablement":"!operationInProgress"},{"command":"git.branch","title":"Create Branch...","category":"Git","enablement":"!operationInProgress"},{"command":"git.branchFrom","title":"Create Branch From...","category":"Git","enablement":"!operationInProgress"},{"command":"git.deleteBranch","title":"Delete Branch...","category":"Git","enablement":"!operationInProgress"},{"command":"git.graph.deleteBranch","title":"Delete Branch","category":"Git","enablement":"!operationInProgress"},{"command":"git.deleteRemoteBranch","title":"Delete Remote Branch...","category":"Git","enablement":"!operationInProgress"},{"command":"git.renameBranch","title":"Rename Branch...","category":"Git","enablement":"!operationInProgress"},{"command":"git.merge","title":"Merge...","category":"Git","enablement":"!operationInProgress"},{"command":"git.mergeAbort","title":"Abort Merge","category":"Git","enablement":"gitMergeInProgress"},{"command":"git.rebase","title":"Rebase Branch...","category":"Git","enablement":"!operationInProgress"},{"command":"git.createTag","title":"Create Tag...","icon":"$(plus)","category":"Git","enablement":"!operationInProgress"},{"command":"git.deleteTag","title":"Delete Tag...","category":"Git","enablement":"!operationInProgress"},{"command":"git.migrateWorktreeChanges","title":"Migrate Worktree Changes...","category":"Git","enablement":"!operationInProgress"},{"command":"git.createWorktree","title":"Create Worktree...","category":"Git","enablement":"!operationInProgress"},{"command":"git.deleteWorktree","title":"Delete Worktree...","category":"Git","enablement":"!operationInProgress"},{"command":"git.deleteWorktree2","title":"Delete Worktree","category":"Git","enablement":"!operationInProgress"},{"command":"git.graph.deleteTag","title":"Delete Tag","category":"Git","enablement":"!operationInProgress"},{"command":"git.deleteRemoteTag","title":"Delete Remote Tag...","category":"Git","enablement":"!operationInProgress"},{"command":"git.fetch","title":"Fetch","category":"Git","enablement":"!operationInProgress"},{"command":"git.fetchPrune","title":"Fetch (Prune)","category":"Git","enablement":"!operationInProgress"},{"command":"git.fetchAll","title":"Fetch From All Remotes","icon":"$(git-fetch)","category":"Git","enablement":"!operationInProgress"},{"command":"git.fetchRef","title":"Fetch","icon":"$(git-fetch)","category":"Git","enablement":"!operationInProgress"},{"command":"git.pull","title":"Pull","category":"Git","enablement":"!operationInProgress"},{"command":"git.pullRebase","title":"Pull (Rebase)","category":"Git","enablement":"!operationInProgress"},{"command":"git.pullFrom","title":"Pull from...","category":"Git","enablement":"!operationInProgress"},{"command":"git.pullRef","title":"Pull","icon":"$(repo-pull)","category":"Git","enablement":"!operationInProgress && scmCurrentHistoryItemRefInFilter && scmCurrentHistoryItemRefHasRemote"},{"command":"git.push","title":"Push","category":"Git","enablement":"!operationInProgress"},{"command":"git.pushForce","title":"Push (Force)","category":"Git","enablement":"!operationInProgress"},{"command":"git.pushTo","title":"Push to...","category":"Git","enablement":"!operationInProgress"},{"command":"git.pushToForce","title":"Push to... (Force)","category":"Git","enablement":"!operationInProgress"},{"command":"git.pushTags","title":"Push Tags","category":"Git","enablement":"!operationInProgress"},{"command":"git.pushWithTags","title":"Push (Follow Tags)","category":"Git","enablement":"!operationInProgress"},{"command":"git.pushWithTagsForce","title":"Push (Follow Tags, Force)","category":"Git","enablement":"!operationInProgress"},{"command":"git.pushRef","title":"Push","icon":"$(repo-push)","category":"Git","enablement":"!operationInProgress && scmCurrentHistoryItemRefInFilter && scmCurrentHistoryItemRefHasRemote"},{"command":"git.cherryPick","title":"Cherry Pick...","category":"Git","enablement":"!operationInProgress"},{"command":"git.graph.cherryPick","title":"Cherry Pick","category":"Git","enablement":"!operationInProgress"},{"command":"git.cherryPickAbort","title":"Abort Cherry Pick","category":"Git","enablement":"!operationInProgress"},{"command":"git.addRemote","title":"Add Remote...","category":"Git","enablement":"!operationInProgress"},{"command":"git.removeRemote","title":"Remove Remote","category":"Git","enablement":"!operationInProgress"},{"command":"git.sync","title":"Sync","category":"Git","enablement":"!operationInProgress"},{"command":"git.syncRebase","title":"Sync (Rebase)","category":"Git","enablement":"!operationInProgress"},{"command":"git.publish","title":"Publish Branch...","category":"Git","icon":"$(cloud-upload)","enablement":"!operationInProgress"},{"command":"git.showOutput","title":"Show Git Output","category":"Git"},{"command":"git.ignore","title":"Add to .gitignore","category":"Git","enablement":"!operationInProgress"},{"command":"git.revealInExplorer","title":"Reveal in Explorer View","category":"Git"},{"command":"git.revealFileInOS.linux","title":"Open Containing Folder","category":"Git"},{"command":"git.revealFileInOS.mac","title":"Reveal in Finder","category":"Git"},{"command":"git.revealFileInOS.windows","title":"Reveal in File Explorer","category":"Git"},{"command":"git.stashIncludeUntracked","title":"Stash (Include Untracked)","category":"Git","enablement":"!operationInProgress"},{"command":"git.stash","title":"Stash","category":"Git","enablement":"!operationInProgress"},{"command":"git.stashStaged","title":"Stash Staged","category":"Git","enablement":"!operationInProgress && gitVersion2.35"},{"command":"git.stashPop","title":"Pop Stash...","category":"Git","enablement":"!operationInProgress"},{"command":"git.stashPopLatest","title":"Pop Latest Stash","category":"Git","enablement":"!operationInProgress"},{"command":"git.stashPopEditor","title":"Pop Stash","icon":"$(git-stash-pop)","category":"Git","enablement":"!operationInProgress"},{"command":"git.stashApply","title":"Apply Stash...","category":"Git","enablement":"!operationInProgress"},{"command":"git.stashApplyLatest","title":"Apply Latest Stash","category":"Git","enablement":"!operationInProgress"},{"command":"git.stashApplyEditor","title":"Apply Stash","icon":"$(git-stash-apply)","category":"Git","enablement":"!operationInProgress"},{"command":"git.stashDrop","title":"Drop Stash...","category":"Git","enablement":"!operationInProgress"},{"command":"git.stashDropAll","title":"Drop All Stashes...","category":"Git","enablement":"!operationInProgress"},{"command":"git.stashDropEditor","title":"Drop Stash","icon":"$(trash)","category":"Git","enablement":"!operationInProgress"},{"command":"git.stashView","title":"View Stash...","category":"Git","enablement":"!operationInProgress"},{"command":"git.timeline.openDiff","title":"Open Changes","icon":"$(compare-changes)","category":"Git"},{"command":"git.timeline.copyCommitId","title":"Copy Commit ID","category":"Git"},{"command":"git.timeline.copyCommitMessage","title":"Copy Commit Message","category":"Git"},{"command":"git.timeline.selectForCompare","title":"Select for Compare","category":"Git"},{"command":"git.timeline.compareWithSelected","title":"Compare with Selected","category":"Git"},{"command":"git.timeline.viewCommit","title":"Open Commit","icon":"$(diff-multiple)","category":"Git"},{"command":"git.rebaseAbort","title":"Abort Rebase","category":"Git","enablement":"gitRebaseInProgress"},{"command":"git.closeAllDiffEditors","title":"Close All Diff Editors","category":"Git","enablement":"!operationInProgress"},{"command":"git.closeAllUnmodifiedEditors","title":"Close All Unmodified Editors","category":"Git","enablement":"!operationInProgress"},{"command":"git.api.getRepositories","title":"Get Repositories","category":"Git API"},{"command":"git.api.getRepositoryState","title":"Get Repository State","category":"Git API"},{"command":"git.api.getRemoteSources","title":"Get Remote Sources","category":"Git API"},{"command":"git.acceptMerge","title":"Complete Merge","category":"Git","enablement":"isMergeEditor && mergeEditorResultUri in git.mergeChanges"},{"command":"git.openMergeEditor","title":"Resolve in Merge Editor","category":"Git"},{"command":"git.runGitMerge","title":"Compute Conflicts With Git","category":"Git","enablement":"isMergeEditor"},{"command":"git.runGitMergeDiff3","title":"Compute Conflicts With Git (Diff3)","category":"Git","enablement":"isMergeEditor"},{"command":"git.manageUnsafeRepositories","title":"Manage Unsafe Repositories","category":"Git"},{"command":"git.openRepositoriesInParentFolders","title":"Open Repositories In Parent Folders","category":"Git"},{"command":"git.viewChanges","title":"Open Changes","icon":"$(diff-multiple)","category":"Git","enablement":"!operationInProgress"},{"command":"git.viewStagedChanges","title":"Open Staged Changes","icon":"$(diff-multiple)","category":"Git","enablement":"!operationInProgress"},{"command":"git.viewUntrackedChanges","title":"Open Untracked Changes","icon":"$(diff-multiple)","category":"Git","enablement":"!operationInProgress"},{"command":"git.viewCommit","title":"Open Commit","icon":"$(diff-multiple)","category":"Git","enablement":"!operationInProgress"},{"command":"git.copyCommitId","title":"Copy Commit ID","category":"Git"},{"command":"git.copyCommitMessage","title":"Copy Commit Message","category":"Git"},{"command":"git.blame.toggleEditorDecoration","title":"Toggle Git Blame Editor Decoration","category":"Git"},{"command":"git.blame.toggleStatusBarItem","title":"Toggle Git Blame Status Bar Item","category":"Git"},{"command":"git.graph.compareRef","title":"Compare with...","category":"Git","enablement":"!operationInProgress"},{"command":"git.graph.compareWithRemote","title":"Compare with Remote","category":"Git","enablement":"!operationInProgress && scmCurrentHistoryItemRefHasRemote"},{"command":"git.graph.compareWithMergeBase","title":"Compare with Merge Base","category":"Git","enablement":"!operationInProgress && scmCurrentHistoryItemRefHasBase"},{"command":"git.repositories.checkout","title":"Checkout","icon":"$(target)","category":"Git","enablement":"!operationInProgress && !scmArtifactIsHistoryItemRef"},{"command":"git.repositories.checkoutDetached","title":"Checkout (Detached)","category":"Git","enablement":"!operationInProgress"},{"command":"git.repositories.compareRef","title":"Compare with...","category":"Git","enablement":"!operationInProgress"},{"command":"git.repositories.createBranch","title":"Create Branch...","icon":"$(plus)","category":"Git","enablement":"!operationInProgress"},{"command":"git.repositories.createTag","title":"Create Tag...","icon":"$(plus)","category":"Git","enablement":"!operationInProgress"},{"command":"git.repositories.merge","title":"Merge","category":"Git","enablement":"!operationInProgress"},{"command":"git.repositories.rebase","title":"Rebase","category":"Git","enablement":"!operationInProgress"},{"command":"git.repositories.deleteBranch","title":"Delete","category":"Git","enablement":"!operationInProgress && !scmArtifactIsHistoryItemRef"},{"command":"git.repositories.deleteTag","title":"Delete","category":"Git","enablement":"!operationInProgress && !scmArtifactIsHistoryItemRef"},{"command":"git.repositories.createFrom","title":"Create from...","category":"Git","enablement":"!operationInProgress"},{"command":"git.repositories.stashView","title":"View Stash","icon":"$(diff-multiple)","category":"Git","enablement":"!operationInProgress"},{"command":"git.repositories.stashApply","title":"Apply Stash","icon":"$(git-stash-apply)","category":"Git","enablement":"!operationInProgress"},{"command":"git.repositories.stashPop","title":"Pop Stash","icon":"$(git-stash-pop)","category":"Git","enablement":"!operationInProgress"},{"command":"git.repositories.stashDrop","title":"Drop Stash","icon":"$(trash)","category":"Git","enablement":"!operationInProgress"},{"command":"git.repositories.createWorktree","title":"Create Worktree...","icon":"$(plus)","category":"Git","enablement":"!operationInProgress"},{"command":"git.repositories.openWorktree","title":"Open","icon":"$(folder-opened)","category":"Git","enablement":"!operationInProgress"},{"command":"git.repositories.openWorktreeInNewWindow","title":"Open in New Window","icon":"$(folder-opened)","category":"Git","enablement":"!operationInProgress"},{"command":"git.repositories.deleteWorktree","title":"Delete","category":"Git","enablement":"!operationInProgress"}],"continueEditSession":[{"command":"git.continueInLocalClone","qualifiedName":"Continue Working in New Local Clone","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && remoteName","remoteGroup":"remote_42_git_0_local@0"}],"keybindings":[{"command":"git.stageSelectedRanges","key":"ctrl+k ctrl+alt+s","mac":"cmd+k cmd+alt+s","when":"editorTextFocus && resourceScheme == file"},{"command":"git.unstageSelectedRanges","key":"ctrl+k ctrl+n","mac":"cmd+k cmd+n","when":"editorTextFocus && isInDiffEditor && isInDiffRightEditor && resourceScheme == git"},{"command":"git.revertSelectedRanges","key":"ctrl+k ctrl+r","mac":"cmd+k cmd+r","when":"editorTextFocus && resourceScheme == file"}],"menus":{"commandPalette":[{"command":"git.continueInLocalClone","when":"false"},{"command":"git.clone","when":"config.git.enabled && !git.missing"},{"command":"git.cloneRecursive","when":"config.git.enabled && !git.missing"},{"command":"git.init","when":"config.git.enabled && !git.missing && remoteName != 'codespaces'"},{"command":"git.openRepository","when":"config.git.enabled && !git.missing"},{"command":"git.close","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.closeOtherRepositories","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount > 1"},{"command":"git.openWorktree","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount > 1"},{"command":"git.openWorktreeInNewWindow","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount > 1"},{"command":"git.refresh","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.openFile","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && resourceScheme == file && scmActiveResourceHasChanges"},{"command":"git.openHEADFile","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && resourceScheme == file && scmActiveResourceHasChanges"},{"command":"git.openChange","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.stage","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.stageAll","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.stageAllTracked","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.stageAllUntracked","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.stageAllMerge","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.stageSelectedRanges","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && resourceScheme == file"},{"command":"git.stageChange","when":"false"},{"command":"git.revertSelectedRanges","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && resourceScheme == file"},{"command":"git.revertChange","when":"false"},{"command":"git.openFile2","when":"false"},{"command":"git.unstage","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.unstageAll","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.unstageSelectedRanges","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && resourceScheme == git"},{"command":"git.unstageChange","when":"false"},{"command":"git.clean","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.cleanAll","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.cleanAllTracked","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.cleanAllUntracked","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.rename","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && resourceScheme == file && scmActiveResourceRepository"},{"command":"git.commit","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.commitAmend","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.commitSigned","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.commitStaged","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.commitEmpty","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.commitStagedSigned","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.commitStagedAmend","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.commitAll","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.commitAllSigned","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.commitAllAmend","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.rebaseAbort","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && gitRebaseInProgress"},{"command":"git.commitNoVerify","when":"config.git.enabled && !git.missing && config.git.allowNoVerifyCommit && gitOpenRepositoryCount != 0"},{"command":"git.commitStagedNoVerify","when":"config.git.enabled && !git.missing && config.git.allowNoVerifyCommit && gitOpenRepositoryCount != 0"},{"command":"git.commitEmptyNoVerify","when":"config.git.enabled && !git.missing && config.git.allowNoVerifyCommit && gitOpenRepositoryCount != 0"},{"command":"git.commitStagedSignedNoVerify","when":"config.git.enabled && !git.missing && config.git.allowNoVerifyCommit && gitOpenRepositoryCount != 0"},{"command":"git.commitAmendNoVerify","when":"config.git.enabled && !git.missing && config.git.allowNoVerifyCommit && gitOpenRepositoryCount != 0"},{"command":"git.commitSignedNoVerify","when":"config.git.enabled && !git.missing && config.git.allowNoVerifyCommit && gitOpenRepositoryCount != 0"},{"command":"git.commitStagedAmendNoVerify","when":"config.git.enabled && !git.missing && config.git.allowNoVerifyCommit && gitOpenRepositoryCount != 0"},{"command":"git.commitAllNoVerify","when":"config.git.enabled && !git.missing && config.git.allowNoVerifyCommit && gitOpenRepositoryCount != 0"},{"command":"git.commitAllSignedNoVerify","when":"config.git.enabled && !git.missing && config.git.allowNoVerifyCommit && gitOpenRepositoryCount != 0"},{"command":"git.commitAllAmendNoVerify","when":"config.git.enabled && !git.missing && config.git.allowNoVerifyCommit && gitOpenRepositoryCount != 0"},{"command":"git.restoreCommitTemplate","when":"false"},{"command":"git.commitMessageAccept","when":"false"},{"command":"git.commitMessageDiscard","when":"false"},{"command":"git.revealInExplorer","when":"false"},{"command":"git.revealFileInOS.linux","when":"false"},{"command":"git.revealFileInOS.mac","when":"false"},{"command":"git.revealFileInOS.windows","when":"false"},{"command":"git.undoCommit","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.checkout","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.branch","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.branchFrom","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.deleteBranch","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.deleteRemoteBranch","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.renameBranch","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.cherryPick","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.cherryPickAbort","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && gitCherryPickInProgress"},{"command":"git.pull","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.pullFrom","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.pullRebase","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.merge","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.mergeAbort","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && gitMergeInProgress"},{"command":"git.rebase","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.createTag","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.deleteTag","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.migrateWorktreeChanges","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.createWorktree","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.openWorktree","when":"false"},{"command":"git.openWorktreeInNewWindow","when":"false"},{"command":"git.deleteWorktree","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.deleteWorktree2","when":"false"},{"command":"git.deleteRemoteTag","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.fetch","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.fetchPrune","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.fetchAll","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.push","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.pushForce","when":"config.git.enabled && !git.missing && config.git.allowForcePush && gitOpenRepositoryCount != 0"},{"command":"git.pushTo","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.pushToForce","when":"config.git.enabled && !git.missing && config.git.allowForcePush && gitOpenRepositoryCount != 0"},{"command":"git.pushWithTags","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.pushWithTagsForce","when":"config.git.enabled && !git.missing && config.git.allowForcePush && gitOpenRepositoryCount != 0"},{"command":"git.pushTags","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.addRemote","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.removeRemote","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.sync","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.syncRebase","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.publish","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.showOutput","when":"config.git.enabled"},{"command":"git.ignore","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && resourceScheme == file && scmActiveResourceRepository"},{"command":"git.stashIncludeUntracked","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.stash","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.stashStaged","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && gitVersion2.35"},{"command":"git.stashPop","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.stashPopLatest","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.stashPopEditor","when":"false"},{"command":"git.stashApply","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.stashApplyLatest","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.stashApplyEditor","when":"false"},{"command":"git.stashDrop","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.stashDropAll","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.stashDropEditor","when":"false"},{"command":"git.timeline.openDiff","when":"false"},{"command":"git.timeline.copyCommitId","when":"false"},{"command":"git.timeline.copyCommitMessage","when":"false"},{"command":"git.timeline.selectForCompare","when":"false"},{"command":"git.timeline.compareWithSelected","when":"false"},{"command":"git.timeline.viewCommit","when":"false"},{"command":"git.closeAllDiffEditors","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0"},{"command":"git.api.getRepositories","when":"false"},{"command":"git.api.getRepositoryState","when":"false"},{"command":"git.api.getRemoteSources","when":"false"},{"command":"git.openMergeEditor","when":"false"},{"command":"git.manageUnsafeRepositories","when":"config.git.enabled && !git.missing && git.unsafeRepositoryCount != 0"},{"command":"git.openRepositoriesInParentFolders","when":"config.git.enabled && !git.missing && git.parentRepositoryCount != 0"},{"command":"git.stashView","when":"config.git.enabled && !git.missing"},{"command":"git.viewChanges","when":"config.git.enabled && !git.missing"},{"command":"git.viewStagedChanges","when":"config.git.enabled && !git.missing"},{"command":"git.viewUntrackedChanges","when":"config.git.enabled && !git.missing && config.git.untrackedChanges == separate"},{"command":"git.viewCommit","when":"false"},{"command":"git.stageFile","when":"false"},{"command":"git.unstageFile","when":"false"},{"command":"git.fetchRef","when":"false"},{"command":"git.pullRef","when":"false"},{"command":"git.pushRef","when":"false"},{"command":"git.copyCommitId","when":"false"},{"command":"git.copyCommitMessage","when":"false"},{"command":"git.graph.checkout","when":"false"},{"command":"git.graph.checkoutDetached","when":"false"},{"command":"git.graph.deleteBranch","when":"false"},{"command":"git.graph.compareRef","when":"false"},{"command":"git.graph.deleteTag","when":"false"},{"command":"git.graph.cherryPick","when":"false"},{"command":"git.graph.compareWithMergeBase","when":"false"},{"command":"git.graph.compareWithRemote","when":"false"},{"command":"git.diff.stageHunk","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && diffEditorOriginalUri =~ /^git\\:.*%22ref%22%3A%22~%22%7D$/"},{"command":"git.diff.stageSelection","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && diffEditorOriginalUri =~ /^git\\:.*%22ref%22%3A%22~%22%7D$/"},{"command":"git.repositories.checkout","when":"false"},{"command":"git.repositories.checkoutDetached","when":"false"},{"command":"git.repositories.compareRef","when":"false"},{"command":"git.repositories.createBranch","when":"false"},{"command":"git.repositories.createTag","when":"false"},{"command":"git.repositories.merge","when":"false"},{"command":"git.repositories.rebase","when":"false"},{"command":"git.repositories.deleteBranch","when":"false"},{"command":"git.repositories.deleteTag","when":"false"},{"command":"git.repositories.createFrom","when":"false"},{"command":"git.repositories.stashView","when":"false"},{"command":"git.repositories.stashApply","when":"false"},{"command":"git.repositories.stashPop","when":"false"},{"command":"git.repositories.stashDrop","when":"false"},{"command":"git.repositories.createWorktree","when":"false"},{"command":"git.repositories.openWorktree","when":"false"},{"command":"git.repositories.openWorktreeInNewWindow","when":"false"},{"command":"git.repositories.deleteWorktree","when":"false"}],"scm/title":[{"command":"git.commit","group":"navigation","when":"scmProvider == git"},{"command":"git.refresh","group":"navigation","when":"scmProvider == git"},{"command":"git.pull","group":"1_header@1","when":"scmProvider == git"},{"command":"git.push","group":"1_header@2","when":"scmProvider == git"},{"command":"git.clone","group":"1_header@3","when":"scmProvider == git"},{"command":"git.checkout","group":"1_header@4","when":"scmProvider == git"},{"command":"git.fetch","group":"1_header@5","when":"scmProvider == git"},{"submenu":"git.commit","group":"2_main@1","when":"scmProvider == git"},{"submenu":"git.changes","group":"2_main@2","when":"scmProvider == git"},{"submenu":"git.pullpush","group":"2_main@3","when":"scmProvider == git"},{"submenu":"git.branch","group":"2_main@4","when":"scmProvider == git"},{"submenu":"git.remotes","group":"2_main@5","when":"scmProvider == git"},{"submenu":"git.stash","group":"2_main@6","when":"scmProvider == git"},{"submenu":"git.tags","group":"2_main@7","when":"scmProvider == git"},{"submenu":"git.worktrees","group":"2_main@8","when":"scmProvider == git"},{"command":"git.showOutput","group":"3_footer","when":"scmProvider == git"}],"scm/repositories/title":[{"command":"git.reopenClosedRepositories","group":"navigation@1","when":"git.closedRepositoryCount > 0"}],"scm/repository":[{"command":"git.pull","group":"1_header@1","when":"scmProvider == git"},{"command":"git.push","group":"1_header@2","when":"scmProvider == git"},{"command":"git.clone","group":"1_header@3","when":"scmProvider == git"},{"command":"git.checkout","group":"1_header@4","when":"scmProvider == git"},{"command":"git.fetch","group":"1_header@5","when":"scmProvider == git"},{"submenu":"git.commit","group":"2_main@1","when":"scmProvider == git"},{"submenu":"git.changes","group":"2_main@2","when":"scmProvider == git"},{"submenu":"git.pullpush","group":"2_main@3","when":"scmProvider == git"},{"submenu":"git.branch","group":"2_main@4","when":"scmProvider == git"},{"submenu":"git.remotes","group":"2_main@5","when":"scmProvider == git"},{"submenu":"git.stash","group":"2_main@6","when":"scmProvider == git"},{"submenu":"git.tags","group":"2_main@7","when":"scmProvider == git"},{"submenu":"git.worktrees","group":"2_main@8","when":"scmProvider == git"},{"command":"git.showOutput","group":"3_footer","when":"scmProvider == git"}],"scm/sourceControl":[{"command":"git.close","group":"navigation@1","when":"scmProvider == git"},{"command":"git.closeOtherRepositories","group":"navigation@2","when":"scmProvider == git && gitOpenRepositoryCount > 1"},{"command":"git.openWorktree","group":"1_worktree@1","when":"scmProvider == git && scmProviderContext == worktree"},{"command":"git.openWorktreeInNewWindow","group":"1_worktree@2","when":"scmProvider == git && scmProviderContext == worktree"},{"command":"git.deleteWorktree2","group":"2_worktree@1","when":"scmProvider == git && scmProviderContext == worktree"}],"scm/artifactGroup/context":[{"command":"git.repositories.createBranch","group":"inline@1","when":"scmProvider == git && scmArtifactGroup == branches"},{"command":"git.repositories.createTag","group":"inline@1","when":"scmProvider == git && scmArtifactGroup == tags"},{"submenu":"git.repositories.stash","group":"inline@1","when":"scmProvider == git && scmArtifactGroup == stashes"},{"command":"git.repositories.createWorktree","group":"inline@1","when":"scmProvider == git && scmArtifactGroup == worktrees"}],"scm/artifact/context":[{"command":"git.repositories.checkout","group":"inline@1","when":"scmProvider == git && (scmArtifactGroupId == branches || scmArtifactGroupId == tags)"},{"command":"git.repositories.stashApply","alt":"git.repositories.stashPop","group":"inline@1","when":"scmProvider == git && scmArtifactGroupId == stashes"},{"command":"git.repositories.stashView","group":"1_view@1","when":"scmProvider == git && scmArtifactGroupId == stashes"},{"command":"git.repositories.stashApply","group":"2_apply@1","when":"scmProvider == git && scmArtifactGroupId == stashes"},{"command":"git.repositories.stashPop","group":"2_apply@2","when":"scmProvider == git && scmArtifactGroupId == stashes"},{"command":"git.repositories.stashDrop","group":"3_drop@3","when":"scmProvider == git && scmArtifactGroupId == stashes"},{"command":"git.repositories.checkout","group":"1_checkout@1","when":"scmProvider == git && (scmArtifactGroupId == branches || scmArtifactGroupId == tags)"},{"command":"git.repositories.checkoutDetached","group":"1_checkout@2","when":"scmProvider == git && (scmArtifactGroupId == branches || scmArtifactGroupId == tags)"},{"command":"git.repositories.merge","group":"2_modify@1","when":"scmProvider == git && scmArtifactGroupId == branches"},{"command":"git.repositories.rebase","group":"2_modify@2","when":"scmProvider == git && scmArtifactGroupId == branches"},{"command":"git.repositories.createFrom","group":"3_modify@1","when":"scmProvider == git && scmArtifactGroupId == branches"},{"command":"git.repositories.deleteBranch","group":"3_modify@2","when":"scmProvider == git && scmArtifactGroupId == branches"},{"command":"git.repositories.deleteTag","group":"3_modify@1","when":"scmProvider == git && scmArtifactGroupId == tags"},{"command":"git.repositories.compareRef","group":"4_compare@1","when":"scmProvider == git && (scmArtifactGroupId == branches || scmArtifactGroupId == tags)"},{"command":"git.repositories.openWorktreeInNewWindow","group":"inline@1","when":"scmProvider == git && scmArtifactGroupId == worktrees"},{"command":"git.repositories.openWorktree","group":"1_open@1","when":"scmProvider == git && scmArtifactGroupId == worktrees"},{"command":"git.repositories.openWorktreeInNewWindow","group":"1_open@2","when":"scmProvider == git && scmArtifactGroupId == worktrees"},{"command":"git.repositories.deleteWorktree","group":"2_modify@1","when":"scmProvider == git && scmArtifactGroupId == worktrees"}],"scm/resourceGroup/context":[{"command":"git.stageAllMerge","when":"scmProvider == git && scmResourceGroup == merge","group":"1_modification"},{"command":"git.stageAllMerge","when":"scmProvider == git && scmResourceGroup == merge","group":"inline@2"},{"command":"git.unstageAll","when":"scmProvider == git && scmResourceGroup == index","group":"1_modification"},{"command":"git.unstageAll","when":"scmProvider == git && scmResourceGroup == index","group":"inline@2"},{"command":"git.viewStagedChanges","when":"scmProvider == git && scmResourceGroup == index","group":"inline@1"},{"command":"git.viewChanges","when":"scmProvider == git && scmResourceGroup == workingTree","group":"inline@1"},{"command":"git.cleanAll","when":"scmProvider == git && scmResourceGroup == workingTree && config.git.untrackedChanges == mixed","group":"1_modification"},{"command":"git.stageAll","when":"scmProvider == git && scmResourceGroup == workingTree && config.git.untrackedChanges == mixed","group":"1_modification"},{"command":"git.cleanAll","when":"scmProvider == git && scmResourceGroup == workingTree && config.git.untrackedChanges == mixed","group":"inline@2"},{"command":"git.stageAll","when":"scmProvider == git && scmResourceGroup == workingTree && config.git.untrackedChanges == mixed","group":"inline@2"},{"command":"git.cleanAllTracked","when":"scmProvider == git && scmResourceGroup == workingTree && config.git.untrackedChanges != mixed","group":"1_modification"},{"command":"git.stageAllTracked","when":"scmProvider == git && scmResourceGroup == workingTree && config.git.untrackedChanges != mixed","group":"1_modification"},{"command":"git.cleanAllTracked","when":"scmProvider == git && scmResourceGroup == workingTree && config.git.untrackedChanges != mixed","group":"inline@2"},{"command":"git.stageAllTracked","when":"scmProvider == git && scmResourceGroup == workingTree && config.git.untrackedChanges != mixed","group":"inline@2"},{"command":"git.cleanAllUntracked","when":"scmProvider == git && scmResourceGroup == untracked","group":"1_modification"},{"command":"git.stageAllUntracked","when":"scmProvider == git && scmResourceGroup == untracked","group":"1_modification"},{"command":"git.viewUntrackedChanges","when":"scmProvider == git && scmResourceGroup == untracked","group":"inline@1"},{"command":"git.cleanAllUntracked","when":"scmProvider == git && scmResourceGroup == untracked","group":"inline@2"},{"command":"git.stageAllUntracked","when":"scmProvider == git && scmResourceGroup == untracked","group":"inline@2"}],"scm/resourceFolder/context":[{"command":"git.stage","when":"scmProvider == git && scmResourceGroup == merge","group":"1_modification"},{"command":"git.stage","when":"scmProvider == git && scmResourceGroup == merge","group":"inline@2"},{"command":"git.unstage","when":"scmProvider == git && scmResourceGroup == index","group":"1_modification"},{"command":"git.unstage","when":"scmProvider == git && scmResourceGroup == index","group":"inline@2"},{"command":"git.stage","when":"scmProvider == git && scmResourceGroup == workingTree","group":"1_modification"},{"command":"git.clean","when":"scmProvider == git && scmResourceGroup == workingTree","group":"1_modification"},{"command":"git.clean","when":"scmProvider == git && scmResourceGroup == workingTree","group":"inline@2"},{"command":"git.stage","when":"scmProvider == git && scmResourceGroup == workingTree","group":"inline@2"},{"command":"git.ignore","when":"scmProvider == git && scmResourceGroup == workingTree","group":"1_modification@3"},{"command":"git.stage","when":"scmProvider == git && scmResourceGroup == untracked","group":"1_modification"},{"command":"git.stage","when":"scmProvider == git && scmResourceGroup == untracked","group":"inline@2"},{"command":"git.clean","when":"scmProvider == git && scmResourceGroup == untracked","group":"1_modification"},{"command":"git.clean","when":"scmProvider == git && scmResourceGroup == untracked","group":"inline@2"},{"command":"git.ignore","when":"scmProvider == git && scmResourceGroup == untracked","group":"1_modification@3"}],"scm/resourceState/context":[{"command":"git.stage","when":"scmProvider == git && scmResourceGroup == merge","group":"1_modification"},{"command":"git.openFile","when":"scmProvider == git && scmResourceGroup == merge","group":"navigation"},{"command":"git.stage","when":"scmProvider == git && scmResourceGroup == merge","group":"inline@2"},{"command":"git.revealFileInOS.linux","when":"scmProvider == git && scmResourceGroup == merge && remoteName == '' && isLinux","group":"2_view@1"},{"command":"git.revealFileInOS.mac","when":"scmProvider == git && scmResourceGroup == merge && remoteName == '' && isMac","group":"2_view@1"},{"command":"git.revealFileInOS.windows","when":"scmProvider == git && scmResourceGroup == merge && remoteName == '' && isWindows","group":"2_view@1"},{"command":"git.revealInExplorer","when":"scmProvider == git && scmResourceGroup == merge","group":"2_view@2"},{"command":"git.openFile2","when":"scmProvider == git && scmResourceGroup == merge && config.git.showInlineOpenFileAction && config.git.openDiffOnClick","group":"inline@1"},{"command":"git.openChange","when":"scmProvider == git && scmResourceGroup == merge && config.git.showInlineOpenFileAction && !config.git.openDiffOnClick","group":"inline@1"},{"command":"git.openChange","when":"scmProvider == git && scmResourceGroup == index","group":"navigation"},{"command":"git.openFile","when":"scmProvider == git && scmResourceGroup == index","group":"navigation"},{"command":"git.openHEADFile","when":"scmProvider == git && scmResourceGroup == index","group":"navigation"},{"command":"git.unstage","when":"scmProvider == git && scmResourceGroup == index","group":"1_modification"},{"command":"git.unstage","when":"scmProvider == git && scmResourceGroup == index","group":"inline@2"},{"command":"git.revealFileInOS.linux","when":"scmProvider == git && scmResourceGroup == index && remoteName == '' && isLinux","group":"2_view@1"},{"command":"git.revealFileInOS.mac","when":"scmProvider == git && scmResourceGroup == index && remoteName == '' && isMac","group":"2_view@1"},{"command":"git.revealFileInOS.windows","when":"scmProvider == git && scmResourceGroup == index && remoteName == '' && isWindows","group":"2_view@1"},{"command":"git.revealInExplorer","when":"scmProvider == git && scmResourceGroup == index","group":"2_view@2"},{"command":"git.compareWithWorkspace","when":"scmProvider == git && scmResourceGroup == index && scmResourceState == worktree","group":"worktree_diff"},{"command":"git.openFile2","when":"scmProvider == git && scmResourceGroup == index && config.git.showInlineOpenFileAction && config.git.openDiffOnClick","group":"inline@1"},{"command":"git.openChange","when":"scmProvider == git && scmResourceGroup == index && config.git.showInlineOpenFileAction && !config.git.openDiffOnClick","group":"inline@1"},{"command":"git.openChange","when":"scmProvider == git && scmResourceGroup == workingTree","group":"navigation"},{"command":"git.openHEADFile","when":"scmProvider == git && scmResourceGroup == workingTree","group":"navigation"},{"command":"git.openFile","when":"scmProvider == git && scmResourceGroup == workingTree","group":"navigation"},{"command":"git.stage","when":"scmProvider == git && scmResourceGroup == workingTree","group":"1_modification"},{"command":"git.clean","when":"scmProvider == git && scmResourceGroup == workingTree","group":"1_modification"},{"command":"git.clean","when":"scmProvider == git && scmResourceGroup == workingTree","group":"inline@2"},{"command":"git.stage","when":"scmProvider == git && scmResourceGroup == workingTree","group":"inline@2"},{"command":"git.compareWithWorkspace","when":"scmProvider == git && scmResourceGroup == workingTree && scmResourceState == worktree","group":"worktree_diff"},{"command":"git.openFile2","when":"scmProvider == git && scmResourceGroup == workingTree && config.git.showInlineOpenFileAction && config.git.openDiffOnClick","group":"inline@1"},{"command":"git.openChange","when":"scmProvider == git && scmResourceGroup == workingTree && config.git.showInlineOpenFileAction && !config.git.openDiffOnClick","group":"inline@1"},{"command":"git.ignore","when":"scmProvider == git && scmResourceGroup == workingTree","group":"1_modification@3"},{"command":"git.revealFileInOS.linux","when":"scmProvider == git && scmResourceGroup == workingTree && remoteName == '' && isLinux","group":"2_view@1"},{"command":"git.revealFileInOS.mac","when":"scmProvider == git && scmResourceGroup == workingTree && remoteName == '' && isMac","group":"2_view@1"},{"command":"git.revealFileInOS.windows","when":"scmProvider == git && scmResourceGroup == workingTree && remoteName == '' && isWindows","group":"2_view@1"},{"command":"git.revealInExplorer","when":"scmProvider == git && scmResourceGroup == workingTree","group":"2_view@2"},{"command":"git.openChange","when":"scmProvider == git && scmResourceGroup == untracked","group":"navigation"},{"command":"git.openHEADFile","when":"scmProvider == git && scmResourceGroup == untracked","group":"navigation"},{"command":"git.openFile","when":"scmProvider == git && scmResourceGroup == untracked","group":"navigation"},{"command":"git.stage","when":"scmProvider == git && scmResourceGroup == untracked","group":"1_modification"},{"command":"git.clean","when":"scmProvider == git && scmResourceGroup == untracked && !gitFreshRepository","group":"1_modification"},{"command":"git.clean","when":"scmProvider == git && scmResourceGroup == untracked && !gitFreshRepository","group":"inline@2"},{"command":"git.stage","when":"scmProvider == git && scmResourceGroup == untracked","group":"inline@2"},{"command":"git.openFile2","when":"scmProvider == git && scmResourceGroup == untracked && config.git.showInlineOpenFileAction && config.git.openDiffOnClick","group":"inline@1"},{"command":"git.openChange","when":"scmProvider == git && scmResourceGroup == untracked && config.git.showInlineOpenFileAction && !config.git.openDiffOnClick","group":"inline@1"},{"command":"git.ignore","when":"scmProvider == git && scmResourceGroup == untracked","group":"1_modification@3"}],"scm/history/title":[{"command":"git.fetchAll","group":"navigation@900","when":"scmProvider == git"},{"command":"git.pullRef","group":"navigation@901","when":"scmProvider == git"},{"command":"git.pushRef","when":"scmProvider == git && scmCurrentHistoryItemRefHasRemote","group":"navigation@902"},{"command":"git.publish","when":"scmProvider == git && !scmCurrentHistoryItemRefHasRemote","group":"navigation@903"}],"scm/historyItem/context":[{"command":"git.graph.checkoutDetached","when":"scmProvider == git","group":"1_checkout@2"},{"command":"git.branch","when":"scmProvider == git","group":"2_branch@2"},{"command":"git.createTag","when":"scmProvider == git","group":"3_tag@1"},{"command":"git.graph.cherryPick","when":"scmProvider == git","group":"4_modify@1"},{"command":"git.graph.compareWithRemote","when":"scmProvider == git","group":"5_compare@1"},{"command":"git.graph.compareWithMergeBase","when":"scmProvider == git","group":"5_compare@2"},{"command":"git.graph.compareRef","when":"scmProvider == git","group":"5_compare@3"},{"command":"git.copyCommitId","when":"scmProvider == git && !listMultiSelection","group":"9_copy@1"},{"command":"git.copyCommitMessage","when":"scmProvider == git && !listMultiSelection","group":"9_copy@2"}],"scm/historyItemRef/context":[{"command":"git.graph.checkout","when":"scmProvider == git","group":"1_checkout@1"},{"command":"git.graph.deleteBranch","when":"scmProvider == git && scmHistoryItemRef =~ /^refs\\/heads\\/|^refs\\/remotes\\//","group":"2_branch@2"},{"command":"git.graph.deleteTag","when":"scmProvider == git && scmHistoryItemRef =~ /^refs\\/tags\\//","group":"3_tag@2"}],"editor/title":[{"command":"git.openFile","group":"navigation","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && isInDiffEditor && resourceScheme =~ /^git$|^file$/"},{"command":"git.openFile","group":"navigation","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && isInNotebookTextDiffEditor && resourceScheme =~ /^git$|^file$/"},{"command":"git.openFile","group":"navigation","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && !isInDiffEditor && !isInNotebookTextDiffEditor && resourceScheme == git"},{"command":"git.openChange","group":"navigation@2","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && !isInDiffEditor && !isMergeEditor && resourceScheme == file && scmActiveResourceHasChanges"},{"command":"git.stashApplyEditor","alt":"git.stashPopEditor","group":"navigation@1","when":"config.git.enabled && !git.missing && resourceScheme == git-stash"},{"command":"git.stashDropEditor","group":"navigation@2","when":"config.git.enabled && !git.missing && resourceScheme == git-stash"},{"command":"git.stage","group":"2_git@1","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && !isInDiffEditor && !isMergeEditor && resourceScheme == file && git.activeResourceHasUnstagedChanges"},{"command":"git.unstage","group":"2_git@2","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && !isInDiffEditor && !isMergeEditor && resourceScheme == file && git.activeResourceHasStagedChanges"},{"command":"git.stage","group":"2_git@1","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && isInDiffEditor && isInDiffRightEditor && !isEmbeddedDiffEditor && resourceScheme == file"},{"command":"git.stageSelectedRanges","group":"2_git@2","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && isInDiffEditor && isInDiffRightEditor && !isEmbeddedDiffEditor && resourceScheme == file"},{"command":"git.unstage","group":"2_git@3","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && isInDiffEditor && isInDiffRightEditor && !isEmbeddedDiffEditor && resourceScheme == git"},{"command":"git.unstageSelectedRanges","group":"2_git@4","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && isInDiffEditor && isInDiffRightEditor && !isEmbeddedDiffEditor && resourceScheme == git"},{"command":"git.revertSelectedRanges","group":"2_git@5","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && isInDiffEditor && isInDiffRightEditor && !isEmbeddedDiffEditor && resourceScheme == file"}],"editor/context":[{"command":"git.stageSelectedRanges","group":"2_git@1","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && isInDiffEditor && isInDiffRightEditor && !isEmbeddedDiffEditor && resourceScheme == file"},{"command":"git.unstageSelectedRanges","group":"2_git@2","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && isInDiffEditor && isInDiffRightEditor && !isEmbeddedDiffEditor && resourceScheme == git"},{"command":"git.revertSelectedRanges","group":"2_git@3","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && isInDiffEditor && isInDiffRightEditor && !isEmbeddedDiffEditor && resourceScheme == file"}],"editor/content":[{"command":"git.acceptMerge","when":"isMergeResultEditor && mergeEditorBaseUri =~ /^(git|file):/ && mergeEditorResultUri in git.mergeChanges"},{"command":"git.openMergeEditor","group":"navigation@-10","when":"config.git.enabled && !git.missing && !isInDiffEditor && !isMergeEditor && resource in git.mergeChanges && git.activeResourceHasMergeConflicts"},{"command":"git.commitMessageAccept","group":"navigation","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && editorLangId == git-commit"},{"command":"git.commitMessageDiscard","group":"secondary","when":"config.git.enabled && !git.missing && gitOpenRepositoryCount != 0 && editorLangId == git-commit"}],"multiDiffEditor/resource/title":[{"command":"git.stageFile","group":"navigation","when":"scmProvider == git && scmResourceGroup == workingTree"},{"command":"git.stageFile","group":"navigation","when":"scmProvider == git && scmResourceGroup == untracked"},{"command":"git.unstageFile","group":"navigation","when":"scmProvider == git && scmResourceGroup == index"}],"diffEditor/gutter/hunk":[{"command":"git.diff.stageHunk","group":"primary@10","when":"diffEditorOriginalUri =~ /^git\\:.*%22ref%22%3A%22~%22%7D$/"}],"diffEditor/gutter/selection":[{"command":"git.diff.stageSelection","group":"primary@10","when":"diffEditorOriginalUri =~ /^git\\:.*%22ref%22%3A%22~%22%7D$/"}],"scm/change/title":[{"command":"git.stageChange","when":"config.git.enabled && !git.missing && originalResource =~ /^git\\:.*%22ref%22%3A%22%22%7D$/"},{"command":"git.revertChange","when":"config.git.enabled && !git.missing && originalResource =~ /^git\\:.*%22ref%22%3A%22%22%7D$/"},{"command":"git.unstageChange","when":"false"}],"timeline/item/context":[{"command":"git.timeline.viewCommit","group":"inline","when":"config.git.enabled && !git.missing && timelineItem =~ /git:file:commit\\b/ && !listMultiSelection"},{"command":"git.timeline.openDiff","group":"1_actions@1","when":"config.git.enabled && !git.missing && timelineItem =~ /git:file\\b/ && !listMultiSelection"},{"command":"git.timeline.viewCommit","group":"1_actions@2","when":"config.git.enabled && !git.missing && timelineItem =~ /git:file:commit\\b/ && !listMultiSelection"},{"command":"git.timeline.compareWithSelected","group":"3_compare@1","when":"config.git.enabled && !git.missing && git.timeline.selectedForCompare && timelineItem =~ /git:file\\b/ && !listMultiSelection"},{"command":"git.timeline.selectForCompare","group":"3_compare@2","when":"config.git.enabled && !git.missing && timelineItem =~ /git:file\\b/ && !listMultiSelection"},{"command":"git.timeline.copyCommitId","group":"5_copy@1","when":"config.git.enabled && !git.missing && timelineItem =~ /git:file:commit\\b/ && !listMultiSelection"},{"command":"git.timeline.copyCommitMessage","group":"5_copy@2","when":"config.git.enabled && !git.missing && timelineItem =~ /git:file:commit\\b/ && !listMultiSelection"}],"git.commit":[{"command":"git.commit","group":"1_commit@1"},{"command":"git.commitStaged","group":"1_commit@2"},{"command":"git.commitAll","group":"1_commit@3"},{"command":"git.undoCommit","group":"1_commit@4"},{"command":"git.rebaseAbort","group":"1_commit@5"},{"command":"git.commitNoVerify","group":"2_commit_noverify@1","when":"config.git.allowNoVerifyCommit"},{"command":"git.commitStagedNoVerify","group":"2_commit_noverify@2","when":"config.git.allowNoVerifyCommit"},{"command":"git.commitAllNoVerify","group":"2_commit_noverify@3","when":"config.git.allowNoVerifyCommit"},{"command":"git.commitAmend","group":"3_amend@1"},{"command":"git.commitStagedAmend","group":"3_amend@2"},{"command":"git.commitAllAmend","group":"3_amend@3"},{"command":"git.commitAmendNoVerify","group":"4_amend_noverify@1","when":"config.git.allowNoVerifyCommit"},{"command":"git.commitStagedAmendNoVerify","group":"4_amend_noverify@2","when":"config.git.allowNoVerifyCommit"},{"command":"git.commitAllAmendNoVerify","group":"4_amend_noverify@3","when":"config.git.allowNoVerifyCommit"},{"command":"git.commitSigned","group":"5_signoff@1"},{"command":"git.commitStagedSigned","group":"5_signoff@2"},{"command":"git.commitAllSigned","group":"5_signoff@3"},{"command":"git.commitSignedNoVerify","group":"6_signoff_noverify@1","when":"config.git.allowNoVerifyCommit"},{"command":"git.commitStagedSignedNoVerify","group":"6_signoff_noverify@2","when":"config.git.allowNoVerifyCommit"},{"command":"git.commitAllSignedNoVerify","group":"6_signoff_noverify@3","when":"config.git.allowNoVerifyCommit"}],"git.changes":[{"command":"git.stageAll","group":"changes@1"},{"command":"git.unstageAll","group":"changes@2"},{"command":"git.cleanAll","group":"changes@3"}],"git.pullpush":[{"command":"git.sync","group":"1_sync@1"},{"command":"git.syncRebase","when":"gitState == idle","group":"1_sync@2"},{"command":"git.pull","group":"2_pull@1"},{"command":"git.pullRebase","group":"2_pull@2"},{"command":"git.pullFrom","group":"2_pull@3"},{"command":"git.push","group":"3_push@1"},{"command":"git.pushForce","when":"config.git.allowForcePush","group":"3_push@2"},{"command":"git.pushTo","group":"3_push@3"},{"command":"git.pushToForce","when":"config.git.allowForcePush","group":"3_push@4"},{"command":"git.fetch","group":"4_fetch@1"},{"command":"git.fetchPrune","group":"4_fetch@2"},{"command":"git.fetchAll","group":"4_fetch@3"}],"git.branch":[{"command":"git.merge","group":"1_merge@1"},{"command":"git.rebase","group":"1_merge@2"},{"command":"git.branch","group":"2_branch@1"},{"command":"git.branchFrom","group":"2_branch@2"},{"command":"git.renameBranch","group":"3_modify@1"},{"command":"git.deleteBranch","group":"3_modify@2"},{"command":"git.deleteRemoteBranch","group":"3_modify@3"},{"command":"git.publish","group":"4_publish@1"}],"git.remotes":[{"command":"git.addRemote","group":"remote@1"},{"command":"git.removeRemote","group":"remote@2"}],"git.stash":[{"command":"git.stash","group":"1_stash@1"},{"command":"git.stashIncludeUntracked","group":"1_stash@2"},{"command":"git.stashStaged","when":"gitVersion2.35","group":"1_stash@3"},{"command":"git.stashApplyLatest","group":"2_apply@1"},{"command":"git.stashApply","group":"2_apply@2"},{"command":"git.stashPopLatest","group":"3_pop@1"},{"command":"git.stashPop","group":"3_pop@2"},{"command":"git.stashDrop","group":"4_drop@1"},{"command":"git.stashDropAll","group":"4_drop@2"},{"command":"git.stashView","group":"5_preview@1"}],"git.repositories.stash":[{"command":"git.stash","group":"1_stash@1"},{"command":"git.stashStaged","when":"gitVersion2.35","group":"2_stash@1"},{"command":"git.stashIncludeUntracked","group":"2_stash@2"}],"git.tags":[{"command":"git.createTag","group":"1_tags@1"},{"command":"git.deleteTag","group":"1_tags@2"},{"command":"git.deleteRemoteTag","group":"1_tags@3"},{"command":"git.pushTags","group":"2_tags@1"}],"git.worktrees":[{"when":"scmProviderContext == worktree","command":"git.openWorktree","group":"openWorktrees@1"},{"when":"scmProviderContext == worktree","command":"git.openWorktreeInNewWindow","group":"openWorktrees@2"},{"when":"scmProviderContext == repository","command":"git.createWorktree","group":"worktrees@1"},{"when":"scmProviderContext == worktree","command":"git.deleteWorktree2","group":"worktrees@2"}]},"submenus":[{"id":"git.commit","label":"Commit"},{"id":"git.changes","label":"Changes"},{"id":"git.pullpush","label":"Pull, Push"},{"id":"git.branch","label":"Branch"},{"id":"git.remotes","label":"Remote"},{"id":"git.stash","label":"Stash"},{"id":"git.tags","label":"Tags"},{"id":"git.worktrees","label":"Worktrees"},{"id":"git.repositories.stash","label":"Stash","icon":"$(plus)"}],"configuration":{"title":"Git","properties":{"git.enabled":{"type":"boolean","scope":"resource","description":"Whether Git is enabled.","default":true},"git.path":{"type":["string","null","array"],"markdownDescription":"Path and filename of the git executable, e.g. `C:\\Program Files\\Git\\bin\\git.exe` (Windows). This can also be an array of string values containing multiple paths to look up.","default":null,"scope":"machine"},"git.autoRepositoryDetection":{"type":["boolean","string"],"enum":[true,false,"subFolders","openEditors"],"enumDescriptions":["Scan for both subfolders of the current opened folder and parent folders of open files.","Disable automatic repository scanning.","Scan for subfolders of the currently opened folder.","Scan for parent folders of open files."],"description":"Configures when repositories should be automatically detected.","default":true},"git.autorefresh":{"type":"boolean","description":"Whether auto refreshing is enabled.","default":true},"git.autofetch":{"type":["boolean","string"],"enum":[true,false,"all"],"scope":"resource","markdownDescription":"When set to true, commits will automatically be fetched from the default remote of the current Git repository. Setting to `all` will fetch from all remotes.","default":false,"tags":["usesOnlineServices"]},"git.autofetchPeriod":{"type":"number","scope":"resource","markdownDescription":"Duration in seconds between each automatic git fetch, when `#git.autofetch#` is enabled.","default":180},"git.defaultBranchName":{"type":"string","markdownDescription":"The name of the default branch (example: main, trunk, development) when initializing a new Git repository. When set to empty, the default branch name configured in Git will be used. **Note:** Requires Git version `2.28.0` or later.","default":"main","scope":"resource"},"git.branchPrefix":{"type":"string","description":"Prefix used when creating a new branch.","default":"","scope":"resource"},"git.branchProtection":{"type":"array","markdownDescription":"List of protected branches. By default, a prompt is shown before changes are committed to a protected branch. The prompt can be controlled using the `#git.branchProtectionPrompt#` setting.","items":{"type":"string"},"default":[],"scope":"resource"},"git.branchProtectionPrompt":{"type":"string","description":"Controls whether a prompt is being shown before changes are committed to a protected branch.","enum":["alwaysCommit","alwaysCommitToNewBranch","alwaysPrompt"],"enumDescriptions":["Always commit changes to the protected branch.","Always commit changes to a new branch.","Always prompt before changes are committed to a protected branch."],"default":"alwaysPrompt","scope":"resource"},"git.branchValidationRegex":{"type":"string","description":"A regular expression to validate new branch names.","default":""},"git.branchWhitespaceChar":{"type":"string","description":"The character to replace whitespace in new branch names, and to separate segments of a randomly generated branch name.","default":"-"},"git.branchRandomName.enable":{"type":"boolean","description":"Controls whether a random name is generated when creating a new branch.","default":false,"scope":"resource"},"git.branchRandomName.dictionary":{"type":"array","markdownDescription":"List of dictionaries used for the randomly generated branch name. Each value represents the dictionary used to generate the segment of the branch name. Supported dictionaries: `adjectives`, `animals`, `colors` and `numbers`.","items":{"type":"string","enum":["adjectives","animals","colors","numbers"],"enumDescriptions":["A random adjective","A random animal name","A random color name","A random number between 100 and 999"]},"minItems":1,"maxItems":5,"default":["adjectives","animals"],"scope":"resource"},"git.confirmSync":{"type":"boolean","description":"Confirm before synchronizing Git repositories.","default":true},"git.countBadge":{"type":"string","enum":["all","tracked","off"],"enumDescriptions":["Count all changes.","Count only tracked changes.","Turn off counter."],"description":"Controls the Git count badge.","default":"all","scope":"resource"},"git.checkoutType":{"type":"array","items":{"type":"string","enum":["local","tags","remote"],"enumDescriptions":["Local branches","Tags","Remote branches"]},"uniqueItems":true,"markdownDescription":"Controls what type of Git refs are listed when running `Checkout to...`.","default":["local","remote","tags"]},"git.ignoreLegacyWarning":{"type":"boolean","description":"Ignores the legacy Git warning.","default":false},"git.ignoreMissingGitWarning":{"type":"boolean","description":"Ignores the warning when Git is missing.","default":false},"git.ignoreWindowsGit27Warning":{"type":"boolean","description":"Ignores the warning when Git 2.25 - 2.26 is installed on Windows.","default":false},"git.ignoreLimitWarning":{"type":"boolean","description":"Ignores the warning when there are too many changes in a repository.","default":false},"git.ignoreRebaseWarning":{"type":"boolean","description":"Ignores the warning when it looks like the branch might have been rebased when pulling.","default":false},"git.defaultCloneDirectory":{"type":["string","null"],"default":null,"scope":"machine","description":"The default location to clone a Git repository."},"git.useEditorAsCommitInput":{"type":"boolean","description":"Controls whether a full text editor will be used to author commit messages, whenever no message is provided in the commit input box.","default":true},"git.verboseCommit":{"type":"boolean","scope":"resource","markdownDescription":"Enable verbose output when `#git.useEditorAsCommitInput#` is enabled.","default":false},"git.enableSmartCommit":{"type":"boolean","scope":"resource","description":"Commit all changes when there are no staged changes.","default":false},"git.smartCommitChanges":{"type":"string","enum":["all","tracked"],"enumDescriptions":["Automatically stage all changes.","Automatically stage tracked changes only."],"scope":"resource","description":"Control which changes are automatically staged by Smart Commit.","default":"all"},"git.suggestSmartCommit":{"type":"boolean","scope":"resource","description":"Suggests to enable smart commit (commit all changes when there are no staged changes).","default":true},"git.enableCommitSigning":{"type":"boolean","scope":"resource","description":"Enables commit signing with GPG, X.509, or SSH.","default":false},"git.confirmEmptyCommits":{"type":"boolean","scope":"resource","description":"Always confirm the creation of empty commits for the 'Git: Commit Empty' command.","default":true},"git.decorations.enabled":{"type":"boolean","default":true,"description":"Controls whether Git contributes colors and badges to the Explorer and the Open Editors view."},"git.enableStatusBarSync":{"type":"boolean","default":true,"description":"Controls whether the Git Sync command appears in the status bar.","scope":"resource"},"git.followTagsWhenSync":{"type":"boolean","scope":"resource","default":false,"description":"Push all annotated tags when running the sync command."},"git.replaceTagsWhenPull":{"type":"boolean","scope":"resource","default":false,"description":"Automatically replace the local tags with the remote tags in case of a conflict when running the pull command."},"git.promptToSaveFilesBeforeStash":{"type":"string","enum":["always","staged","never"],"enumDescriptions":["Check for any unsaved files.","Check only for unsaved staged files.","Disable this check."],"scope":"resource","default":"always","description":"Controls whether Git should check for unsaved files before stashing changes."},"git.promptToSaveFilesBeforeCommit":{"type":"string","enum":["always","staged","never"],"enumDescriptions":["Check for any unsaved files.","Check only for unsaved staged files.","Disable this check."],"scope":"resource","default":"always","description":"Controls whether Git should check for unsaved files before committing."},"git.postCommitCommand":{"type":"string","enum":["none","push","sync"],"enumDescriptions":["Don't run any command after a commit.","Run 'git push' after a successful commit.","Run 'git pull' and 'git push' after a successful commit."],"markdownDescription":"Run a git command after a successful commit.","scope":"resource","default":"none"},"git.rememberPostCommitCommand":{"type":"boolean","description":"Remember the last git command that ran after a commit.","scope":"resource","default":false},"git.openAfterClone":{"type":"string","enum":["always","alwaysNewWindow","whenNoFolderOpen","prompt"],"enumDescriptions":["Always open in current window.","Always open in a new window.","Only open in current window when no folder is opened.","Always prompt for action."],"default":"prompt","description":"Controls whether to open a repository automatically after cloning."},"git.showInlineOpenFileAction":{"type":"boolean","default":true,"description":"Controls whether to show an inline Open File action in the Git changes view."},"git.showPushSuccessNotification":{"type":"boolean","description":"Controls whether to show a notification when a push is successful.","default":false},"git.inputValidation":{"type":"boolean","default":false,"description":"Controls whether to show commit message input validation diagnostics."},"git.inputValidationLength":{"type":"number","default":72,"description":"Controls the commit message length threshold for showing a warning."},"git.inputValidationSubjectLength":{"type":["number","null"],"default":50,"markdownDescription":"Controls the commit message subject length threshold for showing a warning. Unset it to inherit the value of `#git.inputValidationLength#`."},"git.detectSubmodules":{"type":"boolean","scope":"resource","default":true,"description":"Controls whether to automatically detect Git submodules."},"git.detectSubmodulesLimit":{"type":"number","scope":"resource","default":10,"description":"Controls the limit of Git submodules detected."},"git.detectWorktrees":{"type":"boolean","scope":"resource","default":true,"description":"Controls whether to automatically detect Git worktrees."},"git.detectWorktreesLimit":{"type":"number","scope":"resource","default":50,"description":"Controls the limit of Git worktrees detected."},"git.alwaysShowStagedChangesResourceGroup":{"type":"boolean","scope":"resource","default":false,"description":"Always show the Staged Changes resource group."},"git.alwaysSignOff":{"type":"boolean","scope":"resource","default":false,"description":"Controls the signoff flag for all commits."},"git.ignoreSubmodules":{"type":"boolean","scope":"resource","default":false,"description":"Ignore modifications to submodules in the file tree."},"git.ignoredRepositories":{"type":"array","items":{"type":"string"},"default":[],"scope":"window","description":"List of Git repositories to ignore."},"git.scanRepositories":{"type":"array","items":{"type":"string"},"default":[],"scope":"resource","description":"List of paths to search for Git repositories in."},"git.showProgress":{"type":"boolean","description":"Controls whether Git actions should show progress.","default":true,"scope":"resource"},"git.rebaseWhenSync":{"type":"boolean","scope":"resource","default":false,"description":"Force Git to use rebase when running the sync command."},"git.pullBeforeCheckout":{"type":"boolean","scope":"resource","default":false,"description":"Controls whether a branch that does not have outgoing commits is fast-forwarded before it is checked out."},"git.fetchOnPull":{"type":"boolean","scope":"resource","default":false,"description":"When enabled, fetch all branches when pulling. Otherwise, fetch just the current one."},"git.pruneOnFetch":{"type":"boolean","scope":"resource","default":false,"description":"Prune when fetching."},"git.pullTags":{"type":"boolean","scope":"resource","default":true,"description":"Fetch all tags when pulling."},"git.autoStash":{"type":"boolean","scope":"resource","default":false,"description":"Stash any changes before pulling and restore them after successful pull."},"git.allowForcePush":{"type":"boolean","default":false,"description":"Controls whether force push (with or without lease) is enabled."},"git.useForcePushWithLease":{"type":"boolean","default":true,"description":"Controls whether force pushing uses the safer force-with-lease variant."},"git.useForcePushIfIncludes":{"type":"boolean","default":true,"markdownDescription":"Controls whether force pushing uses the safer force-if-includes variant. Note: This setting requires the `#git.useForcePushWithLease#` setting to be enabled, and Git version `2.30.0` or later."},"git.confirmForcePush":{"type":"boolean","default":true,"description":"Controls whether to ask for confirmation before force-pushing."},"git.allowNoVerifyCommit":{"type":"boolean","default":false,"description":"Controls whether commits without running pre-commit and commit-msg hooks are allowed."},"git.confirmNoVerifyCommit":{"type":"boolean","default":true,"description":"Controls whether to ask for confirmation before committing without verification."},"git.closeDiffOnOperation":{"type":"boolean","scope":"resource","default":false,"description":"Controls whether the diff editor should be automatically closed when changes are stashed, committed, discarded, staged, or unstaged."},"git.openDiffOnClick":{"type":"boolean","scope":"resource","default":true,"description":"Controls whether the diff editor should be opened when clicking a change. Otherwise the regular editor will be opened."},"git.supportCancellation":{"type":"boolean","scope":"resource","default":false,"description":"Controls whether a notification comes up when running the Sync action, which allows the user to cancel the operation."},"git.branchSortOrder":{"type":"string","enum":["committerdate","alphabetically"],"default":"committerdate","description":"Controls the sort order for branches."},"git.untrackedChanges":{"type":"string","enum":["mixed","separate","hidden"],"enumDescriptions":["All changes, tracked and untracked, appear together and behave equally.","Untracked changes appear separately in the Source Control view. They are also excluded from several actions.","Untracked changes are hidden and excluded from several actions."],"default":"mixed","description":"Controls how untracked changes behave.","scope":"resource"},"git.requireGitUserConfig":{"type":"boolean","description":"Controls whether to require explicit Git user configuration or allow Git to guess if missing.","default":true,"scope":"resource"},"git.showCommitInput":{"type":"boolean","scope":"resource","default":true,"description":"Controls whether to show the commit input in the Git source control panel."},"git.terminalAuthentication":{"type":"boolean","default":true,"description":"Controls whether to enable VS Code to be the authentication handler for Git processes spawned in the Integrated Terminal. Note: Terminals need to be restarted to pick up a change in this setting."},"git.terminalGitEditor":{"type":"boolean","default":false,"description":"Controls whether to enable VS Code to be the Git editor for Git processes spawned in the integrated terminal. Note: Terminals need to be restarted to pick up a change in this setting."},"git.useCommitInputAsStashMessage":{"type":"boolean","scope":"resource","default":false,"description":"Controls whether to use the message from the commit input box as the default stash message."},"git.useIntegratedAskPass":{"type":"boolean","default":true,"description":"Controls whether GIT_ASKPASS should be overwritten to use the integrated version."},"git.githubAuthentication":{"markdownDeprecationMessage":"This setting is now deprecated, please use `#github.gitAuthentication#` instead."},"git.timeline.date":{"type":"string","enum":["committed","authored"],"enumDescriptions":["Use the committed date","Use the authored date"],"default":"committed","description":"Controls which date to use for items in the Timeline view.","scope":"window"},"git.timeline.showAuthor":{"type":"boolean","default":true,"description":"Controls whether to show the commit author in the Timeline view.","scope":"window"},"git.timeline.showUncommitted":{"type":"boolean","default":false,"description":"Controls whether to show uncommitted changes in the Timeline view.","scope":"window"},"git.showActionButton":{"type":"object","additionalProperties":false,"description":"Controls whether an action button is shown in the Source Control view.","properties":{"commit":{"type":"boolean","description":"Show an action button to commit changes when the local branch has modified files ready to be committed."},"publish":{"type":"boolean","description":"Show an action button to publish the local branch when it does not have a tracking remote branch."},"sync":{"type":"boolean","description":"Show an action button to synchronize changes when the local branch is either ahead or behind the remote branch."}},"default":{"commit":true,"publish":true,"sync":true},"scope":"resource"},"git.statusLimit":{"type":"number","scope":"resource","default":10000,"description":"Controls how to limit the number of changes that can be parsed from Git status command. Can be set to 0 for no limit."},"git.repositoryScanIgnoredFolders":{"type":"array","items":{"type":"string"},"default":["node_modules"],"scope":"resource","markdownDescription":"List of folders that are ignored while scanning for Git repositories when `#git.autoRepositoryDetection#` is set to `true` or `subFolders`."},"git.repositoryScanMaxDepth":{"type":"number","scope":"resource","default":1,"markdownDescription":"Controls the depth used when scanning workspace folders for Git repositories when `#git.autoRepositoryDetection#` is set to `true` or `subFolders`. Can be set to `-1` for no limit."},"git.commandsToLog":{"type":"array","items":{"type":"string"},"default":[],"markdownDescription":"List of git commands (ex: commit, push) that would have their `stdout` logged to the [git output](command:git.showOutput). If the git command has a client-side hook configured, the client-side hook's `stdout` will also be logged to the [git output](command:git.showOutput)."},"git.mergeEditor":{"type":"boolean","default":false,"markdownDescription":"Open the merge editor for files that are currently under conflict.","scope":"window"},"git.optimisticUpdate":{"type":"boolean","default":true,"markdownDescription":"Controls whether to optimistically update the state of the Source Control view after running git commands.","scope":"resource","tags":["experimental"]},"git.openRepositoryInParentFolders":{"type":"string","enum":["always","never","prompt"],"enumDescriptions":["Always open a repository in parent folders of workspaces or open files.","Never open a repository in parent folders of workspaces or open files.","Prompt before opening a repository the parent folders of workspaces or open files."],"default":"prompt","markdownDescription":"Control whether a repository in parent folders of workspaces or open files should be opened.","scope":"resource"},"git.similarityThreshold":{"type":"number","default":50,"minimum":0,"maximum":100,"markdownDescription":"Controls the threshold of the similarity index (the amount of additions/deletions compared to the file's size) for changes in a pair of added/deleted files to be considered a rename. **Note:** Requires Git version `2.18.0` or later.","scope":"resource"},"git.blame.editorDecoration.enabled":{"type":"boolean","default":false,"markdownDescription":"Controls whether to show blame information in the editor using editor decorations."},"git.blame.editorDecoration.template":{"type":"string","default":"${subject}, ${authorName} (${authorDateAgo})","markdownDescription":"Template for the blame information editor decoration. Supported variables:\n\n* `hash`: Commit hash\n\n* `hashShort`: First N characters of the commit hash according to `#git.commitShortHashLength#`\n\n* `subject`: First line of the commit message\n\n* `authorName`: Author name\n\n* `authorEmail`: Author email\n\n* `authorDate`: Author date\n\n* `authorDateAgo`: Time difference between now and the author date\n\n"},"git.blame.editorDecoration.disableHover":{"type":"boolean","default":false,"markdownDescription":"Controls whether to disable the blame information editor decoration hover."},"git.blame.statusBarItem.enabled":{"type":"boolean","default":true,"markdownDescription":"Controls whether to show blame information in the status bar."},"git.blame.statusBarItem.template":{"type":"string","default":"${authorName} (${authorDateAgo})","markdownDescription":"Template for the blame information status bar item. Supported variables:\n\n* `hash`: Commit hash\n\n* `hashShort`: First N characters of the commit hash according to `#git.commitShortHashLength#`\n\n* `subject`: First line of the commit message\n\n* `authorName`: Author name\n\n* `authorEmail`: Author email\n\n* `authorDate`: Author date\n\n* `authorDateAgo`: Time difference between now and the author date\n\n"},"git.blame.ignoreWhitespace":{"type":"boolean","default":false,"markdownDescription":"Controls whether to ignore whitespace changes when computing blame information."},"git.commitShortHashLength":{"type":"number","default":7,"minimum":7,"maximum":40,"markdownDescription":"Controls the length of the commit short hash.","scope":"resource"},"git.diagnosticsCommitHook.enabled":{"type":"boolean","default":false,"markdownDescription":"Controls whether to check for unresolved diagnostics before committing.","scope":"resource"},"git.diagnosticsCommitHook.sources":{"type":"object","additionalProperties":{"type":"string","enum":["error","warning","information","hint","none"]},"default":{"*":"error"},"markdownDescription":"Controls the list of sources (**Item**) and the minimum severity (**Value**) to be considered before committing. **Note:** To ignore diagnostics from a particular source, add the source to the list and set the minimum severity to `none`.","scope":"resource"},"git.discardUntrackedChangesToTrash":{"type":"boolean","default":true,"markdownDescription":"Controls whether discarding untracked changes moves the file(s) to the Recycle Bin (Windows), Trash (macOS, Linux) instead of deleting them permanently. **Note:** This setting has no effect when connected to a remote or when running in Linux as a snap package."},"git.showReferenceDetails":{"type":"boolean","default":true,"markdownDescription":"Controls whether to show the details of the last commit for Git refs in the checkout, branch, and tag pickers."}}},"colors":[{"id":"gitDecoration.addedResourceForeground","description":"Color for added resources.","defaults":{"light":"#587c0c","dark":"#81b88b","highContrast":"#a1e3ad","highContrastLight":"#374e06"}},{"id":"gitDecoration.modifiedResourceForeground","description":"Color for modified resources.","defaults":{"light":"#895503","dark":"#E2C08D","highContrast":"#E2C08D","highContrastLight":"#895503"}},{"id":"gitDecoration.deletedResourceForeground","description":"Color for deleted resources.","defaults":{"light":"#ad0707","dark":"#c74e39","highContrast":"#c74e39","highContrastLight":"#ad0707"}},{"id":"gitDecoration.renamedResourceForeground","description":"Color for renamed or copied resources.","defaults":{"light":"#007100","dark":"#73C991","highContrast":"#73C991","highContrastLight":"#007100"}},{"id":"gitDecoration.untrackedResourceForeground","description":"Color for untracked resources.","defaults":{"light":"#007100","dark":"#73C991","highContrast":"#73C991","highContrastLight":"#007100"}},{"id":"gitDecoration.ignoredResourceForeground","description":"Color for ignored resources.","defaults":{"light":"#8E8E90","dark":"#8C8C8C","highContrast":"#A7A8A9","highContrastLight":"#8e8e90"}},{"id":"gitDecoration.stageModifiedResourceForeground","description":"Color for modified resources which have been staged.","defaults":{"light":"#895503","dark":"#E2C08D","highContrast":"#E2C08D","highContrastLight":"#895503"}},{"id":"gitDecoration.stageDeletedResourceForeground","description":"Color for deleted resources which have been staged.","defaults":{"light":"#ad0707","dark":"#c74e39","highContrast":"#c74e39","highContrastLight":"#ad0707"}},{"id":"gitDecoration.conflictingResourceForeground","description":"Color for resources with conflicts.","defaults":{"light":"#ad0707","dark":"#e4676b","highContrast":"#c74e39","highContrastLight":"#ad0707"}},{"id":"gitDecoration.submoduleResourceForeground","description":"Color for submodule resources.","defaults":{"light":"#1258a7","dark":"#8db9e2","highContrast":"#8db9e2","highContrastLight":"#1258a7"}},{"id":"git.blame.editorDecorationForeground","description":"Color for the blame editor decoration.","defaults":{"dark":"editorInlayHint.foreground","light":"editorInlayHint.foreground","highContrast":"editorInlayHint.foreground","highContrastLight":"editorInlayHint.foreground"}}],"configurationDefaults":{"[git-commit]":{"editor.rulers":[50,72],"editor.wordWrap":"off","workbench.editor.restoreViewState":false},"[git-rebase]":{"workbench.editor.restoreViewState":false}},"viewsWelcome":[{"view":"scm","contents":"If you would like to use Git features, please enable Git in your [settings](command:workbench.action.openSettings?%5B%22git.enabled%22%5D).\nTo learn more about how to use Git and source control in VS Code [read our docs](https://aka.ms/vscode-scm).","when":"!config.git.enabled"},{"view":"scm","contents":"Install Git, a popular source control system, to track code changes and collaborate with others. Learn more in our [Git guides](https://aka.ms/vscode-scm).","when":"config.git.enabled && git.missing && remoteName != ''"},{"view":"scm","contents":"[Download Git for macOS](https://git-scm.com/download/mac)\nAfter installing, please [reload](command:workbench.action.reloadWindow) (or [troubleshoot](command:git.showOutput)). Additional source control providers can be installed [from the Marketplace](command:workbench.extensions.search?%22%40category%3A%5C%22scm%20providers%5C%22%22).","when":"config.git.enabled && git.missing && remoteName == '' && isMac"},{"view":"scm","contents":"[Download Git for Windows](https://git-scm.com/download/win)\nAfter installing, please [reload](command:workbench.action.reloadWindow) (or [troubleshoot](command:git.showOutput)). Additional source control providers can be installed [from the Marketplace](command:workbench.extensions.search?%22%40category%3A%5C%22scm%20providers%5C%22%22).","when":"config.git.enabled && git.missing && remoteName == '' && isWindows"},{"view":"scm","contents":"Source control depends on Git being installed.\n[Download Git for Linux](https://git-scm.com/download/linux)\nAfter installing, please [reload](command:workbench.action.reloadWindow) (or [troubleshoot](command:git.showOutput)). Additional source control providers can be installed [from the Marketplace](command:workbench.extensions.search?%22%40category%3A%5C%22scm%20providers%5C%22%22).","when":"config.git.enabled && git.missing && remoteName == '' && isLinux"},{"view":"scm","contents":"In order to use Git features, you can open a folder containing a Git repository or clone from a URL.\n[Open Folder](command:vscode.openFolder)\n[Clone Repository](command:git.cloneRecursive)\nTo learn more about how to use Git and source control in VS Code [read our docs](https://aka.ms/vscode-scm).","when":"config.git.enabled && !git.missing && workbenchState == empty && git.parentRepositoryCount == 0 && git.unsafeRepositoryCount == 0 && git.closedRepositoryCount == 0","enablement":"git.state == initialized","group":"2_open@1"},{"view":"scm","contents":"The workspace currently open doesn't have any folders containing Git repositories.\n[Add Folder to Workspace](command:workbench.action.addRootFolder)\nTo learn more about how to use Git and source control in VS Code [read our docs](https://aka.ms/vscode-scm).","when":"config.git.enabled && !git.missing && workbenchState == workspace && workspaceFolderCount == 0 && git.parentRepositoryCount == 0 && git.unsafeRepositoryCount == 0 && git.closedRepositoryCount == 0","enablement":"git.state == initialized","group":"2_open@1"},{"view":"scm","contents":"Scanning folder for Git repositories...","when":"config.git.enabled && !git.missing && workbenchState == folder && workspaceFolderCount != 0 && git.state != initialized"},{"view":"scm","contents":"Scanning workspace for Git repositories...","when":"config.git.enabled && !git.missing && workbenchState == workspace && workspaceFolderCount != 0 && git.state != initialized"},{"view":"scm","contents":"The folder currently open doesn't have a Git repository. You can initialize a repository which will enable source control features powered by Git.\n[Initialize Repository](command:git.init?%5Btrue%5D)\nTo learn more about how to use Git and source control in VS Code [read our docs](https://aka.ms/vscode-scm).","when":"config.git.enabled && !git.missing && git.state == initialized && workbenchState == folder && scm.providerCount == 0 && git.parentRepositoryCount == 0 && git.unsafeRepositoryCount == 0 && git.closedRepositoryCount == 0 && remoteName != 'codespaces'","group":"5_scm@1"},{"view":"scm","contents":"The workspace currently open doesn't have any folders containing Git repositories. You can initialize a repository on a folder which will enable source control features powered by Git.\n[Initialize Repository](command:git.init)\nTo learn more about how to use Git and source control in VS Code [read our docs](https://aka.ms/vscode-scm).","when":"config.git.enabled && !git.missing && git.state == initialized && workbenchState == workspace && workspaceFolderCount != 0 && scm.providerCount == 0 && git.parentRepositoryCount == 0 && git.unsafeRepositoryCount == 0 && git.closedRepositoryCount == 0 && remoteName != 'codespaces'","group":"5_scm@1"},{"view":"scm","contents":"A Git repository was found in the parent folders of the workspace or the open file(s).\n[Open Repository](command:git.openRepositoriesInParentFolders)\nUse the [git.openRepositoryInParentFolders](command:workbench.action.openSettings?%5B%22git.openRepositoryInParentFolders%22%5D) setting to control whether Git repositories in parent folders of workspaces or open files are opened. To learn more [read our docs](https://aka.ms/vscode-git-repository-in-parent-folders).","when":"config.git.enabled && !git.missing && git.state == initialized && git.parentRepositoryCount == 1"},{"view":"scm","contents":"Git repositories were found in the parent folders of the workspace or the open file(s).\n[Open Repository](command:git.openRepositoriesInParentFolders)\nUse the [git.openRepositoryInParentFolders](command:workbench.action.openSettings?%5B%22git.openRepositoryInParentFolders%22%5D) setting to control whether Git repositories in parent folders of workspace or open files are opened. To learn more [read our docs](https://aka.ms/vscode-git-repository-in-parent-folders).","when":"config.git.enabled && !git.missing && git.state == initialized && git.parentRepositoryCount > 1"},{"view":"scm","contents":"The detected Git repository is potentially unsafe as the folder is owned by someone other than the current user.\n[Manage Unsafe Repositories](command:git.manageUnsafeRepositories)\nTo learn more about unsafe repositories [read our docs](https://aka.ms/vscode-git-unsafe-repository).","when":"config.git.enabled && !git.missing && git.state == initialized && git.unsafeRepositoryCount == 1"},{"view":"scm","contents":"The detected Git repositories are potentially unsafe as the folders are owned by someone other than the current user.\n[Manage Unsafe Repositories](command:git.manageUnsafeRepositories)\nTo learn more about unsafe repositories [read our docs](https://aka.ms/vscode-git-unsafe-repository).","when":"config.git.enabled && !git.missing && git.state == initialized && git.unsafeRepositoryCount > 1"},{"view":"scm","contents":"A Git repository was found that was previously closed.\n[Reopen Closed Repository](command:git.reopenClosedRepositories)\nTo learn more about how to use Git and source control in VS Code [read our docs](https://aka.ms/vscode-scm).","when":"config.git.enabled && !git.missing && git.state == initialized && git.closedRepositoryCount == 1"},{"view":"scm","contents":"Git repositories were found that were previously closed.\n[Reopen Closed Repositories](command:git.reopenClosedRepositories)\nTo learn more about how to use Git and source control in VS Code [read our docs](https://aka.ms/vscode-scm).","when":"config.git.enabled && !git.missing && git.state == initialized && git.closedRepositoryCount > 1"},{"view":"explorer","contents":"You can clone a repository locally.\n[Clone Repository](command:git.clone 'Clone a repository once the Git extension has activated')","when":"config.git.enabled && git.state == initialized && scm.providerCount == 0","group":"5_scm@1"},{"view":"explorer","contents":"To learn more about how to use Git and source control in VS Code [read our docs](https://aka.ms/vscode-scm).","when":"config.git.enabled && git.state == initialized && scm.providerCount == 0","group":"5_scm@10"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/git","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.git-base"},"manifest":{"name":"git-base","displayName":"Git Base","description":"Git static contributions and pickers.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"0.10.x"},"categories":["Other"],"activationEvents":["*"],"main":"./dist/extension.js","browser":"./dist/browser/extension.js","icon":"resources/icons/git.png","capabilities":{"virtualWorkspaces":true,"untrustedWorkspaces":{"supported":true}},"contributes":{"commands":[{"command":"git-base.api.getRemoteSources","title":"Get Remote Sources","category":"Git Base API"}],"menus":{"commandPalette":[{"command":"git-base.api.getRemoteSources","when":"false"}]},"languages":[{"id":"git-commit","aliases":["Git Commit Message","git-commit"],"filenames":["COMMIT_EDITMSG","MERGE_MSG"],"configuration":"./languages/git-commit.language-configuration.json"},{"id":"git-rebase","aliases":["Git Rebase Message","git-rebase"],"filenames":["git-rebase-todo"],"filenamePatterns":["**/rebase-merge/done"],"configuration":"./languages/git-rebase.language-configuration.json"},{"id":"ignore","aliases":["Ignore","ignore"],"extensions":[".gitignore_global",".gitignore",".git-blame-ignore-revs"],"configuration":"./languages/ignore.language-configuration.json"}],"grammars":[{"language":"git-commit","scopeName":"text.git-commit","path":"./syntaxes/git-commit.tmLanguage.json"},{"language":"git-rebase","scopeName":"text.git-rebase","path":"./syntaxes/git-rebase.tmLanguage.json"},{"language":"ignore","scopeName":"source.ignore","path":"./syntaxes/ignore.tmLanguage.json"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/git-base","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.github"},"manifest":{"name":"github","displayName":"GitHub","description":"GitHub features for VS Code","publisher":"vscode","license":"MIT","version":"0.0.1","engines":{"vscode":"^1.41.0"},"aiKey":"0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255","icon":"images/icon.png","categories":["Other"],"activationEvents":["*"],"extensionDependencies":["vscode.git-base"],"main":"./dist/extension.js","type":"module","capabilities":{"virtualWorkspaces":false,"untrustedWorkspaces":{"supported":true}},"enabledApiProposals":["canonicalUriProvider","contribEditSessions","contribShareMenu","contribSourceControlHistoryItemMenu","scmHistoryProvider","shareProvider","timeline"],"contributes":{"commands":[{"command":"github.publish","title":"Publish to GitHub"},{"command":"github.copyVscodeDevLink","title":"Copy vscode.dev Link"},{"command":"github.copyVscodeDevLinkFile","title":"Copy vscode.dev Link"},{"command":"github.copyVscodeDevLinkWithoutRange","title":"Copy vscode.dev Link"},{"command":"github.openOnVscodeDev","title":"Open in vscode.dev","icon":"$(globe)"},{"command":"github.graph.openOnGitHub","title":"Open on GitHub","icon":"$(github)"},{"command":"github.timeline.openOnGitHub","title":"Open on GitHub","icon":"$(github)"}],"continueEditSession":[{"command":"github.openOnVscodeDev","when":"github.hasGitHubRepo","qualifiedName":"Continue Working in vscode.dev","category":"Remote Repositories","remoteGroup":"virtualfs_44_vscode-vfs_2_web@2"}],"menus":{"commandPalette":[{"command":"github.publish","when":"git-base.gitEnabled && workspaceFolderCount != 0 && remoteName != 'codespaces'"},{"command":"github.graph.openOnGitHub","when":"false"},{"command":"github.copyVscodeDevLink","when":"false"},{"command":"github.copyVscodeDevLinkFile","when":"false"},{"command":"github.copyVscodeDevLinkWithoutRange","when":"false"},{"command":"github.openOnVscodeDev","when":"false"},{"command":"github.timeline.openOnGitHub","when":"false"}],"file/share":[{"command":"github.copyVscodeDevLinkFile","when":"github.hasGitHubRepo && remoteName != 'codespaces'","group":"0_vscode@0"}],"editor/context/share":[{"command":"github.copyVscodeDevLink","when":"github.hasGitHubRepo && resourceScheme != untitled && !isInEmbeddedEditor && remoteName != 'codespaces'","group":"0_vscode@0"}],"explorer/context/share":[{"command":"github.copyVscodeDevLinkWithoutRange","when":"github.hasGitHubRepo && resourceScheme != untitled && !isInEmbeddedEditor && remoteName != 'codespaces'","group":"0_vscode@0"}],"editor/lineNumber/context":[{"command":"github.copyVscodeDevLink","when":"github.hasGitHubRepo && resourceScheme != untitled && activeEditor == workbench.editors.files.textFileEditor && config.editor.lineNumbers == on && remoteName != 'codespaces'","group":"1_cutcopypaste@2"},{"command":"github.copyVscodeDevLink","when":"github.hasGitHubRepo && resourceScheme != untitled && activeEditor == workbench.editor.notebook && remoteName != 'codespaces'","group":"1_cutcopypaste@2"}],"editor/title/context/share":[{"command":"github.copyVscodeDevLinkWithoutRange","when":"github.hasGitHubRepo && resourceScheme != untitled && remoteName != 'codespaces'","group":"0_vscode@0"}],"scm/historyItem/context":[{"command":"github.graph.openOnGitHub","when":"github.hasGitHubRepo","group":"0_view@2"}],"timeline/item/context":[{"command":"github.timeline.openOnGitHub","group":"1_actions@3","when":"github.hasGitHubRepo && timelineItem =~ /git:file:commit\\b/"}]},"configuration":[{"title":"GitHub","properties":{"github.branchProtection":{"type":"boolean","scope":"resource","default":true,"description":"Controls whether to query repository rules for GitHub repositories"},"github.gitAuthentication":{"type":"boolean","scope":"resource","default":true,"description":"Controls whether to enable automatic GitHub authentication for git commands within VS Code."},"github.gitProtocol":{"type":"string","enum":["https","ssh"],"default":"https","description":"Controls which protocol is used to clone a GitHub repository"},"github.showAvatar":{"type":"boolean","scope":"resource","default":true,"description":"Controls whether to show the GitHub avatar of the commit author in various hovers (ex: Git blame, Timeline, Source Control Graph, etc.)"}}}],"viewsWelcome":[{"view":"scm","contents":"You can directly publish this folder to a GitHub repository. Once published, you'll have access to source control features powered by Git and GitHub.\n[$(github) Publish to GitHub](command:github.publish)","when":"config.git.enabled && git.state == initialized && workbenchState == folder && git.parentRepositoryCount == 0 && git.unsafeRepositoryCount == 0 && git.closedRepositoryCount == 0"},{"view":"scm","contents":"You can directly publish a workspace folder to a GitHub repository. Once published, you'll have access to source control features powered by Git and GitHub.\n[$(github) Publish to GitHub](command:github.publish)","when":"config.git.enabled && git.state == initialized && workbenchState == workspace && workspaceFolderCount != 0 && git.parentRepositoryCount == 0 && git.unsafeRepositoryCount == 0 && git.closedRepositoryCount == 0"}],"markdown.previewStyles":["./markdown.css"]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/github","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.github-authentication"},"manifest":{"name":"github-authentication","displayName":"GitHub Authentication","description":"GitHub Authentication Provider","publisher":"vscode","license":"MIT","version":"0.0.2","engines":{"vscode":"^1.41.0"},"icon":"images/icon.png","categories":["Other"],"api":"none","extensionKind":["ui","workspace"],"enabledApiProposals":["authIssuers","authProviderSpecific"],"activationEvents":[],"capabilities":{"virtualWorkspaces":true,"untrustedWorkspaces":{"supported":"limited","restrictedConfigurations":["github-enterprise.uri"]}},"contributes":{"authentication":[{"label":"GitHub","id":"github","authorizationServerGlobs":["https://github.com/login/oauth"]},{"label":"GitHub Enterprise Server","id":"github-enterprise","authorizationServerGlobs":["*"]}],"configuration":[{"title":"GHE.com & GitHub Enterprise Server Authentication","properties":{"github-enterprise.uri":{"type":"string","markdownDescription":"The URI for your GHE.com or GitHub Enterprise Server instance.\n\nExamples:\n* GHE.com: `https://octocat.ghe.com`\n* GitHub Enterprise Server: `https://github.octocat.com`\n\n> **Note:** This should _not_ be set to a GitHub.com URI. If your account exists on GitHub.com or is a GitHub Enterprise Managed User, you do not need any additional configuration and can simply log in to GitHub.","pattern":"^(?:$|(https?)://(?!github\\.com).*)"},"github-authentication.useElectronFetch":{"type":"boolean","default":true,"scope":"application","markdownDescription":"When true, uses Electron's built-in fetch function for HTTP requests. When false, uses the Node.js global fetch function. This setting only applies when running in the Electron environment. **Note:** A restart is required for this setting to take effect."},"github-authentication.preferDeviceCodeFlow":{"type":"boolean","default":false,"scope":"application","markdownDescription":"When true, prioritize the device code flow for authentication instead of other available flows. This is useful for environments like WSL where the local server or URL handler flows may not work as expected."}}}]},"aiKey":"0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255","main":"./dist/extension.js","browser":"./dist/browser/extension.js","repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/github-authentication","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.go"},"manifest":{"name":"go","displayName":"Go Language Basics","description":"Provides syntax highlighting and bracket matching in Go files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin worlpaker/go-syntax syntaxes/go.tmLanguage.json ./syntaxes/go.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"go","extensions":[".go"],"aliases":["Go"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"go","scopeName":"source.go","path":"./syntaxes/go.tmLanguage.json"}],"configurationDefaults":{"[go]":{"editor.insertSpaces":false}}},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/go","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.groovy"},"manifest":{"name":"groovy","displayName":"Groovy Language Basics","description":"Provides snippets, syntax highlighting and bracket matching in Groovy files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin textmate/groovy.tmbundle Syntaxes/Groovy.tmLanguage ./syntaxes/groovy.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"groovy","aliases":["Groovy","groovy"],"extensions":[".groovy",".gvy",".gradle",".jenkinsfile",".nf"],"filenames":["Jenkinsfile"],"filenamePatterns":["Jenkinsfile*"],"firstLine":"^#!.*\\bgroovy\\b","configuration":"./language-configuration.json"}],"grammars":[{"language":"groovy","scopeName":"source.groovy","path":"./syntaxes/groovy.tmLanguage.json"}],"snippets":[{"language":"groovy","path":"./snippets/groovy.code-snippets"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/groovy","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.grunt"},"manifest":{"name":"grunt","publisher":"vscode","description":"Extension to add Grunt capabilities to VS Code.","displayName":"Grunt support for VS Code","version":"1.0.0","private":true,"icon":"images/grunt.png","license":"MIT","engines":{"vscode":"*"},"categories":["Other"],"main":"./dist/main","activationEvents":["onTaskType:grunt"],"capabilities":{"virtualWorkspaces":false,"untrustedWorkspaces":{"supported":true}},"contributes":{"configuration":{"id":"grunt","type":"object","title":"Grunt","properties":{"grunt.autoDetect":{"scope":"application","type":"string","enum":["off","on"],"default":"off","description":"Controls enablement of Grunt task detection. Grunt task detection can cause files in any open workspace to be executed."}}},"taskDefinitions":[{"type":"grunt","required":["task"],"properties":{"task":{"type":"string","description":"The Grunt task to customize."},"args":{"type":"array","description":"Command line arguments to pass to the grunt task"},"file":{"type":"string","description":"The Grunt file that provides the task. Can be omitted."}},"when":"shellExecutionSupported"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/grunt","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.gulp"},"manifest":{"name":"gulp","publisher":"vscode","description":"Extension to add Gulp capabilities to VSCode.","displayName":"Gulp support for VSCode","version":"1.0.0","icon":"images/gulp.png","license":"MIT","engines":{"vscode":"*"},"categories":["Other"],"main":"./dist/main","activationEvents":["onTaskType:gulp"],"capabilities":{"virtualWorkspaces":false,"untrustedWorkspaces":{"supported":true}},"contributes":{"configuration":{"id":"gulp","type":"object","title":"Gulp","properties":{"gulp.autoDetect":{"scope":"application","type":"string","enum":["off","on"],"default":"off","description":"Controls enablement of Gulp task detection. Gulp task detection can cause files in any open workspace to be executed."}}},"taskDefinitions":[{"type":"gulp","required":["task"],"properties":{"task":{"type":"string","description":"The Gulp task to customize."},"file":{"type":"string","description":"The Gulp file that provides the task. Can be omitted."}},"when":"shellExecutionSupported"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/gulp","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.handlebars"},"manifest":{"name":"handlebars","displayName":"Handlebars Language Basics","description":"Provides syntax highlighting and bracket matching in Handlebars files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"0.10.x"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin daaain/Handlebars grammars/Handlebars.json ./syntaxes/Handlebars.tmLanguage.json"},"categories":["Programming Languages"],"extensionKind":["ui","workspace"],"contributes":{"languages":[{"id":"handlebars","extensions":[".handlebars",".hbs",".hjs"],"aliases":["Handlebars","handlebars"],"mimetypes":["text/x-handlebars-template"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"handlebars","scopeName":"text.html.handlebars","path":"./syntaxes/Handlebars.tmLanguage.json"}],"htmlLanguageParticipants":[{"languageId":"handlebars","autoInsert":true}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/handlebars","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[[2,"property `extensionKind` can be defined only if property `main` is also defined."]],"preRelease":false},{"type":0,"identifier":{"id":"vscode.hlsl"},"manifest":{"name":"hlsl","displayName":"HLSL Language Basics","description":"Provides syntax highlighting and bracket matching in HLSL files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin tgjones/shaders-tmLanguage grammars/hlsl.json ./syntaxes/hlsl.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"hlsl","extensions":[".hlsl",".hlsli",".fx",".fxh",".vsh",".psh",".cginc",".compute"],"aliases":["HLSL","hlsl"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"hlsl","path":"./syntaxes/hlsl.tmLanguage.json","scopeName":"source.hlsl"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/hlsl","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.html"},"manifest":{"name":"html","displayName":"HTML Language Basics","description":"Provides syntax highlighting, bracket matching & snippets in HTML files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"0.10.x"},"scripts":{"update-grammar":"node ./build/update-grammar.mjs"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"html","extensions":[".html",".htm",".shtml",".xhtml",".xht",".mdoc",".jsp",".asp",".aspx",".jshtm",".volt",".ejs",".rhtml"],"aliases":["HTML","htm","html","xhtml"],"mimetypes":["text/html","text/x-jshtm","text/template","text/ng-template","application/xhtml+xml"],"configuration":"./language-configuration.json"}],"grammars":[{"scopeName":"text.html.basic","path":"./syntaxes/html.tmLanguage.json","embeddedLanguages":{"text.html":"html","source.css":"css","source.js":"javascript","source.python":"python","source.smarty":"smarty"},"tokenTypes":{"meta.tag string.quoted":"other"}},{"language":"html","scopeName":"text.html.derivative","path":"./syntaxes/html-derivative.tmLanguage.json","embeddedLanguages":{"text.html":"html","source.css":"css","source.js":"javascript","source.python":"python","source.smarty":"smarty"},"tokenTypes":{"meta.tag string.quoted":"other"}}],"snippets":[{"language":"html","path":"./snippets/html.code-snippets"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/html","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.html-language-features"},"manifest":{"name":"html-language-features","displayName":"HTML Language Features","description":"Provides rich language support for HTML and Handlebar files","version":"1.0.0","publisher":"vscode","license":"MIT","aiKey":"0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255","engines":{"vscode":"^1.77.0"},"icon":"icons/html.png","activationEvents":["onLanguage:html","onLanguage:handlebars"],"enabledApiProposals":["extensionsAny"],"main":"./client/dist/node/htmlClientMain","browser":"./client/dist/browser/htmlClientMain","capabilities":{"virtualWorkspaces":true,"untrustedWorkspaces":{"supported":true}},"categories":["Programming Languages"],"contributes":{"configuration":{"id":"html","order":20,"type":"object","title":"HTML","properties":{"html.completion.attributeDefaultValue":{"type":"string","scope":"resource","enum":["doublequotes","singlequotes","empty"],"enumDescriptions":["Attribute value is set to \"\".","Attribute value is set to ''.","Attribute value is not set."],"default":"doublequotes","markdownDescription":"Controls the default value for attributes when completion is accepted."},"html.customData":{"type":"array","markdownDescription":"A list of relative file paths pointing to JSON files following the [custom data format](https://github.com/microsoft/vscode-html-languageservice/blob/master/docs/customData.md).\n\nVS Code loads custom data on startup to enhance its HTML support for the custom HTML tags, attributes and attribute values you specify in the JSON files.\n\nThe file paths are relative to workspace and only workspace folder settings are considered.","default":[],"items":{"type":"string"},"scope":"resource"},"html.format.enable":{"type":"boolean","scope":"window","default":true,"description":"Enable/disable default HTML formatter."},"html.format.wrapLineLength":{"type":"integer","scope":"resource","default":120,"description":"Maximum amount of characters per line (0 = disable)."},"html.format.unformatted":{"type":["string","null"],"scope":"resource","default":"wbr","markdownDescription":"List of tags, comma separated, that shouldn't be reformatted. `null` defaults to all tags listed at https://www.w3.org/TR/html5/dom.html#phrasing-content."},"html.format.contentUnformatted":{"type":["string","null"],"scope":"resource","default":"pre,code,textarea","markdownDescription":"List of tags, comma separated, where the content shouldn't be reformatted. `null` defaults to the `pre` tag."},"html.format.indentInnerHtml":{"type":"boolean","scope":"resource","default":false,"markdownDescription":"Indent `` and `` sections."},"html.format.preserveNewLines":{"type":"boolean","scope":"resource","default":true,"description":"Controls whether existing line breaks before elements should be preserved. Only works before elements, not inside tags or for text."},"html.format.maxPreserveNewLines":{"type":["number","null"],"scope":"resource","default":null,"markdownDescription":"Maximum number of line breaks to be preserved in one chunk. Use `null` for unlimited."},"html.format.indentHandlebars":{"type":"boolean","scope":"resource","default":false,"markdownDescription":"Format and indent `{{#foo}}` and `{{/foo}}`."},"html.format.extraLiners":{"type":["string","null"],"scope":"resource","default":"head, body, /html","markdownDescription":"List of tags, comma separated, that should have an extra newline before them. `null` defaults to `\"head, body, /html\"`."},"html.format.wrapAttributes":{"type":"string","scope":"resource","default":"auto","enum":["auto","force","force-aligned","force-expand-multiline","aligned-multiple","preserve","preserve-aligned"],"enumDescriptions":["Wrap attributes only when line length is exceeded.","Wrap each attribute except first.","Wrap each attribute except first and keep aligned.","Wrap each attribute.","Wrap when line length is exceeded, align attributes vertically.","Preserve wrapping of attributes.","Preserve wrapping of attributes but align."],"description":"Wrap attributes."},"html.format.wrapAttributesIndentSize":{"type":["number","null"],"scope":"resource","default":null,"markdownDescription":"Indent wrapped attributes to after N characters. Use `null` to use the default indent size. Ignored if `#html.format.wrapAttributes#` is set to `aligned`."},"html.format.templating":{"type":"boolean","scope":"resource","default":false,"description":"Honor django, erb, handlebars and php templating language tags."},"html.format.unformattedContentDelimiter":{"type":"string","scope":"resource","default":"","markdownDescription":"Keep text content together between this string."},"html.suggest.html5":{"type":"boolean","scope":"resource","default":true,"description":"Controls whether the built-in HTML language support suggests HTML5 tags, properties and values."},"html.suggest.hideEndTagSuggestions":{"type":"boolean","scope":"resource","default":false,"description":"Controls whether the built-in HTML language support suggests closing tags. When disabled, end tag completions like `` will not be shown."},"html.validate.scripts":{"type":"boolean","scope":"resource","default":true,"description":"Controls whether the built-in HTML language support validates embedded scripts."},"html.validate.styles":{"type":"boolean","scope":"resource","default":true,"description":"Controls whether the built-in HTML language support validates embedded styles."},"html.autoCreateQuotes":{"type":"boolean","scope":"resource","default":true,"markdownDescription":"Enable/disable auto creation of quotes for HTML attribute assignment. The type of quotes can be configured by `#html.completion.attributeDefaultValue#`."},"html.autoClosingTags":{"type":"boolean","scope":"resource","default":true,"description":"Enable/disable autoclosing of HTML tags."},"html.hover.documentation":{"type":"boolean","scope":"resource","default":true,"description":"Show tag and attribute documentation in hover."},"html.hover.references":{"type":"boolean","scope":"resource","default":true,"description":"Show references to MDN in hover."},"html.mirrorCursorOnMatchingTag":{"type":"boolean","scope":"resource","default":false,"description":"Enable/disable mirroring cursor on matching HTML tag.","deprecationMessage":"Deprecated in favor of `editor.linkedEditing`"},"html.trace.server":{"type":"string","scope":"window","enum":["off","messages","verbose"],"default":"off","description":"Traces the communication between VS Code and the HTML language server."}}},"configurationDefaults":{"[html]":{"editor.suggest.insertMode":"replace"},"[handlebars]":{"editor.suggest.insertMode":"replace"}},"jsonValidation":[{"fileMatch":"*.html-data.json","url":"https://raw.githubusercontent.com/microsoft/vscode-html-languageservice/master/docs/customData.schema.json"},{"fileMatch":"package.json","url":"./schemas/package.schema.json"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/html-language-features","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.ini"},"manifest":{"name":"ini","displayName":"Ini Language Basics","description":"Provides syntax highlighting and bracket matching in Ini files.","version":"1.0.0","private":true,"publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin textmate/ini.tmbundle Syntaxes/Ini.plist ./syntaxes/ini.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"ini","extensions":[".ini"],"aliases":["Ini","ini"],"configuration":"./ini.language-configuration.json"},{"id":"properties","extensions":[".conf",".properties",".cfg",".directory",".gitattributes",".gitconfig",".gitmodules",".editorconfig",".repo"],"filenames":["gitconfig"],"filenamePatterns":["**/.config/git/config","**/.git/config"],"aliases":["Properties","properties"],"configuration":"./properties.language-configuration.json"}],"grammars":[{"language":"ini","scopeName":"source.ini","path":"./syntaxes/ini.tmLanguage.json"},{"language":"properties","scopeName":"source.ini","path":"./syntaxes/ini.tmLanguage.json"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/ini","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.ipynb"},"manifest":{"name":"ipynb","displayName":".ipynb Support","description":"Provides basic support for opening and reading Jupyter's .ipynb notebook files","publisher":"vscode","version":"1.0.0","license":"MIT","icon":"media/icon.png","engines":{"vscode":"^1.57.0"},"enabledApiProposals":["diffContentOptions"],"activationEvents":["onNotebook:jupyter-notebook","onNotebookSerializer:interactive","onNotebookSerializer:repl"],"extensionKind":["workspace","ui"],"main":"./dist/ipynbMain.node.js","browser":"./dist/browser/ipynbMain.browser.js","capabilities":{"virtualWorkspaces":true,"untrustedWorkspaces":{"supported":true}},"contributes":{"configuration":[{"properties":{"ipynb.pasteImagesAsAttachments.enabled":{"type":"boolean","scope":"resource","markdownDescription":"Enable/disable pasting of images into Markdown cells in ipynb notebook files. Pasted images are inserted as attachments to the cell.","default":true},"ipynb.experimental.serialization":{"type":"boolean","scope":"resource","markdownDescription":"Experimental feature to serialize the Jupyter notebook in a worker thread.","default":true,"tags":["experimental"]}}}],"commands":[{"command":"ipynb.newUntitledIpynb","title":"New Jupyter Notebook","shortTitle":"Jupyter Notebook","category":"Create"},{"command":"ipynb.openIpynbInNotebookEditor","title":"Open IPYNB File In Notebook Editor"},{"command":"ipynb.cleanInvalidImageAttachment","title":"Clean Invalid Image Attachment Reference"},{"command":"notebook.cellOutput.copy","title":"Copy Cell Output","category":"Notebook"},{"command":"notebook.cellOutput.addToChat","title":"Add Cell Output to Chat","category":"Notebook","enablement":"chatIsEnabled"},{"command":"notebook.cellOutput.openInTextEditor","title":"Open Cell Output in Text Editor","category":"Notebook"}],"notebooks":[{"type":"jupyter-notebook","displayName":"Jupyter Notebook","selector":[{"filenamePattern":"*.ipynb"}],"priority":"default"}],"notebookRenderer":[{"id":"vscode.markdown-it-cell-attachment-renderer","displayName":"Markdown-It ipynb Cell Attachment renderer","entrypoint":{"extends":"vscode.markdown-it-renderer","path":"./notebook-out/cellAttachmentRenderer.js"}}],"menus":{"file/newFile":[{"command":"ipynb.newUntitledIpynb","group":"notebook"}],"commandPalette":[{"command":"ipynb.newUntitledIpynb"},{"command":"ipynb.openIpynbInNotebookEditor","when":"false"},{"command":"ipynb.cleanInvalidImageAttachment","when":"false"},{"command":"notebook.cellOutput.copy","when":"notebookCellHasOutputs"},{"command":"notebook.cellOutput.openInTextEditor","when":"false"}],"webview/context":[{"command":"notebook.cellOutput.copy","when":"webviewId == 'notebook.output' && webviewSection == 'image'","group":"context@1"},{"command":"notebook.cellOutput.copy","when":"webviewId == 'notebook.output' && webviewSection == 'text'"},{"command":"notebook.cellOutput.addToChat","when":"webviewId == 'notebook.output' && (webviewSection == 'text' || webviewSection == 'image')","group":"context@2"},{"command":"notebook.cellOutput.openInTextEditor","when":"webviewId == 'notebook.output' && webviewSection == 'text'"}]}},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/ipynb","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.jake"},"manifest":{"name":"jake","publisher":"vscode","description":"Extension to add Jake capabilities to VS Code.","displayName":"Jake support for VS Code","icon":"images/cowboy_hat.png","version":"1.0.0","license":"MIT","engines":{"vscode":"*"},"categories":["Other"],"main":"./dist/main","activationEvents":["onTaskType:jake"],"capabilities":{"virtualWorkspaces":false,"untrustedWorkspaces":{"supported":true}},"contributes":{"configuration":{"id":"jake","type":"object","title":"Jake","properties":{"jake.autoDetect":{"scope":"application","type":"string","enum":["off","on"],"default":"off","description":"Controls enablement of Jake task detection. Jake task detection can cause files in any open workspace to be executed."}}},"taskDefinitions":[{"type":"jake","required":["task"],"properties":{"task":{"type":"string","description":"The Jake task to customize."},"file":{"type":"string","description":"The Jake file that provides the task. Can be omitted."}},"when":"shellExecutionSupported"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/jake","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.java"},"manifest":{"name":"java","displayName":"Java Language Basics","description":"Provides snippets, syntax highlighting, bracket matching and folding in Java files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin redhat-developer/vscode-java language-support/java/java.tmLanguage.json ./syntaxes/java.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"java","extensions":[".java",".jav"],"aliases":["Java","java"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"java","scopeName":"source.java","path":"./syntaxes/java.tmLanguage.json"}],"snippets":[{"language":"java","path":"./snippets/java.code-snippets"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/java","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.javascript"},"manifest":{"name":"javascript","displayName":"JavaScript Language Basics","description":"Provides snippets, syntax highlighting, bracket matching and folding in JavaScript files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"0.10.x"},"categories":["Programming Languages"],"contributes":{"configurationDefaults":{"[javascript]":{"editor.maxTokenizationLineLength":2500}},"languages":[{"id":"javascriptreact","aliases":["JavaScript JSX","JavaScript React","jsx"],"extensions":[".jsx"],"configuration":"./javascript-language-configuration.json"},{"id":"javascript","aliases":["JavaScript","javascript","js"],"extensions":[".js",".es6",".mjs",".cjs",".pac"],"filenames":["jakefile"],"firstLine":"^#!.*\\bnode","mimetypes":["text/javascript"],"configuration":"./javascript-language-configuration.json"},{"id":"jsx-tags","aliases":[],"configuration":"./tags-language-configuration.json"}],"grammars":[{"language":"javascriptreact","scopeName":"source.js.jsx","path":"./syntaxes/JavaScriptReact.tmLanguage.json","embeddedLanguages":{"meta.tag.js":"jsx-tags","meta.tag.without-attributes.js":"jsx-tags","meta.tag.attributes.js.jsx":"javascriptreact","meta.embedded.expression.js":"javascriptreact"},"tokenTypes":{"punctuation.definition.template-expression":"other","entity.name.type.instance.jsdoc":"other","entity.name.function.tagged-template":"other","meta.import string.quoted":"other","variable.other.jsdoc":"other"}},{"language":"javascript","scopeName":"source.js","path":"./syntaxes/JavaScript.tmLanguage.json","embeddedLanguages":{"meta.tag.js":"jsx-tags","meta.tag.without-attributes.js":"jsx-tags","meta.tag.attributes.js":"javascript","meta.embedded.expression.js":"javascript"},"tokenTypes":{"punctuation.definition.template-expression":"other","entity.name.type.instance.jsdoc":"other","entity.name.function.tagged-template":"other","meta.import string.quoted":"other","variable.other.jsdoc":"other"}},{"scopeName":"source.js.regexp","path":"./syntaxes/Regular Expressions (JavaScript).tmLanguage"}],"semanticTokenScopes":[{"language":"javascript","scopes":{"property":["variable.other.property.js"],"property.readonly":["variable.other.constant.property.js"],"variable":["variable.other.readwrite.js"],"variable.readonly":["variable.other.constant.object.js"],"function":["entity.name.function.js"],"namespace":["entity.name.type.module.js"],"variable.defaultLibrary":["support.variable.js"],"function.defaultLibrary":["support.function.js"]}},{"language":"javascriptreact","scopes":{"property":["variable.other.property.jsx"],"property.readonly":["variable.other.constant.property.jsx"],"variable":["variable.other.readwrite.jsx"],"variable.readonly":["variable.other.constant.object.jsx"],"function":["entity.name.function.jsx"],"namespace":["entity.name.type.module.jsx"],"variable.defaultLibrary":["support.variable.js"],"function.defaultLibrary":["support.function.js"]}}],"snippets":[{"language":"javascript","path":"./snippets/javascript.code-snippets"},{"language":"javascriptreact","path":"./snippets/javascript.code-snippets"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/javascript","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.json"},"manifest":{"name":"json","displayName":"JSON Language Basics","description":"Provides syntax highlighting & bracket matching in JSON files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"0.10.x"},"scripts":{"update-grammar":"node ./build/update-grammars.js"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"json","aliases":["JSON","json"],"extensions":[".json",".bowerrc",".jscsrc",".webmanifest",".js.map",".css.map",".ts.map",".har",".jslintrc",".jsonld",".geojson",".ipynb",".vuerc"],"filenames":["composer.lock",".watchmanconfig"],"mimetypes":["application/json","application/manifest+json"],"configuration":"./language-configuration.json"},{"id":"jsonc","aliases":["JSON with Comments"],"extensions":[".jsonc",".eslintrc",".eslintrc.json",".jsfmtrc",".jshintrc",".swcrc",".hintrc",".babelrc",".toolset.jsonc"],"filenames":["babel.config.json","bun.lock",".babelrc.json",".ember-cli","typedoc.json"],"configuration":"./language-configuration.json"},{"id":"jsonl","aliases":["JSON Lines"],"extensions":[".jsonl",".ndjson"],"filenames":[],"configuration":"./language-configuration.json"},{"id":"snippets","aliases":["Code Snippets"],"extensions":[".code-snippets"],"filenamePatterns":["**/User/snippets/*.json","**/User/profiles/*/snippets/*.json","**/snippets*.json"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"json","scopeName":"source.json","path":"./syntaxes/JSON.tmLanguage.json"},{"language":"jsonc","scopeName":"source.json.comments","path":"./syntaxes/JSONC.tmLanguage.json"},{"language":"jsonl","scopeName":"source.json.lines","path":"./syntaxes/JSONL.tmLanguage.json"},{"language":"snippets","scopeName":"source.json.comments.snippets","path":"./syntaxes/snippets.tmLanguage.json"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/json","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.json-language-features"},"manifest":{"name":"json-language-features","displayName":"JSON Language Features","description":"Provides rich language support for JSON files.","version":"1.0.0","publisher":"vscode","license":"MIT","aiKey":"0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255","engines":{"vscode":"^1.77.0"},"enabledApiProposals":["extensionsAny"],"icon":"icons/json.png","activationEvents":["onLanguage:json","onLanguage:jsonc","onLanguage:snippets","onCommand:json.validate"],"main":"./client/dist/node/jsonClientMain","browser":"./client/dist/browser/jsonClientMain","capabilities":{"virtualWorkspaces":true,"untrustedWorkspaces":{"supported":"limited","description":"The extension requires workspace trust to load schemas from http and https."}},"categories":["Programming Languages"],"contributes":{"configuration":{"id":"json","order":20,"type":"object","title":"JSON","properties":{"json.schemas":{"type":"array","scope":"resource","description":"Associate schemas to JSON files in the current project.","items":{"type":"object","default":{"fileMatch":["/myfile"],"url":"schemaURL"},"properties":{"url":{"type":"string","default":"/user.schema.json","description":"A URL or absolute file path to a schema. Can be a relative path (starting with './') in workspace and workspace folder settings."},"fileMatch":{"type":"array","items":{"type":"string","default":"MyFile.json","description":"A file pattern that can contain '*' and '**' to match against when resolving JSON files to schemas. When beginning with '!', it defines an exclusion pattern."},"minItems":1,"description":"An array of file patterns to match against when resolving JSON files to schemas. `*` and '**' can be used as a wildcard. Exclusion patterns can also be defined and start with '!'. A file matches when there is at least one matching pattern and the last matching pattern is not an exclusion pattern."},"schema":{"$ref":"http://json-schema.org/draft-07/schema#","description":"The schema definition for the given URL. The schema only needs to be provided to avoid accesses to the schema URL."}}}},"json.validate.enable":{"type":"boolean","scope":"window","default":true,"description":"Enable/disable JSON validation."},"json.format.enable":{"type":"boolean","scope":"window","default":true,"description":"Enable/disable default JSON formatter"},"json.format.keepLines":{"type":"boolean","scope":"window","default":false,"description":"Keep all existing new lines when formatting."},"json.trace.server":{"type":"string","scope":"window","enum":["off","messages","verbose"],"default":"off","description":"Traces the communication between VS Code and the JSON language server."},"json.colorDecorators.enable":{"type":"boolean","scope":"window","default":true,"description":"Enables or disables color decorators","deprecationMessage":"The setting `json.colorDecorators.enable` has been deprecated in favor of `editor.colorDecorators`."},"json.maxItemsComputed":{"type":"number","default":5000,"description":"The maximum number of outline symbols and folding regions computed (limited for performance reasons)."},"json.schemaDownload.enable":{"type":"boolean","default":true,"description":"When enabled, JSON schemas can be fetched from http and https locations.","tags":["usesOnlineServices"]}}},"configurationDefaults":{"[json]":{"editor.quickSuggestions":{"strings":true},"editor.suggest.insertMode":"replace"},"[jsonc]":{"editor.quickSuggestions":{"strings":true},"editor.suggest.insertMode":"replace"},"[snippets]":{"editor.quickSuggestions":{"strings":true},"editor.suggest.insertMode":"replace"}},"jsonValidation":[{"fileMatch":"*.schema.json","url":"http://json-schema.org/draft-07/schema#"}],"commands":[{"command":"json.clearCache","title":"Clear Schema Cache","category":"JSON"},{"command":"json.sort","title":"Sort Document","category":"JSON"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/json-language-features","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.julia"},"manifest":{"name":"julia","displayName":"Julia Language Basics","description":"Provides syntax highlighting & bracket matching in Julia files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"0.10.x"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin JuliaEditorSupport/atom-language-julia grammars/julia_vscode.json ./syntaxes/julia.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"julia","aliases":["Julia","julia"],"extensions":[".jl"],"firstLine":"^#!\\s*/.*\\bjulia[0-9.-]*\\b","configuration":"./language-configuration.json"},{"id":"juliamarkdown","aliases":["Julia Markdown","juliamarkdown"],"extensions":[".jmd"]}],"grammars":[{"language":"julia","scopeName":"source.julia","path":"./syntaxes/julia.tmLanguage.json","embeddedLanguages":{"meta.embedded.inline.cpp":"cpp","meta.embedded.inline.javascript":"javascript","meta.embedded.inline.python":"python","meta.embedded.inline.r":"r","meta.embedded.inline.sql":"sql"}}],"configurationDefaults":{"[julia]":{"editor.defaultColorDecorators":"never"}}}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/julia","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.latex"},"manifest":{"name":"latex","displayName":"LaTeX Language Basics","description":"Provides syntax highlighting and bracket matching for TeX, LaTeX and BibTeX.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ./build/update-grammars.js"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"tex","aliases":["TeX","tex"],"extensions":[".sty",".cls",".bbx",".cbx"],"configuration":"latex-language-configuration.json"},{"id":"latex","aliases":["LaTeX","latex"],"extensions":[".tex",".ltx",".ctx"],"configuration":"latex-language-configuration.json"},{"id":"bibtex","aliases":["BibTeX","bibtex"],"extensions":[".bib"]},{"id":"cpp_embedded_latex","configuration":"latex-cpp-embedded-language-configuration.json","aliases":[]},{"id":"markdown_latex_combined","configuration":"markdown-latex-combined-language-configuration.json","aliases":[]}],"grammars":[{"language":"tex","scopeName":"text.tex","path":"./syntaxes/TeX.tmLanguage.json","unbalancedBracketScopes":["keyword.control.ifnextchar.tex","punctuation.math.operator.tex"]},{"language":"latex","scopeName":"text.tex.latex","path":"./syntaxes/LaTeX.tmLanguage.json","unbalancedBracketScopes":["keyword.control.ifnextchar.tex","punctuation.math.operator.tex"],"embeddedLanguages":{"source.cpp":"cpp_embedded_latex","source.css":"css","text.html":"html","source.java":"java","source.js":"javascript","source.julia":"julia","source.lua":"lua","source.python":"python","source.ruby":"ruby","source.ts":"typescript","text.xml":"xml","source.yaml":"yaml","meta.embedded.markdown_latex_combined":"markdown_latex_combined"}},{"language":"bibtex","scopeName":"text.bibtex","path":"./syntaxes/Bibtex.tmLanguage.json"},{"language":"markdown_latex_combined","scopeName":"text.tex.markdown_latex_combined","path":"./syntaxes/markdown-latex-combined.tmLanguage.json"},{"language":"cpp_embedded_latex","scopeName":"source.cpp.embedded.latex","path":"./syntaxes/cpp-grammar-bailout.tmLanguage.json"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/latex","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.less"},"manifest":{"name":"less","displayName":"Less Language Basics","description":"Provides syntax highlighting, bracket matching and folding in Less files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ./build/update-grammar.js"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"less","aliases":["Less","less"],"extensions":[".less"],"mimetypes":["text/x-less","text/less"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"less","scopeName":"source.css.less","path":"./syntaxes/less.tmLanguage.json"}],"problemMatchers":[{"name":"lessc","label":"Lessc compiler","owner":"lessc","source":"less","fileLocation":"absolute","pattern":{"regexp":"(.*)\\sin\\s(.*)\\son line\\s(\\d+),\\scolumn\\s(\\d+)","message":1,"file":2,"line":3,"column":4}}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/less","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.log"},"manifest":{"name":"log","displayName":"Log","description":"Provides syntax highlighting for files with .log extension.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin emilast/vscode-logfile-highlighter syntaxes/log.tmLanguage ./syntaxes/log.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"log","extensions":[".log","*.log.?"],"aliases":["Log"]}],"grammars":[{"language":"log","scopeName":"text.log","path":"./syntaxes/log.tmLanguage.json"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/log","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.lua"},"manifest":{"name":"lua","displayName":"Lua Language Basics","description":"Provides syntax highlighting and bracket matching in Lua files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin sumneko/lua.tmbundle Syntaxes/Lua.plist ./syntaxes/lua.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"lua","extensions":[".lua"],"aliases":["Lua","lua"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"lua","scopeName":"source.lua","path":"./syntaxes/lua.tmLanguage.json","tokenTypes":{"comment.line.double-dash.doc.lua":"other"}}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/lua","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.make"},"manifest":{"name":"make","displayName":"Make Language Basics","description":"Provides syntax highlighting and bracket matching in Make files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin fadeevab/make.tmbundle Syntaxes/Makefile.plist ./syntaxes/make.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"makefile","aliases":["Makefile","makefile"],"extensions":[".mak",".mk"],"filenames":["Makefile","makefile","GNUmakefile","OCamlMakefile"],"firstLine":"^#!\\s*/usr/bin/make","configuration":"./language-configuration.json"}],"grammars":[{"language":"makefile","scopeName":"source.makefile","path":"./syntaxes/make.tmLanguage.json","tokenTypes":{"string.interpolated":"other"}}],"configurationDefaults":{"[makefile]":{"editor.insertSpaces":false}}},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/make","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.markdown"},"manifest":{"name":"markdown","displayName":"Markdown Language Basics","description":"Provides snippets and syntax highlighting for Markdown.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"^1.20.0"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"markdown","aliases":["Markdown","markdown"],"extensions":[".md",".mkd",".mdwn",".mdown",".markdown",".markdn",".mdtxt",".mdtext",".workbook"],"filenamePatterns":["**/.cursor/**/*.mdc"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"markdown","scopeName":"text.html.markdown","path":"./syntaxes/markdown.tmLanguage.json","embeddedLanguages":{"meta.embedded.block.html":"html","source.js":"javascript","source.css":"css","meta.embedded.block.frontmatter":"yaml","meta.embedded.block.css":"css","meta.embedded.block.ini":"ini","meta.embedded.block.java":"java","meta.embedded.block.lua":"lua","meta.embedded.block.makefile":"makefile","meta.embedded.block.perl":"perl","meta.embedded.block.r":"r","meta.embedded.block.ruby":"ruby","meta.embedded.block.php":"php","meta.embedded.block.sql":"sql","meta.embedded.block.vs_net":"vs_net","meta.embedded.block.xml":"xml","meta.embedded.block.xsl":"xsl","meta.embedded.block.yaml":"yaml","meta.embedded.block.dosbatch":"dosbatch","meta.embedded.block.clojure":"clojure","meta.embedded.block.coffee":"coffee","meta.embedded.block.c":"c","meta.embedded.block.cpp":"cpp","meta.embedded.block.diff":"diff","meta.embedded.block.dockerfile":"dockerfile","meta.embedded.block.go":"go","meta.embedded.block.groovy":"groovy","meta.embedded.block.pug":"jade","meta.embedded.block.ignore":"ignore","meta.embedded.block.javascript":"javascript","meta.embedded.block.json":"json","meta.embedded.block.jsonc":"jsonc","meta.embedded.block.jsonl":"jsonl","meta.embedded.block.latex":"latex","meta.embedded.block.less":"less","meta.embedded.block.objc":"objc","meta.embedded.block.scss":"scss","meta.embedded.block.perl6":"perl6","meta.embedded.block.powershell":"powershell","meta.embedded.block.python":"python","meta.embedded.block.restructuredtext":"restructuredtext","meta.embedded.block.rust":"rust","meta.embedded.block.scala":"scala","meta.embedded.block.shellscript":"shellscript","meta.embedded.block.typescript":"typescript","meta.embedded.block.typescriptreact":"typescriptreact","meta.embedded.block.csharp":"csharp","meta.embedded.block.fsharp":"fsharp"},"unbalancedBracketScopes":["markup.underline.link.markdown","punctuation.definition.list.begin.markdown"]}],"snippets":[{"language":"markdown","path":"./snippets/markdown.code-snippets"}],"configurationDefaults":{"[markdown]":{"editor.unicodeHighlight.ambiguousCharacters":false,"editor.unicodeHighlight.invisibleCharacters":false,"diffEditor.ignoreTrimWhitespace":false}}},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin microsoft/vscode-markdown-tm-grammar syntaxes/markdown.tmLanguage ./syntaxes/markdown.tmLanguage.json"},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/markdown-basics","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.markdown-language-features"},"manifest":{"name":"markdown-language-features","displayName":"Markdown Language Features","description":"Provides rich language support for Markdown.","version":"1.0.0","icon":"icon.png","publisher":"vscode","license":"MIT","aiKey":"0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255","engines":{"vscode":"^1.70.0"},"main":"./dist/extension","browser":"./dist/browser/extension","categories":["Programming Languages"],"activationEvents":["onLanguage:markdown","onLanguage:prompt","onLanguage:instructions","onLanguage:chatagent","onCommand:markdown.api.render","onCommand:markdown.api.reloadPlugins","onWebviewPanel:markdown.preview"],"capabilities":{"virtualWorkspaces":true,"untrustedWorkspaces":{"supported":"limited","description":"Required for loading styles configured in the workspace.","restrictedConfigurations":["markdown.styles"]}},"contributes":{"notebookRenderer":[{"id":"vscode.markdown-it-renderer","displayName":"Markdown it renderer","entrypoint":"./notebook-out/index.js","mimeTypes":["text/markdown","text/latex","text/x-css","text/x-html","text/x-json","text/x-typescript","text/x-abap","text/x-apex","text/x-azcli","text/x-bat","text/x-cameligo","text/x-clojure","text/x-coffee","text/x-cpp","text/x-csharp","text/x-csp","text/x-css","text/x-dart","text/x-dockerfile","text/x-ecl","text/x-fsharp","text/x-go","text/x-graphql","text/x-handlebars","text/x-hcl","text/x-html","text/x-ini","text/x-java","text/x-javascript","text/x-julia","text/x-kotlin","text/x-less","text/x-lexon","text/x-lua","text/x-m3","text/x-markdown","text/x-mips","text/x-msdax","text/x-mysql","text/x-objective-c/objective","text/x-pascal","text/x-pascaligo","text/x-perl","text/x-pgsql","text/x-php","text/x-postiats","text/x-powerquery","text/x-powershell","text/x-pug","text/x-python","text/x-r","text/x-razor","text/x-redis","text/x-redshift","text/x-restructuredtext","text/x-ruby","text/x-rust","text/x-sb","text/x-scala","text/x-scheme","text/x-scss","text/x-shell","text/x-solidity","text/x-sophia","text/x-sql","text/x-st","text/x-swift","text/x-systemverilog","text/x-tcl","text/x-twig","text/x-typescript","text/x-vb","text/x-xml","text/x-yaml","application/json"]}],"commands":[{"command":"_markdown.copyImage","title":"Copy Image","category":"Markdown"},{"command":"_markdown.openImage","title":"Open Image","category":"Markdown"},{"command":"markdown.showPreview","title":"Open Preview","category":"Markdown","icon":{"light":"./media/preview-light.svg","dark":"./media/preview-dark.svg"}},{"command":"markdown.showPreviewToSide","title":"Open Preview to the Side","category":"Markdown","icon":"$(open-preview)"},{"command":"markdown.showLockedPreviewToSide","title":"Open Locked Preview to the Side","category":"Markdown","icon":"$(open-preview)"},{"command":"markdown.showSource","title":"Show Source","category":"Markdown","icon":"$(go-to-file)"},{"command":"markdown.showPreviewSecuritySelector","title":"Change Preview Security Settings","category":"Markdown"},{"command":"markdown.preview.refresh","title":"Refresh Preview","category":"Markdown"},{"command":"markdown.preview.toggleLock","title":"Toggle Preview Locking","category":"Markdown"},{"command":"markdown.findAllFileReferences","title":"Find File References","category":"Markdown"},{"command":"markdown.editor.insertLinkFromWorkspace","title":"Insert Link to File in Workspace","category":"Markdown","enablement":"editorLangId =~ /^(markdown|prompt|instructions|chatagent)$/ && !activeEditorIsReadonly"},{"command":"markdown.editor.insertImageFromWorkspace","title":"Insert Image from Workspace","category":"Markdown","enablement":"editorLangId =~ /^(markdown|prompt|instructions|chatagent)$/ && !activeEditorIsReadonly"}],"menus":{"webview/context":[{"command":"_markdown.copyImage","when":"webviewId == 'markdown.preview' && (webviewSection == 'image' || webviewSection == 'localImage')"},{"command":"_markdown.openImage","when":"webviewId == 'markdown.preview' && webviewSection == 'localImage'"}],"editor/title":[{"command":"markdown.showPreviewToSide","when":"editorLangId =~ /^(markdown|prompt|instructions|chatagent)$/ && !notebookEditorFocused && !hasCustomMarkdownPreview","alt":"markdown.showPreview","group":"navigation"},{"command":"markdown.showSource","when":"activeWebviewPanelId == 'markdown.preview' || activeCustomEditorId == 'vscode.markdown.preview.editor'","group":"navigation"},{"command":"markdown.preview.refresh","when":"activeWebviewPanelId == 'markdown.preview' || activeCustomEditorId == 'vscode.markdown.preview.editor'","group":"1_markdown"},{"command":"markdown.preview.toggleLock","when":"activeWebviewPanelId == 'markdown.preview' || activeCustomEditorId == 'vscode.markdown.preview.editor'","group":"1_markdown"},{"command":"markdown.showPreviewSecuritySelector","when":"activeWebviewPanelId == 'markdown.preview' || activeCustomEditorId == 'vscode.markdown.preview.editor'","group":"1_markdown"}],"explorer/context":[{"command":"markdown.showPreview","when":"resourceLangId =~ /^(markdown|prompt|instructions|chatagent)$/ && !hasCustomMarkdownPreview","group":"navigation"},{"command":"markdown.findAllFileReferences","when":"resourceLangId =~ /^(markdown|prompt|instructions|chatagent)$/","group":"4_search"}],"editor/title/context":[{"command":"markdown.showPreview","when":"resourceLangId =~ /^(markdown|prompt|instructions|chatagent)$/ && !hasCustomMarkdownPreview","group":"1_open"},{"command":"markdown.findAllFileReferences","when":"resourceLangId =~ /^(markdown|prompt|instructions|chatagent)$/"}],"commandPalette":[{"command":"_markdown.openImage","when":"false"},{"command":"_markdown.copyImage","when":"false"},{"command":"markdown.showPreview","when":"editorLangId =~ /^(markdown|prompt|instructions|chatagent)$/ && !notebookEditorFocused","group":"navigation"},{"command":"markdown.showPreviewToSide","when":"editorLangId =~ /^(markdown|prompt|instructions|chatagent)$/ && !notebookEditorFocused","group":"navigation"},{"command":"markdown.showLockedPreviewToSide","when":"editorLangId =~ /^(markdown|prompt|instructions|chatagent)$/ && !notebookEditorFocused","group":"navigation"},{"command":"markdown.showSource","when":"activeWebviewPanelId == 'markdown.preview' || activeCustomEditorId == 'vscode.markdown.preview.editor'","group":"navigation"},{"command":"markdown.showPreviewSecuritySelector","when":"editorLangId =~ /^(markdown|prompt|instructions|chatagent)$/ && !notebookEditorFocused"},{"command":"markdown.showPreviewSecuritySelector","when":"activeWebviewPanelId == 'markdown.preview' || activeCustomEditorId == 'vscode.markdown.preview.editor'"},{"command":"markdown.preview.toggleLock","when":"activeWebviewPanelId == 'markdown.preview' || activeCustomEditorId == 'vscode.markdown.preview.editor'"},{"command":"markdown.preview.refresh","when":"editorLangId =~ /^(markdown|prompt|instructions|chatagent)$/ && !notebookEditorFocused"},{"command":"markdown.preview.refresh","when":"activeWebviewPanelId == 'markdown.preview' || activeCustomEditorId == 'vscode.markdown.preview.editor'"},{"command":"markdown.findAllFileReferences","when":"editorLangId =~ /^(markdown|prompt|instructions|chatagent)$/"}]},"keybindings":[{"command":"markdown.showPreview","key":"shift+ctrl+v","mac":"shift+cmd+v","when":"editorLangId =~ /^(markdown|prompt|instructions|chatagent)$/ && !notebookEditorFocused"},{"command":"markdown.showPreviewToSide","key":"ctrl+k v","mac":"cmd+k v","when":"editorLangId =~ /^(markdown|prompt|instructions|chatagent)$/ && !notebookEditorFocused"}],"configuration":{"type":"object","title":"Markdown","order":20,"properties":{"markdown.styles":{"type":"array","items":{"type":"string"},"default":[],"description":"A list of URLs or local paths to CSS style sheets to use from the Markdown preview. Relative paths are interpreted relative to the folder open in the Explorer. If there is no open folder, they are interpreted relative to the location of the Markdown file. All '\\' need to be written as '\\\\'.","scope":"resource"},"markdown.preview.breaks":{"type":"boolean","default":false,"markdownDescription":"Sets how line-breaks are rendered in the Markdown preview. Setting it to `true` creates a `
` for newlines inside paragraphs.","scope":"resource"},"markdown.preview.linkify":{"type":"boolean","default":true,"description":"Convert URL-like text to links in the Markdown preview.","scope":"resource"},"markdown.preview.typographer":{"type":"boolean","default":false,"description":"Enable some language-neutral replacement and quotes beautification in the Markdown preview.","scope":"resource"},"markdown.preview.fontFamily":{"type":"string","default":"-apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, 'Ubuntu', 'Droid Sans', sans-serif","description":"Controls the font family used in the Markdown preview.","scope":"resource"},"markdown.preview.fontSize":{"type":"number","default":14,"description":"Controls the font size in pixels used in the Markdown preview.","scope":"resource"},"markdown.preview.lineHeight":{"type":"number","default":1.6,"description":"Controls the line height used in the Markdown preview. This number is relative to the font size.","scope":"resource"},"markdown.preview.scrollPreviewWithEditor":{"type":"boolean","default":true,"description":"When a Markdown editor is scrolled, update the view of the preview.","scope":"resource"},"markdown.preview.markEditorSelection":{"type":"boolean","default":true,"description":"Mark the current editor selection in the Markdown preview.","scope":"resource"},"markdown.preview.scrollEditorWithPreview":{"type":"boolean","default":true,"description":"When a Markdown preview is scrolled, update the view of the editor.","scope":"resource"},"markdown.preview.doubleClickToSwitchToEditor":{"type":"boolean","default":true,"description":"Double-click in the Markdown preview to switch to the editor.","scope":"resource"},"markdown.preview.openMarkdownLinks":{"type":"string","default":"inPreview","description":"Controls how links to other Markdown files in the Markdown preview should be opened.","scope":"resource","enum":["inPreview","inEditor"],"enumDescriptions":["Try to open links in the Markdown preview.","Try to open links in the editor."]},"markdown.links.openLocation":{"type":"string","default":"currentGroup","description":"Controls where links in Markdown files should be opened.","scope":"resource","enum":["currentGroup","beside"],"enumDescriptions":["Open links in the active editor group.","Open links beside the active editor."]},"markdown.suggest.paths.enabled":{"type":"boolean","default":true,"description":"Enable path suggestions while writing links in Markdown files.","scope":"resource"},"markdown.suggest.paths.includeWorkspaceHeaderCompletions":{"type":"string","default":"onDoubleHash","scope":"resource","markdownDescription":"Enable suggestions for headers in other Markdown files in the current workspace. Accepting one of these suggestions inserts the full path to header in that file, for example: `[link text](/path/to/file.md#header)`.","enum":["never","onDoubleHash","onSingleOrDoubleHash"],"markdownEnumDescriptions":["Disable workspace header suggestions.","Enable workspace header suggestions after typing `##` in a path, for example: `[link text](##`.","Enable workspace header suggestions after typing either `##` or `#` in a path, for example: `[link text](#` or `[link text](##`."]},"markdown.trace.server":{"type":"string","scope":"window","enum":["off","messages","verbose"],"default":"off","description":"Traces the communication between VS Code and the Markdown language server."},"markdown.server.log":{"type":"string","scope":"window","enum":["off","debug","trace"],"default":"off","description":"Controls the logging level of the Markdown language server."},"markdown.editor.drop.enabled":{"type":"string","scope":"resource","markdownDescription":"Enable dropping files into a Markdown editor while holding Shift. Requires enabling `#editor.dropIntoEditor.enabled#`.","default":"smart","enum":["always","smart","never"],"markdownEnumDescriptions":["Always insert Markdown links.","Smartly create Markdown links by default when not dropping into a code block or other special element. Use the drop widget to switch between pasting as plain text or as Markdown links.","Never create Markdown links."]},"markdown.editor.drop.copyIntoWorkspace":{"type":"string","markdownDescription":"Controls if files outside of the workspace that are dropped into a Markdown editor should be copied into the workspace.\n\nUse `#markdown.copyFiles.destination#` to configure where copied dropped files should be created","default":"mediaFiles","enum":["mediaFiles","never"],"markdownEnumDescriptions":["Try to copy external image and video files into the workspace.","Do not copy external files into the workspace."]},"markdown.editor.filePaste.enabled":{"type":"string","scope":"resource","markdownDescription":"Enable pasting files into a Markdown editor to create Markdown links. Requires enabling `#editor.pasteAs.enabled#`.","default":"smart","enum":["always","smart","never"],"markdownEnumDescriptions":["Always insert Markdown links.","Smartly create Markdown links by default when not pasting into a code block or other special element. Use the paste widget to switch between pasting as plain text or as Markdown links.","Never create Markdown links."]},"markdown.editor.filePaste.copyIntoWorkspace":{"type":"string","markdownDescription":"Controls if files outside of the workspace that are pasted into a Markdown editor should be copied into the workspace.\n\nUse `#markdown.copyFiles.destination#` to configure where copied files should be created.","default":"mediaFiles","enum":["mediaFiles","never"],"markdownEnumDescriptions":["Try to copy external image and video files into the workspace.","Do not copy external files into the workspace."]},"markdown.editor.filePaste.videoSnippet":{"type":"string","markdownDescription":"Snippet used when adding videos to Markdown. This snippet can use the following variables:\n- `${src}` — The resolved path of the video file.\n- `${title}` — The title used for the video. A snippet placeholder will automatically be created for this variable.","default":""},"markdown.editor.filePaste.audioSnippet":{"type":"string","markdownDescription":"Snippet used when adding audio to Markdown. This snippet can use the following variables:\n- `${src}` — The resolved path of the audio file.\n- `${title}` — The title used for the audio. A snippet placeholder will automatically be created for this variable.","default":""},"markdown.editor.pasteUrlAsFormattedLink.enabled":{"type":"string","scope":"resource","markdownDescription":"Controls if Markdown links are created when URLs are pasted into a Markdown editor. Requires enabling `#editor.pasteAs.enabled#`.","default":"smartWithSelection","enum":["always","smart","smartWithSelection","never"],"markdownEnumDescriptions":["Always insert Markdown links.","Smartly create Markdown links by default when not pasting into a code block or other special element. Use the paste widget to switch between pasting as plain text or as Markdown links.","Smartly create Markdown links by default when you have selected text and are not pasting into a code block or other special element. Use the paste widget to switch between pasting as plain text or as Markdown links.","Never create Markdown links."]},"markdown.validate.enabled":{"type":"boolean","scope":"resource","description":"Enable all error reporting in Markdown files.","default":false},"markdown.validate.referenceLinks.enabled":{"type":"string","scope":"resource","markdownDescription":"Validate reference links in Markdown files, for example: `[link][ref]`. Requires enabling `#markdown.validate.enabled#`.","default":"warning","enum":["ignore","warning","error"]},"markdown.validate.fragmentLinks.enabled":{"type":"string","scope":"resource","markdownDescription":"Validate fragment links to headers in the current Markdown file, for example: `[link](#header)`. Requires enabling `#markdown.validate.enabled#`.","default":"warning","enum":["ignore","warning","error"]},"markdown.validate.fileLinks.enabled":{"type":"string","scope":"resource","markdownDescription":"Validate links to other files in Markdown files, for example `[link](/path/to/file.md)`. This checks that the target files exists. Requires enabling `#markdown.validate.enabled#`.","default":"warning","enum":["ignore","warning","error"]},"markdown.validate.fileLinks.markdownFragmentLinks":{"type":"string","scope":"resource","markdownDescription":"Validate the fragment part of links to headers in other files in Markdown files, for example: `[link](/path/to/file.md#header)`. Inherits the setting value from `#markdown.validate.fragmentLinks.enabled#` by default.","default":"inherit","enum":["inherit","ignore","warning","error"]},"markdown.validate.ignoredLinks":{"type":"array","scope":"resource","markdownDescription":"Configure links that should not be validated. For example adding `/about` would not validate the link `[about](/about)`, while the glob `/assets/**/*.svg` would let you skip validation for any link to `.svg` files under the `assets` directory.","items":{"type":"string"}},"markdown.validate.unusedLinkDefinitions.enabled":{"type":"string","scope":"resource","markdownDescription":"Validate link definitions that are unused in the current file.","default":"hint","enum":["ignore","hint","warning","error"]},"markdown.validate.duplicateLinkDefinitions.enabled":{"type":"string","scope":"resource","markdownDescription":"Validate duplicated definitions in the current file.","default":"warning","enum":["ignore","warning","error"]},"markdown.updateLinksOnFileMove.enabled":{"type":"string","enum":["prompt","always","never"],"markdownEnumDescriptions":["Prompt on each file move.","Always update links automatically.","Never try to update link and don't prompt."],"default":"never","markdownDescription":"Try to update links in Markdown files when a file is renamed/moved in the workspace. Use `#markdown.updateLinksOnFileMove.include#` to configure which files trigger link updates.","scope":"window"},"markdown.updateLinksOnFileMove.include":{"type":"array","markdownDescription":"Glob patterns that specifies files that trigger automatic link updates. See `#markdown.updateLinksOnFileMove.enabled#` for details about this feature.","scope":"window","items":{"type":"string","description":"The glob pattern to match file paths against. Set to true to enable the pattern."},"default":["**/*.{md,mkd,mdwn,mdown,markdown,markdn,mdtxt,mdtext,workbook}","**/*.{jpg,jpe,jpeg,png,bmp,gif,ico,webp,avif,tiff,svg,mp4}"]},"markdown.updateLinksOnFileMove.enableForDirectories":{"type":"boolean","default":true,"description":"Enable updating links when a directory is moved or renamed in the workspace.","scope":"window"},"markdown.occurrencesHighlight.enabled":{"type":"boolean","default":false,"description":"Enable highlighting link occurrences in the current document.","scope":"resource"},"markdown.copyFiles.destination":{"type":"object","markdownDescription":"Configures the path and file name of files created by copy/paste or drag and drop. This is a map of globs that match against a Markdown document path to the destination path where the new file should be created.\n\nThe destination path may use the following variables:\n\n- `${documentDirName}` — Absolute parent directory path of the Markdown document, e.g. `/Users/me/myProject/docs`.\n- `${documentRelativeDirName}` — Relative parent directory path of the Markdown document, e.g. `docs`. This is the same as `${documentDirName}` if the file is not part of a workspace.\n- `${documentFileName}` — The full filename of the Markdown document, e.g. `README.md`.\n- `${documentBaseName}` — The basename of the Markdown document, e.g. `README`.\n- `${documentExtName}` — The extension of the Markdown document, e.g. `md`.\n- `${documentFilePath}` — Absolute path of the Markdown document, e.g. `/Users/me/myProject/docs/README.md`.\n- `${documentRelativeFilePath}` — Relative path of the Markdown document, e.g. `docs/README.md`. This is the same as `${documentFilePath}` if the file is not part of a workspace.\n- `${documentWorkspaceFolder}` — The workspace folder for the Markdown document, e.g. `/Users/me/myProject`. This is the same as `${documentDirName}` if the file is not part of a workspace.\n- `${fileName}` — The file name of the dropped file, e.g. `image.png`.\n- `${fileExtName}` — The extension of the dropped file, e.g. `png`.\n- `${unixTime}` — The current Unix timestamp in milliseconds.\n- `${isoTime}` — The current time in ISO 8601 format, e.g. '2025-06-06T08:40:32.123Z'.","additionalProperties":{"type":"string"}},"markdown.copyFiles.overwriteBehavior":{"type":"string","markdownDescription":"Controls if files created by drop or paste should overwrite existing files.","default":"nameIncrementally","enum":["nameIncrementally","overwrite"],"markdownEnumDescriptions":["If a file with the same name already exists, append a number to the file name, for example: `image.png` becomes `image-1.png`.","If a file with the same name already exists, overwrite it."]},"markdown.preferredMdPathExtensionStyle":{"type":"string","default":"auto","markdownDescription":"Controls if file extensions (for example `.md`) are added or not for links to Markdown files. This setting is used when file paths are added by tooling such as path completions or file renames.","enum":["auto","includeExtension","removeExtension"],"markdownEnumDescriptions":["For existing paths, try to maintain the file extension style. For new paths, add file extensions.","Prefer including the file extension. For example, path completions to a file named `file.md` will insert `file.md`.","Prefer removing the file extension. For example, path completions to a file named `file.md` will insert `file` without the `.md`."]},"markdown.editor.updateLinksOnPaste.enabled":{"type":"boolean","markdownDescription":"Enable/disable a paste option that updates links and reference in text that is copied and pasted between Markdown editors.\n\nTo use this feature, after pasting text that contains updatable links, just click on the Paste Widget and select `Paste and update pasted links`.","scope":"resource","default":true}}},"configurationDefaults":{"[markdown]":{"editor.wordWrap":"on","editor.quickSuggestions":{"comments":"off","strings":"off","other":"off"}}},"jsonValidation":[{"fileMatch":"package.json","url":"./schemas/package.schema.json"}],"markdown.previewStyles":["./media/markdown.css","./media/highlight.css"],"markdown.previewScripts":["./media/index.js"],"customEditors":[{"viewType":"vscode.markdown.preview.editor","displayName":"Markdown Preview","priority":"option","selector":[{"filenamePattern":"*.md"}]}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/markdown-language-features","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.markdown-math"},"manifest":{"name":"markdown-math","displayName":"Markdown Math","description":"Adds math support to Markdown in notebooks.","version":"1.0.0","icon":"icon.png","publisher":"vscode","license":"MIT","aiKey":"0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255","engines":{"vscode":"^1.54.0"},"categories":["Other","Programming Languages"],"capabilities":{"virtualWorkspaces":true,"untrustedWorkspaces":{"supported":true}},"main":"./dist/extension","browser":"./dist/browser/extension","activationEvents":[],"contributes":{"languages":[{"id":"markdown-math","aliases":[]}],"grammars":[{"language":"markdown-math","scopeName":"text.html.markdown.math","path":"./syntaxes/md-math.tmLanguage.json"},{"scopeName":"markdown.math.block","path":"./syntaxes/md-math-block.tmLanguage.json","injectTo":["text.html.markdown"],"embeddedLanguages":{"meta.embedded.math.markdown":"latex"}},{"scopeName":"markdown.math.inline","path":"./syntaxes/md-math-inline.tmLanguage.json","injectTo":["text.html.markdown"],"embeddedLanguages":{"meta.embedded.math.markdown":"latex","punctuation.definition.math.end.markdown":"latex"}},{"scopeName":"markdown.math.codeblock","path":"./syntaxes/md-math-fence.tmLanguage.json","injectTo":["text.html.markdown"],"embeddedLanguages":{"meta.embedded.math.markdown":"latex"}}],"notebookRenderer":[{"id":"vscode.markdown-it-katex-extension","displayName":"Markdown it KaTeX renderer","entrypoint":{"extends":"vscode.markdown-it-renderer","path":"./notebook-out/katex.js"}}],"markdown.markdownItPlugins":true,"markdown.previewStyles":["./notebook-out/katex.min.css","./preview-styles/index.css"],"configuration":[{"title":"Markdown Math","properties":{"markdown.math.enabled":{"type":"boolean","default":true,"description":"Enable/disable rendering math in the built-in Markdown preview."},"markdown.math.macros":{"type":"object","additionalProperties":{"type":"string"},"default":{},"description":"A collection of custom macros. Each macro is a key-value pair where the key is a new command name and the value is the expansion of the macro.","scope":"resource"}}}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/markdown-math","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.media-preview"},"manifest":{"name":"media-preview","displayName":"Media Preview","description":"Provides VS Code's built-in previews for images, audio, and video","extensionKind":["ui","workspace"],"version":"1.0.0","publisher":"vscode","icon":"icon.png","license":"MIT","aiKey":"0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255","engines":{"vscode":"^1.70.0"},"main":"./dist/extension","browser":"./dist/browser/extension.js","categories":["Other"],"activationEvents":[],"capabilities":{"virtualWorkspaces":true,"untrustedWorkspaces":{"supported":true}},"contributes":{"configuration":{"type":"object","title":"Media Previewer","properties":{"mediaPreview.video.autoPlay":{"type":"boolean","default":false,"markdownDescription":"Start playing videos on mute automatically."},"mediaPreview.video.loop":{"type":"boolean","default":false,"markdownDescription":"Loop videos over again automatically."}}},"customEditors":[{"viewType":"imagePreview.previewEditor","displayName":"Image Preview","priority":"builtin","selector":[{"filenamePattern":"*.{jpg,jpe,jpeg,png,bmp,gif,ico,webp,avif,svg}"}]},{"viewType":"vscode.audioPreview","displayName":"Audio Preview","priority":"builtin","selector":[{"filenamePattern":"*.{mp3,wav,ogg,oga}"}]},{"viewType":"vscode.videoPreview","displayName":"Video Preview","priority":"builtin","selector":[{"filenamePattern":"*.{mp4,webm}"}]}],"commands":[{"command":"imagePreview.zoomIn","title":"Zoom in","category":"Image Preview"},{"command":"imagePreview.zoomOut","title":"Zoom out","category":"Image Preview"},{"command":"imagePreview.copyImage","title":"Copy","category":"Image Preview"},{"command":"imagePreview.reopenAsPreview","title":"Reopen as image preview","category":"Image Preview","icon":"$(preview)"},{"command":"imagePreview.reopenAsText","title":"Reopen as source text","category":"Image Preview","icon":"$(go-to-file)"}],"menus":{"commandPalette":[{"command":"imagePreview.zoomIn","when":"activeCustomEditorId == 'imagePreview.previewEditor'","group":"1_imagePreview"},{"command":"imagePreview.zoomOut","when":"activeCustomEditorId == 'imagePreview.previewEditor'","group":"1_imagePreview"},{"command":"imagePreview.copyImage","when":"false"},{"command":"imagePreview.reopenAsPreview","when":"activeEditor == workbench.editors.files.textFileEditor && resourceExtname == '.svg'","group":"navigation"},{"command":"imagePreview.reopenAsText","when":"activeCustomEditorId == 'imagePreview.previewEditor' && resourceExtname == '.svg'","group":"navigation"}],"webview/context":[{"command":"imagePreview.copyImage","when":"webviewId == 'imagePreview.previewEditor'"}],"editor/title":[{"command":"imagePreview.reopenAsPreview","when":"editorFocus && resourceExtname == '.svg'","group":"navigation"},{"command":"imagePreview.reopenAsText","when":"activeCustomEditorId == 'imagePreview.previewEditor' && resourceExtname == '.svg'","group":"navigation"}]}},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/media-preview","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.merge-conflict"},"manifest":{"name":"merge-conflict","publisher":"vscode","displayName":"Merge Conflict","description":"Highlighting and commands for inline merge conflicts.","icon":"media/icon.png","version":"1.0.0","license":"MIT","aiKey":"0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255","engines":{"vscode":"^1.5.0"},"categories":["Other"],"capabilities":{"virtualWorkspaces":true,"untrustedWorkspaces":{"supported":true}},"activationEvents":["onStartupFinished"],"main":"./dist/mergeConflictMain","browser":"./dist/browser/mergeConflictMain","contributes":{"commands":[{"category":"Merge Conflict","title":"Accept All Current","original":"Accept All Current","command":"merge-conflict.accept.all-current","enablement":"!isMergeEditor"},{"category":"Merge Conflict","title":"Accept All Incoming","original":"Accept All Incoming","command":"merge-conflict.accept.all-incoming","enablement":"!isMergeEditor"},{"category":"Merge Conflict","title":"Accept All Both","original":"Accept All Both","command":"merge-conflict.accept.all-both","enablement":"!isMergeEditor"},{"category":"Merge Conflict","title":"Accept Current","original":"Accept Current","command":"merge-conflict.accept.current","enablement":"!isMergeEditor"},{"category":"Merge Conflict","title":"Accept Incoming","original":"Accept Incoming","command":"merge-conflict.accept.incoming","enablement":"!isMergeEditor"},{"category":"Merge Conflict","title":"Accept Selection","original":"Accept Selection","command":"merge-conflict.accept.selection","enablement":"!isMergeEditor"},{"category":"Merge Conflict","title":"Accept Both","original":"Accept Both","command":"merge-conflict.accept.both","enablement":"!isMergeEditor"},{"category":"Merge Conflict","title":"Next Conflict","original":"Next Conflict","command":"merge-conflict.next","enablement":"!isMergeEditor","icon":"$(arrow-down)"},{"category":"Merge Conflict","title":"Previous Conflict","original":"Previous Conflict","command":"merge-conflict.previous","enablement":"!isMergeEditor","icon":"$(arrow-up)"},{"category":"Merge Conflict","title":"Compare Current Conflict","original":"Compare Current Conflict","command":"merge-conflict.compare","enablement":"!isMergeEditor"}],"menus":{"scm/resourceState/context":[{"command":"merge-conflict.accept.all-current","when":"scmProvider == git && scmResourceGroup == merge","group":"1_modification"},{"command":"merge-conflict.accept.all-incoming","when":"scmProvider == git && scmResourceGroup == merge","group":"1_modification"}],"editor/title":[{"command":"merge-conflict.previous","group":"navigation@1","when":"!isMergeEditor && mergeConflictsCount && mergeConflictsCount != 0"},{"command":"merge-conflict.next","group":"navigation@2","when":"!isMergeEditor && mergeConflictsCount && mergeConflictsCount != 0"}]},"configuration":{"title":"Merge Conflict","properties":{"merge-conflict.codeLens.enabled":{"type":"boolean","description":"Create a CodeLens for merge conflict blocks within editor.","default":true},"merge-conflict.decorators.enabled":{"type":"boolean","description":"Create decorators for merge conflict blocks within editor.","default":true},"merge-conflict.autoNavigateNextConflict.enabled":{"type":"boolean","description":"Whether to automatically navigate to the next merge conflict after resolving a merge conflict.","default":false},"merge-conflict.diffViewPosition":{"type":"string","enum":["Current","Beside","Below"],"description":"Controls where the diff view should be opened when comparing changes in merge conflicts.","enumDescriptions":["Open the diff view in the current editor group.","Open the diff view next to the current editor group.","Open the diff view below the current editor group."],"default":"Current"}}}},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/merge-conflict","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.mermaid-chat-features"},"manifest":{"name":"mermaid-chat-features","displayName":"Mermaid Chat Features","description":"Adds Mermaid diagram support to built-in chats.","version":"1.0.0","publisher":"vscode","license":"MIT","repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"},"aiKey":"0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255","engines":{"vscode":"^1.104.0"},"enabledApiProposals":["chatOutputRenderer"],"capabilities":{"virtualWorkspaces":true,"untrustedWorkspaces":{"supported":true}},"main":"./dist/extension","browser":"./dist/browser/extension","activationEvents":[],"contributes":{"configuration":{"title":"Mermaid Chat Features","properties":{"mermaid-chat.enabled":{"type":"boolean","default":false,"description":"Enable a tool for experimental Mermaid diagram rendering in chat responses.","scope":"application","tags":["experimental"]}}},"chatOutputRenderers":[{"viewType":"vscode.chatMermaidDiagram","mimeTypes":["text/vnd.mermaid"]}],"languageModelTools":[{"name":"renderMermaidDiagram","displayName":"Mermaid Renderer","toolReferenceName":"renderMermaidDiagram","canBeReferencedInPrompt":true,"modelDescription":"Renders a Mermaid diagram from Mermaid.js markup.","userDescription":"Render a Mermaid.js diagrams from markup.","when":"config.mermaid-chat.enabled","inputSchema":{"type":"object","properties":{"markup":{"type":"string","description":"The mermaid diagram markup to render as a Mermaid diagram. This should only be the markup of the diagram. Do not include a wrapping code block."}}}}]}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/mermaid-chat-features","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.microsoft-authentication"},"manifest":{"name":"microsoft-authentication","publisher":"vscode","license":"MIT","displayName":"Microsoft Account","description":"Microsoft authentication provider","version":"0.0.1","engines":{"vscode":"^1.42.0"},"icon":"media/icon.png","categories":["Other"],"activationEvents":[],"enabledApiProposals":["nativeWindowHandle","authIssuers","authenticationChallenges"],"capabilities":{"virtualWorkspaces":true,"untrustedWorkspaces":{"supported":true}},"extensionKind":["ui","workspace"],"contributes":{"authentication":[{"label":"Microsoft","id":"microsoft","authorizationServerGlobs":["https://login.microsoftonline.com/*","https://login.microsoftonline.com/*/v2.0"]},{"label":"Microsoft Sovereign Cloud","id":"microsoft-sovereign-cloud"}],"configuration":[{"title":"Microsoft Sovereign Cloud","properties":{"microsoft-sovereign-cloud.environment":{"type":"string","markdownDescription":"The Sovereign Cloud to use for authentication. If you select `custom`, you must also set the `#microsoft-sovereign-cloud.customEnvironment#` setting.","enum":["ChinaCloud","USGovernment","custom"],"enumDescriptions":["Azure China","Azure US Government","A custom Microsoft Sovereign Cloud"]},"microsoft-sovereign-cloud.customEnvironment":{"type":"object","additionalProperties":true,"markdownDescription":"The custom configuration for the Sovereign Cloud to use with the Microsoft Sovereign Cloud authentication provider. This along with setting `#microsoft-sovereign-cloud.environment#` to `custom` is required to use this feature.","properties":{"name":{"type":"string","description":"The name of the custom Sovereign Cloud."},"portalUrl":{"type":"string","description":"The portal URL for the custom Sovereign Cloud."},"managementEndpointUrl":{"type":"string","description":"The management endpoint for the custom Sovereign Cloud."},"resourceManagerEndpointUrl":{"type":"string","description":"The resource manager endpoint for the custom Sovereign Cloud."},"activeDirectoryEndpointUrl":{"type":"string","description":"The Active Directory endpoint for the custom Sovereign Cloud."},"activeDirectoryResourceId":{"type":"string","description":"The Active Directory resource ID for the custom Sovereign Cloud."}},"required":["name","portalUrl","managementEndpointUrl","resourceManagerEndpointUrl","activeDirectoryEndpointUrl","activeDirectoryResourceId"]}}},{"title":"Microsoft","properties":{"microsoft-authentication.implementation":{"type":"string","default":"msal","enum":["msal","msal-no-broker"],"enumDescriptions":["Use the Microsoft Authentication Library (MSAL) to sign in with a Microsoft account.","Use the Microsoft Authentication Library (MSAL) to sign in with a Microsoft account using a browser. This is useful if you are having issues with the native broker."],"markdownDescription":"The authentication implementation to use for signing in with a Microsoft account.","tags":["onExP"]}}}]},"aiKey":"0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255","main":"./dist/extension.js","repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/microsoft-authentication","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"ms-vscode.js-debug"},"manifest":{"name":"js-debug","displayName":"JavaScript Debugger","version":"1.105.0","publisher":"ms-vscode","author":{"name":"Microsoft Corporation"},"keywords":["pwa","javascript","node","chrome","debugger"],"description":"An extension for debugging Node.js programs and Chrome.","license":"MIT","engines":{"vscode":"^1.80.0","node":">=10"},"icon":"resources/logo.png","categories":["Debuggers"],"private":true,"repository":{"type":"git","url":"https://github.com/Microsoft/vscode-pwa.git"},"bugs":{"url":"https://github.com/Microsoft/vscode-pwa/issues"},"main":"./src/extension.js","enabledApiProposals":["portsAttributes","workspaceTrust","tunnels"],"extensionKind":["workspace"],"capabilities":{"virtualWorkspaces":false,"untrustedWorkspaces":{"supported":"limited","description":"Trust is required to debug code in this workspace."}},"activationEvents":["onDebugDynamicConfigurations","onDebugInitialConfigurations","onFileSystem:jsDebugNetworkFs","onDebugResolve:pwa-node","onDebugResolve:node-terminal","onDebugResolve:pwa-extensionHost","onDebugResolve:pwa-chrome","onDebugResolve:pwa-msedge","onDebugResolve:node","onDebugResolve:chrome","onDebugResolve:extensionHost","onDebugResolve:msedge","onCommand:extension.js-debug.clearAutoAttachVariables","onCommand:extension.js-debug.setAutoAttachVariables","onCommand:extension.js-debug.autoAttachToProcess","onCommand:extension.js-debug.pickNodeProcess","onCommand:extension.js-debug.requestCDPProxy","onCommand:extension.js-debug.completion.nodeTool"],"contributes":{"menus":{"commandPalette":[{"command":"extension.js-debug.prettyPrint","title":"Pretty print for debugging","when":"debugType == pwa-extensionHost && debugState == stopped || debugType == node-terminal && debugState == stopped || debugType == pwa-node && debugState == stopped || debugType == pwa-chrome && debugState == stopped || debugType == pwa-msedge && debugState == stopped"},{"command":"extension.js-debug.startProfile","title":"Take Performance Profile","when":"debugType == pwa-extensionHost && inDebugMode && !jsDebugIsProfiling || debugType == node-terminal && inDebugMode && !jsDebugIsProfiling || debugType == pwa-node && inDebugMode && !jsDebugIsProfiling || debugType == pwa-chrome && inDebugMode && !jsDebugIsProfiling || debugType == pwa-msedge && inDebugMode && !jsDebugIsProfiling"},{"command":"extension.js-debug.stopProfile","title":"Stop Performance Profile","when":"debugType == pwa-extensionHost && inDebugMode && jsDebugIsProfiling || debugType == node-terminal && inDebugMode && jsDebugIsProfiling || debugType == pwa-node && inDebugMode && jsDebugIsProfiling || debugType == pwa-chrome && inDebugMode && jsDebugIsProfiling || debugType == pwa-msedge && inDebugMode && jsDebugIsProfiling"},{"command":"extension.js-debug.revealPage","when":"false"},{"command":"extension.js-debug.debugLink","title":"Open Link","when":"!isWeb"},{"command":"extension.js-debug.createDiagnostics","title":"Diagnose Breakpoint Problems","when":"debugType == pwa-extensionHost && inDebugMode || debugType == node-terminal && inDebugMode || debugType == pwa-node && inDebugMode || debugType == pwa-chrome && inDebugMode || debugType == pwa-msedge && inDebugMode"},{"command":"extension.js-debug.getDiagnosticLogs","title":"Save Diagnostic JS Debug Logs","when":"debugType == pwa-extensionHost && inDebugMode || debugType == node-terminal && inDebugMode || debugType == pwa-node && inDebugMode || debugType == pwa-chrome && inDebugMode || debugType == pwa-msedge && inDebugMode"},{"command":"extension.js-debug.openEdgeDevTools","title":"Open Browser Devtools","when":"debugType == pwa-msedge"},{"command":"extension.js-debug.callers.add","title":"Exclude caller from pausing in the current location","when":"debugType == pwa-extensionHost && debugState == \"stopped\" || debugType == node-terminal && debugState == \"stopped\" || debugType == pwa-node && debugState == \"stopped\" || debugType == pwa-chrome && debugState == \"stopped\" || debugType == pwa-msedge && debugState == \"stopped\""},{"command":"extension.js-debug.callers.goToCaller","when":"false"},{"command":"extension.js-debug.callers.gotToTarget","when":"false"},{"command":"extension.js-debug.network.copyUri","when":"false"},{"command":"extension.js-debug.network.openBody","when":"false"},{"command":"extension.js-debug.network.openBodyInHex","when":"false"},{"command":"extension.js-debug.network.replayXHR","when":"false"},{"command":"extension.js-debug.network.viewRequest","when":"false"},{"command":"extension.js-debug.network.clear","when":"false"},{"command":"extension.js-debug.enableSourceMapStepping","when":"jsDebugIsMapSteppingDisabled"},{"command":"extension.js-debug.disableSourceMapStepping","when":"!jsDebugIsMapSteppingDisabled"}],"debug/callstack/context":[{"command":"extension.js-debug.revealPage","group":"navigation","when":"debugType == pwa-chrome && callStackItemType == 'session' || debugType == pwa-msedge && callStackItemType == 'session'"},{"command":"extension.js-debug.toggleSkippingFile","group":"navigation","when":"debugType == pwa-extensionHost && callStackItemType == 'session' || debugType == node-terminal && callStackItemType == 'session' || debugType == pwa-node && callStackItemType == 'session' || debugType == pwa-chrome && callStackItemType == 'session' || debugType == pwa-msedge && callStackItemType == 'session'"},{"command":"extension.js-debug.startProfile","group":"navigation","when":"debugType == pwa-extensionHost && !jsDebugIsProfiling && callStackItemType == 'session' || debugType == node-terminal && !jsDebugIsProfiling && callStackItemType == 'session' || debugType == pwa-node && !jsDebugIsProfiling && callStackItemType == 'session' || debugType == pwa-chrome && !jsDebugIsProfiling && callStackItemType == 'session' || debugType == pwa-msedge && !jsDebugIsProfiling && callStackItemType == 'session'"},{"command":"extension.js-debug.stopProfile","group":"navigation","when":"debugType == pwa-extensionHost && jsDebugIsProfiling && callStackItemType == 'session' || debugType == node-terminal && jsDebugIsProfiling && callStackItemType == 'session' || debugType == pwa-node && jsDebugIsProfiling && callStackItemType == 'session' || debugType == pwa-chrome && jsDebugIsProfiling && callStackItemType == 'session' || debugType == pwa-msedge && jsDebugIsProfiling && callStackItemType == 'session'"},{"command":"extension.js-debug.startProfile","group":"inline","when":"debugType == pwa-extensionHost && !jsDebugIsProfiling || debugType == node-terminal && !jsDebugIsProfiling || debugType == pwa-node && !jsDebugIsProfiling || debugType == pwa-chrome && !jsDebugIsProfiling || debugType == pwa-msedge && !jsDebugIsProfiling"},{"command":"extension.js-debug.stopProfile","group":"inline","when":"debugType == pwa-extensionHost && jsDebugIsProfiling || debugType == node-terminal && jsDebugIsProfiling || debugType == pwa-node && jsDebugIsProfiling || debugType == pwa-chrome && jsDebugIsProfiling || debugType == pwa-msedge && jsDebugIsProfiling"},{"command":"extension.js-debug.callers.add","when":"debugType == pwa-extensionHost && callStackItemType == 'stackFrame' || debugType == node-terminal && callStackItemType == 'stackFrame' || debugType == pwa-node && callStackItemType == 'stackFrame' || debugType == pwa-chrome && callStackItemType == 'stackFrame' || debugType == pwa-msedge && callStackItemType == 'stackFrame'"}],"debug/toolBar":[{"command":"extension.js-debug.stopProfile","when":"debugType == pwa-extensionHost && jsDebugIsProfiling || debugType == node-terminal && jsDebugIsProfiling || debugType == pwa-node && jsDebugIsProfiling || debugType == pwa-chrome && jsDebugIsProfiling || debugType == pwa-msedge && jsDebugIsProfiling"},{"command":"extension.js-debug.openEdgeDevTools","when":"debugType == pwa-msedge"},{"command":"extension.js-debug.enableSourceMapStepping","when":"jsDebugIsMapSteppingDisabled"}],"view/title":[{"command":"extension.js-debug.addCustomBreakpoints","when":"view == jsBrowserBreakpoints","group":"navigation"},{"command":"extension.js-debug.removeAllCustomBreakpoints","when":"view == jsBrowserBreakpoints","group":"navigation"},{"command":"extension.js-debug.callers.removeAll","group":"navigation","when":"view == jsExcludedCallers"},{"command":"extension.js-debug.disableSourceMapStepping","group":"navigation","when":"debugType == pwa-extensionHost && view == workbench.debug.callStackView && !jsDebugIsMapSteppingDisabled || debugType == node-terminal && view == workbench.debug.callStackView && !jsDebugIsMapSteppingDisabled || debugType == pwa-node && view == workbench.debug.callStackView && !jsDebugIsMapSteppingDisabled || debugType == pwa-chrome && view == workbench.debug.callStackView && !jsDebugIsMapSteppingDisabled || debugType == pwa-msedge && view == workbench.debug.callStackView && !jsDebugIsMapSteppingDisabled"},{"command":"extension.js-debug.enableSourceMapStepping","group":"navigation","when":"debugType == pwa-extensionHost && view == workbench.debug.callStackView && jsDebugIsMapSteppingDisabled || debugType == node-terminal && view == workbench.debug.callStackView && jsDebugIsMapSteppingDisabled || debugType == pwa-node && view == workbench.debug.callStackView && jsDebugIsMapSteppingDisabled || debugType == pwa-chrome && view == workbench.debug.callStackView && jsDebugIsMapSteppingDisabled || debugType == pwa-msedge && view == workbench.debug.callStackView && jsDebugIsMapSteppingDisabled"},{"command":"extension.js-debug.network.clear","group":"navigation","when":"view == jsDebugNetworkTree"}],"view/item/context":[{"command":"extension.js-debug.addXHRBreakpoints","when":"view == jsBrowserBreakpoints && viewItem == xhrBreakpoint"},{"command":"extension.js-debug.editXHRBreakpoints","when":"view == jsBrowserBreakpoints && viewItem == xhrBreakpoint","group":"inline"},{"command":"extension.js-debug.editXHRBreakpoints","when":"view == jsBrowserBreakpoints && viewItem == xhrBreakpoint"},{"command":"extension.js-debug.removeXHRBreakpoint","when":"view == jsBrowserBreakpoints && viewItem == xhrBreakpoint","group":"inline"},{"command":"extension.js-debug.removeXHRBreakpoint","when":"view == jsBrowserBreakpoints && viewItem == xhrBreakpoint"},{"command":"extension.js-debug.addXHRBreakpoints","when":"view == jsBrowserBreakpoints && viewItem == xhrCategory","group":"inline"},{"command":"extension.js-debug.callers.goToCaller","group":"inline","when":"view == jsExcludedCallers"},{"command":"extension.js-debug.callers.gotToTarget","group":"inline","when":"view == jsExcludedCallers"},{"command":"extension.js-debug.callers.remove","group":"inline","when":"view == jsExcludedCallers"},{"command":"extension.js-debug.network.viewRequest","group":"inline@1","when":"view == jsDebugNetworkTree"},{"command":"extension.js-debug.network.openBody","group":"body@1","when":"view == jsDebugNetworkTree"},{"command":"extension.js-debug.network.openBodyInHex","group":"body@2","when":"view == jsDebugNetworkTree"},{"command":"extension.js-debug.network.copyUri","group":"other@1","when":"view == jsDebugNetworkTree"},{"command":"extension.js-debug.network.replayXHR","group":"other@2","when":"view == jsDebugNetworkTree"}],"editor/title":[{"command":"extension.js-debug.prettyPrint","group":"navigation","when":"jsDebugCanPrettyPrint"}]},"breakpoints":[{"language":"javascript"},{"language":"typescript"},{"language":"typescriptreact"},{"language":"javascriptreact"},{"language":"fsharp"},{"language":"html"},{"language":"wat"},{"language":"c"},{"language":"cpp"},{"language":"rust"},{"language":"zig"}],"debuggers":[{"aiKey":"0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255","configurationAttributes":{"attach":{"properties":{"address":{"default":"localhost","description":"TCP/IP address of process to be debugged. Default is 'localhost'.","type":"string"},"attachExistingChildren":{"default":false,"description":"Whether to attempt to attach to already-spawned child processes.","type":"boolean"},"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"continueOnAttach":{"default":true,"markdownDescription":"If true, we'll automatically resume programs launched and waiting on `--inspect-brk`","type":"boolean"},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","tags":["setup"],"type":"string"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"port":{"default":9229,"description":"Debug port to attach to. Default is 9229.","oneOf":[{"type":"integer"},{"pattern":"^\\${.*}$","type":"string"}],"tags":["setup"]},"processId":{"default":"${command:PickProcess}","description":"ID of process to attach to.","type":"string"},"remoteHostHeader":{"description":"Explicit Host header to use when connecting to the websocket of inspector. If unspecified, the host header will be set to 'localhost'. This is useful when the inspector is running behind a proxy that only accept particular Host header.","type":"string"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"restart":{"default":true,"description":"Try to reconnect to the program if we lose connection. If set to `true`, we'll try once a second, forever. You can customize the interval and maximum number of attempts by specifying the `delay` and `maxAttempts` in an object instead.","oneOf":[{"type":"boolean"},{"properties":{"delay":{"default":1000,"minimum":0,"type":"number"},"maxAttempts":{"default":10,"minimum":0,"type":"number"}},"type":"object"}]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]},"websocketAddress":{"description":"Exact websocket address to attach to. If unspecified, it will be discovered from the address and port.","type":"string"}}},"launch":{"properties":{"args":{"default":[],"description":"Command line arguments passed to the program.\n\nCan be an array of strings or a single string. When the program is launched in a terminal, setting this property to a single string will result in the arguments not being escaped for the shell.","items":{"type":"string"},"tags":["setup"],"type":["array","string"]},"attachSimplePort":{"default":9229,"description":"If set, attaches to the process via the given port. This is generally no longer necessary for Node.js programs and loses the ability to debug child processes, but can be useful in more esoteric scenarios such as with Deno and Docker launches. If set to 0, a random port will be chosen and --inspect-brk added to the launch arguments automatically.","oneOf":[{"type":"integer"},{"pattern":"^\\${.*}$","type":"string"}]},"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"console":{"default":"internalConsole","description":"Where to launch the debug target.","enum":["internalConsole","integratedTerminal","externalTerminal"],"enumDescriptions":["VS Code Debug Console (which doesn't support to read input from a program)","VS Code's integrated terminal","External terminal that can be configured via user settings"],"type":"string"},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","tags":["setup"],"type":"string"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"experimentalNetworking":{"default":"auto","description":"Enable experimental inspection in Node.js. When set to `auto` this is enabled for versions of Node.js that support it. It can be set to `on` or `off` to enable or disable it explicitly.","enum":["auto","on","off"],"type":"string"},"killBehavior":{"default":"forceful","enum":["forceful","polite","none"],"markdownDescription":"Configures how debug processes are killed when stopping the session. Can be:\n\n- forceful (default): forcefully tears down the process tree. Sends SIGKILL on posix, or `taskkill.exe /F` on Windows.\n- polite: gracefully tears down the process tree. It's possible that misbehaving processes continue to run after shutdown in this way. Sends SIGTERM on posix, or `taskkill.exe` with no `/F` (force) flag on Windows.\n- none: no termination will happen.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"profileStartup":{"default":true,"description":"If true, will start profiling as soon as the process launches","type":"boolean"},"program":{"default":"","description":"Absolute path to the program. Generated value is guessed by looking at package.json and opened files. Edit this attribute.","tags":["setup"],"type":"string"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"restart":{"default":true,"description":"Try to reconnect to the program if we lose connection. If set to `true`, we'll try once a second, forever. You can customize the interval and maximum number of attempts by specifying the `delay` and `maxAttempts` in an object instead.","oneOf":[{"type":"boolean"},{"properties":{"delay":{"default":1000,"minimum":0,"type":"number"},"maxAttempts":{"default":10,"minimum":0,"type":"number"}},"type":"object"}]},"runtimeArgs":{"default":[],"description":"Optional arguments passed to the runtime executable.","items":{"type":"string"},"tags":["setup"],"type":"array"},"runtimeExecutable":{"default":"node","markdownDescription":"Runtime to use. Either an absolute path or the name of a runtime available on the PATH. If omitted `node` is assumed.","type":["string","null"]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"runtimeVersion":{"default":"default","markdownDescription":"Version of `node` runtime to use. Requires `nvm`.","type":"string"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"stopOnEntry":{"default":true,"description":"Automatically stop program after launch.","type":["boolean","string"]},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]}}}},"configurationSnippets":[],"deprecated":"Please use type node instead","label":"Node.js","languages":["javascript","typescript","javascriptreact","typescriptreact"],"strings":{"unverifiedBreakpoints":"Some of your breakpoints could not be set. If you're having an issue, you can [troubleshoot your launch configuration](command:extension.js-debug.createDiagnostics)."},"type":"pwa-node","variables":{"PickProcess":"extension.js-debug.pickNodeProcess"}},{"aiKey":"0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255","configurationAttributes":{"attach":{"properties":{"address":{"default":"localhost","description":"TCP/IP address of process to be debugged. Default is 'localhost'.","type":"string"},"attachExistingChildren":{"default":false,"description":"Whether to attempt to attach to already-spawned child processes.","type":"boolean"},"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"continueOnAttach":{"default":true,"markdownDescription":"If true, we'll automatically resume programs launched and waiting on `--inspect-brk`","type":"boolean"},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","tags":["setup"],"type":"string"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"port":{"default":9229,"description":"Debug port to attach to. Default is 9229.","oneOf":[{"type":"integer"},{"pattern":"^\\${.*}$","type":"string"}],"tags":["setup"]},"processId":{"default":"${command:PickProcess}","description":"ID of process to attach to.","type":"string"},"remoteHostHeader":{"description":"Explicit Host header to use when connecting to the websocket of inspector. If unspecified, the host header will be set to 'localhost'. This is useful when the inspector is running behind a proxy that only accept particular Host header.","type":"string"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"restart":{"default":true,"description":"Try to reconnect to the program if we lose connection. If set to `true`, we'll try once a second, forever. You can customize the interval and maximum number of attempts by specifying the `delay` and `maxAttempts` in an object instead.","oneOf":[{"type":"boolean"},{"properties":{"delay":{"default":1000,"minimum":0,"type":"number"},"maxAttempts":{"default":10,"minimum":0,"type":"number"}},"type":"object"}]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]},"websocketAddress":{"description":"Exact websocket address to attach to. If unspecified, it will be discovered from the address and port.","type":"string"}}},"launch":{"properties":{"args":{"default":[],"description":"Command line arguments passed to the program.\n\nCan be an array of strings or a single string. When the program is launched in a terminal, setting this property to a single string will result in the arguments not being escaped for the shell.","items":{"type":"string"},"tags":["setup"],"type":["array","string"]},"attachSimplePort":{"default":9229,"description":"If set, attaches to the process via the given port. This is generally no longer necessary for Node.js programs and loses the ability to debug child processes, but can be useful in more esoteric scenarios such as with Deno and Docker launches. If set to 0, a random port will be chosen and --inspect-brk added to the launch arguments automatically.","oneOf":[{"type":"integer"},{"pattern":"^\\${.*}$","type":"string"}]},"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"console":{"default":"internalConsole","description":"Where to launch the debug target.","enum":["internalConsole","integratedTerminal","externalTerminal"],"enumDescriptions":["VS Code Debug Console (which doesn't support to read input from a program)","VS Code's integrated terminal","External terminal that can be configured via user settings"],"type":"string"},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","tags":["setup"],"type":"string"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"experimentalNetworking":{"default":"auto","description":"Enable experimental inspection in Node.js. When set to `auto` this is enabled for versions of Node.js that support it. It can be set to `on` or `off` to enable or disable it explicitly.","enum":["auto","on","off"],"type":"string"},"killBehavior":{"default":"forceful","enum":["forceful","polite","none"],"markdownDescription":"Configures how debug processes are killed when stopping the session. Can be:\n\n- forceful (default): forcefully tears down the process tree. Sends SIGKILL on posix, or `taskkill.exe /F` on Windows.\n- polite: gracefully tears down the process tree. It's possible that misbehaving processes continue to run after shutdown in this way. Sends SIGTERM on posix, or `taskkill.exe` with no `/F` (force) flag on Windows.\n- none: no termination will happen.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"profileStartup":{"default":true,"description":"If true, will start profiling as soon as the process launches","type":"boolean"},"program":{"default":"","description":"Absolute path to the program. Generated value is guessed by looking at package.json and opened files. Edit this attribute.","tags":["setup"],"type":"string"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"restart":{"default":true,"description":"Try to reconnect to the program if we lose connection. If set to `true`, we'll try once a second, forever. You can customize the interval and maximum number of attempts by specifying the `delay` and `maxAttempts` in an object instead.","oneOf":[{"type":"boolean"},{"properties":{"delay":{"default":1000,"minimum":0,"type":"number"},"maxAttempts":{"default":10,"minimum":0,"type":"number"}},"type":"object"}]},"runtimeArgs":{"default":[],"description":"Optional arguments passed to the runtime executable.","items":{"type":"string"},"tags":["setup"],"type":"array"},"runtimeExecutable":{"default":"node","markdownDescription":"Runtime to use. Either an absolute path or the name of a runtime available on the PATH. If omitted `node` is assumed.","type":["string","null"]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"runtimeVersion":{"default":"default","markdownDescription":"Version of `node` runtime to use. Requires `nvm`.","type":"string"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"stopOnEntry":{"default":true,"description":"Automatically stop program after launch.","type":["boolean","string"]},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]}}}},"configurationSnippets":[{"body":{"name":"${1:Attach}","port":9229,"request":"attach","skipFiles":["/**"],"type":"node"},"description":"Attach to a running node program","label":"Node.js: Attach"},{"body":{"address":"${2:TCP/IP address of process to be debugged}","localRoot":"^\"\\${workspaceFolder}\"","name":"${1:Attach to Remote}","port":9229,"remoteRoot":"${3:Absolute path to the remote directory containing the program}","request":"attach","skipFiles":["/**"],"type":"node"},"description":"Attach to the debug port of a remote node program","label":"Node.js: Attach to Remote Program"},{"body":{"name":"${1:Attach by Process ID}","processId":"^\"\\${command:PickProcess}\"","request":"attach","skipFiles":["/**"],"type":"node"},"description":"Open process picker to select node process to attach to","label":"Node.js: Attach to Process"},{"body":{"name":"${2:Launch Program}","program":"^\"\\${workspaceFolder}/${1:app.js}\"","request":"launch","skipFiles":["/**"],"type":"node"},"description":"Launch a node program in debug mode","label":"Node.js: Launch Program"},{"body":{"name":"${1:Launch via NPM}","request":"launch","runtimeArgs":["run-script","debug"],"runtimeExecutable":"npm","skipFiles":["/**"],"type":"node"},"label":"Node.js: Launch via npm","markdownDescription":"Launch a node program through an npm `debug` script"},{"body":{"console":"integratedTerminal","internalConsoleOptions":"neverOpen","name":"nodemon","program":"^\"\\${workspaceFolder}/${1:app.js}\"","request":"launch","restart":true,"runtimeExecutable":"nodemon","skipFiles":["/**"],"type":"node"},"description":"Use nodemon to relaunch a debug session on source changes","label":"Node.js: Nodemon Setup"},{"body":{"args":["-u","tdd","--timeout","999999","--colors","^\"\\${workspaceFolder}/${1:test}\""],"internalConsoleOptions":"openOnSessionStart","name":"Mocha Tests","program":"^\"mocha\"","request":"launch","skipFiles":["/**"],"type":"node"},"description":"Debug mocha tests","label":"Node.js: Mocha Tests"},{"body":{"args":["${1:generator}"],"console":"integratedTerminal","internalConsoleOptions":"neverOpen","name":"Yeoman ${1:generator}","program":"^\"\\${workspaceFolder}/node_modules/yo/lib/cli.js\"","request":"launch","skipFiles":["/**"],"type":"node"},"label":"Node.js: Yeoman generator","markdownDescription":"Debug yeoman generator (install by running `npm link` in project folder)"},{"body":{"args":["${1:task}"],"name":"Gulp ${1:task}","program":"^\"\\${workspaceFolder}/node_modules/gulp/bin/gulp.js\"","request":"launch","skipFiles":["/**"],"type":"node"},"description":"Debug gulp task (make sure to have a local gulp installed in your project)","label":"Node.js: Gulp task"},{"body":{"name":"Electron Main","program":"^\"\\${workspaceFolder}/main.js\"","request":"launch","runtimeExecutable":"^\"electron\"","skipFiles":["/**"],"type":"node"},"description":"Debug the Electron main process","label":"Node.js: Electron Main"}],"label":"Node.js","strings":{"unverifiedBreakpoints":"Some of your breakpoints could not be set. If you're having an issue, you can [troubleshoot your launch configuration](command:extension.js-debug.createDiagnostics)."},"type":"node","variables":{"PickProcess":"extension.js-debug.pickNodeProcess"}},{"aiKey":"0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255","configurationAttributes":{"launch":{"properties":{"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"command":{"default":"npm start","description":"Command to run in the launched terminal. If not provided, the terminal will open without launching a program.","tags":["setup"],"type":["string","null"]},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","tags":["setup"],"type":"string"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]}}}},"configurationSnippets":[{"body":{"command":"npm start","name":"Run npm start","request":"launch","type":"node-terminal"},"description":"Run \"npm start\" in a debug terminal","label":"Run \"npm start\" in a debug terminal"}],"label":"JavaScript Debug Terminal","languages":[],"strings":{"unverifiedBreakpoints":"Some of your breakpoints could not be set. If you're having an issue, you can [troubleshoot your launch configuration](command:extension.js-debug.createDiagnostics)."},"type":"node-terminal"},{"aiKey":"0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255","configurationAttributes":{"launch":{"properties":{"args":{"default":["--extensionDevelopmentPath=${workspaceFolder}"],"description":"Command line arguments passed to the program.\n\nCan be an array of strings or a single string. When the program is launched in a terminal, setting this property to a single string will result in the arguments not being escaped for the shell.","items":{"type":"string"},"tags":["setup"],"type":"array"},"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","tags":["setup"],"type":"string"},"debugWebWorkerHost":{"default":true,"markdownDescription":"Configures whether we should try to attach to the web worker extension host.","type":["boolean"]},"debugWebviews":{"default":true,"markdownDescription":"Configures whether we should try to attach to webviews in the launched VS Code instance. This will only work in desktop VS Code.","type":["boolean"]},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"rendererDebugOptions":{"default":{"webRoot":"${workspaceFolder}"},"markdownDescription":"Chrome launch options used when attaching to the renderer process, with `debugWebviews` or `debugWebWorkerHost`.","properties":{"address":{"default":"localhost","description":"IP address or hostname the debugged browser is listening on.","type":"string"},"browserAttachLocation":{"default":null,"description":"Forces the browser to attach in one location. In a remote workspace (through ssh or WSL, for example) this can be used to attach to a browser on the remote machine rather than locally.","oneOf":[{"type":"null"},{"enum":["ui","workspace"],"type":"string"}]},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"disableNetworkCache":{"default":true,"description":"Controls whether to skip the network cache for each request","type":"boolean"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"inspectUri":{"default":null,"description":"Format to use to rewrite the inspectUri: It's a template string that interpolates keys in `{curlyBraces}`. Available keys are:\n - `url.*` is the parsed address of the running application. For instance, `{url.port}`, `{url.hostname}`\n - `port` is the debug port that Chrome is listening on.\n - `browserInspectUri` is the inspector URI on the launched browser\n - `browserInspectUriPath` is the path part of the inspector URI on the launched browser (e.g.: \"/devtools/browser/e9ec0098-306e-472a-8133-5e42488929c2\").\n - `wsProtocol` is the hinted websocket protocol. This is set to `wss` if the original URL is `https`, or `ws` otherwise.\n","type":["string","null"]},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pathMapping":{"default":{},"description":"A mapping of URLs/paths to local folders, to resolve scripts in the Browser to scripts on disk","type":"object"},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"perScriptSourcemaps":{"default":"auto","description":"Whether scripts are loaded individually with unique sourcemaps containing the basename of the source file. This can be set to optimize sourcemap handling when dealing with lots of small scripts. If set to \"auto\", we'll detect known cases where this is appropriate.","enum":["yes","no","auto"],"type":"string"},"port":{"default":9229,"description":"Port to use to remote debugging the browser, given as `--remote-debugging-port` when launching the browser.","oneOf":[{"type":"integer"},{"pattern":"^\\${.*}$","type":"string"}],"tags":["setup"]},"resolveSourceMapLocations":{"default":null,"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"restart":{"default":false,"markdownDescription":"Whether to reconnect if the browser connection is closed","type":"boolean"},"server":{"oneOf":[{"additionalProperties":false,"default":{"program":"node my-server.js"},"description":"Configures a web server to start up. Takes the same configuration as the 'node' launch task.","properties":{"args":{"default":[],"description":"Command line arguments passed to the program.\n\nCan be an array of strings or a single string. When the program is launched in a terminal, setting this property to a single string will result in the arguments not being escaped for the shell.","items":{"type":"string"},"tags":["setup"],"type":["array","string"]},"attachSimplePort":{"default":9229,"description":"If set, attaches to the process via the given port. This is generally no longer necessary for Node.js programs and loses the ability to debug child processes, but can be useful in more esoteric scenarios such as with Deno and Docker launches. If set to 0, a random port will be chosen and --inspect-brk added to the launch arguments automatically.","oneOf":[{"type":"integer"},{"pattern":"^\\${.*}$","type":"string"}]},"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"console":{"default":"internalConsole","description":"Where to launch the debug target.","enum":["internalConsole","integratedTerminal","externalTerminal"],"enumDescriptions":["VS Code Debug Console (which doesn't support to read input from a program)","VS Code's integrated terminal","External terminal that can be configured via user settings"],"type":"string"},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","tags":["setup"],"type":"string"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"experimentalNetworking":{"default":"auto","description":"Enable experimental inspection in Node.js. When set to `auto` this is enabled for versions of Node.js that support it. It can be set to `on` or `off` to enable or disable it explicitly.","enum":["auto","on","off"],"type":"string"},"killBehavior":{"default":"forceful","enum":["forceful","polite","none"],"markdownDescription":"Configures how debug processes are killed when stopping the session. Can be:\n\n- forceful (default): forcefully tears down the process tree. Sends SIGKILL on posix, or `taskkill.exe /F` on Windows.\n- polite: gracefully tears down the process tree. It's possible that misbehaving processes continue to run after shutdown in this way. Sends SIGTERM on posix, or `taskkill.exe` with no `/F` (force) flag on Windows.\n- none: no termination will happen.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"profileStartup":{"default":true,"description":"If true, will start profiling as soon as the process launches","type":"boolean"},"program":{"default":"","description":"Absolute path to the program. Generated value is guessed by looking at package.json and opened files. Edit this attribute.","tags":["setup"],"type":"string"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"restart":{"default":true,"description":"Try to reconnect to the program if we lose connection. If set to `true`, we'll try once a second, forever. You can customize the interval and maximum number of attempts by specifying the `delay` and `maxAttempts` in an object instead.","oneOf":[{"type":"boolean"},{"properties":{"delay":{"default":1000,"minimum":0,"type":"number"},"maxAttempts":{"default":10,"minimum":0,"type":"number"}},"type":"object"}]},"runtimeArgs":{"default":[],"description":"Optional arguments passed to the runtime executable.","items":{"type":"string"},"tags":["setup"],"type":"array"},"runtimeExecutable":{"default":"node","markdownDescription":"Runtime to use. Either an absolute path or the name of a runtime available on the PATH. If omitted `node` is assumed.","type":["string","null"]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"runtimeVersion":{"default":"default","markdownDescription":"Version of `node` runtime to use. Requires `nvm`.","type":"string"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"stopOnEntry":{"default":true,"description":"Automatically stop program after launch.","type":["boolean","string"]},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]}},"type":"object"},{"additionalProperties":false,"default":{"program":"npm start"},"description":"JavaScript Debug Terminal","properties":{"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"command":{"default":"npm start","description":"Command to run in the launched terminal. If not provided, the terminal will open without launching a program.","tags":["setup"],"type":["string","null"]},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","docDefault":"localRoot || ${workspaceFolder}","tags":["setup"],"type":"string"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]}},"type":"object"}]},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"targetSelection":{"default":"automatic","enum":["pick","automatic"],"markdownDescription":"Whether to attach to all targets that match the URL filter (\"automatic\") or ask to pick one (\"pick\").","type":"string"},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]},"url":{"default":"http://localhost:8080","description":"Will search for a tab with this exact url and attach to it, if found","tags":["setup"],"type":"string"},"urlFilter":{"default":"","description":"Will search for a page with this url and attach to it, if found. Can have * wildcards.","type":"string"},"vueComponentPaths":{"default":["${workspaceFolder}/**/*.vue"],"description":"A list of file glob patterns to find `*.vue` components. By default, searches the entire workspace. This needs to be specified due to extra lookups that Vue's sourcemaps require in Vue CLI 4. You can disable this special handling by setting this to an empty array.","type":"array"},"webRoot":{"default":"${workspaceFolder}","description":"This specifies the workspace absolute path to the webserver root. Used to resolve paths like `/app.js` to files on disk. Shorthand for a pathMapping for \"/\"","tags":["setup"],"type":"string"}},"type":"object"},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"runtimeExecutable":{"default":"node","markdownDescription":"Absolute path to VS Code.","type":["string","null"]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"testConfiguration":{"default":"${workspaceFolder}/.vscode-test.js","markdownDescription":"Path to a test configuration file for the [test CLI](https://code.visualstudio.com/api/working-with-extensions/testing-extension#quick-setup-the-test-cli).","type":"string"},"testConfigurationLabel":{"default":"","markdownDescription":"A single configuration to run from the file. If not specified, you may be asked to pick.","type":"string"},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]}},"required":[]}},"configurationSnippets":[],"deprecated":"Please use type extensionHost instead","label":"VS Code Extension Development","languages":["javascript","typescript","javascriptreact","typescriptreact"],"strings":{"unverifiedBreakpoints":"Some of your breakpoints could not be set. If you're having an issue, you can [troubleshoot your launch configuration](command:extension.js-debug.createDiagnostics)."},"type":"pwa-extensionHost"},{"aiKey":"0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255","configurationAttributes":{"launch":{"properties":{"args":{"default":["--extensionDevelopmentPath=${workspaceFolder}"],"description":"Command line arguments passed to the program.\n\nCan be an array of strings or a single string. When the program is launched in a terminal, setting this property to a single string will result in the arguments not being escaped for the shell.","items":{"type":"string"},"tags":["setup"],"type":"array"},"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","tags":["setup"],"type":"string"},"debugWebWorkerHost":{"default":true,"markdownDescription":"Configures whether we should try to attach to the web worker extension host.","type":["boolean"]},"debugWebviews":{"default":true,"markdownDescription":"Configures whether we should try to attach to webviews in the launched VS Code instance. This will only work in desktop VS Code.","type":["boolean"]},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"rendererDebugOptions":{"default":{"webRoot":"${workspaceFolder}"},"markdownDescription":"Chrome launch options used when attaching to the renderer process, with `debugWebviews` or `debugWebWorkerHost`.","properties":{"address":{"default":"localhost","description":"IP address or hostname the debugged browser is listening on.","type":"string"},"browserAttachLocation":{"default":null,"description":"Forces the browser to attach in one location. In a remote workspace (through ssh or WSL, for example) this can be used to attach to a browser on the remote machine rather than locally.","oneOf":[{"type":"null"},{"enum":["ui","workspace"],"type":"string"}]},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"disableNetworkCache":{"default":true,"description":"Controls whether to skip the network cache for each request","type":"boolean"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"inspectUri":{"default":null,"description":"Format to use to rewrite the inspectUri: It's a template string that interpolates keys in `{curlyBraces}`. Available keys are:\n - `url.*` is the parsed address of the running application. For instance, `{url.port}`, `{url.hostname}`\n - `port` is the debug port that Chrome is listening on.\n - `browserInspectUri` is the inspector URI on the launched browser\n - `browserInspectUriPath` is the path part of the inspector URI on the launched browser (e.g.: \"/devtools/browser/e9ec0098-306e-472a-8133-5e42488929c2\").\n - `wsProtocol` is the hinted websocket protocol. This is set to `wss` if the original URL is `https`, or `ws` otherwise.\n","type":["string","null"]},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pathMapping":{"default":{},"description":"A mapping of URLs/paths to local folders, to resolve scripts in the Browser to scripts on disk","type":"object"},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"perScriptSourcemaps":{"default":"auto","description":"Whether scripts are loaded individually with unique sourcemaps containing the basename of the source file. This can be set to optimize sourcemap handling when dealing with lots of small scripts. If set to \"auto\", we'll detect known cases where this is appropriate.","enum":["yes","no","auto"],"type":"string"},"port":{"default":9229,"description":"Port to use to remote debugging the browser, given as `--remote-debugging-port` when launching the browser.","oneOf":[{"type":"integer"},{"pattern":"^\\${.*}$","type":"string"}],"tags":["setup"]},"resolveSourceMapLocations":{"default":null,"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"restart":{"default":false,"markdownDescription":"Whether to reconnect if the browser connection is closed","type":"boolean"},"server":{"oneOf":[{"additionalProperties":false,"default":{"program":"node my-server.js"},"description":"Configures a web server to start up. Takes the same configuration as the 'node' launch task.","properties":{"args":{"default":[],"description":"Command line arguments passed to the program.\n\nCan be an array of strings or a single string. When the program is launched in a terminal, setting this property to a single string will result in the arguments not being escaped for the shell.","items":{"type":"string"},"tags":["setup"],"type":["array","string"]},"attachSimplePort":{"default":9229,"description":"If set, attaches to the process via the given port. This is generally no longer necessary for Node.js programs and loses the ability to debug child processes, but can be useful in more esoteric scenarios such as with Deno and Docker launches. If set to 0, a random port will be chosen and --inspect-brk added to the launch arguments automatically.","oneOf":[{"type":"integer"},{"pattern":"^\\${.*}$","type":"string"}]},"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"console":{"default":"internalConsole","description":"Where to launch the debug target.","enum":["internalConsole","integratedTerminal","externalTerminal"],"enumDescriptions":["VS Code Debug Console (which doesn't support to read input from a program)","VS Code's integrated terminal","External terminal that can be configured via user settings"],"type":"string"},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","tags":["setup"],"type":"string"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"experimentalNetworking":{"default":"auto","description":"Enable experimental inspection in Node.js. When set to `auto` this is enabled for versions of Node.js that support it. It can be set to `on` or `off` to enable or disable it explicitly.","enum":["auto","on","off"],"type":"string"},"killBehavior":{"default":"forceful","enum":["forceful","polite","none"],"markdownDescription":"Configures how debug processes are killed when stopping the session. Can be:\n\n- forceful (default): forcefully tears down the process tree. Sends SIGKILL on posix, or `taskkill.exe /F` on Windows.\n- polite: gracefully tears down the process tree. It's possible that misbehaving processes continue to run after shutdown in this way. Sends SIGTERM on posix, or `taskkill.exe` with no `/F` (force) flag on Windows.\n- none: no termination will happen.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"profileStartup":{"default":true,"description":"If true, will start profiling as soon as the process launches","type":"boolean"},"program":{"default":"","description":"Absolute path to the program. Generated value is guessed by looking at package.json and opened files. Edit this attribute.","tags":["setup"],"type":"string"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"restart":{"default":true,"description":"Try to reconnect to the program if we lose connection. If set to `true`, we'll try once a second, forever. You can customize the interval and maximum number of attempts by specifying the `delay` and `maxAttempts` in an object instead.","oneOf":[{"type":"boolean"},{"properties":{"delay":{"default":1000,"minimum":0,"type":"number"},"maxAttempts":{"default":10,"minimum":0,"type":"number"}},"type":"object"}]},"runtimeArgs":{"default":[],"description":"Optional arguments passed to the runtime executable.","items":{"type":"string"},"tags":["setup"],"type":"array"},"runtimeExecutable":{"default":"node","markdownDescription":"Runtime to use. Either an absolute path or the name of a runtime available on the PATH. If omitted `node` is assumed.","type":["string","null"]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"runtimeVersion":{"default":"default","markdownDescription":"Version of `node` runtime to use. Requires `nvm`.","type":"string"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"stopOnEntry":{"default":true,"description":"Automatically stop program after launch.","type":["boolean","string"]},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]}},"type":"object"},{"additionalProperties":false,"default":{"program":"npm start"},"description":"JavaScript Debug Terminal","properties":{"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"command":{"default":"npm start","description":"Command to run in the launched terminal. If not provided, the terminal will open without launching a program.","tags":["setup"],"type":["string","null"]},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","docDefault":"localRoot || ${workspaceFolder}","tags":["setup"],"type":"string"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]}},"type":"object"}]},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"targetSelection":{"default":"automatic","enum":["pick","automatic"],"markdownDescription":"Whether to attach to all targets that match the URL filter (\"automatic\") or ask to pick one (\"pick\").","type":"string"},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]},"url":{"default":"http://localhost:8080","description":"Will search for a tab with this exact url and attach to it, if found","tags":["setup"],"type":"string"},"urlFilter":{"default":"","description":"Will search for a page with this url and attach to it, if found. Can have * wildcards.","type":"string"},"vueComponentPaths":{"default":["${workspaceFolder}/**/*.vue"],"description":"A list of file glob patterns to find `*.vue` components. By default, searches the entire workspace. This needs to be specified due to extra lookups that Vue's sourcemaps require in Vue CLI 4. You can disable this special handling by setting this to an empty array.","type":"array"},"webRoot":{"default":"${workspaceFolder}","description":"This specifies the workspace absolute path to the webserver root. Used to resolve paths like `/app.js` to files on disk. Shorthand for a pathMapping for \"/\"","tags":["setup"],"type":"string"}},"type":"object"},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"runtimeExecutable":{"default":"node","markdownDescription":"Absolute path to VS Code.","type":["string","null"]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"testConfiguration":{"default":"${workspaceFolder}/.vscode-test.js","markdownDescription":"Path to a test configuration file for the [test CLI](https://code.visualstudio.com/api/working-with-extensions/testing-extension#quick-setup-the-test-cli).","type":"string"},"testConfigurationLabel":{"default":"","markdownDescription":"A single configuration to run from the file. If not specified, you may be asked to pick.","type":"string"},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]}},"required":[]}},"configurationSnippets":[{"body":{"args":["^\"--extensionDevelopmentPath=\\${workspaceFolder}\""],"name":"Launch Extension","outFiles":["^\"\\${workspaceFolder}/out/**/*.js\""],"preLaunchTask":"npm","request":"launch","type":"extensionHost"},"description":"Launch a VS Code extension in debug mode","label":"VS Code Extension Development"}],"label":"VS Code Extension Development","strings":{"unverifiedBreakpoints":"Some of your breakpoints could not be set. If you're having an issue, you can [troubleshoot your launch configuration](command:extension.js-debug.createDiagnostics)."},"type":"extensionHost"},{"aiKey":"0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255","configurationAttributes":{"attach":{"properties":{"address":{"default":"localhost","description":"IP address or hostname the debugged browser is listening on.","type":"string"},"browserAttachLocation":{"default":null,"description":"Forces the browser to attach in one location. In a remote workspace (through ssh or WSL, for example) this can be used to attach to a browser on the remote machine rather than locally.","oneOf":[{"type":"null"},{"enum":["ui","workspace"],"type":"string"}]},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"disableNetworkCache":{"default":true,"description":"Controls whether to skip the network cache for each request","type":"boolean"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"inspectUri":{"default":null,"description":"Format to use to rewrite the inspectUri: It's a template string that interpolates keys in `{curlyBraces}`. Available keys are:\n - `url.*` is the parsed address of the running application. For instance, `{url.port}`, `{url.hostname}`\n - `port` is the debug port that Chrome is listening on.\n - `browserInspectUri` is the inspector URI on the launched browser\n - `browserInspectUriPath` is the path part of the inspector URI on the launched browser (e.g.: \"/devtools/browser/e9ec0098-306e-472a-8133-5e42488929c2\").\n - `wsProtocol` is the hinted websocket protocol. This is set to `wss` if the original URL is `https`, or `ws` otherwise.\n","type":["string","null"]},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pathMapping":{"default":{},"description":"A mapping of URLs/paths to local folders, to resolve scripts in the Browser to scripts on disk","type":"object"},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"perScriptSourcemaps":{"default":"auto","description":"Whether scripts are loaded individually with unique sourcemaps containing the basename of the source file. This can be set to optimize sourcemap handling when dealing with lots of small scripts. If set to \"auto\", we'll detect known cases where this is appropriate.","enum":["yes","no","auto"],"type":"string"},"port":{"default":9229,"description":"Port to use to remote debugging the browser, given as `--remote-debugging-port` when launching the browser.","oneOf":[{"type":"integer"},{"pattern":"^\\${.*}$","type":"string"}],"tags":["setup"]},"resolveSourceMapLocations":{"default":null,"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"restart":{"default":false,"markdownDescription":"Whether to reconnect if the browser connection is closed","type":"boolean"},"server":{"oneOf":[{"additionalProperties":false,"default":{"program":"node my-server.js"},"description":"Configures a web server to start up. Takes the same configuration as the 'node' launch task.","properties":{"args":{"default":[],"description":"Command line arguments passed to the program.\n\nCan be an array of strings or a single string. When the program is launched in a terminal, setting this property to a single string will result in the arguments not being escaped for the shell.","items":{"type":"string"},"tags":["setup"],"type":["array","string"]},"attachSimplePort":{"default":9229,"description":"If set, attaches to the process via the given port. This is generally no longer necessary for Node.js programs and loses the ability to debug child processes, but can be useful in more esoteric scenarios such as with Deno and Docker launches. If set to 0, a random port will be chosen and --inspect-brk added to the launch arguments automatically.","oneOf":[{"type":"integer"},{"pattern":"^\\${.*}$","type":"string"}]},"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"console":{"default":"internalConsole","description":"Where to launch the debug target.","enum":["internalConsole","integratedTerminal","externalTerminal"],"enumDescriptions":["VS Code Debug Console (which doesn't support to read input from a program)","VS Code's integrated terminal","External terminal that can be configured via user settings"],"type":"string"},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","tags":["setup"],"type":"string"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"experimentalNetworking":{"default":"auto","description":"Enable experimental inspection in Node.js. When set to `auto` this is enabled for versions of Node.js that support it. It can be set to `on` or `off` to enable or disable it explicitly.","enum":["auto","on","off"],"type":"string"},"killBehavior":{"default":"forceful","enum":["forceful","polite","none"],"markdownDescription":"Configures how debug processes are killed when stopping the session. Can be:\n\n- forceful (default): forcefully tears down the process tree. Sends SIGKILL on posix, or `taskkill.exe /F` on Windows.\n- polite: gracefully tears down the process tree. It's possible that misbehaving processes continue to run after shutdown in this way. Sends SIGTERM on posix, or `taskkill.exe` with no `/F` (force) flag on Windows.\n- none: no termination will happen.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"profileStartup":{"default":true,"description":"If true, will start profiling as soon as the process launches","type":"boolean"},"program":{"default":"","description":"Absolute path to the program. Generated value is guessed by looking at package.json and opened files. Edit this attribute.","tags":["setup"],"type":"string"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"restart":{"default":true,"description":"Try to reconnect to the program if we lose connection. If set to `true`, we'll try once a second, forever. You can customize the interval and maximum number of attempts by specifying the `delay` and `maxAttempts` in an object instead.","oneOf":[{"type":"boolean"},{"properties":{"delay":{"default":1000,"minimum":0,"type":"number"},"maxAttempts":{"default":10,"minimum":0,"type":"number"}},"type":"object"}]},"runtimeArgs":{"default":[],"description":"Optional arguments passed to the runtime executable.","items":{"type":"string"},"tags":["setup"],"type":"array"},"runtimeExecutable":{"default":"node","markdownDescription":"Runtime to use. Either an absolute path or the name of a runtime available on the PATH. If omitted `node` is assumed.","type":["string","null"]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"runtimeVersion":{"default":"default","markdownDescription":"Version of `node` runtime to use. Requires `nvm`.","type":"string"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"stopOnEntry":{"default":true,"description":"Automatically stop program after launch.","type":["boolean","string"]},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]}},"type":"object"},{"additionalProperties":false,"default":{"program":"npm start"},"description":"JavaScript Debug Terminal","properties":{"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"command":{"default":"npm start","description":"Command to run in the launched terminal. If not provided, the terminal will open without launching a program.","tags":["setup"],"type":["string","null"]},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","docDefault":"localRoot || ${workspaceFolder}","tags":["setup"],"type":"string"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]}},"type":"object"}]},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"targetSelection":{"default":"automatic","enum":["pick","automatic"],"markdownDescription":"Whether to attach to all targets that match the URL filter (\"automatic\") or ask to pick one (\"pick\").","type":"string"},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]},"url":{"default":"http://localhost:8080","description":"Will search for a tab with this exact url and attach to it, if found","tags":["setup"],"type":"string"},"urlFilter":{"default":"","description":"Will search for a page with this url and attach to it, if found. Can have * wildcards.","type":"string"},"vueComponentPaths":{"default":["${workspaceFolder}/**/*.vue"],"description":"A list of file glob patterns to find `*.vue` components. By default, searches the entire workspace. This needs to be specified due to extra lookups that Vue's sourcemaps require in Vue CLI 4. You can disable this special handling by setting this to an empty array.","type":"array"},"webRoot":{"default":"${workspaceFolder}","description":"This specifies the workspace absolute path to the webserver root. Used to resolve paths like `/app.js` to files on disk. Shorthand for a pathMapping for \"/\"","tags":["setup"],"type":"string"}}},"launch":{"properties":{"browserLaunchLocation":{"default":null,"description":"Forces the browser to be launched in one location. In a remote workspace (through ssh or WSL, for example) this can be used to open the browser on the remote machine rather than locally.","oneOf":[{"type":"null"},{"enum":["ui","workspace"],"type":"string"}]},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"cleanUp":{"default":"wholeBrowser","description":"What clean-up to do after the debugging session finishes. Close only the tab being debug, vs. close the whole browser.","enum":["wholeBrowser","onlyTab"],"type":"string"},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":null,"description":"Optional working directory for the runtime executable.","type":"string"},"disableNetworkCache":{"default":true,"description":"Controls whether to skip the network cache for each request","type":"boolean"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"default":{},"description":"Optional dictionary of environment key/value pairs for the browser.","type":"object"},"file":{"default":"${workspaceFolder}/index.html","description":"A local html file to open in the browser","tags":["setup"],"type":"string"},"includeDefaultArgs":{"default":true,"description":"Whether default browser launch arguments (to disable features that may make debugging harder) will be included in the launch.","type":"boolean"},"includeLaunchArgs":{"default":true,"description":"Advanced: whether any default launch/debugging arguments are set on the browser. The debugger will assume the browser will use pipe debugging such as that which is provided with `--remote-debugging-pipe`.","type":"boolean"},"inspectUri":{"default":null,"description":"Format to use to rewrite the inspectUri: It's a template string that interpolates keys in `{curlyBraces}`. Available keys are:\n - `url.*` is the parsed address of the running application. For instance, `{url.port}`, `{url.hostname}`\n - `port` is the debug port that Chrome is listening on.\n - `browserInspectUri` is the inspector URI on the launched browser\n - `browserInspectUriPath` is the path part of the inspector URI on the launched browser (e.g.: \"/devtools/browser/e9ec0098-306e-472a-8133-5e42488929c2\").\n - `wsProtocol` is the hinted websocket protocol. This is set to `wss` if the original URL is `https`, or `ws` otherwise.\n","type":["string","null"]},"killBehavior":{"default":"forceful","enum":["forceful","polite","none"],"markdownDescription":"Configures how browser processes are killed when stopping the session with `cleanUp: wholeBrowser`. Can be:\n\n- forceful (default): forcefully tears down the process tree. Sends SIGKILL on posix, or `taskkill.exe /F` on Windows.\n- polite: gracefully tears down the process tree. It's possible that misbehaving processes continue to run after shutdown in this way. Sends SIGTERM on posix, or `taskkill.exe` with no `/F` (force) flag on Windows.\n- none: no termination will happen.","type":"string"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pathMapping":{"default":{},"description":"A mapping of URLs/paths to local folders, to resolve scripts in the Browser to scripts on disk","type":"object"},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"perScriptSourcemaps":{"default":"auto","description":"Whether scripts are loaded individually with unique sourcemaps containing the basename of the source file. This can be set to optimize sourcemap handling when dealing with lots of small scripts. If set to \"auto\", we'll detect known cases where this is appropriate.","enum":["yes","no","auto"],"type":"string"},"port":{"default":0,"description":"Port for the browser to listen on. Defaults to \"0\", which will cause the browser to be debugged via pipes, which is generally more secure and should be chosen unless you need to attach to the browser from another tool.","type":"number"},"profileStartup":{"default":true,"description":"If true, will start profiling soon as the process launches","type":"boolean"},"resolveSourceMapLocations":{"default":null,"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"runtimeArgs":{"default":[],"description":"Optional arguments passed to the runtime executable.","items":{"type":"string"},"type":"array"},"runtimeExecutable":{"default":"stable","description":"Either 'canary', 'stable', 'custom' or path to the browser executable. Custom means a custom wrapper, custom build or CHROME_PATH environment variable.","type":["string","null"]},"server":{"oneOf":[{"additionalProperties":false,"default":{"program":"node my-server.js"},"description":"Configures a web server to start up. Takes the same configuration as the 'node' launch task.","properties":{"args":{"default":[],"description":"Command line arguments passed to the program.\n\nCan be an array of strings or a single string. When the program is launched in a terminal, setting this property to a single string will result in the arguments not being escaped for the shell.","items":{"type":"string"},"tags":["setup"],"type":["array","string"]},"attachSimplePort":{"default":9229,"description":"If set, attaches to the process via the given port. This is generally no longer necessary for Node.js programs and loses the ability to debug child processes, but can be useful in more esoteric scenarios such as with Deno and Docker launches. If set to 0, a random port will be chosen and --inspect-brk added to the launch arguments automatically.","oneOf":[{"type":"integer"},{"pattern":"^\\${.*}$","type":"string"}]},"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"console":{"default":"internalConsole","description":"Where to launch the debug target.","enum":["internalConsole","integratedTerminal","externalTerminal"],"enumDescriptions":["VS Code Debug Console (which doesn't support to read input from a program)","VS Code's integrated terminal","External terminal that can be configured via user settings"],"type":"string"},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","tags":["setup"],"type":"string"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"experimentalNetworking":{"default":"auto","description":"Enable experimental inspection in Node.js. When set to `auto` this is enabled for versions of Node.js that support it. It can be set to `on` or `off` to enable or disable it explicitly.","enum":["auto","on","off"],"type":"string"},"killBehavior":{"default":"forceful","enum":["forceful","polite","none"],"markdownDescription":"Configures how debug processes are killed when stopping the session. Can be:\n\n- forceful (default): forcefully tears down the process tree. Sends SIGKILL on posix, or `taskkill.exe /F` on Windows.\n- polite: gracefully tears down the process tree. It's possible that misbehaving processes continue to run after shutdown in this way. Sends SIGTERM on posix, or `taskkill.exe` with no `/F` (force) flag on Windows.\n- none: no termination will happen.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"profileStartup":{"default":true,"description":"If true, will start profiling as soon as the process launches","type":"boolean"},"program":{"default":"","description":"Absolute path to the program. Generated value is guessed by looking at package.json and opened files. Edit this attribute.","tags":["setup"],"type":"string"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"restart":{"default":true,"description":"Try to reconnect to the program if we lose connection. If set to `true`, we'll try once a second, forever. You can customize the interval and maximum number of attempts by specifying the `delay` and `maxAttempts` in an object instead.","oneOf":[{"type":"boolean"},{"properties":{"delay":{"default":1000,"minimum":0,"type":"number"},"maxAttempts":{"default":10,"minimum":0,"type":"number"}},"type":"object"}]},"runtimeArgs":{"default":[],"description":"Optional arguments passed to the runtime executable.","items":{"type":"string"},"tags":["setup"],"type":"array"},"runtimeExecutable":{"default":"node","markdownDescription":"Runtime to use. Either an absolute path or the name of a runtime available on the PATH. If omitted `node` is assumed.","type":["string","null"]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"runtimeVersion":{"default":"default","markdownDescription":"Version of `node` runtime to use. Requires `nvm`.","type":"string"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"stopOnEntry":{"default":true,"description":"Automatically stop program after launch.","type":["boolean","string"]},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]}},"type":"object"},{"additionalProperties":false,"default":{"program":"npm start"},"description":"JavaScript Debug Terminal","properties":{"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"command":{"default":"npm start","description":"Command to run in the launched terminal. If not provided, the terminal will open without launching a program.","tags":["setup"],"type":["string","null"]},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","docDefault":"localRoot || ${workspaceFolder}","tags":["setup"],"type":"string"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]}},"type":"object"}]},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]},"url":{"default":"http://localhost:8080","description":"Will search for a tab with this exact url and attach to it, if found","tags":["setup"],"type":"string"},"urlFilter":{"default":"","description":"Will search for a page with this url and attach to it, if found. Can have * wildcards.","type":"string"},"userDataDir":{"default":true,"description":"By default, the browser is launched with a separate user profile in a temp folder. Use this option to override it. Set to false to launch with your default user profile. A new browser can't be launched if an instance is already running from `userDataDir`.","type":["string","boolean"]},"vueComponentPaths":{"default":["${workspaceFolder}/**/*.vue"],"description":"A list of file glob patterns to find `*.vue` components. By default, searches the entire workspace. This needs to be specified due to extra lookups that Vue's sourcemaps require in Vue CLI 4. You can disable this special handling by setting this to an empty array.","type":"array"},"webRoot":{"default":"${workspaceFolder}","description":"This specifies the workspace absolute path to the webserver root. Used to resolve paths like `/app.js` to files on disk. Shorthand for a pathMapping for \"/\"","tags":["setup"],"type":"string"}}}},"configurationSnippets":[],"deprecated":"Please use type chrome instead","label":"Web App (Chrome)","languages":["javascript","typescript","javascriptreact","typescriptreact","html","css","coffeescript","handlebars","vue"],"strings":{"unverifiedBreakpoints":"Some of your breakpoints could not be set. If you're having an issue, you can [troubleshoot your launch configuration](command:extension.js-debug.createDiagnostics)."},"type":"pwa-chrome"},{"aiKey":"0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255","configurationAttributes":{"attach":{"properties":{"address":{"default":"localhost","description":"IP address or hostname the debugged browser is listening on.","type":"string"},"browserAttachLocation":{"default":null,"description":"Forces the browser to attach in one location. In a remote workspace (through ssh or WSL, for example) this can be used to attach to a browser on the remote machine rather than locally.","oneOf":[{"type":"null"},{"enum":["ui","workspace"],"type":"string"}]},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"disableNetworkCache":{"default":true,"description":"Controls whether to skip the network cache for each request","type":"boolean"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"inspectUri":{"default":null,"description":"Format to use to rewrite the inspectUri: It's a template string that interpolates keys in `{curlyBraces}`. Available keys are:\n - `url.*` is the parsed address of the running application. For instance, `{url.port}`, `{url.hostname}`\n - `port` is the debug port that Chrome is listening on.\n - `browserInspectUri` is the inspector URI on the launched browser\n - `browserInspectUriPath` is the path part of the inspector URI on the launched browser (e.g.: \"/devtools/browser/e9ec0098-306e-472a-8133-5e42488929c2\").\n - `wsProtocol` is the hinted websocket protocol. This is set to `wss` if the original URL is `https`, or `ws` otherwise.\n","type":["string","null"]},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pathMapping":{"default":{},"description":"A mapping of URLs/paths to local folders, to resolve scripts in the Browser to scripts on disk","type":"object"},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"perScriptSourcemaps":{"default":"auto","description":"Whether scripts are loaded individually with unique sourcemaps containing the basename of the source file. This can be set to optimize sourcemap handling when dealing with lots of small scripts. If set to \"auto\", we'll detect known cases where this is appropriate.","enum":["yes","no","auto"],"type":"string"},"port":{"default":9229,"description":"Port to use to remote debugging the browser, given as `--remote-debugging-port` when launching the browser.","oneOf":[{"type":"integer"},{"pattern":"^\\${.*}$","type":"string"}],"tags":["setup"]},"resolveSourceMapLocations":{"default":null,"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"restart":{"default":false,"markdownDescription":"Whether to reconnect if the browser connection is closed","type":"boolean"},"server":{"oneOf":[{"additionalProperties":false,"default":{"program":"node my-server.js"},"description":"Configures a web server to start up. Takes the same configuration as the 'node' launch task.","properties":{"args":{"default":[],"description":"Command line arguments passed to the program.\n\nCan be an array of strings or a single string. When the program is launched in a terminal, setting this property to a single string will result in the arguments not being escaped for the shell.","items":{"type":"string"},"tags":["setup"],"type":["array","string"]},"attachSimplePort":{"default":9229,"description":"If set, attaches to the process via the given port. This is generally no longer necessary for Node.js programs and loses the ability to debug child processes, but can be useful in more esoteric scenarios such as with Deno and Docker launches. If set to 0, a random port will be chosen and --inspect-brk added to the launch arguments automatically.","oneOf":[{"type":"integer"},{"pattern":"^\\${.*}$","type":"string"}]},"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"console":{"default":"internalConsole","description":"Where to launch the debug target.","enum":["internalConsole","integratedTerminal","externalTerminal"],"enumDescriptions":["VS Code Debug Console (which doesn't support to read input from a program)","VS Code's integrated terminal","External terminal that can be configured via user settings"],"type":"string"},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","tags":["setup"],"type":"string"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"experimentalNetworking":{"default":"auto","description":"Enable experimental inspection in Node.js. When set to `auto` this is enabled for versions of Node.js that support it. It can be set to `on` or `off` to enable or disable it explicitly.","enum":["auto","on","off"],"type":"string"},"killBehavior":{"default":"forceful","enum":["forceful","polite","none"],"markdownDescription":"Configures how debug processes are killed when stopping the session. Can be:\n\n- forceful (default): forcefully tears down the process tree. Sends SIGKILL on posix, or `taskkill.exe /F` on Windows.\n- polite: gracefully tears down the process tree. It's possible that misbehaving processes continue to run after shutdown in this way. Sends SIGTERM on posix, or `taskkill.exe` with no `/F` (force) flag on Windows.\n- none: no termination will happen.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"profileStartup":{"default":true,"description":"If true, will start profiling as soon as the process launches","type":"boolean"},"program":{"default":"","description":"Absolute path to the program. Generated value is guessed by looking at package.json and opened files. Edit this attribute.","tags":["setup"],"type":"string"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"restart":{"default":true,"description":"Try to reconnect to the program if we lose connection. If set to `true`, we'll try once a second, forever. You can customize the interval and maximum number of attempts by specifying the `delay` and `maxAttempts` in an object instead.","oneOf":[{"type":"boolean"},{"properties":{"delay":{"default":1000,"minimum":0,"type":"number"},"maxAttempts":{"default":10,"minimum":0,"type":"number"}},"type":"object"}]},"runtimeArgs":{"default":[],"description":"Optional arguments passed to the runtime executable.","items":{"type":"string"},"tags":["setup"],"type":"array"},"runtimeExecutable":{"default":"node","markdownDescription":"Runtime to use. Either an absolute path or the name of a runtime available on the PATH. If omitted `node` is assumed.","type":["string","null"]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"runtimeVersion":{"default":"default","markdownDescription":"Version of `node` runtime to use. Requires `nvm`.","type":"string"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"stopOnEntry":{"default":true,"description":"Automatically stop program after launch.","type":["boolean","string"]},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]}},"type":"object"},{"additionalProperties":false,"default":{"program":"npm start"},"description":"JavaScript Debug Terminal","properties":{"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"command":{"default":"npm start","description":"Command to run in the launched terminal. If not provided, the terminal will open without launching a program.","tags":["setup"],"type":["string","null"]},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","docDefault":"localRoot || ${workspaceFolder}","tags":["setup"],"type":"string"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]}},"type":"object"}]},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"targetSelection":{"default":"automatic","enum":["pick","automatic"],"markdownDescription":"Whether to attach to all targets that match the URL filter (\"automatic\") or ask to pick one (\"pick\").","type":"string"},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]},"url":{"default":"http://localhost:8080","description":"Will search for a tab with this exact url and attach to it, if found","tags":["setup"],"type":"string"},"urlFilter":{"default":"","description":"Will search for a page with this url and attach to it, if found. Can have * wildcards.","type":"string"},"vueComponentPaths":{"default":["${workspaceFolder}/**/*.vue"],"description":"A list of file glob patterns to find `*.vue` components. By default, searches the entire workspace. This needs to be specified due to extra lookups that Vue's sourcemaps require in Vue CLI 4. You can disable this special handling by setting this to an empty array.","type":"array"},"webRoot":{"default":"${workspaceFolder}","description":"This specifies the workspace absolute path to the webserver root. Used to resolve paths like `/app.js` to files on disk. Shorthand for a pathMapping for \"/\"","tags":["setup"],"type":"string"}}},"launch":{"properties":{"browserLaunchLocation":{"default":null,"description":"Forces the browser to be launched in one location. In a remote workspace (through ssh or WSL, for example) this can be used to open the browser on the remote machine rather than locally.","oneOf":[{"type":"null"},{"enum":["ui","workspace"],"type":"string"}]},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"cleanUp":{"default":"wholeBrowser","description":"What clean-up to do after the debugging session finishes. Close only the tab being debug, vs. close the whole browser.","enum":["wholeBrowser","onlyTab"],"type":"string"},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":null,"description":"Optional working directory for the runtime executable.","type":"string"},"disableNetworkCache":{"default":true,"description":"Controls whether to skip the network cache for each request","type":"boolean"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"default":{},"description":"Optional dictionary of environment key/value pairs for the browser.","type":"object"},"file":{"default":"${workspaceFolder}/index.html","description":"A local html file to open in the browser","tags":["setup"],"type":"string"},"includeDefaultArgs":{"default":true,"description":"Whether default browser launch arguments (to disable features that may make debugging harder) will be included in the launch.","type":"boolean"},"includeLaunchArgs":{"default":true,"description":"Advanced: whether any default launch/debugging arguments are set on the browser. The debugger will assume the browser will use pipe debugging such as that which is provided with `--remote-debugging-pipe`.","type":"boolean"},"inspectUri":{"default":null,"description":"Format to use to rewrite the inspectUri: It's a template string that interpolates keys in `{curlyBraces}`. Available keys are:\n - `url.*` is the parsed address of the running application. For instance, `{url.port}`, `{url.hostname}`\n - `port` is the debug port that Chrome is listening on.\n - `browserInspectUri` is the inspector URI on the launched browser\n - `browserInspectUriPath` is the path part of the inspector URI on the launched browser (e.g.: \"/devtools/browser/e9ec0098-306e-472a-8133-5e42488929c2\").\n - `wsProtocol` is the hinted websocket protocol. This is set to `wss` if the original URL is `https`, or `ws` otherwise.\n","type":["string","null"]},"killBehavior":{"default":"forceful","enum":["forceful","polite","none"],"markdownDescription":"Configures how browser processes are killed when stopping the session with `cleanUp: wholeBrowser`. Can be:\n\n- forceful (default): forcefully tears down the process tree. Sends SIGKILL on posix, or `taskkill.exe /F` on Windows.\n- polite: gracefully tears down the process tree. It's possible that misbehaving processes continue to run after shutdown in this way. Sends SIGTERM on posix, or `taskkill.exe` with no `/F` (force) flag on Windows.\n- none: no termination will happen.","type":"string"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pathMapping":{"default":{},"description":"A mapping of URLs/paths to local folders, to resolve scripts in the Browser to scripts on disk","type":"object"},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"perScriptSourcemaps":{"default":"auto","description":"Whether scripts are loaded individually with unique sourcemaps containing the basename of the source file. This can be set to optimize sourcemap handling when dealing with lots of small scripts. If set to \"auto\", we'll detect known cases where this is appropriate.","enum":["yes","no","auto"],"type":"string"},"port":{"default":0,"description":"Port for the browser to listen on. Defaults to \"0\", which will cause the browser to be debugged via pipes, which is generally more secure and should be chosen unless you need to attach to the browser from another tool.","type":"number"},"profileStartup":{"default":true,"description":"If true, will start profiling soon as the process launches","type":"boolean"},"resolveSourceMapLocations":{"default":null,"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"runtimeArgs":{"default":[],"description":"Optional arguments passed to the runtime executable.","items":{"type":"string"},"type":"array"},"runtimeExecutable":{"default":"stable","description":"Either 'canary', 'stable', 'custom' or path to the browser executable. Custom means a custom wrapper, custom build or CHROME_PATH environment variable.","type":["string","null"]},"server":{"oneOf":[{"additionalProperties":false,"default":{"program":"node my-server.js"},"description":"Configures a web server to start up. Takes the same configuration as the 'node' launch task.","properties":{"args":{"default":[],"description":"Command line arguments passed to the program.\n\nCan be an array of strings or a single string. When the program is launched in a terminal, setting this property to a single string will result in the arguments not being escaped for the shell.","items":{"type":"string"},"tags":["setup"],"type":["array","string"]},"attachSimplePort":{"default":9229,"description":"If set, attaches to the process via the given port. This is generally no longer necessary for Node.js programs and loses the ability to debug child processes, but can be useful in more esoteric scenarios such as with Deno and Docker launches. If set to 0, a random port will be chosen and --inspect-brk added to the launch arguments automatically.","oneOf":[{"type":"integer"},{"pattern":"^\\${.*}$","type":"string"}]},"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"console":{"default":"internalConsole","description":"Where to launch the debug target.","enum":["internalConsole","integratedTerminal","externalTerminal"],"enumDescriptions":["VS Code Debug Console (which doesn't support to read input from a program)","VS Code's integrated terminal","External terminal that can be configured via user settings"],"type":"string"},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","tags":["setup"],"type":"string"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"experimentalNetworking":{"default":"auto","description":"Enable experimental inspection in Node.js. When set to `auto` this is enabled for versions of Node.js that support it. It can be set to `on` or `off` to enable or disable it explicitly.","enum":["auto","on","off"],"type":"string"},"killBehavior":{"default":"forceful","enum":["forceful","polite","none"],"markdownDescription":"Configures how debug processes are killed when stopping the session. Can be:\n\n- forceful (default): forcefully tears down the process tree. Sends SIGKILL on posix, or `taskkill.exe /F` on Windows.\n- polite: gracefully tears down the process tree. It's possible that misbehaving processes continue to run after shutdown in this way. Sends SIGTERM on posix, or `taskkill.exe` with no `/F` (force) flag on Windows.\n- none: no termination will happen.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"profileStartup":{"default":true,"description":"If true, will start profiling as soon as the process launches","type":"boolean"},"program":{"default":"","description":"Absolute path to the program. Generated value is guessed by looking at package.json and opened files. Edit this attribute.","tags":["setup"],"type":"string"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"restart":{"default":true,"description":"Try to reconnect to the program if we lose connection. If set to `true`, we'll try once a second, forever. You can customize the interval and maximum number of attempts by specifying the `delay` and `maxAttempts` in an object instead.","oneOf":[{"type":"boolean"},{"properties":{"delay":{"default":1000,"minimum":0,"type":"number"},"maxAttempts":{"default":10,"minimum":0,"type":"number"}},"type":"object"}]},"runtimeArgs":{"default":[],"description":"Optional arguments passed to the runtime executable.","items":{"type":"string"},"tags":["setup"],"type":"array"},"runtimeExecutable":{"default":"node","markdownDescription":"Runtime to use. Either an absolute path or the name of a runtime available on the PATH. If omitted `node` is assumed.","type":["string","null"]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"runtimeVersion":{"default":"default","markdownDescription":"Version of `node` runtime to use. Requires `nvm`.","type":"string"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"stopOnEntry":{"default":true,"description":"Automatically stop program after launch.","type":["boolean","string"]},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]}},"type":"object"},{"additionalProperties":false,"default":{"program":"npm start"},"description":"JavaScript Debug Terminal","properties":{"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"command":{"default":"npm start","description":"Command to run in the launched terminal. If not provided, the terminal will open without launching a program.","tags":["setup"],"type":["string","null"]},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","docDefault":"localRoot || ${workspaceFolder}","tags":["setup"],"type":"string"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]}},"type":"object"}]},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]},"url":{"default":"http://localhost:8080","description":"Will search for a tab with this exact url and attach to it, if found","tags":["setup"],"type":"string"},"urlFilter":{"default":"","description":"Will search for a page with this url and attach to it, if found. Can have * wildcards.","type":"string"},"userDataDir":{"default":true,"description":"By default, the browser is launched with a separate user profile in a temp folder. Use this option to override it. Set to false to launch with your default user profile. A new browser can't be launched if an instance is already running from `userDataDir`.","type":["string","boolean"]},"vueComponentPaths":{"default":["${workspaceFolder}/**/*.vue"],"description":"A list of file glob patterns to find `*.vue` components. By default, searches the entire workspace. This needs to be specified due to extra lookups that Vue's sourcemaps require in Vue CLI 4. You can disable this special handling by setting this to an empty array.","type":"array"},"webRoot":{"default":"${workspaceFolder}","description":"This specifies the workspace absolute path to the webserver root. Used to resolve paths like `/app.js` to files on disk. Shorthand for a pathMapping for \"/\"","tags":["setup"],"type":"string"}}}},"configurationSnippets":[{"body":{"name":"Launch Chrome","request":"launch","type":"chrome","url":"http://localhost:8080","webRoot":"^\"${2:\\${workspaceFolder\\}}\""},"description":"Launch Chrome to debug a URL","label":"Chrome: Launch"},{"body":{"name":"Attach to Chrome","port":9222,"request":"attach","type":"chrome","webRoot":"^\"${2:\\${workspaceFolder\\}}\""},"description":"Attach to an instance of Chrome already in debug mode","label":"Chrome: Attach"}],"label":"Web App (Chrome)","strings":{"unverifiedBreakpoints":"Some of your breakpoints could not be set. If you're having an issue, you can [troubleshoot your launch configuration](command:extension.js-debug.createDiagnostics)."},"type":"chrome"},{"aiKey":"0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255","configurationAttributes":{"attach":{"properties":{"address":{"default":"localhost","description":"IP address or hostname the debugged browser is listening on.","type":"string"},"browserAttachLocation":{"default":null,"description":"Forces the browser to attach in one location. In a remote workspace (through ssh or WSL, for example) this can be used to attach to a browser on the remote machine rather than locally.","oneOf":[{"type":"null"},{"enum":["ui","workspace"],"type":"string"}]},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"disableNetworkCache":{"default":true,"description":"Controls whether to skip the network cache for each request","type":"boolean"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"inspectUri":{"default":null,"description":"Format to use to rewrite the inspectUri: It's a template string that interpolates keys in `{curlyBraces}`. Available keys are:\n - `url.*` is the parsed address of the running application. For instance, `{url.port}`, `{url.hostname}`\n - `port` is the debug port that Chrome is listening on.\n - `browserInspectUri` is the inspector URI on the launched browser\n - `browserInspectUriPath` is the path part of the inspector URI on the launched browser (e.g.: \"/devtools/browser/e9ec0098-306e-472a-8133-5e42488929c2\").\n - `wsProtocol` is the hinted websocket protocol. This is set to `wss` if the original URL is `https`, or `ws` otherwise.\n","type":["string","null"]},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pathMapping":{"default":{},"description":"A mapping of URLs/paths to local folders, to resolve scripts in the Browser to scripts on disk","type":"object"},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"perScriptSourcemaps":{"default":"auto","description":"Whether scripts are loaded individually with unique sourcemaps containing the basename of the source file. This can be set to optimize sourcemap handling when dealing with lots of small scripts. If set to \"auto\", we'll detect known cases where this is appropriate.","enum":["yes","no","auto"],"type":"string"},"port":{"default":9229,"description":"Port to use to remote debugging the browser, given as `--remote-debugging-port` when launching the browser.","oneOf":[{"type":"integer"},{"pattern":"^\\${.*}$","type":"string"}],"tags":["setup"]},"resolveSourceMapLocations":{"default":null,"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"restart":{"default":false,"markdownDescription":"Whether to reconnect if the browser connection is closed","type":"boolean"},"server":{"oneOf":[{"additionalProperties":false,"default":{"program":"node my-server.js"},"description":"Configures a web server to start up. Takes the same configuration as the 'node' launch task.","properties":{"args":{"default":[],"description":"Command line arguments passed to the program.\n\nCan be an array of strings or a single string. When the program is launched in a terminal, setting this property to a single string will result in the arguments not being escaped for the shell.","items":{"type":"string"},"tags":["setup"],"type":["array","string"]},"attachSimplePort":{"default":9229,"description":"If set, attaches to the process via the given port. This is generally no longer necessary for Node.js programs and loses the ability to debug child processes, but can be useful in more esoteric scenarios such as with Deno and Docker launches. If set to 0, a random port will be chosen and --inspect-brk added to the launch arguments automatically.","oneOf":[{"type":"integer"},{"pattern":"^\\${.*}$","type":"string"}]},"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"console":{"default":"internalConsole","description":"Where to launch the debug target.","enum":["internalConsole","integratedTerminal","externalTerminal"],"enumDescriptions":["VS Code Debug Console (which doesn't support to read input from a program)","VS Code's integrated terminal","External terminal that can be configured via user settings"],"type":"string"},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","tags":["setup"],"type":"string"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"experimentalNetworking":{"default":"auto","description":"Enable experimental inspection in Node.js. When set to `auto` this is enabled for versions of Node.js that support it. It can be set to `on` or `off` to enable or disable it explicitly.","enum":["auto","on","off"],"type":"string"},"killBehavior":{"default":"forceful","enum":["forceful","polite","none"],"markdownDescription":"Configures how debug processes are killed when stopping the session. Can be:\n\n- forceful (default): forcefully tears down the process tree. Sends SIGKILL on posix, or `taskkill.exe /F` on Windows.\n- polite: gracefully tears down the process tree. It's possible that misbehaving processes continue to run after shutdown in this way. Sends SIGTERM on posix, or `taskkill.exe` with no `/F` (force) flag on Windows.\n- none: no termination will happen.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"profileStartup":{"default":true,"description":"If true, will start profiling as soon as the process launches","type":"boolean"},"program":{"default":"","description":"Absolute path to the program. Generated value is guessed by looking at package.json and opened files. Edit this attribute.","tags":["setup"],"type":"string"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"restart":{"default":true,"description":"Try to reconnect to the program if we lose connection. If set to `true`, we'll try once a second, forever. You can customize the interval and maximum number of attempts by specifying the `delay` and `maxAttempts` in an object instead.","oneOf":[{"type":"boolean"},{"properties":{"delay":{"default":1000,"minimum":0,"type":"number"},"maxAttempts":{"default":10,"minimum":0,"type":"number"}},"type":"object"}]},"runtimeArgs":{"default":[],"description":"Optional arguments passed to the runtime executable.","items":{"type":"string"},"tags":["setup"],"type":"array"},"runtimeExecutable":{"default":"node","markdownDescription":"Runtime to use. Either an absolute path or the name of a runtime available on the PATH. If omitted `node` is assumed.","type":["string","null"]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"runtimeVersion":{"default":"default","markdownDescription":"Version of `node` runtime to use. Requires `nvm`.","type":"string"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"stopOnEntry":{"default":true,"description":"Automatically stop program after launch.","type":["boolean","string"]},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]}},"type":"object"},{"additionalProperties":false,"default":{"program":"npm start"},"description":"JavaScript Debug Terminal","properties":{"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"command":{"default":"npm start","description":"Command to run in the launched terminal. If not provided, the terminal will open without launching a program.","tags":["setup"],"type":["string","null"]},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","docDefault":"localRoot || ${workspaceFolder}","tags":["setup"],"type":"string"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]}},"type":"object"}]},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"targetSelection":{"default":"automatic","enum":["pick","automatic"],"markdownDescription":"Whether to attach to all targets that match the URL filter (\"automatic\") or ask to pick one (\"pick\").","type":"string"},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]},"url":{"default":"http://localhost:8080","description":"Will search for a tab with this exact url and attach to it, if found","tags":["setup"],"type":"string"},"urlFilter":{"default":"","description":"Will search for a page with this url and attach to it, if found. Can have * wildcards.","type":"string"},"useWebView":{"default":{"pipeName":"MyPipeName"},"description":"An object containing the `pipeName` of a debug pipe for a UWP hosted Webview2. This is the \"MyTestSharedMemory\" when creating the pipe \"\\\\.\\pipe\\LOCAL\\MyTestSharedMemory\"","properties":{"pipeName":{"type":"string"}},"type":"object"},"vueComponentPaths":{"default":["${workspaceFolder}/**/*.vue"],"description":"A list of file glob patterns to find `*.vue` components. By default, searches the entire workspace. This needs to be specified due to extra lookups that Vue's sourcemaps require in Vue CLI 4. You can disable this special handling by setting this to an empty array.","type":"array"},"webRoot":{"default":"${workspaceFolder}","description":"This specifies the workspace absolute path to the webserver root. Used to resolve paths like `/app.js` to files on disk. Shorthand for a pathMapping for \"/\"","tags":["setup"],"type":"string"}}},"launch":{"properties":{"address":{"default":"localhost","description":"When debugging webviews, the IP address or hostname the webview is listening on. Will be automatically discovered if not set.","type":"string"},"browserLaunchLocation":{"default":null,"description":"Forces the browser to be launched in one location. In a remote workspace (through ssh or WSL, for example) this can be used to open the browser on the remote machine rather than locally.","oneOf":[{"type":"null"},{"enum":["ui","workspace"],"type":"string"}]},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"cleanUp":{"default":"wholeBrowser","description":"What clean-up to do after the debugging session finishes. Close only the tab being debug, vs. close the whole browser.","enum":["wholeBrowser","onlyTab"],"type":"string"},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":null,"description":"Optional working directory for the runtime executable.","type":"string"},"disableNetworkCache":{"default":true,"description":"Controls whether to skip the network cache for each request","type":"boolean"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"default":{},"description":"Optional dictionary of environment key/value pairs for the browser.","type":"object"},"file":{"default":"${workspaceFolder}/index.html","description":"A local html file to open in the browser","tags":["setup"],"type":"string"},"includeDefaultArgs":{"default":true,"description":"Whether default browser launch arguments (to disable features that may make debugging harder) will be included in the launch.","type":"boolean"},"includeLaunchArgs":{"default":true,"description":"Advanced: whether any default launch/debugging arguments are set on the browser. The debugger will assume the browser will use pipe debugging such as that which is provided with `--remote-debugging-pipe`.","type":"boolean"},"inspectUri":{"default":null,"description":"Format to use to rewrite the inspectUri: It's a template string that interpolates keys in `{curlyBraces}`. Available keys are:\n - `url.*` is the parsed address of the running application. For instance, `{url.port}`, `{url.hostname}`\n - `port` is the debug port that Chrome is listening on.\n - `browserInspectUri` is the inspector URI on the launched browser\n - `browserInspectUriPath` is the path part of the inspector URI on the launched browser (e.g.: \"/devtools/browser/e9ec0098-306e-472a-8133-5e42488929c2\").\n - `wsProtocol` is the hinted websocket protocol. This is set to `wss` if the original URL is `https`, or `ws` otherwise.\n","type":["string","null"]},"killBehavior":{"default":"forceful","enum":["forceful","polite","none"],"markdownDescription":"Configures how browser processes are killed when stopping the session with `cleanUp: wholeBrowser`. Can be:\n\n- forceful (default): forcefully tears down the process tree. Sends SIGKILL on posix, or `taskkill.exe /F` on Windows.\n- polite: gracefully tears down the process tree. It's possible that misbehaving processes continue to run after shutdown in this way. Sends SIGTERM on posix, or `taskkill.exe` with no `/F` (force) flag on Windows.\n- none: no termination will happen.","type":"string"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pathMapping":{"default":{},"description":"A mapping of URLs/paths to local folders, to resolve scripts in the Browser to scripts on disk","type":"object"},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"perScriptSourcemaps":{"default":"auto","description":"Whether scripts are loaded individually with unique sourcemaps containing the basename of the source file. This can be set to optimize sourcemap handling when dealing with lots of small scripts. If set to \"auto\", we'll detect known cases where this is appropriate.","enum":["yes","no","auto"],"type":"string"},"port":{"default":9229,"description":"When debugging webviews, the port the webview debugger is listening on. Will be automatically discovered if not set.","type":"number"},"profileStartup":{"default":true,"description":"If true, will start profiling soon as the process launches","type":"boolean"},"resolveSourceMapLocations":{"default":null,"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"runtimeArgs":{"default":[],"description":"Optional arguments passed to the runtime executable.","items":{"type":"string"},"type":"array"},"runtimeExecutable":{"default":"stable","description":"Either 'canary', 'stable', 'dev', 'custom' or path to the browser executable. Custom means a custom wrapper, custom build or EDGE_PATH environment variable.","type":["string","null"]},"server":{"oneOf":[{"additionalProperties":false,"default":{"program":"node my-server.js"},"description":"Configures a web server to start up. Takes the same configuration as the 'node' launch task.","properties":{"args":{"default":[],"description":"Command line arguments passed to the program.\n\nCan be an array of strings or a single string. When the program is launched in a terminal, setting this property to a single string will result in the arguments not being escaped for the shell.","items":{"type":"string"},"tags":["setup"],"type":["array","string"]},"attachSimplePort":{"default":9229,"description":"If set, attaches to the process via the given port. This is generally no longer necessary for Node.js programs and loses the ability to debug child processes, but can be useful in more esoteric scenarios such as with Deno and Docker launches. If set to 0, a random port will be chosen and --inspect-brk added to the launch arguments automatically.","oneOf":[{"type":"integer"},{"pattern":"^\\${.*}$","type":"string"}]},"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"console":{"default":"internalConsole","description":"Where to launch the debug target.","enum":["internalConsole","integratedTerminal","externalTerminal"],"enumDescriptions":["VS Code Debug Console (which doesn't support to read input from a program)","VS Code's integrated terminal","External terminal that can be configured via user settings"],"type":"string"},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","tags":["setup"],"type":"string"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"experimentalNetworking":{"default":"auto","description":"Enable experimental inspection in Node.js. When set to `auto` this is enabled for versions of Node.js that support it. It can be set to `on` or `off` to enable or disable it explicitly.","enum":["auto","on","off"],"type":"string"},"killBehavior":{"default":"forceful","enum":["forceful","polite","none"],"markdownDescription":"Configures how debug processes are killed when stopping the session. Can be:\n\n- forceful (default): forcefully tears down the process tree. Sends SIGKILL on posix, or `taskkill.exe /F` on Windows.\n- polite: gracefully tears down the process tree. It's possible that misbehaving processes continue to run after shutdown in this way. Sends SIGTERM on posix, or `taskkill.exe` with no `/F` (force) flag on Windows.\n- none: no termination will happen.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"profileStartup":{"default":true,"description":"If true, will start profiling as soon as the process launches","type":"boolean"},"program":{"default":"","description":"Absolute path to the program. Generated value is guessed by looking at package.json and opened files. Edit this attribute.","tags":["setup"],"type":"string"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"restart":{"default":true,"description":"Try to reconnect to the program if we lose connection. If set to `true`, we'll try once a second, forever. You can customize the interval and maximum number of attempts by specifying the `delay` and `maxAttempts` in an object instead.","oneOf":[{"type":"boolean"},{"properties":{"delay":{"default":1000,"minimum":0,"type":"number"},"maxAttempts":{"default":10,"minimum":0,"type":"number"}},"type":"object"}]},"runtimeArgs":{"default":[],"description":"Optional arguments passed to the runtime executable.","items":{"type":"string"},"tags":["setup"],"type":"array"},"runtimeExecutable":{"default":"node","markdownDescription":"Runtime to use. Either an absolute path or the name of a runtime available on the PATH. If omitted `node` is assumed.","type":["string","null"]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"runtimeVersion":{"default":"default","markdownDescription":"Version of `node` runtime to use. Requires `nvm`.","type":"string"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"stopOnEntry":{"default":true,"description":"Automatically stop program after launch.","type":["boolean","string"]},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]}},"type":"object"},{"additionalProperties":false,"default":{"program":"npm start"},"description":"JavaScript Debug Terminal","properties":{"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"command":{"default":"npm start","description":"Command to run in the launched terminal. If not provided, the terminal will open without launching a program.","tags":["setup"],"type":["string","null"]},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","docDefault":"localRoot || ${workspaceFolder}","tags":["setup"],"type":"string"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]}},"type":"object"}]},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]},"url":{"default":"http://localhost:8080","description":"Will search for a tab with this exact url and attach to it, if found","tags":["setup"],"type":"string"},"urlFilter":{"default":"","description":"Will search for a page with this url and attach to it, if found. Can have * wildcards.","type":"string"},"useWebView":{"default":false,"description":"When 'true', the debugger will treat the runtime executable as a host application that contains a WebView allowing you to debug the WebView script content.","type":"boolean"},"userDataDir":{"default":true,"description":"By default, the browser is launched with a separate user profile in a temp folder. Use this option to override it. Set to false to launch with your default user profile. A new browser can't be launched if an instance is already running from `userDataDir`.","type":["string","boolean"]},"vueComponentPaths":{"default":["${workspaceFolder}/**/*.vue"],"description":"A list of file glob patterns to find `*.vue` components. By default, searches the entire workspace. This needs to be specified due to extra lookups that Vue's sourcemaps require in Vue CLI 4. You can disable this special handling by setting this to an empty array.","type":"array"},"webRoot":{"default":"${workspaceFolder}","description":"This specifies the workspace absolute path to the webserver root. Used to resolve paths like `/app.js` to files on disk. Shorthand for a pathMapping for \"/\"","tags":["setup"],"type":"string"}}}},"configurationSnippets":[],"deprecated":"Please use type msedge instead","label":"Web App (Edge)","languages":["javascript","typescript","javascriptreact","typescriptreact","html","css","coffeescript","handlebars","vue"],"strings":{"unverifiedBreakpoints":"Some of your breakpoints could not be set. If you're having an issue, you can [troubleshoot your launch configuration](command:extension.js-debug.createDiagnostics)."},"type":"pwa-msedge"},{"aiKey":"0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255","configurationAttributes":{"attach":{"properties":{"address":{"default":"localhost","description":"IP address or hostname the debugged browser is listening on.","type":"string"},"browserAttachLocation":{"default":null,"description":"Forces the browser to attach in one location. In a remote workspace (through ssh or WSL, for example) this can be used to attach to a browser on the remote machine rather than locally.","oneOf":[{"type":"null"},{"enum":["ui","workspace"],"type":"string"}]},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"disableNetworkCache":{"default":true,"description":"Controls whether to skip the network cache for each request","type":"boolean"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"inspectUri":{"default":null,"description":"Format to use to rewrite the inspectUri: It's a template string that interpolates keys in `{curlyBraces}`. Available keys are:\n - `url.*` is the parsed address of the running application. For instance, `{url.port}`, `{url.hostname}`\n - `port` is the debug port that Chrome is listening on.\n - `browserInspectUri` is the inspector URI on the launched browser\n - `browserInspectUriPath` is the path part of the inspector URI on the launched browser (e.g.: \"/devtools/browser/e9ec0098-306e-472a-8133-5e42488929c2\").\n - `wsProtocol` is the hinted websocket protocol. This is set to `wss` if the original URL is `https`, or `ws` otherwise.\n","type":["string","null"]},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pathMapping":{"default":{},"description":"A mapping of URLs/paths to local folders, to resolve scripts in the Browser to scripts on disk","type":"object"},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"perScriptSourcemaps":{"default":"auto","description":"Whether scripts are loaded individually with unique sourcemaps containing the basename of the source file. This can be set to optimize sourcemap handling when dealing with lots of small scripts. If set to \"auto\", we'll detect known cases where this is appropriate.","enum":["yes","no","auto"],"type":"string"},"port":{"default":9229,"description":"Port to use to remote debugging the browser, given as `--remote-debugging-port` when launching the browser.","oneOf":[{"type":"integer"},{"pattern":"^\\${.*}$","type":"string"}],"tags":["setup"]},"resolveSourceMapLocations":{"default":null,"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"restart":{"default":false,"markdownDescription":"Whether to reconnect if the browser connection is closed","type":"boolean"},"server":{"oneOf":[{"additionalProperties":false,"default":{"program":"node my-server.js"},"description":"Configures a web server to start up. Takes the same configuration as the 'node' launch task.","properties":{"args":{"default":[],"description":"Command line arguments passed to the program.\n\nCan be an array of strings or a single string. When the program is launched in a terminal, setting this property to a single string will result in the arguments not being escaped for the shell.","items":{"type":"string"},"tags":["setup"],"type":["array","string"]},"attachSimplePort":{"default":9229,"description":"If set, attaches to the process via the given port. This is generally no longer necessary for Node.js programs and loses the ability to debug child processes, but can be useful in more esoteric scenarios such as with Deno and Docker launches. If set to 0, a random port will be chosen and --inspect-brk added to the launch arguments automatically.","oneOf":[{"type":"integer"},{"pattern":"^\\${.*}$","type":"string"}]},"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"console":{"default":"internalConsole","description":"Where to launch the debug target.","enum":["internalConsole","integratedTerminal","externalTerminal"],"enumDescriptions":["VS Code Debug Console (which doesn't support to read input from a program)","VS Code's integrated terminal","External terminal that can be configured via user settings"],"type":"string"},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","tags":["setup"],"type":"string"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"experimentalNetworking":{"default":"auto","description":"Enable experimental inspection in Node.js. When set to `auto` this is enabled for versions of Node.js that support it. It can be set to `on` or `off` to enable or disable it explicitly.","enum":["auto","on","off"],"type":"string"},"killBehavior":{"default":"forceful","enum":["forceful","polite","none"],"markdownDescription":"Configures how debug processes are killed when stopping the session. Can be:\n\n- forceful (default): forcefully tears down the process tree. Sends SIGKILL on posix, or `taskkill.exe /F` on Windows.\n- polite: gracefully tears down the process tree. It's possible that misbehaving processes continue to run after shutdown in this way. Sends SIGTERM on posix, or `taskkill.exe` with no `/F` (force) flag on Windows.\n- none: no termination will happen.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"profileStartup":{"default":true,"description":"If true, will start profiling as soon as the process launches","type":"boolean"},"program":{"default":"","description":"Absolute path to the program. Generated value is guessed by looking at package.json and opened files. Edit this attribute.","tags":["setup"],"type":"string"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"restart":{"default":true,"description":"Try to reconnect to the program if we lose connection. If set to `true`, we'll try once a second, forever. You can customize the interval and maximum number of attempts by specifying the `delay` and `maxAttempts` in an object instead.","oneOf":[{"type":"boolean"},{"properties":{"delay":{"default":1000,"minimum":0,"type":"number"},"maxAttempts":{"default":10,"minimum":0,"type":"number"}},"type":"object"}]},"runtimeArgs":{"default":[],"description":"Optional arguments passed to the runtime executable.","items":{"type":"string"},"tags":["setup"],"type":"array"},"runtimeExecutable":{"default":"node","markdownDescription":"Runtime to use. Either an absolute path or the name of a runtime available on the PATH. If omitted `node` is assumed.","type":["string","null"]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"runtimeVersion":{"default":"default","markdownDescription":"Version of `node` runtime to use. Requires `nvm`.","type":"string"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"stopOnEntry":{"default":true,"description":"Automatically stop program after launch.","type":["boolean","string"]},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]}},"type":"object"},{"additionalProperties":false,"default":{"program":"npm start"},"description":"JavaScript Debug Terminal","properties":{"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"command":{"default":"npm start","description":"Command to run in the launched terminal. If not provided, the terminal will open without launching a program.","tags":["setup"],"type":["string","null"]},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","docDefault":"localRoot || ${workspaceFolder}","tags":["setup"],"type":"string"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]}},"type":"object"}]},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"targetSelection":{"default":"automatic","enum":["pick","automatic"],"markdownDescription":"Whether to attach to all targets that match the URL filter (\"automatic\") or ask to pick one (\"pick\").","type":"string"},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]},"url":{"default":"http://localhost:8080","description":"Will search for a tab with this exact url and attach to it, if found","tags":["setup"],"type":"string"},"urlFilter":{"default":"","description":"Will search for a page with this url and attach to it, if found. Can have * wildcards.","type":"string"},"useWebView":{"default":{"pipeName":"MyPipeName"},"description":"An object containing the `pipeName` of a debug pipe for a UWP hosted Webview2. This is the \"MyTestSharedMemory\" when creating the pipe \"\\\\.\\pipe\\LOCAL\\MyTestSharedMemory\"","properties":{"pipeName":{"type":"string"}},"type":"object"},"vueComponentPaths":{"default":["${workspaceFolder}/**/*.vue"],"description":"A list of file glob patterns to find `*.vue` components. By default, searches the entire workspace. This needs to be specified due to extra lookups that Vue's sourcemaps require in Vue CLI 4. You can disable this special handling by setting this to an empty array.","type":"array"},"webRoot":{"default":"${workspaceFolder}","description":"This specifies the workspace absolute path to the webserver root. Used to resolve paths like `/app.js` to files on disk. Shorthand for a pathMapping for \"/\"","tags":["setup"],"type":"string"}}},"launch":{"properties":{"address":{"default":"localhost","description":"When debugging webviews, the IP address or hostname the webview is listening on. Will be automatically discovered if not set.","type":"string"},"browserLaunchLocation":{"default":null,"description":"Forces the browser to be launched in one location. In a remote workspace (through ssh or WSL, for example) this can be used to open the browser on the remote machine rather than locally.","oneOf":[{"type":"null"},{"enum":["ui","workspace"],"type":"string"}]},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"cleanUp":{"default":"wholeBrowser","description":"What clean-up to do after the debugging session finishes. Close only the tab being debug, vs. close the whole browser.","enum":["wholeBrowser","onlyTab"],"type":"string"},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":null,"description":"Optional working directory for the runtime executable.","type":"string"},"disableNetworkCache":{"default":true,"description":"Controls whether to skip the network cache for each request","type":"boolean"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"default":{},"description":"Optional dictionary of environment key/value pairs for the browser.","type":"object"},"file":{"default":"${workspaceFolder}/index.html","description":"A local html file to open in the browser","tags":["setup"],"type":"string"},"includeDefaultArgs":{"default":true,"description":"Whether default browser launch arguments (to disable features that may make debugging harder) will be included in the launch.","type":"boolean"},"includeLaunchArgs":{"default":true,"description":"Advanced: whether any default launch/debugging arguments are set on the browser. The debugger will assume the browser will use pipe debugging such as that which is provided with `--remote-debugging-pipe`.","type":"boolean"},"inspectUri":{"default":null,"description":"Format to use to rewrite the inspectUri: It's a template string that interpolates keys in `{curlyBraces}`. Available keys are:\n - `url.*` is the parsed address of the running application. For instance, `{url.port}`, `{url.hostname}`\n - `port` is the debug port that Chrome is listening on.\n - `browserInspectUri` is the inspector URI on the launched browser\n - `browserInspectUriPath` is the path part of the inspector URI on the launched browser (e.g.: \"/devtools/browser/e9ec0098-306e-472a-8133-5e42488929c2\").\n - `wsProtocol` is the hinted websocket protocol. This is set to `wss` if the original URL is `https`, or `ws` otherwise.\n","type":["string","null"]},"killBehavior":{"default":"forceful","enum":["forceful","polite","none"],"markdownDescription":"Configures how browser processes are killed when stopping the session with `cleanUp: wholeBrowser`. Can be:\n\n- forceful (default): forcefully tears down the process tree. Sends SIGKILL on posix, or `taskkill.exe /F` on Windows.\n- polite: gracefully tears down the process tree. It's possible that misbehaving processes continue to run after shutdown in this way. Sends SIGTERM on posix, or `taskkill.exe` with no `/F` (force) flag on Windows.\n- none: no termination will happen.","type":"string"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pathMapping":{"default":{},"description":"A mapping of URLs/paths to local folders, to resolve scripts in the Browser to scripts on disk","type":"object"},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"perScriptSourcemaps":{"default":"auto","description":"Whether scripts are loaded individually with unique sourcemaps containing the basename of the source file. This can be set to optimize sourcemap handling when dealing with lots of small scripts. If set to \"auto\", we'll detect known cases where this is appropriate.","enum":["yes","no","auto"],"type":"string"},"port":{"default":9229,"description":"When debugging webviews, the port the webview debugger is listening on. Will be automatically discovered if not set.","type":"number"},"profileStartup":{"default":true,"description":"If true, will start profiling soon as the process launches","type":"boolean"},"resolveSourceMapLocations":{"default":null,"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"runtimeArgs":{"default":[],"description":"Optional arguments passed to the runtime executable.","items":{"type":"string"},"type":"array"},"runtimeExecutable":{"default":"stable","description":"Either 'canary', 'stable', 'dev', 'custom' or path to the browser executable. Custom means a custom wrapper, custom build or EDGE_PATH environment variable.","type":["string","null"]},"server":{"oneOf":[{"additionalProperties":false,"default":{"program":"node my-server.js"},"description":"Configures a web server to start up. Takes the same configuration as the 'node' launch task.","properties":{"args":{"default":[],"description":"Command line arguments passed to the program.\n\nCan be an array of strings or a single string. When the program is launched in a terminal, setting this property to a single string will result in the arguments not being escaped for the shell.","items":{"type":"string"},"tags":["setup"],"type":["array","string"]},"attachSimplePort":{"default":9229,"description":"If set, attaches to the process via the given port. This is generally no longer necessary for Node.js programs and loses the ability to debug child processes, but can be useful in more esoteric scenarios such as with Deno and Docker launches. If set to 0, a random port will be chosen and --inspect-brk added to the launch arguments automatically.","oneOf":[{"type":"integer"},{"pattern":"^\\${.*}$","type":"string"}]},"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"console":{"default":"internalConsole","description":"Where to launch the debug target.","enum":["internalConsole","integratedTerminal","externalTerminal"],"enumDescriptions":["VS Code Debug Console (which doesn't support to read input from a program)","VS Code's integrated terminal","External terminal that can be configured via user settings"],"type":"string"},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","tags":["setup"],"type":"string"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"experimentalNetworking":{"default":"auto","description":"Enable experimental inspection in Node.js. When set to `auto` this is enabled for versions of Node.js that support it. It can be set to `on` or `off` to enable or disable it explicitly.","enum":["auto","on","off"],"type":"string"},"killBehavior":{"default":"forceful","enum":["forceful","polite","none"],"markdownDescription":"Configures how debug processes are killed when stopping the session. Can be:\n\n- forceful (default): forcefully tears down the process tree. Sends SIGKILL on posix, or `taskkill.exe /F` on Windows.\n- polite: gracefully tears down the process tree. It's possible that misbehaving processes continue to run after shutdown in this way. Sends SIGTERM on posix, or `taskkill.exe` with no `/F` (force) flag on Windows.\n- none: no termination will happen.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"profileStartup":{"default":true,"description":"If true, will start profiling as soon as the process launches","type":"boolean"},"program":{"default":"","description":"Absolute path to the program. Generated value is guessed by looking at package.json and opened files. Edit this attribute.","tags":["setup"],"type":"string"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"restart":{"default":true,"description":"Try to reconnect to the program if we lose connection. If set to `true`, we'll try once a second, forever. You can customize the interval and maximum number of attempts by specifying the `delay` and `maxAttempts` in an object instead.","oneOf":[{"type":"boolean"},{"properties":{"delay":{"default":1000,"minimum":0,"type":"number"},"maxAttempts":{"default":10,"minimum":0,"type":"number"}},"type":"object"}]},"runtimeArgs":{"default":[],"description":"Optional arguments passed to the runtime executable.","items":{"type":"string"},"tags":["setup"],"type":"array"},"runtimeExecutable":{"default":"node","markdownDescription":"Runtime to use. Either an absolute path or the name of a runtime available on the PATH. If omitted `node` is assumed.","type":["string","null"]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"runtimeVersion":{"default":"default","markdownDescription":"Version of `node` runtime to use. Requires `nvm`.","type":"string"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"stopOnEntry":{"default":true,"description":"Automatically stop program after launch.","type":["boolean","string"]},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]}},"type":"object"},{"additionalProperties":false,"default":{"program":"npm start"},"description":"JavaScript Debug Terminal","properties":{"autoAttachChildProcesses":{"default":true,"description":"Attach debugger to new child processes automatically.","type":"boolean"},"cascadeTerminateToConfigurations":{"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped.","items":{"type":"string","uniqueItems":true},"type":"array"},"command":{"default":"npm start","description":"Command to run in the launched terminal. If not provided, the terminal will open without launching a program.","tags":["setup"],"type":["string","null"]},"customDescriptionGenerator":{"description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n ","type":"string"},"customPropertiesGenerator":{"deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181","type":"string"},"cwd":{"default":"${workspaceFolder}","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","docDefault":"localRoot || ${workspaceFolder}","tags":["setup"],"type":"string"},"enableContentValidation":{"default":true,"description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example.","type":"boolean"},"enableDWARF":{"default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function.","type":"boolean"},"env":{"additionalProperties":{"type":["string","null"]},"default":{},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","tags":["setup"],"type":"object"},"envFile":{"default":"${workspaceFolder}/.env","description":"Absolute path to a file containing environment variable definitions.","type":"string"},"localRoot":{"default":null,"description":"Path to the local directory containing the program.","type":["string","null"]},"nodeVersionHint":{"default":12,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","minimum":8,"type":"number"},"outFiles":{"default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","items":{"type":"string"},"tags":["setup"],"type":["array"]},"outputCapture":{"default":"console","enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`."},"pauseForSourceMap":{"default":false,"markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","type":"boolean"},"remoteRoot":{"default":null,"description":"Absolute path to the remote directory containing the program.","type":["string","null"]},"resolveSourceMapLocations":{"default":["${workspaceFolder}/**","!**/node_modules/**"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","items":{"type":"string"},"type":["array","null"]},"runtimeSourcemapPausePatterns":{"default":[],"items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","type":"array"},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]}},"type":"object"}]},"showAsyncStacks":{"default":true,"description":"Show the async calls that led to the current call stack.","oneOf":[{"type":"boolean"},{"properties":{"onAttach":{"default":32,"type":"number"}},"required":["onAttach"],"type":"object"},{"properties":{"onceBreakpointResolved":{"default":32,"type":"number"}},"required":["onceBreakpointResolved"],"type":"object"}]},"skipFiles":{"default":["${/**"],"description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","type":"array"},"smartStep":{"default":true,"description":"Automatically step through generated code that cannot be mapped back to the original source.","type":"boolean"},"sourceMapPathOverrides":{"default":{"meteor://💻app/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","webpack://?:*/*":"${workspaceFolder}/*"},"description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","type":"object"},"sourceMapRenames":{"default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers.","type":"boolean"},"sourceMaps":{"default":true,"description":"Use JavaScript source maps (if they exist).","type":"boolean"},"timeout":{"default":10000,"description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","type":"number"},"timeouts":{"additionalProperties":false,"default":{},"description":"Timeouts for several debugger operations.","markdownDescription":"Timeouts for several debugger operations.","properties":{"hoverEvaluation":{"default":500,"description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","type":"number"},"sourceMapCumulativePause":{"default":1000,"description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","type":"number"},"sourceMapMinPause":{"default":1000,"description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","type":"number"}},"type":"object"},"trace":{"default":true,"description":"Configures what diagnostic output is produced.","oneOf":[{"description":"Trace may be set to 'true' to write diagnostic logs to the disk.","type":"boolean"},{"additionalProperties":false,"properties":{"logFile":{"description":"Configures where on disk logs are written.","type":["string","null"]},"stdio":{"description":"Whether to return trace data from the launched application or browser.","type":"boolean"}},"type":"object"}]},"url":{"default":"http://localhost:8080","description":"Will search for a tab with this exact url and attach to it, if found","tags":["setup"],"type":"string"},"urlFilter":{"default":"","description":"Will search for a page with this url and attach to it, if found. Can have * wildcards.","type":"string"},"useWebView":{"default":false,"description":"When 'true', the debugger will treat the runtime executable as a host application that contains a WebView allowing you to debug the WebView script content.","type":"boolean"},"userDataDir":{"default":true,"description":"By default, the browser is launched with a separate user profile in a temp folder. Use this option to override it. Set to false to launch with your default user profile. A new browser can't be launched if an instance is already running from `userDataDir`.","type":["string","boolean"]},"vueComponentPaths":{"default":["${workspaceFolder}/**/*.vue"],"description":"A list of file glob patterns to find `*.vue` components. By default, searches the entire workspace. This needs to be specified due to extra lookups that Vue's sourcemaps require in Vue CLI 4. You can disable this special handling by setting this to an empty array.","type":"array"},"webRoot":{"default":"${workspaceFolder}","description":"This specifies the workspace absolute path to the webserver root. Used to resolve paths like `/app.js` to files on disk. Shorthand for a pathMapping for \"/\"","tags":["setup"],"type":"string"}}}},"configurationSnippets":[{"body":{"name":"Launch Edge","request":"launch","type":"msedge","url":"http://localhost:8080","webRoot":"^\"${2:\\${workspaceFolder\\}}\""},"description":"Launch Edge to debug a URL","label":"Edge: Launch"},{"body":{"name":"Attach to Edge","port":9222,"request":"attach","type":"msedge","webRoot":"^\"${2:\\${workspaceFolder\\}}\""},"description":"Attach to an instance of Edge already in debug mode","label":"Edge: Attach"}],"label":"Web App (Edge)","strings":{"unverifiedBreakpoints":"Some of your breakpoints could not be set. If you're having an issue, you can [troubleshoot your launch configuration](command:extension.js-debug.createDiagnostics)."},"type":"msedge"}],"commands":[{"command":"extension.js-debug.prettyPrint","title":"Pretty print for debugging","category":"Debug","icon":"$(json)"},{"command":"extension.js-debug.toggleSkippingFile","title":"Toggle Skipping this File","category":"Debug"},{"command":"extension.js-debug.addCustomBreakpoints","title":"Toggle Event Listener Breakpoints","icon":"$(add)"},{"command":"extension.js-debug.removeAllCustomBreakpoints","title":"Remove All Event Listener Breakpoints","icon":"$(close-all)"},{"command":"extension.js-debug.addXHRBreakpoints","title":"Add XHR/fetch Breakpoint","icon":"$(add)"},{"command":"extension.js-debug.removeXHRBreakpoint","title":"Remove XHR/fetch Breakpoint","icon":"$(remove)"},{"command":"extension.js-debug.editXHRBreakpoints","title":"Edit XHR/fetch Breakpoint","icon":"$(edit)"},{"command":"extension.pwa-node-debug.attachNodeProcess","title":"Attach to Node Process","category":"Debug"},{"command":"extension.js-debug.npmScript","title":"Debug npm Script","category":"Debug"},{"command":"extension.js-debug.createDebuggerTerminal","title":"JavaScript Debug Terminal","category":"Debug"},{"command":"extension.js-debug.startProfile","title":"Take Performance Profile","category":"Debug","icon":"$(record)"},{"command":"extension.js-debug.stopProfile","title":"Stop Performance Profile","category":"Debug","icon":"resources/dark/stop-profiling.svg"},{"command":"extension.js-debug.revealPage","title":"Focus Tab","category":"Debug"},{"command":"extension.js-debug.debugLink","title":"Open Link","category":"Debug"},{"command":"extension.js-debug.createDiagnostics","title":"Diagnose Breakpoint Problems","category":"Debug"},{"command":"extension.js-debug.getDiagnosticLogs","title":"Save Diagnostic JS Debug Logs","category":"Debug"},{"command":"extension.node-debug.startWithStopOnEntry","title":"Start Debugging and Stop on Entry","category":"Debug"},{"command":"extension.js-debug.openEdgeDevTools","title":"Open Browser Devtools","icon":"$(inspect)","category":"Debug"},{"command":"extension.js-debug.callers.add","title":"Exclude Caller","category":"Debug"},{"command":"extension.js-debug.callers.remove","title":"Remove excluded caller","icon":"$(close)"},{"command":"extension.js-debug.callers.removeAll","title":"Remove all excluded callers","icon":"$(clear-all)"},{"command":"extension.js-debug.callers.goToCaller","title":"Go to caller location","icon":"$(call-outgoing)"},{"command":"extension.js-debug.callers.gotToTarget","title":"Go to target location","icon":"$(call-incoming)"},{"command":"extension.js-debug.enableSourceMapStepping","title":"Enable Source Mapped Stepping","icon":"$(compass-dot)"},{"command":"extension.js-debug.disableSourceMapStepping","title":"Disable Source Mapped Stepping","icon":"$(compass)"},{"command":"extension.js-debug.network.viewRequest","title":"View Request as cURL","icon":"$(arrow-right)"},{"command":"extension.js-debug.network.clear","title":"Clear Network Log","icon":"$(clear-all)"},{"command":"extension.js-debug.network.openBody","title":"Open Response Body"},{"command":"extension.js-debug.network.openBodyInHex","title":"Open Response Body in Hex Editor"},{"command":"extension.js-debug.network.replayXHR","title":"Replay Request"},{"command":"extension.js-debug.network.copyUri","title":"Copy Request URL"}],"keybindings":[{"command":"extension.node-debug.startWithStopOnEntry","key":"F10","mac":"F10","when":"debugConfigurationType == pwa-node && !inDebugMode || debugConfigurationType == pwa-extensionHost && !inDebugMode || debugConfigurationType == node && !inDebugMode"},{"command":"extension.node-debug.startWithStopOnEntry","key":"F11","mac":"F11","when":"debugConfigurationType == pwa-node && !inDebugMode && activeViewlet == workbench.view.debug || debugConfigurationType == pwa-extensionHost && !inDebugMode && activeViewlet == workbench.view.debug || debugConfigurationType == node && !inDebugMode && activeViewlet == workbench.view.debug"}],"configuration":{"title":"JavaScript Debugger","properties":{"debug.javascript.codelens.npmScripts":{"enum":["top","all","never"],"default":"top","description":"Where a \"Run\" and \"Debug\" code lens should be shown in your npm scripts. It may be on \"all\", scripts, on \"top\" of the script section, or \"never\"."},"debug.javascript.terminalOptions":{"type":"object","description":"Default launch options for the JavaScript debug terminal and npm scripts.","default":{},"properties":{"resolveSourceMapLocations":{"type":["array","null"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","default":["${workspaceFolder}/**","!**/node_modules/**"],"items":{"type":"string"}},"outFiles":{"type":["array"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"items":{"type":"string"},"tags":["setup"]},"pauseForSourceMap":{"type":"boolean","markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","default":false},"showAsyncStacks":{"description":"Show the async calls that led to the current call stack.","default":true,"oneOf":[{"type":"boolean"},{"type":"object","required":["onAttach"],"properties":{"onAttach":{"type":"number","default":32}}},{"type":"object","required":["onceBreakpointResolved"],"properties":{"onceBreakpointResolved":{"type":"number","default":32}}}]},"skipFiles":{"type":"array","description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","default":["${/**"]},"smartStep":{"type":"boolean","description":"Automatically step through generated code that cannot be mapped back to the original source.","default":true},"sourceMaps":{"type":"boolean","description":"Use JavaScript source maps (if they exist).","default":true},"sourceMapRenames":{"type":"boolean","default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers."},"sourceMapPathOverrides":{"type":"object","description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","default":{"webpack://?:*/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","meteor://💻app/*":"${workspaceFolder}/*"}},"timeout":{"type":"number","description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","default":10000},"timeouts":{"type":"object","description":"Timeouts for several debugger operations.","default":{},"properties":{"sourceMapMinPause":{"type":"number","description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","default":1000},"sourceMapCumulativePause":{"type":"number","description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","default":1000},"hoverEvaluation":{"type":"number","description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","default":500}},"additionalProperties":false,"markdownDescription":"Timeouts for several debugger operations."},"trace":{"description":"Configures what diagnostic output is produced.","default":true,"oneOf":[{"type":"boolean","description":"Trace may be set to 'true' to write diagnostic logs to the disk."},{"type":"object","additionalProperties":false,"properties":{"stdio":{"type":"boolean","description":"Whether to return trace data from the launched application or browser."},"logFile":{"type":["string","null"],"description":"Configures where on disk logs are written."}}}]},"outputCapture":{"enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`.","default":"console"},"enableContentValidation":{"default":true,"type":"boolean","description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example."},"customDescriptionGenerator":{"type":"string","description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n "},"customPropertiesGenerator":{"type":"string","deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181"},"cascadeTerminateToConfigurations":{"type":"array","items":{"type":"string","uniqueItems":true},"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped."},"enableDWARF":{"type":"boolean","default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function."},"cwd":{"type":"string","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","default":"${workspaceFolder}","docDefault":"localRoot || ${workspaceFolder}","tags":["setup"]},"localRoot":{"type":["string","null"],"description":"Path to the local directory containing the program.","default":null},"remoteRoot":{"type":["string","null"],"description":"Absolute path to the remote directory containing the program.","default":null},"autoAttachChildProcesses":{"type":"boolean","description":"Attach debugger to new child processes automatically.","default":true},"env":{"type":"object","additionalProperties":{"type":["string","null"]},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","default":{},"tags":["setup"]},"envFile":{"type":"string","description":"Absolute path to a file containing environment variable definitions.","default":"${workspaceFolder}/.env"},"runtimeSourcemapPausePatterns":{"type":"array","items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","default":[]},"nodeVersionHint":{"type":"number","minimum":8,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","default":12},"command":{"type":["string","null"],"description":"Command to run in the launched terminal. If not provided, the terminal will open without launching a program.","default":"npm start","tags":["setup"]}}},"debug.javascript.automaticallyTunnelRemoteServer":{"type":"boolean","description":"When debugging a remote web app, configures whether to automatically tunnel the remote server to your local machine.","default":true},"debug.javascript.debugByLinkOptions":{"default":"on","description":"Options used when debugging open links clicked from inside the JavaScript Debug Terminal. Can be set to \"off\" to disable this behavior, or \"always\" to enable debugging in all terminals.","oneOf":[{"type":"string","enum":["on","off","always"]},{"type":"object","properties":{"resolveSourceMapLocations":{"type":["array","null"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","default":null,"items":{"type":"string"}},"outFiles":{"type":["array"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"items":{"type":"string"},"tags":["setup"]},"pauseForSourceMap":{"type":"boolean","markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","default":false},"showAsyncStacks":{"description":"Show the async calls that led to the current call stack.","default":true,"oneOf":[{"type":"boolean"},{"type":"object","required":["onAttach"],"properties":{"onAttach":{"type":"number","default":32}}},{"type":"object","required":["onceBreakpointResolved"],"properties":{"onceBreakpointResolved":{"type":"number","default":32}}}]},"skipFiles":{"type":"array","description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","default":["${/**"]},"smartStep":{"type":"boolean","description":"Automatically step through generated code that cannot be mapped back to the original source.","default":true},"sourceMaps":{"type":"boolean","description":"Use JavaScript source maps (if they exist).","default":true},"sourceMapRenames":{"type":"boolean","default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers."},"sourceMapPathOverrides":{"type":"object","description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","default":{"webpack://?:*/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","meteor://💻app/*":"${workspaceFolder}/*"}},"timeout":{"type":"number","description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","default":10000},"timeouts":{"type":"object","description":"Timeouts for several debugger operations.","default":{},"properties":{"sourceMapMinPause":{"type":"number","description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","default":1000},"sourceMapCumulativePause":{"type":"number","description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","default":1000},"hoverEvaluation":{"type":"number","description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","default":500}},"additionalProperties":false,"markdownDescription":"Timeouts for several debugger operations."},"trace":{"description":"Configures what diagnostic output is produced.","default":true,"oneOf":[{"type":"boolean","description":"Trace may be set to 'true' to write diagnostic logs to the disk."},{"type":"object","additionalProperties":false,"properties":{"stdio":{"type":"boolean","description":"Whether to return trace data from the launched application or browser."},"logFile":{"type":["string","null"],"description":"Configures where on disk logs are written."}}}]},"outputCapture":{"enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`.","default":"console"},"enableContentValidation":{"default":true,"type":"boolean","description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example."},"customDescriptionGenerator":{"type":"string","description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n "},"customPropertiesGenerator":{"type":"string","deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181"},"cascadeTerminateToConfigurations":{"type":"array","items":{"type":"string","uniqueItems":true},"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped."},"enableDWARF":{"type":"boolean","default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function."},"disableNetworkCache":{"type":"boolean","description":"Controls whether to skip the network cache for each request","default":true},"pathMapping":{"type":"object","description":"A mapping of URLs/paths to local folders, to resolve scripts in the Browser to scripts on disk","default":{}},"webRoot":{"type":"string","description":"This specifies the workspace absolute path to the webserver root. Used to resolve paths like `/app.js` to files on disk. Shorthand for a pathMapping for \"/\"","default":"${workspaceFolder}","tags":["setup"]},"urlFilter":{"type":"string","description":"Will search for a page with this url and attach to it, if found. Can have * wildcards.","default":""},"url":{"type":"string","description":"Will search for a tab with this exact url and attach to it, if found","default":"http://localhost:8080","tags":["setup"]},"inspectUri":{"type":["string","null"],"description":"Format to use to rewrite the inspectUri: It's a template string that interpolates keys in `{curlyBraces}`. Available keys are:\n - `url.*` is the parsed address of the running application. For instance, `{url.port}`, `{url.hostname}`\n - `port` is the debug port that Chrome is listening on.\n - `browserInspectUri` is the inspector URI on the launched browser\n - `browserInspectUriPath` is the path part of the inspector URI on the launched browser (e.g.: \"/devtools/browser/e9ec0098-306e-472a-8133-5e42488929c2\").\n - `wsProtocol` is the hinted websocket protocol. This is set to `wss` if the original URL is `https`, or `ws` otherwise.\n","default":null},"vueComponentPaths":{"type":"array","description":"A list of file glob patterns to find `*.vue` components. By default, searches the entire workspace. This needs to be specified due to extra lookups that Vue's sourcemaps require in Vue CLI 4. You can disable this special handling by setting this to an empty array.","default":["${workspaceFolder}/**/*.vue"]},"server":{"oneOf":[{"type":"object","description":"Configures a web server to start up. Takes the same configuration as the 'node' launch task.","additionalProperties":false,"default":{"program":"node my-server.js"},"properties":{"resolveSourceMapLocations":{"type":["array","null"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","default":["${workspaceFolder}/**","!**/node_modules/**"],"items":{"type":"string"}},"outFiles":{"type":["array"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"items":{"type":"string"},"tags":["setup"]},"pauseForSourceMap":{"type":"boolean","markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","default":false},"showAsyncStacks":{"description":"Show the async calls that led to the current call stack.","default":true,"oneOf":[{"type":"boolean"},{"type":"object","required":["onAttach"],"properties":{"onAttach":{"type":"number","default":32}}},{"type":"object","required":["onceBreakpointResolved"],"properties":{"onceBreakpointResolved":{"type":"number","default":32}}}]},"skipFiles":{"type":"array","description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","default":["${/**"]},"smartStep":{"type":"boolean","description":"Automatically step through generated code that cannot be mapped back to the original source.","default":true},"sourceMaps":{"type":"boolean","description":"Use JavaScript source maps (if they exist).","default":true},"sourceMapRenames":{"type":"boolean","default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers."},"sourceMapPathOverrides":{"type":"object","description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","default":{"webpack://?:*/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","meteor://💻app/*":"${workspaceFolder}/*"}},"timeout":{"type":"number","description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","default":10000},"timeouts":{"type":"object","description":"Timeouts for several debugger operations.","default":{},"properties":{"sourceMapMinPause":{"type":"number","description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","default":1000},"sourceMapCumulativePause":{"type":"number","description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","default":1000},"hoverEvaluation":{"type":"number","description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","default":500}},"additionalProperties":false,"markdownDescription":"Timeouts for several debugger operations."},"trace":{"description":"Configures what diagnostic output is produced.","default":true,"oneOf":[{"type":"boolean","description":"Trace may be set to 'true' to write diagnostic logs to the disk."},{"type":"object","additionalProperties":false,"properties":{"stdio":{"type":"boolean","description":"Whether to return trace data from the launched application or browser."},"logFile":{"type":["string","null"],"description":"Configures where on disk logs are written."}}}]},"outputCapture":{"enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`.","default":"console"},"enableContentValidation":{"default":true,"type":"boolean","description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example."},"customDescriptionGenerator":{"type":"string","description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n "},"customPropertiesGenerator":{"type":"string","deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181"},"cascadeTerminateToConfigurations":{"type":"array","items":{"type":"string","uniqueItems":true},"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped."},"enableDWARF":{"type":"boolean","default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function."},"cwd":{"type":"string","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","default":"${workspaceFolder}","tags":["setup"]},"localRoot":{"type":["string","null"],"description":"Path to the local directory containing the program.","default":null},"remoteRoot":{"type":["string","null"],"description":"Absolute path to the remote directory containing the program.","default":null},"autoAttachChildProcesses":{"type":"boolean","description":"Attach debugger to new child processes automatically.","default":true},"env":{"type":"object","additionalProperties":{"type":["string","null"]},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","default":{},"tags":["setup"]},"envFile":{"type":"string","description":"Absolute path to a file containing environment variable definitions.","default":"${workspaceFolder}/.env"},"runtimeSourcemapPausePatterns":{"type":"array","items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","default":[]},"nodeVersionHint":{"type":"number","minimum":8,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","default":12},"program":{"type":"string","description":"Absolute path to the program. Generated value is guessed by looking at package.json and opened files. Edit this attribute.","default":"","tags":["setup"]},"stopOnEntry":{"type":["boolean","string"],"description":"Automatically stop program after launch.","default":true},"console":{"type":"string","enum":["internalConsole","integratedTerminal","externalTerminal"],"enumDescriptions":["VS Code Debug Console (which doesn't support to read input from a program)","VS Code's integrated terminal","External terminal that can be configured via user settings"],"description":"Where to launch the debug target.","default":"internalConsole"},"args":{"type":["array","string"],"description":"Command line arguments passed to the program.\n\nCan be an array of strings or a single string. When the program is launched in a terminal, setting this property to a single string will result in the arguments not being escaped for the shell.","items":{"type":"string"},"default":[],"tags":["setup"]},"restart":{"description":"Try to reconnect to the program if we lose connection. If set to `true`, we'll try once a second, forever. You can customize the interval and maximum number of attempts by specifying the `delay` and `maxAttempts` in an object instead.","default":true,"oneOf":[{"type":"boolean"},{"type":"object","properties":{"delay":{"type":"number","minimum":0,"default":1000},"maxAttempts":{"type":"number","minimum":0,"default":10}}}]},"runtimeExecutable":{"type":["string","null"],"markdownDescription":"Runtime to use. Either an absolute path or the name of a runtime available on the PATH. If omitted `node` is assumed.","default":"node"},"runtimeVersion":{"type":"string","markdownDescription":"Version of `node` runtime to use. Requires `nvm`.","default":"default"},"runtimeArgs":{"type":"array","description":"Optional arguments passed to the runtime executable.","items":{"type":"string"},"default":[],"tags":["setup"]},"profileStartup":{"type":"boolean","description":"If true, will start profiling as soon as the process launches","default":true},"attachSimplePort":{"oneOf":[{"type":"integer"},{"type":"string","pattern":"^\\${.*}$"}],"description":"If set, attaches to the process via the given port. This is generally no longer necessary for Node.js programs and loses the ability to debug child processes, but can be useful in more esoteric scenarios such as with Deno and Docker launches. If set to 0, a random port will be chosen and --inspect-brk added to the launch arguments automatically.","default":9229},"killBehavior":{"type":"string","enum":["forceful","polite","none"],"default":"forceful","markdownDescription":"Configures how debug processes are killed when stopping the session. Can be:\n\n- forceful (default): forcefully tears down the process tree. Sends SIGKILL on posix, or `taskkill.exe /F` on Windows.\n- polite: gracefully tears down the process tree. It's possible that misbehaving processes continue to run after shutdown in this way. Sends SIGTERM on posix, or `taskkill.exe` with no `/F` (force) flag on Windows.\n- none: no termination will happen."},"experimentalNetworking":{"type":"string","default":"auto","description":"Enable experimental inspection in Node.js. When set to `auto` this is enabled for versions of Node.js that support it. It can be set to `on` or `off` to enable or disable it explicitly.","enum":["auto","on","off"]}}},{"type":"object","description":"JavaScript Debug Terminal","additionalProperties":false,"default":{"program":"npm start"},"properties":{"resolveSourceMapLocations":{"type":["array","null"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","default":["${workspaceFolder}/**","!**/node_modules/**"],"items":{"type":"string"}},"outFiles":{"type":["array"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"items":{"type":"string"},"tags":["setup"]},"pauseForSourceMap":{"type":"boolean","markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","default":false},"showAsyncStacks":{"description":"Show the async calls that led to the current call stack.","default":true,"oneOf":[{"type":"boolean"},{"type":"object","required":["onAttach"],"properties":{"onAttach":{"type":"number","default":32}}},{"type":"object","required":["onceBreakpointResolved"],"properties":{"onceBreakpointResolved":{"type":"number","default":32}}}]},"skipFiles":{"type":"array","description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","default":["${/**"]},"smartStep":{"type":"boolean","description":"Automatically step through generated code that cannot be mapped back to the original source.","default":true},"sourceMaps":{"type":"boolean","description":"Use JavaScript source maps (if they exist).","default":true},"sourceMapRenames":{"type":"boolean","default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers."},"sourceMapPathOverrides":{"type":"object","description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","default":{"webpack://?:*/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","meteor://💻app/*":"${workspaceFolder}/*"}},"timeout":{"type":"number","description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","default":10000},"timeouts":{"type":"object","description":"Timeouts for several debugger operations.","default":{},"properties":{"sourceMapMinPause":{"type":"number","description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","default":1000},"sourceMapCumulativePause":{"type":"number","description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","default":1000},"hoverEvaluation":{"type":"number","description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","default":500}},"additionalProperties":false,"markdownDescription":"Timeouts for several debugger operations."},"trace":{"description":"Configures what diagnostic output is produced.","default":true,"oneOf":[{"type":"boolean","description":"Trace may be set to 'true' to write diagnostic logs to the disk."},{"type":"object","additionalProperties":false,"properties":{"stdio":{"type":"boolean","description":"Whether to return trace data from the launched application or browser."},"logFile":{"type":["string","null"],"description":"Configures where on disk logs are written."}}}]},"outputCapture":{"enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`.","default":"console"},"enableContentValidation":{"default":true,"type":"boolean","description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example."},"customDescriptionGenerator":{"type":"string","description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n "},"customPropertiesGenerator":{"type":"string","deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181"},"cascadeTerminateToConfigurations":{"type":"array","items":{"type":"string","uniqueItems":true},"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped."},"enableDWARF":{"type":"boolean","default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function."},"cwd":{"type":"string","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","default":"${workspaceFolder}","docDefault":"localRoot || ${workspaceFolder}","tags":["setup"]},"localRoot":{"type":["string","null"],"description":"Path to the local directory containing the program.","default":null},"remoteRoot":{"type":["string","null"],"description":"Absolute path to the remote directory containing the program.","default":null},"autoAttachChildProcesses":{"type":"boolean","description":"Attach debugger to new child processes automatically.","default":true},"env":{"type":"object","additionalProperties":{"type":["string","null"]},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","default":{},"tags":["setup"]},"envFile":{"type":"string","description":"Absolute path to a file containing environment variable definitions.","default":"${workspaceFolder}/.env"},"runtimeSourcemapPausePatterns":{"type":"array","items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","default":[]},"nodeVersionHint":{"type":"number","minimum":8,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","default":12},"command":{"type":["string","null"],"description":"Command to run in the launched terminal. If not provided, the terminal will open without launching a program.","default":"npm start","tags":["setup"]}}}]},"perScriptSourcemaps":{"type":"string","default":"auto","enum":["yes","no","auto"],"description":"Whether scripts are loaded individually with unique sourcemaps containing the basename of the source file. This can be set to optimize sourcemap handling when dealing with lots of small scripts. If set to \"auto\", we'll detect known cases where this is appropriate."},"port":{"type":"number","description":"Port for the browser to listen on. Defaults to \"0\", which will cause the browser to be debugged via pipes, which is generally more secure and should be chosen unless you need to attach to the browser from another tool.","default":0},"file":{"type":"string","description":"A local html file to open in the browser","default":"${workspaceFolder}/index.html","tags":["setup"]},"userDataDir":{"type":["string","boolean"],"description":"By default, the browser is launched with a separate user profile in a temp folder. Use this option to override it. Set to false to launch with your default user profile. A new browser can't be launched if an instance is already running from `userDataDir`.","default":true},"includeDefaultArgs":{"type":"boolean","description":"Whether default browser launch arguments (to disable features that may make debugging harder) will be included in the launch.","default":true},"includeLaunchArgs":{"type":"boolean","description":"Advanced: whether any default launch/debugging arguments are set on the browser. The debugger will assume the browser will use pipe debugging such as that which is provided with `--remote-debugging-pipe`.","default":true},"runtimeExecutable":{"type":["string","null"],"description":"Either 'canary', 'stable', 'custom' or path to the browser executable. Custom means a custom wrapper, custom build or CHROME_PATH environment variable.","default":"stable"},"runtimeArgs":{"type":"array","description":"Optional arguments passed to the runtime executable.","items":{"type":"string"},"default":[]},"env":{"type":"object","description":"Optional dictionary of environment key/value pairs for the browser.","default":{}},"cwd":{"type":"string","description":"Optional working directory for the runtime executable.","default":null},"profileStartup":{"type":"boolean","description":"If true, will start profiling soon as the process launches","default":true},"cleanUp":{"type":"string","enum":["wholeBrowser","onlyTab"],"description":"What clean-up to do after the debugging session finishes. Close only the tab being debug, vs. close the whole browser.","default":"wholeBrowser"},"killBehavior":{"type":"string","enum":["forceful","polite","none"],"default":"forceful","markdownDescription":"Configures how browser processes are killed when stopping the session with `cleanUp: wholeBrowser`. Can be:\n\n- forceful (default): forcefully tears down the process tree. Sends SIGKILL on posix, or `taskkill.exe /F` on Windows.\n- polite: gracefully tears down the process tree. It's possible that misbehaving processes continue to run after shutdown in this way. Sends SIGTERM on posix, or `taskkill.exe` with no `/F` (force) flag on Windows.\n- none: no termination will happen."},"browserLaunchLocation":{"description":"Forces the browser to be launched in one location. In a remote workspace (through ssh or WSL, for example) this can be used to open the browser on the remote machine rather than locally.","default":null,"oneOf":[{"type":"null"},{"type":"string","enum":["ui","workspace"]}]},"enabled":{"type":"string","enum":["on","off","always"]}}}]},"debug.javascript.pickAndAttachOptions":{"type":"object","default":{},"markdownDescription":"Default options used when debugging a process through the `Debug: Attach to Node.js Process` command","properties":{"resolveSourceMapLocations":{"type":["array","null"],"description":"A list of minimatch patterns for locations (folders and URLs) in which source maps can be used to resolve local files. This can be used to avoid incorrectly breaking in external source mapped code. Patterns can be prefixed with \"!\" to exclude them. May be set to an empty array or null to avoid restriction.","default":["${workspaceFolder}/**","!**/node_modules/**"],"items":{"type":"string"}},"outFiles":{"type":["array"],"description":"If source maps are enabled, these glob patterns specify the generated JavaScript files. If a pattern starts with `!` the files are excluded. If not specified, the generated code is expected in the same directory as its source.","default":["${workspaceFolder}/**/*.(m|c|)js","!**/node_modules/**"],"items":{"type":"string"},"tags":["setup"]},"pauseForSourceMap":{"type":"boolean","markdownDescription":"Whether to wait for source maps to load for each incoming script. This has a performance overhead, and might be safely disabled when running off of disk, so long as `rootPath` is not disabled.","default":false},"showAsyncStacks":{"description":"Show the async calls that led to the current call stack.","default":true,"oneOf":[{"type":"boolean"},{"type":"object","required":["onAttach"],"properties":{"onAttach":{"type":"number","default":32}}},{"type":"object","required":["onceBreakpointResolved"],"properties":{"onceBreakpointResolved":{"type":"number","default":32}}}]},"skipFiles":{"type":"array","description":"An array of file or folder names, or path globs, to skip when debugging. Star patterns and negations are allowed, for example, `[\"**/node_modules/**\", \"!**/node_modules/my-module/**\"]`","default":["${/**"]},"smartStep":{"type":"boolean","description":"Automatically step through generated code that cannot be mapped back to the original source.","default":true},"sourceMaps":{"type":"boolean","description":"Use JavaScript source maps (if they exist).","default":true},"sourceMapRenames":{"type":"boolean","default":true,"description":"Whether to use the \"names\" mapping in sourcemaps. This requires requesting source content, which can be slow with certain debuggers."},"sourceMapPathOverrides":{"type":"object","description":"A set of mappings for rewriting the locations of source files from what the sourcemap says, to their locations on disk.","default":{"webpack://?:*/*":"${workspaceFolder}/*","webpack:///./~/*":"${workspaceFolder}/node_modules/*","meteor://💻app/*":"${workspaceFolder}/*"}},"timeout":{"type":"number","description":"Retry for this number of milliseconds to connect to Node.js. Default is 10000 ms.","default":10000},"timeouts":{"type":"object","description":"Timeouts for several debugger operations.","default":{},"properties":{"sourceMapMinPause":{"type":"number","description":"Minimum time in milliseconds spent waiting for each source-map to be processed when a script is being parsed","default":1000},"sourceMapCumulativePause":{"type":"number","description":"Extra time in milliseconds allowed per session to be spent waiting for source-maps to be processed, after the minimum time (sourceMapMinPause) has been exhausted","default":1000},"hoverEvaluation":{"type":"number","description":"Time until value evaluation for hovered symbols is aborted. If set to 0, hover evaluation does never time out.","default":500}},"additionalProperties":false,"markdownDescription":"Timeouts for several debugger operations."},"trace":{"description":"Configures what diagnostic output is produced.","default":true,"oneOf":[{"type":"boolean","description":"Trace may be set to 'true' to write diagnostic logs to the disk."},{"type":"object","additionalProperties":false,"properties":{"stdio":{"type":"boolean","description":"Whether to return trace data from the launched application or browser."},"logFile":{"type":["string","null"],"description":"Configures where on disk logs are written."}}}]},"outputCapture":{"enum":["console","std"],"markdownDescription":"From where to capture output messages: the default debug API if set to `console`, or stdout/stderr streams if set to `std`.","default":"console"},"enableContentValidation":{"default":true,"type":"boolean","description":"Toggles whether we verify the contents of files on disk match the ones loaded in the runtime. This is useful in a variety of scenarios and required in some, but can cause issues if you have server-side transformation of scripts, for example."},"customDescriptionGenerator":{"type":"string","description":"Customize the textual description the debugger shows for objects (local variables, etc...). Samples:\n 1. this.toString() // will call toString to print all objects\n 2. this.customDescription ? this.customDescription() : defaultValue // Use customDescription method if available, if not return defaultValue\n 3. function (def) { return this.customDescription ? this.customDescription() : def } // Use customDescription method if available, if not return defaultValue\n "},"customPropertiesGenerator":{"type":"string","deprecated":true,"description":"Customize the properties shown for an object in the debugger (local variables, etc...). Samples:\n 1. { ...this, extraProperty: '12345' } // Add an extraProperty 12345 to all objects\n 2. this.customProperties ? this.customProperties() : this // Use customProperties method if available, if not use the properties in this (the default properties)\n 3. function () { return this.customProperties ? this.customProperties() : this } // Use customDescription method if available, if not return the default properties\n\n Deprecated: This is a temporary implementation of this feature until we have time to implement it in the way described here: https://github.com/microsoft/vscode/issues/102181"},"cascadeTerminateToConfigurations":{"type":"array","items":{"type":"string","uniqueItems":true},"default":[],"description":"A list of debug sessions which, when this debug session is terminated, will also be stopped."},"enableDWARF":{"type":"boolean","default":true,"markdownDescription":"Toggles whether the debugger will try to read DWARF debug symbols from WebAssembly, which can be resource intensive. Requires the `ms-vscode.wasm-dwarf-debugging` extension to function."},"cwd":{"type":"string","description":"Absolute path to the working directory of the program being debugged. If you've set localRoot then cwd will match that value otherwise it falls back to your workspaceFolder","default":"${workspaceFolder}","docDefault":"localRoot || ${workspaceFolder}","tags":["setup"]},"localRoot":{"type":["string","null"],"description":"Path to the local directory containing the program.","default":null},"remoteRoot":{"type":["string","null"],"description":"Absolute path to the remote directory containing the program.","default":null},"autoAttachChildProcesses":{"type":"boolean","description":"Attach debugger to new child processes automatically.","default":true},"env":{"type":"object","additionalProperties":{"type":["string","null"]},"markdownDescription":"Environment variables passed to the program. The value `null` removes the variable from the environment.","default":{},"tags":["setup"]},"envFile":{"type":"string","description":"Absolute path to a file containing environment variable definitions.","default":"${workspaceFolder}/.env"},"runtimeSourcemapPausePatterns":{"type":"array","items":{"type":"string"},"markdownDescription":"A list of patterns at which to manually insert entrypoint breakpoints. This can be useful to give the debugger an opportunity to set breakpoints when using sourcemaps that don't exist or can't be detected before launch, such as [with the Serverless framework](https://github.com/microsoft/vscode-js-debug/issues/492).","default":[]},"nodeVersionHint":{"type":"number","minimum":8,"description":"Allows you to explicitly specify the Node version that's running, which can be used to disable or enable certain behaviors in cases where the automatic version detection does not work.","default":12},"address":{"type":"string","description":"TCP/IP address of process to be debugged. Default is 'localhost'.","default":"localhost"},"port":{"description":"Debug port to attach to. Default is 9229.","default":9229,"oneOf":[{"type":"integer"},{"type":"string","pattern":"^\\${.*}$"}],"tags":["setup"]},"websocketAddress":{"type":"string","description":"Exact websocket address to attach to. If unspecified, it will be discovered from the address and port."},"remoteHostHeader":{"type":"string","description":"Explicit Host header to use when connecting to the websocket of inspector. If unspecified, the host header will be set to 'localhost'. This is useful when the inspector is running behind a proxy that only accept particular Host header."},"restart":{"description":"Try to reconnect to the program if we lose connection. If set to `true`, we'll try once a second, forever. You can customize the interval and maximum number of attempts by specifying the `delay` and `maxAttempts` in an object instead.","default":true,"oneOf":[{"type":"boolean"},{"type":"object","properties":{"delay":{"type":"number","minimum":0,"default":1000},"maxAttempts":{"type":"number","minimum":0,"default":10}}}]},"processId":{"type":"string","description":"ID of process to attach to.","default":"${command:PickProcess}"},"attachExistingChildren":{"type":"boolean","description":"Whether to attempt to attach to already-spawned child processes.","default":false},"continueOnAttach":{"type":"boolean","markdownDescription":"If true, we'll automatically resume programs launched and waiting on `--inspect-brk`","default":true}}},"debug.javascript.autoAttachFilter":{"type":"string","default":"disabled","enum":["always","smart","onlyWithFlag","disabled"],"enumDescriptions":["Auto attach to every Node.js process launched in the terminal.","Auto attach when running scripts that aren't in a node_modules folder.","Only auto attach when the `--inspect` is given.","Auto attach is disabled and not shown in status bar."],"markdownDescription":"Configures which processes to automatically attach and debug when `#debug.node.autoAttach#` is on. A Node process launched with the `--inspect` flag will always be attached to, regardless of this setting."},"debug.javascript.autoAttachSmartPattern":{"type":"array","items":{"type":"string"},"default":["${workspaceFolder}/**","!**/node_modules/**","**/$KNOWN_TOOLS$/**"],"markdownDescription":"Configures glob patterns for determining when to attach in \"smart\" `#debug.javascript.autoAttachFilter#` mode. `$KNOWN_TOOLS$` is replaced with a list of names of common test and code runners. [Read more on the VS Code docs](https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_auto-attach-smart-patterns)."},"debug.javascript.breakOnConditionalError":{"type":"boolean","default":false,"markdownDescription":"Whether to stop when conditional breakpoints throw an error."},"debug.javascript.unmapMissingSources":{"type":"boolean","default":false,"description":"Configures whether sourcemapped file where the original file can't be read will automatically be unmapped. If this is false (default), a prompt is shown."},"debug.javascript.defaultRuntimeExecutable":{"type":"object","default":{"pwa-node":"node"},"markdownDescription":"The default `runtimeExecutable` used for launch configurations, if unspecified. This can be used to config custom paths to Node.js or browser installations.","properties":{"pwa-node":{"type":"string"},"pwa-chrome":{"type":"string"},"pwa-msedge":{"type":"string"}}},"debug.javascript.resourceRequestOptions":{"type":"object","default":{},"markdownDescription":"Request options to use when loading resources, such as source maps, in the debugger. You may need to configure this if your sourcemaps require authentication or use a self-signed certificate, for instance. Options are used to create a request using the [`got`](https://github.com/sindresorhus/got) library.\n\nA common case to disable certificate verification can be done by passing `{ \"https\": { \"rejectUnauthorized\": false } }`."},"debug.javascript.enableNetworkView":{"type":"boolean","default":true,"description":"Enables the experimental network view for targets that support it."}}},"grammars":[{"language":"wat","scopeName":"text.wat","path":"./src/ui/basic-wat.tmLanguage.json"}],"languages":[{"id":"wat","extensions":[".wat",".wasm"],"aliases":["WebAssembly Text Format"],"firstLine":"^\\(module","mimetypes":["text/wat"],"configuration":"./src/ui/basic-wat.configuration.json"}],"terminal":{"profiles":[{"id":"extension.js-debug.debugTerminal","title":"JavaScript Debug Terminal","icon":"$(debug)"}]},"views":{"debug":[{"id":"jsBrowserBreakpoints","name":"Event Listener Breakpoints","when":"debugType == pwa-chrome || debugType == pwa-msedge"},{"id":"jsExcludedCallers","name":"Excluded Callers","when":"debugType == pwa-extensionHost && jsDebugHasExcludedCallers || debugType == node-terminal && jsDebugHasExcludedCallers || debugType == pwa-node && jsDebugHasExcludedCallers || debugType == pwa-chrome && jsDebugHasExcludedCallers || debugType == pwa-msedge && jsDebugHasExcludedCallers"},{"id":"jsDebugNetworkTree","name":"Network","when":"jsDebugNetworkAvailable"}]},"viewsWelcome":[{"view":"debug","contents":"[JavaScript Debug Terminal](command:extension.js-debug.createDebuggerTerminal)\n\nYou can use the JavaScript Debug Terminal to debug Node.js processes run on the command line.\n\n[Debug URL](command:extension.js-debug.debugLink)","when":"debugStartLanguage == javascript && !isWeb || debugStartLanguage == typescript && !isWeb || debugStartLanguage == javascriptreact && !isWeb || debugStartLanguage == typescriptreact && !isWeb"},{"view":"debug","contents":"[JavaScript Debug Terminal](command:extension.js-debug.createDebuggerTerminal)\n\nYou can use the JavaScript Debug Terminal to debug Node.js processes run on the command line.","when":"debugStartLanguage == javascript && isWeb || debugStartLanguage == typescript && isWeb || debugStartLanguage == javascriptreact && isWeb || debugStartLanguage == typescriptreact && isWeb"}]}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/ms-vscode.js-debug","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","metadata":{},"isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"ms-vscode.js-debug-companion"},"manifest":{"name":"js-debug-companion","displayName":"JavaScript Debugger Companion Extension","description":"Companion extension to js-debug that provides capability for remote debugging","version":"1.1.3","publisher":"ms-vscode","engines":{"vscode":"^1.90.0"},"icon":"resources/logo.png","categories":["Other"],"repository":{"type":"git","url":"https://github.com/microsoft/vscode-js-debug-companion.git"},"author":"Connor Peet ","license":"MIT","bugs":{"url":"https://github.com/microsoft/vscode-js-debug-companion/issues"},"homepage":"https://github.com/microsoft/vscode-js-debug-companion#readme","capabilities":{"virtualWorkspaces":false,"untrustedWorkspaces":{"supported":true}},"activationEvents":["onCommand:js-debug-companion.launchAndAttach","onCommand:js-debug-companion.kill","onCommand:js-debug-companion.launch","onCommand:js-debug-companion.defaultBrowser"],"main":"./out/extension.js","contributes":{},"extensionKind":["ui"],"api":"none","prettier":{"trailingComma":"all","singleQuote":true,"printWidth":100,"tabWidth":2,"arrowParens":"avoid"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/ms-vscode.js-debug-companion","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","metadata":{},"isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"ms-vscode.vscode-js-profile-table"},"manifest":{"name":"vscode-js-profile-table","version":"1.0.10","displayName":"Table Visualizer for JavaScript Profiles","description":"Text visualizer for profiles taken from the JavaScript debugger","author":"Connor Peet ","homepage":"https://github.com/microsoft/vscode-js-profile-visualizer#readme","license":"MIT","main":"out/extension.js","browser":"out/extension.web.js","repository":{"type":"git","url":"https://github.com/microsoft/vscode-js-profile-visualizer.git"},"capabilities":{"virtualWorkspaces":true,"untrustedWorkspaces":{"supported":true}},"icon":"resources/icon.png","publisher":"ms-vscode","sideEffects":false,"engines":{"vscode":"^1.74.0"},"contributes":{"customEditors":[{"viewType":"jsProfileVisualizer.cpuprofile.table","displayName":"CPU Profile Table Visualizer","priority":"default","selector":[{"filenamePattern":"*.cpuprofile"}]},{"viewType":"jsProfileVisualizer.heapprofile.table","displayName":"Heap Profile Table Visualizer","priority":"default","selector":[{"filenamePattern":"*.heapprofile"}]},{"viewType":"jsProfileVisualizer.heapsnapshot.table","displayName":"Heap Snapshot Table Visualizer","priority":"default","selector":[{"filenamePattern":"*.heapsnapshot"}]}],"commands":[{"command":"extension.jsProfileVisualizer.table.clearCodeLenses","title":"Clear Profile Code Lenses"}],"menus":{"commandPalette":[{"command":"extension.jsProfileVisualizer.table.clearCodeLenses","when":"jsProfileVisualizer.hasCodeLenses == true"}]}},"bugs":{"url":"https://github.com/microsoft/vscode-js-profile-visualizer/issues"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/ms-vscode.vscode-js-profile-table","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","metadata":{},"isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.builtin-notebook-renderers"},"manifest":{"name":"builtin-notebook-renderers","displayName":"Builtin Notebook Output Renderers","description":"Provides basic output renderers for notebooks","publisher":"vscode","version":"1.0.0","license":"MIT","icon":"media/icon.png","engines":{"vscode":"^1.57.0"},"capabilities":{"virtualWorkspaces":true,"untrustedWorkspaces":{"supported":true}},"contributes":{"notebookRenderer":[{"id":"vscode.builtin-renderer","entrypoint":"./renderer-out/index.js","displayName":"VS Code Builtin Notebook Output Renderer","requiresMessaging":"never","mimeTypes":["image/gif","image/png","image/jpeg","image/git","image/svg+xml","text/html","application/javascript","application/vnd.code.notebook.error","application/vnd.code.notebook.stdout","application/x.notebook.stdout","application/x.notebook.stream","application/vnd.code.notebook.stderr","application/x.notebook.stderr","text/plain"]}]},"scripts":{"compile":"npx gulp compile-extension:notebook-renderers && npm run build-notebook","watch":"npx gulp compile-watch:notebook-renderers","build-notebook":"node ./esbuild.mjs"},"devDependencies":{"@types/jsdom":"^21.1.0","@types/node":"^22.18.10","@types/vscode-notebook-renderer":"^1.60.0","jsdom":"^21.1.1"},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/notebook-renderers","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.npm"},"manifest":{"name":"npm","publisher":"vscode","displayName":"NPM support for VS Code","description":"Extension to add task support for npm scripts.","version":"1.0.1","private":true,"license":"MIT","engines":{"vscode":"0.10.x"},"icon":"images/npm_icon.png","categories":["Other"],"enabledApiProposals":["terminalQuickFixProvider"],"main":"./dist/npmMain","browser":"./dist/browser/npmBrowserMain","activationEvents":["onTaskType:npm","onLanguage:json","workspaceContains:package.json"],"capabilities":{"virtualWorkspaces":{"supported":"limited","description":"Functionality that requires running the 'npm' command is not available in virtual workspaces."},"untrustedWorkspaces":{"supported":"limited","description":"This extension executes tasks, which require trust to run."}},"contributes":{"languages":[{"id":"ignore","extensions":[".npmignore"]},{"id":"properties","extensions":[".npmrc"]}],"views":{"explorer":[{"id":"npm","name":"NPM Scripts","when":"npm:showScriptExplorer","icon":"$(json)","visibility":"hidden","contextualTitle":"NPM Scripts"}]},"commands":[{"command":"npm.runScript","title":"Run","icon":"$(run)"},{"command":"npm.debugScript","title":"Debug","icon":"$(debug)"},{"command":"npm.openScript","title":"Open"},{"command":"npm.runInstall","title":"Run Install"},{"command":"npm.refresh","title":"Refresh","icon":"$(refresh)"},{"command":"npm.runSelectedScript","title":"Run Script"},{"command":"npm.runScriptFromFolder","title":"Run NPM Script in Folder..."},{"command":"npm.packageManager","title":"Get Configured Package Manager"}],"menus":{"commandPalette":[{"command":"npm.refresh","when":"false"},{"command":"npm.runScript","when":"false"},{"command":"npm.debugScript","when":"false"},{"command":"npm.openScript","when":"false"},{"command":"npm.runInstall","when":"false"},{"command":"npm.runSelectedScript","when":"false"},{"command":"npm.runScriptFromFolder","when":"false"},{"command":"npm.packageManager","when":"false"}],"editor/context":[{"command":"npm.runSelectedScript","when":"resourceFilename == 'package.json' && resourceScheme == file","group":"navigation@+1"}],"view/title":[{"command":"npm.refresh","when":"view == npm","group":"navigation"}],"view/item/context":[{"command":"npm.openScript","when":"view == npm && viewItem == packageJSON","group":"navigation@1"},{"command":"npm.runInstall","when":"view == npm && viewItem == packageJSON","group":"navigation@2"},{"command":"npm.openScript","when":"view == npm && viewItem == script","group":"navigation@1"},{"command":"npm.runScript","when":"view == npm && viewItem == script","group":"navigation@2"},{"command":"npm.runScript","when":"view == npm && viewItem == script","group":"inline"},{"command":"npm.debugScript","when":"view == npm && viewItem == script","group":"inline"},{"command":"npm.debugScript","when":"view == npm && viewItem == script","group":"navigation@3"}],"explorer/context":[{"when":"config.npm.enableRunFromFolder && explorerViewletVisible && explorerResourceIsFolder && resourceScheme == file","command":"npm.runScriptFromFolder","group":"2_workspace"}]},"configuration":{"id":"npm","type":"object","title":"Npm","properties":{"npm.autoDetect":{"type":"string","enum":["off","on"],"default":"on","scope":"resource","description":"Controls whether npm scripts should be automatically detected."},"npm.runSilent":{"type":"boolean","default":false,"scope":"resource","markdownDescription":"Run npm commands with the `--silent` option."},"npm.packageManager":{"scope":"resource","type":"string","enum":["auto","npm","yarn","pnpm","bun"],"enumDescriptions":["Auto-detect which package manager to use based on lock files and installed package managers.","Use npm as the package manager.","Use yarn as the package manager.","Use pnpm as the package manager.","Use bun as the package manager."],"default":"auto","description":"The package manager used to install dependencies."},"npm.scriptRunner":{"scope":"resource","type":"string","enum":["auto","npm","yarn","pnpm","bun","node"],"enumDescriptions":["Auto-detect which script runner to use based on lock files and installed package managers.","Use npm as the script runner.","Use yarn as the script runner.","Use pnpm as the script runner.","Use bun as the script runner.","Use Node.js as the script runner."],"default":"auto","description":"The script runner used to run scripts."},"npm.exclude":{"type":["string","array"],"items":{"type":"string"},"description":"Configure glob patterns for folders that should be excluded from automatic script detection.","scope":"resource"},"npm.enableScriptExplorer":{"type":"boolean","default":false,"scope":"resource","deprecationMessage":"The NPM Script Explorer is now available in 'Views' menu in the Explorer in all folders.","description":"Enable an explorer view for npm scripts when there is no top-level 'package.json' file."},"npm.enableRunFromFolder":{"type":"boolean","default":false,"scope":"resource","description":"Enable running npm scripts contained in a folder from the Explorer context menu."},"npm.scriptExplorerAction":{"type":"string","enum":["open","run"],"markdownDescription":"The default click action used in the NPM Scripts Explorer: `open` or `run`, the default is `open`.","scope":"window","default":"open"},"npm.scriptExplorerExclude":{"type":"array","items":{"type":"string"},"markdownDescription":"An array of regular expressions that indicate which scripts should be excluded from the NPM Scripts view.","scope":"resource","default":[]},"npm.fetchOnlinePackageInfo":{"type":"boolean","description":"Fetch data from https://registry.npmjs.org and https://registry.bower.io to provide auto-completion and information on hover features on npm dependencies.","default":true,"scope":"window","tags":["usesOnlineServices"]},"npm.scriptHover":{"type":"boolean","description":"Display hover with 'Run' and 'Debug' commands for scripts.","default":true,"scope":"window"}}},"jsonValidation":[{"fileMatch":"package.json","url":"https://www.schemastore.org/package"},{"fileMatch":"bower.json","url":"https://www.schemastore.org/bower"}],"taskDefinitions":[{"type":"npm","required":["script"],"properties":{"script":{"type":"string","description":"The npm script to customize."},"path":{"type":"string","description":"The path to the folder of the package.json file that provides the script. Can be omitted."}},"when":"shellExecutionSupported"}],"terminalQuickFixes":[{"id":"ms-vscode.npm-command","commandLineMatcher":"npm","commandExitResult":"error","outputMatcher":{"anchor":"bottom","length":8,"lineMatcher":"Did you mean (?:this|one of these)\\?((?:\\n.+?npm .+ #.+)+)","offset":2}}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/npm","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.objective-c"},"manifest":{"name":"objective-c","displayName":"Objective-C Language Basics","description":"Provides syntax highlighting and bracket matching in Objective-C files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ./build/update-grammars.js"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"objective-c","extensions":[".m"],"aliases":["Objective-C"],"configuration":"./language-configuration.json"},{"id":"objective-cpp","extensions":[".mm"],"aliases":["Objective-C++"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"objective-c","scopeName":"source.objc","path":"./syntaxes/objective-c.tmLanguage.json"},{"language":"objective-cpp","scopeName":"source.objcpp","path":"./syntaxes/objective-c++.tmLanguage.json"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/objective-c","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.perl"},"manifest":{"name":"perl","displayName":"Perl Language Basics","description":"Provides syntax highlighting and bracket matching in Perl files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin textmate/perl.tmbundle Syntaxes/Perl.plist ./syntaxes/perl.tmLanguage.json Syntaxes/Perl%206.tmLanguage ./syntaxes/perl6.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"perl","aliases":["Perl","perl"],"extensions":[".pl",".pm",".pod",".t",".PL",".psgi"],"firstLine":"^#!.*\\bperl\\b","configuration":"./perl.language-configuration.json"},{"id":"raku","aliases":["Raku","Perl6","perl6"],"extensions":[".raku",".rakumod",".rakutest",".rakudoc",".nqp",".p6",".pl6",".pm6"],"firstLine":"(^#!.*\\bperl6\\b)|use\\s+v6|raku|=begin\\spod|my\\sclass","configuration":"./perl6.language-configuration.json"}],"grammars":[{"language":"perl","scopeName":"source.perl","path":"./syntaxes/perl.tmLanguage.json","unbalancedBracketScopes":["variable.other.predefined.perl"]},{"language":"raku","scopeName":"source.perl.6","path":"./syntaxes/perl6.tmLanguage.json"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/perl","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.php"},"manifest":{"name":"php","displayName":"PHP Language Basics","description":"Provides syntax highlighting and bracket matching for PHP files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"0.10.x"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"php","extensions":[".php",".php4",".php5",".phtml",".ctp"],"aliases":["PHP","php"],"firstLine":"^#!\\s*/.*\\bphp\\b","mimetypes":["application/x-php"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"php","scopeName":"source.php","path":"./syntaxes/php.tmLanguage.json"},{"language":"php","scopeName":"text.html.php","path":"./syntaxes/html.tmLanguage.json","embeddedLanguages":{"text.html":"html","source.php":"php","source.sql":"sql","text.xml":"xml","source.js":"javascript","source.json":"json","source.css":"css"}}],"snippets":[{"language":"php","path":"./snippets/php.code-snippets"}]},"scripts":{"update-grammar":"node ./build/update-grammar.mjs"},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/php","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.php-language-features"},"manifest":{"name":"php-language-features","displayName":"PHP Language Features","description":"Provides rich language support for PHP files.","version":"1.0.0","publisher":"vscode","license":"MIT","icon":"icons/logo.png","engines":{"vscode":"0.10.x"},"activationEvents":["onLanguage:php"],"main":"./dist/phpMain","categories":["Programming Languages"],"capabilities":{"virtualWorkspaces":false,"untrustedWorkspaces":{"supported":"limited","description":"The extension requires workspace trust when the `php.validate.executablePath` setting will load a version of PHP in the workspace.","restrictedConfigurations":["php.validate.executablePath"]}},"contributes":{"configuration":{"title":"PHP","type":"object","order":20,"properties":{"php.suggest.basic":{"type":"boolean","default":true,"description":"Controls whether the built-in PHP language suggestions are enabled. The support suggests PHP globals and variables."},"php.validate.enable":{"type":"boolean","default":true,"description":"Enable/disable built-in PHP validation."},"php.validate.executablePath":{"type":["string","null"],"default":null,"description":"Points to the PHP executable.","scope":"machine-overridable"},"php.validate.run":{"type":"string","enum":["onSave","onType"],"default":"onSave","description":"Whether the linter is run on save or on type."}}},"jsonValidation":[{"fileMatch":"composer.json","url":"https://getcomposer.org/schema.json"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/php-language-features","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.powershell"},"manifest":{"name":"powershell","displayName":"Powershell Language Basics","description":"Provides snippets, syntax highlighting, bracket matching and folding in Powershell files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"powershell","extensions":[".ps1",".psm1",".psd1",".pssc",".psrc"],"aliases":["PowerShell","powershell","ps","ps1","pwsh"],"firstLine":"^#!\\s*/.*\\bpwsh\\b","configuration":"./language-configuration.json"}],"grammars":[{"language":"powershell","scopeName":"source.powershell","path":"./syntaxes/powershell.tmLanguage.json"}]},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin PowerShell/EditorSyntax PowerShellSyntax.tmLanguage ./syntaxes/powershell.tmLanguage.json"},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/powershell","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.prompt"},"manifest":{"name":"prompt","displayName":"Prompt Language Basics","description":"Syntax highlighting for Prompt and Instructions documents.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"^1.20.0"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"prompt","aliases":["Prompt","prompt"],"extensions":[".prompt.md"],"configuration":"./language-configuration.json"},{"id":"instructions","aliases":["Instructions","instructions"],"extensions":[".instructions.md","copilot-instructions.md"],"configuration":"./language-configuration.json"},{"id":"chatagent","aliases":["Agent","chat agent"],"extensions":[".agent.md",".chatmode.md"],"filenamePatterns":["**/.github/agents/*.md"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"prompt","path":"./syntaxes/prompt.tmLanguage.json","scopeName":"text.html.markdown.prompt","unbalancedBracketScopes":["markup.underline.link.markdown","punctuation.definition.list.begin.markdown"]},{"language":"instructions","path":"./syntaxes/prompt.tmLanguage.json","scopeName":"text.html.markdown.prompt","unbalancedBracketScopes":["markup.underline.link.markdown","punctuation.definition.list.begin.markdown"]},{"language":"chatagent","path":"./syntaxes/prompt.tmLanguage.json","scopeName":"text.html.markdown.prompt","unbalancedBracketScopes":["markup.underline.link.markdown","punctuation.definition.list.begin.markdown"]}],"configurationDefaults":{"[prompt]":{"editor.insertSpaces":true,"editor.tabSize":2,"editor.autoIndent":"advanced","editor.unicodeHighlight.ambiguousCharacters":false,"editor.unicodeHighlight.invisibleCharacters":false,"diffEditor.ignoreTrimWhitespace":false,"editor.wordWrap":"on","editor.quickSuggestions":{"comments":"off","strings":"on","other":"on"},"editor.wordBasedSuggestions":"off"},"[instructions]":{"editor.insertSpaces":true,"editor.tabSize":2,"editor.autoIndent":"advanced","editor.unicodeHighlight.ambiguousCharacters":false,"editor.unicodeHighlight.invisibleCharacters":false,"diffEditor.ignoreTrimWhitespace":false,"editor.wordWrap":"on","editor.quickSuggestions":{"comments":"off","strings":"on","other":"on"},"editor.wordBasedSuggestions":"off"},"[chatagent]":{"editor.insertSpaces":true,"editor.tabSize":2,"editor.autoIndent":"advanced","editor.unicodeHighlight.ambiguousCharacters":false,"editor.unicodeHighlight.invisibleCharacters":false,"diffEditor.ignoreTrimWhitespace":false,"editor.wordWrap":"on","editor.quickSuggestions":{"comments":"off","strings":"on","other":"on"},"editor.wordBasedSuggestions":"off"}}},"scripts":{},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/prompt-basics","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.pug"},"manifest":{"name":"pug","displayName":"Pug Language Basics","description":"Provides syntax highlighting and bracket matching in Pug files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin davidrios/pug-tmbundle Syntaxes/Pug.JSON-tmLanguage ./syntaxes/pug.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"jade","extensions":[".pug",".jade"],"aliases":["Pug","Jade","jade"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"jade","scopeName":"text.pug","path":"./syntaxes/pug.tmLanguage.json"}],"configurationDefaults":{"[jade]":{"diffEditor.ignoreTrimWhitespace":false}}},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/pug","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.python"},"manifest":{"name":"python","displayName":"Python Language Basics","description":"Provides syntax highlighting, bracket matching and folding in Python files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"python","extensions":[".py",".rpy",".pyw",".cpy",".gyp",".gypi",".pyi",".ipy",".pyt"],"aliases":["Python","py"],"filenames":["SConstruct","SConscript"],"firstLine":"^#!\\s*/?.*\\bpython[0-9.-]*\\b","configuration":"./language-configuration.json"}],"grammars":[{"language":"python","scopeName":"source.python","path":"./syntaxes/MagicPython.tmLanguage.json"},{"scopeName":"source.regexp.python","path":"./syntaxes/MagicRegExp.tmLanguage.json"}],"configurationDefaults":{"[python]":{"diffEditor.ignoreTrimWhitespace":false,"editor.defaultColorDecorators":"never"}}},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin MagicStack/MagicPython grammars/MagicPython.tmLanguage ./syntaxes/MagicPython.tmLanguage.json grammars/MagicRegExp.tmLanguage ./syntaxes/MagicRegExp.tmLanguage.json"},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/python","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.r"},"manifest":{"name":"r","displayName":"R Language Basics","description":"Provides syntax highlighting and bracket matching in R files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin REditorSupport/vscode-R-syntax syntaxes/r.json ./syntaxes/r.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"r","extensions":[".r",".rhistory",".rprofile",".rt"],"aliases":["R","r"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"r","scopeName":"source.r","path":"./syntaxes/r.tmLanguage.json"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/r","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.razor"},"manifest":{"name":"razor","displayName":"Razor Language Basics","description":"Provides syntax highlighting, bracket matching and folding in Razor files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"0.10.x"},"scripts":{"update-grammar":"node ./build/update-grammar.mjs"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"razor","extensions":[".cshtml",".razor"],"aliases":["Razor","razor"],"mimetypes":["text/x-cshtml"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"razor","scopeName":"text.html.cshtml","path":"./syntaxes/cshtml.tmLanguage.json","embeddedLanguages":{"section.embedded.source.cshtml":"csharp","source.css":"css","source.js":"javascript"}}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/razor","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.references-view"},"manifest":{"name":"references-view","displayName":"Reference Search View","description":"Reference Search results as separate, stable view in the sidebar","icon":"media/icon.png","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"^1.67.0"},"capabilities":{"virtualWorkspaces":true,"untrustedWorkspaces":{"supported":true}},"repository":{"type":"git","url":"https://github.com/Microsoft/vscode-references-view"},"bugs":{"url":"https://github.com/Microsoft/vscode-references-view/issues"},"activationEvents":["onCommand:references-view.find","onCommand:editor.action.showReferences"],"main":"./dist/extension","browser":"./dist/extension.js","contributes":{"configuration":{"properties":{"references.preferredLocation":{"description":"Controls whether 'Peek References' or 'Find References' is invoked when selecting CodeLens references.","type":"string","default":"peek","enum":["peek","view"],"enumDescriptions":["Show references in peek editor.","Show references in separate view."]}}},"viewsContainers":{"activitybar":[{"id":"references-view","icon":"$(references)","title":"References"}]},"views":{"references-view":[{"id":"references-view.tree","name":"Reference Search Results","when":"reference-list.isActive"}]},"commands":[{"command":"references-view.findReferences","title":"Find All References","category":"References"},{"command":"references-view.findImplementations","title":"Find All Implementations","category":"References"},{"command":"references-view.clearHistory","title":"Clear History","category":"References","icon":"$(clear-all)"},{"command":"references-view.clear","title":"Clear","category":"References","icon":"$(clear-all)"},{"command":"references-view.refresh","title":"Refresh","category":"References","icon":"$(refresh)"},{"command":"references-view.pickFromHistory","title":"Show History","category":"References"},{"command":"references-view.removeReferenceItem","title":"Dismiss","icon":"$(close)"},{"command":"references-view.copy","title":"Copy"},{"command":"references-view.copyAll","title":"Copy All"},{"command":"references-view.copyPath","title":"Copy Path"},{"command":"references-view.refind","title":"Rerun","icon":"$(refresh)"},{"command":"references-view.showCallHierarchy","title":"Show Call Hierarchy","category":"Calls"},{"command":"references-view.showOutgoingCalls","title":"Show Outgoing Calls","category":"Calls","icon":"$(call-incoming)"},{"command":"references-view.showIncomingCalls","title":"Show Incoming Calls","category":"Calls","icon":"$(call-outgoing)"},{"command":"references-view.removeCallItem","title":"Dismiss","icon":"$(close)"},{"command":"references-view.next","title":"Go to Next Reference","enablement":"references-view.canNavigate"},{"command":"references-view.prev","title":"Go to Previous Reference","enablement":"references-view.canNavigate"},{"command":"references-view.showTypeHierarchy","title":"Show Type Hierarchy","category":"Types"},{"command":"references-view.showSupertypes","title":"Show Supertypes","category":"Types","icon":"$(type-hierarchy-super)"},{"command":"references-view.showSubtypes","title":"Show Subtypes","category":"Types","icon":"$(type-hierarchy-sub)"},{"command":"references-view.removeTypeItem","title":"Dismiss","icon":"$(close)"}],"menus":{"editor/context":[{"command":"references-view.findReferences","when":"editorHasReferenceProvider","group":"0_navigation@1"},{"command":"references-view.findImplementations","when":"editorHasImplementationProvider","group":"0_navigation@2"},{"command":"references-view.showCallHierarchy","when":"editorHasCallHierarchyProvider","group":"0_navigation@3"},{"command":"references-view.showTypeHierarchy","when":"editorHasTypeHierarchyProvider","group":"0_navigation@4"}],"view/title":[{"command":"references-view.clear","group":"navigation@3","when":"view == references-view.tree && reference-list.hasResult"},{"command":"references-view.clearHistory","group":"navigation@3","when":"view == references-view.tree && reference-list.hasHistory && !reference-list.hasResult"},{"command":"references-view.refresh","group":"navigation@2","when":"view == references-view.tree && reference-list.hasResult"},{"command":"references-view.showOutgoingCalls","group":"navigation@1","when":"view == references-view.tree && reference-list.hasResult && reference-list.source == callHierarchy && references-view.callHierarchyMode == showIncoming"},{"command":"references-view.showIncomingCalls","group":"navigation@1","when":"view == references-view.tree && reference-list.hasResult && reference-list.source == callHierarchy && references-view.callHierarchyMode == showOutgoing"},{"command":"references-view.showSupertypes","group":"navigation@1","when":"view == references-view.tree && reference-list.hasResult && reference-list.source == typeHierarchy && references-view.typeHierarchyMode != supertypes"},{"command":"references-view.showSubtypes","group":"navigation@1","when":"view == references-view.tree && reference-list.hasResult && reference-list.source == typeHierarchy && references-view.typeHierarchyMode != subtypes"}],"view/item/context":[{"command":"references-view.removeReferenceItem","group":"inline","when":"view == references-view.tree && viewItem == file-item || view == references-view.tree && viewItem == reference-item"},{"command":"references-view.removeCallItem","group":"inline","when":"view == references-view.tree && viewItem == call-item"},{"command":"references-view.removeTypeItem","group":"inline","when":"view == references-view.tree && viewItem == type-item"},{"command":"references-view.refind","group":"inline","when":"view == references-view.tree && viewItem == history-item"},{"command":"references-view.removeReferenceItem","group":"1","when":"view == references-view.tree && viewItem == file-item || view == references-view.tree && viewItem == reference-item"},{"command":"references-view.removeCallItem","group":"1","when":"view == references-view.tree && viewItem == call-item"},{"command":"references-view.removeTypeItem","group":"1","when":"view == references-view.tree && viewItem == type-item"},{"command":"references-view.refind","group":"1","when":"view == references-view.tree && viewItem == history-item"},{"command":"references-view.copy","group":"2@1","when":"view == references-view.tree && viewItem == file-item || view == references-view.tree && viewItem == reference-item"},{"command":"references-view.copyPath","group":"2@2","when":"view == references-view.tree && viewItem == file-item"},{"command":"references-view.copyAll","group":"2@3","when":"view == references-view.tree && viewItem == file-item || view == references-view.tree && viewItem == reference-item"},{"command":"references-view.showOutgoingCalls","group":"1","when":"view == references-view.tree && viewItem == call-item"},{"command":"references-view.showIncomingCalls","group":"1","when":"view == references-view.tree && viewItem == call-item"},{"command":"references-view.showSupertypes","group":"1","when":"view == references-view.tree && viewItem == type-item"},{"command":"references-view.showSubtypes","group":"1","when":"view == references-view.tree && viewItem == type-item"}],"commandPalette":[{"command":"references-view.removeReferenceItem","when":"never"},{"command":"references-view.removeCallItem","when":"never"},{"command":"references-view.removeTypeItem","when":"never"},{"command":"references-view.copy","when":"never"},{"command":"references-view.copyAll","when":"never"},{"command":"references-view.copyPath","when":"never"},{"command":"references-view.refind","when":"never"},{"command":"references-view.findReferences","when":"editorHasReferenceProvider"},{"command":"references-view.clear","when":"reference-list.hasResult"},{"command":"references-view.clearHistory","when":"reference-list.isActive && !reference-list.hasResult"},{"command":"references-view.refresh","when":"reference-list.hasResult"},{"command":"references-view.pickFromHistory","when":"reference-list.isActive"},{"command":"references-view.next","when":"never"},{"command":"references-view.prev","when":"never"}]},"keybindings":[{"command":"references-view.findReferences","when":"editorHasReferenceProvider","key":"shift+alt+f12"},{"command":"references-view.next","when":"reference-list.hasResult","key":"f4"},{"command":"references-view.prev","when":"reference-list.hasResult","key":"shift+f4"},{"command":"references-view.showCallHierarchy","when":"editorHasCallHierarchyProvider","key":"shift+alt+h"}]}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/references-view","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.restructuredtext"},"manifest":{"name":"restructuredtext","displayName":"reStructuredText Language Basics","description":"Provides syntax highlighting in reStructuredText files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin trond-snekvik/vscode-rst syntaxes/rst.tmLanguage.json ./syntaxes/rst.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"restructuredtext","aliases":["reStructuredText"],"configuration":"./language-configuration.json","extensions":[".rst"]}],"grammars":[{"language":"restructuredtext","scopeName":"source.rst","path":"./syntaxes/rst.tmLanguage.json"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/restructuredtext","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.ruby"},"manifest":{"name":"ruby","displayName":"Ruby Language Basics","description":"Provides syntax highlighting and bracket matching in Ruby files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin Shopify/ruby-lsp vscode/grammars/ruby.cson.json ./syntaxes/ruby.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"ruby","extensions":[".rb",".rbx",".rjs",".gemspec",".rake",".ru",".erb",".podspec",".rbi"],"filenames":["rakefile","gemfile","guardfile","podfile","capfile","cheffile","hobofile","vagrantfile","appraisals","rantfile","berksfile","berksfile.lock","thorfile","puppetfile","dangerfile","brewfile","fastfile","appfile","deliverfile","matchfile","scanfile","snapfile","gymfile"],"aliases":["Ruby","rb"],"firstLine":"^#!\\s*/.*\\bruby\\b","configuration":"./language-configuration.json"}],"grammars":[{"language":"ruby","scopeName":"source.ruby","path":"./syntaxes/ruby.tmLanguage.json"}],"configurationDefaults":{"[ruby]":{"editor.defaultColorDecorators":"never"}}},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/ruby","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.rust"},"manifest":{"name":"rust","displayName":"Rust Language Basics","description":"Provides syntax highlighting and bracket matching in Rust files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ./build/update-grammar.mjs"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"rust","extensions":[".rs"],"aliases":["Rust","rust"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"rust","path":"./syntaxes/rust.tmLanguage.json","scopeName":"source.rust"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/rust","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.scss"},"manifest":{"name":"scss","displayName":"SCSS Language Basics","description":"Provides syntax highlighting, bracket matching and folding in SCSS files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin atom/language-sass grammars/scss.cson ./syntaxes/scss.tmLanguage.json grammars/sassdoc.cson ./syntaxes/sassdoc.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"scss","aliases":["SCSS","scss"],"extensions":[".scss"],"mimetypes":["text/x-scss","text/scss"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"scss","scopeName":"source.css.scss","path":"./syntaxes/scss.tmLanguage.json"},{"scopeName":"source.sassdoc","path":"./syntaxes/sassdoc.tmLanguage.json"}],"problemMatchers":[{"name":"node-sass","label":"Node Sass Compiler","owner":"node-sass","fileLocation":"absolute","pattern":[{"regexp":"^{$"},{"regexp":"\\s*\"status\":\\s\\d+,"},{"regexp":"\\s*\"file\":\\s\"(.*)\",","file":1},{"regexp":"\\s*\"line\":\\s(\\d+),","line":1},{"regexp":"\\s*\"column\":\\s(\\d+),","column":1},{"regexp":"\\s*\"message\":\\s\"(.*)\",","message":1},{"regexp":"\\s*\"formatted\":\\s(.*)"},{"regexp":"^}$"}]}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/scss","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.search-result"},"manifest":{"name":"search-result","displayName":"Search Result","description":"Provides syntax highlighting and language features for tabbed search results.","version":"1.0.0","publisher":"vscode","license":"MIT","icon":"images/icon.png","engines":{"vscode":"^1.39.0"},"main":"./dist/extension.js","browser":"./dist/extension.js","activationEvents":["onLanguage:search-result"],"capabilities":{"virtualWorkspaces":true,"untrustedWorkspaces":{"supported":true}},"enabledApiProposals":["documentFiltersExclusive"],"contributes":{"configurationDefaults":{"[search-result]":{"editor.lineNumbers":"off"}},"languages":[{"id":"search-result","extensions":[".code-search"],"aliases":["Search Result"]}],"grammars":[{"language":"search-result","scopeName":"text.searchResult","path":"./syntaxes/searchResult.tmLanguage.json"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/search-result","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.shaderlab"},"manifest":{"name":"shaderlab","displayName":"Shaderlab Language Basics","description":"Provides syntax highlighting and bracket matching in Shaderlab files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin tgjones/shaders-tmLanguage grammars/shaderlab.json ./syntaxes/shaderlab.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"shaderlab","extensions":[".shader"],"aliases":["ShaderLab","shaderlab"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"shaderlab","path":"./syntaxes/shaderlab.tmLanguage.json","scopeName":"source.shaderlab"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/shaderlab","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.shellscript"},"manifest":{"name":"shellscript","displayName":"Shell Script Language Basics","description":"Provides syntax highlighting and bracket matching in Shell Script files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin jeff-hykin/better-shell-syntax autogenerated/shell.tmLanguage.json ./syntaxes/shell-unix-bash.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"shellscript","aliases":["Shell Script","shellscript","bash","fish","sh","zsh","ksh","csh"],"extensions":[".sh",".bash",".bashrc",".bash_aliases",".bash_profile",".bash_login",".ebuild",".eclass",".profile",".bash_logout",".xprofile",".xsession",".xsessionrc",".Xsession",".zsh",".zshrc",".zprofile",".zlogin",".zlogout",".zshenv",".zsh-theme",".fish",".ksh",".csh",".cshrc",".tcshrc",".yashrc",".yash_profile"],"filenames":["APKBUILD","PKGBUILD",".envrc",".hushlogin","zshrc","zshenv","zlogin","zprofile","zlogout","bashrc_Apple_Terminal","zshrc_Apple_Terminal"],"firstLine":"^#!.*\\b(bash|fish|zsh|sh|ksh|dtksh|pdksh|mksh|ash|dash|yash|sh|csh|jcsh|tcsh|itcsh).*|^#\\s*-\\*-[^*]*mode:\\s*shell-script[^*]*-\\*-","configuration":"./language-configuration.json","mimetypes":["text/x-shellscript"]}],"grammars":[{"language":"shellscript","scopeName":"source.shell","path":"./syntaxes/shell-unix-bash.tmLanguage.json","balancedBracketScopes":["*"],"unbalancedBracketScopes":["meta.scope.case-pattern.shell"]}],"configurationDefaults":{"[shellscript]":{"files.eol":"\n","editor.defaultColorDecorators":"never"}}},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/shellscript","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.simple-browser"},"manifest":{"name":"simple-browser","displayName":"Simple Browser","description":"A very basic built-in webview for displaying web content.","enabledApiProposals":["externalUriOpener"],"version":"1.0.0","icon":"media/icon.png","publisher":"vscode","license":"MIT","aiKey":"0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255","engines":{"vscode":"^1.70.0"},"main":"./dist/extension","browser":"./dist/browser/extension","categories":["Other"],"extensionKind":["ui","workspace"],"activationEvents":["onCommand:simpleBrowser.api.open","onOpenExternalUri:http","onOpenExternalUri:https","onWebviewPanel:simpleBrowser.view"],"capabilities":{"virtualWorkspaces":true,"untrustedWorkspaces":{"supported":true}},"contributes":{"commands":[{"command":"simpleBrowser.show","title":"Show","category":"Simple Browser"}],"configuration":[{"title":"Simple Browser","properties":{"simpleBrowser.focusLockIndicator.enabled":{"type":"boolean","default":true,"title":"Focus Lock Indicator Enabled","description":"Enable/disable the floating indicator that shows when focused in the simple browser."}}}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/simple-browser","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.sql"},"manifest":{"name":"sql","displayName":"SQL Language Basics","description":"Provides syntax highlighting and bracket matching in SQL files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ./build/update-grammar.mjs"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"sql","extensions":[".sql",".dsql"],"aliases":["MS SQL","T-SQL"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"sql","scopeName":"source.sql","path":"./syntaxes/sql.tmLanguage.json"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/sql","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.swift"},"manifest":{"name":"swift","displayName":"Swift Language Basics","description":"Provides snippets, syntax highlighting and bracket matching in Swift files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin jtbandes/swift-tmlanguage Swift.tmLanguage.json ./syntaxes/swift.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"swift","aliases":["Swift","swift"],"extensions":[".swift"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"swift","scopeName":"source.swift","path":"./syntaxes/swift.tmLanguage.json"}],"snippets":[{"language":"swift","path":"./snippets/swift.code-snippets"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/swift","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.terminal-suggest"},"manifest":{"name":"terminal-suggest","publisher":"vscode","displayName":"Terminal Suggest for VS Code","description":"Extension to add terminal completions for zsh, bash, and fish terminals.","version":"1.0.1","private":true,"license":"MIT","icon":"./src/media/icon.png","engines":{"vscode":"^1.95.0"},"categories":["Other"],"enabledApiProposals":["terminalCompletionProvider","terminalShellEnv"],"contributes":{"commands":[{"command":"terminal.integrated.suggest.clearCachedGlobals","category":"Terminal","title":"Clear Suggest Cached Globals"}],"terminal":{"completionProviders":[{"description":"Show suggestions for commands, arguments, flags, and file paths based upon the Fig spec."}]}},"main":"./dist/terminalSuggestMain","activationEvents":["onTerminalShellIntegration:*"],"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/terminal-suggest","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.theme-abyss"},"manifest":{"name":"theme-abyss","displayName":"Abyss Theme","description":"Abyss theme for Visual Studio Code","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"categories":["Themes"],"contributes":{"themes":[{"id":"Abyss","label":"Abyss","uiTheme":"vs-dark","path":"./themes/abyss-color-theme.json"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/theme-abyss","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.theme-defaults"},"manifest":{"name":"theme-defaults","displayName":"Default Themes","description":"The default Visual Studio light and dark themes","categories":["Themes"],"version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"contributes":{"themes":[{"id":"Default Dark+","label":"Dark+","uiTheme":"vs-dark","path":"./themes/dark_plus.json"},{"id":"Default Dark Modern","label":"Dark Modern","uiTheme":"vs-dark","path":"./themes/dark_modern.json"},{"id":"Default Light+","label":"Light+","uiTheme":"vs","path":"./themes/light_plus.json"},{"id":"Default Light Modern","label":"Light Modern","uiTheme":"vs","path":"./themes/light_modern.json"},{"id":"Visual Studio Dark","label":"Dark (Visual Studio)","uiTheme":"vs-dark","path":"./themes/dark_vs.json"},{"id":"Visual Studio Light","label":"Light (Visual Studio)","uiTheme":"vs","path":"./themes/light_vs.json"},{"id":"Default High Contrast","label":"Dark High Contrast","uiTheme":"hc-black","path":"./themes/hc_black.json"},{"id":"Default High Contrast Light","label":"Light High Contrast","uiTheme":"hc-light","path":"./themes/hc_light.json"}],"iconThemes":[{"id":"vs-minimal","label":"Minimal (Visual Studio Code)","path":"./fileicons/vs_minimal-icon-theme.json"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/theme-defaults","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.theme-kimbie-dark"},"manifest":{"name":"theme-kimbie-dark","displayName":"Kimbie Dark Theme","description":"Kimbie dark theme for Visual Studio Code","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"categories":["Themes"],"contributes":{"themes":[{"id":"Kimbie Dark","label":"Kimbie Dark","uiTheme":"vs-dark","path":"./themes/kimbie-dark-color-theme.json"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/theme-kimbie-dark","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.theme-monokai"},"manifest":{"name":"theme-monokai","displayName":"Monokai Theme","description":"Monokai theme for Visual Studio Code","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"categories":["Themes"],"contributes":{"themes":[{"id":"Monokai","label":"Monokai","uiTheme":"vs-dark","path":"./themes/monokai-color-theme.json"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/theme-monokai","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.theme-monokai-dimmed"},"manifest":{"name":"theme-monokai-dimmed","displayName":"Monokai Dimmed Theme","description":"Monokai dimmed theme for Visual Studio Code","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"categories":["Themes"],"contributes":{"themes":[{"id":"Monokai Dimmed","label":"Monokai Dimmed","uiTheme":"vs-dark","path":"./themes/dimmed-monokai-color-theme.json"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/theme-monokai-dimmed","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.theme-quietlight"},"manifest":{"name":"theme-quietlight","displayName":"Quiet Light Theme","description":"Quiet light theme for Visual Studio Code","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"categories":["Themes"],"contributes":{"themes":[{"id":"Quiet Light","label":"Quiet Light","uiTheme":"vs","path":"./themes/quietlight-color-theme.json"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/theme-quietlight","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.theme-red"},"manifest":{"name":"theme-red","displayName":"Red Theme","description":"Red theme for Visual Studio Code","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"categories":["Themes"],"contributes":{"themes":[{"id":"Red","label":"Red","uiTheme":"vs-dark","path":"./themes/Red-color-theme.json"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/theme-red","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.vscode-theme-seti"},"manifest":{"name":"vscode-theme-seti","private":true,"version":"1.0.0","displayName":"Seti File Icon Theme","description":"A file icon theme made out of the Seti UI file icons","publisher":"vscode","license":"MIT","icon":"icons/seti-circular-128x128.png","scripts":{"update":"node ./build/update-icon-theme.js"},"engines":{"vscode":"*"},"categories":["Themes"],"contributes":{"iconThemes":[{"id":"vs-seti","label":"Seti (Visual Studio Code)","path":"./icons/vs-seti-icon-theme.json"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/theme-seti","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.theme-solarized-dark"},"manifest":{"name":"theme-solarized-dark","displayName":"Solarized Dark Theme","description":"Solarized dark theme for Visual Studio Code","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"categories":["Themes"],"contributes":{"themes":[{"id":"Solarized Dark","label":"Solarized Dark","uiTheme":"vs-dark","path":"./themes/solarized-dark-color-theme.json"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/theme-solarized-dark","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.theme-solarized-light"},"manifest":{"name":"theme-solarized-light","displayName":"Solarized Light Theme","description":"Solarized light theme for Visual Studio Code","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"categories":["Themes"],"contributes":{"themes":[{"id":"Solarized Light","label":"Solarized Light","uiTheme":"vs","path":"./themes/solarized-light-color-theme.json"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/theme-solarized-light","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.theme-tomorrow-night-blue"},"manifest":{"name":"theme-tomorrow-night-blue","displayName":"Tomorrow Night Blue Theme","description":"Tomorrow night blue theme for Visual Studio Code","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"categories":["Themes"],"contributes":{"themes":[{"id":"Tomorrow Night Blue","label":"Tomorrow Night Blue","uiTheme":"vs-dark","path":"./themes/tomorrow-night-blue-color-theme.json"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/theme-tomorrow-night-blue","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.tunnel-forwarding"},"manifest":{"name":"tunnel-forwarding","displayName":"Local Tunnel Port Forwarding","description":"Allows forwarding local ports to be accessible over the internet.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"^1.82.0"},"icon":"media/icon.png","capabilities":{"virtualWorkspaces":false,"untrustedWorkspaces":{"supported":true}},"enabledApiProposals":["resolvers","tunnelFactory"],"activationEvents":["onTunnel"],"contributes":{"commands":[{"category":"Port Forwarding","command":"tunnel-forwarding.showLog","title":"Show Log","enablement":"tunnelForwardingHasLog"},{"category":"Port Forwarding","command":"tunnel-forwarding.restart","title":"Restart Forwarding System","enablement":"tunnelForwardingIsRunning"}]},"main":"./dist/extension","prettier":{"printWidth":100,"trailingComma":"all","singleQuote":true,"arrowParens":"avoid"},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/tunnel-forwarding","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.typescript"},"manifest":{"name":"typescript","description":"Provides snippets, syntax highlighting, bracket matching and folding in TypeScript files.","displayName":"TypeScript Language Basics","version":"1.0.0","author":"vscode","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ./build/update-grammars.mjs"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"typescript","aliases":["TypeScript","ts","typescript"],"extensions":[".ts",".cts",".mts"],"configuration":"./language-configuration.json"},{"id":"typescriptreact","aliases":["TypeScript JSX","TypeScript React","tsx"],"extensions":[".tsx"],"configuration":"./language-configuration.json"},{"id":"jsonc","filenames":["tsconfig.json","jsconfig.json"],"filenamePatterns":["tsconfig.*.json","jsconfig.*.json","tsconfig-*.json","jsconfig-*.json"]},{"id":"json","extensions":[".tsbuildinfo"]}],"grammars":[{"language":"typescript","scopeName":"source.ts","path":"./syntaxes/TypeScript.tmLanguage.json","unbalancedBracketScopes":["keyword.operator.relational","storage.type.function.arrow","keyword.operator.bitwise.shift","meta.brace.angle","punctuation.definition.tag","keyword.operator.assignment.compound.bitwise.ts"],"tokenTypes":{"punctuation.definition.template-expression":"other","entity.name.type.instance.jsdoc":"other","entity.name.function.tagged-template":"other","meta.import string.quoted":"other","variable.other.jsdoc":"other"}},{"language":"typescriptreact","scopeName":"source.tsx","path":"./syntaxes/TypeScriptReact.tmLanguage.json","unbalancedBracketScopes":["keyword.operator.relational","storage.type.function.arrow","keyword.operator.bitwise.shift","punctuation.definition.tag","keyword.operator.assignment.compound.bitwise.ts"],"embeddedLanguages":{"meta.tag.tsx":"jsx-tags","meta.tag.without-attributes.tsx":"jsx-tags","meta.tag.attributes.tsx":"typescriptreact","meta.embedded.expression.tsx":"typescriptreact"},"tokenTypes":{"punctuation.definition.template-expression":"other","entity.name.type.instance.jsdoc":"other","entity.name.function.tagged-template":"other","meta.import string.quoted":"other","variable.other.jsdoc":"other"}},{"scopeName":"documentation.injection.ts","path":"./syntaxes/jsdoc.ts.injection.tmLanguage.json","injectTo":["source.ts","source.tsx"]},{"scopeName":"documentation.injection.js.jsx","path":"./syntaxes/jsdoc.js.injection.tmLanguage.json","injectTo":["source.js","source.js.jsx"]}],"semanticTokenScopes":[{"language":"typescript","scopes":{"property":["variable.other.property.ts"],"property.readonly":["variable.other.constant.property.ts"],"variable":["variable.other.readwrite.ts"],"variable.readonly":["variable.other.constant.object.ts"],"function":["entity.name.function.ts"],"namespace":["entity.name.type.module.ts"],"variable.defaultLibrary":["support.variable.ts"],"function.defaultLibrary":["support.function.ts"]}},{"language":"typescriptreact","scopes":{"property":["variable.other.property.tsx"],"property.readonly":["variable.other.constant.property.tsx"],"variable":["variable.other.readwrite.tsx"],"variable.readonly":["variable.other.constant.object.tsx"],"function":["entity.name.function.tsx"],"namespace":["entity.name.type.module.tsx"],"variable.defaultLibrary":["support.variable.tsx"],"function.defaultLibrary":["support.function.tsx"]}}],"snippets":[{"language":"typescript","path":"./snippets/typescript.code-snippets"},{"language":"typescriptreact","path":"./snippets/typescript.code-snippets"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/typescript-basics","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.typescript-language-features"},"manifest":{"name":"typescript-language-features","description":"Provides rich language support for JavaScript and TypeScript.","displayName":"TypeScript and JavaScript Language Features","version":"1.0.0","author":"vscode","publisher":"vscode","license":"MIT","aiKey":"0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255","enabledApiProposals":["workspaceTrust","multiDocumentHighlightProvider","codeActionAI","codeActionRanges","editorHoverVerbosityLevel"],"capabilities":{"virtualWorkspaces":{"supported":"limited","description":"In virtual workspaces, resolving and finding references across files is not supported."},"untrustedWorkspaces":{"supported":"limited","description":"The extension requires workspace trust when the workspace version is used because it executes code specified by the workspace.","restrictedConfigurations":["typescript.tsdk","typescript.tsserver.pluginPaths","typescript.npm","typescript.tsserver.nodePath"]}},"engines":{"vscode":"^1.30.0"},"icon":"media/icon.png","categories":["Programming Languages"],"activationEvents":["onLanguage:javascript","onLanguage:javascriptreact","onLanguage:typescript","onLanguage:typescriptreact","onLanguage:jsx-tags","onCommand:typescript.tsserverRequest","onCommand:_typescript.configurePlugin","onCommand:_typescript.learnMoreAboutRefactorings","onCommand:typescript.fileReferences","onTaskType:typescript","onLanguage:jsonc","onWalkthrough:nodejsWelcome"],"main":"./dist/extension","browser":"./dist/browser/extension","contributes":{"jsonValidation":[{"fileMatch":"package.json","url":"./schemas/package.schema.json"},{"fileMatch":"tsconfig.json","url":"https://www.schemastore.org/tsconfig"},{"fileMatch":"tsconfig.json","url":"./schemas/tsconfig.schema.json"},{"fileMatch":"tsconfig.*.json","url":"https://www.schemastore.org/tsconfig"},{"fileMatch":"tsconfig-*.json","url":"./schemas/tsconfig.schema.json"},{"fileMatch":"tsconfig-*.json","url":"https://www.schemastore.org/tsconfig"},{"fileMatch":"tsconfig.*.json","url":"./schemas/tsconfig.schema.json"},{"fileMatch":"typings.json","url":"https://www.schemastore.org/typings"},{"fileMatch":".bowerrc","url":"https://www.schemastore.org/bowerrc"},{"fileMatch":".babelrc","url":"https://www.schemastore.org/babelrc"},{"fileMatch":".babelrc.json","url":"https://www.schemastore.org/babelrc"},{"fileMatch":"babel.config.json","url":"https://www.schemastore.org/babelrc"},{"fileMatch":"jsconfig.json","url":"https://www.schemastore.org/jsconfig"},{"fileMatch":"jsconfig.json","url":"./schemas/jsconfig.schema.json"},{"fileMatch":"jsconfig.*.json","url":"https://www.schemastore.org/jsconfig"},{"fileMatch":"jsconfig.*.json","url":"./schemas/jsconfig.schema.json"},{"fileMatch":".swcrc","url":"https://swc.rs/schema.json"},{"fileMatch":"typedoc.json","url":"https://typedoc.org/schema.json"}],"configuration":[{"type":"object","order":20,"properties":{"typescript.tsdk":{"type":"string","markdownDescription":"Specifies the folder path to the tsserver and `lib*.d.ts` files under a TypeScript install to use for IntelliSense, for example: `./node_modules/typescript/lib`.\n\n- When specified as a user setting, the TypeScript version from `typescript.tsdk` automatically replaces the built-in TypeScript version.\n- When specified as a workspace setting, `typescript.tsdk` allows you to switch to use that workspace version of TypeScript for IntelliSense with the `TypeScript: Select TypeScript version` command.\n\nSee the [TypeScript documentation](https://code.visualstudio.com/docs/typescript/typescript-compiling#_using-newer-typescript-versions) for more detail about managing TypeScript versions.","scope":"window"},"typescript.disableAutomaticTypeAcquisition":{"type":"boolean","default":false,"markdownDescription":"Disables [automatic type acquisition](https://code.visualstudio.com/docs/nodejs/working-with-javascript#_typings-and-automatic-type-acquisition). Automatic type acquisition fetches `@types` packages from npm to improve IntelliSense for external libraries.","scope":"window","tags":["usesOnlineServices"]},"typescript.enablePromptUseWorkspaceTsdk":{"type":"boolean","default":false,"description":"Enables prompting of users to use the TypeScript version configured in the workspace for Intellisense.","scope":"window"},"javascript.referencesCodeLens.enabled":{"type":"boolean","default":false,"description":"Enable/disable references CodeLens in JavaScript files.","scope":"window"},"javascript.referencesCodeLens.showOnAllFunctions":{"type":"boolean","default":false,"description":"Enable/disable references CodeLens on all functions in JavaScript files.","scope":"window"},"typescript.referencesCodeLens.enabled":{"type":"boolean","default":false,"description":"Enable/disable references CodeLens in TypeScript files.","scope":"window"},"typescript.referencesCodeLens.showOnAllFunctions":{"type":"boolean","default":false,"description":"Enable/disable references CodeLens on all functions in TypeScript files.","scope":"window"},"typescript.implementationsCodeLens.enabled":{"type":"boolean","default":false,"description":"Enable/disable implementations CodeLens. This CodeLens shows the implementers of an interface.","scope":"window"},"typescript.experimental.useTsgo":{"type":"boolean","default":false,"markdownDescription":"Disables TypeScript and JavaScript language features to allow usage of the TypeScript Go experimental extension. Requires TypeScript Go to be installed and configured. Requires reloading extensions after changing this setting.","scope":"window","tags":["experimental"]},"typescript.implementationsCodeLens.showOnInterfaceMethods":{"type":"boolean","default":false,"description":"Enable/disable implementations CodeLens on interface methods.","scope":"window"},"typescript.implementationsCodeLens.showOnAllClassMethods":{"type":"boolean","default":false,"description":"Enable/disable showing implementations CodeLens above all class methods instead of only on abstract methods.","scope":"window"},"typescript.reportStyleChecksAsWarnings":{"type":"boolean","default":true,"description":"Report style checks as warnings.","scope":"window"},"typescript.validate.enable":{"type":"boolean","default":true,"description":"Enable/disable TypeScript validation.","scope":"window"},"javascript.validate.enable":{"type":"boolean","default":true,"description":"Enable/disable JavaScript validation.","scope":"window"},"js/ts.implicitProjectConfig.module":{"type":"string","markdownDescription":"Sets the module system for the program. See more: https://www.typescriptlang.org/tsconfig#module.","default":"ESNext","enum":["CommonJS","AMD","System","UMD","ES6","ES2015","ES2020","ESNext","None","ES2022","Node12","NodeNext"],"scope":"window"},"js/ts.implicitProjectConfig.target":{"type":"string","default":"ES2024","markdownDescription":"Set target JavaScript language version for emitted JavaScript and include library declarations. See more: https://www.typescriptlang.org/tsconfig#target.","enum":["ES3","ES5","ES6","ES2015","ES2016","ES2017","ES2018","ES2019","ES2020","ES2021","ES2022","ES2023","ES2024","ESNext"],"scope":"window"},"js/ts.implicitProjectConfig.checkJs":{"type":"boolean","default":false,"markdownDescription":"Enable/disable semantic checking of JavaScript files. Existing `jsconfig.json` or `tsconfig.json` files override this setting.","scope":"window"},"js/ts.implicitProjectConfig.experimentalDecorators":{"type":"boolean","default":false,"markdownDescription":"Enable/disable `experimentalDecorators` in JavaScript files that are not part of a project. Existing `jsconfig.json` or `tsconfig.json` files override this setting.","scope":"window"},"js/ts.implicitProjectConfig.strictNullChecks":{"type":"boolean","default":true,"markdownDescription":"Enable/disable [strict null checks](https://www.typescriptlang.org/tsconfig#strictNullChecks) in JavaScript and TypeScript files that are not part of a project. Existing `jsconfig.json` or `tsconfig.json` files override this setting.","scope":"window"},"js/ts.implicitProjectConfig.strictFunctionTypes":{"type":"boolean","default":true,"markdownDescription":"Enable/disable [strict function types](https://www.typescriptlang.org/tsconfig#strictFunctionTypes) in JavaScript and TypeScript files that are not part of a project. Existing `jsconfig.json` or `tsconfig.json` files override this setting.","scope":"window"},"js/ts.implicitProjectConfig.strict":{"type":"boolean","default":true,"markdownDescription":"Enable/disable [strict mode](https://www.typescriptlang.org/tsconfig#strict) in JavaScript and TypeScript files that are not part of a project. Existing `jsconfig.json` or `tsconfig.json` files override this setting.","scope":"window"},"typescript.tsc.autoDetect":{"type":"string","default":"on","enum":["on","off","build","watch"],"markdownEnumDescriptions":["Create both build and watch tasks.","Disable this feature.","Only create single run compile tasks.","Only create compile and watch tasks."],"description":"Controls auto detection of tsc tasks.","scope":"window"},"typescript.locale":{"type":"string","default":"auto","enum":["auto","de","es","en","fr","it","ja","ko","ru","zh-CN","zh-TW"],"enumDescriptions":["Use VS Code's configured display language.","Deutsch","español","English","français","italiano","日本語","한국어","русский","中文(简体)","中文(繁體)"],"markdownDescription":"Sets the locale used to report JavaScript and TypeScript errors. Defaults to use VS Code's locale.","scope":"window"},"javascript.suggestionActions.enabled":{"type":"boolean","default":true,"description":"Enable/disable suggestion diagnostics for JavaScript files in the editor.","scope":"resource"},"typescript.suggestionActions.enabled":{"type":"boolean","default":true,"description":"Enable/disable suggestion diagnostics for TypeScript files in the editor.","scope":"resource"},"typescript.updateImportsOnFileMove.enabled":{"type":"string","enum":["prompt","always","never"],"markdownEnumDescriptions":["Prompt on each rename.","Always update paths automatically.","Never rename paths and don't prompt."],"default":"prompt","description":"Enable/disable automatic updating of import paths when you rename or move a file in VS Code.","scope":"resource"},"javascript.updateImportsOnFileMove.enabled":{"type":"string","enum":["prompt","always","never"],"markdownEnumDescriptions":["Prompt on each rename.","Always update paths automatically.","Never rename paths and don't prompt."],"default":"prompt","description":"Enable/disable automatic updating of import paths when you rename or move a file in VS Code.","scope":"resource"},"typescript.autoClosingTags":{"type":"boolean","default":true,"description":"Enable/disable automatic closing of JSX tags.","scope":"language-overridable"},"javascript.autoClosingTags":{"type":"boolean","default":true,"description":"Enable/disable automatic closing of JSX tags.","scope":"language-overridable"},"typescript.workspaceSymbols.scope":{"type":"string","enum":["allOpenProjects","currentProject"],"enumDescriptions":["Search all open JavaScript or TypeScript projects for symbols.","Only search for symbols in the current JavaScript or TypeScript project."],"default":"allOpenProjects","markdownDescription":"Controls which files are searched by [Go to Symbol in Workspace](https://code.visualstudio.com/docs/editor/editingevolved#_open-symbol-by-name).","scope":"window"},"typescript.preferGoToSourceDefinition":{"type":"boolean","default":false,"description":"Makes `Go to Definition` avoid type declaration files when possible by triggering `Go to Source Definition` instead. This allows `Go to Source Definition` to be triggered with the mouse gesture.","scope":"window"},"javascript.preferGoToSourceDefinition":{"type":"boolean","default":false,"description":"Makes `Go to Definition` avoid type declaration files when possible by triggering `Go to Source Definition` instead. This allows `Go to Source Definition` to be triggered with the mouse gesture.","scope":"window"},"typescript.workspaceSymbols.excludeLibrarySymbols":{"type":"boolean","default":true,"markdownDescription":"Exclude symbols that come from library files in `Go to Symbol in Workspace` results. Requires using TypeScript 5.3+ in the workspace.","scope":"window"},"typescript.tsserver.enableRegionDiagnostics":{"type":"boolean","default":true,"description":"Enables region-based diagnostics in TypeScript. Requires using TypeScript 5.6+ in the workspace.","scope":"window"},"javascript.updateImportsOnPaste.enabled":{"scope":"window","type":"boolean","default":true,"markdownDescription":"Automatically update imports when pasting code. Requires TypeScript 5.6+."},"typescript.updateImportsOnPaste.enabled":{"scope":"window","type":"boolean","default":true,"markdownDescription":"Automatically update imports when pasting code. Requires TypeScript 5.6+."},"js/ts.hover.maximumLength":{"type":"number","default":500,"description":"The maximum number of characters in a hover. If the hover is longer than this, it will be truncated. Requires TypeScript 5.9+.","scope":"resource"}}},{"type":"object","title":"Suggestions","order":21,"properties":{"javascript.suggest.enabled":{"type":"boolean","default":true,"description":"Enable/disable autocomplete suggestions.","scope":"language-overridable"},"typescript.suggest.enabled":{"type":"boolean","default":true,"description":"Enable/disable autocomplete suggestions.","scope":"language-overridable"},"javascript.suggest.autoImports":{"type":"boolean","default":true,"description":"Enable/disable auto import suggestions.","scope":"resource"},"typescript.suggest.autoImports":{"type":"boolean","default":true,"description":"Enable/disable auto import suggestions.","scope":"resource"},"javascript.suggest.names":{"type":"boolean","default":true,"markdownDescription":"Enable/disable including unique names from the file in JavaScript suggestions. Note that name suggestions are always disabled in JavaScript code that is semantically checked using `@ts-check` or `checkJs`.","scope":"resource"},"javascript.suggest.completeFunctionCalls":{"type":"boolean","default":false,"description":"Complete functions with their parameter signature.","scope":"resource"},"typescript.suggest.completeFunctionCalls":{"type":"boolean","default":false,"description":"Complete functions with their parameter signature.","scope":"resource"},"javascript.suggest.paths":{"type":"boolean","default":true,"description":"Enable/disable suggestions for paths in import statements and require calls.","scope":"resource"},"typescript.suggest.paths":{"type":"boolean","default":true,"description":"Enable/disable suggestions for paths in import statements and require calls.","scope":"resource"},"javascript.suggest.completeJSDocs":{"type":"boolean","default":true,"description":"Enable/disable suggestion to complete JSDoc comments.","scope":"language-overridable"},"typescript.suggest.completeJSDocs":{"type":"boolean","default":true,"description":"Enable/disable suggestion to complete JSDoc comments.","scope":"language-overridable"},"javascript.suggest.jsdoc.generateReturns":{"type":"boolean","default":true,"markdownDescription":"Enable/disable generating `@returns` annotations for JSDoc templates.","scope":"language-overridable"},"typescript.suggest.jsdoc.generateReturns":{"type":"boolean","default":true,"markdownDescription":"Enable/disable generating `@returns` annotations for JSDoc templates.","scope":"language-overridable"},"javascript.suggest.includeAutomaticOptionalChainCompletions":{"type":"boolean","default":true,"description":"Enable/disable showing completions on potentially undefined values that insert an optional chain call. Requires strict null checks to be enabled.","scope":"resource"},"typescript.suggest.includeAutomaticOptionalChainCompletions":{"type":"boolean","default":true,"description":"Enable/disable showing completions on potentially undefined values that insert an optional chain call. Requires strict null checks to be enabled.","scope":"resource"},"javascript.suggest.includeCompletionsForImportStatements":{"type":"boolean","default":true,"description":"Enable/disable auto-import-style completions on partially-typed import statements.","scope":"resource"},"typescript.suggest.includeCompletionsForImportStatements":{"type":"boolean","default":true,"description":"Enable/disable auto-import-style completions on partially-typed import statements.","scope":"resource"},"javascript.suggest.classMemberSnippets.enabled":{"type":"boolean","default":true,"description":"Enable/disable snippet completions for class members.","scope":"resource"},"typescript.suggest.classMemberSnippets.enabled":{"type":"boolean","default":true,"description":"Enable/disable snippet completions for class members.","scope":"resource"},"typescript.suggest.objectLiteralMethodSnippets.enabled":{"type":"boolean","default":true,"description":"Enable/disable snippet completions for methods in object literals.","scope":"resource"}}},{"type":"object","title":"Preferences","order":21,"properties":{"javascript.preferences.quoteStyle":{"type":"string","enum":["auto","single","double"],"default":"auto","markdownDescription":"Preferred quote style to use for Quick Fixes.","markdownEnumDescriptions":["Infer quote type from existing code","Always use single quotes: `'`","Always use double quotes: `\"`"],"scope":"language-overridable"},"typescript.preferences.quoteStyle":{"type":"string","enum":["auto","single","double"],"default":"auto","markdownDescription":"Preferred quote style to use for Quick Fixes.","markdownEnumDescriptions":["Infer quote type from existing code","Always use single quotes: `'`","Always use double quotes: `\"`"],"scope":"language-overridable"},"javascript.preferences.importModuleSpecifier":{"type":"string","enum":["shortest","relative","non-relative","project-relative"],"markdownEnumDescriptions":["Prefers a non-relative import only if one is available that has fewer path segments than a relative import.","Prefers a relative path to the imported file location.","Prefers a non-relative import based on the `baseUrl` or `paths` configured in your `jsconfig.json` / `tsconfig.json`.","Prefers a non-relative import only if the relative import path would leave the package or project directory."],"default":"shortest","description":"Preferred path style for auto imports.","scope":"language-overridable"},"typescript.preferences.importModuleSpecifier":{"type":"string","enum":["shortest","relative","non-relative","project-relative"],"markdownEnumDescriptions":["Prefers a non-relative import only if one is available that has fewer path segments than a relative import.","Prefers a relative path to the imported file location.","Prefers a non-relative import based on the `baseUrl` or `paths` configured in your `jsconfig.json` / `tsconfig.json`.","Prefers a non-relative import only if the relative import path would leave the package or project directory."],"default":"shortest","description":"Preferred path style for auto imports.","scope":"language-overridable"},"javascript.preferences.importModuleSpecifierEnding":{"type":"string","enum":["auto","minimal","index","js"],"enumItemLabels":[null,null,null,".js / .ts"],"markdownEnumDescriptions":["Use project settings to select a default.","Shorten `./component/index.js` to `./component`.","Shorten `./component/index.js` to `./component/index`.","Do not shorten path endings; include the `.js` or `.ts` extension."],"default":"auto","description":"Preferred path ending for auto imports.","scope":"language-overridable"},"typescript.preferences.importModuleSpecifierEnding":{"type":"string","enum":["auto","minimal","index","js"],"enumItemLabels":[null,null,null,".js / .ts"],"markdownEnumDescriptions":["Use project settings to select a default.","Shorten `./component/index.js` to `./component`.","Shorten `./component/index.js` to `./component/index`.","Do not shorten path endings; include the `.js` or `.ts` extension."],"default":"auto","description":"Preferred path ending for auto imports.","scope":"language-overridable"},"javascript.preferences.jsxAttributeCompletionStyle":{"type":"string","enum":["auto","braces","none"],"markdownEnumDescriptions":["Insert `={}` or `=\"\"` after attribute names based on the prop type. See `#javascript.preferences.quoteStyle#` to control the type of quotes used for string attributes.","Insert `={}` after attribute names.","Only insert attribute names."],"default":"auto","description":"Preferred style for JSX attribute completions.","scope":"language-overridable"},"typescript.preferences.jsxAttributeCompletionStyle":{"type":"string","enum":["auto","braces","none"],"markdownEnumDescriptions":["Insert `={}` or `=\"\"` after attribute names based on the prop type. See `#typescript.preferences.quoteStyle#` to control the type of quotes used for string attributes.","Insert `={}` after attribute names.","Only insert attribute names."],"default":"auto","description":"Preferred style for JSX attribute completions.","scope":"language-overridable"},"typescript.preferences.includePackageJsonAutoImports":{"type":"string","enum":["auto","on","off"],"enumDescriptions":["Search dependencies based on estimated performance impact.","Always search dependencies.","Never search dependencies."],"default":"auto","markdownDescription":"Enable/disable searching `package.json` dependencies for available auto imports.","scope":"window"},"javascript.preferences.autoImportFileExcludePatterns":{"type":"array","items":{"type":"string"},"markdownDescription":"Specify glob patterns of files to exclude from auto imports. Relative paths are resolved relative to the workspace root. Patterns are evaluated using tsconfig.json [`exclude`](https://www.typescriptlang.org/tsconfig#exclude) semantics.","scope":"resource"},"typescript.preferences.autoImportFileExcludePatterns":{"type":"array","items":{"type":"string"},"markdownDescription":"Specify glob patterns of files to exclude from auto imports. Relative paths are resolved relative to the workspace root. Patterns are evaluated using tsconfig.json [`exclude`](https://www.typescriptlang.org/tsconfig#exclude) semantics.","scope":"resource"},"javascript.preferences.autoImportSpecifierExcludeRegexes":{"type":"array","items":{"type":"string"},"markdownDescription":"Specify regular expressions to exclude auto imports with matching import specifiers. Examples:\n\n- `^node:`\n- `lib/internal` (slashes don't need to be escaped...)\n- `/lib\\/internal/i` (...unless including surrounding slashes for `i` or `u` flags)\n- `^lodash$` (only allow subpath imports from lodash)","scope":"resource"},"typescript.preferences.autoImportSpecifierExcludeRegexes":{"type":"array","items":{"type":"string"},"markdownDescription":"Specify regular expressions to exclude auto imports with matching import specifiers. Examples:\n\n- `^node:`\n- `lib/internal` (slashes don't need to be escaped...)\n- `/lib\\/internal/i` (...unless including surrounding slashes for `i` or `u` flags)\n- `^lodash$` (only allow subpath imports from lodash)","scope":"resource"},"typescript.preferences.preferTypeOnlyAutoImports":{"type":"boolean","default":false,"markdownDescription":"Include the `type` keyword in auto-imports whenever possible. Requires using TypeScript 5.3+ in the workspace.","scope":"resource"},"javascript.preferences.useAliasesForRenames":{"type":"boolean","default":true,"description":"Enable/disable introducing aliases for object shorthand properties during renames.","scope":"language-overridable"},"typescript.preferences.useAliasesForRenames":{"type":"boolean","default":true,"description":"Enable/disable introducing aliases for object shorthand properties during renames.","scope":"language-overridable"},"javascript.preferences.renameMatchingJsxTags":{"type":"boolean","default":true,"description":"When on a JSX tag, try to rename the matching tag instead of renaming the symbol. Requires using TypeScript 5.1+ in the workspace.","scope":"language-overridable"},"typescript.preferences.renameMatchingJsxTags":{"type":"boolean","default":true,"description":"When on a JSX tag, try to rename the matching tag instead of renaming the symbol. Requires using TypeScript 5.1+ in the workspace.","scope":"language-overridable"},"javascript.preferences.organizeImports":{"type":"object","markdownDescription":"Advanced preferences that control how imports are ordered.","properties":{"caseSensitivity":{"type":"string","markdownDescription":"Specifies how imports should be sorted with regards to case-sensitivity. If `auto` or unspecified, we will detect the case-sensitivity per file","enum":["auto","caseInsensitive","caseSensitive"],"markdownEnumDescriptions":["Detect case-sensitivity for import sorting.","%typescript.preferences.organizeImports.caseSensitivity.insensitive","Sort imports case-sensitively."],"default":"auto"},"typeOrder":{"type":"string","markdownDescription":"Specify how type-only named imports should be sorted.","enum":["auto","last","inline","first"],"default":"auto","markdownEnumDescriptions":["Detect where type-only named imports should be sorted.","Type only named imports are sorted to the end of the import list. E.g. `import { B, Z, type A, type Y } from 'module';`","Named imports are sorted by name only. E.g. `import { type A, B, type Y, Z } from 'module';`","Type only named imports are sorted to the beginning of the import list. E.g. `import { type A, type Y, B, Z } from 'module';`"]},"unicodeCollation":{"type":"string","markdownDescription":"Specify whether to sort imports using Unicode or Ordinal collation.","enum":["ordinal","unicode"],"markdownEnumDescriptions":["Sort imports using the numeric value of each code point.","Sort imports using the Unicode code collation."],"default":"ordinal"},"locale":{"type":"string","markdownDescription":"Requires `organizeImports.unicodeCollation: 'unicode'`. Overrides the locale used for collation. Specify `auto` to use the UI locale."},"numericCollation":{"type":"boolean","markdownDescription":"Requires `organizeImports.unicodeCollation: 'unicode'`. Sort numeric strings by integer value."},"accentCollation":{"type":"boolean","markdownDescription":"Requires `organizeImports.unicodeCollation: 'unicode'`. Compare characters with diacritical marks as unequal to base character."},"caseFirst":{"type":"string","markdownDescription":"Requires `organizeImports.unicodeCollation: 'unicode'`, and `organizeImports.caseSensitivity` is not `caseInsensitive`. Indicates whether upper-case will sort before lower-case.","enum":["default","upper","lower"],"markdownEnumDescriptions":["Default order given by `locale`.","Upper-case comes before lower-case. E.g. ` A, a, B, b`.","Lower-case comes before upper-case. E.g.` a, A, z, Z`."],"default":"default"}}},"typescript.preferences.organizeImports":{"type":"object","markdownDescription":"Advanced preferences that control how imports are ordered.","properties":{"caseSensitivity":{"type":"string","markdownDescription":"Specifies how imports should be sorted with regards to case-sensitivity. If `auto` or unspecified, we will detect the case-sensitivity per file","enum":["auto","caseInsensitive","caseSensitive"],"markdownEnumDescriptions":["Detect case-sensitivity for import sorting.","%typescript.preferences.organizeImports.caseSensitivity.insensitive","Sort imports case-sensitively."],"default":"auto"},"typeOrder":{"type":"string","markdownDescription":"Specify how type-only named imports should be sorted.","enum":["auto","last","inline","first"],"default":"auto","markdownEnumDescriptions":["Detect where type-only named imports should be sorted.","Type only named imports are sorted to the end of the import list. E.g. `import { B, Z, type A, type Y } from 'module';`","Named imports are sorted by name only. E.g. `import { type A, B, type Y, Z } from 'module';`","Type only named imports are sorted to the beginning of the import list. E.g. `import { type A, type Y, B, Z } from 'module';`"]},"unicodeCollation":{"type":"string","markdownDescription":"Specify whether to sort imports using Unicode or Ordinal collation.","enum":["ordinal","unicode"],"markdownEnumDescriptions":["Sort imports using the numeric value of each code point.","Sort imports using the Unicode code collation."],"default":"ordinal"},"locale":{"type":"string","markdownDescription":"Requires `organizeImports.unicodeCollation: 'unicode'`. Overrides the locale used for collation. Specify `auto` to use the UI locale."},"numericCollation":{"type":"boolean","markdownDescription":"Requires `organizeImports.unicodeCollation: 'unicode'`. Sort numeric strings by integer value."},"accentCollation":{"type":"boolean","markdownDescription":"Requires `organizeImports.unicodeCollation: 'unicode'`. Compare characters with diacritical marks as unequal to base character."},"caseFirst":{"type":"string","markdownDescription":"Requires `organizeImports.unicodeCollation: 'unicode'`, and `organizeImports.caseSensitivity` is not `caseInsensitive`. Indicates whether upper-case will sort before lower-case.","enum":["default","upper","lower"],"markdownEnumDescriptions":["Default order given by `locale`.","Upper-case comes before lower-case. E.g. ` A, a, B, b`.","Lower-case comes before upper-case. E.g.` a, A, z, Z`."],"default":"default"}}}}},{"type":"object","title":"Formatting","order":23,"properties":{"javascript.format.enable":{"type":"boolean","default":true,"description":"Enable/disable default JavaScript formatter.","scope":"window"},"typescript.format.enable":{"type":"boolean","default":true,"description":"Enable/disable default TypeScript formatter.","scope":"window"},"javascript.format.insertSpaceAfterCommaDelimiter":{"type":"boolean","default":true,"description":"Defines space handling after a comma delimiter.","scope":"resource"},"typescript.format.insertSpaceAfterCommaDelimiter":{"type":"boolean","default":true,"description":"Defines space handling after a comma delimiter.","scope":"resource"},"javascript.format.insertSpaceAfterConstructor":{"type":"boolean","default":false,"description":"Defines space handling after the constructor keyword.","scope":"resource"},"typescript.format.insertSpaceAfterConstructor":{"type":"boolean","default":false,"description":"Defines space handling after the constructor keyword.","scope":"resource"},"javascript.format.insertSpaceAfterSemicolonInForStatements":{"type":"boolean","default":true,"description":"Defines space handling after a semicolon in a for statement.","scope":"resource"},"typescript.format.insertSpaceAfterSemicolonInForStatements":{"type":"boolean","default":true,"description":"Defines space handling after a semicolon in a for statement.","scope":"resource"},"javascript.format.insertSpaceBeforeAndAfterBinaryOperators":{"type":"boolean","default":true,"description":"Defines space handling after a binary operator.","scope":"resource"},"typescript.format.insertSpaceBeforeAndAfterBinaryOperators":{"type":"boolean","default":true,"description":"Defines space handling after a binary operator.","scope":"resource"},"javascript.format.insertSpaceAfterKeywordsInControlFlowStatements":{"type":"boolean","default":true,"description":"Defines space handling after keywords in a control flow statement.","scope":"resource"},"typescript.format.insertSpaceAfterKeywordsInControlFlowStatements":{"type":"boolean","default":true,"description":"Defines space handling after keywords in a control flow statement.","scope":"resource"},"javascript.format.insertSpaceAfterFunctionKeywordForAnonymousFunctions":{"type":"boolean","default":true,"description":"Defines space handling after function keyword for anonymous functions.","scope":"resource"},"typescript.format.insertSpaceAfterFunctionKeywordForAnonymousFunctions":{"type":"boolean","default":true,"description":"Defines space handling after function keyword for anonymous functions.","scope":"resource"},"javascript.format.insertSpaceBeforeFunctionParenthesis":{"type":"boolean","default":false,"description":"Defines space handling before function argument parentheses.","scope":"resource"},"typescript.format.insertSpaceBeforeFunctionParenthesis":{"type":"boolean","default":false,"description":"Defines space handling before function argument parentheses.","scope":"resource"},"javascript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis":{"type":"boolean","default":false,"description":"Defines space handling after opening and before closing non-empty parenthesis.","scope":"resource"},"typescript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis":{"type":"boolean","default":false,"description":"Defines space handling after opening and before closing non-empty parenthesis.","scope":"resource"},"javascript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets":{"type":"boolean","default":false,"description":"Defines space handling after opening and before closing non-empty brackets.","scope":"resource"},"typescript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets":{"type":"boolean","default":false,"description":"Defines space handling after opening and before closing non-empty brackets.","scope":"resource"},"javascript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces":{"type":"boolean","default":true,"description":"Defines space handling after opening and before closing non-empty braces.","scope":"resource"},"typescript.format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces":{"type":"boolean","default":true,"description":"Defines space handling after opening and before closing non-empty braces.","scope":"resource"},"javascript.format.insertSpaceAfterOpeningAndBeforeClosingEmptyBraces":{"type":"boolean","default":true,"description":"Defines space handling after opening and before closing empty braces.","scope":"resource"},"typescript.format.insertSpaceAfterOpeningAndBeforeClosingEmptyBraces":{"type":"boolean","default":true,"description":"Defines space handling after opening and before closing empty braces.","scope":"resource"},"javascript.format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces":{"type":"boolean","default":false,"description":"Defines space handling after opening and before closing template string braces.","scope":"resource"},"typescript.format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces":{"type":"boolean","default":false,"description":"Defines space handling after opening and before closing template string braces.","scope":"resource"},"javascript.format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces":{"type":"boolean","default":false,"description":"Defines space handling after opening and before closing JSX expression braces.","scope":"resource"},"typescript.format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces":{"type":"boolean","default":false,"description":"Defines space handling after opening and before closing JSX expression braces.","scope":"resource"},"typescript.format.insertSpaceAfterTypeAssertion":{"type":"boolean","default":false,"description":"Defines space handling after type assertions in TypeScript.","scope":"resource"},"javascript.format.placeOpenBraceOnNewLineForFunctions":{"type":"boolean","default":false,"description":"Defines whether an open brace is put onto a new line for functions or not.","scope":"resource"},"typescript.format.placeOpenBraceOnNewLineForFunctions":{"type":"boolean","default":false,"description":"Defines whether an open brace is put onto a new line for functions or not.","scope":"resource"},"javascript.format.placeOpenBraceOnNewLineForControlBlocks":{"type":"boolean","default":false,"description":"Defines whether an open brace is put onto a new line for control blocks or not.","scope":"resource"},"typescript.format.placeOpenBraceOnNewLineForControlBlocks":{"type":"boolean","default":false,"description":"Defines whether an open brace is put onto a new line for control blocks or not.","scope":"resource"},"javascript.format.semicolons":{"type":"string","default":"ignore","description":"Defines handling of optional semicolons.","scope":"resource","enum":["ignore","insert","remove"],"enumDescriptions":["Don't insert or remove any semicolons.","Insert semicolons at statement ends.","Remove unnecessary semicolons."]},"typescript.format.semicolons":{"type":"string","default":"ignore","description":"Defines handling of optional semicolons.","scope":"resource","enum":["ignore","insert","remove"],"enumDescriptions":["Don't insert or remove any semicolons.","Insert semicolons at statement ends.","Remove unnecessary semicolons."]},"javascript.format.indentSwitchCase":{"type":"boolean","default":true,"description":"Indent case clauses in switch statements. Requires using TypeScript 5.1+ in the workspace.","scope":"resource"},"typescript.format.indentSwitchCase":{"type":"boolean","default":true,"description":"Indent case clauses in switch statements. Requires using TypeScript 5.1+ in the workspace.","scope":"resource"}}},{"type":"object","title":"Inlay Hints","order":24,"properties":{"typescript.inlayHints.parameterNames.enabled":{"type":"string","enum":["none","literals","all"],"enumDescriptions":["Disable parameter name hints.","Enable parameter name hints only for literal arguments.","Enable parameter name hints for literal and non-literal arguments."],"default":"none","markdownDescription":"Enable/disable inlay hints for parameter names:\n```typescript\n\nparseInt(/* str: */ '123', /* radix: */ 8)\n \n```","scope":"resource"},"typescript.inlayHints.parameterNames.suppressWhenArgumentMatchesName":{"type":"boolean","default":true,"markdownDescription":"Suppress parameter name hints on arguments whose text is identical to the parameter name.","scope":"resource"},"typescript.inlayHints.parameterTypes.enabled":{"type":"boolean","default":false,"markdownDescription":"Enable/disable inlay hints for implicit parameter types:\n```typescript\n\nel.addEventListener('click', e /* :MouseEvent */ => ...)\n \n```","scope":"resource"},"typescript.inlayHints.variableTypes.enabled":{"type":"boolean","default":false,"markdownDescription":"Enable/disable inlay hints for implicit variable types:\n```typescript\n\nconst foo /* :number */ = Date.now();\n \n```","scope":"resource"},"typescript.inlayHints.variableTypes.suppressWhenTypeMatchesName":{"type":"boolean","default":true,"markdownDescription":"Suppress type hints on variables whose name is identical to the type name.","scope":"resource"},"typescript.inlayHints.propertyDeclarationTypes.enabled":{"type":"boolean","default":false,"markdownDescription":"Enable/disable inlay hints for implicit types on property declarations:\n```typescript\n\nclass Foo {\n\tprop /* :number */ = Date.now();\n}\n \n```","scope":"resource"},"typescript.inlayHints.functionLikeReturnTypes.enabled":{"type":"boolean","default":false,"markdownDescription":"Enable/disable inlay hints for implicit return types on function signatures:\n```typescript\n\nfunction foo() /* :number */ {\n\treturn Date.now();\n} \n \n```","scope":"resource"},"typescript.inlayHints.enumMemberValues.enabled":{"type":"boolean","default":false,"markdownDescription":"Enable/disable inlay hints for member values in enum declarations:\n```typescript\n\nenum MyValue {\n\tA /* = 0 */;\n\tB /* = 1 */;\n}\n \n```","scope":"resource"},"javascript.inlayHints.parameterNames.enabled":{"type":"string","enum":["none","literals","all"],"enumDescriptions":["Disable parameter name hints.","Enable parameter name hints only for literal arguments.","Enable parameter name hints for literal and non-literal arguments."],"default":"none","markdownDescription":"Enable/disable inlay hints for parameter names:\n```typescript\n\nparseInt(/* str: */ '123', /* radix: */ 8)\n \n```","scope":"resource"},"javascript.inlayHints.parameterNames.suppressWhenArgumentMatchesName":{"type":"boolean","default":true,"markdownDescription":"Suppress parameter name hints on arguments whose text is identical to the parameter name.","scope":"resource"},"javascript.inlayHints.parameterTypes.enabled":{"type":"boolean","default":false,"markdownDescription":"Enable/disable inlay hints for implicit parameter types:\n```typescript\n\nel.addEventListener('click', e /* :MouseEvent */ => ...)\n \n```","scope":"resource"},"javascript.inlayHints.variableTypes.enabled":{"type":"boolean","default":false,"markdownDescription":"Enable/disable inlay hints for implicit variable types:\n```typescript\n\nconst foo /* :number */ = Date.now();\n \n```","scope":"resource"},"javascript.inlayHints.variableTypes.suppressWhenTypeMatchesName":{"type":"boolean","default":true,"markdownDescription":"Suppress type hints on variables whose name is identical to the type name.","scope":"resource"},"javascript.inlayHints.propertyDeclarationTypes.enabled":{"type":"boolean","default":false,"markdownDescription":"Enable/disable inlay hints for implicit types on property declarations:\n```typescript\n\nclass Foo {\n\tprop /* :number */ = Date.now();\n}\n \n```","scope":"resource"},"javascript.inlayHints.functionLikeReturnTypes.enabled":{"type":"boolean","default":false,"markdownDescription":"Enable/disable inlay hints for implicit return types on function signatures:\n```typescript\n\nfunction foo() /* :number */ {\n\treturn Date.now();\n} \n \n```","scope":"resource"}}},{"type":"object","title":"TS Server","order":25,"properties":{"typescript.tsserver.nodePath":{"type":"string","description":"Run TS Server on a custom Node installation. This can be a path to a Node executable, or 'node' if you want VS Code to detect a Node installation.","scope":"window"},"typescript.npm":{"type":"string","markdownDescription":"Specifies the path to the npm executable used for [Automatic Type Acquisition](https://code.visualstudio.com/docs/nodejs/working-with-javascript#_typings-and-automatic-type-acquisition).","scope":"machine"},"typescript.check.npmIsInstalled":{"type":"boolean","default":true,"markdownDescription":"Check if npm is installed for [Automatic Type Acquisition](https://code.visualstudio.com/docs/nodejs/working-with-javascript#_typings-and-automatic-type-acquisition).","scope":"window"},"typescript.tsserver.web.projectWideIntellisense.enabled":{"type":"boolean","default":true,"description":"Enable/disable project-wide IntelliSense on web. Requires that VS Code is running in a trusted context.","scope":"window"},"typescript.tsserver.web.projectWideIntellisense.suppressSemanticErrors":{"type":"boolean","default":false,"description":"Suppresses semantic errors on web even when project wide IntelliSense is enabled. This is always on when project wide IntelliSense is not enabled or available. See `#typescript.tsserver.web.projectWideIntellisense.enabled#`","scope":"window"},"typescript.tsserver.web.typeAcquisition.enabled":{"type":"boolean","default":true,"description":"Enable/disable package acquisition on the web. This enables IntelliSense for imported packages. Requires `#typescript.tsserver.web.projectWideIntellisense.enabled#`. Currently not supported for Safari.","scope":"window"},"typescript.tsserver.useSyntaxServer":{"type":"string","scope":"window","description":"Controls if TypeScript launches a dedicated server to more quickly handle syntax related operations, such as computing code folding.","default":"auto","enum":["always","never","auto"],"enumDescriptions":["Use a lighter weight syntax server to handle all IntelliSense operations. This syntax server can only provide IntelliSense for opened files.","Don't use a dedicated syntax server. Use a single server to handle all IntelliSense operations.","Spawn both a full server and a lighter weight server dedicated to syntax operations. The syntax server is used to speed up syntax operations and provide IntelliSense while projects are loading."]},"typescript.tsserver.maxTsServerMemory":{"type":"number","default":3072,"markdownDescription":"The maximum amount of memory (in MB) to allocate to the TypeScript server process. To use a memory limit greater than 4 GB, use `#typescript.tsserver.nodePath#` to run TS Server with a custom Node installation.","scope":"window"},"typescript.tsserver.experimental.enableProjectDiagnostics":{"type":"boolean","default":false,"description":"Enables project wide error reporting.","scope":"window","tags":["experimental"]},"typescript.tsserver.watchOptions":{"description":"Configure which watching strategies should be used to keep track of files and directories.","scope":"window","default":"vscode","oneOf":[{"type":"string","const":"vscode","description":"Use VS Code's file watchers instead of TypeScript's. Requires using TypeScript 5.4+ in the workspace."},{"type":"object","properties":{"watchFile":{"type":"string","description":"Strategy for how individual files are watched.","enum":["fixedChunkSizePolling","fixedPollingInterval","priorityPollingInterval","dynamicPriorityPolling","useFsEvents","useFsEventsOnParentDirectory"],"enumDescriptions":["Polls files in chunks at regular interval.","Check every file for changes several times a second at a fixed interval.","Check every file for changes several times a second, but use heuristics to check certain types of files less frequently than others.","Use a dynamic queue where less-frequently modified files will be checked less often.","Attempt to use the operating system/file system's native events for file changes.","Attempt to use the operating system/file system's native events to listen for changes on a file's containing directories. This can use fewer file watchers, but might be less accurate."],"default":"useFsEvents"},"watchDirectory":{"type":"string","description":"Strategy for how entire directory trees are watched under systems that lack recursive file-watching functionality.","enum":["fixedChunkSizePolling","fixedPollingInterval","dynamicPriorityPolling","useFsEvents"],"enumDescriptions":["Polls directories in chunks at regular interval.","Check every directory for changes several times a second at a fixed interval.","Use a dynamic queue where less-frequently modified directories will be checked less often.","Attempt to use the operating system/file system's native events for directory changes."],"default":"useFsEvents"},"fallbackPolling":{"type":"string","description":"When using file system events, this option specifies the polling strategy that gets used when the system runs out of native file watchers and/or doesn't support native file watchers.","enum":["fixedPollingInterval","priorityPollingInterval","dynamicPriorityPolling"],"enumDescriptions":["configuration.tsserver.watchOptions.fallbackPolling.fixedPollingInterval","configuration.tsserver.watchOptions.fallbackPolling.priorityPollingInterval","configuration.tsserver.watchOptions.fallbackPolling.dynamicPriorityPolling"]},"synchronousWatchDirectory":{"type":"boolean","description":"Disable deferred watching on directories. Deferred watching is useful when lots of file changes might occur at once (e.g. a change in node_modules from running npm install), but you might want to disable it with this flag for some less-common setups."}}}]},"typescript.tsserver.enableTracing":{"type":"boolean","default":false,"description":"Enables tracing TS server performance to a directory. These trace files can be used to diagnose TS Server performance issues. The log may contain file paths, source code, and other potentially sensitive information from your project.","scope":"window"},"typescript.tsserver.log":{"type":"string","enum":["off","terse","normal","verbose","requestTime"],"default":"off","description":"Enables logging of the TS server to a file. This log can be used to diagnose TS Server issues. The log may contain file paths, source code, and other potentially sensitive information from your project.","scope":"window"},"typescript.tsserver.pluginPaths":{"type":"array","items":{"type":"string","description":"Either an absolute or relative path. Relative path will be resolved against workspace folder(s)."},"default":[],"description":"Additional paths to discover TypeScript Language Service plugins.","scope":"machine"}}}],"commands":[{"command":"typescript.reloadProjects","title":"Reload Project","category":"TypeScript"},{"command":"javascript.reloadProjects","title":"Reload Project","category":"JavaScript"},{"command":"typescript.selectTypeScriptVersion","title":"Select TypeScript Version...","category":"TypeScript"},{"command":"typescript.goToProjectConfig","title":"Go to Project Configuration (tsconfig)","category":"TypeScript"},{"command":"javascript.goToProjectConfig","title":"Go to Project Configuration (jsconfig / tsconfig)","category":"JavaScript"},{"command":"typescript.openTsServerLog","title":"Open TS Server log","category":"TypeScript"},{"command":"typescript.restartTsServer","title":"Restart TS Server","category":"TypeScript"},{"command":"typescript.findAllFileReferences","title":"Find File References","category":"TypeScript"},{"command":"typescript.goToSourceDefinition","title":"Go to Source Definition","category":"TypeScript"},{"command":"typescript.sortImports","title":"Sort Imports","category":"TypeScript"},{"command":"javascript.sortImports","title":"Sort Imports","category":"JavaScript"},{"command":"typescript.removeUnusedImports","title":"Remove Unused Imports","category":"TypeScript"},{"command":"javascript.removeUnusedImports","title":"Remove Unused Imports","category":"JavaScript"},{"command":"typescript.experimental.enableTsgo","title":"Use TypeScript Go (Experimental)","category":"TypeScript","enablement":"!config.typescript.experimental.useTsgo && config.typescript-go.executablePath"},{"command":"typescript.experimental.disableTsgo","title":"Stop using TypeScript Go (Experimental)","category":"TypeScript","enablement":"config.typescript.experimental.useTsgo"}],"menus":{"commandPalette":[{"command":"typescript.reloadProjects","when":"editorLangId == typescript && typescript.isManagedFile"},{"command":"typescript.reloadProjects","when":"editorLangId == typescriptreact && typescript.isManagedFile"},{"command":"javascript.reloadProjects","when":"editorLangId == javascript && typescript.isManagedFile"},{"command":"javascript.reloadProjects","when":"editorLangId == javascriptreact && typescript.isManagedFile"},{"command":"typescript.goToProjectConfig","when":"editorLangId == typescript && typescript.isManagedFile"},{"command":"typescript.goToProjectConfig","when":"editorLangId == typescriptreact && typescript.isManagedFile"},{"command":"javascript.goToProjectConfig","when":"editorLangId == javascript && typescript.isManagedFile"},{"command":"javascript.goToProjectConfig","when":"editorLangId == javascriptreact && typescript.isManagedFile"},{"command":"typescript.selectTypeScriptVersion","when":"typescript.isManagedFile"},{"command":"typescript.openTsServerLog","when":"typescript.isManagedFile"},{"command":"typescript.restartTsServer","when":"typescript.isManagedFile"},{"command":"typescript.findAllFileReferences","when":"tsSupportsFileReferences && typescript.isManagedFile"},{"command":"typescript.goToSourceDefinition","when":"tsSupportsSourceDefinition && typescript.isManagedFile"},{"command":"typescript.sortImports","when":"supportedCodeAction =~ /(\\s|^)source\\.sortImports\\b/ && editorLangId =~ /^typescript(react)?$/"},{"command":"javascript.sortImports","when":"supportedCodeAction =~ /(\\s|^)source\\.sortImports\\b/ && editorLangId =~ /^javascript(react)?$/"},{"command":"typescript.removeUnusedImports","when":"supportedCodeAction =~ /(\\s|^)source\\.removeUnusedImports\\b/ && editorLangId =~ /^typescript(react)?$/"},{"command":"javascript.removeUnusedImports","when":"supportedCodeAction =~ /(\\s|^)source\\.removeUnusedImports\\b/ && editorLangId =~ /^javascript(react)?$/"}],"editor/context":[{"command":"typescript.goToSourceDefinition","when":"!config.typescript.experimental.useTsgo && tsSupportsSourceDefinition && (resourceLangId == typescript || resourceLangId == typescriptreact || resourceLangId == javascript || resourceLangId == javascriptreact)","group":"navigation@1.41"}],"explorer/context":[{"command":"typescript.findAllFileReferences","when":"tsSupportsFileReferences && resourceLangId == typescript","group":"4_search"},{"command":"typescript.findAllFileReferences","when":"tsSupportsFileReferences && resourceLangId == typescriptreact","group":"4_search"},{"command":"typescript.findAllFileReferences","when":"tsSupportsFileReferences && resourceLangId == javascript","group":"4_search"},{"command":"typescript.findAllFileReferences","when":"tsSupportsFileReferences && resourceLangId == javascriptreact","group":"4_search"}],"editor/title/context":[{"command":"typescript.findAllFileReferences","when":"tsSupportsFileReferences && resourceLangId == javascript"},{"command":"typescript.findAllFileReferences","when":"tsSupportsFileReferences && resourceLangId == javascriptreact"},{"command":"typescript.findAllFileReferences","when":"tsSupportsFileReferences && resourceLangId == typescript"},{"command":"typescript.findAllFileReferences","when":"tsSupportsFileReferences && resourceLangId == typescriptreact"}]},"breakpoints":[{"language":"typescript"},{"language":"typescriptreact"}],"taskDefinitions":[{"type":"typescript","required":["tsconfig"],"properties":{"tsconfig":{"type":"string","description":"The tsconfig file that defines the TS build."},"option":{"type":"string"}},"when":"shellExecutionSupported"}],"problemPatterns":[{"name":"tsc","regexp":"^([^\\s].*)[\\(:](\\d+)[,:](\\d+)(?:\\):\\s+|\\s+-\\s+)(error|warning|info)\\s+TS(\\d+)\\s*:\\s*(.*)$","file":1,"line":2,"column":3,"severity":4,"code":5,"message":6}],"problemMatchers":[{"name":"tsc","label":"TypeScript problems","owner":"typescript","source":"ts","applyTo":"closedDocuments","fileLocation":["relative","${cwd}"],"pattern":"$tsc"},{"name":"tsgo-watch","label":"TypeScript problems (watch mode)","owner":"typescript","source":"ts","applyTo":"closedDocuments","fileLocation":["relative","${cwd}"],"pattern":"$tsc","background":{"activeOnStart":true,"beginsPattern":{"regexp":"^build starting at .*$"},"endsPattern":{"regexp":"^build finished in .*$"}}},{"name":"tsc-watch","label":"TypeScript problems (watch mode)","owner":"typescript","source":"ts","applyTo":"closedDocuments","fileLocation":["relative","${cwd}"],"pattern":"$tsc","background":{"activeOnStart":true,"beginsPattern":{"regexp":"^\\s*(?:message TS6032:|\\[?\\D*.{1,2}[:.].{1,2}[:.].{1,2}\\D*(├\\D*\\d{1,2}\\D+┤)?(?:\\]| -)) (Starting compilation in watch mode|File change detected\\. Starting incremental compilation)\\.\\.\\."},"endsPattern":{"regexp":"^\\s*(?:message TS6042:|\\[?\\D*.{1,2}[:.].{1,2}[:.].{1,2}\\D*(├\\D*\\d{1,2}\\D+┤)?(?:\\]| -)) (?:Compilation complete\\.|Found \\d+ errors?\\.) Watching for file changes\\."}}}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/typescript-language-features","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.vb"},"manifest":{"name":"vb","displayName":"Visual Basic Language Basics","description":"Provides snippets, syntax highlighting, bracket matching and folding in Visual Basic files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"scripts":{"update-grammar":"node ../node_modules/vscode-grammar-updater/bin textmate/asp.vb.net.tmbundle Syntaxes/ASP%20VB.net.plist ./syntaxes/asp-vb-net.tmLanguage.json"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"vb","extensions":[".vb",".brs",".vbs",".bas",".vba"],"aliases":["Visual Basic","vb"],"configuration":"./language-configuration.json"}],"grammars":[{"language":"vb","scopeName":"source.asp.vb.net","path":"./syntaxes/asp-vb-net.tmLanguage.json"}],"snippets":[{"language":"vb","path":"./snippets/vb.code-snippets"}]},"repository":{"type":"git","url":"https://github.com/microsoft/vscode.git"}},"location":{"$mid":1,"path":"/usr/lib/code-server/lib/vscode/extensions/vb","scheme":"file"},"isBuiltin":true,"targetPlatform":"undefined","isValid":true,"validations":[],"preRelease":false},{"type":0,"identifier":{"id":"vscode.xml"},"manifest":{"name":"xml","displayName":"XML Language Basics","description":"Provides syntax highlighting and bracket matching in XML files.","version":"1.0.0","publisher":"vscode","license":"MIT","engines":{"vscode":"*"},"categories":["Programming Languages"],"contributes":{"languages":[{"id":"xml","extensions":[".xml",".xsd",".ascx",".atom",".axml",".axaml",".bpmn",".cpt",".csl",".csproj",".csproj.user",".dita",".ditamap",".dtd",".ent",".mod",".dtml",".fsproj",".fxml",".iml",".isml",".jmx",".launch",".menu",".mxml",".nuspec",".opml",".owl",".proj",".props",".pt",".publishsettings",".pubxml",".pubxml.user",".rbxlx",".rbxmx",".rdf",".rng",".rss",".shproj",".slnx",".storyboard",".svg",".targets",".tld",".tmx",".vbproj",".vbproj.user",".vcxproj",".vcxproj.filters",".wsdl",".wxi",".wxl",".wxs",".xaml",".xbl",".xib",".xlf",".xliff",".xpdl",".xul",".xoml"],"firstLine":"(\\<\\?xml.*)|(\\ api_spec.json) → 22 byte-os eredmény, anomália + +RENDSZERFELTÁRÁS — mi kész, mi nincs kész (jelen bizonyítékok alapján) +Ami biztosan kész / működik + +Alaprendszer Compose-ban fut: service_finder stack “running(9)”. + +Frontend él: port 3000 publikusan kint. + +API él: port 8000 publikusan kint. + +Postgres él és healthy: postgres:15, publikus 5432. + +Redis él. + +MinIO él. + +Admin eszközök élnek: pgAdmin (5050), NPM (80/81/443), Dozzle (8888), code-server (8443). + +Létezik lokális projekt struktúra és volume-ok: /opt/service_finder/... alatt backend, frontend, logs, migrations, postgres_data, redis data, proxy-manager adatok. + +filesystem_map + +Ami valószínűleg nincs kész / hibás / tisztázandó + +OpenAPI endpoint: a mentett fájlméret alapján nem jó választ ad az /openapi.json (vagy nem ott van, vagy proxy/route gond). + +Biztonsági hardening: Postgres jelenleg 0.0.0.0:5432-n lóg (ez később sürgős). + +Migrációs konzisztencia: van migrations struktúra a fájlrendszerben (több helyen is), de nem tudjuk, hogy DB-séma ténylegesen “head”-en van-e. + +filesystem_map + +FÁJLRENDSZER-HELYZETKÉP (amit már látunk) + +A feltöltött map alapján a fontos csomópontok: + +Projekt gyökér: /opt/service_finder + +filesystem_map + +Backend kód: /opt/service_finder/backend (+ app/, models/, auth/, schemas/, templates/, migrations/versions) + +filesystem_map + +Frontend kód: /opt/service_finder/frontend (+ src/views/admin, router, stores, services, components, public, node_modules) + +filesystem_map + +Log könyvtár: /opt/service_finder/logs + +filesystem_map + +Postgres adatok: /opt/service_finder/postgres_data/... (és van egy /opt/service_finder/postgres/data/... jellegű ág is) + +filesystem_map + +Redis data: /opt/service_finder/redis/data/... + +filesystem_map + +NPM/Proxy manager adatok + LE: /opt/service_finder/proxy-manager/... + +filesystem_map + +Megjegyzés: a map alapján mintha két postgres adatútvonal is jelen lenne: postgres/data és postgres_data. Ezt tisztázni kell, nehogy két külön volume/útvonal keveredjen (backup, restore, space, stb.). + +filesystem_map + +ADATBÁZIS-HELYZETKÉP (a feltöltött táblalistád alapján) + +A feltöltött tablak_2026.01.30_0.csv alapján a data sémában 54 tábla van. (Ezt használom alapnak a DB audit lépések priorizálásához.) + +A következő lépésben ebből fogok csinálni: + +“core domain” csoportosítást (org/account/auth/vehicle/provider/request/evidence/stb.), + +és egy “migráció és integráció” ellenőrző checklistet (táblák + FK + index + RLS jelek). + +📜 PROJEKT IDŐVONAL — HIGH-LEVEL TIMELINE +Phase 1 — Core Foundations (2026-01-27) + +DB core stabil + +Config engine + +Auth + Email + +Enum & integrity fixes + +Phase 2 — Fleet & Vehicle Core (2026-01-28) + +Jármű hierarchia + +VIN rendszer + +Variant bővítés + +Seed & backup + +Phase 3 — Service Search & Matching (2026-01-28) + +Provider geo-keresés + +Ranking engine + +Match API + +Phase 4 — Infrastructure & Stability (2026-01-29) + +Docker stack + +Storage + +Backup + +Phase 5 — UI & MVP Presentation (2026-01-30) + +Frontend + +Dashboard + +Expense UI + +Phase 6 — Governance & Scaling (2026-01-30) + +Log governance + +Project memory + +Audit readiness + +✅ KÖVETKEZŐ FÁZIS: RENDSZER FELTÁRÁS (AUDIT) + +Most átlépünk ebbe az üzemmódba: + +🎯 Cél + +Objektíven feltárni: + +mi van KÉSZ + +mi FÉLKÉSZ + +mi HIÁNYZIK + +mi TECHNIKAI ADÓSSÁG \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/Master Log/projekt log_Full timeline 2026.01.30 b/archive/2026.02.18 Archive_old_mapps/Master Log/projekt log_Full timeline 2026.01.30 new file mode 100755 index 0000000..2f1eeee --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/Master Log/projekt log_Full timeline 2026.01.30 @@ -0,0 +1,247 @@ +📘 MASTER PROJECT LOG — FULL TIMELINE + +Project: Fleet / Cost / Service Marketplace +Version: V1.0 MASTER LOG +Generated: 2026-01-30 +Scope: Fleet • Costs • Service Search • Infrastructure +Format: ⚓ Anchor Log (Accepted) + +⚓ ANCHOR LOG — V2.0 + +Date: 2026-01-27 +Area: DATABASE / CONFIG +Type: Milestone + +Summary: +system_settings konfigurációs motor stabilizálva + +Details: + +key_name + value_json kanonikus séma rögzítve + +idx_settings_lookup unique index aktív + +max_vehicles = 3 alapérték betöltve + +ConfigService szinkron DB-vel + +Impact: + +Tech: Dinamikus szabálymotor stabil + +Business: SaaS csomaglogika alap + +⚓ ANCHOR LOG — V2.3 + +Date: 2026-01-27 +Area: SERVICE SEARCH / GEO +Type: Feature + +Summary: +Szerviz-kereső geolokációs alap elkészült + +Details: + +organizations → data séma migrálva + +organization_locations tábla létrehozva + +Multi-site provider támogatás + +Haversine alapú távolságszámítás előkészítve + +Impact: + +Tech: Térbeli keresés működőképes + +Business: Marketplace alap létrejött + +⚓ ANCHOR LOG — V2.6 + +Date: 2026-01-27 +Area: ENUM / DATA INTEGRITY +Type: Fix + +Summary: +SERVICE enum hiba javítva + +Details: + +orgtype.SERVICE enum hozzáadva + +Szerviz tesztadatok sikeresen beszúrhatók + +Integritás visszaállítva + +Impact: + +Tech: Adatkonzisztencia stabil + +Business: Szerviz adatbázis bővíthető + +⚓ ANCHOR LOG — V2.9 + +Date: 2026-01-27 +Area: AUTH / EMAIL +Type: Feature + +Summary: +Auth + Email rendszer stabil + +Details: + +Token-alapú regisztráció + +Password reset + +Email throttling + +Audit log aktív + +Impact: + +Tech: Biztonságos onboarding + +Business: SaaS-ready belépés + +⚓ ANCHOR LOG — V3.1 + +Date: 2026-01-28 +Area: DATABASE +Type: Milestone + +Summary: +40+ tábla stabil, integritás éles + +Details: + +FK-k, Enum-ok aktív + +Seed adatok betöltve + +Backup készült: backup_20260128_alap_kesz.sql + +Impact: + +Tech: DB production-ready + +Business: Stabil adatmag + +⚓ ANCHOR LOG — V3.5 + +Date: 2026-01-28 +Area: VEHICLE / DIGITAL TWIN +Type: Feature + +Summary: +Jármű hierarchia és VIN-logika aktív + +Details: + +Category → Brand → Model → Variant fa + +VIN verify mezők + +Temporary vehicle deadline + +Variant kiegészítések (power/fuel/cylinder) + +Impact: + +Tech: Digital Twin alap kész + +Business: Jármű életút adatvagyon + +⚓ ANCHOR LOG — V3.8 + +Date: 2026-01-28 +Area: MATCHING ENGINE +Type: Feature + +Summary: +Smart Matching Engine működik + +Details: + +Súlyozott ranking DB-ből + +ConfigService runtime paraméterezés + +/api/v1/search/match endpoint él + +Impact: + +Tech: Intelligens ajánlórendszer + +Business: Monetizálható marketplace + +⚓ ANCHOR LOG — V4.0 + +Date: 2026-01-29 +Area: INFRASTRUCTURE +Type: Milestone + +Summary: +Docker stack stabil, NAS backup aktív + +Details: + +PostgreSQL 16 + +Redis / MinIO / NPM + +Backup rotáció + +Konténerek stabil futnak + +Impact: + +Tech: Production-ready alap + +Business: Skálázható SaaS infra + +⚓ ANCHOR LOG — V4.3 + +Date: 2026-01-30 +Area: FRONTEND +Type: Feature + +Summary: +Frontend UI működő MVP + +Details: + +Vue 3 + Tailwind + +Expense UI aktív + +Dashboard működik + +Impact: + +Tech: Bemutatható termék + +Business: Sales demo-ready + +⚓ ANCHOR LOG — V4.5 + +Date: 2026-01-30 +Area: PROJECT / GOVERNANCE +Type: Milestone + +Summary: +Master Log rendszer elfogadva + +Details: + +Egységes Anchor Log formátum rögzítve + +Teljes idővonal generálva + +Projekt történet kanonizálva + +Impact: + +Tech: Audit- és trace-ready + +Business: Befektető- és skálázás-kész \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/Old_versions/1_PROJECT_BRAIN_FLEET.md b/archive/2026.02.18 Archive_old_mapps/Old_versions/1_PROJECT_BRAIN_FLEET.md new file mode 100755 index 0000000..cb2cb26 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/Old_versions/1_PROJECT_BRAIN_FLEET.md @@ -0,0 +1,305 @@ +# fő állapot + rendszerkép + +📄 1️⃣ PROJECT_BRAIN_FLEET.md + +(Flotta + költség + szerviz kereső – rendszerállapot) + +Projekt cél + +Flottakezelő és jármű-életciklus rendszer, amely kezeli: + +járműadatokat + +költségeket + +szerviz eseményeket + +ajánlatkérést / szerviz keresőt + +Fő modulok +Modul Leírás Státusz +Vehicle Registry Jármű nyilvántartás 🟡 audit alatt +Cost Tracking Költség / TCO / tankolás 🟡 audit alatt +Maintenance / Service Szerviz események 🟡 audit alatt +Evidence Számla / fotó / dokumentum 🟡 audit alatt +Provider Directory Szervizek adatbázisa 🔴 részben kész +Service Marketplace Ajánlatkérés 🔴 hiányzik +Reporting Kimutatások 🟡 alap kész +Auth / Tenant Jogosultság 🟢 alap kész +Docker / Infra Üzemeltetés 🟡 audit alatt + +🚀 Amit te építesz = PIACI RÉS + +A te célrendszered erősebb lenne, mint a fenti eszközök, ha tartalmazza: + +✅ Jármű TCO + költség + események +✅ Szerviz-ajánlatkérés (marketplace) +✅ Szervizek rangsorolása, hitelesítése +✅ Számla / fotó / km-óra / bizonyíték validáció +✅ Multi-tenant (cégek, magánszemélyek) +✅ API + mobil + AI +✅ EU-szintű többnyelvűség +✅ „Bank-szintű” audit trail +✅ Service Finder marketplace logika + +Ez Fleetio + Simply Fleet + Szerviz piactér + Trust Engine + Analytics egyben. + +Ha szeretnéd, készítek egy összehasonlító mátrixot +Funkció Fleetio SimplyFleet Wialon FMX Te rendszered +Költség ✅ ✅ ✅ ✅ 🚀 +Szerviz ✅ ✅ ⚠️ ✅ 🚀 +Ajánlat piactér ❌ ❌ ❌ ❌ 🚀 +Evidence ❌ ❌ ❌ ❌ 🚀 +Multi-tenant ⚠️ ⚠️ ⚠️ ⚠️ 🚀 + +🚗 Fleet / járműköltség / szerviz rendszerek – ár + tudás összehasonlítás +Platform Ármodell Induló ár Költség nyilvántartás Szerviz / karbantartás Work order Riport / elemzés Szerviz marketplace / ajánlat +Fleetio / jármű / hó $4–$10 / jármű / hó ✅ ✅ ✅ ✅ ❌ +Simply Fleet / jármű / hó $2–$4 / jármű / hó ✅ ✅ ⚠️ ✅ ❌ +Wialon / user / hó + GPS ~$150 / user / hó + HW ✅ ⚠️ ⚠️ ✅ ❌ +FMX / user / hó Egyedi ajánlat ⚠️ ✅ ✅ ⚠️ ❌ +Fiix CMMS / user / hó $45–$75 / user / hó ⚠️ ✅ ✅ ✅ ❌ +UpKeep / user / hó $20–$79 / user / hó ⚠️ ✅ ✅ ⚠️ ❌ +MaintainX / user / hó $20–$65 / user / hó ⚠️ ✅ ✅ ⚠️ ❌ +💰 Publikus árak – forrással +Fleetio + +Induló ár: $4 / jármű / hó (min. 5 jármű) +Felső csomag: $10 / jármű / hó + + +Simply Fleet + +Essential: $2 / jármű / hó +Advanced: $4 / jármű / hó +Min. $10–$20 / hó + + +Wialon + +Árazás tipikusan: +~$150 / user / hó + GPS hardver ($50–$300 / jármű) + + +(Telematika-centrikus, nem klasszikus fleet költség rendszer.) + +FMX Fleet Maintenance + +Egyedi ajánlat, / felhasználó / hó + + +Fiix CMMS + +$45–$75 / user / hó + + +UpKeep + +$20–$79 / user / hó + + +MaintainX + +$20–$65 / user / hó + + +🧠 Funkcionális érettség – mire jók valójában? +🟢 Fleetio – legjobb “fleet core” + +Erősség + +Költség, üzemanyag, TCO + +Szerviztörténet + +Work order + +Riport + API + +Hiány + +❌ NINCS szerviz piactér + +❌ NINCS ajánlatkérés több szerviztől + +❌ NINCS bizonyíték-validáció + +🟢 Simply Fleet – legjobb ár/érték + +Erősség + +Olcsó + +Költség + szerviz + +Mobilbarát + +Hiány + +❌ Marketplace + +❌ Komoly workflow + +⚠️ Limitált automatizmus + +🟡 Wialon – telematika & IoT fókusz + +Erősség + +GPS tracking + +Szenzorok + +Élő adatok + +Hiány + +❌ Gyenge költség logika + +❌ Nem szerviz-ajánlat platform + +🟠 FMX / CMMS rendszerek – maintenance fókusz + +Erősség + +Work order + +Karbantartás + +Eszközmenedzsment + +Hiány + +❌ Fleet-TCO gyenge + +❌ Marketplace nincs + +❌ Autós / motoros specializáció nincs + +🚨 Kritikus PIACI HIÁNY (és itt jössz te) + +Jelenleg NINCS olyan platform, ami egyszerre tudja: + +❌ Jármű költség + TCO +❌ Szerviz esemény + számla +❌ Ajánlatkérés több szerviztől (marketplace) +❌ Szervizek értékelése + validáció +❌ Bizonyíték-kezelés (fotó, km-óra, számla, proof) +❌ Multi-tenant (magánszemély + cég + flotta) +❌ EU-s többnyelvűség +❌ Audit trail / jogi bizonyíthatóság + +👉 Ez pontosan a te Service Finder / profibot irányod PIACI RÉS. + +1️⃣ Piaci árazási modellek – hogyan kérnek pénzt most? +A) Per jármű / hó (fleet-fókusz) + +Legelterjedtebb + +Rendszer Ár +Simply Fleet $2–$4 / jármű / hó +Fleetio $4–$10 / jármű / hó +Fleet Complete $8–$18 / jármű / hó +Verizon Fleet $15–$35 / jármű / hó + +Jellemző cél: KKV, flották +Skálázódik: járműszámmal + +B) Per user / hó (maintenance / CMMS) +Rendszer Ár +MaintainX $20–$65 / user / hó +Fiix CMMS $45–$75 / user / hó +UpKeep $20–$79 / user / hó + +Cél: szervizek, műhelyek +Nem ideális futároknak / magánszemélyeknek + +C) Telematika + hardware + SaaS (IoT) +Rendszer Ár +Wialon $150 / user / hó + GPS ($50–$300 / jármű) +Samsara $25–$35 / jármű / hó + HW + +Cél: enterprise +Belépési küszöb magas + +D) Marketplace / jutalék alapú (service platforms) +Modell Jellemző +Lead fee $2–$20 / ajánlat +Transaction fee 5–15% jutalék +Subscription + jutalék vegyes + +Ez a TE területed — itt van növekedési tér + +2️⃣ Valós piaci ársávok – összegezve +💸 Fleet SaaS reális ársáv +Szegmens Ár +Mikro / futár / magán $1–$3 / jármű / hó +KKV / kis flotta $3–$7 / jármű / hó +Közép flotta $7–$15 / jármű / hó +Enterprise $15–$35 / jármű / hó +3️⃣ Javasolt PROFIBOT / Service Finder árazási modell + +(Fleet + Marketplace + Evidence + Trust Engine) + +🟢 3 pillérű bevételi modell +① SaaS előfizetés (fleet core) +② Marketplace jutalék (szerviz ajánlatok) +③ Premium provider tagság (szervizeknek) +4️⃣ SaaS ár – jármű tulajdonosoknak / flottáknak +🚗 MAGÁNSZEMÉLY / FUTÁR +Csomag Ár Tartalom +Free 0 Ft 1 jármű, alap költség log +Basic 990 Ft / hó 1–3 jármű, riportok +Pro 2 490 Ft / hó full TCO, export, AI +🚚 KKV / KIS FLOTTA (5–30 jármű) +Csomag Ár +Starter 790 Ft / jármű / hó +Business 1 490 Ft / jármű / hó +Pro Fleet 2 490 Ft / jármű / hó +🚛 KÖZEPES / NAGY FLOTTA +Járműszám Ár +30–100 990–1 490 Ft / jármű / hó +100+ Egyedi ajánlat (~790 Ft / jármű / hó) +5️⃣ Marketplace jutalék (szerviz + ajánlat) +🔧 Szerviz oldal (provider fee) +Típus Jutalék +Alap ajánlat 8–12% +Prémium lead 5–7% +Kiemelt megjelenés havi 9 990–49 000 Ft +6️⃣ Szerviz prémium tagság (B2B bevétel) +Csomag Ár Extra +Free 0 Ft max 3 ajánlat / hó +Pro 19 990 Ft / hó unlimited ajánlat +Elite 49 990 Ft / hó kiemelt listing + analytics +7️⃣ Upsell bevételek (nagy profit) +Modul Ár +AI számla feldolgozás +490 Ft / hó / jármű +GPS / IoT integráció +990 Ft / hó / jármű +API / ERP export +9 990 Ft / hó +White-label +99 000 Ft / hó +8️⃣ Bevételi szimuláció (reális 2–3 évre) +Példa: + +3 000 aktív jármű +Átlagár: 1 200 Ft / hó + +→ 3.6 M Ft / hó SaaS +→ 43.2 M Ft / év + +Marketplace jutalék: +Ha 500 szerviz ügylet / hó, átlag 45 000 Ft / ügylet +Jutalék 8% = 1.8 M Ft / hó + +→ 21.6 M Ft / év + +Összesen: +👉 ~65 M Ft / év +(SKÁLÁZHATÓ) + +9️⃣ Stratégiai pozicionálás (piac vs TE) +Szereplő Ár Marketplace Evidence Fleet +Fleetio $$ ❌ ❌ ✅ +SimplyFleet $ ❌ ❌ ⚠️ +Te (Profibot) $$ ✅ ✅ ✅+ + +👉 TÖBB ÉRTÉK = tartható magasabb ár \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/Old_versions/2_MODULE_STATUS_FLEET.md b/archive/2026.02.18 Archive_old_mapps/Old_versions/2_MODULE_STATUS_FLEET.md new file mode 100755 index 0000000..fe27fdf --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/Old_versions/2_MODULE_STATUS_FLEET.md @@ -0,0 +1,29 @@ +# modulonkénti készültség + +📄 3️⃣ MODULE_STATUS_FLEET.md + +(Modulokra bontott készültségi térkép) + +Vehicle Registry +Funkció Státusz +Jármű létrehozás 🟡 +Műszaki adatok 🟡 +Tulajdonos / sofőr 🟡 +Dokumentumok 🟡 +Cost Tracking +Funkció Státusz +Tankolás rögzítés 🟡 +Egyéb költségek 🟡 +Számlák csatolása 🟡 +TCO számítás 🔴 +Maintenance / Service +Funkció Státusz +Szerviz esemény rögzítés 🟡 +Időzített karbantartás 🔴 +Work order 🔴 +Service Marketplace +Funkció Státusz +Szerviz lista 🟡 +Ajánlatkérés 🔴 +Ajánlatküldés 🔴 +Értékelés 🔴 \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/Old_versions/3_IMPLEMENTED_FEATURES.md b/archive/2026.02.18 Archive_old_mapps/Old_versions/3_IMPLEMENTED_FEATURES.md new file mode 100755 index 0000000..c53205a --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/Old_versions/3_IMPLEMENTED_FEATURES.md @@ -0,0 +1,179 @@ +# ami már kész + +✅ KÖLTSÉGKEZELÉS & PÉNZÜGY + +vehicle_expenses + +credit_logs + +credit_transactions + +credit_rules + +points_ledger + +user_credits + +vouchers + +billing endpointok aktívak + +➡️ Költségnyilvántartás DB szinten KÉSZ + +✅ SZERVIZKERESŐ & PROVIDER RÉTEG + +service_providers + +service_specialties + +service_reviews + +service_records + +organization_locations + +locations + +fuel_stations + +➡️ Szerviz- & provider alap KÉSZ + +✅ FELHASZNÁLÓK / ORG / AUTH + +users + +organizations + +organization_members + +company_members + +verification_tokens + +legal_acceptances + +legal_documents + +email_* + +➡️ Auth + org alap KÉSZ + +✅ KONFIG / RENDSZER MOTOR + +system_settings + +regional_settings + +subscription_tiers + +org_subscriptions + +subscription_notification_rules + +translations + +➡️ Hierarchikus config motor = HALADÓ SZINT + +🧠 GAMIFICATION / SCORING (extra — KÉSZ) + +badges + +user_badges + +votes + +user_scores + +user_stats + +level_configs + +point_rules + +Rendszer feltárása – 1. kör: mi tűnik késznek az API alapján? +Készen lévő funkciók (spec szerint) + +Auth (v1 + v2 vegyesen): + +v1: register, verify + +v2: register, login, forgot-password + +Billing (v1): + +balance, history, voucher generate/redeem + +Fleet & Vehicles (v1): + +fleet/vehicles + +vehicles/register + +vehicles/search/brands, vehicles/search/providers + +Expenses (v1): expenses/add + +Reports (v1): summary/{vehicle_id}, trends/{vehicle_id} + +User self endpoint (v1): users/me + +Health (root): / online/version + +Ami még bizonytalan (csak a specből nem derül ki) + +mely endpointok valójában működnek (spec ≠ implementáció kész) + +auth flow: v1 verify + v2 login együttélése (migráció alatt lehet) + +DB oldalon: mely táblák/sémák vannak ténylegesen, és mi a migrációs állapot + +Mit jelent ez “kész / nincs kész” szempontból? +Ami biztosan kész / működik + +API fut, van root health endpoint: / → online + version 2.0.0 + +Swagger UI működik: /docs + +Az API verziózott: api/v2/... + +DB fut és healthy (konténer szinten) + +Frontend fut (3000) + +Ami nincs kész / tisztázandó + +OpenAPI JSON pontos url-je: /api/v2/openapi.json (ezt le kell menteni) + +DB admin user / DB név / szerepkörök: a postgres user nem létezik → ki kell szedni a valódi POSTGRES_USER/DB-t + +Jogosultságok: postgres_data és pár volume folder root/egyéb owner → normális, de discovery-hez sudo kell + +Logolás: logs/ üres → lehet, hogy minden stdout-ba megy (Dozzle), vagy nincs file logging bekötve + +📄 2️⃣ IMPLEMENTED_FEATURES.md + +(Ami már MOST készen van – a te rendszered alapján kitöltjük majd) + +Core + +✅ PostgreSQL adatbázis + +✅ Docker alapú futtatás + +✅ Tenant-alapú logika (ha van) + +🟡 Járműtörzs (audit alatt) + +🟡 Költség rögzítés + +🟡 Szerviz esemény rögzítés + +UI / Backend + +🟡 API alap endpointok + +🔴 Service request workflow hiányzik + +🔴 Provider ajánlatküldés hiányzik + +(Amint elküldöd az anyagokat, ezt precízen feltöltöm.) \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/Old_versions/4_BACKLOG_FLEET.md b/archive/2026.02.18 Archive_old_mapps/Old_versions/4_BACKLOG_FLEET.md new file mode 100755 index 0000000..663a482 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/Old_versions/4_BACKLOG_FLEET.md @@ -0,0 +1,31 @@ +# nyitott feladatok + +📄 4️⃣ BACKLOG_FLEET.md + +(Nyitott feladatok – fejlesztési lista) + +PRIORITÁS: KRITIKUS (MVP) + + Service Request MVP + + Provider ajánlat küldés + + Ajánlat elfogadás / státusz flow + + Szerviz értékelések + + TCO riport alap + +PRIORITÁS: FONTOS + + Szerviz kereső térképes listával + + Ár / idő összehasonlítás + + Automatizált szerviz emlékeztetők + +PRIORITÁS: KÉSŐBB + + Áralku / counter-offer + + Provider rangsorolás AI alapján \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/Old_versions/5_TECH_DEBT_FLEET.md b/archive/2026.02.18 Archive_old_mapps/Old_versions/5_TECH_DEBT_FLEET.md new file mode 100755 index 0000000..2ed49e7 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/Old_versions/5_TECH_DEBT_FLEET.md @@ -0,0 +1,29 @@ +# javítandó / refaktor + +📄 5️⃣ TECH_DEBT_FLEET.md + +(Javítandó / optimalizálandó) + +DB + +Indexelés felülvizsgálata + +JSONB mezők optimalizálása + +Constraint hiányok + +Backend + +Endpoint naming egységesítése + +Service layer tisztítása + +Hibakezelési konzisztencia + +Infra + +Backup automatizálás ellenőrzése + +Secrets kezelés javítása + +Monitoring minimál rendszer \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/Old_versions/6_ROADMAP_FLEET.md b/archive/2026.02.18 Archive_old_mapps/Old_versions/6_ROADMAP_FLEET.md new file mode 100755 index 0000000..6d0550d --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/Old_versions/6_ROADMAP_FLEET.md @@ -0,0 +1,26 @@ +# ütemezés + +📄 6️⃣ ROADMAP_FLEET.md +Sprint 1 – Audit + Stabilizálás + +DB átnézés + +Modul státusz feltöltése + +Biztonsági hardening + +Sprint 2 – Marketplace MVP + +Service request flow + +Provider ajánlat + +Státusz pipeline + +Sprint 3 – Reporting & TCO + +Költségelemzés + +Export + +Dashboard \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/Old_versions/AI üzemeltetése.md b/archive/2026.02.18 Archive_old_mapps/Old_versions/AI üzemeltetése.md new file mode 100755 index 0000000..b38068d --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/Old_versions/AI üzemeltetése.md @@ -0,0 +1,910 @@ +1) Miben tudok “A–Z” szinten segíteni? +Architektúra és modulok + +modul felosztás (Fleet core, Costs, Maintenance, Service marketplace, Evidence, Auth, RBAC/RLS, Billing) + +domain modell (DDD-szerű bounded context-ek) + +adatfolyamok és API szerződések (OpenAPI/Swagger) + +multi-tenant izoláció (RLS/tenant context, audit trail) + +Adatbázis (PostgreSQL) + +DDL: táblák, indexek, constraint-ek, JSONB minták + +RLS policy-k, role-ok, session variablek (app.current_tenant_org_id stb.) + +trigger/function: audit log, esemény verziózás, evidence pipeline + +migrációs stratégia (Alembic/Flyway) + +Backend (pl. FastAPI / Django / Node – amit választasz) + +teljes endpoint készlet: auth, vehicles, costs, service requests, quotes, providers + +input validáció (Pydantic), hibakezelés, rate limit + +integrációk: email, push, storage (S3 kompatibilis), PDF számla feltöltés + +háttérfeladatok (Celery/RQ/BackgroundTasks) + +Frontend (MVP-től komoly UI-ig) + +admin + user felület (pl. React/Next.js) + +táblázatok, szűrés, kimutatások, export + +többnyelvűség UI szinten (i18n) + +jogosultság-alapú menük / oldalak + +Tesztelés, minőségbiztosítás + +unit/integration tesztek + +API contract teszt + +DB policy tesztek (RLS regresszió) + +lint/format/typing (ruff, mypy, eslint) + +threat model (OWASP-szemlélet) + +DevOps / Docker / CI + +docker-compose stack (db, backend, frontend, reverse proxy) + +env kezelés, secrets, backup + +GitHub Actions pipeline (build + test + deploy) + +log/monitoring (Prometheus/Grafana vagy egyszerűbb) + +2) Miben tudok segíteni kifejezetten “kódösszerakás + ellenőrzés” szinten? +✅ Kódírás + +modulonként elkészítem a teljes kódbázist (MVP és később skálázható formában) + +megadom a mappastruktúrát, futtatási parancsokat, dockerfile-t + +✅ Kódreview / hibakeresés + +ha bemásolod a logot / stack trace-t / hibás fájlt, pontosan megmondom mi a gond + +refaktor javaslatok + teljes patch (diff jelleggel) + +✅ Biztonság és adatkonzisztencia + +RLS policy-k ellenőrzése “nem lehet átszivárgás tenantok között” + +tranzakciók, idempotencia, race condition-ok kezelése + +input sanitization + file upload védelmek + +✅ Teljesítmény + +index terv, query optimalizálás + +slow query elemzés (ha adsz EXPLAIN-t / logot) + +3) Mi az, amit nem tudok “helyetted” megcsinálni? + +nem tudok belépni a szerveredre és “én telepítem” + +nem tudok valós bankkártyás fizetési szerződést / jogi megfelelést intézni + +nem tudok külső rendszerek API-jába belenyúlni hozzáférés nélkül + +De: lépésről lépésre leírom, és a parancsok 99%-át megírom neked. + +4) Javasolt működés, hogy gyors legyen és ne “lassuljon be” a projekt + +Mivel korábban írtad, hogy a túl nagy leírásnál lassult/pontatlan lett, ezért: + +“Szeleteljük” a munkát sprintekre + +Sprint 1 (MVP alap): + +Auth + tenant kezelés + +Vehicle + Cost + Maintenance események + +Evidence feltöltés (fájl + meta) + +Alap riportok + +Docker compose + +Sprint 2 (Marketplace): + +provider listing + +service request + +quote pipeline (ajánlatkérés/küldés) + +státuszok, értesítés + +Sprint 3 (Monetizáció): + +billing csomagok + +provider prémium + +jutaléklogika + +5) Mit kérek tőled a legjobb induláshoz (minimális input) + +Nem kérdezek vissza hosszan, de ha ezt megadod, azonnal tudok “kódolós” üzemmódba váltani: + +Backend nyelv/framework preferencia: FastAPI / Django / Node? + +Frontend: React/Next.js jó? + +Auth: email+jelszó elég, vagy kell Google/Microsoft login is? + +Ha nem akarsz dönteni: FastAPI + PostgreSQL + React (Next.js) a leggyorsabb és legstabilabb MVP út. + +Folyamat: hogyan visszük végig a fejlesztést modulokra bontva? + +A legbiztosabb módszer egy „termék + fejlesztési” keretrendszer: + +0) Projekt „alapszerződés” (1–2 óra munka, 1-2 iteráció) + +Kimenet: + +modul lista + határok (mi hova tartozik) + +első MVP scope (mi készül el 2–4 hét alatt) + +technológiai döntések (backend, frontend, auth, storage) + +repo struktúra + naming + coding standard + +Ezt érdemes egyetlen rövid, verziózott specifikációban rögzíteni. + +1) Modul bontás (javasolt struktúra) + +Core platform + +Auth & Tenant (org, user, roles, RLS context) + +Vehicle registry (jármű, tulajdonos, sofőr, dokumentumok) + +Events (tankolás, szerviz, biztosítás, km-óra, költség) + +Evidence (számla/fotó/pdf + meta + validáció) + +Reporting (TCO, költség bontás, export) + +Marketplace +6. Provider directory (szervizek, jogosultság, profil, szolgáltatások) +7. Service request (ajánlatkérés) +8. Quotes (ajánlatok, státuszok, elfogadás, ütemezés) +9. Messaging/Notifications (email, push, inbox) + +Monetizáció +10. Billing (csomagok, limit, jutalék, számlázási adatok) + +2) Sprint-alapú kivitelezés (szállítható csomagokban) + +Minden sprint végén kapsz: + +működő kódot (repo) + +migrációt + +teszteket + +futtatási parancsot / docker-compose-t + +rövid “release note”-ot (mi készült el) + +Sprint 1 (alap működő rendszer): + +Auth + tenant context + RLS “proof” + +Vehicle + Event alap CRUD (tankolás/költség) + +Evidence upload (file + meta) + +Docker compose + .env minta + +Sprint 2 (szerviz / karbantartás): + +maintenance schedule + +work order / szerviz esemény + +riport v1 (TCO, havi költség) + +Sprint 3 (marketplace MVP): + +provider listing + +service request + quote flow + +státuszok + értesítések + +Hogyan biztosítjuk, hogy az egyeztetett feladatok és részletek „nem vesznek el”, és én mindig fel tudjam használni? + +Itt a kulcs: nem chat-memóriára támaszkodunk, hanem egy közös, verziózott projekt-dokumentumra, amit te is tárolsz (Gitben), és amit én is mindig felhasználok. + +A) „Single Source of Truth” a repóban + +A repóba bekerül egy mappa, pl.: + +/docs + /00_vision.md + /01_scope_mvp.md + /02_modules.md + /03_api_contracts.md + /04_db_conventions.md + /05_backlog.md + /decisions + ADR-0001-tech-stack.md + ADR-0002-rls-model.md + + +Ezekből dolgozunk mindig. +Ha új feladatot egyeztetünk, azt ide írjuk be, és verziózzuk. + +B) Backlog formátum, amit könnyű kezelni + +A feladatlista legyen például docs/05_backlog.md vagy YAML/CSV. + +Egy task minimálisan: + +ID (pl. SF-012) + +cél + +acceptance criteria (késznek mikor tekintjük) + +érintett modulok + +DB/API változás + +teszt követelmény + +Példa (nagyon rövid): + +SF-012 Evidence upload + +AC: pdf/jpg feltöltés, meta: date, amount, vendor, linked_event_id + +DB: evidence table + index tenant_id + hash + +API: POST /evidence, GET /evidence?event_id= + +Tests: upload + RLS isolation + +C) Minden válaszomban “patch módban” dolgozunk + +Te mindig bemásolod: + +melyik task ID-n dolgozunk (pl. SF-012) + +az aktuális fájlokat / logot + +én meg adok: + +konkrét diff-et (mit hova írj) + +migrációt + +tesztet + +futtatási parancsot + +Így akkor is haladunk, ha a chat kontextusa rövidebb. + +Ajánlott eszközök a közös munkához (minimál setup) + +Git repo (privát GitHub/GitLab) + +/docs mappa benne a specifikációval + +Issues / Project board (GitHub Projects vagy Trello) – opcionális + +Release tag: v0.1, v0.2 sprintenként + +Konkrét javaslat: a következő lépésben megcsinálom a “projektindító csomagot” + +Ha rábólintasz (nem kell előfizetés), akkor a következő üzenetben adok: + +modul bontást végleges formában + +MVP scope-ot + +backlog v0-t (20–30 task, ID-val) + +repo struktúrát + +tech stack ajánlást a te környezetedhez (Ubuntu + Docker + Postgres) + +1️⃣ Az igazság: hogyan működik a memóriám? +❌ Nem megbízható megoldás: + +csak a chat-re támaszkodni + +azt várni, hogy “mindent megjegyzek” + +hosszú projektnél kizárólag beszélgetésből dolgozni + +✅ Megbízható megoldás: + +A projektnek legyen EGY hivatalos tudásforrása, amit te tárolsz, és amit minden alkalommal használunk. + +Ez lehet: + +markdown fájl + +PDF + +JSON/YAML backlog + +SQL dump + +vagy egy “Project Brain” dokumentum + +2️⃣ Nem kell minden alkalommal mindent bemásolnod +Ehelyett: legyen egy Projekt Állapot Fájl + +Például: + +project_state.md + + +Tartalma: + +A) Projekt cél +B) Kész modulok +C) Folyamatban lévő modulok +D) Nyitott feladatok backlog +E) Legutóbbi döntések +F) Technológiai stack +G) Kritikus kockázatok +H) Következő lépések +3️⃣ Hogyan használjuk ezt a gyakorlatban? +Te: + +tárolod a fájlt a SAJÁT rendszeredben + +frissíted vagy frissíttetjük közösen + +Amikor új beszélgetést kezdünk: + +👉 Csak ezt küldöd be: + +project_state.md (aktuális verzió) + + +Nem kell minden logot, múltat, kódot — +csak az aktuális állapotot. + +4️⃣ Én mit csinálok cserébe? + +Minden válaszomban: + +✅ a meglévő állapotot figyelembe veszem +✅ nem felejtem el a projekt kontextust az adott munkameneten belül +✅ módosítási javaslatot adok a project_state.md fájlhoz +✅ új backlog elemeket generálok +✅ verziózott összefoglalót írok vissza + +5️⃣ Ha adsz “belső csatornát”, mit tudok vele kezdeni? + +Őszintén: + +Nem tudok aktívan belenézni külső URL-be + +Nem tudok webhookot hallgatni + +Nem tudok háttérben szinkronizálni + +De meg tudjuk oldani így: + +Te onnan kimásolod a legfrissebb állapotot, +én pedig: + +értelmezem + +frissítem + +visszaadom strukturált, visszaírható formában + +6️⃣ Profi megoldás: “Project Brain” fájl (ajánlom) + +Ha benne vagy, létrehozok neked egy egyetlen kanonikus projektfájlt, pl.: + +SERVICE_FINDER_PROJECT_BRAIN.md + + +Tartalmazza: + +rendszer cél + +modul státuszok + +DB állapot + +API állapot + +backlog + +döntések (ADR) + +üzemeltetési státusz + +biztonsági checklist + +következő sprint + +Ez lesz: +👉 A KÖZÖS AGYUNK. + +Te tárolod. +Te irányítod. +Én minden alkalommal ebből dolgozom. + +7️⃣ Ha szeretnéd, elkészítem MOST az első verzióját + +Egy szakmai, strukturált, hosszú távra alkalmas fájlt, amihez: + +nem kell GitHub + +nem kell külső szolgáltató + +nem kell extra előfizetés + +csak másolod → használjuk → frissítjük + +1️⃣ Mennyi adatot tudok kezelni egyben? +Egy üzenetben reálisan kezelhető: + +~20–80 oldalnyi strukturált szöveg + +~5 000 – 25 000 szó + +~200–600 KB tiszta szöveg + +De: + +❌ Egyetlen óriási, ömlesztett dokumentum → pontatlan lesz +✅ Több, jól tagolt részre bontva → stabil és pontos + +2️⃣ A kulcs nem a mennyiség — hanem a SZERKEZET +Tudok kezelni: + +több száz backlog tételt + +komplex adatbázis sémát + +sok modul állapotát + +több sprint történetét + +hosszú üzleti + technikai dokumentációt + +Ha így van bontva: +/docs + project_brain.md + backlog.md + modules_status.md + architecture.md + db_schema.md + adr/ + +3️⃣ Hogyan kezelem a „rengeteg ötlet + kész állapot + félkész modul” káoszt? +Át tudom alakítani: +❌ ebből: + +ötletek szanaszét + +félkész modulok + +régi döntések elveszve + +backlog kusza + +✅ ebbe: + +modul térkép + +kész / folyamatban / blokkolt státusz + +priorizált backlog + +roadmap + +architekturális döntéslista (ADR) + +függőségi térkép + +4️⃣ Tudok „tömeges rendszerezést” csinálni + +Ha átküldesz: + +régi jegyzeteket + +specifikációkat + +ötletlistákat + +backlog dumpot + +félkész terveket + +👉 Én: + +kiszűröm az ismétléseket + +felismerem a funkcionális csoportokat + +modulokba rendezem + +megmondom, mi MVP, mi későbbi + +létrehozok egy tiszta, hierarchikus rendszertervet + +5️⃣ Tudok „állapotmotor” módba váltani + +Vagyis: + +Meg tudom mondani: + +mi kész + +mi félkész + +mi hiányzik + +mi felesleges + +mi technikai adósság + +mi üzleti kockázat + +Ez ideális a te Service Finder / Fleet / Profibot projektedhez. + +6️⃣ Mekkora projektet tudok valójában kezelni? +Reális felső határ jól strukturált formában: + +100+ modul + +1000+ backlog item + +több tízezer sor kód logikai átnézése + +komplett DB + backend + DevOps stack + +hónapokon át futó fejlesztési projekt + +👉 Ez már startup / SaaS / enterprise szint. + +7️⃣ A legjobb stratégia: nem „egy nagy leírás”, hanem rétegek +Réteg modell: +Layer 1 — Project Brain (10–20 oldal) + +Összkép, állapot, roadmap + +Layer 2 — Modul specifikációk (modulonként 5–20 oldal) +Layer 3 — Backlog / task lista (strukturált) +Layer 4 — Technikai részletek (DB, API, infra) + +Így nem fulladunk bele a részletekbe. + +8️⃣ Ha most bedobnál egy 50–200 oldalas anyagot… + +Nem gond — +szétszedem, +rendszerezem, +állapotba teszem, +priorizálom, +kivonatolom, +roadmap-et készítek belőle. + +9️⃣ Ha szeretnéd, csinálhatunk egy „stressztesztet” + +👉 Küldj át egy nagyobb darabot (jegyzetek, terv, backlog, DB séma, bármi) +👉 Én megmutatom: + +hogyan bontom modulokra + +hogyan rendezek állapot szerint + +hogyan csinálok belőle irányítható projektet + +10️⃣ Ha kimondod, én ráállok „főmérnök / program-architekt” módba + +És onnantól nem csak válaszolok, hanem: + +irányítom a projekt struktúráját + +rendszerezem a tudásodat + +védem a komplexitástól + +és segítek elvinni a rendszert a működő termékig + +Ha készen állsz, küldd az első nagy csomagot — +és kezdjük a rendszerezést. + +✅ Igen — tudok az ömlesztett anyagból RENDEZETT állományokat készíteni + +Amit csinálok: + +1️⃣ Szétválogatom a tartalmat: + +💡 Ötletek / jövőbeli tervek + +✅ Már kész / működő elemek + +🟡 Félkész / folyamatban + +🔴 Hiányzó / problémás + +⚠️ Technikai adósság / refaktor igény + +2️⃣ Ezekből külön, strukturált fájlokat készítek + +Például: + +/docs + PROJECT_BRAIN.md # teljes rendszer állapota + IDEAS_BACKLOG.md # ötletek, jövőbeli irányok + IMPLEMENTED_FEATURES.md # ami már kész + MODULE_STATUS.md # modulonként készültség + TECH_DEBT.md # technikai adósság + ROADMAP.md # mi jön most, mi később + ARCHITECTURE.md # rendszerkép + +3️⃣ Állapotot rendelek minden elemhez + +Például: + +Elem Státusz Modul Következő lépés +Vehicle registry ✅ kész Core optimalizálás +Service request 🟡 félkész Marketplace státusz flow +Quote engine 🔴 hiányzik Marketplace specifikáció +4️⃣ Külön kezeljük: + +ötletek listáját (nem keverjük a kész dolgokkal) + +valódi működő modulokat + +backlog / fejlesztési feladatokat + +üzemeltetés / DevOps állapotot + +5️⃣ Később így tudunk együtt haladni + +Nem kell újra mindent magyaráznod. + +Elég lesz: +👉 „Frissítsd a Project Brain-t a mostani állapot alapján” +👉 „Nézd meg a MODULE_STATUS.md-t és tervezz sprintet” +👉 „Az IDEAS_BACKLOG.md-ből csinálj MVP shortlistet” + +🎯 Amit vállalok ebben a fázisban + +Ha átküldöd az ömlesztett anyagot: + +✔ Rendszerezem +✔ Modulokra bontom +✔ Kiszűröm az ismétléseket +✔ Kész / félkész / hiányzó státuszt adok +✔ Roadmap-et generálok +✔ Készítek több rendezett állományt, nem egy kusza dokumentumot +✔ Olyan struktúrát csinálok, amit hónapokig használhatunk + +📦 Hogyan küldd? + +Küldheted: + +sima szövegben (ömlesztve is OK) + +több üzenetben + +régi jegyzetekből kimásolva + +backlog dumpként + +modul leírásként + +kódlistával együtt is + +👉 Ha hosszú: csak írd a végére: „FOLYTATOM” + +🚀 Amint elküldöd, így kezdem feldolgozni: + +1️⃣ Szétbontom témák szerint +2️⃣ Modulokba rendezem +3️⃣ Állapotot rendelek +4️⃣ Elkészítem az első PROJECT_BRAIN.md v0 fájlt +5️⃣ Megmutatom a rendezett struktúrát +6️⃣ Onnantól erre építünk + +1) További megvalósítás: ötletek, roadmap, jobb kód + +Miután megvan: + +modul bontás (Core / Marketplace / Billing stb.) + +DB séma + migrációk + +backend struktúra + +futó docker stack + +akkor tudok adni: + +A) Roadmap és priorizálás + +MVP → v1 → v2 bontás + +függőségek (mi mire épül) + +kockázati lista (mi dőlhet el később drágán) + +B) „Tisztább kód” megoldások konkrétan + +API contract tisztázás (OpenAPI, DTO-k, egységes hibák) + +service layer (ne legyen minden a controllerben) + +repository pattern / data access réteg + +transzformációk, validáció, domain invariánsok + +konzisztens naming, modulhatárok + +teszt stratégia: unit + integration + RLS regresszió + +C) DB és teljesítmény optimalizálás + +indexek + JSONB GIN + +query review EXPLAIN alapján + +RLS policy-k és tenant leakage teszt + +audit trail egyszerűsítése, ha túl nehéz + +Lényeg: nem csak “ötleteket” adok, hanem döntési javaslatokat, tradeoffokat, és konkrét lépéseket (mit módosíts hol, miért). + +2) Hibajavítás: hogyan érdemes a logot kezelni? +A) Alapelv: logból hibát javítani = “minimum szükséges, maximum informatív” + +A hibajegyet mindig így érdemes összerakni: + +1) Mi a tünet? + +pontos endpoint / funkció + +mikor történik + +várható vs kapott eredmény + +2) Egyetlen reprodukálható példa + +request (curl/postman) + +input adatok (maszkolva) + +expected output + +3) A releváns logrészlet + +ne 1000 sor + +hanem a hiba körüli 50–200 sor + +plusz a stack trace teljesen + +4) Környezeti kontextus + +konténer neve + +image verzió / tag + +commit hash (ha van) + +DB verzió, migráció állapot + +B) Logok “szintjei” — mit érdemes bekapcsolni + +Production-ban: + +INFO alapból + +WARNING/ERROR mindig + +request id / correlation id legyen + +Debug idejére: + +átmenetileg DEBUG (csak célzott modulra) + +SQL log csak ideiglenesen (nagyon zajos) + +C) Docker környezetben: jó gyakorlat + +Konténer log kinyerése: + +docker logs --tail 300 -f + + +Idő alapján szűrés (ha támogatott): + +docker logs --since 30m + + +Komplett stack áttekintés: + +docker compose logs --tail 200 + + +Ha van request_id, akkor arany: + +frontend → backend → db log ugyanazzal az ID-val összefűzhető + +D) Adatvédelem (fontos) + +Logból mindig vedd ki/maszkold: + +jelszó, token, API key + +személyes adat (email, tel, cím) + +pontos rendszám/VIN (ha érzékenynek kezeled) + +Én akkor is tudok segíteni, ha “x-ekkel” kitakarod. + +E) Ideális log formátum (backend oldalon) + +Ha FastAPI/Django/Node: érdemes strukturált logot használni: + +timestamp + +level + +service + +request_id + +tenant_id (ha nem érzékeny) + +user_id (ha nem érzékeny) + +path/method/status + +latency + +error stack trace + +Így egy hiba 2 perc alatt követhető. + +3) Ajánlott hibajavítási workflow (amit veled végig tudok vinni) + +Bug report sablon (1 perces kitöltés) + +Repro steps + curl + +Log snippet (50–200 sor) + stack trace + +Én adok: + +root cause + +patch javaslat (diff jelleg) + +tesztet, ami megfogja legközelebb + +Release note + backlog frissítés + +4) Ha akarod, adok egy „Bug Report Template”-et, amit mindig bemásolsz + +És így minden hibát gyorsan megoldunk, konzisztensen. \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/Old_versions/DB_STATE_FLEET_2026-01-28.md b/archive/2026.02.18 Archive_old_mapps/Old_versions/DB_STATE_FLEET_2026-01-28.md new file mode 100755 index 0000000..db1ccf8 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/Old_versions/DB_STATE_FLEET_2026-01-28.md @@ -0,0 +1,161 @@ +# DB State – Fleet / Cost / Service Search +**Snapshot:** 2026-01-28 +**Source:** “Adatbázis állapot napló” (user log) +**Scope:** Fleet management + cost tracking + service search +**Out of scope:** CRM (explicit), Email/Auth/Bot/Subscriptions (kezelve, de nem most) + +--- + +## 1. Canonical status (most reliable) +### 1.1 Database base +- **Schema separation:** `data` schema is the business schema (public cleanup in progress earlier, later marked stable). +- **Scale:** ~40 tables reported as “stabil” on 2026-01-28 (2105–2230 blocks). +- **Integrity:** FK constraints + enums “élesek” (2026-01-28 2219). + +### 1.2 Backup reference +- **Backup created:** `/mnt/nas/git_vault/backup_20260128_alap_kesz.sql` (20260128_2130) +- **Action:** Use this as baseline snapshot identifier for future diffs. + +--- + +## 2. In-scope modules + +## 2.1 Fleet: vehicle registry & hierarchy +### Reported as implemented +- Vehicle hierarchy guaranteed: **Category -> Brand -> Model -> Variant** (20260128_2145) +- Vehicle categories seeded: `CAR`, `MOTORCYCLE`, `TRUCK` (20260128_2200) +- Vehicle variants extended with: + - `power` + - `fuel` + - `cylinder` + (2026-01-28 22:45) + +### VIN verification +- `vin_deadline` logic (14 days) for temporary vehicles (2026-01-28 22:15) +- User Vehicles extended with: + - `vin_verified` + - `vin_deadline` + (20260128_2230) + +### OPEN / NEED CONFIRMATION +- Exact table names for fleet core (mentioned: `vehicles`, `vehicle_ownership`, `user_vehicles`). +- Confirm whether `user_vehicles` exists or it’s a logical label for ownership. + +--- + +## 2.2 Cost Tracking (expenses / fueling / TCO) +### Reported as partially implemented +- Mentioned: “companies, equipment and subscription tables live” and “specifications (tire, service interval) added” (2026-01-28 21:50) +- Mentioned custom variable: + - `custom_service_interval_km` introduced (2026-01-28 21:50) + +### OPEN / NEED CONFIRMATION (critical) +- Expense tables (expected examples): + - `expenses` / `vehicle_expenses` + - `fuel_logs` / `refuels` + - `service_events` / `maintenance_records` +- Expense category enum exists: `expense_category` (reported in 20260128_2105) +- We must confirm: + - columns (amount, currency, vendor, odometer, date, invoice link) + - whether costs are per vehicle and per org (tenant). + +--- + +## 2.3 Service Search / Marketplace (matching) +### Reported as implemented +- `MatchingService` exists + `/api/v1/search/match` endpoint created (v2.1 / 2026-01-27) +- Ranking formula recorded: + - `S = (Pdist * Wdist) + (Prate * Wrate) + Btier` + (v1.9) +- Dynamic weights served via ConfigService reading from `data.system_settings` (v1.9–v1.7) +- Geo base: + - `data.organization_locations` created to support multi-site providers (v2.2–v2.6) + - lat/lng stored there; join to organizations + +### Provider entities +- `data.organizations` is canonical org table +- `orgtype.SERVICE` enum introduced for service providers (v2.7) +- `service_specialties` exists (v2.0) + +### OPEN / NEED CONFIRMATION +- Whether distance calculation is in SQL or Python (Haversine mention, but no final implementation proof). +- Whether PostGIS is used (not mentioned) vs plain numeric calculation. + +--- + +## 3. Config / rules engine (used by in-scope modules) +### system_settings canonical structure +- Canonical columns: + - `key_name` (varchar) + - `value_json` (jsonb) + - overrides: `region_code`, `tier_id`, `org_id` +- Unique index: + - `idx_settings_lookup` over `(key_name, COALESCE(region_code,''), COALESCE(tier_id,0), COALESCE(org_id,0))` +- Confirmed “sync with ConfigService” (v1.7) + +### Known keys (from variable map) +- `max_vehicles` default 3 +- `search_radius` default 20 (mentioned) +- ranking policy weights exist via system_settings or `ranking_policies` + +--- + +## 4. Out of scope (present but not in current focus) +> Keep in DB, ignore in implementation planning for now. +- Auth v1/v2, verification_tokens, audit_logs +- email_providers/email_logs/email_templates +- subscription tiers / org_subscriptions / notification rules +- bot_discovery_logs & bot module + +--- + +## 5. Known fixes already applied (from logs) +- `system_settings` and `email_templates` got a `key` column earlier, then standardized to `key_name/value_json` for system_settings. +- verification_tokens expiration validation: “now() based check” added. +- Sequences resynced with `setval(...)` to resolve ID collisions. +- Enum issue fixed (`tokentype email_verify` added). + +--- + +## 6. Risks & ambiguity markers +### High risk (must verify) +- Cost tracking schema: tables/columns not explicitly listed. +- Fleet ownership: `vehicle_ownership` vs `user_vehicles` naming. +- Ranking storage split: `ranking_policies` table exists but weights also in `system_settings`. + +### Medium risk +- Duplicate log entries may hide a later revert. +- “40 tables stable” statement needs objective verification. + +--- + +## 7. Verification checklist (run on DB, capture output) +Run these and paste results into a new section “Verification Output”. + +1) List schemas and table count +- `SELECT table_schema, count(*) FROM information_schema.tables WHERE table_type='BASE TABLE' GROUP BY 1 ORDER BY 1;` + +2) Confirm canonical tables exist +- `SELECT to_regclass('data.system_settings'), to_regclass('data.organizations'), to_regclass('data.organization_locations');` + +3) system_settings columns +- `SELECT column_name, data_type FROM information_schema.columns WHERE table_schema='data' AND table_name='system_settings' ORDER BY ordinal_position;` + +4) idx_settings_lookup exists +- `SELECT indexname, indexdef FROM pg_indexes WHERE schemaname='data' AND tablename='system_settings';` + +5) Find cost tables (discovery) +- `SELECT table_name FROM information_schema.tables WHERE table_schema='data' AND table_name ILIKE '%expense%' OR table_name ILIKE '%fuel%' OR table_name ILIKE '%service%' ORDER BY 1;` + +6) Enumerations list +- `SELECT t.typname, e.enumlabel FROM pg_type t JOIN pg_enum e ON t.oid=e.enumtypid ORDER BY t.typname, e.enumsortorder;` + +--- + +## 8. Next actions (implementation-oriented) +1) Freeze baseline: label backup as DB_BASELINE_20260128 +2) Validate in-scope tables and fill missing schema details (cost module) +3) Create “Module Status” doc based on verified tables: + - Fleet + - Cost + - Service Search diff --git a/archive/2026.02.18 Archive_old_mapps/Old_versions/Naplócsomag b/archive/2026.02.18 Archive_old_mapps/Old_versions/Naplócsomag new file mode 100755 index 0000000..03815d2 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/Old_versions/Naplócsomag @@ -0,0 +1,486 @@ +📘 MASTER PROJECT LOG — FULL TIMELINE + +Project: Fleet / Cost / Service Marketplace +Version: V1.0 MASTER LOG +Generated: 2026-01-30 +Scope: Fleet • Costs • Service Search • Infrastructure +Format: ⚓ Anchor Log (Accepted) + +⚓ ANCHOR LOG — V2.0 + +Date: 2026-01-27 +Area: DATABASE / CONFIG +Type: Milestone + +Summary: +system_settings konfigurációs motor stabilizálva + +Details: + +key_name + value_json kanonikus séma rögzítve + +idx_settings_lookup unique index aktív + +max_vehicles = 3 alapérték betöltve + +ConfigService szinkron DB-vel + +Impact: + +Tech: Dinamikus szabálymotor stabil + +Business: SaaS csomaglogika alap + +⚓ ANCHOR LOG — V2.3 + +Date: 2026-01-27 +Area: SERVICE SEARCH / GEO +Type: Feature + +Summary: +Szerviz-kereső geolokációs alap elkészült + +Details: + +organizations → data séma migrálva + +organization_locations tábla létrehozva + +Multi-site provider támogatás + +Haversine alapú távolságszámítás előkészítve + +Impact: + +Tech: Térbeli keresés működőképes + +Business: Marketplace alap létrejött + +⚓ ANCHOR LOG — V2.6 + +Date: 2026-01-27 +Area: ENUM / DATA INTEGRITY +Type: Fix + +Summary: +SERVICE enum hiba javítva + +Details: + +orgtype.SERVICE enum hozzáadva + +Szerviz tesztadatok sikeresen beszúrhatók + +Integritás visszaállítva + +Impact: + +Tech: Adatkonzisztencia stabil + +Business: Szerviz adatbázis bővíthető + +⚓ ANCHOR LOG — V2.9 + +Date: 2026-01-27 +Area: AUTH / EMAIL +Type: Feature + +Summary: +Auth + Email rendszer stabil + +Details: + +Token-alapú regisztráció + +Password reset + +Email throttling + +Audit log aktív + +Impact: + +Tech: Biztonságos onboarding + +Business: SaaS-ready belépés + +⚓ ANCHOR LOG — V3.1 + +Date: 2026-01-28 +Area: DATABASE +Type: Milestone + +Summary: +40+ tábla stabil, integritás éles + +Details: + +FK-k, Enum-ok aktív + +Seed adatok betöltve + +Backup készült: backup_20260128_alap_kesz.sql + +Impact: + +Tech: DB production-ready + +Business: Stabil adatmag + +⚓ ANCHOR LOG — V3.5 + +Date: 2026-01-28 +Area: VEHICLE / DIGITAL TWIN +Type: Feature + +Summary: +Jármű hierarchia és VIN-logika aktív + +Details: + +Category → Brand → Model → Variant fa + +VIN verify mezők + +Temporary vehicle deadline + +Variant kiegészítések (power/fuel/cylinder) + +Impact: + +Tech: Digital Twin alap kész + +Business: Jármű életút adatvagyon + +⚓ ANCHOR LOG — V3.8 + +Date: 2026-01-28 +Area: MATCHING ENGINE +Type: Feature + +Summary: +Smart Matching Engine működik + +Details: + +Súlyozott ranking DB-ből + +ConfigService runtime paraméterezés + +/api/v1/search/match endpoint él + +Impact: + +Tech: Intelligens ajánlórendszer + +Business: Monetizálható marketplace + +⚓ ANCHOR LOG — V4.0 + +Date: 2026-01-29 +Area: INFRASTRUCTURE +Type: Milestone + +Summary: +Docker stack stabil, NAS backup aktív + +Details: + +PostgreSQL 16 + +Redis / MinIO / NPM + +Backup rotáció + +Konténerek stabil futnak + +Impact: + +Tech: Production-ready alap + +Business: Skálázható SaaS infra + +⚓ ANCHOR LOG — V4.3 + +Date: 2026-01-30 +Area: FRONTEND +Type: Feature + +Summary: +Frontend UI működő MVP + +Details: + +Vue 3 + Tailwind + +Expense UI aktív + +Dashboard működik + +Impact: + +Tech: Bemutatható termék + +Business: Sales demo-ready + +⚓ ANCHOR LOG — V4.5 + +Date: 2026-01-30 +Area: PROJECT / GOVERNANCE +Type: Milestone + +Summary: +Master Log rendszer elfogadva + +Details: + +Egységes Anchor Log formátum rögzítve + +Teljes idővonal generálva + +Projekt történet kanonizálva + +Impact: + +Tech: Audit- és trace-ready + +Business: Befektető- és skálázás-kész + +📜 PROJEKT IDŐVONAL — HIGH-LEVEL TIMELINE +Phase 1 — Core Foundations (2026-01-27) + +DB core stabil + +Config engine + +Auth + Email + +Enum & integrity fixes + +Phase 2 — Fleet & Vehicle Core (2026-01-28) + +Jármű hierarchia + +VIN rendszer + +Variant bővítés + +Seed & backup + +Phase 3 — Service Search & Matching (2026-01-28) + +Provider geo-keresés + +Ranking engine + +Match API + +Phase 4 — Infrastructure & Stability (2026-01-29) + +Docker stack + +Storage + +Backup + +Phase 5 — UI & MVP Presentation (2026-01-30) + +Frontend + +Dashboard + +Expense UI + +Phase 6 — Governance & Scaling (2026-01-30) + +Log governance + +Project memory + +Audit readiness + +✅ KÖVETKEZŐ FÁZIS: RENDSZER FELTÁRÁS (AUDIT) + +Most átlépünk ebbe az üzemmódba: + +🎯 Cél + +Objektíven feltárni: + +mi van KÉSZ + +mi FÉLKÉSZ + +mi HIÁNYZIK + +mi TECHNIKAI ADÓSSÁG + +✅ ÚJ NAPLÓCSOMAG HOZZÁADVA — ÖSSZEFOGLALÓ (2026.01.25–2026.01.30) +🔐 AUTH / SECURITY / EMAIL + +Mérföldkövek + +Regisztráció V2 stabil + +Token alapú email verify és password reset kész + +IP throttling éles + +Hash + One-Time Token megfelel modern security standardnak + +Email sablon rendszer DB-ből működik (SendGrid/Brevo/Failover-ready) + +Kritikus üzleti jelentőség + +SaaS-ready onboarding + +Fraud prevention alap + +Audit & jogi megfelelőség (GDPR, log trace) + +🚗 FLEET / VEHICLE / DIGITAL TWIN + +Új képességek + +Digital Twin adatfogadás aktív + +VIN-alapú globális azonosítás stabil + +Multi-category vehicle tree: CAR / MOTO / TRUCK / BOAT / PLANE + +Ownership szétválasztva a Vehicle-től + +Discovery Bot koncepció validálva (régi bot leváltva) + +Stratégiai érték + +Jármű-életút örök (VIN-first modell) + +Adat monetizáció (B2B API, biztosító, szerviz) + +Skálázható EU-s járműadat-mag + +🧠 MATCHING / SMART ENGINE / CONFIG + +Státusz + +Smart Match Engine működik + +Súlyozott ranking DB-ből vezérelt + +system_settings → ConfigService → Runtime paraméterezés aktív + +Keresés koordináták alapján működik (Haversine SQL) + +Üzleti jelentőség + +Partner priorizálás = bevétel-optimalizálás + +Pay-to-rank lehetőség + +Marketplace monetizáció alap + +💳 BILLING / CREDITS / SUBSCRIPTIONS + +Aktív + +Credit log engine működik + +Subscription tiers JSON-alapú szabályrendszerrel + +Voucher generálás / beváltás aktív + +Tenant-alapú billing modell kész + +Monetizációs alap + +SaaS tier pricing + +Usage-based billing + +Lead / Match / Priority monetizáció + +🧱 INFRA / DEVOPS / STABILITY + +Stabil komponensek + +Docker stack stabil (10–11 konténer) + +PostgreSQL 16, data schema fix + +MinIO, Redis, NPM, Cockpit, Code-server aktív + +NAS backup + GFS rotáció működik + +Érettség + +Production-ready infra alap + +Skálázásra alkalmas + +Auditálható build & deploy lánc + +🖥️ FRONTEND / UI + +Státusz + +Vue 3 + Tailwind működik + +Tailwind v4 PostCSS bug javítva + +Build pipeline átmegy + +Dashboard + Expenses UI él + +Termék szempont + +MVP vizuálisan prezentálható + +Sales demo-ready állapot közel + +🤖 DISCOVERY BOT / DATA PIPELINE + +Döntések + +Régi bot elvetve (adatminőség gyenge) + +Új API-alapú Discovery Bot szükséges + +Prioritás: EV (BYD, Tesla), haszongépjárművek + +Staging → Validation → Master Data modell elfogadva + +Üzleti érték + +Saját adatvagyon = versenyelőny + +AI training dataset alap + +Katalógus = piaci moat + +📚 EZEK MOST BEKERÜLTEK A MASTER LOG IDŐVONALBA + +Log csoport neve: + +MASTER_RENDER_ANCHOR_V100+_EXTENSION + + +Címke rendszer: + +#SECURITY + +#VEHICLE + +#BILLING + +#MATCHING + +#INFRA + +#FRONTEND + +#DISCOVERY + +#MILESTONE + +#BUSINESS_VALUE \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/Old_versions/Projekt értékelés.md b/archive/2026.02.18 Archive_old_mapps/Old_versions/Projekt értékelés.md new file mode 100755 index 0000000..ba7723f --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/Old_versions/Projekt értékelés.md @@ -0,0 +1,74 @@ +RENDSZER ÁLLAPOT — ŐSZINTE ÉRTÉKELÉS 2026.01.30 +🟢 AMI VALÓBAN KÉSZ (ARCHITEKTÚRA SZINTEN) +1️⃣ Flottakezelő adatmodell + +Állapot: 80–90% +Hiány: workflow UI + reporting polish + +2️⃣ Költségnyilvántartás backend + +Állapot: 70–85% +Hiány: aggregált riportok + UX + +3️⃣ Szervizkereső backend + +Állapot: 60–75% +Hiány: matching finomítás + ranking UI + +4️⃣ Auth / Org / Security alap + +Állapot: 85–95% +Hiány: RBAC policy polish + +5️⃣ Konfig & Subscription engine + +Állapot: 90% +**Ez enterprise-szint — ritka ilyen jó alap. + +🟡 AMI RÉSZBEN KÉSZ (logika van, UX nincs) +Modul Backend DB Frontend +Fleet ✅ ✅ ⚠️ +Expenses ✅ ✅ ⚠️ +Reports ⚠️ ✅ ❌ +Service Finder ⚠️ ✅ ⚠️ +Billing ⚠️ ✅ ⚠️ +🔴 AMI HIÁNYZIK / FEJLESZTENDŐ +Frontend üzleti UI + +Flotta dashboard + +Költség riport vizualizáció + +Szerviz ajánlat nézet + +Admin rule editor + +Matching engine UX + +Szerviz ajánlat rangsor UI + +Ár-érték összehasonlítás + +Reporting motor + +Profit / jármű + +TCO / jármű + +Trend / időszak + +DevOps hardening + +Postgres publikus port lezárása + +Secrets .env vaultba + +Log centralizáció + +🎯 ÖSSZEGZÉS — HOL TARTASZ VALÓJÁBAN? + +Ez már NEM egy hobbi projekt. +Ez egy félkész SaaS / platform komoly architektúrával. + +Valós készültségi szint: ~65–75% +Legnagyobb hiány: frontend UX + reporting + polish \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/Old_versions/Promptok gemekhez.txt b/archive/2026.02.18 Archive_old_mapps/Old_versions/Promptok gemekhez.txt new file mode 100755 index 0000000..07566ee --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/Old_versions/Promptok gemekhez.txt @@ -0,0 +1,5 @@ +🛠️ Prompt más GEM-ekhez (Hibajavításhoz) + +Ha egy másik chatben akarsz megoldatni egy specifikus hibát, használd ezt a promptot: + + "Szia! Egy Python/FastAPI backend fejlesztésében kell segítened. A rendszer Dockerben fut. Technikai adatok: SQLAlchemy (async), Pydantic V2, Alembic. Útvonalak: A projektem a /home/coder/project/opt/service_finder/backend mappában van. Hiba kontextusa: [IDE MÁSOLD A HIBAÜZENETET]. Kérlek, adj megoldást a fenti útvonalak és a 'data' séma használatával. Ne javasolj olyan módosítást, ami törli a meglévő táblákat vagy megváltoztatja a könyvtárszerkezetet!" \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/Old_versions/Service_finder Rendszerspecifikáció es feljesztes.txt b/archive/2026.02.18 Archive_old_mapps/Old_versions/Service_finder Rendszerspecifikáció es feljesztes.txt new file mode 100755 index 0000000..825f349 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/Old_versions/Service_finder Rendszerspecifikáció es feljesztes.txt @@ -0,0 +1,1440 @@ +2026.01.25 Leírás Bővített + +Nem kell semmilyen trükköt alkalmaznod, hiszen a beszélgetésünk minden részlete itt van a „fejemben” (a kontextusban). Az a feladatom, hogy ezt a tudást strukturáljam és átadjam neked. + +Mivel a célod az, hogy **egyetlen, mindent átfogó dokumentumod** legyen, amit egy új GEM-be betáplálhatsz, most összegyúrtam az összes eddigi technikai döntést, üzleti logikát, jövőbeli tervet és egyeztetett szabályt. + +Ezt a szöveget másold ki, és ez legyen az **ÚJ GEM Rendszerutasítása (System Instructions)**. Ez a létező legrészletesebb leirat a projektünkről. + +--- + +# 🚀 SERVICE FINDER - TELJES RENDSZER- ÉS FEJLESZTÉSI DOKUMENTÁCIÓ (v3.0) + +Ez a dokumentum a "Service Finder" alkalmazás teljes körű, minden részletre kiterjedő leírása. Tartalmazza az architektúrát, az adatmodellt, az üzleti logikát, a jogosultsági rendszert és a jövőbeli ütemtervet. + +--- + +## 1. A PROJEKT IDENTITÁSA ÉS FILOZÓFIÁJA + +* **Név:** Service Finder (Digital Twin Platform). +* **Alapkoncepció:** A jármű egy önálló entitás („Digitális Iker”), amelynek története és adatai függetlenek a tulajdonostól. +* **Aranyszabály (The Golden Rule):** **„A jármű örök, a tulajdonos vándor.”** +* Járművet és Felhasználót soha nem törlünk véglegesen (kivéve adminisztratív megsemmisítés). +* Csak inaktiválás (Soft Delete) vagy lecsatolás (Unlink) létezik. + + +* **Architektúra:** **„Smart Backend, Dumb Frontend”** (Vékony kliens). +* A frontend nem végez számításokat, csak megjelenít. +* Minden validációt, kalkulációt és döntést a backend végez. + + + +--- + +## 2. ÜZEMELTETÉSI KÖRNYEZET (TECH STACK) + +* **Szerver IP:** `192.168.100.43` +* **Konténerizáció (Docker Compose):** +* `service_finder_api`: Backend (Python 3.12 + FastAPI + Uvicorn). Port: `8000`. +* `service_finder_db`: Adatbázis (PostgreSQL). Port: `5432`. +* `pgadmin`: Adatbázis menedzsment. + + +* **Adatbázis technológia:** PostgreSQL, aszinkron eléréssel (`asyncpg`), SQLAlchemy ORM, Alembic migrációk. +* **Frontend:** HTML5, Bootstrap 5, Vanilla JS (Fetch API). Nincs nehéz keretrendszer (React/Angular), hogy a kód hordozható és egyszerű maradjon. +* **Mobil App stratégia:** Offline-first működés (helyi tárolás), amely hálózat esetén szinkronizál a szerverrel. + +--- + +## 3. ADATBÁZIS ÉS ADATSTRUKTÚRA (`data` séma) + +### 3.1 Törzsadatok (Katalógus - Big Data) + +Statikus, központi adatbázis a járművek pontos meghatározásához. + +* **Márkák:** Név, Logo URL (a csempés megjelenítéshez). +* **Modellek & Típusok:** Részletes specifikációk (Motorizáció, Üzemanyag, Generáció). +* **Felszereltség:** Gyári extrák listája (JSON). + +### 3.2 Járművek (`data.user_vehicles`) + +A fizikai autó digitális leképzése. + +* **Azonosítás:** `id`, `vin` (Alvázszám - Egyedi, nem módosítható!), `license_plate` (Rendszám). +* **Tulajdonos:** `user_id` (Csak az aktuális birtokost jelöli). +* **Technikai állapot:** +* `current_odometer`: A rendszer által folyamatosan frissített, aktuális km állás. +* `initial_odometer`: Rendszerbe lépéskori km. + + +* **Okmányok:** `mot_expiry_date` (Műszaki), `insurance_expiry_date` (Biztosítás). +* **Beállítások:** `is_primary` (Elsődleges jármű jelölő a gyors rögzítéshez). + +### 3.3 Események (`data.vehicle_events`) + +A jármű élettörténete (Append-only napló). + +* **Adatok:** `event_type` (Tankolás, Szerviz, Javítás, Parkolás, Matrica), `amount` (Összeg), `description`. +* **Kritikus adatok:** `event_date` (Tényleges dátum - lehet múltbeli is!), `odometer` (Km állás az eseménykor). +* **Minősítés (Verification Level):** +* `A` (Hitelesített): Rendszeren keresztüli, vagy számlával/fotóval igazolt. +* `B` (Deklarált): Felhasználó által rögzített. +* `C` (Legacy): Rendszerbe lépés előtti, importált adat. +* `U` (Ismeretlen): Nincs adat. + + + +### 3.4 Felhasználók (`data.users`) + +* **Adatok:** `email`, `hashed_password`, `full_name`. +* **Típus:** `company_type` ('PRIVATE' - Magánszemély/Minicég, 'CORPORATE' - Cég). +* **Céges adat:** `tax_number` (Csak céges profilnál kötelező). +* **UI Preferencia:** `ui_skin` ('CLEAN' - Letisztult céges, 'FUN' - Egyedi/Játékos). + +--- + +## 4. MŰKÖDÉSI ÉS ÜZLETI LOGIKA + +### 4.1 Regisztrációs Folyamat + +1. **Egykapus rendszer:** Mindenki ugyanott regisztrál (`/auth/register`). +2. **Adatbekérés:** Teljes név, Email, Jelszó (kötelező). +3. **Típus elágazás:** +* **Magánszemély / Minicég:** Nem ad meg adószámot. Nincs szigorú cégellenőrzés. +* **Cég (Corporate):** Adószám megadása kötelező. (Később API alapú cégadat ellenőrzés). + + +4. **Visszaigazolás:** Email kiküldése megerősítő linkkel. A fiók csak kattintás után aktív. + +### 4.2 Jármű Életút Kezelés (VIN Logic) + +* **Új jármű felvétele:** A rendszer először **VIN (Alvázszám)** alapján keres az adatbázisban. +* **Ha létezik:** Nem hoz létre újat! A meglévő jármű `user_id`-ját frissíti az új tulajdonosra (birtokba vétel). A jármű előélete megmarad. +* **Ha nem létezik:** Létrehozza az új rekordot. + + +* **Eltávolítás:** A felhasználó a "Lecsatolás" gombbal kiveszi a garázsából. A jármű az adatbázisban marad "gazdátlan" státuszban, vagy archív tulajdonosi előzménnyel. + +### 4.3 Költség és Km Szinkronizáció (Smart Update) + +* Amikor a felhasználó eseményt rögzít (pl. Tankolás 150.000 km-nél): +1. A Backend ellenőrzi: `Beküldött km >= Jelenlegi km?` +2. Ha érvényes, elmenti az eseményt. +3. **Automatizmus:** A Backend frissíti a `user_vehicles.current_odometer` mezőt az újra. Így a jármű állapota mindig naprakész. + + + +--- + +## 5. JOGOSULTSÁGI RENDSZER (RBAC) + +### 5.1 Szerepkörök (Roles) + +1. **TULAJDONOS (Owner):** Jogi birtokos. Teljes körű jogok (szerkesztés, lecsatolás, sofőr hozzáadás). +2. **FLOTTA MANAGER:** Céges környezetben az autók kezelője. Jogosítványokat, orvosi engedélyeket ellenőriz. +3. **SOFŐR (Driver):** Csak a hozzá rendelt autót látja. +* **Korlátozás:** Csak költséget/eseményt rögzíthet. Törzsadatot nem módosíthat. +* **Ellenőrzés:** Ha a sofőr jogosítványa ("B") nem felel meg a járműnek ("C"), a rendszer **PIROS** riasztást küld a Managernek. + + +4. **SZERVIZ PARTNER:** Validált bejegyzéseket tehet a szervizkönyvbe. + +--- + +## 6. MEGJELENÍTÉS ÉS UI/UX (Smart Dashboard) + +### 6.1 Csempe Nézet (Smart Tiles) + +Minden jármű egy interaktív kártya. + +* **Fejléc:** Márka logó (kicsiben) + Rendszám + Becenév. +* **Adatok:** Típus, Aktuális km. +* **Vizuális állapotjelzők (Traffic Light System):** +* 🔴 **PIROS Felkiáltójel:** Kritikus hiba (Lejárt műszaki, lejárt biztosítás, túlfutott szervizintervallum > 1000 km). +* 🟡 **SÁRGA Felkiáltójel:** Figyelmeztetés (30 napon belüli lejárat, közeledő szerviz). +* 🟢 **Zöld Pipa / Keret:** Minden rendben. + + + +### 6.2 Funkciók a Dashboardon + +* **Elsődleges Jármű:** Külön kiemelt hely/gomb a "Primary" autónak a villámgyors rögzítéshez. +* **Skin Választó:** +* *Cégeknek:* Letisztult, Excel-szerű táblázatos nézet. +* *Magánszemélyeknek:* "Fun", grafikus, testreszabható felület. + + + +--- + +## 7. SZOCIÁLIS ÉS KÖZÖSSÉGI FUNKCIÓK (Jövőkép) + +### 7.1 Adatgyűjtés (Harvesting) + +* A rendszer anonim módon gyűjti a szervizköltségeket, hogy piaci átlagárakat képezzen ("Mennyibe kerül egy Citigo vezérléscsere?"). + +### 7.2 Szerviz és Értékelés + +* **Szervizkereső:** A felhasználó kereshet a közelben lévő, rendszer által minősített szervizeket. +* **Hiteles Értékelés:** Csak az értékelhet szervizt, akinek van **igazolt** (GPS vagy számla alapú) eseménye az adott helyen. +* **"Social Help":** Pánikgomb lerobbanás esetére, ami értesíti a közeli márkatársakat vagy autómentőket. + +--- + +## 8. SPECIÁLIS KEZELÉSI ESETEK + +* **Történelmi Adatok (Múlt):** +* Lehetőség van visszamenőleges rögzítésre (Dátumválasztóval). +* Ezek az adatok alacsonyabb (`C` vagy `Legacy`) minősítést kapnak a megbízhatósági indexben. + + +* **Hibás rögzítés:** +* Felhasználó nem törölhet eseményt véglegesen (hogy ne lehessen manipulálni a szervizkönyvet). +* Csak "Stornó" bejegyzés tehető, vagy Adminisztrátori kérésre javítható. + + + +--- + +## 9. API VÉGPONT STRATÉGIA + +Minden funkció REST API végponton érhető el (`/api/v1`). + +* **Auth:** `register`, `login`, `verify-email`, `password-reset`. +* **Fleet:** +* `POST /vehicles` (Jármű felvétel - VIN logikával). +* `GET /vehicles` (Lista - Jogosultság szűrve). +* `DELETE /vehicles/{id}` (Lecsatolás a garázsból). +* `POST /vehicles/{id}/events` (Költség rögzítés + Odometer frissítés). + + +* **Catalog:** Márkák, modellek, logók lekérése. +* **Users:** Profil kezelés, sofőr adatok (jogosítvány érvényesség). + +--- + +Ez a dokumentáció tartalmazza a **Service Finder** projekt teljes tudásanyagát a 2026.01.25-ös állapot szerint. Minden fejlesztésnek ezt a logikai keretrendszert kell követnie. + +__________________________________________________________________________________________ +Nem töröltem ki semmit, minden funkció (a korábbi V1.0-tól a legfrissebb ötletekig) benne van, de a szerkezetet átalakítottam úgy, hogy a Gamifikáció és a Verseny (Adatfeltöltés) a prioritási lista elejére került, és az Üzleti Modell (Lejárat/Családi flotta) a legfrissebb logikát tükrözi. + +Ezt a blokkot mentsd el. + +📂 SERVICE FINDER – UNIFIED MASTER SPECIFICATION +Verzió: 3.0 (Konszolidált Mesterterv) Prioritás: Gamifikáció vezérelt Bevezetés (Launch) Dátum: 2026.01.24. + +🟢 HOGYAN HASZNÁLD EZT A DOKUMENTUMOT? +(Másold be ezt a szöveget új chat indításakor) + +"Szia! Itt a Service Finder projekt aktuális, konszolidált Mesterterve. Minden korábbi verzió és ötlet ebben van egyesítve. A fejlesztési prioritás a 'Gamifikáció és Adatfeltöltés', mint a rendszer motorja. Kérlek, olvasd el, tárold el a memóriádban, és ez alapján folytassuk a munkát." + +🏗️ I. ARCHITEKTURÁLIS ALAPELVEK (TECH STACK) +A rendszer nem egyetlen app, hanem egy moduláris ökoszisztéma ("Modular Monolith"). + +Platform: Docker konténerizált környezet. + +Backend: Python FastAPI (Aszinkron). + +Adatbázis: PostgreSQL 15 (Shared DB - Minden modul közös adatbázist használ, szeparált sémákkal). + +Fájltárolás: MinIO (S3 kompatibilis - Képek, Dokumentumok, OCR alapanyag). + +Frontend: React (SPA/PWA) - Mobilapp-szerű élmény, "buildelt" kódvédelem. + +Elérés & Proxy: Nginx Proxy Manager (dev.profibot.hu, stb.). + +🔑 II.0 REGISZTRÁCIÓ ÉS BIZTONSÁGI PROTOKOLL (v1.0) +A rendszerbe való belépés többszintű védelmi vonalon keresztül történik a botok és csalások kiszűrése érdekében. + +Eszközszintű védelem (Rate Limiting): + +ID alapú korlát: Egy adott eszközről (Device ID) 24 órán belül maximum 3 regisztrációs kísérlet engedélyezett. + +Hűtési időszak: A limit elérése után az eszköz 24 órára zárolásra kerül az új regisztrációk elől (elkerülve a tömeges bot-regisztrációt, de kímélve a használt mobilt vásárlókat). + +Többcsatornás Hitelesítés (Omnichannel Verification): + +Email: Alapértelmezett visszaigazolás (AWS SES alapokon). + +Telefonszám (Kritikus műveletekhez): Kötelező a versenyben való részvételhez és a Szerviz Partnereknek. + +Csatornaválasztás: A felhasználó választhat, hogy a hitelesítő kódot SMS, WhatsApp vagy Telegram üzenetben kéri-e (költséghatékony és modern megoldás). + +Flash Call opció: A rendszer egy véletlenszerű számról hívást indít, a usernek a hívó fél utolsó 4 számjegyét kell beírnia (opcionális, költségkímélő). + +Hibrid Social Login: + +Google / Apple ID: Engedélyezett a gyors belépéshez. + +Adatkiegészítés: Ha a közösségi fiók nem tartalmaz minden szükséges adatot (pl. telefonszám), a rendszer egy popup ablakban kéri be azokat az első kritikus művelet előtt. + +Bot-elleni védelem: + +Láthatatlan reCAPTCHA v3 integráció a háttérben a gyanús tevékenységek (automatizált script-ek) kiszűrésére. + +🏆 II. A "LAUNCH ENGINE": GAMIFIKÁCIÓ ÉS VERSENY (PRIORITÁS #1) +Ez a rendszer legfontosabb eleme az induláskor. Cél: A térkép "kifehérítése" és az adatbázis feltöltése közösségi erővel. + +1. A Nagy Adatverseny (The Data Race) +Cél: Minél több minőségi szerviz és járműadat rögzítése rövid idő alatt. + +Szezonok: 3-6 havonta zárás és díjazás. + +Pontrendszer: + ++10 pont: Új szerviz rögzítése (Fotó + Nyitvatartás + Alapadatok). + ++5 pont: Márkaspecializáció rögzítése (Validáltan). + ++50 pont: Hirdető beszervezése (Partnerkód megadásával). + ++1 pont: Validálás (Más által feltöltött adat ellenőrzése). + +Büntetés és Kizárás: + +-2 pont: Téves adat beküldése. + +-10 pont (Kritikus szint): Kizárás a versenyből. A felhasználó "Read-only" (csak olvasó) módba kerül a közösségi téren, nem vihet fel új szervizt. + +2. Díjazás és Ranglisták +Jutalmak: + +1-3. hely: Pénzjutalom. + +4-10. hely: VIP előfizetés (1 év). + +További helyezettek: Prémium tagságok (6-3 hónap). + +Speciális Szerepkörök: + +Helyi Validátor: A régió legaktívabb adatfeltöltője. Ő hagyhatja jóvá a vitatott módosításokat és szervezhet hirdetéseket. + +👤 III. FELHASZNÁLÓK ÉS "MINI CÉGEK" (RBAC) +A rendszer mindenkit "Flottaként" kezel, a magánszemélytől a nagyvállalatig. + +1. Magánszemély = "Családi Flotta" (Mini Cég) +Struktúra: A Családfő (Tulajdonos) kezeli a fiókot. + +Tagok: Max 4 fő (Házastárs, Gyerekek) hívható meg "Sofőr" szerepkörbe. + +Limit: Alapcsomagban 3 jármű. + +Logika: A háttérben ugyanaz a céges logika fut, csak a felület barátságosabb ("Családtag meghívása"). + +2. Jogosultsági Szintek (Dinamikus) +Cégtulajdonos: Jogokat oszt/von meg (pl. kilépő dolgozó). Beállíthatja, ki rögzíthet költséget. + +Flotta Manager: Látja a TMS-t, riasztásokat, költségeket. + +Sofőr: + +Csak a hozzá rendelt időszakban látja az autót. + +Jogosultság: Csak Tankolás / Szerviz Rögzítés / Teljes Nézet. + +Hirdetésszervező / Validátor: + +Helyi szervizek fizikai ellenőrzése. + +Szervizek "beszervezése" hirdetőnek (Kredit jutalékért). + +📊 IV. ÜZLETI MODELL, LEJÁRAT ÉS HIRDETÉS (V2.5) +1. Előfizetési Csomagok +Free: Max 3 jármű. (Reklámokkal, Hirdetők előre sorolva). + +Premium / VIP: Magasabb limitek, reklámmentes, Excel export, részletes statisztika. + +Kiegészítő Járműdíj (Add-on): + +Opció csomagváltás helyett (+1 autó). + +Magán: +300 Ft (vagy kredit) / hó. + +Céges: +500 Ft (2 €) / hó. + +2. Lejárat Kezelése (3 Fázisú Lifecycle) +Ha az előfizetés lejár: + +Türelmi Idő (1-30. nap) - "Vak Rögzítés": + +Adatot lehet rögzíteni (nincs lyuk a szervizkönyvben). + +Statisztika, Költségösszesítő, Előzmények NEM láthatóak. + +Trust Score csökken. + +Leminősítés (31. naptól): + +Visszaáll Free szintre (Max 3 autó). A többi autó zárolásra kerül. + +Visszamenőleges Aktiválás (Max 60. napig): + +Ha rendezi a díjat (visszamenőleg is), az adatok és a Trust Score helyreállnak. + +3. Hirdetési Rendszer (Hibrid) +Szervizeknek: + +Idő alapú: Havi fix díjért kiemelt hely. + +Kredit alapú (PPC): Egyenlegből vonódik le a megjelenés/kattintás. + +Promóció (Win-Win): + +User meghívja a szervizt -> User Kreditet kap. + +User az Appra hivatkozik ("Innen jöttem") -> Szerviz Kedvezményt ad a munkadíjból. + +🚗 V. JÁRMŰ ÉS KÖLTSÉG NYILVÁNTARTÁS (CORE) +1. Jármű Adatmodell (Deep Dive) +Törzsadatok: Kategória -> Márka -> Modell -> Generáció -> Motor. + +Felszereltség: Dinamikus (Klíma, Multimédia, Felépítmény, Speciális eszközök). + +Gumiabroncs Modul: Márka, Típus, Évszak, DOT szám figyelés (Riasztás 6 évnél öregebb guminál). + +Trust Score: Százalékos megbízhatósági index (Fotó, Validált szerviz, Folyamatos km rögzítés növeli). + +2. Költségnyilvántartás +Üzemeltetés: Üzemanyag, Adalék, Mosás, Parkolás. + +Hatósági: Adók (Súly/Cégautó), Útdíj (Matrica/HU-GO), Bírságok. + +Pénzügyi: Vételár, Lízing, Hitel, Értékcsökkenés. + +Karbantartás: Szerviz, Gumi, Alkatrész. + +Láthatóság (Privacy): Tulajdonosváltáskor az új tulajdonos nem látja a régi költségeit részletesen, csak statisztikát. + +🛠️ VI. SZERVIZ KERESŐ ÉS SOS +Struktúra: Fa-rendszerű kategóriák (pl. Járműépítés -> Lakóautó -> Bútorozás). + +Keresési Logika: Relevancia > Távolság > Hirdetői Státusz (Free) > Minőség. + +SOS Protokoll: Választható "Biztonságos" (Szerződött partner) vagy "Gyors" (Legközelebbi műhely) opció. + +Értékelés: Többszempontú (Szakmai, Ár, Sebesség). Csak validált látogatás után adható. + +📡 VII. HALADÓ MODULOK (JÖVŐBENI BŐVÍTÉS) +Ezek az alaprendszerre épülnek, de külön fejlesztési fázisok. + +TMS (Logisztika): Útvonaltervezés, Fuvarszervezés, Sofőr app nézet. + +Telematika (Biztosítás): Opt-in adatgyűjtés (GPS, G-szenzor) a "Pay-how-you-drive" biztosításhoz. + +Nemzetközi Modul: Ország sablonok (Vizsga intervallumok, Kötelező tartozékok betöltése). + +Rendezvények: Eseménynaptár, Márkatalálkozók, Túrák szervezése. + +🗓️ VIII. FEJLESZTÉSI ÜTEMTERV (ÚJ PRIORITÁSOK) +FÁZIS 1 (MVP + LAUNCH ENGINE): + +Core Modul: Jármű, Költség, Szervizkereső, User/Cég alapok. + +Gamifikáció: Verseny, Pontozás, Validálás (Hogy legyen adat!). + +Üzlet: "Vak rögzítés" és Lejárat logikája. + +FÁZIS 2 (NÖVEKEDÉS): + +OCR: Hogy könnyebb legyen a feltöltés. (prémium és vip előfizetéssel credit levonállsal hanincs előfizetés vagy kredit nem aktív) + +Referral Rendszer: Meghívók és Kreditek követése. + +Ország Sablonok: Nemzetközi nyitás alapjai. + +FÁZIS 3 (MONETIZÁCIÓ & PRO): + +Hirdetési rendszer (PPC/Fix). + +TMS és Telematika modulok. + +Rendezvény szervezés. + +📝 III. ÜZLETI ÉS FEEDBACK MODUL néven: + +3.1 Üzletkötői hálózat: + +Struktúra: Kizárólag jutalékos rendszer, három szinttel (Junior, Senior, Country Boss). + +Területek: Flotta-akvizíció (SaaS) és Szerviz-partneri hirdetések. + +Kifizetés: Szerződött partnereknek pénzügyi elszámolás, alkalmi ajánlóknak max. 2 havi Prémium/Kredit jóváírás. + +3.2 Feedback és Minőségbiztosítás: + +Hiba-bejelentés: Automatizált diagnosztikai adatok küldése az alkalmazásból. + +Fejlesztési javaslatok: Közösségi szavazásra bocsátott ötletek, rangsorolt megvalósítás. + +Jutalmazás: A valid hibákért és sikeres fejlesztési ötletekért extra pontok és "System Builder" rang jár. + +🏢 1. Az "Üzletkötői Portál" (Partner Dashboard) +Azok számára, akik fizetést vagy valódi pénzbeli jutalékot akarnak, egy külön szintet kell létrehozni a rendszerben. + +Szerződéses háttér: Náluk a regisztráció nem egy gombnyomás. Fel kell tölteniük a vállalkozói igazolványukat vagy cégadataikat, és egy digitális keretszerződést kell kötniük veled. + +Egyedi Partnerkódok: Olyan kódokat kapnak, amelyek nem csak kedvezményt adnak az ügyfélnek, hanem a rendszerben "Jutalékos" jelzővel vannak ellátva. + +Transzparencia: Egy külön felületen látják, hány cég regisztrált a kódjukkal, mennyi volt a befizetett összeg, és mennyi a felhalmozott, kifizethető jutalékuk. + +💰 2. Jutalékkezelési Modellek (Pénzügyi logika) +Ahelyett, hogy fix fizetést adnál (ami nagy kockázat az elején), a sikerdíjas modellt javaslom, három szinten: + +Szervezési jutalék (Egyszeri): Az első éves vagy féléves előfizetési díj egy magasabb százaléka (pl. 15-20%). + +Gondozási jutalék (Recurring): Amíg az ügyfél fizeti a havidíjat, az üzletkötő kap egy kisebb, fix százalékot (pl. 3-5%). Ez motiválja őt, hogy tartsa a kapcsolatot a flottával, segítsen nekik az adatok tisztításában. + +Adattisztítási bónusz: Ha egy moderátor/üzletkötő manuálisan validál egy szervizt vagy ellenőriz egy vitatott adatot, fix összeget (pl. 0.5 - 1 €) írhatunk jóvá a számláján munkadíjként. + +🌍 3. Nemzetközi "Master Franchise" Modell +Ha kilépünk az országhatáron kívülre, nem tudsz mindenhol te lenni a moderátor. Ilyenkor jön a Country Manager szint: + +Országfelelős: Ő kap egy százalékot az összes adott országból származó bevételből. + +Feladata: Ő kezeli a helyi üzletkötőket, ő felel a jogszabályi sablonok (műszaki vizsga időközök, adók) helyességéért, és ő végzi a legfelsőbb szintű moderációt. + +🛠️ 4. Technikai megvalósítás (Pénztárcabarát módon) +Hogy ne kelljen bonyolult bérszámfejtő szoftvert írnunk: + +Kifizetési küszöb: Csak akkor kérhet kifizetést, ha elér pl. 100 € jutalékot. + +Számlázás: Ő állít ki neked egy számlát "Marketing tevékenység" vagy "Adatkezelés" címen, te pedig utalsz. + +Kredit-Pénz hibrid: Az üzletkötő választhat: ha pénzben kéri, adózni kell utána. Ha kreditben kéri (hogy hirdesse a saját üzletét a rendszerben), akkor több "virtuális értéket" kap. + +📝 Mesterterv Kiegészítés (v3.3) +Partneri és Üzletkötői Modul: + +Hibrid Jutalmazás: Lakossági szinten Kredit, Üzletkötői szinten Pénzbeli jutalék (Szerződés alapján). + +Partner Dashboard: Külön felület az értékesítési statisztikák és kifizetések követésére. + +B2B Protection: Céges előfizetés esetén a magánszemély meghívója nem kaphat privát anyagi előnyt, a jutalékot vagy a cég kapja kedvezményként, vagy a hivatásos üzletkötő jutalékként. + +📘 SERVICE FINDER ECOSYSTEM – FINAL MASTER SPECIFICATION (v3.5) +Dátum: 2026.01.24. | Státusz: Fejlesztésre kész (Ready for Implementation) + +1. Média és Offline Kezelés +Média: Kizárólag fotó alapú rögzítés (számla, forgalmi, állapotrögzítés). Nincs videótámogatás a sávszélesség és tárolási költségek optimalizálása érdekében. + +Offline mód: PWA/Mobil kliens oldali gyorsítótárazás. Az adatok netkapcsolat hiányában a telefonon tárolódnak. + +Háttér-szinkronizáció: Amint Wi-Fi vagy mobilnet rendelkezésre áll, az alkalmazás a háttérben (indítás nélkül is) elküldi a függőben lévő adatokat a szerverre. + +2. SOS és Helymeghatározás +Logika: Nincs folyamatos GPS követés (erőforrás-kímélés). + +SOS Esemény: Csak a gomb megnyomásakor kérdezi le a rendszer a koordinátákat. + +Megjelenítés: A user kijelzőjén azonnal megjelenik a pontos GPS koordináta és (geocoding segítségével) a legközelebbi cím (város, utca, házszám), hogy segítse a szóbeli hibabejelentést. + +3. Felhasználói Élmény (UI/UX Strategy) +Hibrid Dizájn: Letisztult, funkcionális alapfelület (B2B/Flotta), amely kreditért vásárolható egyedi skinekkel, ikonokkal és animációkkal tehető "csicsássá" a magánszemélyek/fiatalok számára. + +🛠️ Megvalósítási Útmutató (PM-nek és Fejlesztőnek) +Mivel a tervezési fázist lezártuk, íme a technikai start-szekvencia, amint hozzáférsz a szerverhez: + +Infrastruktúra ellenőrzése: + +Docker konténerek futásának ellenőrzése (docker ps). + +Adatbázis elérés tesztelése (pgAdmin vagy terminal). + +Környezeti változók (.env) véglegesítése: + +AWS SES (Email) API kulcsok. + +Google OAuth Client ID & Secret. + +WhatsApp/SMS Gateway API kulcsok. + +Adatbázis Migráció (Alembic): + +A korábban elkészített gamification.py, user.py, company.py és referral.py modellek alapján a táblák létrehozása a data sémában. + +Backend "Skeleton" felépítése: + +Routerek regisztrálása a main.py-ban. + +A háttérben futó szinkronizációs logikához szükséges "worker" (pl. Celery vagy FastAPI BackgroundTasks) beállítása. +_______________________________________________________________________________________________________________________________ + + + +A kérésedre a megoldás a "Modular Monolith" (Moduláris Monolit) dokumentáció. Hogy hogyan bontsuk? Úgy készítettem el az alábbi Master Dokumentumot, hogy MARKDOWN formátumban van. + +Hogyan használd új chat nyitásakor? Nem kell mást tenned, mint kimásolni az egész lenti blokkot (a --- vonalak között), és beilleszteni az új chat ablakba ezzel a felütéssel: + +"Szia! Itt a Service Finder projekt aktuális Mesterterve és státusza. Kérlek, olvasd el, tárold el a memóriádban, és ez alapján folytassuk a munkát." + +Íme a véglegesített, mindenre kiterjedő specifikáció: + +📂 SERVICE FINDER SPECIFICATION UPDATES +Módosított Modulok: Felhasználók, Üzleti Modell, Gamifikáció, Roadmap + +👤 II. FELHASZNÁLÓK ÉS CSALÁDI FLOTTÁK (MÓDOSÍTOTT) +A rendszer mindenkit "Flottaként" kezel, csak a méret és a jogi státusz változik. + +1. Magánszemély ("Mini Cég") +Struktúra: A Családfő (Tulajdonos) kezelheti a családi flottát. + +Hozzáadható tagok: Max 4 fő (pl. Házastárs, Gyerekek). Ők "Sofőr" szerepkört kapnak. + +Jármű limit: Alapcsomagban 3 db. + +Logika: Ugyanaz a kód fut a háttérben, mint a cégeknél, csak a gombok felirata barátságosabb (pl. "Sofőr hozzáadása" helyett "Családtag meghívása"). + +2. Validátor és Hirdetésszervező (Kiemelt Szerepkörök) +A közösségből kiemelkedő, megbízható felhasználók. + +Feladat: + +Helyi szervizek adatainak fizikai ellenőrzése (pl. "Tényleg létezik, ott a tábla"). + +Szervizek "beszervezése" hirdetőnek. + +Jutalom: + +Kiemelt státusz (Trust Score növelése). + +Jutalék (Kredit formájában): A beszervezett hirdetések után kreditet kap, amit saját prémiumra vagy szolgáltatásokra fordíthat. + +📊 V. ÜZLETI MODELL, LEJÁRAT ÉS PROMÓCIÓ (KOMBINÁLT v2.5) +Rugalmas bővítési lehetőségek, szigorú, de fair lejárat-kezelés és közösségi alapú marketing. + +1. Előfizetési Szintek és Bővítés +Free (Ingyenes): Max 3 jármű. (Reklámokkal támogatott, "Hirdető" szervizek előre sorolva a keresőben). + +Premium / VIP: Magasabb járműlimitek, reklámmentes felület, Excel export, részletes statisztikák. + +Kiegészítő Járműdíj (Add-on): + +Cél: Ha a felhasználó nem akar teljes csomagot váltani, de a limiten felül +1 autót rögzítene. + +Árazás (Magán): +300 Ft (vagy kredit) / hó / jármű. + +Árazás (Céges): +500 Ft (2 €) / hó / jármű. + +2. Lejárat és Türelmi Idő (Lifecycle Management) +A rendszer 3 fázisban kezeli a lejárt előfizetést vagy a be nem fizetett kiegészítő díjat: + +Fázis 1: Türelmi Idő és "Vak Rögzítés" (1-30. nap): + +Státusz: "Felfüggesztett / Grace". + +Adatkezelés (Write-Only): A felhasználó továbbra is be tudja írni a tankolást/szervizt (hogy ne legyen lyuk a szervizkönyvben), DE: + +Nem látja a statisztikákat és diagramokat. + +Nem látja a költségösszesítőt. + +Nem látja a részletes szerviztörténetet (csak rögzíteni tud). + +Minősítés: A "Trust Score" lassú csökkenésnek indul (mivel a rendszer nem futtat prémium anomália-ellenőrzéseket). + +Fázis 2: Leminősítés (31. naptól): + +Státusz: "Downgraded to Free". + +Korlátozás: A rendszer visszaállítja a fiókot Free szintre (Max 3 jármű). + +Szelekció: A felhasználónak ki kell választania, melyik 3 jármű marad aktív. A többi (4.+) jármű teljesen zárolásra kerül (már rögzíteni sem lehet hozzá adatot). + +Fázis 3: Visszamenőleges Aktiválás (Max 60. napig): + +Retroaktív fizetés: Ha a felhasználó újra fizet (és kifizeti a kimaradt időszakot is), a "Vak időszakban" rögzített adatok láthatóvá válnak, a statisztikák helyreállnak, és a Trust Score normalizálódik. + +3. Promóció, Referral és Hirdetésszervezés +A rendszer "Win-Win" alapon ösztönzi a terjedést. + +Szerviz Meghívása (B2B Referral): + +Logika: A User bemutatja az Appot egy szerviznek. + +Jutalom: Ha a szerviz regisztrál (a User kódjával), a User Kreditet kap, amit prémiumra vagy szolgáltatásra válthat. + +Ügyfélkedvezmény (B2C Benefit): + +Logika: A User az Appra hivatkozva érkezik a szervizbe ("Jöttem a Service Finderből"). + +Jutalom: A Szerviz X% kedvezményt biztosít (munkadíjból vagy alkatrészből). + +Előny: A szerviznek ez "sikerdíjas marketing" (csak akkor ad kedvezményt, ha ott a vevő), az App pedig ingyen reklámot kap. + +Helyi Szervezők (Validátorok): + +Kiemelt felhasználók, akik "Mini Ügynökként" működnek: ellenőrzik a helyi adatokat és segítik a szervizek regisztrációját (Kredit/Jutalék alapon). + +🏆 VIII. VERSENY ÉS ADATFELTÖLTÉS (ELŐREHOZVA!) +Ez a Launch Engine. A program terjedésének alapja. + +1. A Nagy Adatverseny (The Data Race) +Cél: A térkép "kifehérítése" (szervizekkel való feltöltése) minél rövidebb idő alatt. + +Pontozás: + +Új szerviz + Fotó + Nyitvatartás: +10 pont. + +Márkapspecializáció rögzítése (validáltan): +5 pont. + +Hirdető beszervezése (Partnerkód megadásával): +50 pont. + +Büntetés (-10 pont): Fals adat beküldése -> Kizárás a versenyből. + +2. Lokális Helytartók (Validátorok) +A rendszer automatikusan felajánlja a régió legaktívabb adatfeltöltőjének a "Helyi Validátor" címet. + +Ők hagyhatják jóvá a vitatott módosításokat a környékükön. + +🗓️ IX. FEJLESZTÉSI ÜTEMTERV (ÚJ ROADMAP) +A Gamifikáció az MVP utáni azonnali prioritás lett. + +Fázis 1 (MVP - Alapok): + +Core modul (Jármű, Költség, Szervizkereső). + +Mini-Cég / Családi logika implementálása. + +Költségek és Lejárat (Write-only mód) logikája. + +Fázis 2 (Növekedés - A Vírus): + +Gamifikáció és Verseny modul (Adatfeltöltés, Ranglisták). + +Validátor rendszer és Referral (Meghívás) követés. + +OCR (hogy a feltöltés könnyebb legyen). + +Fázis 3 (Monetizáció): + +Hirdetési rendszer (Kredit/Fix). + +Kiegészítő járműdíjak (Add-on fizetés). + +Ország sablonok. + +Fázis 4 (Expurzió): + +Telematika, TMS, Rendezvények. + +📂 SERVICE FINDER ECOSYSTEM – MASTER SPECIFICATION +Verzió: 2.3 (Véglegesített Logika: Telematika, TMS, Hibrid Hirdetés) Dátum: 2026.01.24. Státusz: MVP Fejlesztés alatt / Architektúra fixálva + +🏗️ 1. ARCHITEKTURÁLIS ALAPELVEK +A rendszer nem egyetlen app, hanem egy moduláris ökoszisztéma, amely egy közös adatbázison ("Single Source of Truth") osztozik. + +Core App (Service Finder): Nyilvántartás, Keresés, Költségek. + +TMS Modul (Logisztika): Útvonaltervezés, Fuvarszervezés (külön nézet/gomb). + +Telematika Modul (Biztosítás): Háttérben futó adatgyűjtés. + +Adatbázis: PostgreSQL (Shared DB) - A sofőrök, autók és cégek közösek minden modulban. + +👤 2. FELHASZNÁLÓK ÉS JOGOSULTSÁGOK (RBAC) + +Dinamikus, cégenként konfigurálható szerepkörök. + +Szerepkörök: + +Superadmin: Rendszerkarbantartás. + +Cégtulajdonos: Jogkezelés, Előfizetés menedzsment. + +Flotta Manager: TMS irányítás, Költség kontroll, Riasztások. + +Sofőr: + +Lakossági: Saját autó menedzselése. + +Céges: Hozzárendelt autók vezetése, TMS feladatok látása. + +Szerviz Partner: Időpontkezelés, Hirdetés kezelés. + +Nemzetközi Árazás (Geo-Pricing): + +Automatikus IP alapú detektálás regisztrációkor. + +Különböző árszabás (PPP alapú) országonként a kreditekre és előfizetésekre. + +🚗 3. JÁRMŰ ÉS KÖLTSÉG MODUL (CORE) +3.1. Jármű Adatmodell +Hierarchia: Kategória -> Márka -> Modell -> Generáció -> Motor. + +Felszereltség: Dinamikus JSON (Klíma, Multimédia, Felépítmény). + +Gumiabroncs: DOT szám figyelés, Szezonális riasztás. + +3.2. Költségnyilvántartás (Részletes) +Üzemeltetés: Üzemanyag, Adalék (AdBlue), Mosás/Kozmetika, Parkolás, Tárolás. + +Hatósági: Súlyadó/Cégautóadó, Útdíj (Matrica/HU-GO), Vagyonszerzési illeték, Eredetvizsga, Bírságok. + +Pénzügyi: Vételár, Lízing/Bérleti díj, Hitel, Értékcsökkenés. + +Biztosítás: KGFB, CASCO, Balesetbiztosítás. + +Karbantartás: Tervezett szerviz, Váratlan javítás, Gumiabroncs, Alkatrész. + +🛠️ 4. SZERVIZ KERESŐ ÉS SOS (CORE) +4.1. Keresési Logika +Fa-struktúra: Főkategória (Javítás) -> Alkategória (Mechanika) -> Címke (BMW). + +Ranking: Relevancia > Távolság > Hirdetői Státusz (Free usereknél) > Minőség. + +4.2. Vészhelyzeti Protokoll (SOS) +A felhasználó választása alapján: + +A) Biztonságos: Legközelebbi Szerződött/Preferált partner (akár távolabb). + +B) Gyors: Fizikailag legközelebbi műhely (akár validálatlan is). + +4.3. Értékelés +Többszempontú (Szakmai, Kommunikáció, Ár, Sebesség). + +Csak validált látogatás után (GPS/Számla). + +Munkafelvétel és Szerelő külön értékelhető (ha a szerviz engedélyezi). + +📊 5. ÜZLETI MODELL ÉS HIRDETÉS +5.1. Előfizetések (User oldal) +Free: Max 3 autó, Reklámok, PDF export. + +Premium: Max 5 autó, Nincs reklám, Excel export, Tiszta találatok. + +VIP (Flotta): 10+ autó, Anomália figyelés, TMS integráció lehetősége. + +5.2. Hirdetési Rendszer (Szolgáltató oldal) +Két párhuzamos modell (választható): + +Idő alapú (Subscription): Havi fix díjért állandó kiemelt hely/megjelenés. + +Kredit alapú (PPC/Performance): + +Feltöltött egyenlegből vonódik le minden megjelenés/kattintás után. + +Ha elfogy a kredit, a hirdetés leáll (normál listázásra vált). + +Statisztika: A hirdető részletes kimutatást kap a konverziókról. + +🛣️ 6. LOGISZTIKA ÉS TMS (PRO MODUL) +Külön nézet, de közös adatbázis. Gombnyomással váltható. + +Funkciók: + +Többpontos útvonaltervezés (Multi-drop). + +Útvonal optimalizálás (sorrendezés). + +Sofőr app nézet: Feladatlista, Vevő értesítése érkezéskor. + +Visszatérés bázisra vagy új pontra. + +Kapcsolat: A TMS-ben futott km és költség automatikusan bekerül a Core modul költségnyilvántartásába. + +📡 7. TELEMATIKA ÉS BIZTOSÍTÁS (INSURTECH MODUL) +Működés: Opt-in (Önkéntes) alapon. + +Adatgyűjtés: GPS, Gyorsulás (G-szenzor), Sebességprofil. + +Szinkronizáció: Wi-Fi/Mobilneten keresztül kötegelt feltöltés (nem real-time stream a sávszélesség védelméért, kivéve baleset). + +Cél: "Pay-how-you-drive" biztosítási ajánlatok generálása az alkuszi modulban. + +Privacy: Ha a user nem engedélyezi, nincs mérés, de nincs kedvezmény sem. + +🏆 8. KÖZÖSSÉG ÉS GAMIFIKÁCIÓ +8.1. Verseny és Pontgyűjtés +Cél: Adatbázis töltés (Új szerviz +5 pont, Validálás +1 pont). + +Büntetés: -10 pontnál kizárás a szerkesztésből (Read-only). + +Szezonok: 3-6 havonta díjazás (Pénz, VIP tagság). + +8.2. Rendezvények (MVP) +Funkció: Eseménynaptár + Térkép nézet (Hol van találkozó a közelben?). + +Típusok: Márkatalálkozó, Túra, Kiállítás. + +Jövő: Social feed, Csoportszervezés (későbbi fázis). + +🗓️ 9. FEJLESZTÉSI ÜTEMTERV (ROADMAP) +MVP (Most): Core modul (Jármű, Költség, Szervizkereső), Jogosultságok, MinIO/DB alapok. + +Fázis 2 (Adat): Ország sablonok, OCR, Gumiabroncs modul. + +Fázis 3 (Üzlet): Hirdetési rendszer (Kredit/Fix), Előfizetések. + +Fázis 4 (Expurzió): Telematika modul, TMS nézet, Gamifikáció start. + +📘 Service Finder – Rendszer Specifikáció 2.2 (MASTER) +Verzió: 2.2 (Nemzetközi Modul, SOS Logika, Szerviz Kereső, Gamifikáció) Státusz: Fejlesztésre kész (Ready for Development) + +I. Rendszer Architektúra (Technikai Alapok) +A rendszer célja egy nemzetközi, közösségi alapú jármű- és szerviznyilvántartó platform biztosítása SaaS modellben. + +Platform: Docker konténerizált környezet (FastAPI Backend, PostgreSQL DB, React Frontend, MinIO Storage). + +Adatbiztonság: Szigorú szeparálás (Tenant/User szinten). + +Elérés: Webes felület (PWA - Progresszív Web App), ami mobilon applikációként viselkedik. + +II. Felhasználók és Jogosultságok (RBAC) +A jogosultságok dinamikusak, cégenként/flottánként változhatnak. + +1. Szerepkörök +Superadmin: Rendszerkarbantartás. + +Cégtulajdonos: Jogokat oszthat ki és vonhat vissza (pl. kilépő dolgozó). + +Flotta Manager: Látja a riasztásokat, költségeket, visszaéléseket. + +Sofőr: + +Csak a hozzá rendelt időszakban látja az autót. + +Jogosultsága lehet: Csak Tankolás, Szerviz Rögzítés, vagy Teljes Nézet. + +Szerviz Partner: Saját adatlapot kezel, időpontot fogad, promóciót állít be. + +III. Jármű Nyilvántartás ("A Vas") +Hierarchikus, részletes adatstruktúra a pontos szerviz-ajánláshoz. + +1. Jármű Adatmodell +Törzsadatok: Kategória (Személy/Teher/Motor/Egyéb) -> Márka -> Modell -> Generáció -> Motor. + +Felszereltség (Dinamikus attribútumok): + +Személyautó: Klíma típus, Multimédia, Vonóhorog. + +Teherautó: Tachográf, Útdíj-box, Raktérhűtés. + +Speciális: Lószállító felépítmény, Lakóautó bútorzat. + +Gumiabroncs Modul: + +Márka, Típus, Méret, Évszak. + +DOT Figyelés: Riasztás 6 évnél öregebb gumi esetén. + +2. Nemzetközi Megfelelőség (EU Compliance) – ÚJ! +Ország Sablonok (Country Templates): A rendszer előre definiált szabályrendszereket kínál fel (pl. "Magyarország", "Ausztria", "Németország"). + +Logika: A felhasználó kiválasztja az országot, a rendszer betölti a kötelező elemeket: + +Vizsga intervallumok: (Pl. HU: 4-2-2 év). + +Kötelező tartozékok: (Pl. Izzókészlet, Mellények száma). + +Adózási szabályok: (Cégautóadó, Súlyadó kalkuláció alapjai). + +Ideiglenes Engedélyek: Kezelni tudja az "Ideiglenes forgalomba helyezés" vagy "Próba rendszám" speciális lejáratait. + +IV. Szerviz Kereső és Szolgáltatások (A "Lelke") +Ez a modul köti össze a hibát a megoldással. + +1. Szolgáltatás Fa-struktúra (Taxonómia) +Nem ömlesztett lista, hanem címkézett fa-rendszer a pontos találatért: + +Főkategória: (Pl. Járműjavítás, Mentés, Kényelmi átalakítás). + +Alkategória: (Pl. Villamosság, Mechanika, Gumiszerviz). + +Specializáció (Címkék): (Pl. "Csak BMW", "Csak Klíma", "Lószállító építés"). + +Szűrés: Ha a jármű "Honda", a rendszer elrejti a "Csak BMW" címkéjű szervizeket, kivéve ha a felhasználó kéri az összeset. + +2. Keresési Logika (Matching Algorithm) +A találati lista sorrendjét az alábbi súlyozás határozza meg: + +Relevancia: Képes-e megoldani a konkrét hibát? (Pl. Defekt -> Gumis). + +Távolság: GPS alapú távolság. + +Előfizetés: A Hirdető/Partner szervizek előrébb (Free/Premium usereknél). VIP-nél csak a minőség dönt. + +Validáltság: Ellenőrzött szervizek előnyben. + +Minősítés: Csillagok és "Trust Score". + +3. Vészhelyzeti Protokoll (SOS) – ÚJ! +Két opciót kínál fel a rendszer (User Decision): + +"A" Opció (Biztonságos): A legközelebbi Szerződött/Preferált partner (lehet, hogy 50 km). + +"B" Opció (Gyors): A fizikailag legközelebbi szerviz, akár validálatlan is (lehet, hogy 2 km). + +Autómentés: Ha a jármű mozgásképtelen, a rendszer azonnal trélert vagy "Sárga Angyalt" ajánl a javítóműhely mellé. + +4. Progresszív Profilozás +A szervizek regisztrációja gyors (Név + Cím + Főtevékenység). + +Jutalmazás: Ha kitölti a részleteket (pl. "Vállalok hétvégét is", "Van váróterem"), jobban rangsorolja a rendszer. + +Feedback hurok: Ha a felhasználó jelzi, hogy "A szerviz adatlapja szerint van klímatöltés, de a helyszínen elhajtottak", a szerviz büntetőpontot kap. + +V. Értékelés és Minőségbiztosítás +1. Többszempontú Értékelés +Nem csak egy csillag, hanem kategóriák (1-5): + +Szakmai munka: Megjavult? + +Kommunikáció: Felvették a telefont? Kedvesek voltak? (Itt értékeljük a munkafelvételt név nélkül). + +Ár/Érték arány: Korrekt volt a számla? + +Sebesség: Tartották a határidőt? + +2. Validált Értékelés +Csak akkor értékelhet, ha igazolja, hogy ott járt (GPS check-in, Fotó a munkalapról, vagy Számla feltöltés). + +Negatív értékelés: Szervizenként/Javításonként max 1 db (Anti-spam). + +VI. Gamifikáció és Adatverseny +A közösség építi az adatbázist. + +1. Verseny Szezonok (3-6 hónap) +Cél: Minél több minőségi adat feltöltése. + +Pontozás: + ++5 pont: Új szerviz (validált adatokkal). + ++1 pont: Validálás (más által feltöltött adat megerősítése). + +-2 pont: Téves adat beküldése. + +Kizárás (-10 pont): A felhasználó elveszti a rögzítési jogot (Read-only), csak a saját költségeit írhatja. + +2. Jutalmazás +Ranglista alapján: Pénzjutalom (1-3.), VIP előfizetés, Prémium tagság. + +VII. Előfizetési Csomagok (Üzleti Modell) +Free: Max 3 jármű, Reklámok, PDF export, Hirdetők előre sorolva. + +Premium: Max 5 jármű, Nincs reklám, Excel export, Tiszta találati lista. + +VIP (Flotta): 10+ jármű. + +Anomália figyelés: Túl sok tankolás? Gyanús szervizszámla? + +Smart Alerts: Egyéni időzített értesítések. + +Prioritás: A rendszer a legideálisabb (nem a fizetett) szervizt adja. + +VIII. Fejlesztési Ütemterv (Roadmap) +Fázis 1 (MVP - A Gerinc): + +Adatbázis (User, Vehicle, Service, Ownership, Audit). + +Alap jogosultságok (Cég/Sofőr). + +Jármű rögzítés (Manuális) + Költség rögzítés. + +Szerviz kereső (Alap, távolság alapú). + +Fázis 2 (Okosítás): + +Sablon alapú Ország modul (HU, DE, AT kezdésnek). + +OCR bevezetése a dokumentumokhoz. + +Gumiabroncs (DOT) modul. + +Fázis 3 (Közösség): + +Gamifikáció és Verseny indítása. + +Részletes értékelési rendszer. + +VIP elemzések (Anomália detektálás). + +📘 Service Finder – Rendszer Specifikáció 2.1 +Verzió: 2.1 (Felszereltség, Előfizetések, Verseny és Launch Stratégia) Státusz: MVP + Üzleti Logika Véglegesítése + +I. Jármű Adatmodell & Felszereltség (Deep Dive) +A járművek típusától függően dinamikus felszereltség-listát kezelünk (JSONB formátumban tárolva a rugalmasságért). + +1. Kategória-specifikus Extrák +Személyautó: + +Klíma: Manuális, Automata, 2+ Zónás, Hőszivattyús (EV-nél kritikus). + +Multimédia: CarPlay/Android Auto, Navigáció, Hangrendszer. + +Motorkerékpár: + +Kényelem: Markolatfűtés, Ülésfűtés, Állítható szélvédő. + +Tech: USB töltő, Multimédia kijelző. + +Teherautó (Haszongépjármű): + +Ellenőrzés: Sofőr figyelő rendszer (DMS), Digitális Tachográf. + +Adminisztráció: Útlevél/Okmány író, Beépített útdíj-fizető (OBU). + +2. Adatfeltöltési Stratégia (Launch) +Kezdet: Manuális rögzítés, DE "Okos" segítséggel. + +Törzsadat Script: Python scripttel előtöltjük a leggyakoribb márkákat/típusokat (kb. a piac 75%-át). + +Kivételkezelés: Ha a felhasználó nem találja a típust, felvihet újat ("Egyéb"), de a rendszer fuzzy search (hasonlóság keresés) segítségével figyelmezteti: "Nem erre gondoltál: 'Toyota' a 'Tojota' helyett?" + +II. Előfizetési Modellek (Monetizáció) +A rendszer 3 szinten működik. + +1. Free (Ingyenes) +Limit: Max 3 jármű. + +Reklám: Belépéskor és statisztika letöltéskor. + +Keresés: A "Hirdető" (fizetős) szervizek előre sorolódnak (szponzorált találatok). + +Export: Csak PDF (nem szerkeszthető). + +Szerviz láthatóság: Összesítve látja a költségeket. + +2. Prémium (Haladó) +Limit: Max 5 jármű. + +Reklám: Nincs direkt reklám. + +Keresés: "Tiszta" találati lista (a hirdetők nem tolakodnak előre, valós értékelés dönt). + +Export: Excel (.xlsx) a saját elemzésekhez. + +3. VIP (Flotta / Pro) +Limit: 10 jármű (felette egyedi ajánlat). + +Funkciók: + +Intelligens Riasztások: Egyéni intervallumok (pl. "Szólj 60 nappal műszaki előtt"). + +Anomália Detektálás: Túlhasználat figyelése, átlagtól eltérő fogyasztás vagy gyanúsan magas szervizszámla jelzése a Managernek. + +Vizualizáció: Finomított havi diagramok, trendek. + +III. Közösség és Gamifikáció (A "Motor") +A cél az adatbázis minőségi feltöltése. + +1. Versenyszabályok +Időtartam: 3-6 hónapos "Szezonok". + +Díjazás: + +1-3. hely: Pénzjutalom. + +4-10. hely: VIP előfizetés (1 év). + +11-25. hely: Prémium (1 év). + +26-50. hely: Prémium (6 hónap). + +50-100. hely: Prémium (3 hónap). + +2. Pontrendszer és Büntetés ++5 pont: Új szerviz rögzítése (ha validált adatokkal történik). + ++1 pont: Validálás (az első 5 megerősítőnek). + +0 pont: További validálások (de növeli a szerviz népszerűségét). + +-2 pont: Rossz/Hamis adat megadása. + +KIZÁRÁS (-10 pontnál): A felhasználó "Read-only" módba kerül a közösségi téren. Nem vihet fel új szervizt, csak a saját költségeit rögzítheti meglévő partnerekhez. + +3. Szerviz Értékelés és Státusz +Státuszok: Rögzített -> Ellenőrzött (5 user által) -> Minősített/Hirdető. + +*Értékelés (1-5):** + +Kötelező elem: Munkalap/Számla fotó (vagy annak hiányának jelzése). + +Szabály: Pozitív értékelés minden eseménynél adható. Negatív értékelés szervizenként max 1x (spam védelem). + +4. Jármű Trust Score (%) +Nem bináris (Jó/Rossz), hanem százalékos. + +Egy kihagyott tankolás alig ront rajta. + +Súlyozás: A hivatalos (műszaki vizsga, szerviz) km óra állás fotóval sokkal többet ér, mint egy kézi tankolás bejegyzés. + +IV. Implementáció: Céges Modellek (Python Kód) +Ahhoz, hogy a fenti jogosultsági rendszert (Cégvezető vs. Sofőr) kezelni tudjuk, itt van a szükséges adatbázis modell. + +Ezt a kódot mentsd el a Code-Serverben: app/models/company.py + +📘 Service Finder – Rendszer Specifikáció 2.0 +Verzió: 2.0 (Bővített Üzleti és Gamifikációs Logika) Fókusz: MVP (Stabil alapok) + Jövőbiztos architektúra + +I. Felhasználók és Jogosultsági Rendszer (RBAC) +Itt élesen szétválasztjuk a Rendszerüzemeltetést (IT) és az Üzleti Működést (App). + +1. Rendszer Szint (IT & Support) +Superadmin: Hozzáférés az adatbázishoz, szerverhez (DevOps). + +Moderátor: Adatok validálása, vitás esetek rendezése, szerviz törzsadatok tisztítása. + +User (Technikai): Az alap entitás az adatbázisban. + +2. Alkalmazás Szint (Business Logic) – Dinamikus Jogosultságok +A jogosultságok nem "beégetettek", hanem Cégenként/Flottánként konfigurálhatók. + +Cégtulajdonos: + +Létrehozza a Céget/Flottát. + +Meghívhat Flotta Managert és Sofőrt. + +Joga van bármikor visszavonni a hozzáférést (pl. kilépő dolgozó azonnal elveszti az autók láthatóságát). + +Beállíthatja a szabályokat: "Ebben a cégben a sofőr csak tankolást rögzíthet, szervizt nem." + +Flotta Manager: + +Kezeli az autókat, kiosztja őket sofőröknek. + +Látja a lejáratokat, költségeket, riasztásokat. + +Sofőr: + +Vezethet egy vagy több autót (akár egyszerre több cégtől is). + +Csak a hozzá rendelt időszakban fér hozzá az autó adataihoz. + +Jogosultság: Lehet csak "Read-only" (látja a forgalmit), vagy "Editor" (rögzít tankolást). + +II. Jármű Adatmodell – A "Deep Dive" (Mély Adatbázis) +Az MVP-ben a struktúrát hozzuk létre, az adatokat folyamatosan töltjük. + +1. Hierarchikus Törzsadatok +Nem flat (sima) szövegként tároljuk, hanem relációs adatbázisban a pontos kereshetőségért: + +Kategória: Személyautó, Kisteher, Motor, Teherautó. + +Gyártó (Make): BMW, Honda, Toyota. + +Modell (Model): X5, CR-V, Yaris. + +Generáció/Évjárat: Pl. 2018-2022. + +Motor: Üzemanyag (Benzin/Diesel/Hybrid/EV) + Motorkód + Teljesítmény. + +Felszereltség (Trim): Ez a legnehezebb (Executive, M-Sport). MVP Megoldás: Kezdetben szöveges mező vagy JSON, később strukturált lista. + +2. Gumiabroncs Menedzsment (Tire Module) – Kiemelt Fontosságú +Külön tábla (vehicle_tires), mert kritikus biztonsági elem. + +Adatok: Márka, Típus, Méret (pl. 205/55 R16), Évszak (Nyári/Téli/4évszak). + +DOT Szám (Gyártási idő): Pl. "2223" (2023. 22. hét). + +Figyelmeztetések (Logika): + +Szezonális: "Itt a november, rakd fel a télit!" + +Kor alapú: "A gumi elmúlt 6 éves (DOT alapján), csere javasolt!" + +Futás alapú: "Már 40.000 km-t mentél ezzel a szettel." + +III. Közösség, Gamifikáció és Adatgyűjtés ("Data Race") +Hogyan vegyük rá az embereket, hogy töltsék fel az adatokat? Jutalmazással. + +1. Rögzítési Verseny & Pontrendszer +Adatbeküldés: Ha egy felhasználó beküld egy új szervizt a térképre, vagy feltölti egy ritka autó adatait -> Pontokat kap. + +Validálás: Ha egy másik felhasználó megerősíti ("Igen, ez a szerviz tényleg létezik és jó"), azért is pont jár. + +Ranglista: "A Hónap Flotta Managere", "A Leggondosabb Tulaj". + +2. Jármű "Trust Score" (Bizalmi Index) +Ez az autó értéke eladáskor. A rendszer automatikusan számolja 0-100% között. + +Van feltöltve fotó? (+10 pont) + +A kilométeróra rögzítések konzisztensek? (+30 pont) + +Van OCR-rel igazolt szervizszámla? (+50 pont) + +Cél: Egy 90+ pontos autó többet ér a piacon, mert "Service Finder Igazolt". + +3. Szervizek Értékelése +Nem csak csillagozás (1-5). + +Validált értékelés: Csak akkor értékelhet, ha van ott rögzített, GPS/Időbélyeggel vagy számlával igazolt eseménye. (Így szűrjük a fake értékeléseket). + +IV. Audit és Biztonság +1. Naplózás és Csalásszűrés +Adatforrás jelölése: Minden bejegyzésnél tároljuk: source_type. + +MANUAL: Kézzel írta be (Alacsony bizalom). + +OCR_VALIDATED: Fotóról ismerte fel a rendszer (Magas bizalom). + +VERIFIED_PARTNER: Regisztrált szerviz töltötte fel (Legmagasabb bizalom). + +Csalás detektálás: Ha a source_type hirtelen változik, vagy a km óra csökken, a rendszer "Flag"-eli (megjelöli) az autót. + +V. MVP Stratégia (Hogyan indulunk?) +Hogy ne bonyolítsuk túl az elején, de a kód ne ütközzön később: + +Fázis 1 (Indulás - A "Gerinc"): + +Infrastruktúra (Kész). + +User/Cég/Jogosultság alapok (Create, Invite, Remove). + +Jármű alapadatok + Tulajdonlás (Ownership). + +Szerviz/Tankolás rögzítés (Kézi + MinIO fotó feltöltés). + +Audit Log alapjai. + +Fázis 2 (Adatdúsítás): + +OCR bevezetése (automatikus kitöltés). + +Gumiabroncs modul (DOT szám figyelés). + +Értesítések (Email/Popup). + +Fázis 3 (Közösség): + +Gamifikáció (Pontgyűjtés). + +Trust Score számítás. + +Szerviz kereső és értékelő modul. + +📘 Service Finder – Rendszer Specifikáció és Fejlesztési Terv +Verzió: 1.0 (Tervezési fázis) Státusz: Infrastruktúra kész, Üzleti logika implementálás alatt. + +I. Infrastruktúra és Technológia (Már kész/beállítva) +Ez a réteg biztosítja a rendszer futását a szervereden (192.168.100.43). + +Konténerizáció: Docker alapú környezet, szeparált szolgáltatásokkal. + +Backend: Python FastAPI (Aszinkron, gyors, modern). + +Adatbázis: PostgreSQL 15 (Külön data sémába szervezve a biztonságért). + +Fájltárolás: MinIO (S3 kompatibilis objektumtároló képeknek, doksiknak). + +Elérés & Proxy: Nginx Proxy Manager kezeli a domaineket és SSL-t: + +dev.profibot.hu -> Backend API + +db.profibot.hu -> pgAdmin (Adatbázis menedzsment) + +code.profibot.hu -> Code-Server (Fejlesztői környezet) + +(Tervben): files.profibot.hu -> MinIO + +Frontend Technológia (Döntöttünk): React (vagy Vue.js) SPA (Single Page Application). + +Cél: Mobilapp-szerű élmény, nincs oldal újratöltés, kódvédelem (buildelt kód). + +II. Adatbázis Modell (A Rendszer Gerince) +A táblák a data sémában helyezkednek el, szigorú relációkkal. + +Users (Felhasználók): + +Alapadatok (Email, Jelszó Hash, Név). + +Jogosultságok: is_superuser (Rendszergazda), is_active. + +Okmányok: Jogosítvány, Személyi lejárati dátumok. + +Reputation Score: Pontrendszer a megbízhatósághoz. + +Vehicles (Járművek): + +Törzsadatok: Rendszám, Alvázszám (VIN), Márka, Típus, Évjárat. + +Szerviz adatok: initial_odometer (rögzítéskori km), current_odometer (aktuális). + +Lejáratok: Műszaki vizsga (mot_expiry), Biztosítás. + +VehicleOwnerships (Birtoklási Történet) – ÚJ! + +Kapcsolótábla a User és Vehicle között. + +Mezők: start_date (vétel/rendszerbe kerülés), end_date (eladás). + +Funkció: Ez alapján döntjük el, ki láthatja a költségeket. + +AuditLogs (A "Fekete Doboz") – ÚJ! + +Minden módosítás naplózása. + +Rögzíti: KI (User), MIT (Target ID), MIKOR, HONNAN (IP). + +Változás részletei (JSON): { "old_value": 150000, "new_value": 145000 } -> Csalás detektálása. + +III. Üzleti Logika és Működés (A "Szabálykönyv") +1. Jogosultsági Szintek +Admin / Superuser: Teljes hozzáférés, rendszerbeállítások. + +Moderátor: Adatok ellenőrzése, javítása. + +Szerelő: Nincs dedikált szerepkör (vagy csak korlátozott), a rendszerben adminisztratív funkciója nincs. + +Felhasználó (User): Kizárólag az Appon keresztül léphet be. Nem látja az adatbázis struktúrát. + +2. Jármű Életút & Adatbevitel ("Modern Megoldás") +Rögzítés: Nem feltétlenül a vétel pillanatában történik. + +Kezdő dátum: A rendszerbe kerülés napja rögzítve lesz (start_date), innentől "minősített" a jármű. + +OCR (Automatikus Kitöltés): + +Felhasználó fotózza a forgalmit/számlát. + +Kép feltöltése MinIO-ba. + +Backend (Tesseract/Vision) elemzi. + +Jóváhagyás: A User látja a felismert adatot, és csak az "OK" gomb után kerül az adatbázisba. + +3. Költségek és Láthatóság (Privacy) +Szerviz/Tankolás bejegyzés: Örökre a járműhöz kapcsolódik. + +Láthatóság szabály: + +Aktuális tulajdonos: Látja a saját költségeit és a jármű technikai előéletét (de az előző tulajdonos költségeinek összegét csak összesítve/anonimizálva láthatja, vagy egyáltalán nem, beállítástól függően). + +Előző tulajdonos: Eladás után már csak egy statisztikai összesítőt lát (Mennyit költöttem rá?), nem látja az új tulajdonos tankolásait. + +4. Értesítési Rendszer (A "Figyelő") +Automatikus háttérfolyamat (Scheduler) figyeli a dátumokat. + +Kinek? + +Tulajdonos/Sofőr: Figyelmeztetés lejárat előtt. + +Flotta Menedzser: Riasztás, ha jogosulatlan sofőr vezet (lejárt jogsi). + +Hogyan? + +Popup: Belépéskor a felületen. + +Jelzés: Piros (lejárt/kritikus) vagy Sárga (hamarosan lejár) ikon a lista nézetben. + +Email: 30 nappal a lejárat (Műszaki, Okmány, Gumicsere szezon) előtt. + +5. Naplózás (Logging) +Minden esemény visszakereshető az AuditLogs táblából. + +Események: Tankolás, Km óra rögzítés, Adatmodosítás. + +Tartalom: Időpont, User ID, Rendszám, Művelet (Create/Update), Régi érték vs Új érték. + +Cél: Vitás esetek rendezése és a kilométeróra-manipuláció kiszűrése. + +IV. Biztonság és Kódvédelem +Frontend: React alapú "buildelt" kód. A forráskód nem olvasható a böngészőben (minifikálás). Az üzleti logika a szerveren marad. + +Backend: Docker konténerbe zárva, környezeti változók (.env) használata jelszavakhoz. + +Adatvédelem: Az API csak hitelesített (Token alapú) kéréseket szolgál ki. \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/Old_versions/_Adatbázis_állalot_napló.txt b/archive/2026.02.18 Archive_old_mapps/Old_versions/_Adatbázis_állalot_napló.txt new file mode 100755 index 0000000..dd6833f --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/Old_versions/_Adatbázis_állalot_napló.txt @@ -0,0 +1,595 @@ +🗄️ Adatbázis állapot napló + + Struktúra: system_settings és email_templates sémája most már tartalmazza a key oszlopot (sikeres ALTER TABLE). + + Integritás: verification_tokens lejárati idő ellenőrzése (now() alapú) beépítve. + +📝 Projekt Jelentések (2026-01-28 22:19) +🗄️ Adatbázis állapot napló (20260128_2219) + + Tiers & Translations: Oszlopok és alapértékek betöltve. + + Bot Logs: bot_discovery_logs tábla aktív, készen áll a jelentésekre. + + Integritás: SQL kényszerek (Foreign Keys) és típusok (Enums) élesek. + +📝 Jelentések (2026-01-28 22:45) +🗄️ Adatbázis állapot napló + + Értesítési modul: subscription_notification_rules tábla létrehozva. + + Bot modul: bot_discovery_logs tábla létrehozva. + + Jármű adatok: vehicle_variants kibővítve (power, fuel, cylinder). + +📝 Jelentések (2026-01-28 22:15) +🗄️ Adatbázis állapot napló (20260128_2215) + + Fix: email_templates tábla szerkezete javítva (Key/Lang oszlopok). + + Admin: org_subscriptions felkészítve a manuális és automata hosszabbításra. + + Integritás: A vin_deadline (14 nap) figyeli az ideiglenes járműveket. + +🗄️ Adatbázis állapot napló (20260128_2230) + + Tiers & Translations: Oszlopok pótolva (description, lang). + + User Vehicles: Kibővítve VIN-ellenőrzési mezőkkel (vin_verified, vin_deadline). + + Séma: Stabil, 40 tábla + új mezők. + +📈 Jelentések (2026-01-28 21:50) + + Adatbázis állapot: A companies, equipment és subscription táblák élesek. A specifikációk (gumi, szervizintervallum) hozzáadva. + + Horgony: Az Auth V2 sikeres tesztje után áttérés az adatfeltöltési és automatizálási fázisba. + + Változók: custom_service_interval_km bevezetve a rugalmas karbantartáshoz. + +🗄️ Adatbázis állapot napló (20260128_2200) + + Nyelvi modul: data.translations aktív, feltöltésre vár. + + Pénzügyi modul: data.subscription_tiers struktúra kész, de üres. + + Jármű hierarchia: Kategóriák betöltve (CAR, MOTORCYCLE, TRUCK). + +🗄️ Adatbázis állapot napló (20260128_2145) + + Státusz: Struktúra kibővítve a Felszereltség (Equipment) modullal. + + Típusok: data.equipment_source hozzáadva. + + Integritás: A fa struktúra (Category -> Brand -> Model -> Variant) biztosított. + +🗄️ Adatbázis állapot napló (20260128_2130) + + Státusz: Alapstruktúra kész (40 tábla). + + Adatmennyiség: Minimális (Seed adatok). + + Mentés: /mnt/nas/git_vault/backup_20260128_alap_kesz.sql (Létrehozva). + + Hiba: Nincs, az integritás 100%-os. + +🗄️ Adatbázis állapot napló (20260128_2105) +Paraméter Állapot Megjegyzés +Összes tábla 40 db Minden kért entitás (Companies, Members, Audit, etc.) létrejött. +Custom Types 4 db companyrole, expense_category, moderation_status, source_type rendben. +Sémák data A logikai elválasztás (schema) sikeres. + +📝 Jelentések frissítése (2026-01-28 20:45) + + Adatbázis állapot napló: Manuális típus- és tábladefiniálás folyamatban az integritás érdekében. + + Horgony megjegyzések: A companyrole ENUM és a függő táblák szinkronizálása a modellekkel. + + Változók könyve: Új típus: data.companyrole. + +🗄️ Adatbázis állapot napló (20260128_2030) + + Email_logs tábla: Frissítve. Oszlopok hozzáadva: recipient, user_id, provider_id, status, email_type. + + Szekvenciák: users_id_seq és vehicle_brands_id_seq szinkronizálva. + + Integritás: Ellenőrizve. A kényszerített ALTER TABLE parancsok lefutottak. + +📘 ADATBÁZIS ÁLLAPOT KÖNYV (v2.42 | 2026.01.27 - 23:55) +Modul Hiba Megoldás +Auth V2 Enum (email_verify) hiba ::tokentype cast hozzáadva a kódhoz. +Bot Unique Constraint hiány ALTER TABLE ... ADD CONSTRAINT (pgAdmin). +Database ID Ütközés SELECT setval(...) (pgAdmin). + +📘 ADATBÁZIS ÁLLAPOT KÖNYV (v2.40 | 2026.01.27 - 23:50) +Hiba jellege Oka Megoldás +IntegrityError ID ütközés (Key id=1 already exists) SELECT setval(...) lefuttatva (pgAdmin). +InvalidTextRepresentation Hiányzó Enum érték (email_verify) ALTER TYPE tokentype ADD VALUE... (pgAdmin). +Regisztráció 500-as hiba Az Enum fixálása után 201 Created várható. + +📘 ADATBÁZIS ÁLLAPOT KÖNYV (v2.39 | 2026.01.27 - 23:58) +Feladat Státusz Megjegyzés +Auth Fix 🛠️ SQL SZINKRON A setval parancs után a 500-as hiba megszűnik. +Brands ✅ 114 MÁRKA Az alaplista sikeresen betöltve. +Models 🏗️ DISCOVERY A bot elkezdi a típusok (Corolla, Golf, stb.) társítását. + +📘 ADATBÁZIS ÁLLAPOT KÖNYV (v2.38 | 2026.01.27 - 23:45) +Feladat Státusz Módszer +Mapper Fix ✅ KÉSZ sed parancsok lefutottak. +500 Error 🟢 MEGOLDVA A visszamutató kapcsolatok törölve. +Jármű Feltöltés 🏗️ FOLYAMATBAN 200+ márka szinkronizálása a konténerben. + +📘 ADATBÁZIS ÁLLAPOT KÖNYV (v2.37 | 2026.01.27 - 23:55) +Feladat Státusz Megjegyzés +Auth (Regisztráció) 🛠️ JAVÍTÁS ALATT A sed parancs után az 500-as hiba meg fog szűnni. +Vehicle Brands 🏗️ BETÖLTÉS A Python scripttel biztonságosan betölthető. +Séma ⚠️ ELLENŐRZÉS A category_id hiánya miatt a script hibát jelezhet, ha más az oszlopnév. + +📘 ADATBÁZIS ÁLLAPOT KÖNYV (v2.36 | 2026.01.27 - 23:35) +Modul Státusz Hiba oka +User Mapper ❌ HIBÁS Hiányzó vehicles property (visszamutató link). +Auth API 🟢 FUT De a 500-as hiba megállítja az írást. +Vehicle DB ✅ KÉSZ Táblák és kategóriák az SQL-lel feltöltve. + +📘 ADATBÁZIS ÁLLAPOT KÖNYV (v2.34 | 2026.01.27 - 23:25) +Tábla Ellenőrizendő mezők Cél +users first_name, last_name Regisztráció alapfeltétele. +audit_logs ip_address, endpoint Naplózás hiba elkerülése. +verification_tokens token_hash Aktiváló email hiba elkerülése. + +📘 ADATBÁZIS ÁLLAPOT KÖNYV (v2.33 | 2026.01.27 - 23:15) +Állomány Státusz Megjegyzés +user.py ✅ FIXÁLVA Kapcsolatok kikommentelve, SQLAlchemy hiba megszűnt. +main.py ✅ KÉSZ V1 és V2 útvonalak a helyükön. +docker 🟢 FUT A konténer elindult. + +📘 ADATBÁZIS ÁLLAPOT KÖNYV (v2.32 | 2026.01.27 - 23:05) +Hiba Állapot Megoldás +500 Internal Error 🔍 DIAGNÓZIS ALATT Logok ellenőrzése szükséges. +Audit Logs 🏗️ BŐVÍTÉS ip_address oszlop ellenőrzése. +Vehicle Seeding ⏳ VÁRAKOZIK Az alapvető regisztráció után indul. + +📘 ADATBÁZIS ÁLLAPOT KÖNYV (v2.27 | 2026.01.27 - 22:15) +Hiba Megoldás Státusz +Missing Module (requests) Lecserélve urllib-re (standard lib). ✅ MEGOLDVA +Syntax Error (törmelék kód) tee parancsal felülírva a teljes fájl. ✅ MEGOLDVA +API Egységesség V1 eltávolítva, minden a V2 alatt fut. ✅ MEGOLDVA + +📘 ADATBÁZIS ÁLLAPOT KÖNYV (v2.27 | 2026.01.27 - 22:15) +Hiba Megoldás Státusz +Missing Module (requests) Lecserélve urllib-re (standard lib). ✅ MEGOLDVA +Syntax Error (törmelék kód) tee parancsal felülírva a teljes fájl. ✅ MEGOLDVA +API Egységesség V1 eltávolítva, minden a V2 alatt fut. ✅ MEGOLDVA + + + +📘 ADATBÁZIS ÁLLAPOT KÖNYV (v2.27 | 2026.01.27 - 22:15) +Hiba Megoldás Státusz +Missing Module (requests) Lecserélve urllib-re (standard lib). ✅ MEGOLDVA +Syntax Error (törmelék kód) tee parancsal felülírva a teljes fájl. ✅ MEGOLDVA +API Egységesség V1 eltávolítva, minden a V2 alatt fut. ✅ MEGOLDVA + +📘 ADATBÁZIS ÁLLAPOT KÖNYV (v2.26 | 2026.01.27 - 22:12) +Modul Státusz Javítás +main.py 🟢 AKTÍV Szintaktikai hiba eltávolítva. +v2/auth.py 🟢 AKTÍV Tartalom frissítve, V1 függőség levágva. +Container 🟢 FUT Újraindítás után online. + +📘 ADATBÁZIS ÁLLAPOT KÖNYV (v2.25 | 2026.01.27 - 22:01) +Tábla Verzió Státusz Megjegyzés +users DB ✅ KÉSZ first_name, last_name oszlopok a helyükön. +email_providers DB ✅ KÉSZ SendGrid (id: 5) aktív a CSV alapján. +API Routes Kód ⚠️ ZAVAROS V1 és V2 keveredés. + +📘 ADATBÁZIS ÁLLAPOT KÖNYV (v2.23 | 2026.01.27 - 22:30) +Feladat Státusz Megoldás +Email duplikáció 🛠️ JAVÍTÁS ALATT DELETE + UNIQUE CONSTRAINT SQL. +Auth.py telepítés ✅ KÉSZ Heredoc (cat) módszerrel frissítve. +500-as hiba 🔍 TESZTELÉSRE VÁR Az SQL lefutása után elvileg megszűnik. + +📘 ADATBÁZIS ÁLLAPOT KÖNYV (v2.22 | 2026.01.27 - 22:15) +Modul Állapot Megjegyzés +Auth API ✅ KÉSZ auth.py frissítve, mezők szinkronban. +Email Providers ✅ KÉSZ Duplikációk törölve, SendGrid aktív. +Audit Log ✅ KÉSZ Minden regisztrációt naplóz (IP-vel). + +📘 ADATBÁZIS ÁLLAPOT KÖNYV (v2.21 | 2026.01.27 - 22:05) +Tábla Séma Változás Státusz +users data first_name, last_name mezők aktívak ✅ KÉSZ +email_providers data unique_provider_name kényszer hozzáadva ✅ KÉSZ +auth.py Fájl Kereszt/Vezetéknév szétválasztva ✅ KÉSZ + +📘 ADATBÁZIS ÁLLAPOT KÖNYV (v2.20 | 2026.01.27 - 21:55) +Funkció Admin-beállítás (Key) Érték +Bot-védelem registration_throttle_minutes 10 +Helyszín-szűrő allowed_countries_list [EU Országok] +E-mail Motor email_providers SendGrid (Aktív) + +📘 ADATBÁZIS ÁLLAPOT KÖNYV (v2.19 | 2026.01.27 - 21:45) +Funkció Módszer Beállítás helye +Bot-védelem IP Throttling (10 perc) audit_logs alapján a kódban +EU-szűrés Geo-IP lookup EU_COUNTRIES halmaz a kódban +Naplózás Automatikus audit_logs tábla + +📘 ADATBÁZIS SÉMA KÖNYV (v2.18 | 2026.01.27 - 21:40) +Tábla Séma Cél Státusz +users data Felhasználók törzsadatai 🔍 Audit folyamatban +email_providers data SMTP/API elérések 🔍 Audit folyamatban +audit_logs data Műveleti napló ✅ Ellenőrzésre vár + +📘 ADATBÁZIS SÉMA KÖNYV (v2.18 | 2026.01.27 - 21:40) +Tábla Séma Aktuális mezők (Modell szerint) Státusz +users data + +id, email, hashed_password, first_name, last_name, role, is_active... + ⚠️ Ellenőrzés alatt +audit_logs data + +table_name megerősítve + ✅ Létezik +verification_tokens data + +table_name megerősítve + ✅ Létezik + +📘 ADATBÁZIS ÁLLAPOT KÖNYV (v2.17 | 2026.01.27 - 22:30) +Modul Állapot Következő akció +Auth v1 ✅ KÉSZ Swagger tesztelés a felhasználó által. +Audit/Email Log ✅ KÉSZ Validálás a pgAdminban. +Vehicle Catalog 🏗️ TERVEZÉS Tábla létrehozás a teszt után. + +📘 ADATBÁZIS ÁLLAPOT KÖNYV (v2.16 | 2026.01.27 - 22:10) +Modul Állapot Funkció +Auth System ✅ KÉSZ Regisztráció + Aktiválás + Jelszó reset (Audit loggal). +Email Manager ✅ KÉSZ Többcsatornás, Throttling védett küldés. +Locations ✅ KÉSZ Koordináta alapú keresés alapjai. + +📘 ADATBÁZIS ÁLLAPOT KÖNYV (v2.15 | 2026.01.27 - 21:55) +Tábla Státusz Szerep +data.verification_tokens ✅ AKTÍV Jelszó-visszaállító és regisztrációs kulcsok. +data.audit_logs ✅ AKTÍV Felhasználói mozdulatok naplózása. +data.email_logs ✅ AKTÍV Kiküldött emailek követése és Throttling. + +📘 ADATBÁZIS ÁLLAPOT KÖNYV (v2.14 | 2026.01.27 - 21:40) +Tábla Séma Feladat Státusz +audit_logs data Felhasználói aktivitás követése ✨ ÚJ +system_settings data Minden paraméter vezérlése ✅ Bővítve +email_providers data Multi-channel e-mail ✅ SendGrid kész, Brevo várható + +📘 ADATBÁZIS ÁLLAPOT KÖNYV (v2.13 | 2026.01.27 - 20:30) +Tábla Séma Cél Státusz +email_providers data SMTP/API adatok & Prioritás ✅ Adattal feltöltve (SendGrid) +email_logs data Audit log & Throttling ✅ Aktív +verification_tokens data Biztonsági kódok (Reg/Reset) ✅ Szerkezet kész + +📘 ADATBÁZIS ÁLLAPOT KÖNYV (v2.12 | 2026.01.27 - 21:35) +Tábla Séma Státusz Megjegyzés +email_providers data ✅ KÉSZ Tárolja az SMTP/API eléréseket és prioritásokat. +email_logs data ✅ KÉSZ Biztosítja a 3 perces várakozást (Throttling). +verification_tokens data ✅ KÉSZ Biztonságos token-alapú regisztrációhoz. + +📘 ADATBÁZIS SÉMA KÖNYV (v2.7 | 2026.01.27 - 22:15) +Objektum Típus Állapot Szerep +data.system_settings Tábla ✅ Minden üzleti paraméter forrása. +data.organization_locations Tábla ✅ Pontos GPS koordináták és címek. +orgtype.SERVICE Enum ✅ Szerviz partnerek megkülönböztetése. + +🗄️ ADATBÁZIS ÁLLAPOT NAPLÓ (v2.7 | 2026.01.27 - 21:25) + + Audit: A beküldött CSV fájlok (tablak_2026.01.27_2.csv) igazolták, hogy a változók nevei és értékei megfelelnek a Python kód igényeinek. + + Javítás: Az Enum SERVICE értékét leválasztottuk az insert-ről, így az integritás helyreállt. + + Adat: A Gumi Mester Kft. adatai a "Pesti Gyorsszerviz" és "Budaörsi Telep" helyszínekkel mostantól alkalmasak a térbeli keresési tesztre. + +📘 ADATBÁZIS SÉMA KÖNYV (v2.6 | 2026.01.27 - 21:25) +Tábla Séma Oszlopok Állapot +organizations data id, name, org_type (enum), slug ✅ SZINKRONIZÁLVA (SERVICE enum kész) +organization_locations data id, org_id, lat, lng, address ✅ AKTÍV (Térbeli alapok kész) +system_settings data key_name, value_json, org_id... ✅ VALIDÁLVA (A CSV alapján minden kulcs él) + +🗄️ ADATBÁZIS ÁLLAPOT NAPLÓ (v2.6 | 2026.01.27 - 21:10) + + Integritás: A data séma és a public enumok közötti ellentmondás feloldva. + + Változók állapota: A beküldött CSV igazolta, hogy a MatchingService és a ConfigService számára minden paraméter rendelkezésre áll. + + Helyszín adatok: Budapesti teszt koordináták (Budaörs és Váci út) előkészítve a keresési teszthez. + +📘 ADATBÁZIS SÉMA KÖNYV (v2.5 | 2026.01.27 - 21:10) +Tábla Séma Mezők Státusz +organizations data id, name, org_type, slug ✅ Enum javítva (SERVICE hozzáadva) +organization_locations data id, org_id, lat, lng, label ✨ Létrehozva a geolokációhoz +system_settings data key_name, value_json ✅ Validálva a beküldött CSV alapján + +🗄️ ADATBÁZIS ÁLLAPOT NAPLÓ (v2.5 | 2026.01.27 - 20:50) + + Kritikus hiba: Az orgtype enum nem ismeri a "SERVICE" értéket. Ez blokkolja a tesztadatok (Gumi Mester Kft.) beszúrását. + + Séma helyzet: A public -> data költöztetés elvileg megtörtént, de az audit SQL-lel validáljuk. + + Változók: A nevek (key_name, value_json) megfelelnek a Python ConfigService elvárásainak. + +📘 ADATBÁZIS SÉMA KÖNYV (v2.4 | 2026.01.27 - 20:50) +Tábla Séma Státusz Megjegyzés +users data ✅ Stabil Tartalmazza az is_staff mezőt. +organizations data ⚠️ Ellenőrzés alatt Az org_type enum értékeit tisztázni kell. +organization_members data ✅ Stabil unique_user_org kényszer aktív. +system_settings data ✅ Stabil Hierarchikus index és kulcsok rendben. +organization_locations data ✨ Létrehozva Készen áll a koordináták fogadására. + +🗄️ ADATBÁZIS ÁLLAPOT NAPLÓ (v2.4 | 2026.01.27 - 20:30) + + Séma Tisztaság: Megkezdődött a public séma kiürítése, az üzleti logika izolált. + + Helyszín Kezelés: Mostantól támogatjuk, hogy egy szerviznek több pontja legyen a térképen. + + Keresési Logika: A következő lépésben a MatchingService már nem fix listából, hanem ebből az organization_locations táblából fog válogatni. + +📘 ADATBÁZIS SÉMA KÖNYV (v2.3 | 2026.01.27 - 20:30) +Tábla Séma Változás Megjegyzés +organizations data ✅ Stabil Fő szervezeti adatok. +service_providers data 🚚 Áthelyezve Migrálva a public sémából. +organization_locations data ✨ ÚJ Koordináták (lat, lng) tárolása + +🗄️ ADATBÁZIS ÁLLAPOT NAPLÓ (v2.3 | 2026.01.27 - 20:45) + + Migráció: Előkészítve a public -> data áthelyezés. + + Geolokáció: A koordináták tárolása külön organization_locations táblába kerül a multi-site támogatás érdekében. + + Matematika: A távolság számításához a Haversine-formulát fogjuk használni: + d=2rarcsin(sin2(2ϕ2​−ϕ1​​)+cos(ϕ1​)cos(ϕ2​)sin2(2λ2​−λ1​​)​) + +📘 ADATBÁZIS SÉMA KÖNYV (v2.2 | 2026.01.27 - 20:45) +Tábla Séma Változás Cél +organizations data Move from public Üzleti adatok izolálása. +service_providers data Move from public Üzleti adatok izolálása. +organization_locations data ÚJ TÁBLA Geofencing és Smart Match alapja. + +🗄️ ADATBÁZIS ÁLLAPOT NAPLÓ (v2.2 | 2026.01.27 - 19:50) + + Audit: Az organizations tábla szerkezete beazonosítva. Hiányoznak a közvetlen helyadatok (geolokáció). + + Folytonosság: A ConfigService és a MatchingService felkészült, már csak a "bemeneti forrást" (a valódi koordinátákat) kell becsatornáznunk. + + Kockázat: Alacsony. Ha megvan a helyszín tábla, egy egyszerű JOIN-nal összekötjük a szervizeket a helyükkel. + +📘 ADATBÁZIS SÉMA KÖNYV (v2.1 | 2026.01.27 - 19:50) +Tábla Oszlopok Típus Leírás +organizations + +id, name, org_type, slug, is_active + + +int, varchar, Enum, boolean + + +Szervezetek törzsadatai. +system_settings key_name, value_json, org_id varchar, jsonb, int Dinamikus szabályok és súlyok. + +🗄️ ADATBÁZIS ÁLLAPOT NAPLÓ (v2.1 | 2026.01.27 - 20:20) + + API: /api/v1/search/match végpont ✅ LÉTREHOZVA. + + Logika: MatchingService ✅ LÉTREHOZVA. + + Adat: SQL paraméterek ✅ BETÖLTVE. + + Hiány: A szervizek földrajzi helyzetének (lat/lng) pontos táblája és oszlopneve. +📘 ADATBÁZIS SÉMA KÖNYV (v2.0 | 2026.01.27 - 20:20) +Tábla Séma Funkció Megjegyzés +system_settings data Konfigurációk Súlyozási paraméterek rögzítve. +organizations data Entitások Itt keressük majd a szervizeket (role='service'). +service_specialties data Képességek Ez alapján szűrünk a konkrét hibára. + +🗄️ ADATBÁZIS ÁLLAPOT NAPLÓ (v2.0 | 2026.01.27 - 19:40) + + SQL Audit: A 4 alapvető rangsorolási paraméter immár az adatbázisban él (INSERT 0 4). + + Szerviz Réteg: A MatchingService sikeresen létrejött, a kód képes elvégezni a súlyozott számítást. + + Hiba elhárítva: A PermissionError a sudo használatával áthidalva. + +📘 ADATBÁZIS SÉMA KÖNYV (v1.9 | 2026.01.27 - 19:40) +Tábla Séma Kulcsfontosságú változás +system_settings data Beépítve a súlyozási konstansok (distance, rating, bonus). +ranking_policies data Üres, de a struktúra készen áll a komplexebb szabályokhoz. + +🗄️ ADATBÁZIS ÁLLAPOT NAPLÓ (v1.9 | 2026.01.27 - 19:30) + + Algoritmus: Kész. A pontszámítás képlete: + S=(Pdist​⋅Wdist​)+(Prate​⋅Wrate​)+Btier​ + + Rugalmasság: ✅ Teljes. A MatchingService minden kérésnél frissen kéri le a súlyokat a ConfigService-től. + +📘 ADATBÁZIS SÉMA KÖNYV (v1.8 | 2026.01.27 - 19:30) +Tábla Oszlop Típus Leírás +system_settings value_json jsonb Itt tároljuk a weight_distance és weight_rating értékeket. + +🗄️ ADATBÁZIS ÁLLAPOT NAPLÓ (v1.8 | 2026.01.27 - 19:15) + + Esemény: A korábbi kód-korrupció észlelése és javítása. + + Integritás: A Python config hívás most már tiszta szintaxissal fut a fleet.py-ban. + + Adat: Az Admin Flotta (ID: 1) készen áll a dinamikus limitek tesztelésére. +📘 ADATBÁZIS SÉMA KÖNYV (v1.7 | 2026.01.27 - 19:15) +Tábla Séma Főbb indexek Státusz +system_settings data idx_settings_lookup ✅ AKTÍV +organizations data slug_unique ✅ AKTÍV +vehicles data vin_unique ✅ AKTÍV + +ADATBÁZIS ÁLLAPOT NAPLÓ (v1.7 | 2026.01.27 - 19:10) + + Szinkron: A ConfigService kódja és a system_settings tábla oszlopai (key_name, value_json) megegyeznek. + + Tesztre kész: Az adatbázisban a max_vehicles értéke 3, az Admin pedig az 1-es szervezetben van. +📘 ADATBÁZIS SÉMA KÖNYV (v1.6 | 2026.01.27 - 19:10) +Tábla Séma Állapot Funkció +system_settings data ✅ Aktív Hierarchikus konfiguráció (key_name, value_json). +vehicles data ✅ Stabil Járművek törzsadatai. +vehicle_ownership data ✅ Stabil User-Vehicle összerendelés. + +🗄️ ADATBÁZIS ÁLLAPOT NAPLÓ (v1.6 | 2026.01.27 - 11:15) +Audit: A max_vehicles = 3 rekord sikeresen létrejött a data.system_settings táblában. + +Hierarchia: A idx_settings_lookup index biztosítja, hogy az egyedi (Org/Tier/Region) felülbírálások ne ütközzenek. + +Előkészítve: A fleet.py és a ConfigService kódja megvan, csak a fájlrendszerbe kell írni őket. +📘 ADATBÁZIS SÉMA KÖNYV (v1.5 | 2026.01.27 - 11:15)TáblaSémaFőbb mezőkCélsystem_settingsdatakey_name, value_json, org_idA hierarchikus szabálymotor tárolója.organizationsdataid, name, slugSzervezeti egységek (pl. Admin Flotta).organization_membersdatauser_id, organization_id, roleJogosultsági és tagsági háló. + +🗄️ ADATBÁZIS ÁLLAPOT NAPLÓ (v1.4 | 2026.01.27 - 10:45) +Status: max_vehicles = 3 rögzítve a data.system_settings táblában. + +Fájlrendszer: Az app/services/ mappa létezik, de a config_service.py még hiányzik. + +Elmaradás: Szükségem van a korábban kért SQL lekérdezés eredményére (Admin org_id és role), hogy a tesztelésnél tudjuk, melyik szervezetet nézzük. +📘 ADATBÁZIS SÉMA KÖNYV (v1.3 | 2026.01.27 - 10:45)TáblaSémaMezőkMegjegyzéssystem_settingsdatakey_name, value_json, region_code, tier_id, org_idHierarchikus motor.vehiclesdataid, vin, plate_number, model_idDigitális iker alapadatai.vehicle_ownershipdatauser_id, vehicle_id, is_activeKapcsolati tábla (Kié az autó?). +🗄️ ADATBÁZIS ÁLLAPOT NAPLÓ (v1.3 | 2026.01.27 - 10:15) +Állapot: ✅ Stabil és szinkronban a kóddal. + +Változás: A Python ConfigService immár az app/services/ alá került, követve a tiszta architektúrát. + +Audit: Az SQL-ben korábban rögzített max_vehicles (3) rekord elérhető a service számára. +📘 ADATBÁZIS SÉMA KÖNYV (v1.2 | 2026.01.27 - 10:15)TáblaSémaMezőkMegjegyzéssystem_settingsdatakey_name, value_json, region_code, tier_id, org_idA hierarchikus beállítások tárolója.ranking_policiesdatapolicy_name, distance_weight, rating_weightA szerviz-kereső súlyozási szabályai. + +🗄️ ADATBÁZIS ÁLLAPOT NAPLÓ (v1.2 | 2026.01.27 - 10:10) +Állapot: ✅ Stabil. + +Utolsó SQL: INSERT INTO data.system_settings (max_vehicles) sikeresen lefutott. + +Változás: A key_name és value_json elnevezések rögzítve. + +Következő cél: A fleet.py-ban a fix 3-as korlát kiváltása config.get_setting('max_vehicles') hívással. +ADATBÁZIS SÉMA KÖNYV (v1.1 | 2026.01.27 - 10:10)TáblaOszlopok (Lényegesek)Kényszerek / Indexekdata.system_settingskey_name, value_json, region_code, tier_id, org_ididx_settings_lookup (Unique)data.ranking_policiespolicy_name, distance_weight, rating_weightid (PK)data.organization_membersorganization_id, user_id, roleunique_user_org + +🗄️ ADATBÁZIS ÁLLAPOT NAPLÓ (DB State Book) +Integritás: ✅ Kiváló. Az oszlopnevek szinkronizálva (key_name, value_json). + +Utolsó művelet: idx_settings_lookup index létrehozva, max_vehicles alapérték beszúrva. + +Kockázat: Nincs. A séma stabil az API fejlesztéséhez. + +🗄️ 3. Adatbázis Állapot Napló (DB State Book) +Tábla neve Séma Állapot Megjegyzés +system_settings data ✅ Stabil Tartalmazza a key_name, value_json és a 3 szintű override oszlopot. +ranking_policies data ✅ Kész A szerviz-rangsorolás súlyait tárolja. +idx_settings_lookup data ✅ Aktív Biztosítja a hierarchikus egyediséget. + +PM senior +Egyéni gem +Úgy tűnik, a system_settings táblád még egy korábbi (talán tegnapi) néven tárolja az oszlopokat, ahol valószínűleg csak simán key és value volt a nevük. A PostgreSQL-ben a key és value foglalt szavak (reserved words), ezért javasoltam a key_name és value_json formátumot – de a tábla most épp "félúton" van a két állapot között. + +Tegyünk rendet egy olyan SQL-lel, ami felismeri a régi neveket és átnevezi őket az újra, így nem kell törölni semmit! + +🛠️ 1. Adatbázis „Helyrerakó” Script (psql / pgAdmin) +Futtasd le ezt. Ez a script intelligensen átnevezi az oszlopokat, ha a régi néven találja meg őket: + +SQL +DO $$ +BEGIN + -- 1. Oszlopnevek egységesítése + IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='system_settings' AND column_name='key') THEN + ALTER TABLE data.system_settings RENAME COLUMN "key" TO key_name; + END IF; + + IF EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='system_settings' AND column_name='value') THEN + ALTER TABLE data.system_settings RENAME COLUMN "value" TO value_json; + END IF; + + -- 2. Hiányzó hierarchia oszlopok pótlása + IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='system_settings' AND column_name='region_code') THEN + ALTER TABLE data.system_settings ADD COLUMN region_code VARCHAR(5); + END IF; + + IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='system_settings' AND column_name='tier_id') THEN + ALTER TABLE data.system_settings ADD COLUMN tier_id INTEGER; + END IF; + + IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='system_settings' AND column_name='org_id') THEN + ALTER TABLE data.system_settings ADD COLUMN org_id INTEGER; + END IF; +END $$; + +-- 3. Index frissítése (most már biztosan léteznek az oszlopok) +DROP INDEX IF EXISTS data.idx_settings_lookup; +CREATE UNIQUE INDEX idx_settings_lookup ON data.system_settings +(key_name, COALESCE(region_code, ''), COALESCE(tier_id, 0), COALESCE(org_id, 0)); + +-- 4. Alapértelmezett érték beszúrása tesztnek +INSERT INTO data.system_settings (key_name, value_json, description) +VALUES ('max_vehicles', '3'::jsonb, 'Globális alapértelmezett járműlimit a Free csomagban') +ON CONFLICT (key_name, COALESCE(region_code, ''), COALESCE(tier_id, 0), COALESCE(org_id, 0)) DO NOTHING; +📚 2. Változó Könyv (Variable Map) v1.1 +A rendszer paramétereinek aktuális állapota és hivatkozási pontjai. + +Kulcs (Key) Adattípus Alapértelmezés Szerep Hivatkozás (Fájl/Modul) +max_vehicles int 3 Free flotta méret korlát fleet.py -> ConfigService +search_radius int 20 Alap keresési távolság search.py -> ConfigService +ranking_policy json {...} Súlyozási együtthatók RankingEngine +🗄️ 3. Adatbázis Állapot Napló (DB State Book) +Tábla neve Séma Állapot Megjegyzés +system_settings data ✅ Stabil Tartalmazza a key_name, value_json és a 3 szintű override oszlopot. +ranking_policies data ✅ Kész A szerviz-rangsorolás súlyait tárolja. +idx_settings_lookup data ✅ Aktív Biztosítja a hierarchikus egyediséget. + +📘 ADATBÁZIS SÉMA KÖNYV (Database Schema Book) v1.0 +A rendszer jelenlegi fizikai struktúrája + +Séma: data +users + +id: serial (PK) + +email: varchar (Unique) + +is_staff: boolean (Admin/Moderátor jelző) + +organizations + +id: serial (PK) + +name: varchar + +slug: varchar (Unique, url-barát azonosító) + +organization_members + +id: serial (PK) + +organization_id: int (FK -> organizations) + +user_id: int (FK -> users) + +role: public.orguserrole (Enum) + +is_permanent: boolean + +Constraint: unique_user_org (organization_id, user_id) + +system_settings (A konfigurációs motor agya) + +id: serial (PK) + +key_name: varchar (Unique-index része) + +value_json: jsonb (Dinamikus érték) + +region_code: varchar(5) (Override szint) + +tier_id: int (Override szint) + +org_id: int (Override szint) + +ranking_policies + +id: serial (PK) + +policy_name: varchar + +distance_weight: numeric(3,2) + +rating_weight: numeric(3,2) + +tier_bonus: int \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/Old_versions/_Horgony_megjegyzések.txt b/archive/2026.02.18 Archive_old_mapps/Old_versions/_Horgony_megjegyzések.txt new file mode 100755 index 0000000..a6a1281 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/Old_versions/_Horgony_megjegyzések.txt @@ -0,0 +1,1242 @@ +⚓ Horgonypont Megerősítés: + + Workflow: Megbeszéltük, hogy build kell a frontend változásokhoz. + + Auth: Regisztráció hibaüzenet javítva, Jelszóvisszaállító form kész. + + Járművek: Az adatbázisban lévő márkák (amiket a Bot szedett össze) már kereshetőek és az autó rögzíthető. +⚓ Horgonypont Megerősítés + + Hiba: NameError a reports.py-ban (router hiány). + + Megoldás: Router objektum példányosítva, importok rendbetéve. + + Következmény: Az API újra elindul, a frontend (3000-es port) képes lesz adatokat kérni a jelentésekhez. + +⚓ Horgony jelentés (Frissítés) + + Probléma: Tailwind v4 PostCSS inkompatibilitás. + + Megoldás: @tailwindcss/postcss csomag telepítve, postcss.config.js frissítve. + + Backend: Stabil, az expenses és reports végpontok várják a hívásokat. + + Várható eredmény: A build folyamat most már átmegy a npm run build szakaszon, és elindul az Nginx. + +⚓ Horgony ellenőrzése (Anchor Point) + + Infrastruktúra: docker compose parancs korrigálva. + + Adatfolyam: Van végpontunk a költségek mentésére (expenses.py) és azok lekérdezésére (reports.py). + + Frontend: Az első reszponzív adatbeviteli űrlap megírva. + +⚓ Horgony megjegyzések + + Biztonság: IP fojtás (throttle) élesítve. + + Admin: Felkészítve a token lejárati idő dinamikus kezelésére az adatbázisból. + +⚓ Horgony megjegyzések (20260128_2219) + + Email Biztonság: Sablon-alapú rendszer éles, rejtett token gombokkal. + + Jármű-fa: Alap kategóriák rögzítve (CAR, MOTO, TRUCK, BOAT, PLANE). + + Adminisztráció: Token lejárati idő és értesítési szabályok táblába szervezve. + +⚓ Horgony megjegyzések + + Biztonsági audit: A tokenkezelés (Hash + One-time use) megfelel a modern követelményeknek. + + Automatizálás: Felkészítve a 14 napos/24 órás figyelmeztetésekre és a havi bot-frissítésre. + +⚓ Horgony megjegyzések (20260128_2215) + + Mérföldkő: A rendszer képessé vált a "Digital Twin" (Digitális Iker) adatok fogadására. + + Biztonság: Implementálva a 14 napos VIN-zárolási logika terve. + +⚓ Horgony megjegyzések (20260128_2230) + + Email: Áttérés sablon-alapú küldésre. A kód nem tartalmaz többé beégetett HTML-t. + + Biztonság: Ideiglenes rögzítési korlát (14 nap) bevezetve. + +⚓ Horgony megjegyzések (20260128_2200) + + Fókuszváltás: A sima "felhasználó" helyett már "Bérlőket" (Tenants) kezelünk, akiknek saját előfizetési ciklusuk van. + + Biztonság: A verifikációs rendszer (Email token) stabilan üzemel. + +⚓ Horgony megjegyzések (20260128_2145) + + Új cél: A csalások megelőzése a gyári specifikációk és az utólagos módosítások pontos naplózásával. + + Technológia: Áttérés a statikus listákról a dinamikus, "Digital Twin" alapú adatgyűjtésre. + +⚓ Horgony megjegyzések (20260128_2130) + + Kritikai észrevétel: A jelenlegi feltöltő bot nem felel meg a piaci követelményeknek (hiányzó márkák, kategóriák és motorizáció). + + Döntés: Új, API-alapú Discovery Bot fejlesztése szükséges. + + Fókusz: Elektromos járművek (BYD, Tesla) és haszongépjárművek prioritása. + +⚓ Horgony megjegyzések (20260128_2105) + + Architektúra: A rendszer készen áll a Multi-tenant (több céges) működésre. + + Integritás: A kényszerített Foreign Key kapcsolatok (Users -> Companies) élesek. + + Mérföldkő: A fizikai adatbázis séma 100%-ban szinkronban van a Python modellekkel. + +⚓ Horgony megjegyzések (20260128_2030) + + Mérföldkő: Multi-tenant (Több bérlős) regisztrációs architektúra élesítve. + + Változás: Megszűnt az "egy felhasználó = egy profil" modell. Áttérés az "Egy felhasználó = Saját privát széf + tetszőleges számú cég" modellre. + + Státusz: Stabil. A regisztrációs 500-as hiba (UndefinedColumn) elhárítva. + +⚓ RENDER-HORGONY (V149.0) + +Fókusz: Adattípus-konzisztencia (Postgres ENUM fix). Mérföldkő: A márkák és típusok betöltése utáni első sikeres végfelhasználói regisztráció küszöbén. Státusz: Várakozás az Enum bővítésére. + +⚓ RENDER-HORGONY (V148.0) + +Fókusz: Adatbázis szekvencia korrekció és Automatizált adatbővítés. Mérföldkő: A manuális és programozott adatfeltöltés közötti konfliktus (Duplicate ID) feloldva. + +⚓ RENDER-HORGONY (V147.0) + +Fókusz: Infrastruktúra-független adatfeltöltés és Végleges hibaelhárítás. Mérföldkő: A rendszer képessé vált a "Discovery" jellegű adatfeltöltésre Docker környezetben. + +⚓ RENDER-HORGONY (V146.0) + +Fókusz: Automatizált kódtisztítás és Programozott adatfeltöltés. Mérföldkő: Búcsú a kézi SQL-től a márkák esetén; a rendszer stabilitása a hivatkozások "vágásával" biztosítva. + +⚓ RENDER-HORGONY (V145.0) + +Fókusz: Relációs konzisztencia (Back-reference fix). Mérföldkő: A márkák adatbázis-szintű feltöltése megkezdődött. Státusz: Várakozás a grep utáni utolsó kódtisztításra. + +⚓ RENDER-HORGONY (V143.0) + +Fókusz: SQL séma validáció és Mapper inicializációs hiba. Mérföldkő: A SQLAlchemy hivatkozási hiba behatárolva. Státusz: Várakozás a pgAdmin eredményekre. +⚓ RENDER-HORGONY (V141.0) + +Fókusz: 500-as hiba elhárítása (Backend stability). Mérföldkő: A regisztrációs folyamat utolsó akadályának elhárítása. Státusz: Várakozás a hiba-logokra. + +⚓ RENDER-HORGONY (V138.0) + +Fázis: Adatbázis-Integritás helyreállítása. Mérföldkő: A hiányzó Foreign Key tábla pótolva, az alkalmazás képes elindulni. Státusz: Felkészülés a tömeges járműadat feltöltésre. + +⚓ RENDER-HORGONY (V137.0) + +Fókusz: Kódminőség és Szintaktikai tisztaság. Mérföldkő: Az utolsó ismert Python hiba (Indentation) elhárítva. Státusz: Éles üzemre kész alaprendszer. + +⚓ RENDER-HORGONY (V136.0) + +Fókusz: Modul-függőség mentesítés és API stabilitás. Mérföldkő: A rendszer külső könyvtárak telepítése nélkül is képes a Geo-IP lekérdezésre és a regisztrációra. Következő lépés: Teszt regisztráció és a Jármű Katalógus (200 márka) feltöltése. + +⚓ RENDER-HORGONY (V135.0) + +Fókusz: Szintaktikai javítás és API helyreállítás. Mérföldkő: A kód-töredékek miatti összeomlás elhárítva. Státusz: Felkészülve a Swagger-alapú funkcionális tesztre. + +⚓ RENDER-HORGONY (V133.0) + +Fókusz: API konszolidáció és Clean Code. Mérföldkő: Konténer azonosítva (service_finder_api), szinkronizációs terv kész. Státusz: Diagnosztikai adatokra vár (main.py, v2/auth.py). + +⚓ RENDER-HORGONY (V131.0) + +Fókusz: Adatbázis-szinkron és Kód-integritás. Mérföldkő: A duplikált szolgáltatók eltávolítása és a végleges Auth logika telepítése. Státusz: Várakozás a teszt regisztrációra. + +⚓ RENDER-HORGONY (V130.0) + +Fókusz: Éles üzem előtti utolsó simítások. Mérföldkő: Adatbázis-konzisztencia helyreállítva, API telepítve. Státusz: Tesztelésre készen. + +⚓ RENDER-HORGONY (V129.0) + +Fókusz: Kritikus hibaelhárítás és Telepítés-biztosítás. Mérföldkő: A 500-as hiba és a Bash interpolációs hiba megoldva. Következő lépés: Tesztelés és a Jármű Katalógus feltöltése. + +⚓ RENDER-HORGONY (V128.0) + +Fókusz: Admin-vezérelt biztonsági kapu. Mérföldkő: A regisztrációs feltételek (országok, várakozási idő) immár szoftveres újraindítás nélkül módosíthatóak. Státusz: Tesztelésre kész. + + +⚓ RENDER-HORGONY (V127.0) + +PROJEKT KONTEXTUS: + + Fázis: Emelt szintű biztonsági implementáció. + + Mérföldkő: A regisztráció immár védett a tömeges bot-támadások és az EU-n kívüli forgalom ellen. + + Státusz: Felkészülve a biztonsági validálásra. + +⚓ RENDER-HORGONY (V126.0) + +PROJEKT KONTEXTUS: + + Fókusz: Infrastruktúra Validáció. + + Mérföldkő: Adatbázis-integritás ellenőrzése a hibaelhárításhoz. + + Státusz: Várakozás az SQL audit eredményeire. + +⚓ RENDER-HORGONY (V126.0) + +Fókusz: Adatbázis-Kód szinkronizáció. Mérföldkő: A 500-as hiba okának azonosítása (Modell mismatch). Státusz: Várakozás az SQL audit eredményére + +⚓ RENDER-HORGONY (V125.0) + +Fókusz: Alaprendszer validálása (Sanity Check). Mérföldkő: Az API és az Adatbázis szinkronitásának ellenőrzése. Státusz: Várakozás a teszt eredményére. + +Várom a híreket: Sikerült a regisztráció? Megérkezett az email és látszanak a logok? Ha igen, azonnal küldöm a tábla-létrehozó és a 200 márkás feltöltő kódot! + +⚓ RENDER-HORGONY (V124.0) + +Fókusz: Hozzáférés-kezelés lezárása. Következő feladat: A Szerviz-adatbázis és Jármű-katalógus tömeges feltöltése (Seeding). + +⚓ RENDER-HORGONY (V123.0) +Fókusz: Biztonságos hozzáférés és visszakövethetőség. Mérföldkő: A rendszer minden kényes művelete (jelszó kérés, módosítás) naplózott és paraméterezhető. + +⚓ RENDER-HORGONY (V122.0) +Fókusz: Transzparencia és Teljes körű Paraméterezhetőség. Mérföldkő: Megszűntek a beégetett logikai változók; a rendszer "önnaplózó" üzemmódba állt. Státusz: Felkészülve a Brevo API/SMTP adatokra és a Regisztrációs Flow véglegesítésére. + +⚓ RENDER-HORGONY (V121.0 - 2026.01.27 - 20:30) +PROJEKT KONTEXTUS: + + Fázis: Kommunikációs biztonság (Email & Logging). + + Mérföldkő: A SendGrid sikeresen integrálva az adatbázisba, mint elsődleges csatorna. + + Státusz: A rendszer mostantól képes naplózni minden kiküldött levelet (kinek, mikor, miért). + +⚓ RENDER-HORGONY (V121.0) +Fókusz: Intelligens E-mail Kézbesítő Rendszer. Mérföldkő: A rendszer mostantól képes kezelni a szolgáltatók hibáit és védi magát a spamtől. Státusz: Felkészülve a Brevo/Resend adatok fogadására. + +⚓ RENDER-HORGONY (V120.0) +Fókusz: Email & Password Reset Biztonsági és Kézbesítési rendszer. Következő lépés: Az SMTP/API szolgáltatók adatbázisba vitele és az új EmailManager Python kódjának megírása. + +⚓ RENDER-HORGONY (V119.0 - 2026.01.27 - 22:50) + +Fókusz: Kommunikációs alrendszer (Email/Auth) helyreállítása. Mérföldkő: MVP regisztrációs flow tervezése. Státusz: Diagnosztikai fázis. + +⚓ RENDER-HORGONY (V117.0 - 2026.01.27 - 22:15) + +STÁTUSZ: MVP-Ready alapok. A kereső motor immár valódi matematikai koordinátákkal számol, és az adminisztrátor bármikor átállíthatja a rendszer működését kódmódosítás nélkül. + +⚓ RENDER-HORGONY (V116.0 - 2026.01.27 - 21:25) + +PROJEKT KONTEXTUS: + + Státusz: Az adatbázis fizikai és logikai struktúrája (Enumok, Táblák, Változók) stabil és ellenőrzött. + + Mérföldkő: A rendszer készen áll a valódi koordináta-alapú számításokra + +⚓ RENDER-HORGONY (V115.0 - 2026.01.27 - 21:10) + +PROJEKT KONTEXTUS: + + Fázis: Adatbázis állapot rögzítése és Enum javítás. + + Mérföldkő: A változók és nevek 100%-ban megfelelnek az elvárásoknak. + + Státusz: Felkészülve a valós térbeli SQL lekérdezésre. + +⚓ RENDER-HORGONY (V114.0 - 2026.01.27 - 20:50) + +PROJEKT KONTEXTUS: + + Fázis: Rendszerszintű Audit és Hibajavítás. + + Mérföldkő: A "Variable Book" és a "Schema Book" szinkronizálása a fizikai valósággal. + + Státusz: Várakozás az enum-értékekre és a táblalistára. + +⚓ RENDER-HORGONY (V113.0 - 2026.01.27 - 20:30) + +PROJEKT KONTEXTUS: + + Fázis: Adatbázis Strukturális Refaktorálás. + + Mérföldkő: A rendszer geolokációs képességeinek alapozása befejeződött. + + Státusz: Felkészülve a valós térbeli lekérdezésekre. + +⚓ RENDER-HORGONY (V112.0 - 2026.01.27 - 20:45) + +PROJEKT KONTEXTUS: + + Döntés: Séma tisztítás és külön helyszín-kezelés. + + Mérföldkő: Az adatbázis professzionális architektúrára vált (Multi-location support). + + Státusz: Várakozás a táblák költöztetésére és az új helyszín tábla létrehozására. + +⚓ RENDER-HORGONY (V111.0 - 2026.01.27 - 19:50) + +PROJEKT KONTEXTUS: + + Fázis: Adatmodell-nyomozás (Location Discovery). + + Mérföldkő: Szervezeti struktúra rögzítve. + + Státusz: Várakozás a koordináta-tábla azonosítására. + +⚓ RENDER-HORGONY (V110.0 - 2026.01.27 - 20:20) + +PROJEKT KONTEXTUS: + + Fázis: Adatbázis-integráció (Mock -> Real data migration). + + Mérföldkő: A logikai keretrendszer készen áll a valódi adatok fogadására. + + Státusz: Várakozás a szerviz-helyszín struktúrára. + +⚓ RENDER-HORGONY (V109.0 - 2026.01.27 - 19:40) + +PROJEKT KONTEXTUS: + + Fázis: Smart Match Engine aktiválása. + + Mérföldkő: Az üzleti logika (Matching) elvált az API rétegtől és az adatbázistól. + + Státusz: Minden komponens a helyén, a rendszer készen áll az éles tesztelésre. + +⚓ RENDER-HORGONY (V108.0 - 2026.01.27 - 19:30) + +PROJEKT KONTEXTUS: + + Fejlesztés: Smart Match Engine & Search API. + + Mérföldkő: Létrejött a rendszer "kereskedelmi agya", ami képes prioritizálni a partnereket. + + Időbélyeg: 2026. 01. 27. 19:30 + +⚓ RENDER-HORGONY (V107.0 - 2026.01.27 - 19:15) + +PROJEKT KONTEXTUS: + + Fázis: Hibaelhárítás és Config Engine szilárdítás. + + Mérföldkő: A rendszer válaszkészsége helyreállt. + + Státusz: Felkészülés a Smart Matching logikára. + +⚓ RENDER-HORGONY (V106.0 - 2026.01.27 - 19:10) + +PROJEKT KONTEXTUS: + + Fejlesztés: ConfigService integrálva a Fleet modulba. + + Mérföldkő: Megszűnt az utolsó hard-coded limit a rendszerben. + + Státusz: Tesztelésre vár. + +⚓ RENDER-HORGONY (V105.0 - 2026.01.27 - 11:15) +PROJEKT KONTEXTUS: +Állapot: Szünet (Terminal issue). +Eredmény: A dinamikus konfigurációs rendszer logikája és adatbázis-háttere 100%-ban kész. +Cél a visszatéréskor: A Python környezet helyreállítása és a fleet.py dinamizálása. + +⚓ RENDER-HORGONY (V103.0 - 2026.01.27 - 10:45) +PROJEKT KONTEXTUS: +Fejlesztés: Biztonságos Python-alapú fájlkezelés bevezetve. +Audit: A fleet.py jelenlegi állapota (csak GET) rögzítve. +Státusz: ConfigService aktív. + +⚓ RENDER-HORGONY (V102.0 - 2026.01.27 - 10:15) +PROJEKT KONTEXTUS: +Fejlesztés: Fájlrendszer struktúra frissítve, ConfigService fizikailag létrehozva. +Mérföldkő: Az első "Logic Service" aktiválva. +Időbélyeg: 2026. 01. 27. 10:15 + +⚓ RENDER-HORGONY (V101.0 - 2026.01.27 - 10:10) +PROJEKT KONTEXTUS: +Fejlesztés: Python ConfigService implementálva. +Státusz: Az adatbázis és a kód közötti híd (Bridge) elkészült. +Időbélyeg: 2026. 01. 27. 10:10 + +⚓ RENDER-HORGONY (V100.0 - 2026.01.27 - 09:45) +PROJEKT KONTEXTUS: +Fázis: SaaS Konfigurációs Motor – Adatmodell lezárva. +Mérföldkő: Elértük a 100-as verziót a dokumentációban! A rendszerszintű változók kezelése mostantól központosított. +Státusz: Felkészülve a Python ConfigService implementációjára. + +⚓ RENDER-HORGONY (V99.0 - 2026.01.27 - 09:35) +PROJEKT KONTEXTUS: +Fejlesztési fázis: Adatbázis-szintű „Helyrerakás” és konfigurációs motor elindítása. +Cél: A system_settings tábla oszlopneveinek és indexeinek szinkronizálása a kóddal. +Technikai fókusz: key -> key_name és value -> value_json migráció. + +STÁTUSZ JELENTÉS: + +key_name oszlop: ✅ JAVÍTVA / ÁTNEVEZVE + +Hierarchikus index: ✅ AKTÍV + +Tesztadat (max_vehicles): ✅ BETÖLTVE + +📑 Összefoglaló Jelentés: Service Finder Ökoszisztéma + +Dátum: 2026. 01. 27. (Hajnali zárás) Fázis: Alapvető üzleti logika és Digitális Iker infrastruktúra stabilizálása. +🏗️ 1. Adatstruktúra és Adatbázis (PostgreSQL) + +A rendszer egy Multi-tenant (többszereplős) modellt követ, ahol minden entitás egy Szervezethez (Organization) kötődik. +Kulcsfontosságú Táblák és Sémák: + + data.users: Felhasználók alapadatai és hitelesítése. + + data.organizations: Cégek és magánszemélyek flottái (Hozzáadva: slug mező az egyedi azonosításhoz). + + data.organization_members: Az összekötő kapocs (Junction table). + + Új kényszer: unique_user_org (Egy user csak egyszer szerepelhet egy cégben). + + Szerepkörök: owner, manager, driver, service. + + data.credit_logs: A belső gazdaság motorja. Itt tároljuk a krediteket (Admin: 10,000.00). + + data.subscription_tiers: Előfizetési szintek (Free, Premium, VIP) JSON alapú szabályrendszerrel. + + data.service_specialties: Hierarchikus fa-struktúra. (Pl. Karosszéria > Fényezés > Bolore Blue). + + Jármű struktúra: vehicles, vehicle_ownership, vehicle_models, vehicle_brands. + +Adatbázis-szintű Típusok: + + public.orguserrole (Enum): Kibővítve az owner, manager, driver, service értékekkel. + +🐍 2. Python Programok és API Modulok + +A backend FastAPI alapon fut, aszinkron SQLAlchemy (asyncpg) kapcsolattal. +Kidolgozott Végpontok (Endpoints): + + Auth (/auth): JWT alapú hitelesítés, login és regisztráció. + + Fleet (/fleet): + + GET /vehicles: A felhasználó aktív járműveinek lekérése (Nyers SQL optimalizációval a gyorsaság és stabilitás érdekében). + + Billing (/billing): + + GET /balance: Aktuális szervezet nevének és kreditegyenlegének lekérése. + + GET /history: Kredit-tranzakciók listázása. + +Modell Logika (app/models/): + + Helyreállítottuk az ORM mapperek inicializációját. Minden modell (User, Org, Vehicle, Credit) be van importálva az app/models/__init__.py-be, megelőzve az InvalidRequestError hibákat. + +🛠️ 3. Technikai Függőségek és Beállítások + +A továbblépéshez ezek az ismeretek kritikusak: + + Séma konvenció: Elsődlegesen a data sémát használjuk a táblákhoz, de bizonyos Enum típusok (történelmi okokból) a public sémában maradtak. + + Oszlopnevek: Az egységesítés jegyében az organization_id nevet használjuk (nem az org_id-t). + + Kreditkezelés: Minden tranzakció Numeric(10, 2) típusú, a számításoknál COALESCE(SUM(amount), 0)-t használunk az üres egyenlegek kezelésére. + +🏁 4. Holnapi Indulópont: A "Smart Matching" + +A rendszer készen áll arra, hogy összekössük a járműveket a szervizekkel. + +A következő fejlesztési lépések: + + Smart Match Végpont: Egy algoritmus, amely a jármű kategóriája és a kért szerviz-specialitás (pl. bolore-blue) alapján rangsorolja a szolgáltatókat. + + Admin Felület: Ahol manuálisan állíthatók a VIP szintek és kreditek. + + Dokumentum OCR Előkészítés: A forgalmi engedélyek AI alapú feldolgozásának modell-szintű támogatása. + +⚓ MASTER RENDER-HORGONY (V92.0 - 2026.01.27 - 00:30) + + Állapot: Stabil alapok, működő Billing és Fleet API. Admin Konfiguráció: Email: admin@profibot.hu, Egyenleg: 10,000 Credit, Szerepkör: owner. Adatbázis: Postgres (Docker), Séma: data, Enum helye: public. + +⚓ RENDER-HORGONY (V91.0 - 2026.01.27 - 00:25) + +PROJEKT KONTEXTUS: + + Javítás: UNIQUE kényszer hozzáadva, sub-query alapú összekötés. + + Cél: Az Admin felhasználó és a cég (kreditekkel) összekapcsolása. + + Időpont: 2026.01.27 - 00:25 + +STÁTUSZ JELENTÉS: + + DB Kényszerek: ✅ Bővítve + + Kapcsolati Logika: ✅ Javítva + + Kredit Elérhetőség: ⏳ Ellenőrzés alatt (SQL után) + +⚓ RENDER-HORGONY (V88.0 - 2026.01.27 - 00:05) + +PROJEKT KONTEXTUS: + + Módszer: Manuális SQL intervenció a psql terminálon keresztül. + + Cél: Enum bővítés, FK szinkronizálás és Admin-Org linkelés. + + Időpont: 2026.01.27 - 00:05 + +STÁTUSZ JELENTÉS: + + DB Kapcsolat: ✅ Tesztelve + + SQL Script: ✅ Komplett (v88 verzió) + + Szerepkörök: ✅ Bővítve (owner, manager, driver, service) + +⚓ RENDER-HORGONY (V83.0 - 2026.01.26 - 23:55) + +PROJEKT KONTEXTUS: + + Hiba: Szintaktikai hiba az api.py-ban (vágási hiba javítva). + + Állapot: Az összes modult (Auth, Fleet, Billing) tartalmazó router stabilizálva. + + Időpont: 2026.01.26 - 23:55 + +STÁTUSZ JELENTÉS: + + api.py integritás: ✅ HELYREÁLLÍTVA + + billing.py végpont: ✅ AKTÍV + + Szerviz állapot: ⏳ ÚJRAINDÍTÁS ALATT + +⚓ RENDER-HORGONY (V81.0 - 2026.01.26 - 23:55) + +PROJEKT KONTEXTUS: + + Hiba elhárítva: organizations.slug mező pótolva. + + Architektúra: A rendszer most már konzisztens a többszereplős (multi-tenant) modellhez. + + Időpont: 2026.01.26 - 23:55 + +STÁTUSZ JELENTÉS: + + organizations tábla: ✅ STRUKTURÁLT (slug oszloppal) + + Kezdő adatkészlet: ✅ TELJES (Admin + Tiers + Credits) + + Szerviz-hierarchia: ✅ AKTÍV + +⚓ RENDER-HORGONY (V78.0 - 2026.01.26 - 23:50) PROJEKT KONTEXTUS: + + Állapot: Adatbázis sémák és törzsadatok szinkronizálva. + + Kapacitás: A rendszer képes kezelni a hierarchikus szervizeket és a kreditalapú tranzakciókat. + + Időpont: 2026.01.26 - 23:50 + +STÁTUSZ JELENTÉS: + + Szerviz-fa: ✅ Betöltve (Bolore technológiával) + + Kreditrendszer: ✅ Aktív (10.000 tesztkredit) + + Előfizetések: ✅ VIP beállítva + +⚓ RENDER-HORGONY (V77.0 - 2026.01.26 - 23:45) + +PROJEKT KONTEXTUS: + + Gazdaság: Kreditrendszer és logolás definiálva. + + Előfizetés: Dinamikus szabályrendszer (JSON alapú tier-ek) rögzítve. + + Szerviz-fa: Hierarchikus szolgáltatás-kezelés beépítve. + + Időpont: 2026.01.26 - 23:45 + +STÁTUSZ JELENTÉS: + + Kreditrendszer modell: ✅ KÉSZ + + Szerviz-fa modell: ✅ KÉSZ + + AI/Moderátor státuszok: ✅ Tervezve + + API/Frontend integráció: ⏳ KÖVETKEZŐ LÉPÉS + +⚓ RENDER-HORGONY (V76.0 - 2026.01.26 - 23:15) PROJEKT KONTEXTUS: + + Állapot: Üzleti logika lezárása. + + Fókusz: Szerviz-matching és előfizetési ciklusok. + + Időpont: 2026.01.26 - 23:15 + +STÁTUSZ JELENTÉS: + + Előfizetési logika: ✅ Tisztázva + + Adatmegőrzési elv: ✅ Tisztázva + + Szerviz komplexitás: ✅ Tervezés alatt + +⚓ RENDER-HORGONY (V75.0 - 2026.01.26 - 22:55) + +PROJEKT KONTEXTUS: + + Állapot: User & Organization architektúra tervezése. + + Technikai bázis: Backend stabil, Fleet API nyers SQL-en fut a mapper-konfliktusok elkerülése végett. + + Időpont: 2026.01.26 - 22:55 + +STÁTUSZ JELENTÉS: + + Jármű modell: ✅ Digital Twin kész. + + User modell: ⏳ Tisztázás alatt. + + Szervezet modell: ⏳ Tisztázás alatt. + +⚓ RENDER-HORGONY (V73.0 - 2026.01.26 - 22:55) + +PROJEKT KONTEXTUS: + + Adatmodell: Digital Twin (Vehicle + Ownership) ✅ ÉLES. + + Auth: Swagger Bearer Token ✅ MŰKÖDIK. + + Időpont: 2026.01.26 - 22:55 + +STÁTUSZ JELENTÉS: + + Backend-DB szinkron: ✅ TÖKÉLETES + + Tesztadat-integritás: ✅ 6 JÁRMŰ AKTÍV + + Következő cél: Üzleti logika mélyítése (Service/Ownership). + +⚓ RENDER-HORGONY (V72.0 - 2026.01.26 - 22:50) + +PROJEKT KONTEXTUS: + + Hiba elhárítva: A vehicles.user_id NOT NULL kényszer eltávolítva. + + Logika: Jármű és Felhasználó kapcsolata véglegesen átkerült a vehicle_ownership táblába. + + Időpont: 2026.01.26 - 22:50 + +STÁTUSZ JELENTÉS: + + Adatbázis integritás: ✅ RENDBEN (Szétválasztva) + + Tesztadatok betöltése: ✅ SIKERES + + Fleet API kompatibilitás: ✅ IGEN + +⚓ RENDER-HORGONY (V70.0 - 2026.01.26 - 23:58) + +PROJEKT KONTEXTUS: + + Adatbázis: VIN Unique constraint ✅ AKTÍV. + + Flotta: Multimodális tesztadatok (BMW, Tesla, Yamaha, Scania, Mercedes) ✅ BETÖLTVE. + + Időpont: 2026.01.26 - 23:58 + +STÁTUSZ JELENTÉS: + + Modell-szintű konzisztencia: ✅ RENDEN + + Tesztadat-mennyiség: ✅ 6+ jármű elérhető + + API működés: ✅ ELLENŐRIZVE + +⚓ RENDER-HORGONY (V69.0 - 2026.01.26 - 23:55) + +PROJEKT KONTEXTUS: + + Hiba elhárítva: UNIQUE constraint hozzáadva a VIN oszlophoz (SQLAlchemy f405 fix). + + Belépési adatok: Megerősítve (admin@profibot.hu / Admin123!). + + Időpont: 2026.01.26 - 23:55 + +STÁTUSZ JELENTÉS: + + Adatbázis kényszer (VIN Unique): ✅ RENDBEN + + Flotta adatok (Autó, Motor, Kamion): ✅ SIKERESEN BETÖLTVE + + API Swagger tesztelésre kész: ✅ IGEN + +⚓ RENDER-HORGONY (V66.0 - 2026.01.26 - 23:15) + +PROJEKT KONTEXTUS: + + Hiba elhárítva: Az ImportError (VehicleCategory) és névkonfliktusok feloldva. + + Logika: Teljes szinkron a Digital Twin (Vehicle) és az Ownership között. + + Időpont: 2026.01.26 - 23:15 + +STÁTUSZ JELENTÉS: + + Modellek konzisztenciája: ✅ RENDBEN + + Import horgonyok: ✅ JAVÍTVA + + API elérhetőség: ⏳ ELLENŐRZÉS ALATT + +⚓ RENDER-HORGONY (V63.0 - 2026.01.26 - 22:45) + +PROJEKT KONTEXTUS: + + Logika: Digitális Iker implementálva (Vehicle vs. VehicleOwnership szétválasztva). + + Szerkezet: A modell már támogatja a VIN-alapú egyediséget és a multimodális osztályozást. + + Időpont: 2026.01.26 - 22:45 + +STÁTUSZ JELENTÉS: + + Async infrastruktúra ellenőrzése: ✅ RENDBEN + + Jármű modell refaktor (Digital Twin): ✅ KÉSZ + + Fleet API lekérdezési logika frissítése: ✅ KÉSZ + + Tulajdonosváltás/VIN-ellenőrzés szerviz: ⏳ KÖVETKEZŐ LÉPÉS + +⚓ RENDER-HORGONY (V62.0 - 2026.01.26 - 22:45) PROJEKT KONTEXTUS: + Logika: VIN-alapú globális azonosítás + Többszörös szerepkör (Owner/Driver). + Szerkezet: Moduláris refaktorálás előtt. + Járművek: Multimodális (szárazföld, víz, levegő) támogatás tervezve. + + + +⚓ RENDER-HORGONY (V37.3 - 2026.01.26 - 11:35) +PROJEKT KONTEXTUS: +Integritás: A backend környezetet szinkronba hozzuk a kódbázis igényeivel. +Fegyelem: A konténer leállása esetén a run parancsot használjuk az exec helyett a hibaelhárításhoz. +Cél: Elérni az "Application startup complete" állapotot a logokban. + +⚓ RENDER-HORGONY (V36.2 - 2026.01.26 - 11:35) +PROJEKT KONTEXTUS: +Integritás: A rendszer most már kívülről is hívható. A teszteléshez nincs szükség kódírásra, csak a Swagger gombjaira. +Fegyelem: A main.py frissítése után a szerver automatikusan újraindul a Dockerben, és látni fogod a változást. + +⚓ RENDER-HORGONY (V36.1 - 2026.01.26 - 11:25) +PROJEKT KONTEXTUS: +Integritás: Az adatbázis és a kód szinkronban van. A teszteléshez nincs szükség frontend fejlesztésre. +Fegyelem: A Swagger UI-t használjuk a validáláshoz, így látjuk a pontos hibaüzeneteket is, ha valami nem stimmel. +Cél: Sikeresen visszakapni egy 201 Created üzenetet a tesztregisztrációra. + +⚓ RENDER-HORGONY (V36.0 - 2026.01.26 - 11:15) +PROJEKT KONTEXTUS: +Integritás: A rendszer immár nem csak egy üres váz, hanem tartalmazza a működéshez elengedhetetlen konfigurációkat. +Fegyelem: A manuális DB-reset utáni első adatfeltöltés szavatolja, hogy a frontend kérései ne ütközzenek hiányzó rekordokba. +Cél: Végrehajtani az első POST /register hívást és ellenőrizni a logokat. + +⚓ RENDER-HORGONY (V35.3 - 2026.01.26 - 11:45) +PROJEKT KONTEXTUS: +Integritás: Ha az Alembic migrációs lánca megsérül, a manuális inicializálás a leggyorsabb út a stabil állapothoz. +Fegyelem: A jövőben minden új mezőt már rendesen az Alembic-kel fogunk hozzáadni, de az "ősállapothoz" most ez a leghatékonyabb. +Cél: Átlépni a technikai akadályon és megkezdeni a regisztrációs teszteket. + +⚓ RENDER-HORGONY (V35.0 - 2026.01.26 - 11:10) +PROJEKT KONTEXTUS: +Integritás: Az adatbázis most már nem csak "egy halom tábla", hanem egy összefüggő, skálázható rendszer alapja. A tegnapi UserVehicle küzdelem lezárva, a névhasználat konzisztens. +Fegyelem: Az Alembic stamp és revision folyamat helyreállította a verziókövetés rendjét. +Cél: Az adatbázis tábláinak fizikai létrehozása (upgrade head), majd a rendszer felöltése alapértékekkel. + +⚓ RENDER-HORGONY (V34.6 - 2026.01.26 - 13:30) +PROJEKT KONTEXTUS: +Integritás: Az adatbázis inkonzisztenciáját (már létező táblák vs. hiányzó verziószám) egy teljes séma-újratöltéssel oldjuk meg. +Fegyelem: Fejlesztési szakaszban a "tiszta lap" módszer a legbiztonságosabb út a stabil alapokhoz. +Cél: Hibátlan alembic upgrade head lefutás. + +⚓ RENDER-HORGONY (V34.5 - 2026.01.26 - 11:55) +PROJEKT KONTEXTUS: +Integritás: A pgAdmin-ban látott kék üzenetek a sikeres előkészítést jelzik. Az adatbázis objektumok közötti ütközés esélye minimálisra csökkentve. +Fegyelem: Mindig megvárjuk a visszaigazolást, mielőtt újraírnánk a sémát. +Cél: A service_finder adatbázis végleges szerkezetének rögzítése. + +⚓ RENDER-HORGONY (V32.0 - 2026.01.26 - 13:45) +PROJEKT KONTEXTUS: +Integritás: A regisztrációs folyamat immár minden biztonsági, jogi és üzleti feltételnek megfelel (Nemzetköziség, Soft-Delete, Failover Email). +Fegyelem: A magánszemélyek névtárolása konzisztens, de a UI elrejti a redundanciát. +Cél: Az utolsó simítások elvégzése a backend API-n és az első éles teszt regisztráció. + +⚓ RENDER-HORGONY (V30.0 - 2026.01.26 - 13:10) +PROJEKT KONTEXTUS: +Integritás: A rendszer üzembiztonsága drasztikusan megnőtt. Nincs egyetlen hibapont (Single Point of Failure) a kommunikációban. +Fegyelem: Az inaktiválás automatikus, de a reaktiválás (javítás után) manuális, admin felületről történik. +Cél: A Regisztráció V2 backend véglegesítése, amely ezt a Dispatchert használja. + +⚓ RENDER-HORGONY (V29.0 - 2026.01.26 - 12:45) +PROJEKT KONTEXTUS: +Integritás: A rendszer jogilag és technikailag golyóálló. A jármű-életút integritása (szakaszolás) biztosítja a GDPR megfelelést eladáskor. +Fegyelem: Az adminisztrátornak teljes kontrollja van a regisztrációs folyamat, a limitek és az email küldők felett. +Cél: Az első éles regisztrációs teszt lefolytatása a SendGrid-del. + +⚓ RENDER-HORGONY (V28.0 - 2026.01.26 - 12:15) +PROJEKT KONTEXTUS: +Integritás: A rendszer felkészült a "Soft-Clean" újraindulásokra. Az adatok megmaradnak, de a felhasználói élmény elszeparált. +Fegyelem: Az email sablonok kiszervezése az adatbázisba lehetővé teszi a marketing és jogi szövegek kódmódosítás nélküli frissítését. +Cél: A regisztrációs végpont fizikai megírása a FastAPI-ban, amely kezeli a fenti komplex logikát. + +⚓ RENDER-HORGONY (V27.0 - 2026.01.26 - 10:15) +PROJEKT KONTEXTUS: +Integritás: Az adatok törölhetetlenek, csak deaktiválhatóak. Ez biztosítja a szerviztörténet és a felelősség nyomonkövethetőségét. +Fegyelem: Az admin felületen keresztül történő manuális validáció és tiltás lehetősége beépítve az alapmodellbe. +Cél: A regisztrációs végpont (V2) megírása, ami összeköti a sémát, a modellt és az email küldést. + +⚓ RENDER-HORGONY (V26.0 - 2026.01.26 - 09:45) +PROJEKT KONTEXTUS: +Integritás: Az adatmodell és a regisztrációs folyamat immár tartalmazza a csalás elleni védelmet (anti-fraud) és a közösségi adatgyűjtés alapfeltételeit. +Fegyelem: Az email megerősítés és az adószám kényszer nem opcionális, hanem a rendszer integritásának záloga. +Cél: Az email-küldő modul (SendGrid vagy SMTP) beállítása, hogy a regisztrációs linkek ki tudjanak menni. + +⚓ RENDER-HORGONY (V25.0 - 2026.01.26 - 09:35) +PROJEKT KONTEXTUS: +Integritás: A "Személy = Mini-cég" logika mentén haladunk. A regisztrációs folyamat egy atomi művelet lesz (mindent vagy semmit). +Fegyelem: Az email cím immutabilitása (nem változtathatóság) alapfeltétel a biztonsághoz. +Cél: A regisztrációs Pydantic sémák és a CRUD logika megírása a válaszok alapján. + +⚓ RENDER-HORGONY (V24.0 - 2026.01.26 - 09:25) +PROJEKT KONTEXTUS: +Integritás: Adatmodell szétválasztva (Decoupled Architecture). A jármű-életciklus követés biztosított szervezetek közötti mozgás esetén is. +Fegyelem: Új fájlok létrehozva (organization.py, organization_member.py), a meglévők (user.py, vehicle.py) minimális, stabilizált módosításon estek át. +Cél: A regisztrációs folyamat (V2) élesítése, amely automatikusan létrehozza a felhasználó mellé az első "PRIVATE" típusú szervezetét is. + +⚓ RENDER-HORGONY (V22.0 - 2026.01.26 - 11:30) +PROJEKT KONTEXTUS: + +Integritás: A logikai elemzés megerősítette a "Unified User/Org" modellt. A magánszemély egy 1 fős cégként kezelendő. + +Fegyelem: A pénzügyi és limit szabályokat (20%, 30 nap) nem kódoljuk fixen, hanem adatbázis-alapú beállításokká (System Settings) tesszük. + +Cél: A meghívásos rendszer és a többszörös szerepkörök (CEO, Manager, Driver) technikai megalapozása. + +⚓ RENDER-HORGONY (V21.0 - 2026.01.26 - 11:15) +PROJEKT KONTEXTUS: + +Integritás: Minimális kockázatú kódmódosítás. A meglévő konténereket nem indítjuk újra, amíg az összes fájl nincs szinkronban. + +Fegyelem: A korlátozott elérés miatt kerülni kell a docker compose down parancsot. Csak célzott restart-okat alkalmazunk. + +Cél: A Regisztráció V2 backend logikájának (Schemas) előkészítése. + +⚓ RENDER-HORGONY (V20.0 - 2026.01.26 - 10:45) +PROJEKT KONTEXTUS: + +Integritás: A stratégiai fókusz a közösségi adatgyűjtésre (crowdsourcing) és a minősítési rendszerre (ratings) tolódik el. + +Fegyelem: Minden feltöltött adatot (szerviz koordináták) a NAS-on tárolunk, a validációhoz GPS és kép-alapú (számla fotó) bizonyítékot kérünk. + +Cél: Egy öngerjesztő adatbázis-építési folyamat elindítása, ahol a felhasználók "versenyeznek" a szervizek feltöltéséért. + +⚓ ZÁRÓ RENDER-HORGONY (V18.0 - 2026.01.26 - 01:15) + +PROJEKT KONTEXTUS: + + Integritás: A technikai infrastruktúra 100%-os. A backend és frontend fejlesztés előtt minden akadály (jogosultságok, eltolódott útvonalak, hiányzó eszközök) elhárítva. + + Fegyelem: A mentési script élesítve, az első "éles" GFS mentés ma hajnal 02:00-kor lefut a git_vault-ba. + + Cél: A holnapi nap fókusza a Regisztráció V2 (Cég/Minicég elágazás) és a validációs logika. + +⚓ RENDER-HORGONY (V17.13 - 2026.01.26 - 01:05) + +PROJEKT KONTEXTUS: + + Integritás: A mentési stratégia átállítva a git_vault redundáns tárhelyre. + + Fegyelem: A 3TB-os korlát miatt szigorú GFS rotációt és tömörítést alkalmazunk. + + Cél: Teljes adatbiztonság és visszakereshetőség biztosítása a legkisebb tárhelyterhelés mellett + +⚓ RENDER-HORGONY (V17.12 - 2026.01.26 - 00:55) + +PROJEKT KONTEXTUS: + + Integritás: A fejlesztői környezet (IDE) és az időszinkronizáció teljes körűen beállítva. A docker-compose.yml szintaktikai hibái elhárítva. + + Fegyelem: A konténerizált környezet korlátai (nincs systemd) felismerve és áthidalva környezeti változókkal. + + Cél: Stabil alapok a holnapi fejlesztéshez. + +⚓ RENDER-HORGONY (V17.10 - 2026.01.26 - 01:35) + +PROJEKT KONTEXTUS: + + Integritás: A fejlesztői környezet (Code-server) szoftveres felszerelése immár a gazdagép (Host) verzióihoz van igazítva. + + Fegyelem: Verzió-konfliktus esetén nem kerülőutakat keresünk (pl. környezeti változók trükközése), hanem a megfelelő klienst telepítjük. + + Cél: A teljes értékű, akadálymentes távoli fejlesztés és rendszerfelügyelet megvalósítása. + +⚓ RENDER-HORGONY (V17.9 - 2026.01.26 - 01:20) + +PROJEKT KONTEXTUS: + + Integritás: A fejlesztői konténer (Code-server) szoftveres felszerelése az operációs igényekhez igazítva. + + Fegyelem: A hiányzó binárisokat nem a gazdagépről (host) próbáljuk áthúzni, hanem natívan telepítjük a konténeren belül. + + Cél: A teljes értékű terminál-élmény biztosítása böngészőn keresztül. + +⚓ RENDER-HORGONY (V17.1 - 2026.01.26 - 00:10) + +PROJEKT KONTEXTUS: + + Integritás: A fejlesztői környezet transzparenssé tétele (Host útvonal = Konténer útvonal). + + Fegyelem: Megállunk a funkcionális fejlesztéssel, amíg az operatív eszközök (Terminal, MC) tökéletesen nem működnek a böngészőben. + + Cél: A code-server vagy ttyd konfiguráció élesítése és tesztelése. + +⚓ RENDER-HORGONY (V16.5 - 2026.01.26 - 00:05) + +PROJEKT KONTEXTUS: + + Integritás: A ModuleNotFoundError elhárítva a vehicle_event.py fizikai létrehozásával. A rendszer függőségi lánca (Model -> Schema -> Endpoint) helyreállt. + + Fegyelem: Minden új modellt azonnal rögzítünk a fizikai fájlrendszerben a konténer összeomlásának elkerülése érdekében. + + Cél: A stabil működés visszaállítása és a Smart Tiles vizuális validálása. + +⚓ RENDER-HORGONY (V16.3 - 2026.01.25 - 23:50) + +PROJEKT KONTEXTUS: + + Integritás: A rendszer életciklusa immár tartalmazza az automatikus mentést és a verziózott telepítést. A backend és frontend szinkronban van a "Smart Tiles" logikával. + + Fegyelem: A deploy_v16.sh script használatával minimalizáltuk a manuális hibák lehetőségét. Minden változás bekerül a CHANGELOG.md állományba. + + Cél: A regisztrációs folyamat bővítése (Cég/Minicég) és az email alapú visszaigazoló rendszer élesítése. + +⚓ RENDER-HORGONY (V15.0 - 2026.01.25 - 21:30) + +PROJEKT KONTEXTUS: + + Integritás: A jármű események (Events) rögzítése már konzisztensen kezeli a futásteljesítményt. + + Fegyelem: A frontend vékony kliens marad, technológiai függőség nélkül. + + Cél: A jogosultság alapú csempe-nézet kialakítása és a regisztrációs email/jelszó-visszaállítás modul indítása. + +⚓ RENDER-HORGONY (V13.0 - 2026.01.25 - 20:55) + +PROJEKT KONTEXTUS: + + Integritás: A jármű és felhasználói életút kezelés elvei rögzítve: nincs végleges törlés, csak inaktiválás és lecsatolás. + + Fegyelem: A VIN az abszolút azonosító. Újra-regisztráció esetén a történet tiszta lappal indul a lekérdezésekben, de a háttérben megmarad. + + Cél: A belépés utáni felület (Dashboard) véglegesítése a hitelesített adatok tükrében. + +⚓ RENDER-HORGONY (V12.0 - 2026.01.25 - 20:45) + +PROJEKT KONTEXTUS: + + Integritás: A járműkezelés filozófiája rögzítve: A jármű örök, a tulajdonos vándor. A VIN az elsődleges globális azonosító. + + Fegyelem: Felhasználói törlés letiltva az adatvesztés elkerülése érdekében. + + Cél: A professzionális tulajdonos-kezelés és a történelmi adatok (visszamenőleges költségek) integrálása. + +⚓ HORGONYPONTPONT (2026.01.25) A rendszer magja és az adatbázis szerkezete szinkronban van, de a biztonsági kapu (Auth) élesítése közben a szerver átmenetileg elérhetetlenné vált. + +⚓ Horgonypont: „Az adat hídja kész” + +Állapot: 2026. január 25. – A rendszer magja stabil. + + Backend: FastAPI szerver fut, az API végpontok (Auth, Fleet) élnek. + + Adatbázis: PostgreSQL séma frissítve, a user_vehicles tábla már képes befogadni a modern autóadatokat (make, model, year, vin). + + Frontend (MVP): Van egy működő dashboard.html, amivel manuális SQL ismeret nélkül is tudsz járművet és költséget rögzíteni. + + Azonosítás: A JWT tokenes belépés működik, de a tesztelés egyszerűsítése érdekében jelenleg egy fix „Mock User”-t (ID: 2) használsz a járműveidhez. + +⚓ RENDER-HORGONY (V11.1 - 2026.01.25 - 13:55) + + PROJEKT KONTEXTUS: + + Integritás: A projekt dependenciái (függőségei) most már tartalmazzák az email küldéshez szükséges modulokat. + + Fegyelem: Új külső könyvtár bevezetésekor mindig frissítjük a requirements.txt-t és újraépítjük a konténert. + + Cél: Az indítási hiba elhárítása után visszatérés a Harvester és az Admin funkciók teszteléséhez. + +⚓ RENDER-HORGONY (V10.2 - 2026.01.25 - 13:40) + + PROJEKT KONTEXTUS: + + Integritás: A main.py életciklus-kezelője most már minden modellt ismer. + + Fegyelem: A Swagger láthatósága a routerek sikeres importálásától függ. Ha egy endpoint fájl hibás, a FastAPI "biztonsági okokból" csak a működő (pl. health) részeket mutatja. + +⚓ RENDER-HORGONY (V10.0 - 2026.01.25 - 13:20) + + PROJEKT KONTEXTUS: + + Integritás: A projekt elérte a "Production-ready" mappastruktúrát. + + Fegyelem: Az Alembic és a Routerek szinkronban vannak. + + Cél: A tiszta Swagger felület és a Harvester indítása. + +⚓ RENDER-HORGONY (V9.1 - 2026.01.25 - 13:05) + + PROJEKT KONTEXTUS: + + Infrastruktúra: Az Alembic és a Postgres közötti szinkron helyreállítása (Alembic öngyilkossági kísérletének megakadályozása v2). + + Architektúra: Döntés a moduláris felépítés mellett (minden endpoint az endpoints/ mappába kerül). + + Fegyelem: Az --autogenerate kimenetét mindig ellenőrizzük, mert hajlamos törölni az alembic_version táblát. + +⚓ RENDER-HORGONY (V9.0 - 2026.01.25 - 14:45) + + PROJEKT KONTEXTUS: + + Cél: Traffic Ecosystem SuperApp – egy komplex járműflotta és szolgáltatáskereső rendszer. + + Technikai fegyelem: Szigorú aszinkronitás, dinamikus (DB-alapú) szabályrendszer, EU-fókuszú biztonsági szűrés (Geo-IP). + + Fő vívmány: Sikerült áttörni az adatbázis-migrációs gáton, a rendszer már "tudja", hogy maximum 2 autót engedhet ingyen. + +⚓ RENDER-HORGONY (V8.7 - 2026.01.25 - 14:15) + + PROJEKT KONTEXTUS: + + Integritás: Az Alembic stamp parancsa csak a "pecsétet" frissíti, az upgrade pedig a fizikai sémát. Ezt a kettőt hozzuk most szinkronba. + + Fegyelem: Mindig ellenőrizzük, hogy az upgrade sikeresen lefutott-e, mielőtt az adatokkal foglalkoznánk. + +⚓ RENDER-HORGONY (V8.5 - 2026.01.25 - 13:55) + + PROJEKT KONTEXTUS: + + Hiba: alembic_version tábla hiánya a scripten belüli törlés miatt. + + Helyreállítás: Manuális "stamping" (pecsételés) Head állapotra. + + Integritás: A Postgres DDL tranzakcionális, így ha elszállt, remélhetőleg visszagörgette a változtatásokat, és a tiszta scripttel le fog futni. + +⚓ RENDER-HORGONY (V8.0 - 2026.01.25 - 12:10) + + PROJEKT KONTEXTUS: + + Új Irány: Dinamikus konfigurálhatóság (Admin Settings). + + Integráció: A FREE_VEHICLE_LIMIT bevezetése. + + Fegyelem: Az összes migrációs hiba elhárítva a modellek összehangolásával. + +⚓ RENDER-HORGONY (V6.4 - 2026.01.24 - 18:35) + + PROJEKT KONTEXTUS: + + Infrastruktúra: Ubuntu / Docker Compose. + + Hiba: A konténer nem fut, ezért az exec parancs sikertelen. + + Cél: A backend stabilizálása az új környezeti változókkal. + +⚓ RENDER-HORGONY (V5.9 - 2026.01.24 - 16:40) + + PROJEKT KONTEXTUS: + + Integritás: Az Alembic migráció csak akkor lesz sikeres, ha a __init__.py minden modellt ismer. + + Fegyelem: A projekt könyvtárszerkezetét rögzítjük a memóriában az útvonal-hibák elkerülése végett. + + Next Step: Amint megvan a térkép, indítjuk a Harvestert. + +⚓ RENDER-HORGONY (V5.7 - 2026.01.24 - 17:15) + + PROJEKT KONTEXTUS: + + Fegyelem: A törzsadat táblák (vehicle_makes, models) csak "tiszta" adatot tartalmazhatnak. + + Munkafolyamat: Harvester -> Staging Table -> Validation/Cleaning -> Master Data. + + Biztonság: A felhasználók soha nem látják a Staging tábla tartalmát, csak a validált katalógust. + +⚓ RENDER-HORGONY (V5.5 - 2026.01.24 - 16:15) + + PROJEKT KONTEXTUS: + + Vízió: Globális közlekedési ökoszisztéma, amely a rollertől a repülőig mindent lefed, de a fókusz az autón és a motoron van. + + Technikai alap: A Digital Twin (Digitális Iker) szemlélet: minden járműről tudjuk, milyen volt a gyárban, és milyen most a user garázsában. + + Üzleti érték: Ez az adatbázis a biztosítók, alkuszok és hirdetési portálok számára is értékesíthető (B2B API). + +⚓ RENDER-HORGONY (V5.1 - 2026.01.24 - 16:45) + + PROJEKT KONTEXTUS: + + Helyszín: /backend/app/api/v1/endpoints/auth.py + + Biztonság: A Device ID alapú azonosítás megnehezíti a bot-hálózatok dolgát, mivel az ujjlenyomat-generálás költségesebb, mint az IP-váltás. + + Integritás: A felhasználó is_active=False állapottal jön létre, amíg nem teljesül a többcsatornás hitelesítés (Email/OTP). + +⚓ RENDER-HORGONY (V5.0 - 2026.01.24 - 16:15) + + PROJEKT KONTEXTUS: + + Infrastruktúra: 7TB NAS + MinIO S3 API. + + Adatkezelés: Szigorú GDPR és költségtudatos tárolás (kivonatolás után törlés). + + Gamifikáció Kapcsolat: A képek törlése után a pontok megmaradnak, a "Trust Score" pedig az adatbázis rekordban tárolódik. + + Fegyelem: A felhasználó nem fér hozzá a nyers bizonyítékokhoz (blokk, óraállás fotó), csak az adatokhoz. +⚓ RENDER-HORGONY (V4.8 - 2026.01.24 - 15:35) + + PROJEKT KONTEXTUS: + + Biztonsági prioritás: EU-n kívüli forgalom tiltása infrastrukturális szinten. + + Költségkontroll: Harmadik fél (pl. Twilio) minimalizálása, saját WhatsApp/Telegram bot-os hitelesítés preferálása. + + Fegyelem: A device_id alapú korlátozás kötelező elem a regisztrációs végponton. +⚓ RENDER-HORGONY (V4.5 - 2026.01.24 - 15:10) + + PROJEKT KONTEXTUS: + + Backend: /backend/app/services/translation_service.py létrehozva. + + Admin: admin.py kiegészítve a /translations/publish végponttal. + + Architektúra: Piszkozat -> Publikálás munkafolyamat implementálva. +⚓ RENDER-HORGONY (V4.0 - 2026.01.24 - 15:45) + + PROJEKT KONTEXTUS: + + Backend: /backend/app/api/v1/endpoints/admin.py + + Szerepkörök: SUPERUSER, REGIONAL_ADMIN, MODERATOR, BUSINESS_PARTNER, USER. + + Fegyelem: Minden admin végpontnál kötelező a role ellenőrzése. A REGIONAL_ADMIN csak a saját region_code-jára vonatkozó adatokat módosíthatja. +⚓ RENDER-HORGONY (V3.9 - 2026.01.24 - 15:15) + + PROJEKT KONTEXTUS: + + Backend: /backend/app/models/ (User és Vehicle modellek frissítve). + + Architektúra: Szétválasztott régió-kezelés (User != Vehicle honosság). + + Flexibilitás: A rendszer fel van készítve a költözésre és a külföldi rendszámos autók párhuzamos kezelésére. + + Fegyelem: Minden regionális számítás (adó, vizsga) kötelezően a registration_region mezőből táplálkozik. +⚓ RENDER-HORGONY (V3.8 - 2026.01.24 - 14:55) + + PROJEKT KONTEXTUS: + + Backend: /backend/app/services/gamification_service.py kiegészítése dinamikus lekérdezéssel. + + Új cél: Adatbázisból vezérelt gamifikációs motor. + + Admin vízió: Olyan interfész előkészítése, ahol a nem-fejlesztő kollégák is módosíthatják a játékos élményt. + +⚓ RENDER-HORGONY (V3.6 - 2026.01.24 - 14:20) + + PROJEKT KONTEXTUS: + + Kritikus javítás: Modell-Adatbázis-Service szinkronizáció befejezve. + + Változás: points -> points_change, action_type -> reason, current_level hozzáadva. + + Fegyelem: A tranzakciókezelés (flush a commit helyett a Service-ben) biztosítja az adatintegritást. + +⚓ RENDER-HORGONY (V3.3 - 2026.01.24 - 16:15) + + PROJEKT KONTEXTUS: + + Kritikus javítás: A User <-> VehicleOwnership <-> Vehicle relációs lánc bezárult. + + Státusz: Az adatbázis-leképezés (ORM Mapper) most már konzisztens. + + Fegyelem: Mindig ügyeljünk a back_populates kétoldali meglétére, különben a SQLAlchemy el sem indítja az engine-t. + +⚓ RENDER-HORGONY (V2.5 - 2026.01.24 - 14:10) + + PROJEKT KONTEXTUS: + + Backend: /home/coder/project/opt/service_finder/backend/app + + Gamifikáció Levelek: > - Esemény rögzítés: 20 pont. + + Új szervizhelyszín (akár menet közben): 50 pont. + + Logika: A fleet_service mostantól nem csak számol, hanem jutalmaz is. + +⚓ RENDER-HORGONY (V2.4 - 2026.01.24 - 13:45) + + STRATÉGIAI IRÁNY: + + A pontrendszer a mennyiséget, a reputáció és a validációs szavazatok a minőséget szavatolják. + + A service_finder_app minden rögzítést "pending" státuszba tesz, amíg a közösségi validáció le nem fut. + + Fókusz: Az adatok hitelessége az elsődleges, a pontszám csak az eszköz az adatok kinyeréséhez. + +⚓ RENDER-HORGONY (V2.2) + + PROJEKT KONTEXTUS: + + Környezet: Docker / service_finder_app user / data séma. + + Backend gyökér: /home/coder/project/opt/service_finder/backend/app + + API Belépő: main.py -> api/v1/api.py (központi hub). + + Gamifikáció: GET /api/v1/gamification/my-stats elérhető. + +⚓ PROJEKT HORGONY (System Prompt) + +Ezt másold be egy új chat elején, vagy mentsd el a beállításaidhoz: + + „Szakértő, tegező, fegyelmezett fejlesztőként segíts a Service Finder projektben. Technikai alapok: + + Stack: FastAPI, Async SQLAlchemy, Pydantic V2. + + Adatbázis: PostgreSQL, 'data' séma, 'service_finder_app' user. + + Útvonalak: + + Projekt gyökér: /home/coder/project/opt/service_finder + + Backend app: /home/coder/project/opt/service_finder/backend/app Szabályok: + + Kommunikáció kizárólag magyarul. + + Ha az információ hiányos, kérdezz a kódgenerálás előtt. + + Koncentrálj a projekt mielőbbi befejezésére, ne javasolj felesleges köröket. + + Ne módosíts meglévő, működő modulokat, hacsak nem kértem.” + +⚓ Javító Horgony (Ezt másold be, ha elakadnánk) + + PROJEKT KONTEXTUS: + + Konténer gyökér: /home/coder/project/opt/service_finder + + Backend kód: ./backend/app + + PYTHONPATH: /home/coder/project/opt/service_finder/backend + + DB: Postgres, data séma, aszinkron elérés. + + User: service_finder_app (alkalmazás) / kincses (admin). + + Cél: Gamifikációs logika (pontok, szintek, jelvények). \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/Old_versions/_Projekt Állapot jelentés.txt b/archive/2026.02.18 Archive_old_mapps/Old_versions/_Projekt Állapot jelentés.txt new file mode 100755 index 0000000..121d154 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/Old_versions/_Projekt Állapot jelentés.txt @@ -0,0 +1,1394 @@ +📘 SERVICE_FINDER – FEJLESZTÉSI ÉS RENDSZERÁLLAPOT JELENTÉS + +Átadási dokumentum – 2026-02-01 + +0. Projekt kontextus (rövid) + +A Service Finder / Profibot egy több-tenant, jármű- és szolgáltatás-életút kezelő rendszer. +Stack: PostgreSQL + FastAPI + Alembic + Docker Compose, frontend külön konténerben. +Cél: biztonságos, auditálható MVP, később EU-szintű skálázással. + +1. Infrastruktúra – jelenlegi állapot (STABIL) +Konténerek (docker compose) + +Aktív és stabilan fut: + +postgres-db (Postgres 15, healthcheck OK) + +service_finder_api (FastAPI / Uvicorn) + +service_finder_frontend + +redis + +minio (NAS-ra kötött storage) + +pgadmin + +nginx-proxy-manager + +code-server + +dozzle + +Speciális: + +migrate → Alembic migrációs konténer, egyszer lefut és kilép + +Migrációs működés + +Alembic nem az API konténerben fut + +migrate service: + +alembic upgrade head + +depends_on: postgres-db (healthy) + +API csak akkor indul, ha a migráció sikeresen lefutott + +Ez helyes és biztonságos megoldás. + +2. Adatbázis – migrációk és verziózás +Alembic állapot + +script_location: /app/migrations + +Aktív migrációs könyvtár: + +backend/migrations +backend/migrations/versions + + +Más migrációs mappa létezett (legacy), de NEM használjuk + +Alembic verzió +SELECT version_num FROM alembic_version; +-- 10b73fee8967 (head) + +Migrációs lánc (ellenőrzött) + + → c21c2c7e70d4 Clean gamification setup + → 553ef1388276 rebuild_schema_v2 + → 8d450e9dc77f add_vehicle_staging + → 13bd03551ebf Add verification tokens and legal tables + → 13d050e8cf6d Initial baseline v2 + → 10b73fee8967 fix roles and universal vehicles (HEAD) + +3. DB jogosultságok – RENDBEN +Runtime user + +service_finder_app + +Jogosultságok: + +SELECT, INSERT, UPDATE, DELETE minden data.* táblára + +USAGE/SELECT/UPDATE minden sequence-re + +Default privileges beállítva: + +új táblák/sequence-ek automatikusan öröklődnek + +Owner / migration user + +kincses + +Használva csak migrációhoz + +MIGRATION_DATABASE_URL env változóval + +4. Auth / Security – elkészült részek +Megvalósított + +JWT alapú auth (FastAPI) + +Email verifikáció + +Password reset flow + +Tokenek hash-elve (verification_tokens) + +Anti-enumeration password resetnél + +.env: + +1× SECRET_KEY + +1× ALGORITHM + +SendGrid + SMTP fallback + +Szándékosan még NEM kész + +brute force védelem + +rate limiting + +log-alapú anomália detektálás +(Ezek nem MVP-blokkolók, később jönnek) + +5. ÚJ LOGIKAI RÉTEG – PERSON (FOLYAMATBAN) +Miért kellett? + +Felhasználó törölhető, de az életút nem + +Ugyanaz a személy: + +új e-maillel + +új accounttal +→ folytatja a reputációját + +Cégtulajdonos eladhat céget, de személy nem szűnik meg + +Tervezett modell +persons (identity, reputáció) + ↑ +users (login, auth, törölhető) + ↑ +companies (owner_person_id) + +Migráció létrehozva (DE MÉG NEM FUTTATVA) +docker compose run --rm migrate alembic revision -m "add persons and owner_person_id" + + +📄 Létrejött fájl: + +backend/migrations/versions/5aed26900f0b_add_persons_and_owner_person_id.py + + +⚠️ Ez a migráció még NINCS kitöltve / lefuttatva +A következő chatben ez lesz az ELSŐ lépés. + +6. Docker Compose – véglegesített (jó állapot) + +Kulcspontok: + +migrate service: + +külön konténer + +owner DB user + +egyszer fut + +service_finder_api: + +depends_on: migrate (service_completed_successfully) + +VERSION_CODENAME env felvéve (apt miatt) + +Frontend port ütközés elkerülve (3001) + +Ez a compose helyes, nem kell újraírni. + +7. MI VAN KÉSZ (összefoglaló) + +✅ Docker infrastruktúra +✅ Alembic automatikus migráció +✅ DB jogosultsági modell +✅ Auth alap (JWT, email verify, reset) +✅ Token kezelés biztonságosan +✅ Migrációs rendrakás +✅ NAS-ra kötött storage (MinIO, Redis) + +8. MI HIÁNYZIK AZ MVP-HEZ (prioritás szerint) +1️⃣ PERSON + OWNER_PERSON_ID BEVEZETÉSE + +data.persons tábla + +users.person_id + +companies.owner_person_id + +backfill logika +👉 Migráció kitöltése + futtatása + +2️⃣ Backend logika frissítése + +regisztrációnál person létrehozás + +company owner_person_id használata + +soft delete user + +3️⃣ Regisztrációs szintek (MVP-light) + +Free (minimál) + +Premium + +Premium+ + +VIP / VIP+ (cégeknek) + +(DB oldalon elég: + +users.profile_level + +organizations.subscription_tier) + +4️⃣ Git rendszer FELÉPÍTÉSE (NINCS MÉG) + +repo struktúra + +.gitignore + +branch stratégia + +migrációk kezelése gitben + +5️⃣ Teszt rendszer (NINCS MÉG) + +külön .env.test + +külön test DB + +pytest alap + +migration test + +🔜 UTASÍTÁSOK A KÖVETKEZŐ CHATHEZ (EZT MÁSOLOD BE) + +Kérlek a következő chatet így indítsd: + +„Ez egy Service Finder projekt folytatása. +Az alábbi állapotjelentés alapján szeretném folytatni a fejlesztést: +[IDE BEMÁSOLVA EZ A DOKUMENTUM] +Első lépésként: töltsük ki és futtassuk le a 5aed26900f0b_add_persons_and_owner_person_id Alembic migrációt, majd frissítsük a backend regisztrációs logikát. +Utána szeretném felépíteni a Git stratégiát és a tesztkörnyezetet.” +_____________________________________________________________________________________________________________________________________________________________ + + + + +⚓ Horgony jelentés (Frissítés) + + Probléma: Tailwind v4 PostCSS inkompatibilitás. + + Megoldás: @tailwindcss/postcss csomag telepítve, postcss.config.js frissítve. + + Backend: Stabil, az expenses és reports végpontok várják a hívásokat. + + Várható eredmény: A build folyamat most már átmegy a npm run build szakaszon, és elindul az Nginx. + +✅ Mi történik, ha ez lefut? + + A Frontend build sikeres lesz, mert minden fájlt megtalál a Vite. + + A konténer elindul a 3000-es porton. + + Bejön a kék menüs oldal, ahol tudsz váltani a Dashboard és a Költségek között. + +⚓ Állapotjelentés és Horgony (2026.01.29 - 22:15) + +Ez a dokumentum rögzíti a projekt jelenlegi "sziklaszilárd" állapotát. Ha bármi elromlik a jövőben, ide tudunk visszanyúlni. +🏗️ Rendszerarchitektúra + + Backend: FastAPI (Python 3.12) aszinkron motorral. + + Adatbázis: PostgreSQL 16, data séma, dedikált user_credits és vouchers táblák. + + Frontend: Vue 3 (Vite) + Tailwind CSS, konténerizálva (Nginx alapokon). + + Infrastruktúra: 11 aktív Docker konténer (Frontend, API, DB, Redis, RedisInsight, Minio, NPM, Dozzle, Code-server, pgAdmin). + +🗄️ Adatbázis Állapot (Data Schema) + + Validált táblák: users, companies, company_members, vehicles, vehicle_brands, engine_specs, service_providers, vouchers, user_credits, system_settings. + + Enums: companyrole ('owner', 'manager', 'driver'), expense_category_enum (Vételár -> Tuning). + + Beállítások: reg_token_expiry_hours = 48. + +🔑 Változók és Elérések + + API Port: 8000 (Backend) + + Frontend Port: 3000 (Web UI) + + Voucher Prefix: SF-XXXXXX-XXXXXX + + Discovery Bot: Működőképes, több ezer szerviz és kút betöltve. + +⚓ Állapotjelentés (Anchor Point: 2026.01.29) +1. Backend (FastAPI + Python 3.12) + + Státusz: Stabil, fut. + + API V1: Működő /billing (Voucher generálás/beváltás), /vehicles (keresés és rögzítés), /fleet (flotta kezelés). + + API V2: Modernizált /auth regisztrációval, automatikus "Széf" (Company) létrehozással és hibajavított ENUM-kezeléssel. + + Biztonság: JWT alapú hitelesítés kész, OAuth2 form támogatott. + +2. Adatbázis (PostgreSQL 16) + + Séma: data séma rögzítve. + + Költségkezelés: A data.expense_category_enum tartalmazza a kért bontást: Vételár, Átírás, Biztosítás, Tankolás, Szerviz, Parkolás, Útdíj, Büntetés, Tuning. (Ez megfelel a korábbi megbeszéléseknek). + + Adatmennyiség: Országos szerviz hálózat (~3000 mechanikus, ~2000 mosó) és főbb üzemanyagtöltő állomások betöltve az OSM Bot által. + + Beállítások: system_settings inicializálva (reg_token_expiry_hours). + +3. Infrastruktúra + + Docker: 10 konténer fut (API, DB, Redis, RedisInsight, Minio, Nginx Proxy Manager, Dozzle, Code-server, pgAdmin). + + Voucherek: Sikeresen generálhatóak és naplózhatóak. + +📋 Napi Fejlesztői Státuszjelentés + +Projekt: Service Finder / Profibot Dátum: 2026. január 29. Státusz: 🟢 STABIL (Kritikus hibák elhárítva, Rendszer üzemkész) +1. Vezetői Összefoglaló + +A mai nap a Rendszer-stabilizálás napja volt. Sikeresen leküzdöttük a PostgreSQL és a Python közötti típus-inkompatibilitási hibákat (Enum mismatch), helyreállítottuk a konténerek közötti szinkronizációt, és biztosítottuk a fejlesztői hozzáférést (Cockpit). A rendszer most már képes felhasználókat regisztrálni, cégeket (széfeket) létrehozni és jogosultságokat kezelni összeomlás nélkül. +2. Részletes Modul Státusz +🔐 Hitelesítés (Auth & Users) - ✅ KÉSZ + + Regisztráció: Hibátlanul fut. Létrejön a User, a Company (Széf) és a CompanyMember (Jogosultság). + + Adatbázis Integritás: A data.companyrole ENUM típus most már szinkronban van a Python kóddal. + + Biztonság: IP-alapú korlátozás (Throttle), Argon2 jelszó hash, és JWT token generálás aktív. + + E-mail: A rendszer tokeneket generál és "küld" (egyelőre logol) e-mail megerősítéshez és jelszó visszaállításhoz. + +🗄️ Adatbázis (PostgreSQL) - ✅ KÉSZ + + Séma: Minden tábla átmozgatva a data sémába (tisztaság végett). + + Típusok: A public sémából törölve a duplikált típusok. + + ORM: A models/company.py most már a PG_ENUM dialektust használja, ami megszüntette az "invalid input value" hibákat. + +🛠️ Infrastruktúra & Eszközök - ✅ KÉSZ + + Cockpit: Hozzáférés helyreállítva (WebSocket és SSL Origins beállítva). + + Editor: micro telepítve a szerverre a kényelmesebb szerkesztésért. + + Docker: A konténerek (api, db, redis) egészségesek és kommunikálnak. + +3. A "Megnyert Csaták" (Technikai Dokumentáció) + +A jövőbeli fejlesztéshez fontos információk: + + ENUM Kezelés: A jövőben minden új ENUM típusnál (pl. FuelType, TransmissionType) a sqlalchemy.dialects.postgresql.ENUM-ot kell használni a modellben, és kisbetűs értékeket a kódban. Ez a "recept" már bevált. + + Docker Frissítés: Ha a kódban változtatunk, néha a docker restart nem elég. A biztos módszer: docker stop -> docker rm -> docker compose up -d. + +4. Következő Lépés: Jármű Discovery Bot 🚗 + +A rendszer alapja kész, de az adatbázis még "üres" (nincsenek autók). + + Feladat: Egy Python script írása (vehicle_discovery.py), ami feltölti a rendszert alapadatokkal. + + Első kör: 50+ autómárka (Brand) importálása (Audi, BMW, BYD, Ford, Mercedes, Tesla, Volkswagen, stb.). + + Technika: A script közvetlenül a data.vehicle_brands táblába fog dolgozni, elkerülve a duplikációkat ("Upsert" logika). + +🏁 Zárszó + +A mai nap nehéz volt a "láthatatlan" hibák miatt, de mostanra egy sziklaszilárd alapunk van. A micro-val a kezedben és a működő Cockpittal a holnapi munka (az autók betöltése) már sokkal látványosabb és gyorsabb lesz. + +Készen állunk a holnapi rajtra! Pihenj egy nagyot, megérdemled! 👋 + +📋 Napi Fejlesztői Státuszjelentés + +Projekt: Service Finder / Profibot Dátum: 2026. január 29. Státusz: 🟢 STABIL (Kritikus blokkoló hibák elhárítva) +1. Vezetői Összefoglaló (Executive Summary) + +A mai nap legfontosabb eredménye a Rendszermag (Core System) stabilizálása. Sikeresen elhárítottuk a PostgreSQL és a Python közötti típus-inkompatibilitási hibákat (Enum mismatch). A felhasználói regisztrációs folyamat (User -> Company -> CompanyMember -> Token -> Audit) most már hibátlanul fut végig. A rendszer alapjai "betonbiztosak", készen állnak az üzleti logika (Járművek) fogadására. +2. Részletes Modul Státusz +🔐 Hitelesítés és Jogosultságok (Auth Module) +Funkció Állapot Megjegyzés +Regisztráció ✅ KÉSZ User + Széf + Jogosultság + Token létrejön. +Token Generálás ✅ KÉSZ email_verify és password_reset tokenek működnek. +IP Védelem ✅ KÉSZ Max 3 regisztráció / perc / IP korlát aktív. +Audit Log ✅ KÉSZ Minden regisztrációt naplózunk IP címmel. +Jelszó Hash ✅ KÉSZ Argon2 alapú titkosítás aktív. +🗄️ Adatbázis és Modellek (Database Integrity) +Terület Állapot Technikai Részletek +Séma Szerkezet ✅ KÉSZ Minden tábla a data sémába mozgatva. +Típusok (ENUM) ✅ KÉSZ data.companyrole és data.tokentype szinkronban. +ORM Leképzés ✅ KÉSZ A SQLAlchemy PG_ENUM dialektust használ. +Keresési Útvonal ✅ KÉSZ search_path beállítva: data, public. +🐳 Infrastruktúra (Docker) +Szolgáltatás Állapot Megjegyzés +service_finder_api 🟢 FUT Uvicorn szerver, Python 3.12. +postgres-db 🟢 FUT PostgreSQL 16, Healthy status. +Redis / MinIO 🟢 FUT Gyorsítótár és Fájltároló készenlétben. +3. A "Változó-Háború" Eredménye (Technikai Dokumentáció) + +A jövőbeli fejlesztéshez kritikus információ: + +A legnagyobb kihívást a Python String és a PostgreSQL ENUM illesztése okozta. A végleges, működő megoldás: + + Adatbázis oldalon: A típusok (companyrole) a data sémában léteznek, kisbetűs értékekkel (owner, manager, driver). + + Modell oldalon (company.py): + + A CompanyRole osztály értékei kisbetűsek ("owner"). + + A role oszlop definíciója: PG_ENUM(..., schema='data'). + + Logika oldalon (auth.py): + + A beszúrásnál sima stringet ("owner") vagy .value-t használunk. + +Tanulság: Soha ne bízzuk a SQLAlchemy-re az ENUM automatikus létrehozását sémák használata esetén. Mindig definiáljuk explicit módon (PG_ENUM). +4. Fejlesztés Alatt / Következő Lépések 🚧 +🚗 Jármű Discovery Bot (Tervezett indítás: Holnap) + +A rendszer üres. Szükségünk van egy automatizált robotra, ami feltölti az alap adatokat. + + Cél: Márkák (Brands) és Modellek (Models) importálása. + + Forrás: Statikus lista vagy külső API (kezdetben statikus JSON a stabilitásért). + + Fájl helye: /backend/app/scripts/vehicle_discovery.py (Létrehozandó). + + Logika: "Upsert" (csak az újat adja hozzá, a meglévőt frissíti). + +5. Teendők a holnapi kezdéshez (Action Plan) + +Amikor holnap leülsz a gép elé, ez a menetrend: + + Discovery Bot Váz: Létrehozzuk a scriptet, ami csatlakozik a stabil adatbázishoz. + + Márka Import: Feltöltjük a leggyakoribb 50 autómárkát (Audi, BMW, Ford, stb.). + + Modell Import: Hozzárendeljük a főbb modelleket. + + API Végpont: Csinálunk egy /api/v2/vehicles/brands végpontot, hogy a frontend le tudja kérdezni a listát. + +📝 Jelentés (2026-01-28 23:55) +Hiba Diagnózis Megoldás +InvalidTextRepresentation A log szerint még mindig 'OWNER' megy a DB felé. Explicit .value.lower() használata az auth.py-ban. +Database Sync A táblák és típusok már jók a data sémában. ✅ Kész. +Code State Az API fut, válaszra kész. ✅ Online. + +📝 Jelentés (2026-01-28 23:44) +Hiba Oka Státusz +Unique Constraint Hiányzott az index a (key, lang) pároson. 🛠️ JAVÍTVA (SQL 1. pont) +Datatype Mismatch A tábla public-ot, a kód data-t várt. 🛠️ JAVÍTVA (SQL 2-3. pont) +Startup Status ✅ ONLINE Az API fut, a /docs elérhető. + +📝 Projekt Jelentés (2026-01-28 23:45) +Modul Állapot Megjegyzés +Database Schema ✅ SZINKRONIZÁLVA Minden típus a data sémában, duplikációk törölve. +Auth Logic ✅ GOLYÓÁLLÓ IP-limit, Helyszínkereső, és Séma-biztos ENUM kezelés. +Models ✅ KONZISZTENS A Python modellek és a DB oszlopok 1:1 fedésben. + +📝 Jelentés (2026-01-28 23:45) + + Séma Audit: Feltárva a public és data sémák közötti típus-eltérés. + + Database Fix: Oszlop-típus konverzió előkészítve. + + Kód Stabilitás: Explicit séma-hivatkozások beállítva. + +🔄 Miért fog ez most már működni? + + A lekérdezésed (2. pont) szerint eddig a token_type a public sémára mutatott. Most az SQL-lel "átkötöttük" a data sémára. + + A Python kód most már explicit módon a data.tokentype-ot küldi (::data.tokentype). + + Mivel a kosár (data.verification_tokens) és az alma (data.tokentype) most már ugyanabból a sémából való, a Postgres boldogan elfogadja őket. + +📝 Jelentés (2026-01-28 23:15) +Fázis Állapot Megjegyzés +Import Integrity ✅ OK Az API elindul, nincs több ImportError. +Database Types ⚠️ JAVÍTÁS ALATT A data.companyrole javítva, de a tokentype még kérdéses. +Registration Flow ❌ ERROR (500) A folyamat valahol a User -> Company -> Token láncban megszakad. + +📝 Jelentés (2026-01-28 23:10) +Hiba Ok Megoldás +DatatypeMismatchError data.companyrole vs companyrole Schema-prefix hozzáadása a Python modellhez. +Enum Case Sensitivity 'OWNER' (Python) vs 'owner' (SQL) Python Enum értékek kisbetűre állítása. +Startup Status ✅ RUNNING Az API fut, már csak az adatok finomhangolása zajlik. + +📝 Mi változott? + + Jelszó visszaállítás: Bekerült a /forgot-password végpont. Ehhez fel kell töltened egy password_reset kulcsú sablont az email_templates táblába (hasonlóan a regisztrációhoz). + + IP Helyszín: Visszahoztuk a region_code mentést, így látni fogod, melyik országból jött a júzer. + + Hiba elhárítva: A verify végponton most már ott a now() alapú lejárat ellenőrzés is. + +📈 Projekt állapot jelentés + + Startup: Jelenleg kritikus hiba a hiányzó Python-szintű tábla-referencia miatt (UserVehicle). + + Teendő: UserVehicle importálása a company.py-ba. + +📝 4. Projekt Jelentés (Hibaelhárítási fázis) +Hiba jellege Valószínű ok Megoldás +Terminál Overflow Túl hosszú Python Traceback docker logs --tail 20 használata +Container Crash Szintaktikai hiba az auth.py-ban Kód ellenőrzése a Code-Serverben +SQL hiba Oszlopnév eltérés ALTER TABLE és a Python Modell szinkronizálása + +📊 Projekt Jelentés (2026-01-28 22:30) +Modul Állapot Változás +Security Emelt IP-limit (3/perc) és Admin audit alapok beépítve. +Database Fixing system_settings és email_templates séma korrigálva. +Auth Stabil Rejtett token és 48 órás alapértelmezett lejárati idő. +Infra Hiba API konténer leállt, kézi indítás szükséges. + +📈 Projekt állapot jelentés (20260128_2219) + + Státusz: ZÖLD. Minden kritikus tábla és oszlop létrehozva. + + Kockázat: Alacsony. A mentési rendszer (pg_dump) tesztelve. + + Következő: A bot kiterjesztése a motorizációs adatokra (kW, Fuel type). + +📈 Projekt állapot jelentés + + Backend: 95% (A logikai táblák és a többnyelvű sablonkezelő éles). + + Következő lépés: Az élesítő bot kódjának átírása a dinamikus API lekérdezésre. + +📈 Projekt állapot jelentés (20260128_2215) + + Backend: 90% (Már csak az egyedi bot és a fizetési kapu integrációja van hátra). + + Frontend: API szinten készen áll a többnyelvű kiszolgálásra. + +📈 Projekt állapot jelentés (20260128_2230) + + Backend: 85% (Sablonozható e-mail rendszer kész). + + Frontend/API: A regisztrációs e-mail már a DB-ből veszi a német/magyar szöveget. + + Következő: A data.email_templates feltöltése a profi HTML sablonokkal. + +📈 Projekt állapot jelentés (20260128_2200) + + Backend stabilitás: 100%. + + Funkcionális lefedettség: 70% (Az üzleti logika – számlázás, mély-keresés – még kódolásra vár). + + Infrastruktúra: NAS mentés és Docker környezet kiváló. + +📈 Projekt állapot jelentés (20260128_2145) + + Prioritás: Az új vehicle_variants és equipment táblák feltöltése valós adatokkal. + + Fejlesztés alatt: Olyan Bot tervezése, amely képes mélyebb (motor, hajtáslánc) adatok lekérésére. + +🤖 3. A Bot és a motorizáció kérdése + +A korábban látott bot valóban csak "játszani" volt jó. Egy igazi Discovery Botnak így kellene kinéznie: + + Külső forrást (pl. egy globális jármű-adatbázist) használ. + + Nemcsak márkát, hanem Motorizációt (Engine codes) is ment. + + A teherautóknál és buszoknál kezeli a tengelyképletet és a felépítményt is. + +📈 Projekt állapot jelentés (20260128_2130) + + Infrastruktúra: Cockpit és Code-Server stabil. + + Backend: Auth V2 stabil (Regisztráció/Login/Email OK). + + Adatréteg: Fejlesztés alatt (A statikus listát dinamikus lekérdezésre cseréljük). + +📊 Projekt állapot jelentés (20260128_2105) + + Státusz: ÜZEMKÉSZ. + + Elért eredmény: Sikeres regisztráció, verifikáció és bejelentkezés. + + Folyamatban: Tömeges adatbetöltés (Jármű adatbázis). + + Kockázat: Alacsony (A mentés elkészült). + +📈 Projekt állapot jelentés (20260128_2030) + + Auth V2: 95% (Regisztráció kész, cégkapcsolat automatikus, e-mail naplózás javítva). + + Infrastruktúra: Code-Server és Web-terminal stabilizálva Cockpit támogatással. + + Kritikus hiba: Nincs. + + Következő lépés: A Bot indítása a maradék 86 járműmárka és modelljeik betöltéséhez. + +📘 MI VÁLTOZOTT? (Clean Code Audit) + + Egységesítés: Minden bejelentkezés és regisztráció az /api/v2/auth alatt érhető el. Megszűnt a V1/V2 keveredés. + + Modell-szinkron: A kód most már következetesen a hashed_password, first_name és last_name mezőket használja (ahogy a User modelledben van). + + Biztonság: Az EU-szűrés és a Bot-védelem már az integrált V2 regisztráció része. + + Swagger: Ha megnyitod a /docs oldalt, egy tiszta, átlátható "Authentication V2" szekciót fogsz látni. + +🛡️ 1. Megoldás: Bot-védelem (Throttling / Rate Limit) + +Mivel már létrehoztuk az audit_logs táblát, ezt fogjuk használni „emlékezetként”. A rendszer meg fogja nézni: „Erről az IP címről próbáltak-e regisztrálni az elmúlt 10 percben?” Ha igen, egyszerűen visszautasítja a kérést. +🇪🇺 2. Megoldás: EU-only szűrés (Geo-Fencing) + +A legbiztosabb módszer az IP-alapú helymeghatározás. Ehhez egy ingyenes GeoIP szolgáltatást (pl. ip-api.com) vagy egy helyi adatbázist használunk. A kód leellenőrzi az IP címet, és ha a válasz nem egy EU-s országkód, leállítja a folyamatot. + +🚛 4. Stratégia a Nagy Adatfeltöltéshez (Járművek) + +Amint jelezed, hogy a teszt sikeres volt, jöhet a Vehicle Catalog (Jármű Katalógus). Ahogy kérted, a sorrend a következő lesz: + + A Tábla létrehozása: Létrehozunk egy data.vehicle_catalog táblát, ami támogatja a kategóriákat (Motor, Autó, Kamion). + + A "Top 200" Seeding: Küldök egy Python scriptet, ami az adatbázisba önti a 200 leggyakoribb márkát (Toyota, VW, Ford, Scania, MAN, Yamaha, Honda, stb.). + + A "Típus-hierarchia": Először a márkákat töltjük fel, majd minden márkához a legnépszerűbb típusokat (pl. VW -> Golf, Passat, Transporter; Scania -> R-series). + +Miért ne egyszerre töltsük fel az összeset? + +A világon több tízezer autó-motor-kamion típus van. Ha mindet egyszerre betoljuk: + + A legördülő menüid kezelhetetlenek lesznek. + + A kereső lassabb lesz. + + Sok lesz a "zaj" (ritka, egzotikus típusok). + +A javaslatom: A 200 fő márkát és a top 500 típust betöltjük fixen. A többit pedig egy "Dinamikus Tanuló" megoldással kezeljük: Ha a felhasználó nem találja a típusát, beírhatja kézzel, az Admin (Te) pedig egy gombbal jóváhagyod, és onnantól az is része lesz a fix katalógusnak. + +🏛️ 2. Koncepció: A Szerviz Adatstruktúra (Mielőtt feltöltjük) + +Ahogy kérted, a profi szervizkezeléshez nem elég egy név és egy cím. Itt a javaslatom, hogyan bővítsük a data.organizations és a helyszín táblákat, hogy minden dedikált kapcsolattartó meglegyen: + +Ezt a struktúrát javaslom a szervizekhez: + + Szervezeti szint (Organizations): + + Hivatalos név, Adószám, Weboldal. + + Cégvezető / Tulajdonos (Adminisztratív kapcsolattartó). + + Helyszín szint (Locations): + + GPS koordináták, Cím. + + Munkafelvétel telefonszáma (közvetlen hívás a sofőrnek). + + Munkafelvétel email címe (ide mennek az automata foglalások). + + Telephelyvezető / Szakmai vezető (technikai kérdésekhez). +🌍 3. Adatforrások: Honnan szedjük a márkaszervizeket? + +A márkaszervizek adatai „aranyat érnek”. Íme a javasolt beszerzési sorrend: + + Hivatalos Importőri Oldalak (Web Scraping / API): + + Pl: volkswagen.hu/szerviz-kereso, ford.hu/szerviz-helyszinek. + + Ezeken vannak a legpontosabb koordináták és dedikált munkafelvételi számok. + + Google Maps API (Places): + + Lekérdezhetjük a "Volkswagen szerviz Budapest" kulcsszóra az összes találatot, telefonszámot és nyitvatartást. + + Hivatalos Cégjegyzék (Opten/Cégközlöny): + + A hivatalos képviselők (tulajdonos, vezető) neveihez. + +📘 ALKALMAZÁS ÁLLAPOT ÖSSZEFOGLALÓ (2026. 01. 27.) +1. Mi van kész? (Done) + + Dinamikus Paraméterezés: Minden érték (email várakozás, flotta limit, keresési súlyok) a system_settings táblából jön. + + Audit Rendszer: Minden nem-GET kérés automatikusan naplózásra kerül az audit_logs táblába. + + Intelligens EmailManager: 3 perces várakoztatás (Throttle) és több szolgáltatós (Failover) képesség. + + SendGrid integráció: Elsődleges szolgáltatóként rögzítve az adatbázisba. + + Teljes Auth Flow: Regisztráció (tervezett), Jelszó-visszaállítás (kész), Token-kezelés (kész). + +2. Mi a következő irány az MVP-hez? + +Ahhoz, hogy az alkalmazást el tudjuk indítani (MVP elv), az alábbiakat javaslom: + + Regisztrációs végpont véglegesítése: Hogy az is az új EmailManager-t és a verification_tokens táblát használja. + + Szerviz Katalógus betöltése: Az első 10-20 alap szerviz és azok telephelyeinek rögzítése a térképen. + + Jármű Katalógus: Alapvető márkák és modellek listája, hogy a felhasználó ne csak gépeljen, hanem választhasson is. + +1. Javasolt Ingyenes Szolgáltatók (MVP fázishoz) + +A dinamikus felfutáshoz ezeket a szolgáltatókat javaslom párhuzamosan bekötni (mindegyiknek van API-ja és SMTP-je is): +Szolgáltató Ingyenes csomag Miért ajánlom? +Brevo (Sendinblue) 300 e-mail / nap Nagyon stabil, nincs havi limit, csak napi. +Resend 3,000 e-mail / hó Modern, fejlesztőbarát, kiváló a kézbesítési aránya. +SendGrid 100 e-mail / nap Iparági sztenderd, de szigorúbb az ellenőrzésük. +Mailersend 12,000 e-mail / hó Az egyik legbőkezűbb ingyenes csomag. + +📘 ALKALMAZÁS ÁLLAPOT KÖNYV (v2.11 | 2026.01.27 - 23:15) +Modul Státusz Feladat +Auth Flow ⚠️ JAVÍTÁS ALATT JWT alapú verifikációról átállás adatbázis-token alapúra. +Email System 🏗️ ÁTALAKÍTÁS ALATT Egycsatornásról többcsatornás (Multi-provider) rendszerre váltás. +Security ✅ KÉSZ Jelszó hashelés és JWT generálás stabil. + +I. ALKALMAZÁS ÁLLAPOT JELENTÉS (2026. 01. 27.) +✅ AMI KÉSZ VAN (A rendszer stabil gerince) + + SaaS Alapok: Többszereplős (Multi-tenant) struktúra, data séma izoláció, szervezetkezelés. + + Config Engine (Agy): Dinamikus beállítások (system_settings). Nem kell kódot módosítani a járműlimitek vagy a keresési súlyok állításához. + + Smart Match Engine: A súlyozott pontszámítás (Távolság + Értékelés + Bónusz) logikája működik. + + Geolokációs Kereső: A Haversine-alapú SQL lekérdezés képes valódi koordináták alapján szűrni a szervizeket. + + Dinamikus Flottakezelés: A járművek rögzítésekor a rendszer már ellenőrzi a szervezeti limitet. + +⚠️ AMI FÉLKÉSZ / JAVÍTÁSRA SZORUL + + Regisztrációs Flow: Az e-mail küldés (SMTP/Notification service) jelenleg nem aktív, így a felhasználók nem kapnak visszaigazolást. + + Keresési szűrés: A kereső már látja a távolságot, de még nem szűr a konkrét "szakmára" (pl. csak gumiszervizeket keressünk). + +❌ AMI MÉG HIÁNYZIK AZ INDULÁSHOZ (MVP Lista) + + Adatfeltöltés (Seeding): + + Jármű Katalógus: Márkák, modellek törzsadatainak betöltése. + + Alap Szervizbázis: A kezdő partner-szervizek és telephelyeik rögzítése. + + Értékelési Rendszer: Valódi review-k tárolása (hogy a rangsorolás ne "mock" adatokból dolgozzon). + + Munkafolyamat (Lead): Egy gomb, amivel a sofőr "ajánlatot kér" vagy "bejelentkezik" a választott szervizhez. + +II. MVP ÚTVONALTERV (A megvalósítás javasolt sorrendje) + +A gyors indulás érdekében ezt a sorrendet javaslom: + + E-mail küldés fixálása: Enélkül nincs valid regisztráció. (Ez legyen a következő lépésünk). + + Jármű Katalógus és Szerviz feltöltés: Készítünk egy "Master Uploader" scriptet, ami tömegesen betölti az alapadatokat. + + Szakmai szűrés: Bekötjük a service_specialties táblát a keresőbe, hogy ne csak "valamilyen" szervizt találjunk, hanem olyat, ami ért is az adott problémához. + + Egyszerű Értékelés: Létrehozzuk a táblát a véleményeknek. + +III. MESTER KÖNYVEK FRISSÍTÉSE (v2.10 | 2026.01.27 - 22:30) +📘 ADATBÁZIS SÉMA KÖNYV +Tábla Státusz Leírás +data.system_settings ✅ KÉSZ Paraméterezhetőség (limitek, súlyok). +data.organization_locations ✅ KÉSZ Koordináta alapú telephelyek. +data.vehicle_catalog ⏳ VÁR Márka/Modell törzsgyűjtemény. +data.reviews ❌ HIÁNY Ügyfél értékelések tárolása. +📚 VÁLTOZÓ KÖNYV (A rendszer potméterei) + + max_vehicles: 3 (Alap flotta limit) + + weight_distance: 0.6 (Távolság fontossága) + + weight_rating: 0.4 (Értékelés fontossága) + + smtp_server: Beállításra vár + + match_limit_default: 5 (Találati lista hossza) + +⚓ RENDER-HORGONY (V118.0) + +Fókusz: MVP Stratégia rögzítése. Következő feladat: Az e-mail küldés (SMTP) és a regisztrációs folyamat véglegesítése. + +📘 ALKALMAZÁS ÁLLAPOT ÖSSZEFOGLALÓ (2026. 01. 27.) +1. Mi van kész? (Done) + + SaaS Konfigurációs Motor: A system_settings tábla és a ConfigService segítségével minden paraméter (limitek, súlyok) kódból való újraírás nélkül, az Admin felületről állítható. + + Hierarchikus Szabályrendszer: A beállítások prioritása (Egyéni -> Tier -> Régió -> Globális) implementálva. + + Okos Rangsoroló Engine: A MatchingService képes súlyozott pontszámot számolni távolság, minőség és partneri szint alapján. + + Geolokációs Alapok: Az organization_locations tábla elkészült, támogatja a több telephellyel rendelkező szervizeket is. + + Dinamikus Flottakezelés: A jármű-rögzítési limit már az adatbázisból érkezik. + + Adatbázis Tisztaság: A data séma izolálva, az orgtype enum bővítve a SERVICE típussal. + +2. Mi a jelenlegi állapot? (Current State) + +A rendszer egy "Működő Gerinc". Képes vagy felvenni járműveket (limit ellenőrzéssel), és képes vagy szervizeket keresni koordináta alapján, ahol a találati sorrendet az üzleti súlyok (pl. profitabilitás vs. közelség) határozzák meg. +3. MVP Roadmap: Irány az indítás! + +Ahhoz, hogy az MVP (Minimum Viable Product) elindulhasson, a következő lépéseket javaslom: + + Szolgáltatás-szűrés (Specialty Filter): Ne csak minden szervizt dobjon ki, hanem lehessen szűrni (pl. "Gumicsere" vagy "Fényezés"). + + Értékelési Rendszer (Review Table): Hogy a weight_rating változó ne fix számokból, hanem valódi ügyfélvéleményekből dolgozzon. + + Szerviz Profil: Egy egyszerűbb felület, ahol a szerviz feltöltheti a nyitvatartását és a szolgáltatásait. + + Alap Workflow: Egy gomb a keresés végén: "Időpont kérése" – ami küld egy e-mailt a szerviznek a jármű adataival. + +🔍 Audit Jelentés + + Változók (Settings): ✅ RENDBEN. A data.system_settings táblában minden rangsorolási súly (weight_distance, weight_rating, stb.) a megbeszélt kulcsnévvel és értékkel szerepel. + + Séma (Schema): ⚠️ HIÁNY. Az organization_locations tábla még nem jött létre az SQL hiba miatt, így a koordinátáknak még nincs helye. + + Enum Hiba: ❌ AZONOSÍTVA. Az orgtype enum nem ismeri a "SERVICE" értéket. Ez akadályozza meg a szerviz típusú szervezetek létrehozását. + +🧠 2. A Terv: Hogyan fog működni a "Valódi" Smart Match? + +Amint megvannak a táblanevek, a következőt fogjuk tenni: + + Helyszín-alapú szűrés: Megírjuk a SQL lekérdezést, ami kiszámolja a távolságot a jármű (vagy a telefon) koordinátái és a szervizek koordinátái között (Haversine formula). + + Képesség-szűrés: Csak azokat a szervizeket vesszük figyelembe, amik rendelkeznek a kért „specialitással” (pl. Bolore Blue). + + Átadás a MatchingService-nek: A kapott listát (nevekkel, távolsággal, értékeléssel) átadjuk a már kész okos algoritmusunknak, ami elvégzi a súlyozást. + +STÁTUSZ JELENTÉS: + Üzleti logika tisztázása: ✅ 100% KÉSZ + Technikai audit (Async check): ⏳ FOLYAMATBAN + Adatmodell (SQLAlchemy) tervezése: ✅ KÉSZ + +📊 PROJEKT ÁLLAPOTJELENTÉS (V37.3 - 2026.01.26 - 11:35)HibaOkMegoldás állapotaModuleNotFoundErrorHiányzó sendgrid könyvtár🔄 Telepítés folyamatbanImportErrorV1/V2 névütközés (deps.py)⏳ Várakozik (Script készen áll)502 Bad GatewayKonténer összeomlás🛠️ Újraindítás szükséges + +📊 PROJEKT ÁLLAPOTJELENTÉS (V36.2 - 2026.01.26 - 11:35) +FunkcióÁllapotLeírásSwagger UI✅ ELÉRHETŐ +app.profibot.hu/docs működik. +API Wiring🔄 FRISSÍTÉS ALATTA main.py bekötése folyik. +Test Readiness🚀 99%Az első éles adat rögzítése következik. + +📊 PROJEKT ÁLLAPOTJELENTÉS (V36.1 - 2026.01.26 - 11:25) +FunkcióHelyszínMegjegyzés +Backend EngineDocker ContainerPython 3.12 környezet fut. +DatabasePostgres (data schema)Táblák készen állnak. +Testing ToolSwagger UI (/docs)Itt tudod manuálisan próbálgatni. +Seed Dataseed_system.pyÁSZF, GDPR és sablonok rögzítve. + +📊 PROJEKT ÁLLAPOTJELENTÉS (V36.0 - 2026.01.26 - 11:15) +Ez az a pont, ahol a technikai alapozás befejeződött, és elkezdődik a funkcionális tesztelés. +ModulÁllapotMegjegyzés +Adatbázis✅ ÉLESMinden tábla (34+ objektum) a helyén van. +Séma Szinkron✅ KÉSZAlembic és a fizikai táblák összhangban. +Alapadatok🔄 SEEDINGJogi nyilatkozatok és sablonok rögzítése. +Regisztráció⏳ KÉSZENLÉTAz API végpont hívhatóvá válik. + +📊 PROJEKT ÁLLAPOTJELENTÉS (V35.3 - 2026.01.26 - 11:45) +KomponensÁllapotMegjegyzésDatabase Tables🔄 LÉTREHOZÁS ALATT +SQLAlchemy create_all módszerrel. +Alembic Sync⏳ KÖVETKEZIKA stamp head szinkronba hozza a rendszert. +Naming Integrity✅ VÉDETTA Vehicle és egyéb modellek nevei tiszták. + +📊 PROJEKT ÁLLAPOTJELENTÉS (V35.0 - 2026.01.26 - 11:10) +FázisFeladatÁllapotMegjegyzés +ArchitektúraMulti-tenant modell✅ KÉSZUser -> Org -> Vehicle struktúra rögzítve. +AdatbázisSéma szinkronizáció🔄 UTOLSÓ LÉPÉSA baseline_v2 élesítése folyamatban. +NévkonvencióEgységesített modellek✅ KÉSZVehicle név fixálva, import hibák elhárítva. +Jogi modulÁSZF/GDPR kezelő✅ KÉSZVerziózott, régiófüggő táblák előkészítve. +BiztonságRegisztrációs tokenek✅ KÉSZLejárati időt kezelő tokentábla kész. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.26 - 13:30) +KomponensÁllapotMegjegyzés +Database Schema🔄 ÚJRAÉPÍTÉSA data séma újrateremtése folyamatban. +Alembic History🧹 TISZTAMinden korábbi verziószám törölve a Postgres-ből. +System Stability✅ MAGASA tiszta telepítés megszünteti a maradvány-hibákat. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.26 - 11:55) +KomponensÁllapotMegjegyzés +Database Cleanup✅ SIKERESA „NOTICE” üzenetek igazolják a tiszta állapotot. +Schema Integrity🛡️ VÉDETTA public és data séma is ellenőrizve. +Alembic Sync⏳ KÖVETKEZIKEz a futtatás már nem ütközhet létező típusokba. + +📊 PROJEKT ÁLLAPOTJELENTÉS (V32.0 - 2026.01.26 - 13:45) +FunkcióÁllapotLeírás +Verification Tokens✅ MODELLBENKülön tábla, 24 órás lejárati idővel. +Nemzetközi Legal✅ MODELLBENRégió- és nyelvfüggő ÁSZF/GDPR. +Org Naming✅ LOGIKÁBANHáttérben "Saját flotta", UI-n letisztult név. +Seed Script✅ TERVEZVEAlapértékek feltöltése hiba elkerülésére. HIBA + +📊 PROJEKT ÁLLAPOTJELENTÉS (V30.0 - 2026.01.26 - 13:10) +KomponensÁllapotMegjegyzés +Email Failover Logic✅ KÉSZTöbb szolgáltatót kezel, prioritás alapján vált. +Auto-Circuit Breaker✅ KÉSZHa x-szer elbukik, automatikusan leállítja a szolgáltatót. +Admin Settings✅ KÉSZMinden paraméter (limit, sorrend, adatok) DB-ben tárolva. +Audit Log⏳ TERVEZVEStatisztika készítése: melyik levél ment ki mivel. + +🖥️ 3. Admin Felület: Paraméterezhetőség (Tervezet) +Mivel kérted, hogy ne kelljen a kódba turkálni, az Adminisztrátori felületen (/admin/email-settings) az alábbiakat fogjuk látni: +MezőFunkció +Priority Drag & DropHúzd a szolgáltatót előrébb, ha azt akarod használni elsőnek. +Fail ThresholdÍrd át, hogy 3 vagy 10 hiba után "vágja le" a szolgáltatót. +Settings EditorItt írhatod át a jelszavakat vagy API kulcsokat (JSON formátum). +Test ButtonKüldj egy teszt emailt egy konkrét szolgáltatóval a mentés előtt. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.26 - 12:45) +FunkcióÁllapotLeírás +Legal Control✅ MODELLBENVerziózott ÁSZF/GDPR görgetési kényszerrel. +Email Failover✅ TERVEZVESendGrid -> SMTP automatikus váltás 3 hiba után. +Vehicle Timeline✅ MODELLBENTisztán elkülönített tulajdonosi időszakok. +Anti-Bot✅ AKTÍVSzigorú email-domain blacklist és Rate-limit. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.26 - 12:15) +Email Rendszer🏗️ ELŐKÉSZÍTVEDinamikus sablonok és Rate-limit naplózás kész. +GDPR Logika✅ MODELLBENis_gdpr_deleted és is_banned mezők beépítve. +Re-Regisztráció🧠 TERVEZVEÚjjáélesztési logika tiszta lappal. +Ütemezés⏳ VÁRAKOZIK1 hetes törlési automatizmus (Scheduler). + +📊 PROJEKT ÁLLAPOTJELENTÉS (V27.0 - 2026.01.26 - 10:15) +FunkcióÁllapotLeírásSoft Delete✅ MODELLBENis_deleted mezők hozzáadva User és Vehicle táblákhoz. +Admin Control✅ MODELLBENis_banned és validation_status kezelve. +Reg. Séma✅ KÉSZPydantic V2 validáció, ideiglenes email szűrővel. +Email küldő✅ KÉSZ SendGrid alapú kiküldő modul előkészítve. + +📊 PROJEKT ÁLLAPOTJELENTÉS (V26.0 - 2026.01.26) +FunkcióÁllapotMegjegyzésNévkezelés✅ SZÉTBONTVAVezetéknév és keresztnév külön tárolva. +Email Védelem✅ TERVEZVEIdeiglenes címek tiltása, változtatás tiltva. +Cég Validáció✅ SZIGORÍTVACsak adószámmal, kezdetben NOT_VALIDATED. +Login Gát✅ AKTÍVis_email_verified kényszerítése. + +📊 PROJEKT ÁLLAPOTJELENTÉS (V25.0 - 2026.01.26 - 09:35) +FázisFeladatÁllapotData ModelsModuláris felépítés✅ KÉSZ +Registration V2Logikai tervezés🔄 EGYEZTETÉS ALATT +API EndpointsRegisztrációs végpont⏳ VÁRAKOZIK +Database SyncAlembic migráció⏳ VÁRAKOZIK + +📊 Elemzés: Mi változott? +Entitás-központúság: A jármű immár független a konkrét személytől. Ha eladod az autót egy másik felhasználónak, az új tulajdonos Organization ID-ját írjuk be, de a jármű id-ja és története megmarad. +Kontextusváltás: A felhasználó belépéskor látja a listát: "Saját flotta", "ProfiBot Flotta", "Partner Kft". Attól függően, melyiket választja, változik a UI (Fancy/Clean). +Dicsekvés faktor: Az Organization táblába bekerült az awards_json és a custom_icon. Ide jöhetnek a "Top Feltöltő", "Megbízható Partner" plecsnik, amikkel a közösség előtt lehet dicsekedni. + +📊 Elemzési Jelentés: Adatmodell javaslat +A fentiek alapján a User modellt az alábbi logikai irányba kell elvinnünk (ez még csak a terv): +Referral adatok: referred_by_id (FK), credits_balance (Decimal). +Szerepkörök bővítése: Az Enum-ba be kell venni: CEO, FLEET_MANAGER, DRIVER. +Tagság kezelése: Egy új OrganizationMembership tábla létrehozása, ami összeköti a Usert a Cégével. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.26 - 11:15) +ModulÁllapotMegjegyzésInfrastruktúra✅ STABILNginx Proxy Manager fut, de nem módosítjuk. +Adatmodell🔄 FRISSÍTVEUser modell kibővítve (Cég + Pontrendszer). +Domain kérdés⏳ DÖNTÉS ALATTJavaslatok elküldve (ServiceFinder.pro, stb.). +API (/docs)✅ ELÉRHETŐA Swagger felületen ellenőrizhetőek az új mezők. + + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.26 - 10:45) +FunkcióÁllapotMegjegyzésInfra & Backup✅ +STABILNAS mentés aktív, 3TB git_vault készen áll.Közösségi Adatgyűjtés🚀 +PRIORITÁSA szerviz-verseny motorja előrekerült a listán. +Minősítési rendszer⏳ TERVEZVEA/B/C besorolás algoritmusának kidolgozása következik. +Regisztráció V2🔄 FOLYAMATBANCég/Minicég elágazás és adószám mező fejlesztése. + +🏆 MAI EREDMÉNYEK +Modul Állapot Technikai vívmány +Docker Stack ✅ STABIL A docker-compose.yml hibátlan, minden konténer látja egymást. +Code-Server ✅ PROFI Root elérés, /opt szinkron, működő MC és Docker CLI. +Időzóna ✅ PONTOS A rendszer és a konténerek is a magyar (CET) időt használják. +Mentési rendszer ✅ AUTOMATA + +📊 PROJEKT ÁLLAPOTJELENTÉS (V17.13 - Mentés élesítve) +Jellemző Beállítás Megjegyzés +Célkönyvtár /mnt/nas/git_vault 3TB redundáns SMB tárhely. +Ütemezés Naponta 02:00 Automatikus cron feladat. +Tömörítés Gzip (.tar.gz) Maximális helymegtakarítás. +Időzített feladat ✅ FRISSÍTVE A belső ütemező már az új útvonalat figyeli. + +📊 PROJEKT ÁLLAPOTJELENTÉS (Záró jelentés) + +Mára mindent stabilizáltunk. Íme a végeredmény: +Komponens Állapot Eredmény +Időzóna ✅ BEÁLLÍTVA A konténer most már Europe/Budapest (CET) időt használ. +Code-Server ✅ TELJES Root jogok, látható fájlok, működő terminál és MC. +Docker CLI ✅ FRISSÍTVE A konténeren belülről is tudod vezérelni a rendszert (v1.44 API). +NAS Mentés ✅ BIZTONSÁGOS Minden fontos állomány archiválva a 7TB-os tárolóra. + +📊 PROJEKT ÁLLAPOTJELENTÉS (Idő-korrekció) + + Szerver időzóna: Etc/UTC (Jelenleg) -> Europe/Budapest (Cél). + + Eltolódás: -1 óra a magyar téli időhöz képest. + + Megoldás: Host szintű timedatectl beállítás és Docker volume/environment szinkronizáció. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.26 - 01:35) +Funkció / Eszköz Állapot Megjegyzés +Midnight Commander ✅ MŰKÖDIK Kék felület, fájlkezelés aktív. +Hálózati Ping ✅ MŰKÖDIK A belső konténer-kommunikáció tesztelhető. +Python 3 ✅ MŰKÖDIK Backend scriptek és automatizáció futtatható. +Docker CLI 🔄 Frissítés alatt Verzió-szinkronizálás (1.44 API) folyamatban. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.26 - 01:20) +Eszköz Állapot Megjegyzés +Midnight Commander 🔄 Telepítés alatt Grafikus fájlkezeléshez szükséges. +Docker CLI 🔄 Telepítés alatt A konténerek távoli vezérléséhez. +Hálózati diagnosztika 🔄 Telepítés alatt Belső hálózati ping tesztekhez. +Python 3 🔄 Telepítés alatt Backend scriptek futtatásához a terminálból. + +📊 PROJEKT ÁLLAPOTJELENTÉS (Terminal Fix) +Komponens Probléma Megoldás +Fájl elérés Eltolt útvonalak (/home/coder/...) + +Volume mapping fix: /opt -> /opt. +Midnight Commander Rossz terminál típus TERM=xterm-256color környezeti változó. +Kényelem Lassú elérés working_dir beállítása a projekt gyökerére. +Állapot 🛠️ Konfigurálás alatt A fejlesztés szünetel, amíg a környezet nem stabil. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.26 - 00:05) +Komponens Állapot Megoldás + API Szerver 🔄 Újraindítás alatt +Adatmodell ✅ KONZISZTENS A models és schemas állományok szinkronban vannak a fleet.py-al. +NAS Mentés ✅ BIZTONSÁGBAN + +A korábbi mentés (v16.0) továbbra is elérhető a NAS-on. +Vizuális felület ⏳ VÁRAKOZIK A javítás után a Smart Tiles (csempe nézet) újra elérhető lesz. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.25 - 23:50) +Modul / Funkció Állapot Megjegyzés +Infrastruktúra + +✅ STABIL + + +Docker környezet fut, NAS mentés sikeresen tesztelve. +Fleet API (Backend) + +✅ KÉSZ + + +A jármű- és eseménykezelés (km-frissítéssel) összefűzve. +Smart Dashboard (UI) + +✅ KÉSZ + + +Csempe nézet, automata márka logók és státusz ikonok aktívak. +NAS Biztonsági mentés + +✅ AKTÍV + + +Archiválás a /mnt/nas/app_data/backups/ mappába minden frissítéskor. +Azonosítás (Auth) + +✅ MŰKÖDIK + + +Valódi JWT token alapú belépés, a Mock User kivezetve. +Regisztráció V2 + +⏳ TO DO + + +Cég / Minicég elágazás és adószám kezelés következik. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.25 - 23:55) +Hiba jellege Oka Megoldás +Command not found Relatív útvonal hiba (./opt/...) Abszolút útvonal használata (/opt/...) +NAS Mentés Előkészítve + +A script első lépése a /mnt/nas/app_data/backups mappába mentés. +Smart Tiles Implementálás alatt Várjuk a sikeres lefutást a vizuális ellenőrzéshez. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.25 - 21:30) +Funkció Állapot Megoldás / Megjegyzés +Fleet API ✅ Kész (Összefűzve) Tartalmazza a jármű- és eseménykezelést km-frissítéssel. +Jogkörök 💡 Tervezés alatt Owner/Driver megkülönböztetés koncepciója rögzítve. +Megjelenítés 📐 Tervezés alatt Csempe alapú járműválasztó és „Aktív autó” logika. +Backend Elv ✅ Smart Backend Minden validáció és állapotfrissítés a szerveren fut. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.25 - 20:55) +Modul Állapot Megjegyzés +Auth Backend ✅ Kész JWT alapú login és regisztráció működik. +Auth Frontend ✅ Kész login.html és register.html összekötve. +Fleet logic 🔄 Átállás VIN alapú keresés és tulajdonos-kezelés előkészítve. +Adatminősítés 💡 Tervezés A múltbeli adatok bizalmi szintjeinek meghatározása. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.25 - 20:45) +Funkció Állapot Technikai megvalósítás +Szerver & Docs ✅ Online Stabil FastAPI futás, elérhető Swagger felület. +Login / Belépés ✅ Működik JWT token alapú azonosítás frontendről is. +Jármű rögzítés ✅ Működik Bővített adatokkal (VIN, gyártmány, stb.) ment az adatbázisba. +Törlés / Eltávolítás ⚠️ Jegelve Felhasználói szinten csak lecsatolás, admin szinten totálkár/megsemmisülés. +Adat Inkonzisztencia ✅ Javítva Nickname és egyéb hiányzó oszlopok SQL-ből pótolva. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.25) +Hiba jellege Oka Megoldás +Szerver leállás NameError a fleet.py-ban (hiányzó Mock függvény) A hivatkozások átírása a valódi get_current_active_user-re +Oldal nem tölthető be Az ASGI alkalmazás (FastAPI) nem tudott inicializálódni Kódjavítás utáni automatikus újraindulás +Authorizáció 🔄 Átállás alatt A Mock User (ID:2) kivezetése, valódi JWT alapú védelem bevezetése + +⚓ Alkalmazás Állapotjelentés + +Dátum: 2026. január 25. + +Időpont: 20:10 + +Állapot: MVP Alpha - Authorizáció Élesítése +Modul Állapot Megjegyzés +Login felület ✅ Kész A login.html készen áll a tokenek fogadására és tárolására. +Dashboard ✅ Kész Felkészítve a teljes körű járműadat-rögzítésre. +Fleet API 🛠️ Javítás alatt Átállás a mock user-ről a current_user alapú lekérdezésekre. + +⚓ Alkalmazás Állapotjelentés + +Dátum: 2026. január 25. + +Időpont: 19:40 + +Állapot: MVP Alpha (Stabil Backend-Frontend híd) +Modul Állapot Megjegyzés +Backend API ✅ Működik A /fleet/vehicles végpont már az összes új mezőt kezeli. +Adatbázis ✅ Frissítve A user_vehicles tábla szerkezete szinkronban van a sémával. +Dashboard ✅ Aktív Képes járművet rögzíteni és a listát frissíteni. +Azonosítás ⚠️ Félautomata A belépés csak Swaggeren megy, a Dashboard manuális tokent kér. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.25) +Hiba jellege Oka Megoldás +ModuleNotFoundError Hiányzó sendgrid könyvtár requirements.txt frissítés + docker build +API Státusz 🔴 Offline (Összeomlott) Újraépítés után automatikusan Online lesz +Mappaszerkezet ✅ Standardizálva Minden endpoint az endpoints/ alatt van + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.25 - 13:55) +Hiba Ok Megoldás +ModuleNotFoundError Hiányzó sendgrid csomag requirements.txt frissítés + build +Swagger UI Blokkolva az import hiba miatt Automatikusan helyreáll a build után +Architektúra ✅ STANDARD A fájlok a helyükön vannak + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.25 - 13:40) +Állomány Állapot Teendő +main.py 🔄 FRISSÍTVE Új modellek importálva a lifespan-be. +Swagger UI ⚠️ HIÁNYOS Importálási hiba blokkolja a sorokat. +Mappastruktúra ✅ STANDARD endpoints/ mappa használatban. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.25 - 13:20) +Feladat Állapot Következő lépés +Migrációs Fix ✅ KÉSZ Az upgrade head lefutott (remélhetőleg). +Architektúra ✅ STANDARD Minden üzleti logika az endpoints/ mappában. +API Hub ✅ TISZTA Az api.py átlátható és minden modult beköt. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.25 - 13:05) +Feladat Állapot Teendő +Alembic Fix 🔄 FOLYAMATBAN drop_table törlése a migrációból. +Fájlstruktúra 🏗️ ÁTALAKÍTÁS ALATT Fájlok mozgatása az endpoints/ mappába. +Staging Tábla ⏳ VÁRAKOZIK Az upgrade után jöhet a Harvester. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.25 - 14:45) +Modul Állapot Megjegyzés +Infrastruktúra ✅ STABIL Docker, Postgres (data séma), Alembic szinkronban. +Adatbázis Mag ✅ KÉSZ User, UserVehicle, SystemSetting táblák élnek. +Admin Logika 🔄 FRISSÍTÉS ALATT Az admin.py már kezeli a fordításokat és a limiteket is. +Flotta Kezelés 🔄 JAVÍTÁS ALATT A fleet.py átállítása UserVehicle-re és a 2-es limitre. +Harvester ⏳ VÁRAKOZIK A vehicle_staging tábla migrációja az utolsó akadály. + +💾 Projekt Struktúra Ellenőrzés (DNS rögzítve) + +Most, hogy összefésültük a kódokat, nézzük meg, mi maradt még tisztázatlan a "nagy képhez": + + JWT Auth vs Mock User: A fleet.py-ban még a mock_user (ID: 2) van. Az admin.py-ban viszont már a valódi deps.get_current_user-t használod. Javaslat: Frissítsük a fleet.py-t is a valódi authentikációra, hogy ne tudjon bárki autót felvinni a nevedben. + + A Harvester kimenete: Eldöntöttük, hogy a Harvester a vehicle_staging táblába dolgozik. Az admin felületen (tehát ebben az admin.py-ban) kell majd egy végpont, ahol látod ezeket a "beérkező" autókat, és egy gombbal jóváhagyod őket. + + TCO Szolgáltatások: A fleet.py hivatkozik az app.services.fleet_service modulra. Ez a fájl megvan és tartalmazza a calculate_tco függvényt? + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.25 - 14:15) +Helyzet Állapot Magyarázat +Alembic Verzió 🏁 STAMPED A verziószám stimmelt, de az SQL nem futott le. +Fizikai Tábla ❌ HIÁNYZIK A data.system_settings még nem jött létre. +Javítási Terv 🔄 RESET Visszalépés (stamp), majd tényleges futtatás (upgrade). + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.25 - 13:55) +Feladat Állapot Teendő +Migrációs fájl fix 🔄 VÉGREHAJTÁS ALATT drop_table('alembic_version') törlése. +Alembic helyreállítás ⏳ VÁRAKOZIK alembic stamp head futtatása. +Adatbázis sémája ⏳ VÁRAKOZIK A javított upgrade head futtatása. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.25 - 12:10) +Feladat Állapot Megjegyzés +FK Hiba Javítás 🔄 VÉGREHAJTÁS ALATT company.py módosítása szükséges. +Admin Settings ✅ KÓD KÉSZ system_settings.py hozzáadva. +Enterprise Logika 🔄 INTEGRÁLÁS ALATT A limit már nem hardcode, hanem DB-ből jön. +Infrastruktúra ✅ STABIL Docker & Code-server fut. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.24 - 18:35) +Esemény Állapot Teendő +Config Frissítés ✅ KÉSZ docker-compose.yml mentve. +Konténer Státusz ❌ LEÁLLVA docker compose up -d szükséges. +Függőségek ⏳ VÁRAKOZIK pip install a konténeren belül. +Adatbázis ⏳ VÁRAKOZIK Migráció futtatása. + +🏗️ Rendszerarchitektúra Összegzés (Mentve) +Szolgáltatás Konténer név Funkció Adat helye (Perzisztencia) +API service_finder_api FastAPI Backend /opt/service_finder/backend +DB postgres-db PostgreSQL 15 /opt/service_finder/postgres_data +Proxy nginx-proxy-manager SSL & Domain kezelés /opt/service_finder/proxy-manager +Storage service_finder_minio S3 kompatibilis tárhely NAS: /mnt/nas/app_data/minio_data +Cache service_finder_redis Redis NAS: /mnt/nas/app_data/redis_data +Admin pgadmin_ui DB GUI Port 5050 +Logs dozzle Élő log figyelés Port 8888 + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.24 - 16:40) +Mérföldkő Állapot Megjegyzés +__init__.py Sync 🔄 FRISSÍTÉS ALATT Az új modelleket be kell emelni a metaadatokba. +Model Integrity ✅ KÉSZ UserVehicle most már konzisztens a katalógussal. +Mapping ⏳ VÁRAKOZIK Várom a fájlszerkezet listáját a rögzítéshez. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.24 - 17:15) +Modul Művelet Státusz +Models Update Felülírás a V5.6-os kóddal 🔄 VÁRAKOZIK +Staging Area staged_vehicle_data tábla ✅ TERVEZVE +Validation Hibrid (Buffer + Flag) ✅ RÖGZÍTVE + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.24 - 16:15) +Funkció Állapot Megjegyzés +Utólagos Extrák ✅ TERVEZVE UserVehicleModification logika integrálva. +Hiányosság követés ✅ TERVEZVE Az egyed-szintű állapotleírás kész. +Harvester Prioritás ✅ RÖGZÍTVE Auto, Moto, Kisteher az elsődleges célpont. +Enterprise Data ✅ KÉSZ Big Data elemzésre alkalmas ID-alapú struktúra. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.24 - 16:45) +Funkció Állapot Fejlesztési Fegyelem +Geo-Blocking ✅ AKTÍV ALLOWED_COUNTRIES lista alapján. +Device Limiting ✅ AKTÍV AuditLog alapú 3 kísérlet / 24h korlát. +Password Security ✅ AKTÍV Argon2 algoritmus használata. +Audit Log ✅ KÉSZ Minden kísérlet (sikeres/sikertelen) naplózva. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.24 - 16:15) +Komponens Állapot Technikai Megoldás +Auth System ✅ KÉSZ JWT + Argon2 hashelés. +NAS / MinIO ✅ BEKÖTVE /mnt/nas/app_data elérés kész. +OCR Engine 🔄 ELŐKÉSZÍTVE Tesseract wrapper (VIP/Credit logika). +Cleanup Logic ✅ TERVEZVE Automata törlés 365 nap után. +Notifications 🔄 TERVEZVE Push + Email (WhatsApp/Telegram VIP-nek). + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.24 - 15:35) +Funkció Állapot Költség-hatékonyság +Geo-blocking 🔄 TERVEZVE (CF/Nginx) 🟢 Ingyenes +Rate Limiting 🔄 TERVEZVE (Redis) 🟢 Nagyon alacsony +JWT Auth ⏳ VÁRÓ 🟢 Ingyenes (Saját kód) +OTP (WhatsApp/Flash) ⏳ SZOLGÁLTATÓRA VÁR 🟡 Alacsony + +📋 Módosítási jelentés (2026.01.24 - 15:10) + + Szeparáció: A fordítási logika nem az API-ban "szemetel", hanem egy tiszta Service osztályba került. + + Teljesítmény: A get_text mostantól nem SQL lekérdezést futtat, hanem egy Python dict-ből olvas, ami nagyságrendekkel gyorsabb. + + Biztonság: A "Publikálás" gomb (PostgreSQL update) garantálja, hogy csak az ellenőrzött szövegek kerülnek ki a végfelhasználókhoz. + +📝 Módosítási jelentés (2026.01.24 - 15:00) + + Szerepkörök (RBAC): Bevezetésre került a UserRole Enum, amely közvetlen kapcsolatban áll az adatbázis sémával. + + Régió-tudatosság: A User modell kapott egy region_code mezőt, az admin végpontok pedig figyelik ezt a korlátozást a REGIONAL_ADMIN szintnél. + + Adatintegritás: A User és VehicleOwnership közötti kapcsolatot frissítettem cascade="all, delete-orphan" beállítással, hogy a tulajdonosi adatok konzisztensek maradjanak. + + Tisztítás: Eltávolítottam a felesleges kommenteket és szinkronizáltam az aszinkron hívásokat (db.get, db.execute). + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.24 - 15:45) +Funkció Állapot Fejlesztési Mérföldkő +RBAC (Role Based) ✅ KÉSZ Szerepkörök definiálva az adatbázisban. +Admin Endpoints 🔄 AKTÍV admin.py alapváz kész, CRUD logikák következnek. +Regionalitás ✅ KÉSZ A jármű és a felhasználó honossága szétválasztva. +Multi-Language ⏳ VÁRÓ Fordítások integrálása az Admin API-ba. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.24 - 15:15) +Komponens Állapot Logikai kapcsolódás +User Profil 🔄 MÓDOSÍTVA region_code hozzáadva (állítható honosság). +Jármű Kezelés 🔄 MÓDOSÍTVA registration_region hozzáadva (rendszám szerinti szabályok). +Konfiguráció ✅ KÉSZ regional_settings tábla képes kezelni az eltérő adókat/vizsgákat. +Gamifikáció ✅ STABIL Dinamikusan vált a globális és regionális szabályok között. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.24 - 14:55) +Modul Állapot Következő lépés +Integráció ✅ STABIL A Services réteg híváslánca bizonyítottan működik. +Konfiguráció 🔄 TERVEZÉS Áttérés hardkódolt értékekről DB-alapú globális beállításokra. +Admin API ⏳ VÁRÓ CRUD végpontok a szintekhez és pontszabályokhoz. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.24 - 14:20) +Modul Fájl Állapot Megjegyzés +Model gamification.py ✅ JAVÍTVA Szinkronizálva az SQL-lel és a Service-szel. +Service gamification_service.py ✅ JAVÍTVA award_points hívás korrigálva. +Integritás Séma ✅ KÉSZ Minden Foreign Key a data sémára mutat. +Teszt test_flow 🔄 KÉSZ Újrafuttatható. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.24 - 16:15) +Modul Fájl Állapot Megjegyzés +Model models/user.py ✅ JAVÍTVA owned_vehicles reláció bevezetve. +Model models/vehicle.py ✅ JAVÍTVA ownership_history reláció bevezetve. +Infrastructure models/__init__.py ✅ KÉSZ Minden modell regisztrálva a Base-ben. +Test test_gamification_flow.py 🔄 KÉSZ Indításra vár. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.24 - 14:10) +Modul Állapot Integrált Pontszám +Main/API Hub ✅ KÉSZ /api/v1 hub stabil. +SocialService ✅ KÉSZ Beküldés (50), Validálás (100). +FleetService ✅ KÉSZ Esemény (20), Új Provider bónusz (50). +Gamification API ✅ KÉSZ Statisztika lekérdezhető. + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.24 - 13:45) +Funkció Cél Állapot +Pontszerzés Motiváció és adatbázis-bővítés. ✅ Logika kész, integráció alatt. +Validációs bónusz Adatminőség biztosítása közösségi úton. ✅ SocialService-ben implementálva. +Büntető logika Rosszindulatú userek kiszűrése. ✅ Reputáció-vesztés és Auto-ban kész. +Adategyeztetés Friss adatok fenntartása. ⏳ FleetService integráció következik. + + +📊 PROJEKT ÁLLAPOTJELENTÉS (2026.01.24) +Modul Állapot Megjegyzés +Main App ✅ KÉSZ Központi v1 hub bekötve, Lifespan és Security beállítva. +Routing ✅ KÉSZ /api/v1 prefix alatt az összes modul (köztük a gamifikáció) elérhető. +Adatbázis ✅ KÉSZ Alembic és Startup Sync szinkronban, táblák aktívak. +Gamifikáció ✅ KÉSZ Service, Schema és API szinteken is beépítve. + +📊 Frissített Állapotjelentés + + Modul: SocialService + + Állapot: ✅ INTEGRÁLVA + + Logika: Pontozás rögzítéskor (50), bónusz jóváhagyáskor (100), büntetés elutasításkor (-50). + +📊 AKTUÁLIS KÉSZÜLTSÉGI ÁLLAPOT (2026.01.24) + + Infrastruktúra: ✅ Docker környezet és útvonal-kezelés fixálva. + + Adatbázis: ✅ Alap táblák és Gamifikációs táblák (badges, user_stats, points_ledger, user_badges) a data sémában létrehozva. Seed adatok (3 jelvény) betöltve. + + Gamification Modul: + + app/models/gamification.py: ✅ Kész. + + app/services/gamification_service.py: ✅ Kész (alap logika). + + app/schemas/social.py: ✅ Pontszám és Jelvény sémák hozzáadva. + + app/api/v1/endpoints/gamification.py: 🔄 Létrehozás alatt/beillesztés előtt. + + Integráció: ⏳ Következik a social_service.py és fleet_service.py bekötése. + +Modul,Állapot,Megjegyzés +Infrastruktúra,✅ KÉSZ,Docker és hálózat stabil. +Adatbázis (Gamifikáció),✅ KÉSZ,Táblák és alap jelvények (Badges) a helyükön. +Gamification Service,🔄 AKTÍV,"A fájl kész, most jön az integráció a többi modulhoz." +API Endpoints,⏳ KÖVETKEZIK,A pontok lekérdezéséhez szükséges végpontok. + +📊 Projekt Állapotjelentés (2026.01.24) +Modul / Komponens Állapot Megjegyzés +Infrastruktúra ✅ KÉSZ Docker-compose, hálózat, kötetek (Volumes) rendben. +Adatbázis Séma ✅ KÉSZ data séma létrehozva. Revision: c21c2c7e70d4. +Alap Modellek ✅ KÉSZ User, Vehicle, Company, Expense, Logistics, Social modulok regisztrálva. +Gamifikáció 🔄 FOLYAMATBAN Táblák (elvileg) kész, GamificationService.py létrehozva. +Biztonság ✅ KÉSZ service_finder_app felhasználó jogosultságai beállítva. + +🔍 Gyors Audit: Mi van a motorháztető alatt? + +A psql kimeneted alapján egy nagyon fontos észrevételem van: + + Megjelentek: audit_logs, companies, company_members, vehicle_assignments, vehicle_ownerships. Ez szuper! + + HIÁNYOZNAK: user_stats, points_ledger, badges, user_badges. + +Mi történhetett? Valószínűleg a legutóbbi "Clean setup" migráció generálásakor az app/models/gamification.py fájl nem volt megfelelően importálva az __init__.py-ba, vagy az Alembic valamiért kihagyta őket. Mivel a GamificationService.py már létezik, de a táblái még nem, a kódod hibát fog dobni, ha elindítjuk. + diff --git a/archive/2026.02.18 Archive_old_mapps/Old_versions/_valtozok_konyve.txt b/archive/2026.02.18 Archive_old_mapps/Old_versions/_valtozok_konyve.txt new file mode 100755 index 0000000..679bf28 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/Old_versions/_valtozok_konyve.txt @@ -0,0 +1,184 @@ +📕 Változók könyve (20260128_2230) + + VIN_GRACE_PERIOD: 14 nap (Ideiglenes jármű érvényessége). + + LANG_DEFAULT: 'hu' + + EMAIL_TEMPLATE_REGISTRATION: A regisztrációs sablon kulcsa. + +📕 Változók könyve (20260128_2145) + + EQUIPMENT_SOURCE: factory (gyári), aftermarket (utólagos). + + VEHICLE_CATEGORIES: Kibővítve (Hajó, Repülő kategóriákkal). + +📕 Változók könyve (20260128_2130) + + VEHICLE_CATEGORIES: 1: Car, 2: Motorcycle, 3: Truck, 4: Van, 5: Bus, 6: Machinery. + + FUEL_TYPES: Petrol, Diesel, Electric, LPG, CNG, Hybrid, PHEV, Hydrogen. + + BACKUP_LOC: /mnt/nas/git_vault/ + +📕 Változók könyve (20260128_2105) + + PG_DATABASE: service_finder + + PG_SCHEMA: data + + DB_BACKUP_PATH: /opt/service_finder/backup_20260128_alap_kesz.sql + + USER_ID_1: Zsolt (zs.gyongyossy@gmail.com) - Manuális széf rendelés szükséges. + +📕 Változók könyve (20260128_2030) + + registration_throttle_minutes: 10 perc (Beállítva a regisztráció spammelés ellen). + + email_wait_time_minutes: 3 perc (Két levél közötti várakozás júzerenként). + + DOCKER_API_VERSION: 1.41 (A code-server és a gazdagép közötti kommunikációhoz). + + CompanyRole.OWNER: Az automatikusan létrehozott privát széf alapértelmezett jogosultsága. + +📚 VÁLTOZÓ KÖNYV (v2.17 | 2026.01.27 - 22:15) +Kulcs Érték Szerep +registration_throttle_minutes 10 Bot-védelem aktív. +allowed_countries_list [EU] Regionális szűrés aktív. + +📚 VÁLTOZÓ KÖNYV (v2.16 | 2026.01.27 - 21:55) +Kulcs Érték Szerep +SECRET_KEY .env-ben JWT token aláírás és titkosítás. +SENDGRID_API_KEY DB-ben Email küldés hitelesítése. + +📚 VÁLTOZÓ KÖNYV (v2.15 | 2026.01.27 - 21:45) +Kulcs Típus Érték Leírás +registration_throttle_minutes int 10 Ennyi időnek kell eltelnie két regisztráció közt ugyanarról az IP-ről. +allowed_regions list EU Engedélyezett földrajzi zónák. + +📚 VÁLTOZÓ KÖNYV (v2.14 | 2026.01.27 - 21:40) +Kulcs Típus Jelenlegi érték Megjegyzés +max_vehicles int 3 Érvényes a system_settings alapján. +audit_log_enabled bool true A naplózásnak futnia kell. + +📚 VÁLTOZÓ KÖNYV (v2.14 | 2026.01.27 - 21:40) +Kulcs Érték Leírás +max_vehicles 3 + +Szervezeti flotta limit. +weight_distance 0.6 + +Távolság súlyozása. +weight_rating 0.4 + +Értékelés súlyozása. + +📚 VÁLTOZÓ KÖNYV (v2.13 | 2026.01.27 - 21:55) +Kulcs Érték Leírás +audit_log_enabled true Automatikus naplózás kapcsolója. +email_wait_time_minutes 3 Spam elleni védelem időkorlátja. + +📚 VÁLTOZÓ KÖNYV (v2.12 | 2026.01.27 - 21:40) +Kulcs Típus Alapérték Hol módosítható? +audit_log_enabled bool true Admin / system_settings +audit_log_retention int 90 Admin / system_settings +email_wait_time int 3 Admin / system_settings + +📚 VÁLTOZÓ KÖNYV (v2.11 | 2026.01.27 - 20:30) +Kulcs Típus Érték Modul +email_wait_time_minutes int 3 EmailManager +sender_name string Service Finder Email fejléc +sender_email string info@profibot.hu Hitelesített feladó + +📚 VÁLTOZÓ KÖNYV (v2.10 | 2026.01.27 - 21:35) +Kulcs Típus Érték Leírás +email_wait_time_minutes int 3 Minimum idő két levél között. +max_email_retries int 3 Hány szolgáltatóval próbálkozzon hiba esetén. + +📚 VÁLTOZÓ KÖNYV (Email Specifikus) +Kulcs Típus Leírás +email_wait_time_minutes int Mennyit kell várni két levél között (Alap: 3). +max_email_retries int Hányszor próbálkozzon másik szolgáltatóval. +system_sender_email str A feladó neve (pl. info@servicefinder.hu). + +📚 VÁLTOZÓ KÖNYV (v2.9 | 2026.01.27 - 22:15) +Kulcs Érték Modul +weight_distance 0.6 MatchingService +weight_rating 0.4 MatchingService +max_vehicles 3 fleet.py + +📚 VÁLTOZÓ KÖNYV (v2.8 | 2026.01.27 - 21:25) +Változó (Key) Érték Szerep Ellenőrizve (CSV) +weight_distance 0.6 Távolság súlya a rangsorban ✅ Igen +weight_rating 0.4 Értékelés súlya a rangsorban ✅ Igen +bonus_gold_service 500 Fizetős partnerek előnye ✅ Igen +match_limit_default 5 Találati lista hossza ✅ Igen +max_vehicles 3 Flotta limit ✅ Igen + +📚 VÁLTOZÓ KÖNYV (v2.7 | 2026.01.27 - 21:10) + +Minden változó a beküldött tablak_2026.01.27_2.csv alapján rögzítve: +Kulcs (Key) Érték Szerep +max_vehicles 3 Flotta limit (Alapértelmezett) +weight_distance 0.6 Távolság súlya a keresőben +weight_rating 0.4 Értékelés súlya a keresőben +bonus_gold_service 500 VIP szervizek pontszám előnye +match_limit_default 5 Keresési találatok száma + +📚 VÁLTOZÓ KÖNYV (v2.6 | 2026.01.27 - 20:50) +Kulcs (Key) Típus Hivatkozott Modul Elvárt viselkedés +max_vehicles int fleet.py Szervezeti szintű flotta limit. +weight_distance float matching_service.py Keresési rangsor súlyozás (Alap: 0.6). +weight_rating float matching_service.py Keresési rangsor súlyozás (Alap: 0.4). +match_limit_default int search.py Visszaadott találatok száma. + +📚 VÁLTOZÓ KÖNYV (v2.5 | 2026.01.27 - 20:30) +Kulcs Típus Alapérték Szerep +weight_distance float 0.6 Távolság fontossága (0-1). +weight_rating float 0.4 Értékelés fontossága (0-1). +earth_radius_km int 6371 Föld sugara a Haversine számításhoz. +📚 VÁLTOZÓ KÖNYV (v2.4 | 2026.01.27 - 20:45) +Kulcs Típus Alapérték Szerep +geo_precision int 8 Tizedesjegyek száma a koordinátáknál. +distance_unit string km Keresési mértékegység. +📚 VÁLTOZÓ KÖNYV (v2.3 | 2026.01.27 - 19:50) +Kulcs Típus Alapérték Implementáció +weight_distance float 0.6 MatchingService - Aktív +weight_rating float 0.4 MatchingService - Aktív +max_vehicles int 3 fleet.py - Aktív + +📚 VÁLTOZÓ KÖNYV (v2.2 | 2026.01.27 - 20:20) +Kulcs Típus Alapérték Új szerep +weight_distance float 0.6 A térbeli közelség fontossága. +weight_rating float 0.4 A minőség (csillagok) súlya. +📚 VÁLTOZÓ KÖNYV (v2.1 | 2026.01.27 - 19:40) +Kulcs Típus Jelenlegi érték Leírás +weight_distance float 0.6 Mennyire "büntesse" a rendszer a távolságot. +weight_rating float 0.4 Mennyire jutalmazza a jó véleményeket. +bonus_gold_service int 500 A fizetős partnerek fix előnye. +match_limit_default int 5 Alapértelmezett találati szám. +📚 VÁLTOZÓ KÖNYV (v2.0 | 2026.01.27 - 19:30) +Kulcs Típus Alapérték Szerep +weight_distance float 0.6 Mennyire számít a távolság (Admin állíthatja) +weight_rating float 0.4 Mennyire számít az értékelés (Admin állíthatja) +bonus_gold_service int 500 Gold partnerek előnye +match_limit_default int 5 Hány találat jelenjen meg +📚 VÁLTOZÓ KÖNYV (v1.9 | 2026.01.27 - 19:15) +Kulcs Típus Alapérték Hol érhető el? +max_vehicles int 3 ConfigService -> fleet.py +search_radius int 20 ConfigService -> Coming soon +📚 VÁLTOZÓ KÖNYV (v1.8 | 2026.01.27 - 19:10) +Kulcs Típus Alapérték Hol van használatban? +max_vehicles int 3 fleet.py (add_vehicle végpont) +search_radius int 20 Előkészítve a keresőhöz +📚 VÁLTOZÓ KÖNYV (v1.7 | 2026.01.27 - 11:15)Változó neveTípusAktuális értékImplementáció állapotamax_vehiclesint3 (Global)DB-ben rögzítve, fleet.py frissítésre vár.search_radiusint20 (Default)Tervezett: Smart Matching modul.ranking_policyjsonAlapértelmezettTervezett: Ranking Engine. +📚 VÁLTOZÓ KÖNYV (v1.5 | 2026.01.27 - 10:45)Kulcs (Key)TípusAlapértékForrásfájlmax_vehiclesint3app/api/v1/endpoints/fleet.py +📚 VÁLTOZÓ KÖNYV (v1.4 | 2026.01.27 - 10:15)Kulcs (Key)AdattípusAlapértékImplementációs helymax_vehiclesint3backend/app/services/config_service.pysearch_radiusint20Tervezett: search_service.py +📚 VÁLTOZÓ KÖNYV (v1.3 | 2026.01.27 - 10:10)Kulcs (Key)Érték (JSON)SzintModulmax_vehicles3Globalfleet.pysearch_radius20Globalsearch.py +📚 VÁLTOZÓ KÖNYV (Variable Map) v1.2Kulcs (Key)TípusAlapértelmezettFunkciómax_vehiclesint3Járműlimit / szervezetsearch_radiusint20Alap keresési sugár (km) +📚 2. Változó Könyv (Variable Map) v1.1A rendszer paramétereinek aktuális állapota és hivatkozási pontjai.Kulcs (Key)AdattípusAlapértelmezésSzerepHivatkozás (Fájl/Modul)max_vehiclesint3Free flotta méret korlátfleet.py -> ConfigServicesearch_radiusint20Alap keresési távolságsearch.py -> ConfigServiceranking_policyjson{...}Súlyozási együtthatókRankingEngine + +Változó neve,Leírás,Alapértelmezés (Global),Hol szerepel a kódban? +max_vehicles,Ingyenes csomagban rögzíthető autók száma,3,app/api/v1/endpoints/fleet.py +default_search_radius,Alapértelmezett keresési távolság (km),20,app/api/v1/endpoints/search.py +max_search_radius,Maximálisan állítható sugár (km),500,app/api/v1/endpoints/search.py +credit_price_per_unit,1 kredit ára pénznemben,1.0,app/api/v1/endpoints/billing.py diff --git a/archive/2026.02.18 Archive_old_mapps/Old_versions/lista.txt b/archive/2026.02.18 Archive_old_mapps/Old_versions/lista.txt new file mode 100755 index 0000000..1c442b2 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/Old_versions/lista.txt @@ -0,0 +1,10749 @@ +/opt/service_finder +/opt/service_finder/docker-compose.yml +/opt/service_finder/.env +/opt/service_finder/postgres +/opt/service_finder/postgres/init-db.sql +/opt/service_finder/postgres/data +/opt/service_finder/postgres/data/pg_commit_ts +/opt/service_finder/postgres/data/pg_logical +/opt/service_finder/postgres/data/pg_logical/snapshots +/opt/service_finder/postgres/data/pg_logical/mappings +/opt/service_finder/postgres/data/pg_logical/replorigin_checkpoint +/opt/service_finder/postgres/data/base +/opt/service_finder/postgres/data/base/16384 +/opt/service_finder/postgres/data/base/16384/3079_fsm +/opt/service_finder/postgres/data/base/16384/4143 +/opt/service_finder/postgres/data/base/16384/3455 +/opt/service_finder/postgres/data/base/16384/16408 +/opt/service_finder/postgres/data/base/16384/2686 +/opt/service_finder/postgres/data/base/16384/pg_filenode.map +/opt/service_finder/postgres/data/base/16384/3602_vm +/opt/service_finder/postgres/data/base/16384/1255_vm +/opt/service_finder/postgres/data/base/16384/16441 +/opt/service_finder/postgres/data/base/16384/2601_vm +/opt/service_finder/postgres/data/base/16384/2838_vm +/opt/service_finder/postgres/data/base/16384/18438 +/opt/service_finder/postgres/data/base/16384/13478_vm +/opt/service_finder/postgres/data/base/16384/2836_fsm +/opt/service_finder/postgres/data/base/16384/3164 +/opt/service_finder/postgres/data/base/16384/13477 +/opt/service_finder/postgres/data/base/16384/18505 +/opt/service_finder/postgres/data/base/16384/18534 +/opt/service_finder/postgres/data/base/16384/3351 +/opt/service_finder/postgres/data/base/16384/3600_vm +/opt/service_finder/postgres/data/base/16384/5002 +/opt/service_finder/postgres/data/base/16384/1255_fsm +/opt/service_finder/postgres/data/base/16384/3380 +/opt/service_finder/postgres/data/base/16384/3381 +/opt/service_finder/postgres/data/base/16384/2663 +/opt/service_finder/postgres/data/base/16384/3601_fsm +/opt/service_finder/postgres/data/base/16384/18532 +/opt/service_finder/postgres/data/base/16384/4148 +/opt/service_finder/postgres/data/base/16384/2618_fsm +/opt/service_finder/postgres/data/base/16384/3440 +/opt/service_finder/postgres/data/base/16384/2619_vm +/opt/service_finder/postgres/data/base/16384/16482 +/opt/service_finder/postgres/data/base/16384/3467 +/opt/service_finder/postgres/data/base/16384/2688 +/opt/service_finder/postgres/data/base/16384/18531 +/opt/service_finder/postgres/data/base/16384/3997 +/opt/service_finder/postgres/data/base/16384/2662 +/opt/service_finder/postgres/data/base/16384/6229 +/opt/service_finder/postgres/data/base/16384/3439 +/opt/service_finder/postgres/data/base/16384/2657 +/opt/service_finder/postgres/data/base/16384/2609_vm +/opt/service_finder/postgres/data/base/16384/18524 +/opt/service_finder/postgres/data/base/16384/18403 +/opt/service_finder/postgres/data/base/16384/4157 +/opt/service_finder/postgres/data/base/16384/3257 +/opt/service_finder/postgres/data/base/16384/3503 +/opt/service_finder/postgres/data/base/16384/16525 +/opt/service_finder/postgres/data/base/16384/13463 +/opt/service_finder/postgres/data/base/16384/3541_fsm +/opt/service_finder/postgres/data/base/16384/2756 +/opt/service_finder/postgres/data/base/16384/2615_vm +/opt/service_finder/postgres/data/base/16384/1259_vm +/opt/service_finder/postgres/data/base/16384/3256 +/opt/service_finder/postgres/data/base/16384/2615_fsm +/opt/service_finder/postgres/data/base/16384/18414 +/opt/service_finder/postgres/data/base/16384/2703 +/opt/service_finder/postgres/data/base/16384/2753_vm +/opt/service_finder/postgres/data/base/16384/2603_vm +/opt/service_finder/postgres/data/base/16384/1249_fsm +/opt/service_finder/postgres/data/base/16384/2620_fsm +/opt/service_finder/postgres/data/base/16384/3600 +/opt/service_finder/postgres/data/base/16384/2653 +/opt/service_finder/postgres/data/base/16384/2337 +/opt/service_finder/postgres/data/base/16384/13473_fsm +/opt/service_finder/postgres/data/base/16384/3085 +/opt/service_finder/postgres/data/base/16384/2995 +/opt/service_finder/postgres/data/base/16384/2336 +/opt/service_finder/postgres/data/base/16384/2612_fsm +/opt/service_finder/postgres/data/base/16384/3258 +/opt/service_finder/postgres/data/base/16384/3466 +/opt/service_finder/postgres/data/base/16384/3079 +/opt/service_finder/postgres/data/base/16384/4144 +/opt/service_finder/postgres/data/base/16384/1417 +/opt/service_finder/postgres/data/base/16384/13472 +/opt/service_finder/postgres/data/base/16384/18421 +/opt/service_finder/postgres/data/base/16384/2666 +/opt/service_finder/postgres/data/base/16384/13467 +/opt/service_finder/postgres/data/base/16384/6228 +/opt/service_finder/postgres/data/base/16384/6117 +/opt/service_finder/postgres/data/base/16384/2757 +/opt/service_finder/postgres/data/base/16384/2685 +/opt/service_finder/postgres/data/base/16384/2612_vm +/opt/service_finder/postgres/data/base/16384/2615 +/opt/service_finder/postgres/data/base/16384/3501 +/opt/service_finder/postgres/data/base/16384/3602 +/opt/service_finder/postgres/data/base/16384/6176 +/opt/service_finder/postgres/data/base/16384/16412 +/opt/service_finder/postgres/data/base/16384/2605 +/opt/service_finder/postgres/data/base/16384/2674 +/opt/service_finder/postgres/data/base/16384/2754 +/opt/service_finder/postgres/data/base/16384/13463_vm +/opt/service_finder/postgres/data/base/16384/549 +/opt/service_finder/postgres/data/base/16384/3712 +/opt/service_finder/postgres/data/base/16384/2669 +/opt/service_finder/postgres/data/base/16384/18404 +/opt/service_finder/postgres/data/base/16384/16463 +/opt/service_finder/postgres/data/base/16384/2689 +/opt/service_finder/postgres/data/base/16384/4152 +/opt/service_finder/postgres/data/base/16384/3395 +/opt/service_finder/postgres/data/base/16384/2693 +/opt/service_finder/postgres/data/base/16384/16470 +/opt/service_finder/postgres/data/base/16384/4149 +/opt/service_finder/postgres/data/base/16384/18477 +/opt/service_finder/postgres/data/base/16384/16449 +/opt/service_finder/postgres/data/base/16384/548 +/opt/service_finder/postgres/data/base/16384/2699 +/opt/service_finder/postgres/data/base/16384/2673 +/opt/service_finder/postgres/data/base/16384/3431 +/opt/service_finder/postgres/data/base/16384/3574 +/opt/service_finder/postgres/data/base/16384/3468 +/opt/service_finder/postgres/data/base/16384/4171 +/opt/service_finder/postgres/data/base/16384/16469 +/opt/service_finder/postgres/data/base/16384/4163 +/opt/service_finder/postgres/data/base/16384/2696 +/opt/service_finder/postgres/data/base/16384/4168 +/opt/service_finder/postgres/data/base/16384/6102 +/opt/service_finder/postgres/data/base/16384/3597 +/opt/service_finder/postgres/data/base/16384/18514 +/opt/service_finder/postgres/data/base/16384/pg_internal.init +/opt/service_finder/postgres/data/base/16384/PG_VERSION +/opt/service_finder/postgres/data/base/16384/2837 +/opt/service_finder/postgres/data/base/16384/16414 +/opt/service_finder/postgres/data/base/16384/2579 +/opt/service_finder/postgres/data/base/16384/2604_fsm +/opt/service_finder/postgres/data/base/16384/827 +/opt/service_finder/postgres/data/base/16384/4158 +/opt/service_finder/postgres/data/base/16384/18512 +/opt/service_finder/postgres/data/base/16384/2691 +/opt/service_finder/postgres/data/base/16384/826 +/opt/service_finder/postgres/data/base/16384/2660 +/opt/service_finder/postgres/data/base/16384/3596 +/opt/service_finder/postgres/data/base/16384/18504 +/opt/service_finder/postgres/data/base/16384/16476 +/opt/service_finder/postgres/data/base/16384/2228 +/opt/service_finder/postgres/data/base/16384/3605 +/opt/service_finder/postgres/data/base/16384/2668 +/opt/service_finder/postgres/data/base/16384/4145 +/opt/service_finder/postgres/data/base/16384/13481 +/opt/service_finder/postgres/data/base/16384/18484 +/opt/service_finder/postgres/data/base/16384/2602_vm +/opt/service_finder/postgres/data/base/16384/2602_fsm +/opt/service_finder/postgres/data/base/16384/3079_vm +/opt/service_finder/postgres/data/base/16384/4155 +/opt/service_finder/postgres/data/base/16384/13476 +/opt/service_finder/postgres/data/base/16384/2617_fsm +/opt/service_finder/postgres/data/base/16384/2607_vm +/opt/service_finder/postgres/data/base/16384/2606 +/opt/service_finder/postgres/data/base/16384/2610_fsm +/opt/service_finder/postgres/data/base/16384/2831 +/opt/service_finder/postgres/data/base/16384/16471 +/opt/service_finder/postgres/data/base/16384/3394_vm +/opt/service_finder/postgres/data/base/16384/4147 +/opt/service_finder/postgres/data/base/16384/1255 +/opt/service_finder/postgres/data/base/16384/2607 +/opt/service_finder/postgres/data/base/16384/2611 +/opt/service_finder/postgres/data/base/16384/18537 +/opt/service_finder/postgres/data/base/16384/2753_fsm +/opt/service_finder/postgres/data/base/16384/2187 +/opt/service_finder/postgres/data/base/16384/2650 +/opt/service_finder/postgres/data/base/16384/18411 +/opt/service_finder/postgres/data/base/16384/3601_vm +/opt/service_finder/postgres/data/base/16384/2658 +/opt/service_finder/postgres/data/base/16384/2606_vm +/opt/service_finder/postgres/data/base/16384/18486 +/opt/service_finder/postgres/data/base/16384/13482 +/opt/service_finder/postgres/data/base/16384/2602 +/opt/service_finder/postgres/data/base/16384/2609_fsm +/opt/service_finder/postgres/data/base/16384/3607 +/opt/service_finder/postgres/data/base/16384/3764_fsm +/opt/service_finder/postgres/data/base/16384/4165 +/opt/service_finder/postgres/data/base/16384/3764_vm +/opt/service_finder/postgres/data/base/16384/18463 +/opt/service_finder/postgres/data/base/16384/4167 +/opt/service_finder/postgres/data/base/16384/16439 +/opt/service_finder/postgres/data/base/16384/2600_vm +/opt/service_finder/postgres/data/base/16384/3350 +/opt/service_finder/postgres/data/base/16384/2652 +/opt/service_finder/postgres/data/base/16384/3118 +/opt/service_finder/postgres/data/base/16384/3603_vm +/opt/service_finder/postgres/data/base/16384/2704 +/opt/service_finder/postgres/data/base/16384/2328 +/opt/service_finder/postgres/data/base/16384/6237 +/opt/service_finder/postgres/data/base/16384/4150 +/opt/service_finder/postgres/data/base/16384/3606 +/opt/service_finder/postgres/data/base/16384/1259_fsm +/opt/service_finder/postgres/data/base/16384/2675 +/opt/service_finder/postgres/data/base/16384/3598 +/opt/service_finder/postgres/data/base/16384/6110 +/opt/service_finder/postgres/data/base/16384/18428 +/opt/service_finder/postgres/data/base/16384/113 +/opt/service_finder/postgres/data/base/16384/1247_fsm +/opt/service_finder/postgres/data/base/16384/18525 +/opt/service_finder/postgres/data/base/16384/2682 +/opt/service_finder/postgres/data/base/16384/16455 +/opt/service_finder/postgres/data/base/16384/13471 +/opt/service_finder/postgres/data/base/16384/13473 +/opt/service_finder/postgres/data/base/16384/18536 +/opt/service_finder/postgres/data/base/16384/3608 +/opt/service_finder/postgres/data/base/16384/4173 +/opt/service_finder/postgres/data/base/16384/2679 +/opt/service_finder/postgres/data/base/16384/3379 +/opt/service_finder/postgres/data/base/16384/2616 +/opt/service_finder/postgres/data/base/16384/18456 +/opt/service_finder/postgres/data/base/16384/16475 +/opt/service_finder/postgres/data/base/16384/2839 +/opt/service_finder/postgres/data/base/16384/18413 +/opt/service_finder/postgres/data/base/16384/3764 +/opt/service_finder/postgres/data/base/16384/2661 +/opt/service_finder/postgres/data/base/16384/2835 +/opt/service_finder/postgres/data/base/16384/2619 +/opt/service_finder/postgres/data/base/16384/2608_fsm +/opt/service_finder/postgres/data/base/16384/2655 +/opt/service_finder/postgres/data/base/16384/3766 +/opt/service_finder/postgres/data/base/16384/3394 +/opt/service_finder/postgres/data/base/16384/16453 +/opt/service_finder/postgres/data/base/16384/3080 +/opt/service_finder/postgres/data/base/16384/2619_fsm +/opt/service_finder/postgres/data/base/16384/3541_vm +/opt/service_finder/postgres/data/base/16384/4164 +/opt/service_finder/postgres/data/base/16384/3502 +/opt/service_finder/postgres/data/base/16384/4159 +/opt/service_finder/postgres/data/base/16384/2613 +/opt/service_finder/postgres/data/base/16384/4153 +/opt/service_finder/postgres/data/base/16384/18513 +/opt/service_finder/postgres/data/base/16384/6112 +/opt/service_finder/postgres/data/base/16384/3456_vm +/opt/service_finder/postgres/data/base/16384/2616_fsm +/opt/service_finder/postgres/data/base/16384/16519 +/opt/service_finder/postgres/data/base/16384/2224 +/opt/service_finder/postgres/data/base/16384/2603 +/opt/service_finder/postgres/data/base/16384/18455 +/opt/service_finder/postgres/data/base/16384/2665 +/opt/service_finder/postgres/data/base/16384/16518 +/opt/service_finder/postgres/data/base/16384/2755 +/opt/service_finder/postgres/data/base/16384/3604 +/opt/service_finder/postgres/data/base/16384/2609 +/opt/service_finder/postgres/data/base/16384/2659 +/opt/service_finder/postgres/data/base/16384/2612 +/opt/service_finder/postgres/data/base/16384/13466 +/opt/service_finder/postgres/data/base/16384/2690 +/opt/service_finder/postgres/data/base/16384/2838 +/opt/service_finder/postgres/data/base/16384/1249 +/opt/service_finder/postgres/data/base/16384/3429 +/opt/service_finder/postgres/data/base/16384/16473 +/opt/service_finder/postgres/data/base/16384/828 +/opt/service_finder/postgres/data/base/16384/2620_vm +/opt/service_finder/postgres/data/base/16384/3599 +/opt/service_finder/postgres/data/base/16384/2680 +/opt/service_finder/postgres/data/base/16384/18464 +/opt/service_finder/postgres/data/base/16384/18494 +/opt/service_finder/postgres/data/base/16384/3534 +/opt/service_finder/postgres/data/base/16384/2836_vm +/opt/service_finder/postgres/data/base/16384/2618 +/opt/service_finder/postgres/data/base/16384/2840_vm +/opt/service_finder/postgres/data/base/16384/2654 +/opt/service_finder/postgres/data/base/16384/4166 +/opt/service_finder/postgres/data/base/16384/2600_fsm +/opt/service_finder/postgres/data/base/16384/18429 +/opt/service_finder/postgres/data/base/16384/2841 +/opt/service_finder/postgres/data/base/16384/18419 +/opt/service_finder/postgres/data/base/16384/2617_vm +/opt/service_finder/postgres/data/base/16384/2996 +/opt/service_finder/postgres/data/base/16384/3433 +/opt/service_finder/postgres/data/base/16384/2684 +/opt/service_finder/postgres/data/base/16384/3603_fsm +/opt/service_finder/postgres/data/base/16384/1247_vm +/opt/service_finder/postgres/data/base/16384/3394_fsm +/opt/service_finder/postgres/data/base/16384/6175 +/opt/service_finder/postgres/data/base/16384/2834 +/opt/service_finder/postgres/data/base/16384/3609 +/opt/service_finder/postgres/data/base/16384/2692 +/opt/service_finder/postgres/data/base/16384/3600_fsm +/opt/service_finder/postgres/data/base/16384/2701 +/opt/service_finder/postgres/data/base/16384/4160 +/opt/service_finder/postgres/data/base/16384/4146 +/opt/service_finder/postgres/data/base/16384/1418 +/opt/service_finder/postgres/data/base/16384/6116 +/opt/service_finder/postgres/data/base/16384/6104 +/opt/service_finder/postgres/data/base/16384/1247 +/opt/service_finder/postgres/data/base/16384/2651 +/opt/service_finder/postgres/data/base/16384/3456_fsm +/opt/service_finder/postgres/data/base/16384/18542 +/opt/service_finder/postgres/data/base/16384/2616_vm +/opt/service_finder/postgres/data/base/16384/16435 +/opt/service_finder/postgres/data/base/16384/4156 +/opt/service_finder/postgres/data/base/16384/4169 +/opt/service_finder/postgres/data/base/16384/2833 +/opt/service_finder/postgres/data/base/16384/2836 +/opt/service_finder/postgres/data/base/16384/4151 +/opt/service_finder/postgres/data/base/16384/174 +/opt/service_finder/postgres/data/base/16384/18409 +/opt/service_finder/postgres/data/base/16384/6111 +/opt/service_finder/postgres/data/base/16384/3602_fsm +/opt/service_finder/postgres/data/base/16384/13463_fsm +/opt/service_finder/postgres/data/base/16384/2618_vm +/opt/service_finder/postgres/data/base/16384/13478 +/opt/service_finder/postgres/data/base/16384/18530 +/opt/service_finder/postgres/data/base/16384/2678 +/opt/service_finder/postgres/data/base/16384/2683 +/opt/service_finder/postgres/data/base/16384/2656 +/opt/service_finder/postgres/data/base/16384/2667 +/opt/service_finder/postgres/data/base/16384/3119 +/opt/service_finder/postgres/data/base/16384/18462 +/opt/service_finder/postgres/data/base/16384/16484 +/opt/service_finder/postgres/data/base/16384/2600 +/opt/service_finder/postgres/data/base/16384/2620 +/opt/service_finder/postgres/data/base/16384/2753 +/opt/service_finder/postgres/data/base/16384/112 +/opt/service_finder/postgres/data/base/16384/18502 +/opt/service_finder/postgres/data/base/16384/2608_vm +/opt/service_finder/postgres/data/base/16384/3575 +/opt/service_finder/postgres/data/base/16384/3767 +/opt/service_finder/postgres/data/base/16384/6113 +/opt/service_finder/postgres/data/base/16384/16448 +/opt/service_finder/postgres/data/base/16384/16462 +/opt/service_finder/postgres/data/base/16384/13473_vm +/opt/service_finder/postgres/data/base/16384/3542 +/opt/service_finder/postgres/data/base/16384/1259 +/opt/service_finder/postgres/data/base/16384/2604 +/opt/service_finder/postgres/data/base/16384/2840 +/opt/service_finder/postgres/data/base/16384/3601 +/opt/service_finder/postgres/data/base/16384/2605_vm +/opt/service_finder/postgres/data/base/16384/16407 +/opt/service_finder/postgres/data/base/16384/2606_fsm +/opt/service_finder/postgres/data/base/16384/2830 +/opt/service_finder/postgres/data/base/16384/13468 +/opt/service_finder/postgres/data/base/16384/6239 +/opt/service_finder/postgres/data/base/16384/3430 +/opt/service_finder/postgres/data/base/16384/2607_fsm +/opt/service_finder/postgres/data/base/16384/18493 +/opt/service_finder/postgres/data/base/16384/2617 +/opt/service_finder/postgres/data/base/16384/2702 +/opt/service_finder/postgres/data/base/16384/13478_fsm +/opt/service_finder/postgres/data/base/16384/4174 +/opt/service_finder/postgres/data/base/16384/6106 +/opt/service_finder/postgres/data/base/16384/2681 +/opt/service_finder/postgres/data/base/16384/6238 +/opt/service_finder/postgres/data/base/16384/2610_vm +/opt/service_finder/postgres/data/base/16384/2838_fsm +/opt/service_finder/postgres/data/base/16384/4172 +/opt/service_finder/postgres/data/base/16384/175 +/opt/service_finder/postgres/data/base/16384/18476 +/opt/service_finder/postgres/data/base/16384/3541 +/opt/service_finder/postgres/data/base/16384/2832 +/opt/service_finder/postgres/data/base/16384/2601_fsm +/opt/service_finder/postgres/data/base/16384/4170 +/opt/service_finder/postgres/data/base/16384/3603 +/opt/service_finder/postgres/data/base/16384/2610 +/opt/service_finder/postgres/data/base/16384/2670 +/opt/service_finder/postgres/data/base/16384/1249_vm +/opt/service_finder/postgres/data/base/16384/2601 +/opt/service_finder/postgres/data/base/16384/2605_fsm +/opt/service_finder/postgres/data/base/16384/3081 +/opt/service_finder/postgres/data/base/16384/4154 +/opt/service_finder/postgres/data/base/16384/16440 +/opt/service_finder/postgres/data/base/16384/3456 +/opt/service_finder/postgres/data/base/16384/13468_vm +/opt/service_finder/postgres/data/base/16384/13468_fsm +/opt/service_finder/postgres/data/base/16384/2603_fsm +/opt/service_finder/postgres/data/base/16384/2687 +/opt/service_finder/postgres/data/base/16384/2608 +/opt/service_finder/postgres/data/base/16384/2664 +/opt/service_finder/postgres/data/base/16384/2840_fsm +/opt/service_finder/postgres/data/base/16384/3576 +/opt/service_finder/postgres/data/base/5 +/opt/service_finder/postgres/data/base/5/3079_fsm +/opt/service_finder/postgres/data/base/5/4143 +/opt/service_finder/postgres/data/base/5/3455 +/opt/service_finder/postgres/data/base/5/2686 +/opt/service_finder/postgres/data/base/5/pg_filenode.map +/opt/service_finder/postgres/data/base/5/3602_vm +/opt/service_finder/postgres/data/base/5/1255_vm +/opt/service_finder/postgres/data/base/5/2601_vm +/opt/service_finder/postgres/data/base/5/2838_vm +/opt/service_finder/postgres/data/base/5/13478_vm +/opt/service_finder/postgres/data/base/5/2836_fsm +/opt/service_finder/postgres/data/base/5/3164 +/opt/service_finder/postgres/data/base/5/13477 +/opt/service_finder/postgres/data/base/5/3351 +/opt/service_finder/postgres/data/base/5/3600_vm +/opt/service_finder/postgres/data/base/5/5002 +/opt/service_finder/postgres/data/base/5/1255_fsm +/opt/service_finder/postgres/data/base/5/3380 +/opt/service_finder/postgres/data/base/5/3381 +/opt/service_finder/postgres/data/base/5/2663 +/opt/service_finder/postgres/data/base/5/3601_fsm +/opt/service_finder/postgres/data/base/5/4148 +/opt/service_finder/postgres/data/base/5/2618_fsm +/opt/service_finder/postgres/data/base/5/3440 +/opt/service_finder/postgres/data/base/5/2619_vm +/opt/service_finder/postgres/data/base/5/3467 +/opt/service_finder/postgres/data/base/5/2688 +/opt/service_finder/postgres/data/base/5/3997 +/opt/service_finder/postgres/data/base/5/2662 +/opt/service_finder/postgres/data/base/5/6229 +/opt/service_finder/postgres/data/base/5/3439 +/opt/service_finder/postgres/data/base/5/2657 +/opt/service_finder/postgres/data/base/5/2609_vm +/opt/service_finder/postgres/data/base/5/4157 +/opt/service_finder/postgres/data/base/5/3257 +/opt/service_finder/postgres/data/base/5/3503 +/opt/service_finder/postgres/data/base/5/13463 +/opt/service_finder/postgres/data/base/5/3541_fsm +/opt/service_finder/postgres/data/base/5/2756 +/opt/service_finder/postgres/data/base/5/2615_vm +/opt/service_finder/postgres/data/base/5/1259_vm +/opt/service_finder/postgres/data/base/5/3256 +/opt/service_finder/postgres/data/base/5/2615_fsm +/opt/service_finder/postgres/data/base/5/2703 +/opt/service_finder/postgres/data/base/5/2753_vm +/opt/service_finder/postgres/data/base/5/2603_vm +/opt/service_finder/postgres/data/base/5/1249_fsm +/opt/service_finder/postgres/data/base/5/3600 +/opt/service_finder/postgres/data/base/5/2653 +/opt/service_finder/postgres/data/base/5/2337 +/opt/service_finder/postgres/data/base/5/13473_fsm +/opt/service_finder/postgres/data/base/5/3085 +/opt/service_finder/postgres/data/base/5/2995 +/opt/service_finder/postgres/data/base/5/2336 +/opt/service_finder/postgres/data/base/5/2612_fsm +/opt/service_finder/postgres/data/base/5/3258 +/opt/service_finder/postgres/data/base/5/3466 +/opt/service_finder/postgres/data/base/5/3079 +/opt/service_finder/postgres/data/base/5/4144 +/opt/service_finder/postgres/data/base/5/1417 +/opt/service_finder/postgres/data/base/5/13472 +/opt/service_finder/postgres/data/base/5/2666 +/opt/service_finder/postgres/data/base/5/13467 +/opt/service_finder/postgres/data/base/5/6228 +/opt/service_finder/postgres/data/base/5/6117 +/opt/service_finder/postgres/data/base/5/2757 +/opt/service_finder/postgres/data/base/5/2685 +/opt/service_finder/postgres/data/base/5/2612_vm +/opt/service_finder/postgres/data/base/5/2615 +/opt/service_finder/postgres/data/base/5/3501 +/opt/service_finder/postgres/data/base/5/3602 +/opt/service_finder/postgres/data/base/5/6176 +/opt/service_finder/postgres/data/base/5/2605 +/opt/service_finder/postgres/data/base/5/2674 +/opt/service_finder/postgres/data/base/5/2754 +/opt/service_finder/postgres/data/base/5/13463_vm +/opt/service_finder/postgres/data/base/5/549 +/opt/service_finder/postgres/data/base/5/3712 +/opt/service_finder/postgres/data/base/5/2669 +/opt/service_finder/postgres/data/base/5/2689 +/opt/service_finder/postgres/data/base/5/4152 +/opt/service_finder/postgres/data/base/5/3395 +/opt/service_finder/postgres/data/base/5/2693 +/opt/service_finder/postgres/data/base/5/4149 +/opt/service_finder/postgres/data/base/5/548 +/opt/service_finder/postgres/data/base/5/2699 +/opt/service_finder/postgres/data/base/5/2673 +/opt/service_finder/postgres/data/base/5/3431 +/opt/service_finder/postgres/data/base/5/3574 +/opt/service_finder/postgres/data/base/5/3468 +/opt/service_finder/postgres/data/base/5/4171 +/opt/service_finder/postgres/data/base/5/4163 +/opt/service_finder/postgres/data/base/5/2696 +/opt/service_finder/postgres/data/base/5/4168 +/opt/service_finder/postgres/data/base/5/6102 +/opt/service_finder/postgres/data/base/5/3597 +/opt/service_finder/postgres/data/base/5/PG_VERSION +/opt/service_finder/postgres/data/base/5/2837 +/opt/service_finder/postgres/data/base/5/2579 +/opt/service_finder/postgres/data/base/5/827 +/opt/service_finder/postgres/data/base/5/4158 +/opt/service_finder/postgres/data/base/5/2691 +/opt/service_finder/postgres/data/base/5/826 +/opt/service_finder/postgres/data/base/5/2660 +/opt/service_finder/postgres/data/base/5/3596 +/opt/service_finder/postgres/data/base/5/2228 +/opt/service_finder/postgres/data/base/5/3605 +/opt/service_finder/postgres/data/base/5/2668 +/opt/service_finder/postgres/data/base/5/4145 +/opt/service_finder/postgres/data/base/5/13481 +/opt/service_finder/postgres/data/base/5/2602_vm +/opt/service_finder/postgres/data/base/5/2602_fsm +/opt/service_finder/postgres/data/base/5/3079_vm +/opt/service_finder/postgres/data/base/5/4155 +/opt/service_finder/postgres/data/base/5/13476 +/opt/service_finder/postgres/data/base/5/2617_fsm +/opt/service_finder/postgres/data/base/5/2607_vm +/opt/service_finder/postgres/data/base/5/2606 +/opt/service_finder/postgres/data/base/5/2610_fsm +/opt/service_finder/postgres/data/base/5/2831 +/opt/service_finder/postgres/data/base/5/3394_vm +/opt/service_finder/postgres/data/base/5/4147 +/opt/service_finder/postgres/data/base/5/1255 +/opt/service_finder/postgres/data/base/5/2607 +/opt/service_finder/postgres/data/base/5/2611 +/opt/service_finder/postgres/data/base/5/2753_fsm +/opt/service_finder/postgres/data/base/5/2187 +/opt/service_finder/postgres/data/base/5/2650 +/opt/service_finder/postgres/data/base/5/3601_vm +/opt/service_finder/postgres/data/base/5/2658 +/opt/service_finder/postgres/data/base/5/2606_vm +/opt/service_finder/postgres/data/base/5/13482 +/opt/service_finder/postgres/data/base/5/2602 +/opt/service_finder/postgres/data/base/5/2609_fsm +/opt/service_finder/postgres/data/base/5/3607 +/opt/service_finder/postgres/data/base/5/3764_fsm +/opt/service_finder/postgres/data/base/5/4165 +/opt/service_finder/postgres/data/base/5/3764_vm +/opt/service_finder/postgres/data/base/5/4167 +/opt/service_finder/postgres/data/base/5/2600_vm +/opt/service_finder/postgres/data/base/5/3350 +/opt/service_finder/postgres/data/base/5/2652 +/opt/service_finder/postgres/data/base/5/3118 +/opt/service_finder/postgres/data/base/5/3603_vm +/opt/service_finder/postgres/data/base/5/2704 +/opt/service_finder/postgres/data/base/5/2328 +/opt/service_finder/postgres/data/base/5/6237 +/opt/service_finder/postgres/data/base/5/4150 +/opt/service_finder/postgres/data/base/5/3606 +/opt/service_finder/postgres/data/base/5/1259_fsm +/opt/service_finder/postgres/data/base/5/2675 +/opt/service_finder/postgres/data/base/5/3598 +/opt/service_finder/postgres/data/base/5/6110 +/opt/service_finder/postgres/data/base/5/113 +/opt/service_finder/postgres/data/base/5/1247_fsm +/opt/service_finder/postgres/data/base/5/2682 +/opt/service_finder/postgres/data/base/5/13471 +/opt/service_finder/postgres/data/base/5/13473 +/opt/service_finder/postgres/data/base/5/3608 +/opt/service_finder/postgres/data/base/5/4173 +/opt/service_finder/postgres/data/base/5/2679 +/opt/service_finder/postgres/data/base/5/3379 +/opt/service_finder/postgres/data/base/5/2616 +/opt/service_finder/postgres/data/base/5/2839 +/opt/service_finder/postgres/data/base/5/3764 +/opt/service_finder/postgres/data/base/5/2661 +/opt/service_finder/postgres/data/base/5/2835 +/opt/service_finder/postgres/data/base/5/2619 +/opt/service_finder/postgres/data/base/5/2608_fsm +/opt/service_finder/postgres/data/base/5/2655 +/opt/service_finder/postgres/data/base/5/3766 +/opt/service_finder/postgres/data/base/5/3394 +/opt/service_finder/postgres/data/base/5/3080 +/opt/service_finder/postgres/data/base/5/2619_fsm +/opt/service_finder/postgres/data/base/5/3541_vm +/opt/service_finder/postgres/data/base/5/4164 +/opt/service_finder/postgres/data/base/5/3502 +/opt/service_finder/postgres/data/base/5/4159 +/opt/service_finder/postgres/data/base/5/2613 +/opt/service_finder/postgres/data/base/5/4153 +/opt/service_finder/postgres/data/base/5/6112 +/opt/service_finder/postgres/data/base/5/3456_vm +/opt/service_finder/postgres/data/base/5/2616_fsm +/opt/service_finder/postgres/data/base/5/2224 +/opt/service_finder/postgres/data/base/5/2603 +/opt/service_finder/postgres/data/base/5/2665 +/opt/service_finder/postgres/data/base/5/2755 +/opt/service_finder/postgres/data/base/5/3604 +/opt/service_finder/postgres/data/base/5/2609 +/opt/service_finder/postgres/data/base/5/2659 +/opt/service_finder/postgres/data/base/5/2612 +/opt/service_finder/postgres/data/base/5/13466 +/opt/service_finder/postgres/data/base/5/2690 +/opt/service_finder/postgres/data/base/5/2838 +/opt/service_finder/postgres/data/base/5/1249 +/opt/service_finder/postgres/data/base/5/3429 +/opt/service_finder/postgres/data/base/5/828 +/opt/service_finder/postgres/data/base/5/3599 +/opt/service_finder/postgres/data/base/5/2680 +/opt/service_finder/postgres/data/base/5/3534 +/opt/service_finder/postgres/data/base/5/2836_vm +/opt/service_finder/postgres/data/base/5/2618 +/opt/service_finder/postgres/data/base/5/2840_vm +/opt/service_finder/postgres/data/base/5/2654 +/opt/service_finder/postgres/data/base/5/4166 +/opt/service_finder/postgres/data/base/5/2600_fsm +/opt/service_finder/postgres/data/base/5/2841 +/opt/service_finder/postgres/data/base/5/2617_vm +/opt/service_finder/postgres/data/base/5/2996 +/opt/service_finder/postgres/data/base/5/3433 +/opt/service_finder/postgres/data/base/5/2684 +/opt/service_finder/postgres/data/base/5/3603_fsm +/opt/service_finder/postgres/data/base/5/1247_vm +/opt/service_finder/postgres/data/base/5/3394_fsm +/opt/service_finder/postgres/data/base/5/6175 +/opt/service_finder/postgres/data/base/5/2834 +/opt/service_finder/postgres/data/base/5/3609 +/opt/service_finder/postgres/data/base/5/2692 +/opt/service_finder/postgres/data/base/5/3600_fsm +/opt/service_finder/postgres/data/base/5/2701 +/opt/service_finder/postgres/data/base/5/4160 +/opt/service_finder/postgres/data/base/5/4146 +/opt/service_finder/postgres/data/base/5/1418 +/opt/service_finder/postgres/data/base/5/6116 +/opt/service_finder/postgres/data/base/5/6104 +/opt/service_finder/postgres/data/base/5/1247 +/opt/service_finder/postgres/data/base/5/2651 +/opt/service_finder/postgres/data/base/5/3456_fsm +/opt/service_finder/postgres/data/base/5/2616_vm +/opt/service_finder/postgres/data/base/5/4156 +/opt/service_finder/postgres/data/base/5/4169 +/opt/service_finder/postgres/data/base/5/2833 +/opt/service_finder/postgres/data/base/5/2836 +/opt/service_finder/postgres/data/base/5/4151 +/opt/service_finder/postgres/data/base/5/174 +/opt/service_finder/postgres/data/base/5/6111 +/opt/service_finder/postgres/data/base/5/3602_fsm +/opt/service_finder/postgres/data/base/5/13463_fsm +/opt/service_finder/postgres/data/base/5/2618_vm +/opt/service_finder/postgres/data/base/5/13478 +/opt/service_finder/postgres/data/base/5/2678 +/opt/service_finder/postgres/data/base/5/2683 +/opt/service_finder/postgres/data/base/5/2656 +/opt/service_finder/postgres/data/base/5/2667 +/opt/service_finder/postgres/data/base/5/3119 +/opt/service_finder/postgres/data/base/5/2600 +/opt/service_finder/postgres/data/base/5/2620 +/opt/service_finder/postgres/data/base/5/2753 +/opt/service_finder/postgres/data/base/5/112 +/opt/service_finder/postgres/data/base/5/2608_vm +/opt/service_finder/postgres/data/base/5/3575 +/opt/service_finder/postgres/data/base/5/3767 +/opt/service_finder/postgres/data/base/5/6113 +/opt/service_finder/postgres/data/base/5/13473_vm +/opt/service_finder/postgres/data/base/5/3542 +/opt/service_finder/postgres/data/base/5/1259 +/opt/service_finder/postgres/data/base/5/2604 +/opt/service_finder/postgres/data/base/5/2840 +/opt/service_finder/postgres/data/base/5/3601 +/opt/service_finder/postgres/data/base/5/2605_vm +/opt/service_finder/postgres/data/base/5/2606_fsm +/opt/service_finder/postgres/data/base/5/2830 +/opt/service_finder/postgres/data/base/5/13468 +/opt/service_finder/postgres/data/base/5/6239 +/opt/service_finder/postgres/data/base/5/3430 +/opt/service_finder/postgres/data/base/5/2607_fsm +/opt/service_finder/postgres/data/base/5/2617 +/opt/service_finder/postgres/data/base/5/2702 +/opt/service_finder/postgres/data/base/5/13478_fsm +/opt/service_finder/postgres/data/base/5/4174 +/opt/service_finder/postgres/data/base/5/6106 +/opt/service_finder/postgres/data/base/5/2681 +/opt/service_finder/postgres/data/base/5/6238 +/opt/service_finder/postgres/data/base/5/2610_vm +/opt/service_finder/postgres/data/base/5/2838_fsm +/opt/service_finder/postgres/data/base/5/4172 +/opt/service_finder/postgres/data/base/5/175 +/opt/service_finder/postgres/data/base/5/3541 +/opt/service_finder/postgres/data/base/5/2832 +/opt/service_finder/postgres/data/base/5/2601_fsm +/opt/service_finder/postgres/data/base/5/4170 +/opt/service_finder/postgres/data/base/5/3603 +/opt/service_finder/postgres/data/base/5/2610 +/opt/service_finder/postgres/data/base/5/2670 +/opt/service_finder/postgres/data/base/5/1249_vm +/opt/service_finder/postgres/data/base/5/2601 +/opt/service_finder/postgres/data/base/5/2605_fsm +/opt/service_finder/postgres/data/base/5/3081 +/opt/service_finder/postgres/data/base/5/4154 +/opt/service_finder/postgres/data/base/5/3456 +/opt/service_finder/postgres/data/base/5/13468_vm +/opt/service_finder/postgres/data/base/5/13468_fsm +/opt/service_finder/postgres/data/base/5/2603_fsm +/opt/service_finder/postgres/data/base/5/2687 +/opt/service_finder/postgres/data/base/5/2608 +/opt/service_finder/postgres/data/base/5/2664 +/opt/service_finder/postgres/data/base/5/2840_fsm +/opt/service_finder/postgres/data/base/5/3576 +/opt/service_finder/postgres/data/base/16537 +/opt/service_finder/postgres/data/base/16537/3079_fsm +/opt/service_finder/postgres/data/base/16537/16967 +/opt/service_finder/postgres/data/base/16537/4143 +/opt/service_finder/postgres/data/base/16537/18158 +/opt/service_finder/postgres/data/base/16537/17120 +/opt/service_finder/postgres/data/base/16537/17202 +/opt/service_finder/postgres/data/base/16537/3455 +/opt/service_finder/postgres/data/base/16537/16990 +/opt/service_finder/postgres/data/base/16537/17344 +/opt/service_finder/postgres/data/base/16537/17180 +/opt/service_finder/postgres/data/base/16537/17268 +/opt/service_finder/postgres/data/base/16537/18234 +/opt/service_finder/postgres/data/base/16537/17449 +/opt/service_finder/postgres/data/base/16537/2686 +/opt/service_finder/postgres/data/base/16537/pg_filenode.map +/opt/service_finder/postgres/data/base/16537/18157 +/opt/service_finder/postgres/data/base/16537/3602_vm +/opt/service_finder/postgres/data/base/16537/1255_vm +/opt/service_finder/postgres/data/base/16537/2601_vm +/opt/service_finder/postgres/data/base/16537/2838_vm +/opt/service_finder/postgres/data/base/16537/17589 +/opt/service_finder/postgres/data/base/16537/16947 +/opt/service_finder/postgres/data/base/16537/13478_vm +/opt/service_finder/postgres/data/base/16537/2836_fsm +/opt/service_finder/postgres/data/base/16537/16918 +/opt/service_finder/postgres/data/base/16537/3164 +/opt/service_finder/postgres/data/base/16537/17240 +/opt/service_finder/postgres/data/base/16537/18243 +/opt/service_finder/postgres/data/base/16537/13477 +/opt/service_finder/postgres/data/base/16537/16963 +/opt/service_finder/postgres/data/base/16537/17476 +/opt/service_finder/postgres/data/base/16537/17530 +/opt/service_finder/postgres/data/base/16537/16934 +/opt/service_finder/postgres/data/base/16537/3351 +/opt/service_finder/postgres/data/base/16537/17945 +/opt/service_finder/postgres/data/base/16537/17127 +/opt/service_finder/postgres/data/base/16537/16926 +/opt/service_finder/postgres/data/base/16537/3600_vm +/opt/service_finder/postgres/data/base/16537/17448 +/opt/service_finder/postgres/data/base/16537/5002 +/opt/service_finder/postgres/data/base/16537/1255_fsm +/opt/service_finder/postgres/data/base/16537/3380 +/opt/service_finder/postgres/data/base/16537/17805 +/opt/service_finder/postgres/data/base/16537/17640 +/opt/service_finder/postgres/data/base/16537/3381 +/opt/service_finder/postgres/data/base/16537/2663 +/opt/service_finder/postgres/data/base/16537/3601_fsm +/opt/service_finder/postgres/data/base/16537/17096 +/opt/service_finder/postgres/data/base/16537/17010 +/opt/service_finder/postgres/data/base/16537/16932 +/opt/service_finder/postgres/data/base/16537/18580 +/opt/service_finder/postgres/data/base/16537/4148 +/opt/service_finder/postgres/data/base/16537/2618_fsm +/opt/service_finder/postgres/data/base/16537/3440 +/opt/service_finder/postgres/data/base/16537/18034 +/opt/service_finder/postgres/data/base/16537/17111 +/opt/service_finder/postgres/data/base/16537/2619_vm +/opt/service_finder/postgres/data/base/16537/18061 +/opt/service_finder/postgres/data/base/16537/18188 +/opt/service_finder/postgres/data/base/16537/3467 +/opt/service_finder/postgres/data/base/16537/2688 +/opt/service_finder/postgres/data/base/16537/3997 +/opt/service_finder/postgres/data/base/16537/2662 +/opt/service_finder/postgres/data/base/16537/6229 +/opt/service_finder/postgres/data/base/16537/17927 +/opt/service_finder/postgres/data/base/16537/17506 +/opt/service_finder/postgres/data/base/16537/17089 +/opt/service_finder/postgres/data/base/16537/18197 +/opt/service_finder/postgres/data/base/16537/3439 +/opt/service_finder/postgres/data/base/16537/17249 +/opt/service_finder/postgres/data/base/16537/2657 +/opt/service_finder/postgres/data/base/16537/2609_vm +/opt/service_finder/postgres/data/base/16537/16939 +/opt/service_finder/postgres/data/base/16537/17582 +/opt/service_finder/postgres/data/base/16537/4157 +/opt/service_finder/postgres/data/base/16537/18032 +/opt/service_finder/postgres/data/base/16537/3257 +/opt/service_finder/postgres/data/base/16537/3503 +/opt/service_finder/postgres/data/base/16537/13463 +/opt/service_finder/postgres/data/base/16537/3541_fsm +/opt/service_finder/postgres/data/base/16537/2756 +/opt/service_finder/postgres/data/base/16537/17266 +/opt/service_finder/postgres/data/base/16537/17935 +/opt/service_finder/postgres/data/base/16537/2615_vm +/opt/service_finder/postgres/data/base/16537/1259_vm +/opt/service_finder/postgres/data/base/16537/18251 +/opt/service_finder/postgres/data/base/16537/3256 +/opt/service_finder/postgres/data/base/16537/16974 +/opt/service_finder/postgres/data/base/16537/17641 +/opt/service_finder/postgres/data/base/16537/17466 +/opt/service_finder/postgres/data/base/16537/2615_fsm +/opt/service_finder/postgres/data/base/16537/16922 +/opt/service_finder/postgres/data/base/16537/18187 +/opt/service_finder/postgres/data/base/16537/2703 +/opt/service_finder/postgres/data/base/16537/17635 +/opt/service_finder/postgres/data/base/16537/2753_vm +/opt/service_finder/postgres/data/base/16537/2603_vm +/opt/service_finder/postgres/data/base/16537/1249_fsm +/opt/service_finder/postgres/data/base/16537/17017 +/opt/service_finder/postgres/data/base/16537/17730 +/opt/service_finder/postgres/data/base/16537/2620_fsm +/opt/service_finder/postgres/data/base/16537/3600 +/opt/service_finder/postgres/data/base/16537/2653 +/opt/service_finder/postgres/data/base/16537/2337 +/opt/service_finder/postgres/data/base/16537/13473_fsm +/opt/service_finder/postgres/data/base/16537/17729 +/opt/service_finder/postgres/data/base/16537/3085 +/opt/service_finder/postgres/data/base/16537/16948 +/opt/service_finder/postgres/data/base/16537/17474 +/opt/service_finder/postgres/data/base/16537/17157 +/opt/service_finder/postgres/data/base/16537/2995 +/opt/service_finder/postgres/data/base/16537/2336 +/opt/service_finder/postgres/data/base/16537/2612_fsm +/opt/service_finder/postgres/data/base/16537/3258 +/opt/service_finder/postgres/data/base/16537/3466 +/opt/service_finder/postgres/data/base/16537/3079 +/opt/service_finder/postgres/data/base/16537/4144 +/opt/service_finder/postgres/data/base/16537/16929 +/opt/service_finder/postgres/data/base/16537/1417 +/opt/service_finder/postgres/data/base/16537/17061 +/opt/service_finder/postgres/data/base/16537/17553 +/opt/service_finder/postgres/data/base/16537/18576 +/opt/service_finder/postgres/data/base/16537/17117 +/opt/service_finder/postgres/data/base/16537/13472 +/opt/service_finder/postgres/data/base/16537/2666 +/opt/service_finder/postgres/data/base/16537/13467 +/opt/service_finder/postgres/data/base/16537/6228 +/opt/service_finder/postgres/data/base/16537/17671 +/opt/service_finder/postgres/data/base/16537/6117 +/opt/service_finder/postgres/data/base/16537/2757 +/opt/service_finder/postgres/data/base/16537/17148 +/opt/service_finder/postgres/data/base/16537/2685 +/opt/service_finder/postgres/data/base/16537/17283 +/opt/service_finder/postgres/data/base/16537/18033 +/opt/service_finder/postgres/data/base/16537/17250 +/opt/service_finder/postgres/data/base/16537/17295 +/opt/service_finder/postgres/data/base/16537/2612_vm +/opt/service_finder/postgres/data/base/16537/2615 +/opt/service_finder/postgres/data/base/16537/3501 +/opt/service_finder/postgres/data/base/16537/3602 +/opt/service_finder/postgres/data/base/16537/6176 +/opt/service_finder/postgres/data/base/16537/18026 +/opt/service_finder/postgres/data/base/16537/17548 +/opt/service_finder/postgres/data/base/16537/16925 +/opt/service_finder/postgres/data/base/16537/17059 +/opt/service_finder/postgres/data/base/16537/2605 +/opt/service_finder/postgres/data/base/16537/17260 +/opt/service_finder/postgres/data/base/16537/2674 +/opt/service_finder/postgres/data/base/16537/17052 +/opt/service_finder/postgres/data/base/16537/17970 +/opt/service_finder/postgres/data/base/16537/2754 +/opt/service_finder/postgres/data/base/16537/13463_vm +/opt/service_finder/postgres/data/base/16537/17961 +/opt/service_finder/postgres/data/base/16537/17728 +/opt/service_finder/postgres/data/base/16537/17018 +/opt/service_finder/postgres/data/base/16537/549 +/opt/service_finder/postgres/data/base/16537/17622 +/opt/service_finder/postgres/data/base/16537/3712 +/opt/service_finder/postgres/data/base/16537/17267 +/opt/service_finder/postgres/data/base/16537/2669 +/opt/service_finder/postgres/data/base/16537/17959 +/opt/service_finder/postgres/data/base/16537/2689 +/opt/service_finder/postgres/data/base/16537/4152 +/opt/service_finder/postgres/data/base/16537/18566 +/opt/service_finder/postgres/data/base/16537/17829 +/opt/service_finder/postgres/data/base/16537/17079 +/opt/service_finder/postgres/data/base/16537/3395 +/opt/service_finder/postgres/data/base/16537/2693 +/opt/service_finder/postgres/data/base/16537/17555 +/opt/service_finder/postgres/data/base/16537/17947 +/opt/service_finder/postgres/data/base/16537/4149 +/opt/service_finder/postgres/data/base/16537/16927 +/opt/service_finder/postgres/data/base/16537/548 +/opt/service_finder/postgres/data/base/16537/17768 +/opt/service_finder/postgres/data/base/16537/2699 +/opt/service_finder/postgres/data/base/16537/17759 +/opt/service_finder/postgres/data/base/16537/17760 +/opt/service_finder/postgres/data/base/16537/2673 +/opt/service_finder/postgres/data/base/16537/17557 +/opt/service_finder/postgres/data/base/16537/17580 +/opt/service_finder/postgres/data/base/16537/3431 +/opt/service_finder/postgres/data/base/16537/3574 +/opt/service_finder/postgres/data/base/16537/3468 +/opt/service_finder/postgres/data/base/16537/4171 +/opt/service_finder/postgres/data/base/16537/4163 +/opt/service_finder/postgres/data/base/16537/2696 +/opt/service_finder/postgres/data/base/16537/4168 +/opt/service_finder/postgres/data/base/16537/17068 +/opt/service_finder/postgres/data/base/16537/6102 +/opt/service_finder/postgres/data/base/16537/3597 +/opt/service_finder/postgres/data/base/16537/pg_internal.init +/opt/service_finder/postgres/data/base/16537/18189 +/opt/service_finder/postgres/data/base/16537/17620 +/opt/service_finder/postgres/data/base/16537/17080 +/opt/service_finder/postgres/data/base/16537/17468 +/opt/service_finder/postgres/data/base/16537/PG_VERSION +/opt/service_finder/postgres/data/base/16537/2837 +/opt/service_finder/postgres/data/base/16537/2579 +/opt/service_finder/postgres/data/base/16537/2604_fsm +/opt/service_finder/postgres/data/base/16537/827 +/opt/service_finder/postgres/data/base/16537/16957 +/opt/service_finder/postgres/data/base/16537/17475 +/opt/service_finder/postgres/data/base/16537/17574 +/opt/service_finder/postgres/data/base/16537/18128 +/opt/service_finder/postgres/data/base/16537/4158 +/opt/service_finder/postgres/data/base/16537/2691 +/opt/service_finder/postgres/data/base/16537/826 +/opt/service_finder/postgres/data/base/16537/2660 +/opt/service_finder/postgres/data/base/16537/3596 +/opt/service_finder/postgres/data/base/16537/17156 +/opt/service_finder/postgres/data/base/16537/2228 +/opt/service_finder/postgres/data/base/16537/3605 +/opt/service_finder/postgres/data/base/16537/2668 +/opt/service_finder/postgres/data/base/16537/17554 +/opt/service_finder/postgres/data/base/16537/4145 +/opt/service_finder/postgres/data/base/16537/17598 +/opt/service_finder/postgres/data/base/16537/17248 +/opt/service_finder/postgres/data/base/16537/18066 +/opt/service_finder/postgres/data/base/16537/13481 +/opt/service_finder/postgres/data/base/16537/16991 +/opt/service_finder/postgres/data/base/16537/2602_vm +/opt/service_finder/postgres/data/base/16537/17742 +/opt/service_finder/postgres/data/base/16537/2602_fsm +/opt/service_finder/postgres/data/base/16537/3079_vm +/opt/service_finder/postgres/data/base/16537/3256_fsm +/opt/service_finder/postgres/data/base/16537/17098 +/opt/service_finder/postgres/data/base/16537/18582 +/opt/service_finder/postgres/data/base/16537/16968 +/opt/service_finder/postgres/data/base/16537/4155 +/opt/service_finder/postgres/data/base/16537/17493 +/opt/service_finder/postgres/data/base/16537/18159 +/opt/service_finder/postgres/data/base/16537/17775 +/opt/service_finder/postgres/data/base/16537/17337 +/opt/service_finder/postgres/data/base/16537/17535 +/opt/service_finder/postgres/data/base/16537/17758 +/opt/service_finder/postgres/data/base/16537/17798 +/opt/service_finder/postgres/data/base/16537/13476 +/opt/service_finder/postgres/data/base/16537/17034 +/opt/service_finder/postgres/data/base/16537/18088 +/opt/service_finder/postgres/data/base/16537/17440 +/opt/service_finder/postgres/data/base/16537/2617_fsm +/opt/service_finder/postgres/data/base/16537/2607_vm +/opt/service_finder/postgres/data/base/16537/2606 +/opt/service_finder/postgres/data/base/16537/17505 +/opt/service_finder/postgres/data/base/16537/18241 +/opt/service_finder/postgres/data/base/16537/2610_fsm +/opt/service_finder/postgres/data/base/16537/17806 +/opt/service_finder/postgres/data/base/16537/2831 +/opt/service_finder/postgres/data/base/16537/18095 +/opt/service_finder/postgres/data/base/16537/3394_vm +/opt/service_finder/postgres/data/base/16537/4147 +/opt/service_finder/postgres/data/base/16537/1255 +/opt/service_finder/postgres/data/base/16537/2607 +/opt/service_finder/postgres/data/base/16537/17170 +/opt/service_finder/postgres/data/base/16537/2611 +/opt/service_finder/postgres/data/base/16537/17415 +/opt/service_finder/postgres/data/base/16537/2753_fsm +/opt/service_finder/postgres/data/base/16537/2187 +/opt/service_finder/postgres/data/base/16537/17405 +/opt/service_finder/postgres/data/base/16537/2650 +/opt/service_finder/postgres/data/base/16537/3601_vm +/opt/service_finder/postgres/data/base/16537/16964 +/opt/service_finder/postgres/data/base/16537/2658 +/opt/service_finder/postgres/data/base/16537/2606_vm +/opt/service_finder/postgres/data/base/16537/17621 +/opt/service_finder/postgres/data/base/16537/13482 +/opt/service_finder/postgres/data/base/16537/2602 +/opt/service_finder/postgres/data/base/16537/2609_fsm +/opt/service_finder/postgres/data/base/16537/17968 +/opt/service_finder/postgres/data/base/16537/3607 +/opt/service_finder/postgres/data/base/16537/3764_fsm +/opt/service_finder/postgres/data/base/16537/17130 +/opt/service_finder/postgres/data/base/16537/4165 +/opt/service_finder/postgres/data/base/16537/3764_vm +/opt/service_finder/postgres/data/base/16537/16933 +/opt/service_finder/postgres/data/base/16537/17830 +/opt/service_finder/postgres/data/base/16537/18181 +/opt/service_finder/postgres/data/base/16537/4167 +/opt/service_finder/postgres/data/base/16537/16915 +/opt/service_finder/postgres/data/base/16537/17670 +/opt/service_finder/postgres/data/base/16537/17938 +/opt/service_finder/postgres/data/base/16537/2600_vm +/opt/service_finder/postgres/data/base/16537/3350 +/opt/service_finder/postgres/data/base/16537/17038 +/opt/service_finder/postgres/data/base/16537/17439 +/opt/service_finder/postgres/data/base/16537/2652 +/opt/service_finder/postgres/data/base/16537/17752 +/opt/service_finder/postgres/data/base/16537/17467 +/opt/service_finder/postgres/data/base/16537/3118 +/opt/service_finder/postgres/data/base/16537/3603_vm +/opt/service_finder/postgres/data/base/16537/2704 +/opt/service_finder/postgres/data/base/16537/16953 +/opt/service_finder/postgres/data/base/16537/17406 +/opt/service_finder/postgres/data/base/16537/2328 +/opt/service_finder/postgres/data/base/16537/6237 +/opt/service_finder/postgres/data/base/16537/4150 +/opt/service_finder/postgres/data/base/16537/17040 +/opt/service_finder/postgres/data/base/16537/17774 +/opt/service_finder/postgres/data/base/16537/17800 +/opt/service_finder/postgres/data/base/16537/3606 +/opt/service_finder/postgres/data/base/16537/1259_fsm +/opt/service_finder/postgres/data/base/16537/2675 +/opt/service_finder/postgres/data/base/16537/3598 +/opt/service_finder/postgres/data/base/16537/6110 +/opt/service_finder/postgres/data/base/16537/18160 +/opt/service_finder/postgres/data/base/16537/17259 +/opt/service_finder/postgres/data/base/16537/16940 +/opt/service_finder/postgres/data/base/16537/113 +/opt/service_finder/postgres/data/base/16537/17113 +/opt/service_finder/postgres/data/base/16537/1247_fsm +/opt/service_finder/postgres/data/base/16537/2682 +/opt/service_finder/postgres/data/base/16537/13471 +/opt/service_finder/postgres/data/base/16537/17504 +/opt/service_finder/postgres/data/base/16537/13473 +/opt/service_finder/postgres/data/base/16537/18166 +/opt/service_finder/postgres/data/base/16537/3608 +/opt/service_finder/postgres/data/base/16537/17019 +/opt/service_finder/postgres/data/base/16537/17178 +/opt/service_finder/postgres/data/base/16537/17030 +/opt/service_finder/postgres/data/base/16537/4173 +/opt/service_finder/postgres/data/base/16537/17179 +/opt/service_finder/postgres/data/base/16537/2679 +/opt/service_finder/postgres/data/base/16537/17599 +/opt/service_finder/postgres/data/base/16537/17776 +/opt/service_finder/postgres/data/base/16537/3379 +/opt/service_finder/postgres/data/base/16537/2616 +/opt/service_finder/postgres/data/base/16537/18168 +/opt/service_finder/postgres/data/base/16537/2839 +/opt/service_finder/postgres/data/base/16537/18567 +/opt/service_finder/postgres/data/base/16537/16936 +/opt/service_finder/postgres/data/base/16537/3764 +/opt/service_finder/postgres/data/base/16537/2661 +/opt/service_finder/postgres/data/base/16537/18084 +/opt/service_finder/postgres/data/base/16537/2835 +/opt/service_finder/postgres/data/base/16537/17275 +/opt/service_finder/postgres/data/base/16537/2619 +/opt/service_finder/postgres/data/base/16537/2608_fsm +/opt/service_finder/postgres/data/base/16537/2655 +/opt/service_finder/postgres/data/base/16537/3766 +/opt/service_finder/postgres/data/base/16537/3394 +/opt/service_finder/postgres/data/base/16537/17995 +/opt/service_finder/postgres/data/base/16537/3080 +/opt/service_finder/postgres/data/base/16537/2619_fsm +/opt/service_finder/postgres/data/base/16537/17201 +/opt/service_finder/postgres/data/base/16537/3541_vm +/opt/service_finder/postgres/data/base/16537/17611 +/opt/service_finder/postgres/data/base/16537/4164 +/opt/service_finder/postgres/data/base/16537/16955 +/opt/service_finder/postgres/data/base/16537/3502 +/opt/service_finder/postgres/data/base/16537/4159 +/opt/service_finder/postgres/data/base/16537/2613 +/opt/service_finder/postgres/data/base/16537/16946 +/opt/service_finder/postgres/data/base/16537/17720 +/opt/service_finder/postgres/data/base/16537/16984 +/opt/service_finder/postgres/data/base/16537/4153 +/opt/service_finder/postgres/data/base/16537/17242 +/opt/service_finder/postgres/data/base/16537/16965 +/opt/service_finder/postgres/data/base/16537/17447 +/opt/service_finder/postgres/data/base/16537/16920 +/opt/service_finder/postgres/data/base/16537/17060 +/opt/service_finder/postgres/data/base/16537/17547 +/opt/service_finder/postgres/data/base/16537/17039 +/opt/service_finder/postgres/data/base/16537/6112 +/opt/service_finder/postgres/data/base/16537/3456_vm +/opt/service_finder/postgres/data/base/16537/18584 +/opt/service_finder/postgres/data/base/16537/2616_fsm +/opt/service_finder/postgres/data/base/16537/17404 +/opt/service_finder/postgres/data/base/16537/2224 +/opt/service_finder/postgres/data/base/16537/18244 +/opt/service_finder/postgres/data/base/16537/17799 +/opt/service_finder/postgres/data/base/16537/17276 +/opt/service_finder/postgres/data/base/16537/2603 +/opt/service_finder/postgres/data/base/16537/2665 +/opt/service_finder/postgres/data/base/16537/17940 +/opt/service_finder/postgres/data/base/16537/18205 +/opt/service_finder/postgres/data/base/16537/16992 +/opt/service_finder/postgres/data/base/16537/2755 +/opt/service_finder/postgres/data/base/16537/18575 +/opt/service_finder/postgres/data/base/16537/17672 +/opt/service_finder/postgres/data/base/16537/3604 +/opt/service_finder/postgres/data/base/16537/17118 +/opt/service_finder/postgres/data/base/16537/2609 +/opt/service_finder/postgres/data/base/16537/2659 +/opt/service_finder/postgres/data/base/16537/2612 +/opt/service_finder/postgres/data/base/16537/13466 +/opt/service_finder/postgres/data/base/16537/17182 +/opt/service_finder/postgres/data/base/16537/18258 +/opt/service_finder/postgres/data/base/16537/2690 +/opt/service_finder/postgres/data/base/16537/2838 +/opt/service_finder/postgres/data/base/16537/18180 +/opt/service_finder/postgres/data/base/16537/1249 +/opt/service_finder/postgres/data/base/16537/3429 +/opt/service_finder/postgres/data/base/16537/828 +/opt/service_finder/postgres/data/base/16537/3599 +/opt/service_finder/postgres/data/base/16537/2680 +/opt/service_finder/postgres/data/base/16537/3534 +/opt/service_finder/postgres/data/base/16537/2836_vm +/opt/service_finder/postgres/data/base/16537/2618 +/opt/service_finder/postgres/data/base/16537/2840_vm +/opt/service_finder/postgres/data/base/16537/17528 +/opt/service_finder/postgres/data/base/16537/2654 +/opt/service_finder/postgres/data/base/16537/4166 +/opt/service_finder/postgres/data/base/16537/18167 +/opt/service_finder/postgres/data/base/16537/2600_fsm +/opt/service_finder/postgres/data/base/16537/16975 +/opt/service_finder/postgres/data/base/16537/17128 +/opt/service_finder/postgres/data/base/16537/2841 +/opt/service_finder/postgres/data/base/16537/2617_vm +/opt/service_finder/postgres/data/base/16537/2996 +/opt/service_finder/postgres/data/base/16537/17110 +/opt/service_finder/postgres/data/base/16537/3433 +/opt/service_finder/postgres/data/base/16537/2684 +/opt/service_finder/postgres/data/base/16537/3603_fsm +/opt/service_finder/postgres/data/base/16537/16954 +/opt/service_finder/postgres/data/base/16537/17767 +/opt/service_finder/postgres/data/base/16537/18206 +/opt/service_finder/postgres/data/base/16537/17581 +/opt/service_finder/postgres/data/base/16537/17335 +/opt/service_finder/postgres/data/base/16537/1247_vm +/opt/service_finder/postgres/data/base/16537/17172 +/opt/service_finder/postgres/data/base/16537/3394_fsm +/opt/service_finder/postgres/data/base/16537/17946 +/opt/service_finder/postgres/data/base/16537/6175 +/opt/service_finder/postgres/data/base/16537/17336 +/opt/service_finder/postgres/data/base/16537/2834 +/opt/service_finder/postgres/data/base/16537/3609 +/opt/service_finder/postgres/data/base/16537/18571 +/opt/service_finder/postgres/data/base/16537/2692 +/opt/service_finder/postgres/data/base/16537/3600_fsm +/opt/service_finder/postgres/data/base/16537/2701 +/opt/service_finder/postgres/data/base/16537/4160 +/opt/service_finder/postgres/data/base/16537/4146 +/opt/service_finder/postgres/data/base/16537/1418 +/opt/service_finder/postgres/data/base/16537/6116 +/opt/service_finder/postgres/data/base/16537/18129 +/opt/service_finder/postgres/data/base/16537/6104 +/opt/service_finder/postgres/data/base/16537/17345 +/opt/service_finder/postgres/data/base/16537/17031 +/opt/service_finder/postgres/data/base/16537/17417 +/opt/service_finder/postgres/data/base/16537/1247 +/opt/service_finder/postgres/data/base/16537/2651 +/opt/service_finder/postgres/data/base/16537/3456_fsm +/opt/service_finder/postgres/data/base/16537/2616_vm +/opt/service_finder/postgres/data/base/16537/17939 +/opt/service_finder/postgres/data/base/16537/4156 +/opt/service_finder/postgres/data/base/16537/18117 +/opt/service_finder/postgres/data/base/16537/17355 +/opt/service_finder/postgres/data/base/16537/4169 +/opt/service_finder/postgres/data/base/16537/2833 +/opt/service_finder/postgres/data/base/16537/17969 +/opt/service_finder/postgres/data/base/16537/2836 +/opt/service_finder/postgres/data/base/16537/4151 +/opt/service_finder/postgres/data/base/16537/174 +/opt/service_finder/postgres/data/base/16537/17158 +/opt/service_finder/postgres/data/base/16537/6111 +/opt/service_finder/postgres/data/base/16537/3602_fsm +/opt/service_finder/postgres/data/base/16537/17494 +/opt/service_finder/postgres/data/base/16537/13463_fsm +/opt/service_finder/postgres/data/base/16537/18047 +/opt/service_finder/postgres/data/base/16537/2618_vm +/opt/service_finder/postgres/data/base/16537/13478 +/opt/service_finder/postgres/data/base/16537/18204 +/opt/service_finder/postgres/data/base/16537/17612 +/opt/service_finder/postgres/data/base/16537/17642 +/opt/service_finder/postgres/data/base/16537/16919 +/opt/service_finder/postgres/data/base/16537/17302 +/opt/service_finder/postgres/data/base/16537/2678 +/opt/service_finder/postgres/data/base/16537/2683 +/opt/service_finder/postgres/data/base/16537/2656 +/opt/service_finder/postgres/data/base/16537/17357 +/opt/service_finder/postgres/data/base/16537/18240 +/opt/service_finder/postgres/data/base/16537/17916 +/opt/service_finder/postgres/data/base/16537/2667 +/opt/service_finder/postgres/data/base/16537/3119 +/opt/service_finder/postgres/data/base/16537/17994 +/opt/service_finder/postgres/data/base/16537/17972 +/opt/service_finder/postgres/data/base/16537/2600 +/opt/service_finder/postgres/data/base/16537/2620 +/opt/service_finder/postgres/data/base/16537/17097 +/opt/service_finder/postgres/data/base/16537/18250 +/opt/service_finder/postgres/data/base/16537/2753 +/opt/service_finder/postgres/data/base/16537/16941 +/opt/service_finder/postgres/data/base/16537/112 +/opt/service_finder/postgres/data/base/16537/17252 +/opt/service_finder/postgres/data/base/16537/2608_vm +/opt/service_finder/postgres/data/base/16537/3575 +/opt/service_finder/postgres/data/base/16537/18581 +/opt/service_finder/postgres/data/base/16537/17634 +/opt/service_finder/postgres/data/base/16537/3767 +/opt/service_finder/postgres/data/base/16537/6113 +/opt/service_finder/postgres/data/base/16537/18196 +/opt/service_finder/postgres/data/base/16537/17203 +/opt/service_finder/postgres/data/base/16537/13473_vm +/opt/service_finder/postgres/data/base/16537/3542 +/opt/service_finder/postgres/data/base/16537/1259 +/opt/service_finder/postgres/data/base/16537/17327 +/opt/service_finder/postgres/data/base/16537/2604 +/opt/service_finder/postgres/data/base/16537/17126 +/opt/service_finder/postgres/data/base/16537/2840 +/opt/service_finder/postgres/data/base/16537/17942 +/opt/service_finder/postgres/data/base/16537/17069 +/opt/service_finder/postgres/data/base/16537/3601 +/opt/service_finder/postgres/data/base/16537/2605_vm +/opt/service_finder/postgres/data/base/16537/2606_fsm +/opt/service_finder/postgres/data/base/16537/2830 +/opt/service_finder/postgres/data/base/16537/13468 +/opt/service_finder/postgres/data/base/16537/17303 +/opt/service_finder/postgres/data/base/16537/6239 +/opt/service_finder/postgres/data/base/16537/3430 +/opt/service_finder/postgres/data/base/16537/2607_fsm +/opt/service_finder/postgres/data/base/16537/2617 +/opt/service_finder/postgres/data/base/16537/17194 +/opt/service_finder/postgres/data/base/16537/18213 +/opt/service_finder/postgres/data/base/16537/17088 +/opt/service_finder/postgres/data/base/16537/17029 +/opt/service_finder/postgres/data/base/16537/18249 +/opt/service_finder/postgres/data/base/16537/2702 +/opt/service_finder/postgres/data/base/16537/13478_fsm +/opt/service_finder/postgres/data/base/16537/4174 +/opt/service_finder/postgres/data/base/16537/16943 +/opt/service_finder/postgres/data/base/16537/18130 +/opt/service_finder/postgres/data/base/16537/6106 +/opt/service_finder/postgres/data/base/16537/2681 +/opt/service_finder/postgres/data/base/16537/6238 +/opt/service_finder/postgres/data/base/16537/16976 +/opt/service_finder/postgres/data/base/16537/17925 +/opt/service_finder/postgres/data/base/16537/17301 +/opt/service_finder/postgres/data/base/16537/2610_vm +/opt/service_finder/postgres/data/base/16537/17277 +/opt/service_finder/postgres/data/base/16537/2838_fsm +/opt/service_finder/postgres/data/base/16537/4172 +/opt/service_finder/postgres/data/base/16537/16983 +/opt/service_finder/postgres/data/base/16537/175 +/opt/service_finder/postgres/data/base/16537/18239 +/opt/service_finder/postgres/data/base/16537/3541 +/opt/service_finder/postgres/data/base/16537/2832 +/opt/service_finder/postgres/data/base/16537/2601_fsm +/opt/service_finder/postgres/data/base/16537/17078 +/opt/service_finder/postgres/data/base/16537/4170 +/opt/service_finder/postgres/data/base/16537/3603 +/opt/service_finder/postgres/data/base/16537/18046 +/opt/service_finder/postgres/data/base/16537/17147 +/opt/service_finder/postgres/data/base/16537/17022 +/opt/service_finder/postgres/data/base/16537/17356 +/opt/service_finder/postgres/data/base/16537/17408 +/opt/service_finder/postgres/data/base/16537/17416 +/opt/service_finder/postgres/data/base/16537/2610 +/opt/service_finder/postgres/data/base/16537/2670 +/opt/service_finder/postgres/data/base/16537/17745 +/opt/service_finder/postgres/data/base/16537/1249_vm +/opt/service_finder/postgres/data/base/16537/2601 +/opt/service_finder/postgres/data/base/16537/17597 +/opt/service_finder/postgres/data/base/16537/2605_fsm +/opt/service_finder/postgres/data/base/16537/3081 +/opt/service_finder/postgres/data/base/16537/18573 +/opt/service_finder/postgres/data/base/16537/4154 +/opt/service_finder/postgres/data/base/16537/3456 +/opt/service_finder/postgres/data/base/16537/13468_vm +/opt/service_finder/postgres/data/base/16537/13468_fsm +/opt/service_finder/postgres/data/base/16537/16950 +/opt/service_finder/postgres/data/base/16537/2603_fsm +/opt/service_finder/postgres/data/base/16537/2687 +/opt/service_finder/postgres/data/base/16537/2608 +/opt/service_finder/postgres/data/base/16537/2664 +/opt/service_finder/postgres/data/base/16537/2840_fsm +/opt/service_finder/postgres/data/base/16537/17116 +/opt/service_finder/postgres/data/base/16537/17807 +/opt/service_finder/postgres/data/base/16537/3576 +/opt/service_finder/postgres/data/base/1 +/opt/service_finder/postgres/data/base/1/3079_fsm +/opt/service_finder/postgres/data/base/1/4143 +/opt/service_finder/postgres/data/base/1/3455 +/opt/service_finder/postgres/data/base/1/2686 +/opt/service_finder/postgres/data/base/1/pg_filenode.map +/opt/service_finder/postgres/data/base/1/3602_vm +/opt/service_finder/postgres/data/base/1/1255_vm +/opt/service_finder/postgres/data/base/1/2601_vm +/opt/service_finder/postgres/data/base/1/2838_vm +/opt/service_finder/postgres/data/base/1/13478_vm +/opt/service_finder/postgres/data/base/1/2836_fsm +/opt/service_finder/postgres/data/base/1/3164 +/opt/service_finder/postgres/data/base/1/13477 +/opt/service_finder/postgres/data/base/1/3351 +/opt/service_finder/postgres/data/base/1/3600_vm +/opt/service_finder/postgres/data/base/1/5002 +/opt/service_finder/postgres/data/base/1/1255_fsm +/opt/service_finder/postgres/data/base/1/3380 +/opt/service_finder/postgres/data/base/1/3381 +/opt/service_finder/postgres/data/base/1/2663 +/opt/service_finder/postgres/data/base/1/3601_fsm +/opt/service_finder/postgres/data/base/1/4148 +/opt/service_finder/postgres/data/base/1/2618_fsm +/opt/service_finder/postgres/data/base/1/3440 +/opt/service_finder/postgres/data/base/1/2619_vm +/opt/service_finder/postgres/data/base/1/3467 +/opt/service_finder/postgres/data/base/1/2688 +/opt/service_finder/postgres/data/base/1/3997 +/opt/service_finder/postgres/data/base/1/2662 +/opt/service_finder/postgres/data/base/1/6229 +/opt/service_finder/postgres/data/base/1/3439 +/opt/service_finder/postgres/data/base/1/2657 +/opt/service_finder/postgres/data/base/1/2609_vm +/opt/service_finder/postgres/data/base/1/4157 +/opt/service_finder/postgres/data/base/1/3257 +/opt/service_finder/postgres/data/base/1/3503 +/opt/service_finder/postgres/data/base/1/13463 +/opt/service_finder/postgres/data/base/1/3541_fsm +/opt/service_finder/postgres/data/base/1/2756 +/opt/service_finder/postgres/data/base/1/2615_vm +/opt/service_finder/postgres/data/base/1/1259_vm +/opt/service_finder/postgres/data/base/1/3256 +/opt/service_finder/postgres/data/base/1/2615_fsm +/opt/service_finder/postgres/data/base/1/2703 +/opt/service_finder/postgres/data/base/1/2753_vm +/opt/service_finder/postgres/data/base/1/2603_vm +/opt/service_finder/postgres/data/base/1/1249_fsm +/opt/service_finder/postgres/data/base/1/3600 +/opt/service_finder/postgres/data/base/1/2653 +/opt/service_finder/postgres/data/base/1/2337 +/opt/service_finder/postgres/data/base/1/13473_fsm +/opt/service_finder/postgres/data/base/1/3085 +/opt/service_finder/postgres/data/base/1/2995 +/opt/service_finder/postgres/data/base/1/2336 +/opt/service_finder/postgres/data/base/1/2612_fsm +/opt/service_finder/postgres/data/base/1/3258 +/opt/service_finder/postgres/data/base/1/3466 +/opt/service_finder/postgres/data/base/1/3079 +/opt/service_finder/postgres/data/base/1/4144 +/opt/service_finder/postgres/data/base/1/1417 +/opt/service_finder/postgres/data/base/1/13472 +/opt/service_finder/postgres/data/base/1/2666 +/opt/service_finder/postgres/data/base/1/13467 +/opt/service_finder/postgres/data/base/1/6228 +/opt/service_finder/postgres/data/base/1/6117 +/opt/service_finder/postgres/data/base/1/2757 +/opt/service_finder/postgres/data/base/1/2685 +/opt/service_finder/postgres/data/base/1/2612_vm +/opt/service_finder/postgres/data/base/1/2615 +/opt/service_finder/postgres/data/base/1/3501 +/opt/service_finder/postgres/data/base/1/3602 +/opt/service_finder/postgres/data/base/1/6176 +/opt/service_finder/postgres/data/base/1/2605 +/opt/service_finder/postgres/data/base/1/2674 +/opt/service_finder/postgres/data/base/1/2754 +/opt/service_finder/postgres/data/base/1/13463_vm +/opt/service_finder/postgres/data/base/1/549 +/opt/service_finder/postgres/data/base/1/3712 +/opt/service_finder/postgres/data/base/1/2669 +/opt/service_finder/postgres/data/base/1/2689 +/opt/service_finder/postgres/data/base/1/4152 +/opt/service_finder/postgres/data/base/1/3395 +/opt/service_finder/postgres/data/base/1/2693 +/opt/service_finder/postgres/data/base/1/4149 +/opt/service_finder/postgres/data/base/1/548 +/opt/service_finder/postgres/data/base/1/2699 +/opt/service_finder/postgres/data/base/1/2673 +/opt/service_finder/postgres/data/base/1/3431 +/opt/service_finder/postgres/data/base/1/3574 +/opt/service_finder/postgres/data/base/1/3468 +/opt/service_finder/postgres/data/base/1/4171 +/opt/service_finder/postgres/data/base/1/4163 +/opt/service_finder/postgres/data/base/1/2696 +/opt/service_finder/postgres/data/base/1/4168 +/opt/service_finder/postgres/data/base/1/6102 +/opt/service_finder/postgres/data/base/1/3597 +/opt/service_finder/postgres/data/base/1/PG_VERSION +/opt/service_finder/postgres/data/base/1/2837 +/opt/service_finder/postgres/data/base/1/2579 +/opt/service_finder/postgres/data/base/1/827 +/opt/service_finder/postgres/data/base/1/4158 +/opt/service_finder/postgres/data/base/1/2691 +/opt/service_finder/postgres/data/base/1/826 +/opt/service_finder/postgres/data/base/1/2660 +/opt/service_finder/postgres/data/base/1/3596 +/opt/service_finder/postgres/data/base/1/2228 +/opt/service_finder/postgres/data/base/1/3605 +/opt/service_finder/postgres/data/base/1/2668 +/opt/service_finder/postgres/data/base/1/4145 +/opt/service_finder/postgres/data/base/1/13481 +/opt/service_finder/postgres/data/base/1/2602_vm +/opt/service_finder/postgres/data/base/1/2602_fsm +/opt/service_finder/postgres/data/base/1/3079_vm +/opt/service_finder/postgres/data/base/1/4155 +/opt/service_finder/postgres/data/base/1/13476 +/opt/service_finder/postgres/data/base/1/2617_fsm +/opt/service_finder/postgres/data/base/1/2607_vm +/opt/service_finder/postgres/data/base/1/2606 +/opt/service_finder/postgres/data/base/1/2610_fsm +/opt/service_finder/postgres/data/base/1/2831 +/opt/service_finder/postgres/data/base/1/3394_vm +/opt/service_finder/postgres/data/base/1/4147 +/opt/service_finder/postgres/data/base/1/1255 +/opt/service_finder/postgres/data/base/1/2607 +/opt/service_finder/postgres/data/base/1/2611 +/opt/service_finder/postgres/data/base/1/2753_fsm +/opt/service_finder/postgres/data/base/1/2187 +/opt/service_finder/postgres/data/base/1/2650 +/opt/service_finder/postgres/data/base/1/3601_vm +/opt/service_finder/postgres/data/base/1/2658 +/opt/service_finder/postgres/data/base/1/2606_vm +/opt/service_finder/postgres/data/base/1/13482 +/opt/service_finder/postgres/data/base/1/2602 +/opt/service_finder/postgres/data/base/1/2609_fsm +/opt/service_finder/postgres/data/base/1/3607 +/opt/service_finder/postgres/data/base/1/3764_fsm +/opt/service_finder/postgres/data/base/1/4165 +/opt/service_finder/postgres/data/base/1/3764_vm +/opt/service_finder/postgres/data/base/1/4167 +/opt/service_finder/postgres/data/base/1/2600_vm +/opt/service_finder/postgres/data/base/1/3350 +/opt/service_finder/postgres/data/base/1/2652 +/opt/service_finder/postgres/data/base/1/3118 +/opt/service_finder/postgres/data/base/1/3603_vm +/opt/service_finder/postgres/data/base/1/2704 +/opt/service_finder/postgres/data/base/1/2328 +/opt/service_finder/postgres/data/base/1/6237 +/opt/service_finder/postgres/data/base/1/4150 +/opt/service_finder/postgres/data/base/1/3606 +/opt/service_finder/postgres/data/base/1/1259_fsm +/opt/service_finder/postgres/data/base/1/2675 +/opt/service_finder/postgres/data/base/1/3598 +/opt/service_finder/postgres/data/base/1/6110 +/opt/service_finder/postgres/data/base/1/113 +/opt/service_finder/postgres/data/base/1/1247_fsm +/opt/service_finder/postgres/data/base/1/2682 +/opt/service_finder/postgres/data/base/1/13471 +/opt/service_finder/postgres/data/base/1/13473 +/opt/service_finder/postgres/data/base/1/3608 +/opt/service_finder/postgres/data/base/1/4173 +/opt/service_finder/postgres/data/base/1/2679 +/opt/service_finder/postgres/data/base/1/3379 +/opt/service_finder/postgres/data/base/1/2616 +/opt/service_finder/postgres/data/base/1/2839 +/opt/service_finder/postgres/data/base/1/3764 +/opt/service_finder/postgres/data/base/1/2661 +/opt/service_finder/postgres/data/base/1/2835 +/opt/service_finder/postgres/data/base/1/2619 +/opt/service_finder/postgres/data/base/1/2608_fsm +/opt/service_finder/postgres/data/base/1/2655 +/opt/service_finder/postgres/data/base/1/3766 +/opt/service_finder/postgres/data/base/1/3394 +/opt/service_finder/postgres/data/base/1/3080 +/opt/service_finder/postgres/data/base/1/2619_fsm +/opt/service_finder/postgres/data/base/1/3541_vm +/opt/service_finder/postgres/data/base/1/4164 +/opt/service_finder/postgres/data/base/1/3502 +/opt/service_finder/postgres/data/base/1/4159 +/opt/service_finder/postgres/data/base/1/2613 +/opt/service_finder/postgres/data/base/1/4153 +/opt/service_finder/postgres/data/base/1/6112 +/opt/service_finder/postgres/data/base/1/3456_vm +/opt/service_finder/postgres/data/base/1/2616_fsm +/opt/service_finder/postgres/data/base/1/2224 +/opt/service_finder/postgres/data/base/1/2603 +/opt/service_finder/postgres/data/base/1/2665 +/opt/service_finder/postgres/data/base/1/2755 +/opt/service_finder/postgres/data/base/1/3604 +/opt/service_finder/postgres/data/base/1/2609 +/opt/service_finder/postgres/data/base/1/2659 +/opt/service_finder/postgres/data/base/1/2612 +/opt/service_finder/postgres/data/base/1/13466 +/opt/service_finder/postgres/data/base/1/2690 +/opt/service_finder/postgres/data/base/1/2838 +/opt/service_finder/postgres/data/base/1/1249 +/opt/service_finder/postgres/data/base/1/3429 +/opt/service_finder/postgres/data/base/1/828 +/opt/service_finder/postgres/data/base/1/3599 +/opt/service_finder/postgres/data/base/1/2680 +/opt/service_finder/postgres/data/base/1/3534 +/opt/service_finder/postgres/data/base/1/2836_vm +/opt/service_finder/postgres/data/base/1/2618 +/opt/service_finder/postgres/data/base/1/2840_vm +/opt/service_finder/postgres/data/base/1/2654 +/opt/service_finder/postgres/data/base/1/4166 +/opt/service_finder/postgres/data/base/1/2600_fsm +/opt/service_finder/postgres/data/base/1/2841 +/opt/service_finder/postgres/data/base/1/2617_vm +/opt/service_finder/postgres/data/base/1/2996 +/opt/service_finder/postgres/data/base/1/3433 +/opt/service_finder/postgres/data/base/1/2684 +/opt/service_finder/postgres/data/base/1/3603_fsm +/opt/service_finder/postgres/data/base/1/1247_vm +/opt/service_finder/postgres/data/base/1/3394_fsm +/opt/service_finder/postgres/data/base/1/6175 +/opt/service_finder/postgres/data/base/1/2834 +/opt/service_finder/postgres/data/base/1/3609 +/opt/service_finder/postgres/data/base/1/2692 +/opt/service_finder/postgres/data/base/1/3600_fsm +/opt/service_finder/postgres/data/base/1/2701 +/opt/service_finder/postgres/data/base/1/4160 +/opt/service_finder/postgres/data/base/1/4146 +/opt/service_finder/postgres/data/base/1/1418 +/opt/service_finder/postgres/data/base/1/6116 +/opt/service_finder/postgres/data/base/1/6104 +/opt/service_finder/postgres/data/base/1/1247 +/opt/service_finder/postgres/data/base/1/2651 +/opt/service_finder/postgres/data/base/1/3456_fsm +/opt/service_finder/postgres/data/base/1/2616_vm +/opt/service_finder/postgres/data/base/1/4156 +/opt/service_finder/postgres/data/base/1/4169 +/opt/service_finder/postgres/data/base/1/2833 +/opt/service_finder/postgres/data/base/1/2836 +/opt/service_finder/postgres/data/base/1/4151 +/opt/service_finder/postgres/data/base/1/174 +/opt/service_finder/postgres/data/base/1/6111 +/opt/service_finder/postgres/data/base/1/3602_fsm +/opt/service_finder/postgres/data/base/1/13463_fsm +/opt/service_finder/postgres/data/base/1/2618_vm +/opt/service_finder/postgres/data/base/1/13478 +/opt/service_finder/postgres/data/base/1/2678 +/opt/service_finder/postgres/data/base/1/2683 +/opt/service_finder/postgres/data/base/1/2656 +/opt/service_finder/postgres/data/base/1/2667 +/opt/service_finder/postgres/data/base/1/3119 +/opt/service_finder/postgres/data/base/1/2600 +/opt/service_finder/postgres/data/base/1/2620 +/opt/service_finder/postgres/data/base/1/2753 +/opt/service_finder/postgres/data/base/1/112 +/opt/service_finder/postgres/data/base/1/2608_vm +/opt/service_finder/postgres/data/base/1/3575 +/opt/service_finder/postgres/data/base/1/3767 +/opt/service_finder/postgres/data/base/1/6113 +/opt/service_finder/postgres/data/base/1/13473_vm +/opt/service_finder/postgres/data/base/1/3542 +/opt/service_finder/postgres/data/base/1/1259 +/opt/service_finder/postgres/data/base/1/2604 +/opt/service_finder/postgres/data/base/1/2840 +/opt/service_finder/postgres/data/base/1/3601 +/opt/service_finder/postgres/data/base/1/2605_vm +/opt/service_finder/postgres/data/base/1/2606_fsm +/opt/service_finder/postgres/data/base/1/2830 +/opt/service_finder/postgres/data/base/1/13468 +/opt/service_finder/postgres/data/base/1/6239 +/opt/service_finder/postgres/data/base/1/3430 +/opt/service_finder/postgres/data/base/1/2607_fsm +/opt/service_finder/postgres/data/base/1/2617 +/opt/service_finder/postgres/data/base/1/2702 +/opt/service_finder/postgres/data/base/1/13478_fsm +/opt/service_finder/postgres/data/base/1/4174 +/opt/service_finder/postgres/data/base/1/6106 +/opt/service_finder/postgres/data/base/1/2681 +/opt/service_finder/postgres/data/base/1/6238 +/opt/service_finder/postgres/data/base/1/2610_vm +/opt/service_finder/postgres/data/base/1/2838_fsm +/opt/service_finder/postgres/data/base/1/4172 +/opt/service_finder/postgres/data/base/1/175 +/opt/service_finder/postgres/data/base/1/3541 +/opt/service_finder/postgres/data/base/1/2832 +/opt/service_finder/postgres/data/base/1/2601_fsm +/opt/service_finder/postgres/data/base/1/4170 +/opt/service_finder/postgres/data/base/1/3603 +/opt/service_finder/postgres/data/base/1/2610 +/opt/service_finder/postgres/data/base/1/2670 +/opt/service_finder/postgres/data/base/1/1249_vm +/opt/service_finder/postgres/data/base/1/2601 +/opt/service_finder/postgres/data/base/1/2605_fsm +/opt/service_finder/postgres/data/base/1/3081 +/opt/service_finder/postgres/data/base/1/4154 +/opt/service_finder/postgres/data/base/1/3456 +/opt/service_finder/postgres/data/base/1/13468_vm +/opt/service_finder/postgres/data/base/1/13468_fsm +/opt/service_finder/postgres/data/base/1/2603_fsm +/opt/service_finder/postgres/data/base/1/2687 +/opt/service_finder/postgres/data/base/1/2608 +/opt/service_finder/postgres/data/base/1/2664 +/opt/service_finder/postgres/data/base/1/2840_fsm +/opt/service_finder/postgres/data/base/1/3576 +/opt/service_finder/postgres/data/base/4 +/opt/service_finder/postgres/data/base/4/3079_fsm +/opt/service_finder/postgres/data/base/4/4143 +/opt/service_finder/postgres/data/base/4/3455 +/opt/service_finder/postgres/data/base/4/2686 +/opt/service_finder/postgres/data/base/4/pg_filenode.map +/opt/service_finder/postgres/data/base/4/3602_vm +/opt/service_finder/postgres/data/base/4/1255_vm +/opt/service_finder/postgres/data/base/4/2601_vm +/opt/service_finder/postgres/data/base/4/2838_vm +/opt/service_finder/postgres/data/base/4/13478_vm +/opt/service_finder/postgres/data/base/4/2836_fsm +/opt/service_finder/postgres/data/base/4/3164 +/opt/service_finder/postgres/data/base/4/13477 +/opt/service_finder/postgres/data/base/4/3351 +/opt/service_finder/postgres/data/base/4/3600_vm +/opt/service_finder/postgres/data/base/4/5002 +/opt/service_finder/postgres/data/base/4/1255_fsm +/opt/service_finder/postgres/data/base/4/3380 +/opt/service_finder/postgres/data/base/4/3381 +/opt/service_finder/postgres/data/base/4/2663 +/opt/service_finder/postgres/data/base/4/3601_fsm +/opt/service_finder/postgres/data/base/4/4148 +/opt/service_finder/postgres/data/base/4/2618_fsm +/opt/service_finder/postgres/data/base/4/3440 +/opt/service_finder/postgres/data/base/4/2619_vm +/opt/service_finder/postgres/data/base/4/3467 +/opt/service_finder/postgres/data/base/4/2688 +/opt/service_finder/postgres/data/base/4/3997 +/opt/service_finder/postgres/data/base/4/2662 +/opt/service_finder/postgres/data/base/4/6229 +/opt/service_finder/postgres/data/base/4/3439 +/opt/service_finder/postgres/data/base/4/2657 +/opt/service_finder/postgres/data/base/4/2609_vm +/opt/service_finder/postgres/data/base/4/4157 +/opt/service_finder/postgres/data/base/4/3257 +/opt/service_finder/postgres/data/base/4/3503 +/opt/service_finder/postgres/data/base/4/13463 +/opt/service_finder/postgres/data/base/4/3541_fsm +/opt/service_finder/postgres/data/base/4/2756 +/opt/service_finder/postgres/data/base/4/2615_vm +/opt/service_finder/postgres/data/base/4/1259_vm +/opt/service_finder/postgres/data/base/4/3256 +/opt/service_finder/postgres/data/base/4/2615_fsm +/opt/service_finder/postgres/data/base/4/2703 +/opt/service_finder/postgres/data/base/4/2753_vm +/opt/service_finder/postgres/data/base/4/2603_vm +/opt/service_finder/postgres/data/base/4/1249_fsm +/opt/service_finder/postgres/data/base/4/3600 +/opt/service_finder/postgres/data/base/4/2653 +/opt/service_finder/postgres/data/base/4/2337 +/opt/service_finder/postgres/data/base/4/13473_fsm +/opt/service_finder/postgres/data/base/4/3085 +/opt/service_finder/postgres/data/base/4/2995 +/opt/service_finder/postgres/data/base/4/2336 +/opt/service_finder/postgres/data/base/4/2612_fsm +/opt/service_finder/postgres/data/base/4/3258 +/opt/service_finder/postgres/data/base/4/3466 +/opt/service_finder/postgres/data/base/4/3079 +/opt/service_finder/postgres/data/base/4/4144 +/opt/service_finder/postgres/data/base/4/1417 +/opt/service_finder/postgres/data/base/4/13472 +/opt/service_finder/postgres/data/base/4/2666 +/opt/service_finder/postgres/data/base/4/13467 +/opt/service_finder/postgres/data/base/4/6228 +/opt/service_finder/postgres/data/base/4/6117 +/opt/service_finder/postgres/data/base/4/2757 +/opt/service_finder/postgres/data/base/4/2685 +/opt/service_finder/postgres/data/base/4/2612_vm +/opt/service_finder/postgres/data/base/4/2615 +/opt/service_finder/postgres/data/base/4/3501 +/opt/service_finder/postgres/data/base/4/3602 +/opt/service_finder/postgres/data/base/4/6176 +/opt/service_finder/postgres/data/base/4/2605 +/opt/service_finder/postgres/data/base/4/2674 +/opt/service_finder/postgres/data/base/4/2754 +/opt/service_finder/postgres/data/base/4/13463_vm +/opt/service_finder/postgres/data/base/4/549 +/opt/service_finder/postgres/data/base/4/3712 +/opt/service_finder/postgres/data/base/4/2669 +/opt/service_finder/postgres/data/base/4/2689 +/opt/service_finder/postgres/data/base/4/4152 +/opt/service_finder/postgres/data/base/4/3395 +/opt/service_finder/postgres/data/base/4/2693 +/opt/service_finder/postgres/data/base/4/4149 +/opt/service_finder/postgres/data/base/4/548 +/opt/service_finder/postgres/data/base/4/2699 +/opt/service_finder/postgres/data/base/4/2673 +/opt/service_finder/postgres/data/base/4/3431 +/opt/service_finder/postgres/data/base/4/3574 +/opt/service_finder/postgres/data/base/4/3468 +/opt/service_finder/postgres/data/base/4/4171 +/opt/service_finder/postgres/data/base/4/4163 +/opt/service_finder/postgres/data/base/4/2696 +/opt/service_finder/postgres/data/base/4/4168 +/opt/service_finder/postgres/data/base/4/6102 +/opt/service_finder/postgres/data/base/4/3597 +/opt/service_finder/postgres/data/base/4/PG_VERSION +/opt/service_finder/postgres/data/base/4/2837 +/opt/service_finder/postgres/data/base/4/2579 +/opt/service_finder/postgres/data/base/4/827 +/opt/service_finder/postgres/data/base/4/4158 +/opt/service_finder/postgres/data/base/4/2691 +/opt/service_finder/postgres/data/base/4/826 +/opt/service_finder/postgres/data/base/4/2660 +/opt/service_finder/postgres/data/base/4/3596 +/opt/service_finder/postgres/data/base/4/2228 +/opt/service_finder/postgres/data/base/4/3605 +/opt/service_finder/postgres/data/base/4/2668 +/opt/service_finder/postgres/data/base/4/4145 +/opt/service_finder/postgres/data/base/4/13481 +/opt/service_finder/postgres/data/base/4/2602_vm +/opt/service_finder/postgres/data/base/4/2602_fsm +/opt/service_finder/postgres/data/base/4/3079_vm +/opt/service_finder/postgres/data/base/4/4155 +/opt/service_finder/postgres/data/base/4/13476 +/opt/service_finder/postgres/data/base/4/2617_fsm +/opt/service_finder/postgres/data/base/4/2607_vm +/opt/service_finder/postgres/data/base/4/2606 +/opt/service_finder/postgres/data/base/4/2610_fsm +/opt/service_finder/postgres/data/base/4/2831 +/opt/service_finder/postgres/data/base/4/3394_vm +/opt/service_finder/postgres/data/base/4/4147 +/opt/service_finder/postgres/data/base/4/1255 +/opt/service_finder/postgres/data/base/4/2607 +/opt/service_finder/postgres/data/base/4/2611 +/opt/service_finder/postgres/data/base/4/2753_fsm +/opt/service_finder/postgres/data/base/4/2187 +/opt/service_finder/postgres/data/base/4/2650 +/opt/service_finder/postgres/data/base/4/3601_vm +/opt/service_finder/postgres/data/base/4/2658 +/opt/service_finder/postgres/data/base/4/2606_vm +/opt/service_finder/postgres/data/base/4/13482 +/opt/service_finder/postgres/data/base/4/2602 +/opt/service_finder/postgres/data/base/4/2609_fsm +/opt/service_finder/postgres/data/base/4/3607 +/opt/service_finder/postgres/data/base/4/3764_fsm +/opt/service_finder/postgres/data/base/4/4165 +/opt/service_finder/postgres/data/base/4/3764_vm +/opt/service_finder/postgres/data/base/4/4167 +/opt/service_finder/postgres/data/base/4/2600_vm +/opt/service_finder/postgres/data/base/4/3350 +/opt/service_finder/postgres/data/base/4/2652 +/opt/service_finder/postgres/data/base/4/3118 +/opt/service_finder/postgres/data/base/4/3603_vm +/opt/service_finder/postgres/data/base/4/2704 +/opt/service_finder/postgres/data/base/4/2328 +/opt/service_finder/postgres/data/base/4/6237 +/opt/service_finder/postgres/data/base/4/4150 +/opt/service_finder/postgres/data/base/4/3606 +/opt/service_finder/postgres/data/base/4/1259_fsm +/opt/service_finder/postgres/data/base/4/2675 +/opt/service_finder/postgres/data/base/4/3598 +/opt/service_finder/postgres/data/base/4/6110 +/opt/service_finder/postgres/data/base/4/113 +/opt/service_finder/postgres/data/base/4/1247_fsm +/opt/service_finder/postgres/data/base/4/2682 +/opt/service_finder/postgres/data/base/4/13471 +/opt/service_finder/postgres/data/base/4/13473 +/opt/service_finder/postgres/data/base/4/3608 +/opt/service_finder/postgres/data/base/4/4173 +/opt/service_finder/postgres/data/base/4/2679 +/opt/service_finder/postgres/data/base/4/3379 +/opt/service_finder/postgres/data/base/4/2616 +/opt/service_finder/postgres/data/base/4/2839 +/opt/service_finder/postgres/data/base/4/3764 +/opt/service_finder/postgres/data/base/4/2661 +/opt/service_finder/postgres/data/base/4/2835 +/opt/service_finder/postgres/data/base/4/2619 +/opt/service_finder/postgres/data/base/4/2608_fsm +/opt/service_finder/postgres/data/base/4/2655 +/opt/service_finder/postgres/data/base/4/3766 +/opt/service_finder/postgres/data/base/4/3394 +/opt/service_finder/postgres/data/base/4/3080 +/opt/service_finder/postgres/data/base/4/2619_fsm +/opt/service_finder/postgres/data/base/4/3541_vm +/opt/service_finder/postgres/data/base/4/4164 +/opt/service_finder/postgres/data/base/4/3502 +/opt/service_finder/postgres/data/base/4/4159 +/opt/service_finder/postgres/data/base/4/2613 +/opt/service_finder/postgres/data/base/4/4153 +/opt/service_finder/postgres/data/base/4/6112 +/opt/service_finder/postgres/data/base/4/3456_vm +/opt/service_finder/postgres/data/base/4/2616_fsm +/opt/service_finder/postgres/data/base/4/2224 +/opt/service_finder/postgres/data/base/4/2603 +/opt/service_finder/postgres/data/base/4/2665 +/opt/service_finder/postgres/data/base/4/2755 +/opt/service_finder/postgres/data/base/4/3604 +/opt/service_finder/postgres/data/base/4/2609 +/opt/service_finder/postgres/data/base/4/2659 +/opt/service_finder/postgres/data/base/4/2612 +/opt/service_finder/postgres/data/base/4/13466 +/opt/service_finder/postgres/data/base/4/2690 +/opt/service_finder/postgres/data/base/4/2838 +/opt/service_finder/postgres/data/base/4/1249 +/opt/service_finder/postgres/data/base/4/3429 +/opt/service_finder/postgres/data/base/4/828 +/opt/service_finder/postgres/data/base/4/3599 +/opt/service_finder/postgres/data/base/4/2680 +/opt/service_finder/postgres/data/base/4/3534 +/opt/service_finder/postgres/data/base/4/2836_vm +/opt/service_finder/postgres/data/base/4/2618 +/opt/service_finder/postgres/data/base/4/2840_vm +/opt/service_finder/postgres/data/base/4/2654 +/opt/service_finder/postgres/data/base/4/4166 +/opt/service_finder/postgres/data/base/4/2600_fsm +/opt/service_finder/postgres/data/base/4/2841 +/opt/service_finder/postgres/data/base/4/2617_vm +/opt/service_finder/postgres/data/base/4/2996 +/opt/service_finder/postgres/data/base/4/3433 +/opt/service_finder/postgres/data/base/4/2684 +/opt/service_finder/postgres/data/base/4/3603_fsm +/opt/service_finder/postgres/data/base/4/1247_vm +/opt/service_finder/postgres/data/base/4/3394_fsm +/opt/service_finder/postgres/data/base/4/6175 +/opt/service_finder/postgres/data/base/4/2834 +/opt/service_finder/postgres/data/base/4/3609 +/opt/service_finder/postgres/data/base/4/2692 +/opt/service_finder/postgres/data/base/4/3600_fsm +/opt/service_finder/postgres/data/base/4/2701 +/opt/service_finder/postgres/data/base/4/4160 +/opt/service_finder/postgres/data/base/4/4146 +/opt/service_finder/postgres/data/base/4/1418 +/opt/service_finder/postgres/data/base/4/6116 +/opt/service_finder/postgres/data/base/4/6104 +/opt/service_finder/postgres/data/base/4/1247 +/opt/service_finder/postgres/data/base/4/2651 +/opt/service_finder/postgres/data/base/4/3456_fsm +/opt/service_finder/postgres/data/base/4/2616_vm +/opt/service_finder/postgres/data/base/4/4156 +/opt/service_finder/postgres/data/base/4/4169 +/opt/service_finder/postgres/data/base/4/2833 +/opt/service_finder/postgres/data/base/4/2836 +/opt/service_finder/postgres/data/base/4/4151 +/opt/service_finder/postgres/data/base/4/174 +/opt/service_finder/postgres/data/base/4/6111 +/opt/service_finder/postgres/data/base/4/3602_fsm +/opt/service_finder/postgres/data/base/4/13463_fsm +/opt/service_finder/postgres/data/base/4/2618_vm +/opt/service_finder/postgres/data/base/4/13478 +/opt/service_finder/postgres/data/base/4/2678 +/opt/service_finder/postgres/data/base/4/2683 +/opt/service_finder/postgres/data/base/4/2656 +/opt/service_finder/postgres/data/base/4/2667 +/opt/service_finder/postgres/data/base/4/3119 +/opt/service_finder/postgres/data/base/4/2600 +/opt/service_finder/postgres/data/base/4/2620 +/opt/service_finder/postgres/data/base/4/2753 +/opt/service_finder/postgres/data/base/4/112 +/opt/service_finder/postgres/data/base/4/2608_vm +/opt/service_finder/postgres/data/base/4/3575 +/opt/service_finder/postgres/data/base/4/3767 +/opt/service_finder/postgres/data/base/4/6113 +/opt/service_finder/postgres/data/base/4/13473_vm +/opt/service_finder/postgres/data/base/4/3542 +/opt/service_finder/postgres/data/base/4/1259 +/opt/service_finder/postgres/data/base/4/2604 +/opt/service_finder/postgres/data/base/4/2840 +/opt/service_finder/postgres/data/base/4/3601 +/opt/service_finder/postgres/data/base/4/2605_vm +/opt/service_finder/postgres/data/base/4/2606_fsm +/opt/service_finder/postgres/data/base/4/2830 +/opt/service_finder/postgres/data/base/4/13468 +/opt/service_finder/postgres/data/base/4/6239 +/opt/service_finder/postgres/data/base/4/3430 +/opt/service_finder/postgres/data/base/4/2607_fsm +/opt/service_finder/postgres/data/base/4/2617 +/opt/service_finder/postgres/data/base/4/2702 +/opt/service_finder/postgres/data/base/4/13478_fsm +/opt/service_finder/postgres/data/base/4/4174 +/opt/service_finder/postgres/data/base/4/6106 +/opt/service_finder/postgres/data/base/4/2681 +/opt/service_finder/postgres/data/base/4/6238 +/opt/service_finder/postgres/data/base/4/2610_vm +/opt/service_finder/postgres/data/base/4/2838_fsm +/opt/service_finder/postgres/data/base/4/4172 +/opt/service_finder/postgres/data/base/4/175 +/opt/service_finder/postgres/data/base/4/3541 +/opt/service_finder/postgres/data/base/4/2832 +/opt/service_finder/postgres/data/base/4/2601_fsm +/opt/service_finder/postgres/data/base/4/4170 +/opt/service_finder/postgres/data/base/4/3603 +/opt/service_finder/postgres/data/base/4/2610 +/opt/service_finder/postgres/data/base/4/2670 +/opt/service_finder/postgres/data/base/4/1249_vm +/opt/service_finder/postgres/data/base/4/2601 +/opt/service_finder/postgres/data/base/4/2605_fsm +/opt/service_finder/postgres/data/base/4/3081 +/opt/service_finder/postgres/data/base/4/4154 +/opt/service_finder/postgres/data/base/4/3456 +/opt/service_finder/postgres/data/base/4/13468_vm +/opt/service_finder/postgres/data/base/4/13468_fsm +/opt/service_finder/postgres/data/base/4/2603_fsm +/opt/service_finder/postgres/data/base/4/2687 +/opt/service_finder/postgres/data/base/4/2608 +/opt/service_finder/postgres/data/base/4/2664 +/opt/service_finder/postgres/data/base/4/2840_fsm +/opt/service_finder/postgres/data/base/4/3576 +/opt/service_finder/postgres/data/pg_hba.conf +/opt/service_finder/postgres/data/pg_dynshmem +/opt/service_finder/postgres/data/pg_xact +/opt/service_finder/postgres/data/pg_xact/0000 +/opt/service_finder/postgres/data/postgresql.auto.conf +/opt/service_finder/postgres/data/pg_stat +/opt/service_finder/postgres/data/PG_VERSION +/opt/service_finder/postgres/data/pg_stat_tmp +/opt/service_finder/postgres/data/pg_subtrans +/opt/service_finder/postgres/data/pg_subtrans/0000 +/opt/service_finder/postgres/data/pg_ident.conf +/opt/service_finder/postgres/data/pg_snapshots +/opt/service_finder/postgres/data/global +/opt/service_finder/postgres/data/global/1232 +/opt/service_finder/postgres/data/global/pg_filenode.map +/opt/service_finder/postgres/data/global/6001 +/opt/service_finder/postgres/data/global/1260_vm +/opt/service_finder/postgres/data/global/2677 +/opt/service_finder/postgres/data/global/2847 +/opt/service_finder/postgres/data/global/1262 +/opt/service_finder/postgres/data/global/3592 +/opt/service_finder/postgres/data/global/4177 +/opt/service_finder/postgres/data/global/3593 +/opt/service_finder/postgres/data/global/4185 +/opt/service_finder/postgres/data/global/2676 +/opt/service_finder/postgres/data/global/2396 +/opt/service_finder/postgres/data/global/1261_vm +/opt/service_finder/postgres/data/global/2671 +/opt/service_finder/postgres/data/global/6243 +/opt/service_finder/postgres/data/global/pg_internal.init +/opt/service_finder/postgres/data/global/2964 +/opt/service_finder/postgres/data/global/4182 +/opt/service_finder/postgres/data/global/1260_fsm +/opt/service_finder/postgres/data/global/4181 +/opt/service_finder/postgres/data/global/4178 +/opt/service_finder/postgres/data/global/1213_fsm +/opt/service_finder/postgres/data/global/4175 +/opt/service_finder/postgres/data/global/1261 +/opt/service_finder/postgres/data/global/2695 +/opt/service_finder/postgres/data/global/1233 +/opt/service_finder/postgres/data/global/4186 +/opt/service_finder/postgres/data/global/4183 +/opt/service_finder/postgres/data/global/2396_fsm +/opt/service_finder/postgres/data/global/4061 +/opt/service_finder/postgres/data/global/2694 +/opt/service_finder/postgres/data/global/6000 +/opt/service_finder/postgres/data/global/4184 +/opt/service_finder/postgres/data/global/1260 +/opt/service_finder/postgres/data/global/pg_control +/opt/service_finder/postgres/data/global/2967 +/opt/service_finder/postgres/data/global/6100 +/opt/service_finder/postgres/data/global/1262_vm +/opt/service_finder/postgres/data/global/2397 +/opt/service_finder/postgres/data/global/6244 +/opt/service_finder/postgres/data/global/6246 +/opt/service_finder/postgres/data/global/6002 +/opt/service_finder/postgres/data/global/1262_fsm +/opt/service_finder/postgres/data/global/4176 +/opt/service_finder/postgres/data/global/6114 +/opt/service_finder/postgres/data/global/6245 +/opt/service_finder/postgres/data/global/2672 +/opt/service_finder/postgres/data/global/1214_fsm +/opt/service_finder/postgres/data/global/1261_fsm +/opt/service_finder/postgres/data/global/4060 +/opt/service_finder/postgres/data/global/2966 +/opt/service_finder/postgres/data/global/6247 +/opt/service_finder/postgres/data/global/2846 +/opt/service_finder/postgres/data/global/1213_vm +/opt/service_finder/postgres/data/global/6302 +/opt/service_finder/postgres/data/global/6115 +/opt/service_finder/postgres/data/global/2396_vm +/opt/service_finder/postgres/data/global/2698 +/opt/service_finder/postgres/data/global/2697 +/opt/service_finder/postgres/data/global/2965 +/opt/service_finder/postgres/data/global/1214 +/opt/service_finder/postgres/data/global/6303 +/opt/service_finder/postgres/data/global/1213 +/opt/service_finder/postgres/data/pg_serial +/opt/service_finder/postgres/data/pg_replslot +/opt/service_finder/postgres/data/pg_tblspc +/opt/service_finder/postgres/data/pg_multixact +/opt/service_finder/postgres/data/pg_multixact/members +/opt/service_finder/postgres/data/pg_multixact/members/0000 +/opt/service_finder/postgres/data/pg_multixact/offsets +/opt/service_finder/postgres/data/pg_multixact/offsets/0000 +/opt/service_finder/postgres/data/pg_twophase +/opt/service_finder/postgres/data/pg_notify +/opt/service_finder/postgres/data/postgresql.conf +/opt/service_finder/postgres/data/pg_wal +/opt/service_finder/postgres/data/pg_wal/summaries +/opt/service_finder/postgres/data/pg_wal/archive_status +/opt/service_finder/postgres/data/pg_wal/000000010000000000000002 +/opt/service_finder/postgres/data/pg_wal/000000010000000000000003 +/opt/service_finder/postgres/data/postmaster.opts +/opt/service_finder/postgres/data/postmaster.pid +/opt/service_finder/migrations +/opt/service_finder/migrations/script.py.mako +/opt/service_finder/migrations/__pycache__ +/opt/service_finder/migrations/__pycache__/env.cpython-312.pyc +/opt/service_finder/migrations/env.py +/opt/service_finder/migrations/README +/opt/service_finder/migrations/versions +/opt/service_finder/migrations/versions/10b73fee8967_fix_roles_and_universal_vehicles.py +/opt/service_finder/migrations/versions/13d050e8cf6d_initial_baseline_v2.py +/opt/service_finder/migrations/versions/13bd03551ebf_add_verification_tokens_and_legal_tables.py +/opt/service_finder/migrations/versions/8d450e9dc77f_add_vehicle_staging.py +/opt/service_finder/migrations/versions/__pycache__ +/opt/service_finder/migrations/versions/__pycache__/553ef1388276_rebuild_schema_v2.cpython-312.pyc +/opt/service_finder/migrations/versions/__pycache__/13bd03551ebf_add_verification_tokens_and_legal_tables.cpython-312.pyc +/opt/service_finder/migrations/versions/__pycache__/8d450e9dc77f_add_vehicle_staging.cpython-312.pyc +/opt/service_finder/migrations/versions/__pycache__/c21c2c7e70d4_clean_gamification_setup.cpython-312.pyc +/opt/service_finder/migrations/versions/__pycache__/10b73fee8967_fix_roles_and_universal_vehicles.cpython-312.pyc +/opt/service_finder/migrations/versions/__pycache__/13d050e8cf6d_initial_baseline_v2.cpython-312.pyc +/opt/service_finder/migrations/versions/553ef1388276_rebuild_schema_v2.py +/opt/service_finder/migrations/versions/c21c2c7e70d4_clean_gamification_setup.py +/opt/service_finder/_Adatbázis_állalot_napló.txt +/opt/service_finder/backup_20260128_alap_kesz.sql +/opt/service_finder/postgres_data +/opt/service_finder/postgres_data/pg_commit_ts +/opt/service_finder/postgres_data/pg_logical +/opt/service_finder/postgres_data/pg_logical/snapshots +/opt/service_finder/postgres_data/pg_logical/mappings +/opt/service_finder/postgres_data/pg_logical/replorigin_checkpoint +/opt/service_finder/postgres_data/base +/opt/service_finder/postgres_data/base/16384 +/opt/service_finder/postgres_data/base/16384/3079_fsm +/opt/service_finder/postgres_data/base/16384/4143 +/opt/service_finder/postgres_data/base/16384/18336 +/opt/service_finder/postgres_data/base/16384/3455 +/opt/service_finder/postgres_data/base/16384/2224_vm +/opt/service_finder/postgres_data/base/16384/18546 +/opt/service_finder/postgres_data/base/16384/18265 +/opt/service_finder/postgres_data/base/16384/18279 +/opt/service_finder/postgres_data/base/16384/18975_vm +/opt/service_finder/postgres_data/base/16384/2686 +/opt/service_finder/postgres_data/base/16384/pg_filenode.map +/opt/service_finder/postgres_data/base/16384/3602_vm +/opt/service_finder/postgres_data/base/16384/18368 +/opt/service_finder/postgres_data/base/16384/1255_vm +/opt/service_finder/postgres_data/base/16384/2601_vm +/opt/service_finder/postgres_data/base/16384/2838_vm +/opt/service_finder/postgres_data/base/16384/18601 +/opt/service_finder/postgres_data/base/16384/18255 +/opt/service_finder/postgres_data/base/16384/2836_fsm +/opt/service_finder/postgres_data/base/16384/19010 +/opt/service_finder/postgres_data/base/16384/18296 +/opt/service_finder/postgres_data/base/16384/3164 +/opt/service_finder/postgres_data/base/16384/18176 +/opt/service_finder/postgres_data/base/16384/13467_vm +/opt/service_finder/postgres_data/base/16384/18511 +/opt/service_finder/postgres_data/base/16384/3351 +/opt/service_finder/postgres_data/base/16384/17945 +/opt/service_finder/postgres_data/base/16384/18710 +/opt/service_finder/postgres_data/base/16384/3600_vm +/opt/service_finder/postgres_data/base/16384/5002 +/opt/service_finder/postgres_data/base/16384/18677 +/opt/service_finder/postgres_data/base/16384/1255_fsm +/opt/service_finder/postgres_data/base/16384/3380 +/opt/service_finder/postgres_data/base/16384/17805 +/opt/service_finder/postgres_data/base/16384/17639 +/opt/service_finder/postgres_data/base/16384/17640 +/opt/service_finder/postgres_data/base/16384/18290 +/opt/service_finder/postgres_data/base/16384/18965 +/opt/service_finder/postgres_data/base/16384/3381 +/opt/service_finder/postgres_data/base/16384/18111 +/opt/service_finder/postgres_data/base/16384/18389 +/opt/service_finder/postgres_data/base/16384/18913 +/opt/service_finder/postgres_data/base/16384/2663 +/opt/service_finder/postgres_data/base/16384/18765 +/opt/service_finder/postgres_data/base/16384/3601_fsm +/opt/service_finder/postgres_data/base/16384/13472_fsm +/opt/service_finder/postgres_data/base/16384/18364 +/opt/service_finder/postgres_data/base/16384/4148 +/opt/service_finder/postgres_data/base/16384/2618_fsm +/opt/service_finder/postgres_data/base/16384/3440 +/opt/service_finder/postgres_data/base/16384/2619_vm +/opt/service_finder/postgres_data/base/16384/18365 +/opt/service_finder/postgres_data/base/16384/18840 +/opt/service_finder/postgres_data/base/16384/18293 +/opt/service_finder/postgres_data/base/16384/3467 +/opt/service_finder/postgres_data/base/16384/2688 +/opt/service_finder/postgres_data/base/16384/18983 +/opt/service_finder/postgres_data/base/16384/18531 +/opt/service_finder/postgres_data/base/16384/18970 +/opt/service_finder/postgres_data/base/16384/19023 +/opt/service_finder/postgres_data/base/16384/3997 +/opt/service_finder/postgres_data/base/16384/2662 +/opt/service_finder/postgres_data/base/16384/6229 +/opt/service_finder/postgres_data/base/16384/18877 +/opt/service_finder/postgres_data/base/16384/3439 +/opt/service_finder/postgres_data/base/16384/13472_vm +/opt/service_finder/postgres_data/base/16384/2657 +/opt/service_finder/postgres_data/base/16384/18282 +/opt/service_finder/postgres_data/base/16384/2609_vm +/opt/service_finder/postgres_data/base/16384/18719 +/opt/service_finder/postgres_data/base/16384/18603 +/opt/service_finder/postgres_data/base/16384/18291 +/opt/service_finder/postgres_data/base/16384/4157 +/opt/service_finder/postgres_data/base/16384/18286 +/opt/service_finder/postgres_data/base/16384/3257 +/opt/service_finder/postgres_data/base/16384/3503 +/opt/service_finder/postgres_data/base/16384/3541_fsm +/opt/service_finder/postgres_data/base/16384/18133 +/opt/service_finder/postgres_data/base/16384/2756 +/opt/service_finder/postgres_data/base/16384/17657 +/opt/service_finder/postgres_data/base/16384/2615_vm +/opt/service_finder/postgres_data/base/16384/1259_vm +/opt/service_finder/postgres_data/base/16384/18251 +/opt/service_finder/postgres_data/base/16384/18914 +/opt/service_finder/postgres_data/base/16384/3256 +/opt/service_finder/postgres_data/base/16384/17641 +/opt/service_finder/postgres_data/base/16384/18281 +/opt/service_finder/postgres_data/base/16384/18992 +/opt/service_finder/postgres_data/base/16384/2615_fsm +/opt/service_finder/postgres_data/base/16384/18743 +/opt/service_finder/postgres_data/base/16384/17794 +/opt/service_finder/postgres_data/base/16384/18187 +/opt/service_finder/postgres_data/base/16384/2703 +/opt/service_finder/postgres_data/base/16384/17646 +/opt/service_finder/postgres_data/base/16384/17635 +/opt/service_finder/postgres_data/base/16384/2753_vm +/opt/service_finder/postgres_data/base/16384/2603_vm +/opt/service_finder/postgres_data/base/16384/17658 +/opt/service_finder/postgres_data/base/16384/1249_fsm +/opt/service_finder/postgres_data/base/16384/13460 +/opt/service_finder/postgres_data/base/16384/2620_fsm +/opt/service_finder/postgres_data/base/16384/3600 +/opt/service_finder/postgres_data/base/16384/18396 +/opt/service_finder/postgres_data/base/16384/13457_vm +/opt/service_finder/postgres_data/base/16384/18519 +/opt/service_finder/postgres_data/base/16384/2653 +/opt/service_finder/postgres_data/base/16384/18994 +/opt/service_finder/postgres_data/base/16384/18667 +/opt/service_finder/postgres_data/base/16384/2337 +/opt/service_finder/postgres_data/base/16384/13462_fsm +/opt/service_finder/postgres_data/base/16384/3085 +/opt/service_finder/postgres_data/base/16384/18370 +/opt/service_finder/postgres_data/base/16384/18278 +/opt/service_finder/postgres_data/base/16384/2995 +/opt/service_finder/postgres_data/base/16384/2336 +/opt/service_finder/postgres_data/base/16384/2612_fsm +/opt/service_finder/postgres_data/base/16384/18854 +/opt/service_finder/postgres_data/base/16384/3258 +/opt/service_finder/postgres_data/base/16384/18139 +/opt/service_finder/postgres_data/base/16384/3466 +/opt/service_finder/postgres_data/base/16384/18122 +/opt/service_finder/postgres_data/base/16384/3079 +/opt/service_finder/postgres_data/base/16384/18119 +/opt/service_finder/postgres_data/base/16384/18016 +/opt/service_finder/postgres_data/base/16384/4144 +/opt/service_finder/postgres_data/base/16384/18982 +/opt/service_finder/postgres_data/base/16384/1417 +/opt/service_finder/postgres_data/base/16384/17814 +/opt/service_finder/postgres_data/base/16384/13472 +/opt/service_finder/postgres_data/base/16384/2666 +/opt/service_finder/postgres_data/base/16384/13467 +/opt/service_finder/postgres_data/base/16384/18284 +/opt/service_finder/postgres_data/base/16384/6228 +/opt/service_finder/postgres_data/base/16384/6117 +/opt/service_finder/postgres_data/base/16384/2757 +/opt/service_finder/postgres_data/base/16384/2685 +/opt/service_finder/postgres_data/base/16384/3501_vm +/opt/service_finder/postgres_data/base/16384/18507 +/opt/service_finder/postgres_data/base/16384/2612_vm +/opt/service_finder/postgres_data/base/16384/18144 +/opt/service_finder/postgres_data/base/16384/2615 +/opt/service_finder/postgres_data/base/16384/3501 +/opt/service_finder/postgres_data/base/16384/3602 +/opt/service_finder/postgres_data/base/16384/6176 +/opt/service_finder/postgres_data/base/16384/18704 +/opt/service_finder/postgres_data/base/16384/2605 +/opt/service_finder/postgres_data/base/16384/2674 +/opt/service_finder/postgres_data/base/16384/18121 +/opt/service_finder/postgres_data/base/16384/2754 +/opt/service_finder/postgres_data/base/16384/18766 +/opt/service_finder/postgres_data/base/16384/18272 +/opt/service_finder/postgres_data/base/16384/18489 +/opt/service_finder/postgres_data/base/16384/18839 +/opt/service_finder/postgres_data/base/16384/549 +/opt/service_finder/postgres_data/base/16384/3712 +/opt/service_finder/postgres_data/base/16384/2669 +/opt/service_finder/postgres_data/base/16384/17630 +/opt/service_finder/postgres_data/base/16384/18106 +/opt/service_finder/postgres_data/base/16384/18404 +/opt/service_finder/postgres_data/base/16384/17959 +/opt/service_finder/postgres_data/base/16384/2689 +/opt/service_finder/postgres_data/base/16384/18101 +/opt/service_finder/postgres_data/base/16384/4152 +/opt/service_finder/postgres_data/base/16384/18200 +/opt/service_finder/postgres_data/base/16384/3395 +/opt/service_finder/postgres_data/base/16384/18703 +/opt/service_finder/postgres_data/base/16384/18498 +/opt/service_finder/postgres_data/base/16384/2693 +/opt/service_finder/postgres_data/base/16384/18405 +/opt/service_finder/postgres_data/base/16384/18313 +/opt/service_finder/postgres_data/base/16384/17570 +/opt/service_finder/postgres_data/base/16384/17947 +/opt/service_finder/postgres_data/base/16384/13475 +/opt/service_finder/postgres_data/base/16384/18676 +/opt/service_finder/postgres_data/base/16384/17567 +/opt/service_finder/postgres_data/base/16384/4149 +/opt/service_finder/postgres_data/base/16384/18488 +/opt/service_finder/postgres_data/base/16384/548 +/opt/service_finder/postgres_data/base/16384/2699 +/opt/service_finder/postgres_data/base/16384/17631 +/opt/service_finder/postgres_data/base/16384/18816 +/opt/service_finder/postgres_data/base/16384/18878 +/opt/service_finder/postgres_data/base/16384/2673 +/opt/service_finder/postgres_data/base/16384/3431 +/opt/service_finder/postgres_data/base/16384/3574 +/opt/service_finder/postgres_data/base/16384/18377 +/opt/service_finder/postgres_data/base/16384/3468 +/opt/service_finder/postgres_data/base/16384/4171 +/opt/service_finder/postgres_data/base/16384/18208 +/opt/service_finder/postgres_data/base/16384/4163 +/opt/service_finder/postgres_data/base/16384/2696 +/opt/service_finder/postgres_data/base/16384/4168 +/opt/service_finder/postgres_data/base/16384/18684 +/opt/service_finder/postgres_data/base/16384/18879 +/opt/service_finder/postgres_data/base/16384/18257 +/opt/service_finder/postgres_data/base/16384/18134 +/opt/service_finder/postgres_data/base/16384/18418 +/opt/service_finder/postgres_data/base/16384/6102 +/opt/service_finder/postgres_data/base/16384/3597 +/opt/service_finder/postgres_data/base/16384/18247 +/opt/service_finder/postgres_data/base/16384/pg_internal.init +/opt/service_finder/postgres_data/base/16384/18297 +/opt/service_finder/postgres_data/base/16384/PG_VERSION +/opt/service_finder/postgres_data/base/16384/18190 +/opt/service_finder/postgres_data/base/16384/2837 +/opt/service_finder/postgres_data/base/16384/18294 +/opt/service_finder/postgres_data/base/16384/2579 +/opt/service_finder/postgres_data/base/16384/2604_fsm +/opt/service_finder/postgres_data/base/16384/827 +/opt/service_finder/postgres_data/base/16384/18201 +/opt/service_finder/postgres_data/base/16384/18259 +/opt/service_finder/postgres_data/base/16384/18248 +/opt/service_finder/postgres_data/base/16384/18435 +/opt/service_finder/postgres_data/base/16384/18128 +/opt/service_finder/postgres_data/base/16384/4158 +/opt/service_finder/postgres_data/base/16384/18512 +/opt/service_finder/postgres_data/base/16384/2691 +/opt/service_finder/postgres_data/base/16384/826 +/opt/service_finder/postgres_data/base/16384/2660 +/opt/service_finder/postgres_data/base/16384/3596 +/opt/service_finder/postgres_data/base/16384/18116 +/opt/service_finder/postgres_data/base/16384/17941 +/opt/service_finder/postgres_data/base/16384/17811 +/opt/service_finder/postgres_data/base/16384/2228 +/opt/service_finder/postgres_data/base/16384/3605 +/opt/service_finder/postgres_data/base/16384/2668 +/opt/service_finder/postgres_data/base/16384/17624 +/opt/service_finder/postgres_data/base/16384/18110 +/opt/service_finder/postgres_data/base/16384/18186 +/opt/service_finder/postgres_data/base/16384/18366 +/opt/service_finder/postgres_data/base/16384/4145 +/opt/service_finder/postgres_data/base/16384/17812 +/opt/service_finder/postgres_data/base/16384/18933 +/opt/service_finder/postgres_data/base/16384/18863 +/opt/service_finder/postgres_data/base/16384/18269 +/opt/service_finder/postgres_data/base/16384/2602_vm +/opt/service_finder/postgres_data/base/16384/2602_fsm +/opt/service_finder/postgres_data/base/16384/3079_vm +/opt/service_finder/postgres_data/base/16384/18767 +/opt/service_finder/postgres_data/base/16384/18540 +/opt/service_finder/postgres_data/base/16384/4155 +/opt/service_finder/postgres_data/base/16384/18115 +/opt/service_finder/postgres_data/base/16384/18140 +/opt/service_finder/postgres_data/base/16384/18497 +/opt/service_finder/postgres_data/base/16384/18260 +/opt/service_finder/postgres_data/base/16384/18285 +/opt/service_finder/postgres_data/base/16384/19022 +/opt/service_finder/postgres_data/base/16384/17798 +/opt/service_finder/postgres_data/base/16384/13476 +/opt/service_finder/postgres_data/base/16384/18359 +/opt/service_finder/postgres_data/base/16384/18904 +/opt/service_finder/postgres_data/base/16384/2617_fsm +/opt/service_finder/postgres_data/base/16384/2607_vm +/opt/service_finder/postgres_data/base/16384/2606 +/opt/service_finder/postgres_data/base/16384/2610_fsm +/opt/service_finder/postgres_data/base/16384/17806 +/opt/service_finder/postgres_data/base/16384/2831 +/opt/service_finder/postgres_data/base/16384/3394_vm +/opt/service_finder/postgres_data/base/16384/4147 +/opt/service_finder/postgres_data/base/16384/1255 +/opt/service_finder/postgres_data/base/16384/18202 +/opt/service_finder/postgres_data/base/16384/18295 +/opt/service_finder/postgres_data/base/16384/2607 +/opt/service_finder/postgres_data/base/16384/18268 +/opt/service_finder/postgres_data/base/16384/2611 +/opt/service_finder/postgres_data/base/16384/18537 +/opt/service_finder/postgres_data/base/16384/2753_fsm +/opt/service_finder/postgres_data/base/16384/2187 +/opt/service_finder/postgres_data/base/16384/18310 +/opt/service_finder/postgres_data/base/16384/18283 +/opt/service_finder/postgres_data/base/16384/13465 +/opt/service_finder/postgres_data/base/16384/18628 +/opt/service_finder/postgres_data/base/16384/2650 +/opt/service_finder/postgres_data/base/16384/18411 +/opt/service_finder/postgres_data/base/16384/3601_vm +/opt/service_finder/postgres_data/base/16384/2658 +/opt/service_finder/postgres_data/base/16384/2606_vm +/opt/service_finder/postgres_data/base/16384/18964 +/opt/service_finder/postgres_data/base/16384/2602 +/opt/service_finder/postgres_data/base/16384/2609_fsm +/opt/service_finder/postgres_data/base/16384/3607 +/opt/service_finder/postgres_data/base/16384/3764_fsm +/opt/service_finder/postgres_data/base/16384/18538 +/opt/service_finder/postgres_data/base/16384/4165 +/opt/service_finder/postgres_data/base/16384/3764_vm +/opt/service_finder/postgres_data/base/16384/18724 +/opt/service_finder/postgres_data/base/16384/18181 +/opt/service_finder/postgres_data/base/16384/4167 +/opt/service_finder/postgres_data/base/16384/13457_fsm +/opt/service_finder/postgres_data/base/16384/18711 +/opt/service_finder/postgres_data/base/16384/17666 +/opt/service_finder/postgres_data/base/16384/18142 +/opt/service_finder/postgres_data/base/16384/18916 +/opt/service_finder/postgres_data/base/16384/2600_vm +/opt/service_finder/postgres_data/base/16384/3350 +/opt/service_finder/postgres_data/base/16384/18672 +/opt/service_finder/postgres_data/base/16384/18972 +/opt/service_finder/postgres_data/base/16384/2652 +/opt/service_finder/postgres_data/base/16384/18482 +/opt/service_finder/postgres_data/base/16384/3118 +/opt/service_finder/postgres_data/base/16384/18509 +/opt/service_finder/postgres_data/base/16384/3603_vm +/opt/service_finder/postgres_data/base/16384/2704 +/opt/service_finder/postgres_data/base/16384/18299 +/opt/service_finder/postgres_data/base/16384/3501_fsm +/opt/service_finder/postgres_data/base/16384/17804 +/opt/service_finder/postgres_data/base/16384/18761 +/opt/service_finder/postgres_data/base/16384/2328 +/opt/service_finder/postgres_data/base/16384/6237 +/opt/service_finder/postgres_data/base/16384/4150 +/opt/service_finder/postgres_data/base/16384/18371 +/opt/service_finder/postgres_data/base/16384/17800 +/opt/service_finder/postgres_data/base/16384/3606 +/opt/service_finder/postgres_data/base/16384/1259_fsm +/opt/service_finder/postgres_data/base/16384/2675 +/opt/service_finder/postgres_data/base/16384/3598 +/opt/service_finder/postgres_data/base/16384/6110 +/opt/service_finder/postgres_data/base/16384/18175 +/opt/service_finder/postgres_data/base/16384/17623 +/opt/service_finder/postgres_data/base/16384/113 +/opt/service_finder/postgres_data/base/16384/1247_fsm +/opt/service_finder/postgres_data/base/16384/18953 +/opt/service_finder/postgres_data/base/16384/2682 +/opt/service_finder/postgres_data/base/16384/13471 +/opt/service_finder/postgres_data/base/16384/18022 +/opt/service_finder/postgres_data/base/16384/18307 +/opt/service_finder/postgres_data/base/16384/18536 +/opt/service_finder/postgres_data/base/16384/18726 +/opt/service_finder/postgres_data/base/16384/3608 +/opt/service_finder/postgres_data/base/16384/17668 +/opt/service_finder/postgres_data/base/16384/18358 +/opt/service_finder/postgres_data/base/16384/18673 +/opt/service_finder/postgres_data/base/16384/17655 +/opt/service_finder/postgres_data/base/16384/18305 +/opt/service_finder/postgres_data/base/16384/4173 +/opt/service_finder/postgres_data/base/16384/2679 +/opt/service_finder/postgres_data/base/16384/18828 +/opt/service_finder/postgres_data/base/16384/18445 +/opt/service_finder/postgres_data/base/16384/18685 +/opt/service_finder/postgres_data/base/16384/17651 +/opt/service_finder/postgres_data/base/16384/18768 +/opt/service_finder/postgres_data/base/16384/3379 +/opt/service_finder/postgres_data/base/16384/2616 +/opt/service_finder/postgres_data/base/16384/18271 +/opt/service_finder/postgres_data/base/16384/2839 +/opt/service_finder/postgres_data/base/16384/3764 +/opt/service_finder/postgres_data/base/16384/2661 +/opt/service_finder/postgres_data/base/16384/18683 +/opt/service_finder/postgres_data/base/16384/2224_fsm +/opt/service_finder/postgres_data/base/16384/2835 +/opt/service_finder/postgres_data/base/16384/2619 +/opt/service_finder/postgres_data/base/16384/2608_fsm +/opt/service_finder/postgres_data/base/16384/2655 +/opt/service_finder/postgres_data/base/16384/18267 +/opt/service_finder/postgres_data/base/16384/3766 +/opt/service_finder/postgres_data/base/16384/13470 +/opt/service_finder/postgres_data/base/16384/3394 +/opt/service_finder/postgres_data/base/16384/3080 +/opt/service_finder/postgres_data/base/16384/18127 +/opt/service_finder/postgres_data/base/16384/2619_fsm +/opt/service_finder/postgres_data/base/16384/3541_vm +/opt/service_finder/postgres_data/base/16384/4164 +/opt/service_finder/postgres_data/base/16384/18627 +/opt/service_finder/postgres_data/base/16384/18207 +/opt/service_finder/postgres_data/base/16384/17802 +/opt/service_finder/postgres_data/base/16384/3502 +/opt/service_finder/postgres_data/base/16384/4159 +/opt/service_finder/postgres_data/base/16384/2613 +/opt/service_finder/postgres_data/base/16384/18725 +/opt/service_finder/postgres_data/base/16384/18306 +/opt/service_finder/postgres_data/base/16384/18138 +/opt/service_finder/postgres_data/base/16384/4153 +/opt/service_finder/postgres_data/base/16384/18936 +/opt/service_finder/postgres_data/base/16384/13467_fsm +/opt/service_finder/postgres_data/base/16384/18974 +/opt/service_finder/postgres_data/base/16384/2674_fsm +/opt/service_finder/postgres_data/base/16384/18292 +/opt/service_finder/postgres_data/base/16384/6112 +/opt/service_finder/postgres_data/base/16384/18256 +/opt/service_finder/postgres_data/base/16384/3456_vm +/opt/service_finder/postgres_data/base/16384/2616_fsm +/opt/service_finder/postgres_data/base/16384/18017 +/opt/service_finder/postgres_data/base/16384/2224 +/opt/service_finder/postgres_data/base/16384/17799 +/opt/service_finder/postgres_data/base/16384/2603 +/opt/service_finder/postgres_data/base/16384/2665 +/opt/service_finder/postgres_data/base/16384/18312 +/opt/service_finder/postgres_data/base/16384/18300 +/opt/service_finder/postgres_data/base/16384/18876 +/opt/service_finder/postgres_data/base/16384/18819 +/opt/service_finder/postgres_data/base/16384/17940 +/opt/service_finder/postgres_data/base/16384/18674 +/opt/service_finder/postgres_data/base/16384/2755 +/opt/service_finder/postgres_data/base/16384/3604 +/opt/service_finder/postgres_data/base/16384/18948 +/opt/service_finder/postgres_data/base/16384/18826 +/opt/service_finder/postgres_data/base/16384/18287 +/opt/service_finder/postgres_data/base/16384/2609 +/opt/service_finder/postgres_data/base/16384/17643 +/opt/service_finder/postgres_data/base/16384/2659 +/opt/service_finder/postgres_data/base/16384/2612 +/opt/service_finder/postgres_data/base/16384/13466 +/opt/service_finder/postgres_data/base/16384/18289 +/opt/service_finder/postgres_data/base/16384/18252 +/opt/service_finder/postgres_data/base/16384/18548 +/opt/service_finder/postgres_data/base/16384/18107 +/opt/service_finder/postgres_data/base/16384/18182 +/opt/service_finder/postgres_data/base/16384/18258 +/opt/service_finder/postgres_data/base/16384/2690 +/opt/service_finder/postgres_data/base/16384/18314 +/opt/service_finder/postgres_data/base/16384/17644 +/opt/service_finder/postgres_data/base/16384/2838 +/opt/service_finder/postgres_data/base/16384/18984 +/opt/service_finder/postgres_data/base/16384/17663 +/opt/service_finder/postgres_data/base/16384/18180 +/opt/service_finder/postgres_data/base/16384/1249 +/opt/service_finder/postgres_data/base/16384/18341 +/opt/service_finder/postgres_data/base/16384/3429 +/opt/service_finder/postgres_data/base/16384/828 +/opt/service_finder/postgres_data/base/16384/2620_vm +/opt/service_finder/postgres_data/base/16384/3599 +/opt/service_finder/postgres_data/base/16384/2680 +/opt/service_finder/postgres_data/base/16384/18842 +/opt/service_finder/postgres_data/base/16384/3534 +/opt/service_finder/postgres_data/base/16384/2836_vm +/opt/service_finder/postgres_data/base/16384/18192 +/opt/service_finder/postgres_data/base/16384/2618 +/opt/service_finder/postgres_data/base/16384/2840_vm +/opt/service_finder/postgres_data/base/16384/2654 +/opt/service_finder/postgres_data/base/16384/4166 +/opt/service_finder/postgres_data/base/16384/2600_fsm +/opt/service_finder/postgres_data/base/16384/18481 +/opt/service_finder/postgres_data/base/16384/2841 +/opt/service_finder/postgres_data/base/16384/2617_vm +/opt/service_finder/postgres_data/base/16384/2996 +/opt/service_finder/postgres_data/base/16384/3433 +/opt/service_finder/postgres_data/base/16384/2684 +/opt/service_finder/postgres_data/base/16384/3603_fsm +/opt/service_finder/postgres_data/base/16384/18206 +/opt/service_finder/postgres_data/base/16384/18253 +/opt/service_finder/postgres_data/base/16384/1247_vm +/opt/service_finder/postgres_data/base/16384/3394_fsm +/opt/service_finder/postgres_data/base/16384/17946 +/opt/service_finder/postgres_data/base/16384/18862 +/opt/service_finder/postgres_data/base/16384/6175 +/opt/service_finder/postgres_data/base/16384/2834 +/opt/service_finder/postgres_data/base/16384/3609 +/opt/service_finder/postgres_data/base/16384/18986 +/opt/service_finder/postgres_data/base/16384/2692 +/opt/service_finder/postgres_data/base/16384/13462_vm +/opt/service_finder/postgres_data/base/16384/3600_fsm +/opt/service_finder/postgres_data/base/16384/2701 +/opt/service_finder/postgres_data/base/16384/4160 +/opt/service_finder/postgres_data/base/16384/4146 +/opt/service_finder/postgres_data/base/16384/1418 +/opt/service_finder/postgres_data/base/16384/6116 +/opt/service_finder/postgres_data/base/16384/18335 +/opt/service_finder/postgres_data/base/16384/6104 +/opt/service_finder/postgres_data/base/16384/18490 +/opt/service_finder/postgres_data/base/16384/18912 +/opt/service_finder/postgres_data/base/16384/1247 +/opt/service_finder/postgres_data/base/16384/18975_fsm +/opt/service_finder/postgres_data/base/16384/2651 +/opt/service_finder/postgres_data/base/16384/3456_fsm +/opt/service_finder/postgres_data/base/16384/18108 +/opt/service_finder/postgres_data/base/16384/2616_vm +/opt/service_finder/postgres_data/base/16384/4156 +/opt/service_finder/postgres_data/base/16384/18117 +/opt/service_finder/postgres_data/base/16384/18303 +/opt/service_finder/postgres_data/base/16384/18270 +/opt/service_finder/postgres_data/base/16384/19021 +/opt/service_finder/postgres_data/base/16384/4169 +/opt/service_finder/postgres_data/base/16384/2833 +/opt/service_finder/postgres_data/base/16384/2836 +/opt/service_finder/postgres_data/base/16384/4151 +/opt/service_finder/postgres_data/base/16384/18397 +/opt/service_finder/postgres_data/base/16384/174 +/opt/service_finder/postgres_data/base/16384/18808_fsm +/opt/service_finder/postgres_data/base/16384/18409 +/opt/service_finder/postgres_data/base/16384/18941 +/opt/service_finder/postgres_data/base/16384/18807 +/opt/service_finder/postgres_data/base/16384/18184 +/opt/service_finder/postgres_data/base/16384/6111 +/opt/service_finder/postgres_data/base/16384/18195 +/opt/service_finder/postgres_data/base/16384/17793 +/opt/service_finder/postgres_data/base/16384/3602_fsm +/opt/service_finder/postgres_data/base/16384/2618_vm +/opt/service_finder/postgres_data/base/16384/18759 +/opt/service_finder/postgres_data/base/16384/18838 +/opt/service_finder/postgres_data/base/16384/18530 +/opt/service_finder/postgres_data/base/16384/18204 +/opt/service_finder/postgres_data/base/16384/17662 +/opt/service_finder/postgres_data/base/16384/17645 +/opt/service_finder/postgres_data/base/16384/18126 +/opt/service_finder/postgres_data/base/16384/18280 +/opt/service_finder/postgres_data/base/16384/2678 +/opt/service_finder/postgres_data/base/16384/2683 +/opt/service_finder/postgres_data/base/16384/2656 +/opt/service_finder/postgres_data/base/16384/18517 +/opt/service_finder/postgres_data/base/16384/2667 +/opt/service_finder/postgres_data/base/16384/3119 +/opt/service_finder/postgres_data/base/16384/18353 +/opt/service_finder/postgres_data/base/16384/17653 +/opt/service_finder/postgres_data/base/16384/2600 +/opt/service_finder/postgres_data/base/16384/2620 +/opt/service_finder/postgres_data/base/16384/18975 +/opt/service_finder/postgres_data/base/16384/18301 +/opt/service_finder/postgres_data/base/16384/18250 +/opt/service_finder/postgres_data/base/16384/2753 +/opt/service_finder/postgres_data/base/16384/13457 +/opt/service_finder/postgres_data/base/16384/112 +/opt/service_finder/postgres_data/base/16384/18633 +/opt/service_finder/postgres_data/base/16384/17656 +/opt/service_finder/postgres_data/base/16384/18030 +/opt/service_finder/postgres_data/base/16384/18864 +/opt/service_finder/postgres_data/base/16384/18716 +/opt/service_finder/postgres_data/base/16384/2608_vm +/opt/service_finder/postgres_data/base/16384/3575 +/opt/service_finder/postgres_data/base/16384/18302 +/opt/service_finder/postgres_data/base/16384/19015 +/opt/service_finder/postgres_data/base/16384/18266 +/opt/service_finder/postgres_data/base/16384/17634 +/opt/service_finder/postgres_data/base/16384/3767 +/opt/service_finder/postgres_data/base/16384/6113 +/opt/service_finder/postgres_data/base/16384/18518 +/opt/service_finder/postgres_data/base/16384/18196 +/opt/service_finder/postgres_data/base/16384/18718 +/opt/service_finder/postgres_data/base/16384/18508 +/opt/service_finder/postgres_data/base/16384/3542 +/opt/service_finder/postgres_data/base/16384/2659_fsm +/opt/service_finder/postgres_data/base/16384/19007 +/opt/service_finder/postgres_data/base/16384/18246 +/opt/service_finder/postgres_data/base/16384/1259 +/opt/service_finder/postgres_data/base/16384/18102 +/opt/service_finder/postgres_data/base/16384/2604 +/opt/service_finder/postgres_data/base/16384/18298 +/opt/service_finder/postgres_data/base/16384/13461 +/opt/service_finder/postgres_data/base/16384/18640 +/opt/service_finder/postgres_data/base/16384/2840 +/opt/service_finder/postgres_data/base/16384/18390 +/opt/service_finder/postgres_data/base/16384/3601 +/opt/service_finder/postgres_data/base/16384/2605_vm +/opt/service_finder/postgres_data/base/16384/18194 +/opt/service_finder/postgres_data/base/16384/18934 +/opt/service_finder/postgres_data/base/16384/17816 +/opt/service_finder/postgres_data/base/16384/2658_fsm +/opt/service_finder/postgres_data/base/16384/2606_fsm +/opt/service_finder/postgres_data/base/16384/2830 +/opt/service_finder/postgres_data/base/16384/6239 +/opt/service_finder/postgres_data/base/16384/3430 +/opt/service_finder/postgres_data/base/16384/2607_fsm +/opt/service_finder/postgres_data/base/16384/2617 +/opt/service_finder/postgres_data/base/16384/17633 +/opt/service_finder/postgres_data/base/16384/18249 +/opt/service_finder/postgres_data/base/16384/17664 +/opt/service_finder/postgres_data/base/16384/2702 +/opt/service_finder/postgres_data/base/16384/4174 +/opt/service_finder/postgres_data/base/16384/18808_vm +/opt/service_finder/postgres_data/base/16384/18130 +/opt/service_finder/postgres_data/base/16384/6106 +/opt/service_finder/postgres_data/base/16384/18528 +/opt/service_finder/postgres_data/base/16384/2681 +/opt/service_finder/postgres_data/base/16384/6238 +/opt/service_finder/postgres_data/base/16384/18254 +/opt/service_finder/postgres_data/base/16384/18191 +/opt/service_finder/postgres_data/base/16384/18708 +/opt/service_finder/postgres_data/base/16384/2610_vm +/opt/service_finder/postgres_data/base/16384/2838_fsm +/opt/service_finder/postgres_data/base/16384/18021 +/opt/service_finder/postgres_data/base/16384/4172 +/opt/service_finder/postgres_data/base/16384/175 +/opt/service_finder/postgres_data/base/16384/18808 +/opt/service_finder/postgres_data/base/16384/3541 +/opt/service_finder/postgres_data/base/16384/2832 +/opt/service_finder/postgres_data/base/16384/18818 +/opt/service_finder/postgres_data/base/16384/2601_fsm +/opt/service_finder/postgres_data/base/16384/18304 +/opt/service_finder/postgres_data/base/16384/13462 +/opt/service_finder/postgres_data/base/16384/18395 +/opt/service_finder/postgres_data/base/16384/17652 +/opt/service_finder/postgres_data/base/16384/18132 +/opt/service_finder/postgres_data/base/16384/4170 +/opt/service_finder/postgres_data/base/16384/3603 +/opt/service_finder/postgres_data/base/16384/18120 +/opt/service_finder/postgres_data/base/16384/2610 +/opt/service_finder/postgres_data/base/16384/2670 +/opt/service_finder/postgres_data/base/16384/2604_vm +/opt/service_finder/postgres_data/base/16384/1249_vm +/opt/service_finder/postgres_data/base/16384/2601 +/opt/service_finder/postgres_data/base/16384/2605_fsm +/opt/service_finder/postgres_data/base/16384/18288 +/opt/service_finder/postgres_data/base/16384/18023 +/opt/service_finder/postgres_data/base/16384/3081 +/opt/service_finder/postgres_data/base/16384/4154 +/opt/service_finder/postgres_data/base/16384/18311 +/opt/service_finder/postgres_data/base/16384/17810 +/opt/service_finder/postgres_data/base/16384/18547 +/opt/service_finder/postgres_data/base/16384/3456 +/opt/service_finder/postgres_data/base/16384/18541 +/opt/service_finder/postgres_data/base/16384/18764 +/opt/service_finder/postgres_data/base/16384/18668 +/opt/service_finder/postgres_data/base/16384/2603_fsm +/opt/service_finder/postgres_data/base/16384/2687 +/opt/service_finder/postgres_data/base/16384/2608 +/opt/service_finder/postgres_data/base/16384/2664 +/opt/service_finder/postgres_data/base/16384/2840_fsm +/opt/service_finder/postgres_data/base/16384/17629 +/opt/service_finder/postgres_data/base/16384/18309 +/opt/service_finder/postgres_data/base/16384/3576 +/opt/service_finder/postgres_data/base/5 +/opt/service_finder/postgres_data/base/5/3079_fsm +/opt/service_finder/postgres_data/base/5/4143 +/opt/service_finder/postgres_data/base/5/3455 +/opt/service_finder/postgres_data/base/5/2686 +/opt/service_finder/postgres_data/base/5/pg_filenode.map +/opt/service_finder/postgres_data/base/5/3602_vm +/opt/service_finder/postgres_data/base/5/1255_vm +/opt/service_finder/postgres_data/base/5/2601_vm +/opt/service_finder/postgres_data/base/5/2838_vm +/opt/service_finder/postgres_data/base/5/2836_fsm +/opt/service_finder/postgres_data/base/5/3164 +/opt/service_finder/postgres_data/base/5/13467_vm +/opt/service_finder/postgres_data/base/5/3351 +/opt/service_finder/postgres_data/base/5/3600_vm +/opt/service_finder/postgres_data/base/5/5002 +/opt/service_finder/postgres_data/base/5/1255_fsm +/opt/service_finder/postgres_data/base/5/3380 +/opt/service_finder/postgres_data/base/5/3381 +/opt/service_finder/postgres_data/base/5/2663 +/opt/service_finder/postgres_data/base/5/3601_fsm +/opt/service_finder/postgres_data/base/5/13472_fsm +/opt/service_finder/postgres_data/base/5/4148 +/opt/service_finder/postgres_data/base/5/2618_fsm +/opt/service_finder/postgres_data/base/5/3440 +/opt/service_finder/postgres_data/base/5/2619_vm +/opt/service_finder/postgres_data/base/5/3467 +/opt/service_finder/postgres_data/base/5/2688 +/opt/service_finder/postgres_data/base/5/3997 +/opt/service_finder/postgres_data/base/5/2662 +/opt/service_finder/postgres_data/base/5/6229 +/opt/service_finder/postgres_data/base/5/3439 +/opt/service_finder/postgres_data/base/5/13472_vm +/opt/service_finder/postgres_data/base/5/2657 +/opt/service_finder/postgres_data/base/5/2609_vm +/opt/service_finder/postgres_data/base/5/4157 +/opt/service_finder/postgres_data/base/5/3257 +/opt/service_finder/postgres_data/base/5/3503 +/opt/service_finder/postgres_data/base/5/3541_fsm +/opt/service_finder/postgres_data/base/5/2756 +/opt/service_finder/postgres_data/base/5/2615_vm +/opt/service_finder/postgres_data/base/5/1259_vm +/opt/service_finder/postgres_data/base/5/3256 +/opt/service_finder/postgres_data/base/5/2615_fsm +/opt/service_finder/postgres_data/base/5/2703 +/opt/service_finder/postgres_data/base/5/2753_vm +/opt/service_finder/postgres_data/base/5/2603_vm +/opt/service_finder/postgres_data/base/5/1249_fsm +/opt/service_finder/postgres_data/base/5/13460 +/opt/service_finder/postgres_data/base/5/3600 +/opt/service_finder/postgres_data/base/5/13457_vm +/opt/service_finder/postgres_data/base/5/2653 +/opt/service_finder/postgres_data/base/5/2337 +/opt/service_finder/postgres_data/base/5/13462_fsm +/opt/service_finder/postgres_data/base/5/3085 +/opt/service_finder/postgres_data/base/5/2995 +/opt/service_finder/postgres_data/base/5/2336 +/opt/service_finder/postgres_data/base/5/2612_fsm +/opt/service_finder/postgres_data/base/5/3258 +/opt/service_finder/postgres_data/base/5/3466 +/opt/service_finder/postgres_data/base/5/3079 +/opt/service_finder/postgres_data/base/5/4144 +/opt/service_finder/postgres_data/base/5/1417 +/opt/service_finder/postgres_data/base/5/13472 +/opt/service_finder/postgres_data/base/5/2666 +/opt/service_finder/postgres_data/base/5/13467 +/opt/service_finder/postgres_data/base/5/6228 +/opt/service_finder/postgres_data/base/5/6117 +/opt/service_finder/postgres_data/base/5/2757 +/opt/service_finder/postgres_data/base/5/2685 +/opt/service_finder/postgres_data/base/5/2612_vm +/opt/service_finder/postgres_data/base/5/2615 +/opt/service_finder/postgres_data/base/5/3501 +/opt/service_finder/postgres_data/base/5/3602 +/opt/service_finder/postgres_data/base/5/6176 +/opt/service_finder/postgres_data/base/5/2605 +/opt/service_finder/postgres_data/base/5/2674 +/opt/service_finder/postgres_data/base/5/2754 +/opt/service_finder/postgres_data/base/5/549 +/opt/service_finder/postgres_data/base/5/3712 +/opt/service_finder/postgres_data/base/5/2669 +/opt/service_finder/postgres_data/base/5/2689 +/opt/service_finder/postgres_data/base/5/4152 +/opt/service_finder/postgres_data/base/5/3395 +/opt/service_finder/postgres_data/base/5/2693 +/opt/service_finder/postgres_data/base/5/13475 +/opt/service_finder/postgres_data/base/5/4149 +/opt/service_finder/postgres_data/base/5/548 +/opt/service_finder/postgres_data/base/5/2699 +/opt/service_finder/postgres_data/base/5/2673 +/opt/service_finder/postgres_data/base/5/3431 +/opt/service_finder/postgres_data/base/5/3574 +/opt/service_finder/postgres_data/base/5/3468 +/opt/service_finder/postgres_data/base/5/4171 +/opt/service_finder/postgres_data/base/5/4163 +/opt/service_finder/postgres_data/base/5/2696 +/opt/service_finder/postgres_data/base/5/4168 +/opt/service_finder/postgres_data/base/5/6102 +/opt/service_finder/postgres_data/base/5/3597 +/opt/service_finder/postgres_data/base/5/pg_internal.init +/opt/service_finder/postgres_data/base/5/PG_VERSION +/opt/service_finder/postgres_data/base/5/2837 +/opt/service_finder/postgres_data/base/5/2579 +/opt/service_finder/postgres_data/base/5/827 +/opt/service_finder/postgres_data/base/5/4158 +/opt/service_finder/postgres_data/base/5/2691 +/opt/service_finder/postgres_data/base/5/826 +/opt/service_finder/postgres_data/base/5/2660 +/opt/service_finder/postgres_data/base/5/3596 +/opt/service_finder/postgres_data/base/5/2228 +/opt/service_finder/postgres_data/base/5/3605 +/opt/service_finder/postgres_data/base/5/2668 +/opt/service_finder/postgres_data/base/5/4145 +/opt/service_finder/postgres_data/base/5/2602_vm +/opt/service_finder/postgres_data/base/5/2602_fsm +/opt/service_finder/postgres_data/base/5/3079_vm +/opt/service_finder/postgres_data/base/5/4155 +/opt/service_finder/postgres_data/base/5/13476 +/opt/service_finder/postgres_data/base/5/2617_fsm +/opt/service_finder/postgres_data/base/5/2607_vm +/opt/service_finder/postgres_data/base/5/2606 +/opt/service_finder/postgres_data/base/5/2610_fsm +/opt/service_finder/postgres_data/base/5/2831 +/opt/service_finder/postgres_data/base/5/3394_vm +/opt/service_finder/postgres_data/base/5/4147 +/opt/service_finder/postgres_data/base/5/1255 +/opt/service_finder/postgres_data/base/5/2607 +/opt/service_finder/postgres_data/base/5/2611 +/opt/service_finder/postgres_data/base/5/2753_fsm +/opt/service_finder/postgres_data/base/5/2187 +/opt/service_finder/postgres_data/base/5/13465 +/opt/service_finder/postgres_data/base/5/2650 +/opt/service_finder/postgres_data/base/5/3601_vm +/opt/service_finder/postgres_data/base/5/2658 +/opt/service_finder/postgres_data/base/5/2606_vm +/opt/service_finder/postgres_data/base/5/2602 +/opt/service_finder/postgres_data/base/5/2609_fsm +/opt/service_finder/postgres_data/base/5/3607 +/opt/service_finder/postgres_data/base/5/3764_fsm +/opt/service_finder/postgres_data/base/5/4165 +/opt/service_finder/postgres_data/base/5/3764_vm +/opt/service_finder/postgres_data/base/5/4167 +/opt/service_finder/postgres_data/base/5/13457_fsm +/opt/service_finder/postgres_data/base/5/2600_vm +/opt/service_finder/postgres_data/base/5/3350 +/opt/service_finder/postgres_data/base/5/2652 +/opt/service_finder/postgres_data/base/5/3118 +/opt/service_finder/postgres_data/base/5/3603_vm +/opt/service_finder/postgres_data/base/5/2704 +/opt/service_finder/postgres_data/base/5/2328 +/opt/service_finder/postgres_data/base/5/6237 +/opt/service_finder/postgres_data/base/5/4150 +/opt/service_finder/postgres_data/base/5/3606 +/opt/service_finder/postgres_data/base/5/1259_fsm +/opt/service_finder/postgres_data/base/5/2675 +/opt/service_finder/postgres_data/base/5/3598 +/opt/service_finder/postgres_data/base/5/6110 +/opt/service_finder/postgres_data/base/5/113 +/opt/service_finder/postgres_data/base/5/1247_fsm +/opt/service_finder/postgres_data/base/5/2682 +/opt/service_finder/postgres_data/base/5/13471 +/opt/service_finder/postgres_data/base/5/3608 +/opt/service_finder/postgres_data/base/5/4173 +/opt/service_finder/postgres_data/base/5/2679 +/opt/service_finder/postgres_data/base/5/3379 +/opt/service_finder/postgres_data/base/5/2616 +/opt/service_finder/postgres_data/base/5/2839 +/opt/service_finder/postgres_data/base/5/3764 +/opt/service_finder/postgres_data/base/5/2661 +/opt/service_finder/postgres_data/base/5/2835 +/opt/service_finder/postgres_data/base/5/2619 +/opt/service_finder/postgres_data/base/5/2608_fsm +/opt/service_finder/postgres_data/base/5/2655 +/opt/service_finder/postgres_data/base/5/3766 +/opt/service_finder/postgres_data/base/5/13470 +/opt/service_finder/postgres_data/base/5/3394 +/opt/service_finder/postgres_data/base/5/3080 +/opt/service_finder/postgres_data/base/5/2619_fsm +/opt/service_finder/postgres_data/base/5/3541_vm +/opt/service_finder/postgres_data/base/5/4164 +/opt/service_finder/postgres_data/base/5/3502 +/opt/service_finder/postgres_data/base/5/4159 +/opt/service_finder/postgres_data/base/5/2613 +/opt/service_finder/postgres_data/base/5/4153 +/opt/service_finder/postgres_data/base/5/13467_fsm +/opt/service_finder/postgres_data/base/5/6112 +/opt/service_finder/postgres_data/base/5/3456_vm +/opt/service_finder/postgres_data/base/5/2616_fsm +/opt/service_finder/postgres_data/base/5/2224 +/opt/service_finder/postgres_data/base/5/2603 +/opt/service_finder/postgres_data/base/5/2665 +/opt/service_finder/postgres_data/base/5/2755 +/opt/service_finder/postgres_data/base/5/3604 +/opt/service_finder/postgres_data/base/5/2609 +/opt/service_finder/postgres_data/base/5/2659 +/opt/service_finder/postgres_data/base/5/2612 +/opt/service_finder/postgres_data/base/5/13466 +/opt/service_finder/postgres_data/base/5/2690 +/opt/service_finder/postgres_data/base/5/2838 +/opt/service_finder/postgres_data/base/5/1249 +/opt/service_finder/postgres_data/base/5/3429 +/opt/service_finder/postgres_data/base/5/828 +/opt/service_finder/postgres_data/base/5/3599 +/opt/service_finder/postgres_data/base/5/2680 +/opt/service_finder/postgres_data/base/5/3534 +/opt/service_finder/postgres_data/base/5/2836_vm +/opt/service_finder/postgres_data/base/5/2618 +/opt/service_finder/postgres_data/base/5/2840_vm +/opt/service_finder/postgres_data/base/5/2654 +/opt/service_finder/postgres_data/base/5/4166 +/opt/service_finder/postgres_data/base/5/2600_fsm +/opt/service_finder/postgres_data/base/5/2841 +/opt/service_finder/postgres_data/base/5/2617_vm +/opt/service_finder/postgres_data/base/5/2996 +/opt/service_finder/postgres_data/base/5/3433 +/opt/service_finder/postgres_data/base/5/2684 +/opt/service_finder/postgres_data/base/5/3603_fsm +/opt/service_finder/postgres_data/base/5/1247_vm +/opt/service_finder/postgres_data/base/5/3394_fsm +/opt/service_finder/postgres_data/base/5/6175 +/opt/service_finder/postgres_data/base/5/2834 +/opt/service_finder/postgres_data/base/5/3609 +/opt/service_finder/postgres_data/base/5/2692 +/opt/service_finder/postgres_data/base/5/13462_vm +/opt/service_finder/postgres_data/base/5/3600_fsm +/opt/service_finder/postgres_data/base/5/2701 +/opt/service_finder/postgres_data/base/5/4160 +/opt/service_finder/postgres_data/base/5/4146 +/opt/service_finder/postgres_data/base/5/1418 +/opt/service_finder/postgres_data/base/5/6116 +/opt/service_finder/postgres_data/base/5/6104 +/opt/service_finder/postgres_data/base/5/1247 +/opt/service_finder/postgres_data/base/5/2651 +/opt/service_finder/postgres_data/base/5/3456_fsm +/opt/service_finder/postgres_data/base/5/2616_vm +/opt/service_finder/postgres_data/base/5/4156 +/opt/service_finder/postgres_data/base/5/4169 +/opt/service_finder/postgres_data/base/5/2833 +/opt/service_finder/postgres_data/base/5/2836 +/opt/service_finder/postgres_data/base/5/4151 +/opt/service_finder/postgres_data/base/5/174 +/opt/service_finder/postgres_data/base/5/6111 +/opt/service_finder/postgres_data/base/5/3602_fsm +/opt/service_finder/postgres_data/base/5/2618_vm +/opt/service_finder/postgres_data/base/5/2678 +/opt/service_finder/postgres_data/base/5/2683 +/opt/service_finder/postgres_data/base/5/2656 +/opt/service_finder/postgres_data/base/5/2667 +/opt/service_finder/postgres_data/base/5/3119 +/opt/service_finder/postgres_data/base/5/2600 +/opt/service_finder/postgres_data/base/5/2620 +/opt/service_finder/postgres_data/base/5/2753 +/opt/service_finder/postgres_data/base/5/13457 +/opt/service_finder/postgres_data/base/5/112 +/opt/service_finder/postgres_data/base/5/2608_vm +/opt/service_finder/postgres_data/base/5/3575 +/opt/service_finder/postgres_data/base/5/3767 +/opt/service_finder/postgres_data/base/5/6113 +/opt/service_finder/postgres_data/base/5/3542 +/opt/service_finder/postgres_data/base/5/1259 +/opt/service_finder/postgres_data/base/5/2604 +/opt/service_finder/postgres_data/base/5/13461 +/opt/service_finder/postgres_data/base/5/2840 +/opt/service_finder/postgres_data/base/5/3601 +/opt/service_finder/postgres_data/base/5/2605_vm +/opt/service_finder/postgres_data/base/5/2606_fsm +/opt/service_finder/postgres_data/base/5/2830 +/opt/service_finder/postgres_data/base/5/6239 +/opt/service_finder/postgres_data/base/5/3430 +/opt/service_finder/postgres_data/base/5/2607_fsm +/opt/service_finder/postgres_data/base/5/2617 +/opt/service_finder/postgres_data/base/5/2702 +/opt/service_finder/postgres_data/base/5/4174 +/opt/service_finder/postgres_data/base/5/6106 +/opt/service_finder/postgres_data/base/5/2681 +/opt/service_finder/postgres_data/base/5/6238 +/opt/service_finder/postgres_data/base/5/2610_vm +/opt/service_finder/postgres_data/base/5/2838_fsm +/opt/service_finder/postgres_data/base/5/4172 +/opt/service_finder/postgres_data/base/5/175 +/opt/service_finder/postgres_data/base/5/3541 +/opt/service_finder/postgres_data/base/5/2832 +/opt/service_finder/postgres_data/base/5/2601_fsm +/opt/service_finder/postgres_data/base/5/13462 +/opt/service_finder/postgres_data/base/5/4170 +/opt/service_finder/postgres_data/base/5/3603 +/opt/service_finder/postgres_data/base/5/2610 +/opt/service_finder/postgres_data/base/5/2670 +/opt/service_finder/postgres_data/base/5/1249_vm +/opt/service_finder/postgres_data/base/5/2601 +/opt/service_finder/postgres_data/base/5/2605_fsm +/opt/service_finder/postgres_data/base/5/3081 +/opt/service_finder/postgres_data/base/5/4154 +/opt/service_finder/postgres_data/base/5/3456 +/opt/service_finder/postgres_data/base/5/2603_fsm +/opt/service_finder/postgres_data/base/5/2687 +/opt/service_finder/postgres_data/base/5/2608 +/opt/service_finder/postgres_data/base/5/2664 +/opt/service_finder/postgres_data/base/5/2840_fsm +/opt/service_finder/postgres_data/base/5/3576 +/opt/service_finder/postgres_data/base/1 +/opt/service_finder/postgres_data/base/1/3079_fsm +/opt/service_finder/postgres_data/base/1/4143 +/opt/service_finder/postgres_data/base/1/3455 +/opt/service_finder/postgres_data/base/1/2686 +/opt/service_finder/postgres_data/base/1/pg_filenode.map +/opt/service_finder/postgres_data/base/1/3602_vm +/opt/service_finder/postgres_data/base/1/1255_vm +/opt/service_finder/postgres_data/base/1/2601_vm +/opt/service_finder/postgres_data/base/1/2838_vm +/opt/service_finder/postgres_data/base/1/2836_fsm +/opt/service_finder/postgres_data/base/1/3164 +/opt/service_finder/postgres_data/base/1/13467_vm +/opt/service_finder/postgres_data/base/1/3351 +/opt/service_finder/postgres_data/base/1/3600_vm +/opt/service_finder/postgres_data/base/1/5002 +/opt/service_finder/postgres_data/base/1/1255_fsm +/opt/service_finder/postgres_data/base/1/3380 +/opt/service_finder/postgres_data/base/1/3381 +/opt/service_finder/postgres_data/base/1/2663 +/opt/service_finder/postgres_data/base/1/3601_fsm +/opt/service_finder/postgres_data/base/1/13472_fsm +/opt/service_finder/postgres_data/base/1/4148 +/opt/service_finder/postgres_data/base/1/2618_fsm +/opt/service_finder/postgres_data/base/1/3440 +/opt/service_finder/postgres_data/base/1/2619_vm +/opt/service_finder/postgres_data/base/1/3467 +/opt/service_finder/postgres_data/base/1/2688 +/opt/service_finder/postgres_data/base/1/3997 +/opt/service_finder/postgres_data/base/1/2662 +/opt/service_finder/postgres_data/base/1/6229 +/opt/service_finder/postgres_data/base/1/3439 +/opt/service_finder/postgres_data/base/1/13472_vm +/opt/service_finder/postgres_data/base/1/2657 +/opt/service_finder/postgres_data/base/1/2609_vm +/opt/service_finder/postgres_data/base/1/4157 +/opt/service_finder/postgres_data/base/1/3257 +/opt/service_finder/postgres_data/base/1/3503 +/opt/service_finder/postgres_data/base/1/3541_fsm +/opt/service_finder/postgres_data/base/1/2756 +/opt/service_finder/postgres_data/base/1/2615_vm +/opt/service_finder/postgres_data/base/1/1259_vm +/opt/service_finder/postgres_data/base/1/3256 +/opt/service_finder/postgres_data/base/1/2615_fsm +/opt/service_finder/postgres_data/base/1/2703 +/opt/service_finder/postgres_data/base/1/2753_vm +/opt/service_finder/postgres_data/base/1/2603_vm +/opt/service_finder/postgres_data/base/1/1249_fsm +/opt/service_finder/postgres_data/base/1/13460 +/opt/service_finder/postgres_data/base/1/3600 +/opt/service_finder/postgres_data/base/1/13457_vm +/opt/service_finder/postgres_data/base/1/2653 +/opt/service_finder/postgres_data/base/1/2337 +/opt/service_finder/postgres_data/base/1/13462_fsm +/opt/service_finder/postgres_data/base/1/3085 +/opt/service_finder/postgres_data/base/1/2995 +/opt/service_finder/postgres_data/base/1/2336 +/opt/service_finder/postgres_data/base/1/2612_fsm +/opt/service_finder/postgres_data/base/1/3258 +/opt/service_finder/postgres_data/base/1/3466 +/opt/service_finder/postgres_data/base/1/3079 +/opt/service_finder/postgres_data/base/1/4144 +/opt/service_finder/postgres_data/base/1/1417 +/opt/service_finder/postgres_data/base/1/13472 +/opt/service_finder/postgres_data/base/1/2666 +/opt/service_finder/postgres_data/base/1/13467 +/opt/service_finder/postgres_data/base/1/6228 +/opt/service_finder/postgres_data/base/1/6117 +/opt/service_finder/postgres_data/base/1/2757 +/opt/service_finder/postgres_data/base/1/2685 +/opt/service_finder/postgres_data/base/1/2612_vm +/opt/service_finder/postgres_data/base/1/2615 +/opt/service_finder/postgres_data/base/1/3501 +/opt/service_finder/postgres_data/base/1/3602 +/opt/service_finder/postgres_data/base/1/6176 +/opt/service_finder/postgres_data/base/1/2605 +/opt/service_finder/postgres_data/base/1/2674 +/opt/service_finder/postgres_data/base/1/2754 +/opt/service_finder/postgres_data/base/1/549 +/opt/service_finder/postgres_data/base/1/3712 +/opt/service_finder/postgres_data/base/1/2669 +/opt/service_finder/postgres_data/base/1/2689 +/opt/service_finder/postgres_data/base/1/4152 +/opt/service_finder/postgres_data/base/1/3395 +/opt/service_finder/postgres_data/base/1/2693 +/opt/service_finder/postgres_data/base/1/13475 +/opt/service_finder/postgres_data/base/1/4149 +/opt/service_finder/postgres_data/base/1/548 +/opt/service_finder/postgres_data/base/1/2699 +/opt/service_finder/postgres_data/base/1/2673 +/opt/service_finder/postgres_data/base/1/3431 +/opt/service_finder/postgres_data/base/1/3574 +/opt/service_finder/postgres_data/base/1/3468 +/opt/service_finder/postgres_data/base/1/4171 +/opt/service_finder/postgres_data/base/1/4163 +/opt/service_finder/postgres_data/base/1/2696 +/opt/service_finder/postgres_data/base/1/4168 +/opt/service_finder/postgres_data/base/1/6102 +/opt/service_finder/postgres_data/base/1/3597 +/opt/service_finder/postgres_data/base/1/pg_internal.init +/opt/service_finder/postgres_data/base/1/PG_VERSION +/opt/service_finder/postgres_data/base/1/2837 +/opt/service_finder/postgres_data/base/1/2579 +/opt/service_finder/postgres_data/base/1/827 +/opt/service_finder/postgres_data/base/1/4158 +/opt/service_finder/postgres_data/base/1/2691 +/opt/service_finder/postgres_data/base/1/826 +/opt/service_finder/postgres_data/base/1/2660 +/opt/service_finder/postgres_data/base/1/3596 +/opt/service_finder/postgres_data/base/1/2228 +/opt/service_finder/postgres_data/base/1/3605 +/opt/service_finder/postgres_data/base/1/2668 +/opt/service_finder/postgres_data/base/1/4145 +/opt/service_finder/postgres_data/base/1/2602_vm +/opt/service_finder/postgres_data/base/1/2602_fsm +/opt/service_finder/postgres_data/base/1/3079_vm +/opt/service_finder/postgres_data/base/1/4155 +/opt/service_finder/postgres_data/base/1/13476 +/opt/service_finder/postgres_data/base/1/2617_fsm +/opt/service_finder/postgres_data/base/1/2607_vm +/opt/service_finder/postgres_data/base/1/2606 +/opt/service_finder/postgres_data/base/1/2610_fsm +/opt/service_finder/postgres_data/base/1/2831 +/opt/service_finder/postgres_data/base/1/3394_vm +/opt/service_finder/postgres_data/base/1/4147 +/opt/service_finder/postgres_data/base/1/1255 +/opt/service_finder/postgres_data/base/1/2607 +/opt/service_finder/postgres_data/base/1/2611 +/opt/service_finder/postgres_data/base/1/2753_fsm +/opt/service_finder/postgres_data/base/1/2187 +/opt/service_finder/postgres_data/base/1/13465 +/opt/service_finder/postgres_data/base/1/2650 +/opt/service_finder/postgres_data/base/1/3601_vm +/opt/service_finder/postgres_data/base/1/2658 +/opt/service_finder/postgres_data/base/1/2606_vm +/opt/service_finder/postgres_data/base/1/2602 +/opt/service_finder/postgres_data/base/1/2609_fsm +/opt/service_finder/postgres_data/base/1/3607 +/opt/service_finder/postgres_data/base/1/3764_fsm +/opt/service_finder/postgres_data/base/1/4165 +/opt/service_finder/postgres_data/base/1/3764_vm +/opt/service_finder/postgres_data/base/1/4167 +/opt/service_finder/postgres_data/base/1/13457_fsm +/opt/service_finder/postgres_data/base/1/2600_vm +/opt/service_finder/postgres_data/base/1/3350 +/opt/service_finder/postgres_data/base/1/2652 +/opt/service_finder/postgres_data/base/1/3118 +/opt/service_finder/postgres_data/base/1/3603_vm +/opt/service_finder/postgres_data/base/1/2704 +/opt/service_finder/postgres_data/base/1/2328 +/opt/service_finder/postgres_data/base/1/6237 +/opt/service_finder/postgres_data/base/1/4150 +/opt/service_finder/postgres_data/base/1/3606 +/opt/service_finder/postgres_data/base/1/1259_fsm +/opt/service_finder/postgres_data/base/1/2675 +/opt/service_finder/postgres_data/base/1/3598 +/opt/service_finder/postgres_data/base/1/6110 +/opt/service_finder/postgres_data/base/1/113 +/opt/service_finder/postgres_data/base/1/1247_fsm +/opt/service_finder/postgres_data/base/1/2682 +/opt/service_finder/postgres_data/base/1/13471 +/opt/service_finder/postgres_data/base/1/3608 +/opt/service_finder/postgres_data/base/1/4173 +/opt/service_finder/postgres_data/base/1/2679 +/opt/service_finder/postgres_data/base/1/3379 +/opt/service_finder/postgres_data/base/1/2616 +/opt/service_finder/postgres_data/base/1/2839 +/opt/service_finder/postgres_data/base/1/3764 +/opt/service_finder/postgres_data/base/1/2661 +/opt/service_finder/postgres_data/base/1/2835 +/opt/service_finder/postgres_data/base/1/2619 +/opt/service_finder/postgres_data/base/1/2608_fsm +/opt/service_finder/postgres_data/base/1/2655 +/opt/service_finder/postgres_data/base/1/3766 +/opt/service_finder/postgres_data/base/1/13470 +/opt/service_finder/postgres_data/base/1/3394 +/opt/service_finder/postgres_data/base/1/3080 +/opt/service_finder/postgres_data/base/1/2619_fsm +/opt/service_finder/postgres_data/base/1/3541_vm +/opt/service_finder/postgres_data/base/1/4164 +/opt/service_finder/postgres_data/base/1/3502 +/opt/service_finder/postgres_data/base/1/4159 +/opt/service_finder/postgres_data/base/1/2613 +/opt/service_finder/postgres_data/base/1/4153 +/opt/service_finder/postgres_data/base/1/13467_fsm +/opt/service_finder/postgres_data/base/1/6112 +/opt/service_finder/postgres_data/base/1/3456_vm +/opt/service_finder/postgres_data/base/1/2616_fsm +/opt/service_finder/postgres_data/base/1/2224 +/opt/service_finder/postgres_data/base/1/2603 +/opt/service_finder/postgres_data/base/1/2665 +/opt/service_finder/postgres_data/base/1/2755 +/opt/service_finder/postgres_data/base/1/3604 +/opt/service_finder/postgres_data/base/1/2609 +/opt/service_finder/postgres_data/base/1/2659 +/opt/service_finder/postgres_data/base/1/2612 +/opt/service_finder/postgres_data/base/1/13466 +/opt/service_finder/postgres_data/base/1/2690 +/opt/service_finder/postgres_data/base/1/2838 +/opt/service_finder/postgres_data/base/1/1249 +/opt/service_finder/postgres_data/base/1/3429 +/opt/service_finder/postgres_data/base/1/828 +/opt/service_finder/postgres_data/base/1/3599 +/opt/service_finder/postgres_data/base/1/2680 +/opt/service_finder/postgres_data/base/1/3534 +/opt/service_finder/postgres_data/base/1/2836_vm +/opt/service_finder/postgres_data/base/1/2618 +/opt/service_finder/postgres_data/base/1/2840_vm +/opt/service_finder/postgres_data/base/1/2654 +/opt/service_finder/postgres_data/base/1/4166 +/opt/service_finder/postgres_data/base/1/2600_fsm +/opt/service_finder/postgres_data/base/1/2841 +/opt/service_finder/postgres_data/base/1/2617_vm +/opt/service_finder/postgres_data/base/1/2996 +/opt/service_finder/postgres_data/base/1/3433 +/opt/service_finder/postgres_data/base/1/2684 +/opt/service_finder/postgres_data/base/1/3603_fsm +/opt/service_finder/postgres_data/base/1/1247_vm +/opt/service_finder/postgres_data/base/1/3394_fsm +/opt/service_finder/postgres_data/base/1/6175 +/opt/service_finder/postgres_data/base/1/2834 +/opt/service_finder/postgres_data/base/1/3609 +/opt/service_finder/postgres_data/base/1/2692 +/opt/service_finder/postgres_data/base/1/13462_vm +/opt/service_finder/postgres_data/base/1/3600_fsm +/opt/service_finder/postgres_data/base/1/2701 +/opt/service_finder/postgres_data/base/1/4160 +/opt/service_finder/postgres_data/base/1/4146 +/opt/service_finder/postgres_data/base/1/1418 +/opt/service_finder/postgres_data/base/1/6116 +/opt/service_finder/postgres_data/base/1/6104 +/opt/service_finder/postgres_data/base/1/1247 +/opt/service_finder/postgres_data/base/1/2651 +/opt/service_finder/postgres_data/base/1/3456_fsm +/opt/service_finder/postgres_data/base/1/2616_vm +/opt/service_finder/postgres_data/base/1/4156 +/opt/service_finder/postgres_data/base/1/4169 +/opt/service_finder/postgres_data/base/1/2833 +/opt/service_finder/postgres_data/base/1/2836 +/opt/service_finder/postgres_data/base/1/4151 +/opt/service_finder/postgres_data/base/1/174 +/opt/service_finder/postgres_data/base/1/6111 +/opt/service_finder/postgres_data/base/1/3602_fsm +/opt/service_finder/postgres_data/base/1/2618_vm +/opt/service_finder/postgres_data/base/1/2678 +/opt/service_finder/postgres_data/base/1/2683 +/opt/service_finder/postgres_data/base/1/2656 +/opt/service_finder/postgres_data/base/1/2667 +/opt/service_finder/postgres_data/base/1/3119 +/opt/service_finder/postgres_data/base/1/2600 +/opt/service_finder/postgres_data/base/1/2620 +/opt/service_finder/postgres_data/base/1/2753 +/opt/service_finder/postgres_data/base/1/13457 +/opt/service_finder/postgres_data/base/1/112 +/opt/service_finder/postgres_data/base/1/2608_vm +/opt/service_finder/postgres_data/base/1/3575 +/opt/service_finder/postgres_data/base/1/3767 +/opt/service_finder/postgres_data/base/1/6113 +/opt/service_finder/postgres_data/base/1/3542 +/opt/service_finder/postgres_data/base/1/1259 +/opt/service_finder/postgres_data/base/1/2604 +/opt/service_finder/postgres_data/base/1/13461 +/opt/service_finder/postgres_data/base/1/2840 +/opt/service_finder/postgres_data/base/1/3601 +/opt/service_finder/postgres_data/base/1/2605_vm +/opt/service_finder/postgres_data/base/1/2606_fsm +/opt/service_finder/postgres_data/base/1/2830 +/opt/service_finder/postgres_data/base/1/6239 +/opt/service_finder/postgres_data/base/1/3430 +/opt/service_finder/postgres_data/base/1/2607_fsm +/opt/service_finder/postgres_data/base/1/2617 +/opt/service_finder/postgres_data/base/1/2702 +/opt/service_finder/postgres_data/base/1/4174 +/opt/service_finder/postgres_data/base/1/6106 +/opt/service_finder/postgres_data/base/1/2681 +/opt/service_finder/postgres_data/base/1/6238 +/opt/service_finder/postgres_data/base/1/2610_vm +/opt/service_finder/postgres_data/base/1/2838_fsm +/opt/service_finder/postgres_data/base/1/4172 +/opt/service_finder/postgres_data/base/1/175 +/opt/service_finder/postgres_data/base/1/3541 +/opt/service_finder/postgres_data/base/1/2832 +/opt/service_finder/postgres_data/base/1/2601_fsm +/opt/service_finder/postgres_data/base/1/13462 +/opt/service_finder/postgres_data/base/1/4170 +/opt/service_finder/postgres_data/base/1/3603 +/opt/service_finder/postgres_data/base/1/2610 +/opt/service_finder/postgres_data/base/1/2670 +/opt/service_finder/postgres_data/base/1/1249_vm +/opt/service_finder/postgres_data/base/1/2601 +/opt/service_finder/postgres_data/base/1/2605_fsm +/opt/service_finder/postgres_data/base/1/3081 +/opt/service_finder/postgres_data/base/1/4154 +/opt/service_finder/postgres_data/base/1/3456 +/opt/service_finder/postgres_data/base/1/2603_fsm +/opt/service_finder/postgres_data/base/1/2687 +/opt/service_finder/postgres_data/base/1/2608 +/opt/service_finder/postgres_data/base/1/2664 +/opt/service_finder/postgres_data/base/1/2840_fsm +/opt/service_finder/postgres_data/base/1/3576 +/opt/service_finder/postgres_data/base/4 +/opt/service_finder/postgres_data/base/4/3079_fsm +/opt/service_finder/postgres_data/base/4/4143 +/opt/service_finder/postgres_data/base/4/3455 +/opt/service_finder/postgres_data/base/4/2686 +/opt/service_finder/postgres_data/base/4/pg_filenode.map +/opt/service_finder/postgres_data/base/4/3602_vm +/opt/service_finder/postgres_data/base/4/1255_vm +/opt/service_finder/postgres_data/base/4/2601_vm +/opt/service_finder/postgres_data/base/4/2838_vm +/opt/service_finder/postgres_data/base/4/2836_fsm +/opt/service_finder/postgres_data/base/4/3164 +/opt/service_finder/postgres_data/base/4/13467_vm +/opt/service_finder/postgres_data/base/4/3351 +/opt/service_finder/postgres_data/base/4/3600_vm +/opt/service_finder/postgres_data/base/4/5002 +/opt/service_finder/postgres_data/base/4/1255_fsm +/opt/service_finder/postgres_data/base/4/3380 +/opt/service_finder/postgres_data/base/4/3381 +/opt/service_finder/postgres_data/base/4/2663 +/opt/service_finder/postgres_data/base/4/3601_fsm +/opt/service_finder/postgres_data/base/4/13472_fsm +/opt/service_finder/postgres_data/base/4/4148 +/opt/service_finder/postgres_data/base/4/2618_fsm +/opt/service_finder/postgres_data/base/4/3440 +/opt/service_finder/postgres_data/base/4/2619_vm +/opt/service_finder/postgres_data/base/4/3467 +/opt/service_finder/postgres_data/base/4/2688 +/opt/service_finder/postgres_data/base/4/3997 +/opt/service_finder/postgres_data/base/4/2662 +/opt/service_finder/postgres_data/base/4/6229 +/opt/service_finder/postgres_data/base/4/3439 +/opt/service_finder/postgres_data/base/4/13472_vm +/opt/service_finder/postgres_data/base/4/2657 +/opt/service_finder/postgres_data/base/4/2609_vm +/opt/service_finder/postgres_data/base/4/4157 +/opt/service_finder/postgres_data/base/4/3257 +/opt/service_finder/postgres_data/base/4/3503 +/opt/service_finder/postgres_data/base/4/3541_fsm +/opt/service_finder/postgres_data/base/4/2756 +/opt/service_finder/postgres_data/base/4/2615_vm +/opt/service_finder/postgres_data/base/4/1259_vm +/opt/service_finder/postgres_data/base/4/3256 +/opt/service_finder/postgres_data/base/4/2615_fsm +/opt/service_finder/postgres_data/base/4/2703 +/opt/service_finder/postgres_data/base/4/2753_vm +/opt/service_finder/postgres_data/base/4/2603_vm +/opt/service_finder/postgres_data/base/4/1249_fsm +/opt/service_finder/postgres_data/base/4/13460 +/opt/service_finder/postgres_data/base/4/3600 +/opt/service_finder/postgres_data/base/4/13457_vm +/opt/service_finder/postgres_data/base/4/2653 +/opt/service_finder/postgres_data/base/4/2337 +/opt/service_finder/postgres_data/base/4/13462_fsm +/opt/service_finder/postgres_data/base/4/3085 +/opt/service_finder/postgres_data/base/4/2995 +/opt/service_finder/postgres_data/base/4/2336 +/opt/service_finder/postgres_data/base/4/2612_fsm +/opt/service_finder/postgres_data/base/4/3258 +/opt/service_finder/postgres_data/base/4/3466 +/opt/service_finder/postgres_data/base/4/3079 +/opt/service_finder/postgres_data/base/4/4144 +/opt/service_finder/postgres_data/base/4/1417 +/opt/service_finder/postgres_data/base/4/13472 +/opt/service_finder/postgres_data/base/4/2666 +/opt/service_finder/postgres_data/base/4/13467 +/opt/service_finder/postgres_data/base/4/6228 +/opt/service_finder/postgres_data/base/4/6117 +/opt/service_finder/postgres_data/base/4/2757 +/opt/service_finder/postgres_data/base/4/2685 +/opt/service_finder/postgres_data/base/4/2612_vm +/opt/service_finder/postgres_data/base/4/2615 +/opt/service_finder/postgres_data/base/4/3501 +/opt/service_finder/postgres_data/base/4/3602 +/opt/service_finder/postgres_data/base/4/6176 +/opt/service_finder/postgres_data/base/4/2605 +/opt/service_finder/postgres_data/base/4/2674 +/opt/service_finder/postgres_data/base/4/2754 +/opt/service_finder/postgres_data/base/4/549 +/opt/service_finder/postgres_data/base/4/3712 +/opt/service_finder/postgres_data/base/4/2669 +/opt/service_finder/postgres_data/base/4/2689 +/opt/service_finder/postgres_data/base/4/4152 +/opt/service_finder/postgres_data/base/4/3395 +/opt/service_finder/postgres_data/base/4/2693 +/opt/service_finder/postgres_data/base/4/13475 +/opt/service_finder/postgres_data/base/4/4149 +/opt/service_finder/postgres_data/base/4/548 +/opt/service_finder/postgres_data/base/4/2699 +/opt/service_finder/postgres_data/base/4/2673 +/opt/service_finder/postgres_data/base/4/3431 +/opt/service_finder/postgres_data/base/4/3574 +/opt/service_finder/postgres_data/base/4/3468 +/opt/service_finder/postgres_data/base/4/4171 +/opt/service_finder/postgres_data/base/4/4163 +/opt/service_finder/postgres_data/base/4/2696 +/opt/service_finder/postgres_data/base/4/4168 +/opt/service_finder/postgres_data/base/4/6102 +/opt/service_finder/postgres_data/base/4/3597 +/opt/service_finder/postgres_data/base/4/PG_VERSION +/opt/service_finder/postgres_data/base/4/2837 +/opt/service_finder/postgres_data/base/4/2579 +/opt/service_finder/postgres_data/base/4/827 +/opt/service_finder/postgres_data/base/4/4158 +/opt/service_finder/postgres_data/base/4/2691 +/opt/service_finder/postgres_data/base/4/826 +/opt/service_finder/postgres_data/base/4/2660 +/opt/service_finder/postgres_data/base/4/3596 +/opt/service_finder/postgres_data/base/4/2228 +/opt/service_finder/postgres_data/base/4/3605 +/opt/service_finder/postgres_data/base/4/2668 +/opt/service_finder/postgres_data/base/4/4145 +/opt/service_finder/postgres_data/base/4/2602_vm +/opt/service_finder/postgres_data/base/4/2602_fsm +/opt/service_finder/postgres_data/base/4/3079_vm +/opt/service_finder/postgres_data/base/4/4155 +/opt/service_finder/postgres_data/base/4/13476 +/opt/service_finder/postgres_data/base/4/2617_fsm +/opt/service_finder/postgres_data/base/4/2607_vm +/opt/service_finder/postgres_data/base/4/2606 +/opt/service_finder/postgres_data/base/4/2610_fsm +/opt/service_finder/postgres_data/base/4/2831 +/opt/service_finder/postgres_data/base/4/3394_vm +/opt/service_finder/postgres_data/base/4/4147 +/opt/service_finder/postgres_data/base/4/1255 +/opt/service_finder/postgres_data/base/4/2607 +/opt/service_finder/postgres_data/base/4/2611 +/opt/service_finder/postgres_data/base/4/2753_fsm +/opt/service_finder/postgres_data/base/4/2187 +/opt/service_finder/postgres_data/base/4/13465 +/opt/service_finder/postgres_data/base/4/2650 +/opt/service_finder/postgres_data/base/4/3601_vm +/opt/service_finder/postgres_data/base/4/2658 +/opt/service_finder/postgres_data/base/4/2606_vm +/opt/service_finder/postgres_data/base/4/2602 +/opt/service_finder/postgres_data/base/4/2609_fsm +/opt/service_finder/postgres_data/base/4/3607 +/opt/service_finder/postgres_data/base/4/3764_fsm +/opt/service_finder/postgres_data/base/4/4165 +/opt/service_finder/postgres_data/base/4/3764_vm +/opt/service_finder/postgres_data/base/4/4167 +/opt/service_finder/postgres_data/base/4/13457_fsm +/opt/service_finder/postgres_data/base/4/2600_vm +/opt/service_finder/postgres_data/base/4/3350 +/opt/service_finder/postgres_data/base/4/2652 +/opt/service_finder/postgres_data/base/4/3118 +/opt/service_finder/postgres_data/base/4/3603_vm +/opt/service_finder/postgres_data/base/4/2704 +/opt/service_finder/postgres_data/base/4/2328 +/opt/service_finder/postgres_data/base/4/6237 +/opt/service_finder/postgres_data/base/4/4150 +/opt/service_finder/postgres_data/base/4/3606 +/opt/service_finder/postgres_data/base/4/1259_fsm +/opt/service_finder/postgres_data/base/4/2675 +/opt/service_finder/postgres_data/base/4/3598 +/opt/service_finder/postgres_data/base/4/6110 +/opt/service_finder/postgres_data/base/4/113 +/opt/service_finder/postgres_data/base/4/1247_fsm +/opt/service_finder/postgres_data/base/4/2682 +/opt/service_finder/postgres_data/base/4/13471 +/opt/service_finder/postgres_data/base/4/3608 +/opt/service_finder/postgres_data/base/4/4173 +/opt/service_finder/postgres_data/base/4/2679 +/opt/service_finder/postgres_data/base/4/3379 +/opt/service_finder/postgres_data/base/4/2616 +/opt/service_finder/postgres_data/base/4/2839 +/opt/service_finder/postgres_data/base/4/3764 +/opt/service_finder/postgres_data/base/4/2661 +/opt/service_finder/postgres_data/base/4/2835 +/opt/service_finder/postgres_data/base/4/2619 +/opt/service_finder/postgres_data/base/4/2608_fsm +/opt/service_finder/postgres_data/base/4/2655 +/opt/service_finder/postgres_data/base/4/3766 +/opt/service_finder/postgres_data/base/4/13470 +/opt/service_finder/postgres_data/base/4/3394 +/opt/service_finder/postgres_data/base/4/3080 +/opt/service_finder/postgres_data/base/4/2619_fsm +/opt/service_finder/postgres_data/base/4/3541_vm +/opt/service_finder/postgres_data/base/4/4164 +/opt/service_finder/postgres_data/base/4/3502 +/opt/service_finder/postgres_data/base/4/4159 +/opt/service_finder/postgres_data/base/4/2613 +/opt/service_finder/postgres_data/base/4/4153 +/opt/service_finder/postgres_data/base/4/13467_fsm +/opt/service_finder/postgres_data/base/4/6112 +/opt/service_finder/postgres_data/base/4/3456_vm +/opt/service_finder/postgres_data/base/4/2616_fsm +/opt/service_finder/postgres_data/base/4/2224 +/opt/service_finder/postgres_data/base/4/2603 +/opt/service_finder/postgres_data/base/4/2665 +/opt/service_finder/postgres_data/base/4/2755 +/opt/service_finder/postgres_data/base/4/3604 +/opt/service_finder/postgres_data/base/4/2609 +/opt/service_finder/postgres_data/base/4/2659 +/opt/service_finder/postgres_data/base/4/2612 +/opt/service_finder/postgres_data/base/4/13466 +/opt/service_finder/postgres_data/base/4/2690 +/opt/service_finder/postgres_data/base/4/2838 +/opt/service_finder/postgres_data/base/4/1249 +/opt/service_finder/postgres_data/base/4/3429 +/opt/service_finder/postgres_data/base/4/828 +/opt/service_finder/postgres_data/base/4/3599 +/opt/service_finder/postgres_data/base/4/2680 +/opt/service_finder/postgres_data/base/4/3534 +/opt/service_finder/postgres_data/base/4/2836_vm +/opt/service_finder/postgres_data/base/4/2618 +/opt/service_finder/postgres_data/base/4/2840_vm +/opt/service_finder/postgres_data/base/4/2654 +/opt/service_finder/postgres_data/base/4/4166 +/opt/service_finder/postgres_data/base/4/2600_fsm +/opt/service_finder/postgres_data/base/4/2841 +/opt/service_finder/postgres_data/base/4/2617_vm +/opt/service_finder/postgres_data/base/4/2996 +/opt/service_finder/postgres_data/base/4/3433 +/opt/service_finder/postgres_data/base/4/2684 +/opt/service_finder/postgres_data/base/4/3603_fsm +/opt/service_finder/postgres_data/base/4/1247_vm +/opt/service_finder/postgres_data/base/4/3394_fsm +/opt/service_finder/postgres_data/base/4/6175 +/opt/service_finder/postgres_data/base/4/2834 +/opt/service_finder/postgres_data/base/4/3609 +/opt/service_finder/postgres_data/base/4/2692 +/opt/service_finder/postgres_data/base/4/13462_vm +/opt/service_finder/postgres_data/base/4/3600_fsm +/opt/service_finder/postgres_data/base/4/2701 +/opt/service_finder/postgres_data/base/4/4160 +/opt/service_finder/postgres_data/base/4/4146 +/opt/service_finder/postgres_data/base/4/1418 +/opt/service_finder/postgres_data/base/4/6116 +/opt/service_finder/postgres_data/base/4/6104 +/opt/service_finder/postgres_data/base/4/1247 +/opt/service_finder/postgres_data/base/4/2651 +/opt/service_finder/postgres_data/base/4/3456_fsm +/opt/service_finder/postgres_data/base/4/2616_vm +/opt/service_finder/postgres_data/base/4/4156 +/opt/service_finder/postgres_data/base/4/4169 +/opt/service_finder/postgres_data/base/4/2833 +/opt/service_finder/postgres_data/base/4/2836 +/opt/service_finder/postgres_data/base/4/4151 +/opt/service_finder/postgres_data/base/4/174 +/opt/service_finder/postgres_data/base/4/6111 +/opt/service_finder/postgres_data/base/4/3602_fsm +/opt/service_finder/postgres_data/base/4/2618_vm +/opt/service_finder/postgres_data/base/4/2678 +/opt/service_finder/postgres_data/base/4/2683 +/opt/service_finder/postgres_data/base/4/2656 +/opt/service_finder/postgres_data/base/4/2667 +/opt/service_finder/postgres_data/base/4/3119 +/opt/service_finder/postgres_data/base/4/2600 +/opt/service_finder/postgres_data/base/4/2620 +/opt/service_finder/postgres_data/base/4/2753 +/opt/service_finder/postgres_data/base/4/13457 +/opt/service_finder/postgres_data/base/4/112 +/opt/service_finder/postgres_data/base/4/2608_vm +/opt/service_finder/postgres_data/base/4/3575 +/opt/service_finder/postgres_data/base/4/3767 +/opt/service_finder/postgres_data/base/4/6113 +/opt/service_finder/postgres_data/base/4/3542 +/opt/service_finder/postgres_data/base/4/1259 +/opt/service_finder/postgres_data/base/4/2604 +/opt/service_finder/postgres_data/base/4/13461 +/opt/service_finder/postgres_data/base/4/2840 +/opt/service_finder/postgres_data/base/4/3601 +/opt/service_finder/postgres_data/base/4/2605_vm +/opt/service_finder/postgres_data/base/4/2606_fsm +/opt/service_finder/postgres_data/base/4/2830 +/opt/service_finder/postgres_data/base/4/6239 +/opt/service_finder/postgres_data/base/4/3430 +/opt/service_finder/postgres_data/base/4/2607_fsm +/opt/service_finder/postgres_data/base/4/2617 +/opt/service_finder/postgres_data/base/4/2702 +/opt/service_finder/postgres_data/base/4/4174 +/opt/service_finder/postgres_data/base/4/6106 +/opt/service_finder/postgres_data/base/4/2681 +/opt/service_finder/postgres_data/base/4/6238 +/opt/service_finder/postgres_data/base/4/2610_vm +/opt/service_finder/postgres_data/base/4/2838_fsm +/opt/service_finder/postgres_data/base/4/4172 +/opt/service_finder/postgres_data/base/4/175 +/opt/service_finder/postgres_data/base/4/3541 +/opt/service_finder/postgres_data/base/4/2832 +/opt/service_finder/postgres_data/base/4/2601_fsm +/opt/service_finder/postgres_data/base/4/13462 +/opt/service_finder/postgres_data/base/4/4170 +/opt/service_finder/postgres_data/base/4/3603 +/opt/service_finder/postgres_data/base/4/2610 +/opt/service_finder/postgres_data/base/4/2670 +/opt/service_finder/postgres_data/base/4/1249_vm +/opt/service_finder/postgres_data/base/4/2601 +/opt/service_finder/postgres_data/base/4/2605_fsm +/opt/service_finder/postgres_data/base/4/3081 +/opt/service_finder/postgres_data/base/4/4154 +/opt/service_finder/postgres_data/base/4/3456 +/opt/service_finder/postgres_data/base/4/2603_fsm +/opt/service_finder/postgres_data/base/4/2687 +/opt/service_finder/postgres_data/base/4/2608 +/opt/service_finder/postgres_data/base/4/2664 +/opt/service_finder/postgres_data/base/4/2840_fsm +/opt/service_finder/postgres_data/base/4/3576 +/opt/service_finder/postgres_data/pg_hba.conf +/opt/service_finder/postgres_data/pg_dynshmem +/opt/service_finder/postgres_data/pg_xact +/opt/service_finder/postgres_data/pg_xact/0000 +/opt/service_finder/postgres_data/postgresql.auto.conf +/opt/service_finder/postgres_data/pg_stat +/opt/service_finder/postgres_data/PG_VERSION +/opt/service_finder/postgres_data/pg_stat_tmp +/opt/service_finder/postgres_data/pg_subtrans +/opt/service_finder/postgres_data/pg_subtrans/0000 +/opt/service_finder/postgres_data/pg_ident.conf +/opt/service_finder/postgres_data/pg_snapshots +/opt/service_finder/postgres_data/global +/opt/service_finder/postgres_data/global/1232 +/opt/service_finder/postgres_data/global/pg_filenode.map +/opt/service_finder/postgres_data/global/6001 +/opt/service_finder/postgres_data/global/1260_vm +/opt/service_finder/postgres_data/global/2677 +/opt/service_finder/postgres_data/global/2847 +/opt/service_finder/postgres_data/global/1262 +/opt/service_finder/postgres_data/global/3592 +/opt/service_finder/postgres_data/global/4177 +/opt/service_finder/postgres_data/global/3593 +/opt/service_finder/postgres_data/global/4185 +/opt/service_finder/postgres_data/global/2676 +/opt/service_finder/postgres_data/global/2396 +/opt/service_finder/postgres_data/global/1261_vm +/opt/service_finder/postgres_data/global/2671 +/opt/service_finder/postgres_data/global/6243 +/opt/service_finder/postgres_data/global/pg_internal.init +/opt/service_finder/postgres_data/global/2964 +/opt/service_finder/postgres_data/global/4182 +/opt/service_finder/postgres_data/global/1260_fsm +/opt/service_finder/postgres_data/global/4181 +/opt/service_finder/postgres_data/global/4178 +/opt/service_finder/postgres_data/global/1213_fsm +/opt/service_finder/postgres_data/global/4175 +/opt/service_finder/postgres_data/global/1261 +/opt/service_finder/postgres_data/global/2695 +/opt/service_finder/postgres_data/global/1233 +/opt/service_finder/postgres_data/global/4186 +/opt/service_finder/postgres_data/global/4183 +/opt/service_finder/postgres_data/global/2396_fsm +/opt/service_finder/postgres_data/global/4061 +/opt/service_finder/postgres_data/global/2694 +/opt/service_finder/postgres_data/global/6000 +/opt/service_finder/postgres_data/global/4184 +/opt/service_finder/postgres_data/global/1260 +/opt/service_finder/postgres_data/global/pg_control +/opt/service_finder/postgres_data/global/2967 +/opt/service_finder/postgres_data/global/6100 +/opt/service_finder/postgres_data/global/1262_vm +/opt/service_finder/postgres_data/global/2397 +/opt/service_finder/postgres_data/global/6244 +/opt/service_finder/postgres_data/global/6246 +/opt/service_finder/postgres_data/global/6002 +/opt/service_finder/postgres_data/global/1262_fsm +/opt/service_finder/postgres_data/global/4176 +/opt/service_finder/postgres_data/global/6114 +/opt/service_finder/postgres_data/global/6245 +/opt/service_finder/postgres_data/global/2672 +/opt/service_finder/postgres_data/global/1261_fsm +/opt/service_finder/postgres_data/global/4060 +/opt/service_finder/postgres_data/global/2966 +/opt/service_finder/postgres_data/global/6247 +/opt/service_finder/postgres_data/global/2846 +/opt/service_finder/postgres_data/global/1213_vm +/opt/service_finder/postgres_data/global/6115 +/opt/service_finder/postgres_data/global/2396_vm +/opt/service_finder/postgres_data/global/2698 +/opt/service_finder/postgres_data/global/2697 +/opt/service_finder/postgres_data/global/2965 +/opt/service_finder/postgres_data/global/1214 +/opt/service_finder/postgres_data/global/1213 +/opt/service_finder/postgres_data/pg_serial +/opt/service_finder/postgres_data/pg_replslot +/opt/service_finder/postgres_data/pg_tblspc +/opt/service_finder/postgres_data/pg_multixact +/opt/service_finder/postgres_data/pg_multixact/members +/opt/service_finder/postgres_data/pg_multixact/members/0000 +/opt/service_finder/postgres_data/pg_multixact/offsets +/opt/service_finder/postgres_data/pg_multixact/offsets/0000 +/opt/service_finder/postgres_data/pg_twophase +/opt/service_finder/postgres_data/pg_notify +/opt/service_finder/postgres_data/postgresql.conf +/opt/service_finder/postgres_data/pg_wal +/opt/service_finder/postgres_data/pg_wal/000000010000000000000004 +/opt/service_finder/postgres_data/pg_wal/archive_status +/opt/service_finder/postgres_data/pg_wal/000000010000000000000003 +/opt/service_finder/postgres_data/postmaster.opts +/opt/service_finder/postgres_data/postmaster.pid +/opt/service_finder/_Projekt Állapot jelentés.txt +/opt/service_finder/_valtozok_konyve.txt +/opt/service_finder/redis +/opt/service_finder/redis/data +/opt/service_finder/redis/data/appendonlydir +/opt/service_finder/redis/data/appendonlydir/appendonly.aof.1.incr.aof +/opt/service_finder/redis/data/appendonlydir/appendonly.aof.manifest +/opt/service_finder/redis/data/appendonlydir/appendonly.aof.1.base.rdb +/opt/service_finder/redis/data/dump.rdb +/opt/service_finder/Service_finder Rendszerspecifikáció es feljesztes.txt +/opt/service_finder/Promptok gemekhez.txt +/opt/service_finder/pgadmin_data +/opt/service_finder/pgadmin_data/sessions +/opt/service_finder/pgadmin_data/sessions/7e296dbd-1a8a-4ee7-9d2b-d58fe252f075 +/opt/service_finder/pgadmin_data/sessions/c666f005-bd12-4473-afc5-a29c62bf415d +/opt/service_finder/pgadmin_data/sessions/85b5337d-d8f2-4b71-b137-064d2e58ac71 +/opt/service_finder/pgadmin_data/sessions/531a8bc6-f244-413e-8871-ad91726f2c07 +/opt/service_finder/pgadmin_data/sessions/07db1ecc-c3fa-40ab-a083-12e85dcce468 +/opt/service_finder/pgadmin_data/sessions/8cf0580d-952f-4493-89c3-85c67e055c65 +/opt/service_finder/pgadmin_data/sessions/330aa8d0-b9e3-4358-ad44-2e2652be0368 +/opt/service_finder/pgadmin_data/sessions/5bfd65ca-5f1c-4ddc-bbcd-11eb357ac79a +/opt/service_finder/pgadmin_data/sessions/6efddea4-0fff-4ba4-88de-7e7f59829a07 +/opt/service_finder/pgadmin_data/sessions/d9687357-482d-4e98-a5c2-7e2b703a81f4 +/opt/service_finder/pgadmin_data/sessions/d8167c73-8c62-4a58-a955-793bca662153 +/opt/service_finder/pgadmin_data/sessions/c05ee10a-1093-4927-98d9-b695682f8bf5 +/opt/service_finder/pgadmin_data/sessions/6b81cca5-ecc5-4102-b789-5e90c669b23c +/opt/service_finder/pgadmin_data/sessions/6ac4ae19-3062-4f40-85fb-14eef4316770 +/opt/service_finder/pgadmin_data/sessions/782736b8-f6e0-44a4-881a-947fff399f36 +/opt/service_finder/pgadmin_data/sessions/f3274d22-c918-4c15-9235-38f09a0984e9 +/opt/service_finder/pgadmin_data/sessions/b38560bd-b66e-451b-8d78-2f36cfc1f25c +/opt/service_finder/pgadmin_data/sessions/e9740d39-d498-43c2-b2aa-5242ec394e5c +/opt/service_finder/pgadmin_data/sessions/6a28c89f-7ae0-4c51-b84f-16a526b0adbe +/opt/service_finder/pgadmin_data/sessions/6829177c-2838-4686-8d7f-3659b50ecdf1 +/opt/service_finder/pgadmin_data/sessions/4613daf5-a479-4334-bec9-3a1242c0aff8 +/opt/service_finder/pgadmin_data/sessions/657b1d3e-ea98-43ee-97c9-95a59f6fcede +/opt/service_finder/pgadmin_data/sessions/08e3757b-1702-430a-a743-73e62681e5a6 +/opt/service_finder/pgadmin_data/sessions/3adcd4e2-8cd6-43bf-b13e-461a74c63f9b +/opt/service_finder/pgadmin_data/sessions/4256aa82-0066-4a50-a4d9-2a0673705554 +/opt/service_finder/pgadmin_data/sessions/fff01071-7b0a-4d39-8b4a-a07e638a7a35 +/opt/service_finder/pgadmin_data/sessions/aa992ddf-44b9-4913-8315-e963dcc85ad1 +/opt/service_finder/pgadmin_data/sessions/3f878305-6df6-4299-a17a-8814b63c3cbd +/opt/service_finder/pgadmin_data/sessions/964369ac-fdc1-41cd-aaa2-8686f28a5743 +/opt/service_finder/pgadmin_data/sessions/0a98104e-e156-4ade-98b7-88ba8e7d9653 +/opt/service_finder/pgadmin_data/sessions/40aa8300-a95b-4857-bf08-f6d20b31bd72 +/opt/service_finder/pgadmin_data/sessions/c139cbfb-8a57-4f4b-9c65-71410cd120bf +/opt/service_finder/pgadmin_data/sessions/3a944235-7404-4d88-aab3-d8ffb962f07f +/opt/service_finder/pgadmin_data/sessions/56f4bb92-cb2e-4073-843e-ce2b58326a2d +/opt/service_finder/pgadmin_data/sessions/57619559-c542-48ef-a13b-924832a57338 +/opt/service_finder/pgadmin_data/sessions/95ba5160-50f6-4f08-b36e-97e4a022c0f3 +/opt/service_finder/pgadmin_data/sessions/0f2b4bad-71c8-4b39-9ed0-859cf07368fc +/opt/service_finder/pgadmin_data/sessions/37d5482c-c73f-4225-a91a-0331b7da9c32 +/opt/service_finder/pgadmin_data/sessions/856aab44-5d4e-4e17-8965-8161f8c353a3 +/opt/service_finder/pgadmin_data/sessions/65052a02-9f31-4dd2-add0-d902d4d77986 +/opt/service_finder/pgadmin_data/sessions/91799e7f-50d1-49c1-a7af-f90e22cd58df +/opt/service_finder/pgadmin_data/sessions/181f6910-8a76-479a-a576-623409b5726e +/opt/service_finder/pgadmin_data/storage +/opt/service_finder/pgadmin_data/storage/kincses_gmail.com +/opt/service_finder/pgadmin_data/pgadmin4.db +/opt/service_finder/pgadmin_data/azurecredentialcache +/opt/service_finder/backend +/opt/service_finder/backend/migrations +/opt/service_finder/backend/migrations/script.py.mako +/opt/service_finder/backend/migrations/env.py +/opt/service_finder/backend/migrations/README +/opt/service_finder/backend/migrations/versions +/opt/service_finder/backend/migrations/versions/c21c2c7e70d4_clean_gamification_setup.py +/opt/service_finder/backend/app +/opt/service_finder/backend/app/init_db_direct.py +/opt/service_finder/backend/app/models +/opt/service_finder/backend/app/models/user.py +/opt/service_finder/backend/app/models/email_system.py +/opt/service_finder/backend/app/models/email_provider.py +/opt/service_finder/backend/app/models/legal.py +/opt/service_finder/backend/app/models/email_template.py +/opt/service_finder/backend/app/models/verification_token.py +/opt/service_finder/backend/app/models/organization.py +/opt/service_finder/backend/app/models/translation.py +/opt/service_finder/backend/app/models/vehicle.py +/opt/service_finder/backend/app/models/vehicle_catalog.py +/opt/service_finder/backend/app/models/__pycache__ +/opt/service_finder/backend/app/models/__pycache__/email_provider.cpython-312.pyc +/opt/service_finder/backend/app/models/__pycache__/company.cpython-312.pyc +/opt/service_finder/backend/app/models/__pycache__/__init__.cpython-312.pyc +/opt/service_finder/backend/app/models/__pycache__/vehicle.cpython-312.pyc +/opt/service_finder/backend/app/models/__pycache__/verification_token.cpython-312.pyc +/opt/service_finder/backend/app/models/__pycache__/social.cpython-312.pyc +/opt/service_finder/backend/app/models/__pycache__/gamification.cpython-312.pyc +/opt/service_finder/backend/app/models/__pycache__/organization_member.cpython-312.pyc +/opt/service_finder/backend/app/models/__pycache__/legal.cpython-312.pyc +/opt/service_finder/backend/app/models/__pycache__/organization.cpython-312.pyc +/opt/service_finder/backend/app/models/__pycache__/translation.cpython-312.pyc +/opt/service_finder/backend/app/models/__pycache__/system_settings.cpython-312.pyc +/opt/service_finder/backend/app/models/__pycache__/email_log.cpython-312.pyc +/opt/service_finder/backend/app/models/__pycache__/expense.cpython-312.pyc +/opt/service_finder/backend/app/models/__pycache__/user.cpython-312.pyc +/opt/service_finder/backend/app/models/__pycache__/email_template.cpython-312.pyc +/opt/service_finder/backend/app/models/expense.py +/opt/service_finder/backend/app/models/company.py +/opt/service_finder/backend/app/models/email_log.py +/opt/service_finder/backend/app/models/logistics.py +/opt/service_finder/backend/app/models/system_settings.py +/opt/service_finder/backend/app/models/vehicle_ownership.py +/opt/service_finder/backend/app/models/__init__.py +/opt/service_finder/backend/app/models/staged_data.py +/opt/service_finder/backend/app/models/organization_member.py +/opt/service_finder/backend/app/models/history.py +/opt/service_finder/backend/app/models/social.py +/opt/service_finder/backend/app/models/gamification.py +/opt/service_finder/backend/app/models/core_logic.py +/opt/service_finder/backend/app/core +/opt/service_finder/backend/app/core/config.py +/opt/service_finder/backend/app/core/__pycache__ +/opt/service_finder/backend/app/core/__pycache__/__init__.cpython-312.pyc +/opt/service_finder/backend/app/core/__pycache__/email.cpython-312.pyc +/opt/service_finder/backend/app/core/__pycache__/security.cpython-312.pyc +/opt/service_finder/backend/app/core/__pycache__/config.cpython-312.pyc +/opt/service_finder/backend/app/core/email.py +/opt/service_finder/backend/app/core/email.py.bak +/opt/service_finder/backend/app/core/security.py +/opt/service_finder/backend/app/core/__init__.py +/opt/service_finder/backend/app/final_admin_fix.py +/opt/service_finder/backend/app/seed_catalog.py +/opt/service_finder/backend/app/auth +/opt/service_finder/backend/app/auth/router.py +/opt/service_finder/backend/app/schemas +/opt/service_finder/backend/app/schemas/user.py +/opt/service_finder/backend/app/schemas/vehicle.py +/opt/service_finder/backend/app/schemas/__pycache__ +/opt/service_finder/backend/app/schemas/__pycache__/social.cpython-312.pyc +/opt/service_finder/backend/app/schemas/__pycache__/user.cpython-312.pyc +/opt/service_finder/backend/app/schemas/__pycache__/fleet.cpython-312.pyc +/opt/service_finder/backend/app/schemas/auth.py +/opt/service_finder/backend/app/schemas/token.py +/opt/service_finder/backend/app/schemas/admin.py +/opt/service_finder/backend/app/schemas/fleet.py +/opt/service_finder/backend/app/schemas/social.py +/opt/service_finder/backend/app/templates +/opt/service_finder/backend/app/templates/emails +/opt/service_finder/backend/app/templates/emails/hu +/opt/service_finder/backend/app/templates/emails/hu/password_reset.html +/opt/service_finder/backend/app/templates/emails/hu/notification.html +/opt/service_finder/backend/app/templates/emails/hu/registration.html +/opt/service_finder/backend/app/templates/emails/en +/opt/service_finder/backend/app/templates/emails/en/password_reset.html +/opt/service_finder/backend/app/templates/emails/en/notification.html +/opt/service_finder/backend/app/templates/emails/en/registration.html +/opt/service_finder/backend/app/__pycache__ +/opt/service_finder/backend/app/__pycache__/__init__.cpython-312.pyc +/opt/service_finder/backend/app/__pycache__/main.cpython-312.pyc +/opt/service_finder/backend/app/old_main.py +/opt/service_finder/backend/app/static +/opt/service_finder/backend/app/static/register.html +/opt/service_finder/backend/app/static/dashboard.html +/opt/service_finder/backend/app/static/login.html +/opt/service_finder/backend/app/scripts +/opt/service_finder/backend/app/scripts/discovery_bot.py +/opt/service_finder/backend/app/api +/opt/service_finder/backend/app/api/v2 +/opt/service_finder/backend/app/api/v2/__pycache__ +/opt/service_finder/backend/app/api/v2/__pycache__/auth.cpython-312.pyc +/opt/service_finder/backend/app/api/v2/auth.py +/opt/service_finder/backend/app/api/recommend.py +/opt/service_finder/backend/app/api/__pycache__ +/opt/service_finder/backend/app/api/__pycache__/deps.cpython-312.pyc +/opt/service_finder/backend/app/api/auth.py +/opt/service_finder/backend/app/api/deps.py +/opt/service_finder/backend/app/api/v1 +/opt/service_finder/backend/app/api/v1/router.py +/opt/service_finder/backend/app/api/v1/__pycache__ +/opt/service_finder/backend/app/api/v1/__pycache__/api.cpython-312.pyc +/opt/service_finder/backend/app/api/v1/endpoints +/opt/service_finder/backend/app/api/v1/endpoints/vehicle_search.py +/opt/service_finder/backend/app/api/v1/endpoints/users.py +/opt/service_finder/backend/app/api/v1/endpoints/vehicles.py +/opt/service_finder/backend/app/api/v1/endpoints/__pycache__ +/opt/service_finder/backend/app/api/v1/endpoints/__pycache__/billing.cpython-312.pyc +/opt/service_finder/backend/app/api/v1/endpoints/__pycache__/reports.cpython-312.pyc +/opt/service_finder/backend/app/api/v1/endpoints/__pycache__/admin.cpython-312.pyc +/opt/service_finder/backend/app/api/v1/endpoints/__pycache__/expenses.cpython-312.pyc +/opt/service_finder/backend/app/api/v1/endpoints/__pycache__/users.cpython-312.pyc +/opt/service_finder/backend/app/api/v1/endpoints/__pycache__/social.cpython-312.pyc +/opt/service_finder/backend/app/api/v1/endpoints/__pycache__/gamification.cpython-312.pyc +/opt/service_finder/backend/app/api/v1/endpoints/__pycache__/vehicles.cpython-312.pyc +/opt/service_finder/backend/app/api/v1/endpoints/__pycache__/auth.cpython-312.pyc +/opt/service_finder/backend/app/api/v1/endpoints/__pycache__/fleet.cpython-312.pyc +/opt/service_finder/backend/app/api/v1/endpoints/__pycache__/providers.cpython-312.pyc +/opt/service_finder/backend/app/api/v1/endpoints/auth.py +/opt/service_finder/backend/app/api/v1/endpoints/providers.py +/opt/service_finder/backend/app/api/v1/endpoints/expenses.py +/opt/service_finder/backend/app/api/v1/endpoints/search.py +/opt/service_finder/backend/app/api/v1/endpoints/admin.py +/opt/service_finder/backend/app/api/v1/endpoints/reports.py +/opt/service_finder/backend/app/api/v1/endpoints/fleet.py +/opt/service_finder/backend/app/api/v1/endpoints/billing.py +/opt/service_finder/backend/app/api/v1/endpoints/social.py +/opt/service_finder/backend/app/api/v1/endpoints/gamification.py +/opt/service_finder/backend/app/api/v1/api.py +/opt/service_finder/backend/app/services +/opt/service_finder/backend/app/services/notification_service.py +/opt/service_finder/backend/app/services/fleet_service.py +/opt/service_finder/backend/app/services/maintenance_service.py +/opt/service_finder/backend/app/services/email_manager.py +/opt/service_finder/backend/app/services/social_service.py +/opt/service_finder/backend/app/services/__pycache__ +/opt/service_finder/backend/app/services/__pycache__/config_service.cpython-312.pyc +/opt/service_finder/backend/app/services/__pycache__/social_service.cpython-312.pyc +/opt/service_finder/backend/app/services/__pycache__/translation_service.cpython-312.pyc +/opt/service_finder/backend/app/services/__pycache__/gamification_service.cpython-312.pyc +/opt/service_finder/backend/app/services/__pycache__/email_manager.cpython-312.pyc +/opt/service_finder/backend/app/services/translation_service.py +/opt/service_finder/backend/app/services/config_service.py +/opt/service_finder/backend/app/services/gamification_service.py +/opt/service_finder/backend/app/services/matching_service.py +/opt/service_finder/backend/app/test_gamification_flow.py +/opt/service_finder/backend/app/db +/opt/service_finder/backend/app/db/context.py +/opt/service_finder/backend/app/db/__pycache__ +/opt/service_finder/backend/app/db/__pycache__/__init__.cpython-312.pyc +/opt/service_finder/backend/app/db/__pycache__/session.cpython-312.pyc +/opt/service_finder/backend/app/db/__pycache__/base.cpython-312.pyc +/opt/service_finder/backend/app/db/session.py +/opt/service_finder/backend/app/db/base.py +/opt/service_finder/backend/app/db/middleware.py +/opt/service_finder/backend/app/db/__init__.py +/opt/service_finder/backend/app/main.py +/opt/service_finder/backend/app/__init__.py +/opt/service_finder/backend/app/seed_system.py +/opt/service_finder/backend/app/database.py +/opt/service_finder/backend/app/seed_data.py +/opt/service_finder/backend/app/seed_honda.py +/opt/service_finder/backend/app/crud +/opt/service_finder/backend/app/crud/__pycache__ +/opt/service_finder/backend/app/crud/__pycache__/__init__.cpython-312.pyc +/opt/service_finder/backend/app/crud/__init__.py +/opt/service_finder/backend/seed_vehicles.py +/opt/service_finder/backend/discovery_bot.py +/opt/service_finder/backend/seed_models.py +/opt/service_finder/backend/scrapers +/opt/service_finder/backend/scrapers/vehicle_master_data.py +/opt/service_finder/backend/full_discovery_bot.py +/opt/service_finder/backend/requirements.txt +/opt/service_finder/backend/_legacy_backup +/opt/service_finder/backend/_legacy_backup/migrate_ref_data.py +/opt/service_finder/backend/_legacy_backup/check_garage.py +/opt/service_finder/backend/_legacy_backup/main_final.py +/opt/service_finder/backend/_legacy_backup/teszt.txt +/opt/service_finder/backend/_legacy_backup/docker-compose.backend.yml +/opt/service_finder/backend/_legacy_backup/update_permissions.py +/opt/service_finder/backend/_legacy_backup/update_cost_categories.py +/opt/service_finder/backend/_legacy_backup/inspect_db.py +/opt/service_finder/backend/_legacy_backup/update_invitations.py +/opt/service_finder/backend/_legacy_backup/build_complex_db.py +/opt/service_finder/backend/_legacy_backup/update_db_i18n.py +/opt/service_finder/backend/_legacy_backup/update_audit_system.py +/opt/service_finder/backend/_legacy_backup/create_demo_user.py +/opt/service_finder/backend/_legacy_backup/init_db.py +/opt/service_finder/backend/_legacy_backup/main.py +/opt/service_finder/backend/_legacy_backup/main_fixed.py +/opt/service_finder/backend/_legacy_backup/update_docs.py +/opt/service_finder/backend/_legacy_backup/create_dummy_employee.py +/opt/service_finder/backend/_legacy_backup/inspect_db_full.py +/opt/service_finder/backend/_legacy_backup/main_2.py +/opt/service_finder/backend/Dockerfile +/opt/service_finder/backend/seed_data.py +/opt/service_finder/backend/frontend +/opt/service_finder/backend/alembic.ini +/opt/service_finder/backend/seed_passenger_cars.py +/opt/service_finder/projekt_terkep.txt +/opt/service_finder/backup_to_nas.sh +/opt/service_finder/proxy-manager +/opt/service_finder/proxy-manager/letsencrypt +/opt/service_finder/proxy-manager/letsencrypt/archive +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-13 +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-13/fullchain1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-13/privkey1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-13/chain1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-13/cert1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-16 +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-16/fullchain1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-16/privkey1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-16/chain1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-16/cert1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-5 +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-5/fullchain1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-5/privkey1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-5/chain1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-5/cert1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-15 +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-15/fullchain1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-15/privkey1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-15/chain1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-15/cert1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-11 +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-11/fullchain1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-11/privkey1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-11/chain1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-11/cert1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-14 +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-14/fullchain1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-14/privkey1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-14/chain1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-14/cert1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-4 +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-4/fullchain1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-4/privkey1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-4/chain1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-4/cert1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-18 +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-18/fullchain1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-18/privkey1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-18/chain1.pem +/opt/service_finder/proxy-manager/letsencrypt/archive/npm-18/cert1.pem +/opt/service_finder/proxy-manager/letsencrypt/renewal-hooks +/opt/service_finder/proxy-manager/letsencrypt/renewal-hooks/pre +/opt/service_finder/proxy-manager/letsencrypt/renewal-hooks/deploy +/opt/service_finder/proxy-manager/letsencrypt/renewal-hooks/post +/opt/service_finder/proxy-manager/letsencrypt/renewal +/opt/service_finder/proxy-manager/letsencrypt/renewal/npm-16.conf +/opt/service_finder/proxy-manager/letsencrypt/renewal/npm-5.conf +/opt/service_finder/proxy-manager/letsencrypt/renewal/npm-13.conf +/opt/service_finder/proxy-manager/letsencrypt/renewal/npm-4.conf +/opt/service_finder/proxy-manager/letsencrypt/renewal/npm-18.conf +/opt/service_finder/proxy-manager/letsencrypt/renewal/npm-15.conf +/opt/service_finder/proxy-manager/letsencrypt/renewal/npm-14.conf +/opt/service_finder/proxy-manager/letsencrypt/renewal/npm-11.conf +/opt/service_finder/proxy-manager/letsencrypt/live +/opt/service_finder/proxy-manager/letsencrypt/live/npm-13 +/opt/service_finder/proxy-manager/letsencrypt/live/npm-13/fullchain.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-13/privkey.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-13/chain.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-13/cert.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-13/README +/opt/service_finder/proxy-manager/letsencrypt/live/npm-16 +/opt/service_finder/proxy-manager/letsencrypt/live/npm-16/fullchain.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-16/privkey.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-16/chain.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-16/cert.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-16/README +/opt/service_finder/proxy-manager/letsencrypt/live/npm-5 +/opt/service_finder/proxy-manager/letsencrypt/live/npm-5/fullchain.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-5/privkey.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-5/chain.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-5/cert.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-5/README +/opt/service_finder/proxy-manager/letsencrypt/live/npm-15 +/opt/service_finder/proxy-manager/letsencrypt/live/npm-15/fullchain.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-15/privkey.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-15/chain.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-15/cert.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-15/README +/opt/service_finder/proxy-manager/letsencrypt/live/npm-11 +/opt/service_finder/proxy-manager/letsencrypt/live/npm-11/fullchain.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-11/privkey.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-11/chain.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-11/cert.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-11/README +/opt/service_finder/proxy-manager/letsencrypt/live/npm-14 +/opt/service_finder/proxy-manager/letsencrypt/live/npm-14/fullchain.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-14/privkey.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-14/chain.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-14/cert.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-14/README +/opt/service_finder/proxy-manager/letsencrypt/live/README +/opt/service_finder/proxy-manager/letsencrypt/live/npm-4 +/opt/service_finder/proxy-manager/letsencrypt/live/npm-4/fullchain.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-4/privkey.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-4/chain.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-4/cert.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-4/README +/opt/service_finder/proxy-manager/letsencrypt/live/npm-18 +/opt/service_finder/proxy-manager/letsencrypt/live/npm-18/fullchain.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-18/privkey.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-18/chain.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-18/cert.pem +/opt/service_finder/proxy-manager/letsencrypt/live/npm-18/README +/opt/service_finder/proxy-manager/letsencrypt/accounts +/opt/service_finder/proxy-manager/letsencrypt/accounts/acme-v02.api.letsencrypt.org +/opt/service_finder/proxy-manager/letsencrypt/accounts/acme-v02.api.letsencrypt.org/directory +/opt/service_finder/proxy-manager/letsencrypt/accounts/acme-v02.api.letsencrypt.org/directory/e417a583de478a0cfdeed332c1113068 +/opt/service_finder/proxy-manager/letsencrypt/accounts/acme-v02.api.letsencrypt.org/directory/e417a583de478a0cfdeed332c1113068/private_key.json +/opt/service_finder/proxy-manager/letsencrypt/accounts/acme-v02.api.letsencrypt.org/directory/e417a583de478a0cfdeed332c1113068/meta.json +/opt/service_finder/proxy-manager/letsencrypt/accounts/acme-v02.api.letsencrypt.org/directory/e417a583de478a0cfdeed332c1113068/regr.json +/opt/service_finder/proxy-manager/data +/opt/service_finder/proxy-manager/data/nginx +/opt/service_finder/proxy-manager/data/nginx/dead_host +/opt/service_finder/proxy-manager/data/nginx/proxy_host +/opt/service_finder/proxy-manager/data/nginx/proxy_host/7.conf +/opt/service_finder/proxy-manager/data/nginx/proxy_host/6.conf +/opt/service_finder/proxy-manager/data/nginx/proxy_host/3.conf +/opt/service_finder/proxy-manager/data/nginx/proxy_host/8.conf +/opt/service_finder/proxy-manager/data/nginx/proxy_host/9.conf +/opt/service_finder/proxy-manager/data/nginx/proxy_host/5.conf +/opt/service_finder/proxy-manager/data/nginx/proxy_host/2.conf +/opt/service_finder/proxy-manager/data/nginx/proxy_host/10.conf +/opt/service_finder/proxy-manager/data/nginx/proxy_host/1.conf +/opt/service_finder/proxy-manager/data/nginx/default_www +/opt/service_finder/proxy-manager/data/nginx/default_host +/opt/service_finder/proxy-manager/data/nginx/redirection_host +/opt/service_finder/proxy-manager/data/nginx/stream +/opt/service_finder/proxy-manager/data/nginx/temp +/opt/service_finder/proxy-manager/data/keys.json +/opt/service_finder/proxy-manager/data/letsencrypt-acme-challenge +/opt/service_finder/proxy-manager/data/database.sqlite +/opt/service_finder/proxy-manager/data/access +/opt/service_finder/proxy-manager/data/custom_ssl +/opt/service_finder/proxy-manager/data/logs +/opt/service_finder/proxy-manager/data/logs/fallback_access.log.1.gz +/opt/service_finder/proxy-manager/data/logs/letsencrypt.log.8 +/opt/service_finder/proxy-manager/data/logs/proxy-host-8_access.log +/opt/service_finder/proxy-manager/data/logs/fallback_error.log.2.gz +/opt/service_finder/proxy-manager/data/logs/letsencrypt.log.6 +/opt/service_finder/proxy-manager/data/logs/fallback_access.log.3.gz +/opt/service_finder/proxy-manager/data/logs/proxy-host-3_access.log.3.gz +/opt/service_finder/proxy-manager/data/logs/letsencrypt.log.15 +/opt/service_finder/proxy-manager/data/logs/proxy-host-1_access.log +/opt/service_finder/proxy-manager/data/logs/letsencrypt-requests_access.log.1.gz +/opt/service_finder/proxy-manager/data/logs/proxy-host-2_access.log.1.gz +/opt/service_finder/proxy-manager/data/logs/letsencrypt.log.9 +/opt/service_finder/proxy-manager/data/logs/letsencrypt.log.18 +/opt/service_finder/proxy-manager/data/logs/proxy-host-2_error.log.1.gz +/opt/service_finder/proxy-manager/data/logs/letsencrypt.log.4 +/opt/service_finder/proxy-manager/data/logs/letsencrypt.log.10 +/opt/service_finder/proxy-manager/data/logs/fallback_error.log.1.gz +/opt/service_finder/proxy-manager/data/logs/proxy-host-1_error.log.2.gz +/opt/service_finder/proxy-manager/data/logs/proxy-host-7_access.log +/opt/service_finder/proxy-manager/data/logs/proxy-host-2_error.log.2.gz +/opt/service_finder/proxy-manager/data/logs/letsencrypt-requests_error.log +/opt/service_finder/proxy-manager/data/logs/letsencrypt.log.13 +/opt/service_finder/proxy-manager/data/logs/proxy-host-9_access.log +/opt/service_finder/proxy-manager/data/logs/proxy-host-2_error.log.3.gz +/opt/service_finder/proxy-manager/data/logs/proxy-host-6_access.log +/opt/service_finder/proxy-manager/data/logs/proxy-host-1_access.log.3.gz +/opt/service_finder/proxy-manager/data/logs/proxy-host-6_access.log.1.gz +/opt/service_finder/proxy-manager/data/logs/proxy-host-6_error.log.3.gz +/opt/service_finder/proxy-manager/data/logs/proxy-host-2_access.log.3.gz +/opt/service_finder/proxy-manager/data/logs/proxy-host-8_error.log +/opt/service_finder/proxy-manager/data/logs/proxy-host-6_error.log.1.gz +/opt/service_finder/proxy-manager/data/logs/letsencrypt.log.16 +/opt/service_finder/proxy-manager/data/logs/fallback_access.log.2.gz +/opt/service_finder/proxy-manager/data/logs/proxy-host-6_access.log.3.gz +/opt/service_finder/proxy-manager/data/logs/proxy-host-6_access.log.2.gz +/opt/service_finder/proxy-manager/data/logs/letsencrypt.log.2 +/opt/service_finder/proxy-manager/data/logs/letsencrypt-requests_access.log +/opt/service_finder/proxy-manager/data/logs/proxy-host-4_access.log +/opt/service_finder/proxy-manager/data/logs/letsencrypt.log.12 +/opt/service_finder/proxy-manager/data/logs/proxy-host-5_access.log.1.gz +/opt/service_finder/proxy-manager/data/logs/letsencrypt.log.7 +/opt/service_finder/proxy-manager/data/logs/fallback_error.log +/opt/service_finder/proxy-manager/data/logs/proxy-host-6_error.log.2.gz +/opt/service_finder/proxy-manager/data/logs/proxy-host-5_access.log.3.gz +/opt/service_finder/proxy-manager/data/logs/proxy-host-10_error.log +/opt/service_finder/proxy-manager/data/logs/proxy-host-5_error.log.3.gz +/opt/service_finder/proxy-manager/data/logs/proxy-host-1_error.log.3.gz +/opt/service_finder/proxy-manager/data/logs/proxy-host-2_access.log.2.gz +/opt/service_finder/proxy-manager/data/logs/proxy-host-3_access.log.2.gz +/opt/service_finder/proxy-manager/data/logs/proxy-host-10_access.log +/opt/service_finder/proxy-manager/data/logs/proxy-host-5_error.log.2.gz +/opt/service_finder/proxy-manager/data/logs/letsencrypt.log.1 +/opt/service_finder/proxy-manager/data/logs/proxy-host-3_access.log +/opt/service_finder/proxy-manager/data/logs/letsencrypt.log.3 +/opt/service_finder/proxy-manager/data/logs/proxy-host-5_access.log.2.gz +/opt/service_finder/proxy-manager/data/logs/letsencrypt.log.17 +/opt/service_finder/proxy-manager/data/logs/proxy-host-1_error.log +/opt/service_finder/proxy-manager/data/logs/proxy-host-2_access.log +/opt/service_finder/proxy-manager/data/logs/fallback_error.log.3.gz +/opt/service_finder/proxy-manager/data/logs/proxy-host-5_error.log.1.gz +/opt/service_finder/proxy-manager/data/logs/letsencrypt.log +/opt/service_finder/proxy-manager/data/logs/letsencrypt.log.14 +/opt/service_finder/proxy-manager/data/logs/proxy-host-5_access.log +/opt/service_finder/proxy-manager/data/logs/proxy-host-1_access.log.1.gz +/opt/service_finder/proxy-manager/data/logs/proxy-host-5_error.log +/opt/service_finder/proxy-manager/data/logs/proxy-host-9_error.log +/opt/service_finder/proxy-manager/data/logs/proxy-host-3_error.log.2.gz +/opt/service_finder/proxy-manager/data/logs/proxy-host-1_error.log.1.gz +/opt/service_finder/proxy-manager/data/logs/proxy-host-3_error.log.3.gz +/opt/service_finder/proxy-manager/data/logs/proxy-host-3_error.log.1.gz +/opt/service_finder/proxy-manager/data/logs/proxy-host-1_access.log.2.gz +/opt/service_finder/proxy-manager/data/logs/proxy-host-3_access.log.1.gz +/opt/service_finder/proxy-manager/data/logs/letsencrypt.log.5 +/opt/service_finder/proxy-manager/data/logs/fallback_access.log +/opt/service_finder/proxy-manager/data/logs/proxy-host-7_error.log +/opt/service_finder/proxy-manager/data/logs/proxy-host-4_error.log +/opt/service_finder/proxy-manager/data/logs/letsencrypt.log.11 +/opt/service_finder/proxy-manager/data/logs/proxy-host-3_error.log +/opt/service_finder/proxy-manager/data/logs/proxy-host-2_error.log +/opt/service_finder/proxy-manager/data/logs/proxy-host-6_error.log +/opt/service_finder/pgadmin +/opt/service_finder/pgadmin/data +/opt/service_finder/pgadmin/data/sessions +/opt/service_finder/pgadmin/data/sessions/c191ec66-78a1-4afd-955f-e50e8dbbc552 +/opt/service_finder/pgadmin/data/sessions/f7056bf2-b80f-4239-8c16-3531f8b88782 +/opt/service_finder/pgadmin/data/sessions/f566ecc0-32dd-45c7-869e-cfb900fd9aa7 +/opt/service_finder/pgadmin/data/sessions/61fa598a-479d-47dc-aee2-846812e6b40b +/opt/service_finder/pgadmin/data/sessions/36fa57da-8c82-47e8-8dd0-03c677ff8f6d +/opt/service_finder/pgadmin/data/sessions/42240d96-abd2-43ed-9e07-7ad0acd4dceb +/opt/service_finder/pgadmin/data/sessions/cc89aa8b-5867-4b73-90c0-0b15d117cb9f +/opt/service_finder/pgadmin/data/sessions/4717cbe5-3d95-425b-a873-df76df7af990 +/opt/service_finder/pgadmin/data/sessions/fc40d886-9fb0-48b2-810e-c77b9afcb6a2 +/opt/service_finder/pgadmin/data/sessions/190c2cfe-7b96-47e7-a7c7-78740413ec86 +/opt/service_finder/pgadmin/data/sessions/d1fd1e26-160e-4450-b2b6-dc28ad4273f1 +/opt/service_finder/pgadmin/data/sessions/a48ac178-5482-4835-87cc-fe0ed838bacf +/opt/service_finder/pgadmin/data/sessions/64c44127-f39a-4234-8785-9b515b32686f +/opt/service_finder/pgadmin/data/sessions/82e002e9-c7ef-4eb4-8fad-759b9d5577ca +/opt/service_finder/pgadmin/data/sessions/ef7f0484-f09d-44c1-b0b7-e56888795442 +/opt/service_finder/pgadmin/data/sessions/8821dc09-caca-4649-9f18-bc57cf371a06 +/opt/service_finder/pgadmin/data/sessions/3f887077-3a26-455d-b2ce-6be68ddc71e8 +/opt/service_finder/pgadmin/data/sessions/6404475f-50aa-42e0-9d35-b0a8f6e8a213 +/opt/service_finder/pgadmin/data/sessions/5c1020ff-954c-4132-902a-11a3750de23a +/opt/service_finder/pgadmin/data/sessions/7aa1e6c8-5c23-45ec-8156-972939ae60cf +/opt/service_finder/pgadmin/data/sessions/2561af04-52e0-422c-9f01-889aa086be13 +/opt/service_finder/pgadmin/data/sessions/f01d1cd0-5b3c-406d-8b54-f07f9436949e +/opt/service_finder/pgadmin/data/sessions/c8a2ea39-d07d-4c98-8be2-e3ddee9c5c99 +/opt/service_finder/pgadmin/data/sessions/ec936261-9676-4ff7-abc9-6af7557b45e5 +/opt/service_finder/pgadmin/data/sessions/d4434ef9-4105-403c-9245-25ddf5dfb391 +/opt/service_finder/pgadmin/data/sessions/3d3283e8-fbe4-487e-bc49-458ee1782020 +/opt/service_finder/pgadmin/data/sessions/fad7550e-eef9-4a4e-9f8b-8d771c7767a4 +/opt/service_finder/pgadmin/data/sessions/e2eab0f0-867e-4797-9619-7fb4f790b89f +/opt/service_finder/pgadmin/data/sessions/0f41e22e-b4b4-4776-9895-9fc12054ed71 +/opt/service_finder/pgadmin/data/sessions/c22428fe-dfc0-4a28-a32f-1f8965430004 +/opt/service_finder/pgadmin/data/sessions/c8857f63-f821-49b4-bf41-48727c00febd +/opt/service_finder/pgadmin/data/sessions/6c443079-e5e9-44c3-aa39-9be235ad4865 +/opt/service_finder/pgadmin/data/sessions/82e99852-9da3-45a8-8491-0c69e66d5be4 +/opt/service_finder/pgadmin/data/sessions/bf27abfe-c382-4e9d-8acf-9508133c4b15 +/opt/service_finder/pgadmin/data/sessions/2739c198-da4a-498e-aaaa-9c9ca291bbf1 +/opt/service_finder/pgadmin/data/sessions/98fdb91c-44cf-4379-a738-6b045733dee0 +/opt/service_finder/pgadmin/data/sessions/03c1a752-4ec5-430c-a965-aa355531bb1f +/opt/service_finder/pgadmin/data/sessions/8167652a-79dc-46b9-a3e7-203ac1840f84 +/opt/service_finder/pgadmin/data/sessions/c6f96af8-86b3-4bd2-9c65-c6b80ee60512 +/opt/service_finder/pgadmin/data/sessions/f27f3773-bd41-4870-adbc-298c08de6834 +/opt/service_finder/pgadmin/data/sessions/1960ac31-8625-48ba-aef3-f824a0739b59 +/opt/service_finder/pgadmin/data/sessions/4cf9b0b1-f129-43e0-82f0-9da65c5d5d00 +/opt/service_finder/pgadmin/data/sessions/df1c9e4b-c688-43af-8707-a967f124e2be +/opt/service_finder/pgadmin/data/sessions/a07c1cce-1999-49c3-b1e1-a59436e38522 +/opt/service_finder/pgadmin/data/sessions/e5b3bdd5-4aef-4366-bd21-9acd13188b78 +/opt/service_finder/pgadmin/data/sessions/4673f7fb-cab6-4347-8c0e-7a00937c3f16 +/opt/service_finder/pgadmin/data/sessions/4382c834-4294-45eb-a671-8ab12033f6b7 +/opt/service_finder/pgadmin/data/sessions/f2ca300d-051d-42b5-b5f9-be649054d293 +/opt/service_finder/pgadmin/data/sessions/eb5480bb-8183-4aed-8c44-5dba8a9de577 +/opt/service_finder/pgadmin/data/sessions/a508f434-c945-4db0-8927-e16f0e75813f +/opt/service_finder/pgadmin/data/sessions/68043fbf-2cff-4131-9807-562123306e7c +/opt/service_finder/pgadmin/data/sessions/081da418-bd99-4b43-aa84-f6e13a87f057 +/opt/service_finder/pgadmin/data/sessions/d985efdf-2cda-4d6e-a850-baf41946bdbf +/opt/service_finder/pgadmin/data/sessions/54349914-b165-48f3-bea8-ab8d224edd39 +/opt/service_finder/pgadmin/data/sessions/ea4d33f7-a8dd-4288-b9ef-2d1511286491 +/opt/service_finder/pgadmin/data/sessions/26f505ea-a69a-4e4d-8704-01e379913d52 +/opt/service_finder/pgadmin/data/sessions/7130585c-6a44-41f4-80fd-6f2c7c702eac +/opt/service_finder/pgadmin/data/sessions/8d434565-8c8d-4058-94d6-df582902ff67 +/opt/service_finder/pgadmin/data/sessions/4ed73362-1f27-4e50-a632-c3b6213f627e +/opt/service_finder/pgadmin/data/sessions/4c3ac76d-b38d-4e89-871e-7446ad86ce3a +/opt/service_finder/pgadmin/data/sessions/cbee53e3-2930-45b4-ac80-cec62d11365b +/opt/service_finder/pgadmin/data/sessions/2706ea12-544c-439c-bbfe-2881135fc5c2 +/opt/service_finder/pgadmin/data/sessions/19bc1463-7c1e-40a9-bd09-7d282590b903 +/opt/service_finder/pgadmin/data/sessions/4584d603-10f5-4767-920e-59c463d5f00b +/opt/service_finder/pgadmin/data/sessions/bc386c8c-87ae-4e20-8844-fee3703a0595 +/opt/service_finder/pgadmin/data/sessions/3e232ae5-0fb7-4107-8fe6-e64af4d0527b +/opt/service_finder/pgadmin/data/sessions/0ced9fd6-67f5-4e15-892d-f16f29bf2d53 +/opt/service_finder/pgadmin/data/sessions/45e62654-215d-433f-92ed-21bb664b0a5d +/opt/service_finder/pgadmin/data/sessions/f8f4cdc0-a960-4971-b380-3a3df159a3f7 +/opt/service_finder/pgadmin/data/sessions/5da591bf-697b-40b8-b850-5248b3f9948e +/opt/service_finder/pgadmin/data/sessions/62c7cafb-f9c3-4a0e-b88b-69015f4cdd8a +/opt/service_finder/pgadmin/data/sessions/76de99ed-2aa0-4a08-b488-08f30f00b115 +/opt/service_finder/pgadmin/data/sessions/6d5cdc12-98ae-4226-8c56-01a66ace1eb6 +/opt/service_finder/pgadmin/data/sessions/4fbb5992-1fbe-4451-b3b7-29b0318db683 +/opt/service_finder/pgadmin/data/sessions/aee5ec2f-8e5c-4a46-98f2-09842c70b28e +/opt/service_finder/pgadmin/data/sessions/0ab80fb4-e8e7-406d-b344-f49eba9ff931 +/opt/service_finder/pgadmin/data/sessions/dde5b219-4951-4165-8fd4-78c960f48b9e +/opt/service_finder/pgadmin/data/sessions/351775b2-78e4-499e-868d-4d29b5c6dc44 +/opt/service_finder/pgadmin/data/sessions/70be35ce-dedc-49e1-baa1-fc144a68e2dd +/opt/service_finder/pgadmin/data/sessions/1e5e0265-eae2-4b5b-a55b-cd60ebf3329d +/opt/service_finder/pgadmin/data/sessions/bb0e21bd-b9d5-4a23-b434-1065bbaa95de +/opt/service_finder/pgadmin/data/sessions/03321bce-cf49-427a-a351-c698a1e8b6c5 +/opt/service_finder/pgadmin/data/sessions/c9725e93-8daa-4593-adb6-cae2c08f9ff2 +/opt/service_finder/pgadmin/data/sessions/b96079ba-7bb1-4f2e-9a3c-e909f62b4482 +/opt/service_finder/pgadmin/data/sessions/dbe3af6d-f17b-40b9-89e2-f39320543100 +/opt/service_finder/pgadmin/data/sessions/638b9be8-028f-44cb-8989-36ea93b74eea +/opt/service_finder/pgadmin/data/sessions/2ed28be0-af44-427d-aebc-548f31f468e0 +/opt/service_finder/pgadmin/data/sessions/a3dc2446-3c67-4238-a8b2-c9fa71fbad7a +/opt/service_finder/pgadmin/data/sessions/46a19aed-8c32-4649-9190-e449bc59bc7b +/opt/service_finder/pgadmin/data/sessions/7c130b35-7cb9-488d-8576-ea9013268f03 +/opt/service_finder/pgadmin/data/sessions/b756eef0-4625-465d-bc5b-a84d0cb54bc1 +/opt/service_finder/pgadmin/data/sessions/60f20466-0f3c-459c-aef7-4fc0c091fe44 +/opt/service_finder/pgadmin/data/sessions/4c0d3bc1-5568-4b05-a134-0dfabe300266 +/opt/service_finder/pgadmin/data/sessions/24b3c1f7-7db5-46a1-8f9d-2bebf1f0fdce +/opt/service_finder/pgadmin/data/sessions/e4d91f15-4c9f-407e-9bed-4b54a9710348 +/opt/service_finder/pgadmin/data/sessions/e1dbb2c7-f692-49bf-9952-906e45cc061c +/opt/service_finder/pgadmin/data/sessions/2179bbb8-68eb-4d23-ab40-abd267a737ca +/opt/service_finder/pgadmin/data/sessions/451e0858-8495-4b2b-80e6-a806b23ebf20 +/opt/service_finder/pgadmin/data/sessions/11cb2bcb-cdd1-47cd-8bd7-2311df2c5fe9 +/opt/service_finder/pgadmin/data/sessions/4cd4231d-4650-478a-836d-587dd5fadf2d +/opt/service_finder/pgadmin/data/sessions/4dddbbca-9f36-4afe-91c5-dda07af51509 +/opt/service_finder/pgadmin/data/sessions/722e0de3-d430-4128-a2dc-0c2b98696529 +/opt/service_finder/pgadmin/data/sessions/ab34bced-831e-487d-9825-84f608ea3902 +/opt/service_finder/pgadmin/data/sessions/93c836f5-d79d-425b-bf03-dcabb528c14a +/opt/service_finder/pgadmin/data/sessions/418dd495-ee05-4922-a4b5-20d73b9e4546 +/opt/service_finder/pgadmin/data/sessions/0074a83f-e030-42ae-8c17-45565cbecfc9 +/opt/service_finder/pgadmin/data/sessions/ed9ea264-f245-424a-a083-d41f3e3677f2 +/opt/service_finder/pgadmin/data/sessions/987661e3-7d05-4a95-8b77-baa1d589e950 +/opt/service_finder/pgadmin/data/sessions/fe97b137-a0ea-4a78-97e1-3380e694b0fd +/opt/service_finder/pgadmin/data/sessions/f7a50bb2-86b0-4300-8230-1419184b77df +/opt/service_finder/pgadmin/data/sessions/3a0faa33-930b-4f10-b332-a7e980746c78 +/opt/service_finder/pgadmin/data/sessions/2d628d69-f6f7-486a-9262-bc18afb453af +/opt/service_finder/pgadmin/data/sessions/13426e7d-ab6c-4495-8e7d-86a537b15eee +/opt/service_finder/pgadmin/data/sessions/9b298e50-1684-493a-aa4c-013aa0dfa34d +/opt/service_finder/pgadmin/data/sessions/f03484f7-2430-4a0a-97ec-9da8e1f5ea8e +/opt/service_finder/pgadmin/data/sessions/83b8ec9d-cce8-40dd-92d2-b408fb9740b4 +/opt/service_finder/pgadmin/data/sessions/55b681bd-873c-4d01-b4be-3989d832a238 +/opt/service_finder/pgadmin/data/sessions/d4e8dbd2-54cf-46e1-b517-fc1e75d249e1 +/opt/service_finder/pgadmin/data/sessions/8d702279-6b43-4233-a353-8154dd414dd9 +/opt/service_finder/pgadmin/data/sessions/e2712981-434d-4e36-95f1-1a8bfdd104aa +/opt/service_finder/pgadmin/data/sessions/7e7fdf5e-cddd-47d9-9904-c2e3f0bb6584 +/opt/service_finder/pgadmin/data/sessions/47fe0485-1471-42bc-95cd-706a64f48628 +/opt/service_finder/pgadmin/data/sessions/d09cb1df-1944-4853-8a28-2b96d6e48172 +/opt/service_finder/pgadmin/data/sessions/cabc5443-1f25-4baa-935f-677ad0168302 +/opt/service_finder/pgadmin/data/sessions/e6c8fdcc-0d49-4d7b-b1c1-9e369dc4b462 +/opt/service_finder/pgadmin/data/sessions/e14cf22a-1d02-4b56-8e72-dc06b7680c58 +/opt/service_finder/pgadmin/data/sessions/afb4a566-5bbd-44ca-95a7-07f73b35a4b5 +/opt/service_finder/pgadmin/data/sessions/b5d9d584-a368-445a-a1a3-832c81ceecb8 +/opt/service_finder/pgadmin/data/sessions/dccb1427-3039-4d5b-99a3-aa1e0047c1d5 +/opt/service_finder/pgadmin/data/sessions/05d366d7-6fc8-4b0a-8f15-34e993390037 +/opt/service_finder/pgadmin/data/sessions/3ee96a8c-f9ab-4446-a2a5-f507c43c81ca +/opt/service_finder/pgadmin/data/sessions/aed3b509-f282-4a70-aefd-8187a7eec5a1 +/opt/service_finder/pgadmin/data/sessions/ce5f6384-c313-4ded-886b-b07ececd76cd +/opt/service_finder/pgadmin/data/sessions/1f914044-e28a-4209-adbe-3ef26a350f8f +/opt/service_finder/pgadmin/data/sessions/af349006-dc3d-4311-813f-b7b9a020bf80 +/opt/service_finder/pgadmin/data/sessions/2f9a5acd-4f90-41e6-b3ce-6c96fd759269 +/opt/service_finder/pgadmin/data/sessions/239da6ac-8ad1-4a6b-b744-1f0c277297f2 +/opt/service_finder/pgadmin/data/sessions/fafc224c-d56c-46f8-8e61-99acda95eea3 +/opt/service_finder/pgadmin/data/sessions/4702c0ea-8e09-45cf-b789-30e27eb5e3b9 +/opt/service_finder/pgadmin/data/sessions/ba1fe36d-33f0-406d-ac2d-b36f1a116e1a +/opt/service_finder/pgadmin/data/sessions/f2d9792d-a8f1-428b-8337-8e9d6f3443f7 +/opt/service_finder/pgadmin/data/sessions/3988bd08-5155-401d-99d6-02f2fb632f55 +/opt/service_finder/pgadmin/data/sessions/eda16ade-9d9f-414a-8568-f7cbdd846df5 +/opt/service_finder/pgadmin/data/sessions/dc94f41e-fce7-4511-8568-85f697d9c3ac +/opt/service_finder/pgadmin/data/sessions/f1d83a36-0b04-4f6d-b5e6-a5ceb6913d46 +/opt/service_finder/pgadmin/data/sessions/9ca18ada-194c-411c-aca2-dd39c9309f06 +/opt/service_finder/pgadmin/data/sessions/e894978f-3619-4507-8a8d-06ebd9d3b34b +/opt/service_finder/pgadmin/data/sessions/3a94a473-9331-4677-a456-c2f159644646 +/opt/service_finder/pgadmin/data/sessions/f9d18c1d-5bf5-415a-b1b2-f626cbff20a5 +/opt/service_finder/pgadmin/data/sessions/6ed6727c-6f53-4985-b61d-54ec2c5e21aa +/opt/service_finder/pgadmin/data/sessions/bcbba302-039d-4255-b59b-4f5c0ba4261e +/opt/service_finder/pgadmin/data/sessions/bc5dcd93-6f31-4c85-a71e-a5e2c3909ee4 +/opt/service_finder/pgadmin/data/sessions/81fa4503-512f-4ffc-b80c-a2cbe5ac6c6d +/opt/service_finder/pgadmin/data/sessions/8b244e1a-3450-46ae-bf7d-1c62cbf27efd +/opt/service_finder/pgadmin/data/sessions/57e8dde3-3c42-4ea9-b51b-61e0c7464689 +/opt/service_finder/pgadmin/data/sessions/7b270987-51d5-49ec-a211-efe040a3aad6 +/opt/service_finder/pgadmin/data/sessions/ac22993e-9fa9-4648-b831-00d09d4c1847 +/opt/service_finder/pgadmin/data/sessions/28cae61e-11d9-496f-a02a-61c9e6f7de81 +/opt/service_finder/pgadmin/data/sessions/4a10d8d1-c231-4e4a-b2da-11c41f1fb17b +/opt/service_finder/pgadmin/data/sessions/d85fb50c-159c-4126-a962-26b7d6069e7b +/opt/service_finder/pgadmin/data/sessions/ff45df81-4c63-4c3c-a8dd-049c6d620cd2 +/opt/service_finder/pgadmin/data/sessions/71210c05-6890-4a50-b357-ab9aa326676e +/opt/service_finder/pgadmin/data/sessions/cb104af0-04e6-4f15-a368-f77982452a6c +/opt/service_finder/pgadmin/data/sessions/ac393412-dcf8-4c91-bc17-7d1b5801acad +/opt/service_finder/pgadmin/data/sessions/48251b44-eba5-4052-a76e-86a6875136b9 +/opt/service_finder/pgadmin/data/sessions/1d6f0a85-d435-4576-a0fa-08a06278a27e +/opt/service_finder/pgadmin/data/sessions/3c8bf289-9347-409a-9f10-47d159e01372 +/opt/service_finder/pgadmin/data/sessions/cfa4a83e-c216-4605-b47c-a22793eba833 +/opt/service_finder/pgadmin/data/sessions/bf90f4cb-b073-4c6e-879a-254f1b482663 +/opt/service_finder/pgadmin/data/sessions/66915c98-f44d-46e5-b6b1-6b7f93a75ec8 +/opt/service_finder/pgadmin/data/sessions/49511e92-d0d3-4269-800b-ece9393f44da +/opt/service_finder/pgadmin/data/sessions/cda3d93a-d66a-40d6-b639-5889a54f18ae +/opt/service_finder/pgadmin/data/sessions/5e4fd04c-14ea-444b-8146-b16def80df51 +/opt/service_finder/pgadmin/data/sessions/eefdb208-868b-4f2f-b994-10e3fb60a027 +/opt/service_finder/pgadmin/data/sessions/049be04b-7f37-4e21-bc39-0c2a8b220599 +/opt/service_finder/pgadmin/data/sessions/c4ede5bb-f6d0-414b-ae56-7b02f6d70e5e +/opt/service_finder/pgadmin/data/sessions/6291cc65-910e-421f-88f8-52052e770880 +/opt/service_finder/pgadmin/data/sessions/0e57c4bc-ece3-4cee-8593-d29a4ac3eb32 +/opt/service_finder/pgadmin/data/sessions/d2a3c6f4-9445-4cce-a5e8-dc1086c17aa5 +/opt/service_finder/pgadmin/data/sessions/41dba666-775e-4db7-bab2-e9e8d24d6f69 +/opt/service_finder/pgadmin/data/sessions/be43131f-9131-4361-9a78-11fe22bc07fe +/opt/service_finder/pgadmin/data/sessions/4832b048-abfe-407a-abbc-5ab7349646dc +/opt/service_finder/pgadmin/data/sessions/9d89be8f-abc8-4e30-b87a-187d22ba3bb7 +/opt/service_finder/pgadmin/data/sessions/97c0ed8d-c8bb-4867-afdb-ed963a871162 +/opt/service_finder/pgadmin/data/sessions/786acf57-7b55-49a3-bbf4-d2ea7ac3af88 +/opt/service_finder/pgadmin/data/sessions/5f44b9f8-20b6-4f0f-8b35-fcbafb900d7d +/opt/service_finder/pgadmin/data/sessions/02a93934-cb4f-4990-9f17-3c9b0c0d41d8 +/opt/service_finder/pgadmin/data/sessions/be8c9ae6-3d6a-4c56-b296-7a316062e49e +/opt/service_finder/pgadmin/data/storage +/opt/service_finder/pgadmin/data/storage/kincses_gmail.com +/opt/service_finder/pgadmin/data/pgadmin4.db +/opt/service_finder/pgadmin/data/azurecredentialcache +/opt/service_finder/backup_manager.sh +/opt/service_finder/.vscode_config +/opt/service_finder/.vscode_config/.local +/opt/service_finder/.vscode_config/.local/share +/opt/service_finder/.vscode_config/.local/share/nano +/opt/service_finder/.vscode_config/.local/share/code-server +/opt/service_finder/.vscode_config/.local/share/code-server/coder-logs +/opt/service_finder/.vscode_config/.local/share/code-server/coder-logs/code-server-stdout.log +/opt/service_finder/.vscode_config/.local/share/code-server/coder-logs/code-server-stderr.log +/opt/service_finder/.vscode_config/.local/share/code-server/code-server-ipc.sock +/opt/service_finder/.vscode_config/.local/share/code-server/Machine +/opt/service_finder/.vscode_config/.local/share/code-server/User +/opt/service_finder/.vscode_config/.local/share/code-server/User/customBuiltinExtensionsCache.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/60db4d37 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/60db4d37/7iEU.vue +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/60db4d37/DzjG.vue +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/60db4d37/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-b73a03a +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-b73a03a/gkcs.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-b73a03a/u3rB.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-b73a03a/x5bi.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-b73a03a/QzjS.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-b73a03a/FH89.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-b73a03a/DbLk.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-b73a03a/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-36c7e04c +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-36c7e04c/eEmc.html +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-36c7e04c/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/366f1f9f +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/366f1f9f/XJze.sh +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/366f1f9f/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/544ad050 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/544ad050/oR5J.vue +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/544ad050/150T.vue +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/544ad050/5OxY.vue +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/544ad050/Flur.vue +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/544ad050/ey3B.vue +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/544ad050/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-65d51e9b +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-65d51e9b/ikgv.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-65d51e9b/tEc4.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-65d51e9b/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-65d51e9b/ruZ7.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/29f7094b +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/29f7094b/rwbg.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/29f7094b/6VUQ.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/29f7094b/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b582be +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b582be/XBr8.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b582be/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b582be/Outk.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2735c434 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2735c434/D45H.sh +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2735c434/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/62928eff +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/62928eff/oFQ8.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/62928eff/mM3j.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/62928eff/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/62928eff/KZOg.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/62928eff/0zFq.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/6fad377d +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/6fad377d/IDg2.vue +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/6fad377d/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-74c5e47c +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-74c5e47c/1mN6.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-74c5e47c/D5hd.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-74c5e47c/tS7y.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-74c5e47c/2hgE.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-74c5e47c/xMvR.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-74c5e47c/ZP17.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-74c5e47c/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/Ewr5.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/9w0C.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/HlgJ.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/XsS3.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/SmAL.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/MRab.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/952G.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/6htV.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/rbSE.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/DwmM.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/kjXj.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/Hq7h.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/ukz0.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/6FBr.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/JWsh.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/XVz5.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/mzAO.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/OHRw.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/6Z1s.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/UAbq.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/48CH.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/oy9S.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/Micm.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/UAZ8.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/y9Hd.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/7mg1.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/44e986fa/mGP3.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-77683dc0 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-77683dc0/r5fM.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-77683dc0/ShNg.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-77683dc0/mz4K.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-77683dc0/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4212b206 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4212b206/Ttop.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4212b206/rzgZ.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4212b206/s9Er.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4212b206/sQe0.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4212b206/0Kqk.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4212b206/YaR9.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4212b206/FZJR.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4212b206/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/14398474 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/14398474/RBHV.html +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/14398474/7yJr.html +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/14398474/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-3dfff897 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-3dfff897/g0Oc.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-3dfff897/8yiJ.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-3dfff897/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/560c3702 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/560c3702/SbRy.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/560c3702/mXRQ.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/560c3702/qAKQ.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/560c3702/8hFo.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/560c3702/yJW1.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/560c3702/g7Pn.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/560c3702/4l6o.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/560c3702/obKE.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/560c3702/JdxH.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/560c3702/KJmN.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/560c3702/tc77.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/560c3702/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1307b4ae +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1307b4ae/wDto.css +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1307b4ae/xH3Z.css +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1307b4ae/taNH.css +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1307b4ae/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/59b29e48 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/59b29e48/tKBn.js +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/59b29e48/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/7a84dc56 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/7a84dc56/3ex8.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/7a84dc56/Z49V.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/7a84dc56/1koY.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/7a84dc56/2BSr.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/7a84dc56/ZgBi.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/7a84dc56/zeH5.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/7a84dc56/jrvy.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/7a84dc56/vZ3n.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/7a84dc56/YctT.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/7a84dc56/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-334bfc56 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-334bfc56/8Hkt.js +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-334bfc56/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-28c6d5a +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-28c6d5a/MWBz.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-28c6d5a/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-57c048d3 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-57c048d3/UoKg.vue +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-57c048d3/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-22a85881 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-22a85881/QkuR.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-22a85881/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/366631f3 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/366631f3/O8Qa.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/366631f3/R8e7.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/366631f3/sYFb.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/366631f3/fmy7.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/366631f3/jsMF.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/366631f3/3tPW.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/366631f3/9VLp.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/366631f3/yCxy.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/366631f3/Y5KO.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/366631f3/dZF4.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/366631f3/u0SI.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/366631f3/vut7.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/366631f3/FVim.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/366631f3/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/366631f3/zktE.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/fb7e7bc +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/fb7e7bc/1JaH.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/fb7e7bc/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2ca76da5 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2ca76da5/Tekl +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2ca76da5/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/2aeE.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/Fm7b.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/glld.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/DxfO.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/2WFJ.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/xJha.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/fL8W.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/kBsg.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/fIr5.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/fNKf.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/2TDE.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/YmEJ.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/0hjK.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/zW0o.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/r3M3.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/wnND.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/x9nM.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/wm49.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/d5Xp.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/JNsa.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/gSqT.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/5ASY.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/Hg0O.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/7D8D.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/dit2.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/bKA8.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/i8KF.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/h8I7.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/796I.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/YHN2.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/ItaX.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/1Y3t.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/2CFz.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/TQFe.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/o164.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/WtMz.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/2d3G.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/iMmD.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/t3Xz.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/bNg1.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/2ZWe.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/1ocF.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/YQ0v.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/zWtS.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/519D.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/uXI7.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/zzy4.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-2e691610/k9Ur.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/RO0r.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/Juwm.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/goNl.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/T2Zr.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/dA6w.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/tT0L.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/tAQz.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/v4iq.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/UfOD.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/iPgl.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/8mj2.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/zEAU.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/Xgsg.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/tuNa.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/Wtw1.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/Uojp.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/1s3s.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/xJub.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/UNWu.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/1fqM.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/Q1e1.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/1SgU.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/rgSe.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/tStK.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/IFEw.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/Zhli.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/brxo.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/zbdV.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/J6j4.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/UmC7.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/mhux.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/q88y.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/EmuL.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/quuE.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/kMPh.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/dN7V.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/Uiiu.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/jo2F.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/ySyk.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/7IVQ.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/yedA.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/mRPa.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/UMvK.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/D3NV.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/r4cd.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/Hy1h.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/kSwa.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/wgcs.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/kz94.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4b2a4237/bwPX.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-219a2af8 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-219a2af8/Y3Hb.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-219a2af8/T5o5.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-219a2af8/knx7.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-219a2af8/ffW3.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-219a2af8/1ex6.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-219a2af8/wO4u.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-219a2af8/qIvb.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-219a2af8/j9xo.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-219a2af8/VyO7.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-219a2af8/rxiJ.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-219a2af8/1XyS.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-219a2af8/emIB.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-219a2af8/vs5k.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-219a2af8/2Bxs.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-219a2af8/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-219a2af8/7uj7.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7330191c +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7330191c/02T0.vue +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7330191c/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/29c9295f +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/29c9295f/Emjg.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/29c9295f/W8Ax.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/29c9295f/ziL0.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/29c9295f/WSug.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/29c9295f/ObtT.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/29c9295f/V9Fe.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/29c9295f/UTwv.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/29c9295f/mdcp.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/29c9295f/iOHY.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/29c9295f/Soux.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/29c9295f/geyc.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/29c9295f/UABs.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/29c9295f/GhbY.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/29c9295f/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2cc892d2 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2cc892d2/0LgN.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2cc892d2/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/292a9d0c +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/292a9d0c/hw8x.vue +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/292a9d0c/fOYf.vue +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/292a9d0c/EKQ4.vue +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/292a9d0c/sisz.vue +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/292a9d0c/y1t2.vue +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/292a9d0c/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-517f8cb2 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-517f8cb2/SpNX.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-517f8cb2/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4e1f48b5 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4e1f48b5/VixF.vue +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4e1f48b5/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4d4ca922 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4d4ca922/D9bI.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4d4ca922/qM8y.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4d4ca922/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/srHN.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/yL6D.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/yB4N.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/ktn7.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/0FSh.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/8wuI.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/VhAH.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/RE3R.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/XMxo.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/Jlu9.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/Vp5n.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/twJZ.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/G4A3.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/ShMl.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/6ADX.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/Zevy.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/eDL9.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/t65J.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/f0vR.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/2siM.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/ZwEv.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/GoZf.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/ZpCs.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/5YIz.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/28EJ.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/G1PJ.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/fn4d.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/D1Dp.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/EP2k.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/vTrT.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/zrgB.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/7DyG.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/JLo1.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/v4CJ.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/ij2U.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/MNua.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/Bc4O.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/D4E2.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/fnuc.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/0FET.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/3dzm.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/QS3A.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/h3ux.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/uG5f.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/7iqi.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/4Tor.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/diaV.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/TXTh.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/ueoY.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-4da16c1b/2Gqv.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1b39eec9 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1b39eec9/0QVZ.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1b39eec9/m3Yg.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1b39eec9/7UiG.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1b39eec9/f4cj.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1b39eec9/zL07.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1b39eec9/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1b39eec9/Rmc2.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-480d0047 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-480d0047/fGSV.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-480d0047/OjvM.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-480d0047/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/544c5b73 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/544c5b73/1VDc.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/544c5b73/F2MJ.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/544c5b73/3kSG.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/544c5b73/W9Bg.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/544c5b73/5Iqq.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/544c5b73/qbYo.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/544c5b73/6VRP.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/544c5b73/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/4ef33482 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/4ef33482/jO4Q.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/4ef33482/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/Wfsf.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/Xojb.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/Xft3.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/rkDc.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/yTjR.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/qSTB.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/Q7Bf.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/MW2i.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/sIQb.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/3N0Z.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/KwsU.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/FAFG.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/Ix86.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/REOP.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/7uEJ.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/TY9H.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/yhR2.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/b7Gp.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/obBu.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/jK85.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/Mnmf.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/SS4T.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/Jf0s.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/XXqJ.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/oO0s.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/OMcW.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/MvNT.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/jBBd.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/RdZy.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/u63H.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/x4bm.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5322ebb2/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2f47443d +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2f47443d/7XkV.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2f47443d/s7RZ.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2f47443d/TgeF.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2f47443d/FaU4.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2f47443d/JWxa.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2f47443d/stpU.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2f47443d/vvAa.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2f47443d/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-30fedddb +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-30fedddb/UjPN.vue +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-30fedddb/vIhx.vue +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-30fedddb/7AhD.vue +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-30fedddb/6hZb.vue +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-30fedddb/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/64bed780 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/64bed780/JEq4.yml +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/64bed780/BfsP.yml +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/64bed780/eSe8.yml +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/64bed780/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5db6cf04 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5db6cf04/bpkD.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5db6cf04/ialI.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5db6cf04/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1ba00bbd +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1ba00bbd/3Mqq.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1ba00bbd/VNVB.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1ba00bbd/s490.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1ba00bbd/wAaD.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1ba00bbd/s5r9.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1ba00bbd/szAK.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1ba00bbd/Qv7T.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1ba00bbd/v2QK.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1ba00bbd/G1Rw.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1ba00bbd/ZDAK.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1ba00bbd/SASK.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1ba00bbd/OKRO.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1ba00bbd/4lGb.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1ba00bbd/i8Pr.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1ba00bbd/1QMA.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1ba00bbd/S52Q.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1ba00bbd/ID7N.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1ba00bbd/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1ba00bbd/iVtE.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-1ba00bbd/bWOf.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-71e2d55f +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-71e2d55f/YerD.js +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-71e2d55f/kyBo.js +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-71e2d55f/DAZL.js +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-71e2d55f/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/482da0ce +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/482da0ce/GVb7.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/482da0ce/BmNE.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/482da0ce/ygWW.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/482da0ce/JkM4.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/482da0ce/vXZn.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/482da0ce/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/482da0ce/80T3.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2dfbf341 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2dfbf341/ODc4.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2dfbf341/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/7f158c21 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/7f158c21/boV7.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/7f158c21/YrVj.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/7f158c21/HZag.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/7f158c21/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-29478f5a +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-29478f5a/7nUD.html +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-29478f5a/7RNJ.html +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-29478f5a/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-29478f5a/sXKD.html +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/qJx6.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/bhdY.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/ijQU.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/y4wO.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/hvQT.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/050l.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/GvWk.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/zL5Z.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/MBN5.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/1Wcb.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/3lLA.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/Idyc.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/XMdd.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/idGt.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/EPKR.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/B8LJ.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/tH4a.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/WFKT.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/tdIL.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/o0de.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/wHkk.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/Mitr.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/oPES.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/Z41x.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/dHye.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/U3Ka.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/ubte.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/ZWas.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/JWGo.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/02ru.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/KpqL.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/T3ZI.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/jvRS.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/uqUj.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/1rv6.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/svCD.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/UGQ0.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/osuu.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-7b58b5d6/tIVo.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-28e08209 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-28e08209/9bkE.js +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-28e08209/iTJO.js +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-28e08209/kDT5.js +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-28e08209/HX3Q.js +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-28e08209/xlBZ.js +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-28e08209/j8yo.js +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-28e08209/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-28e08209/Op5k.js +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-313525dc +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-313525dc/i1Mz.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-313525dc/hCmo.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-313525dc/Yaw8.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-313525dc/qGmF.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-313525dc/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5fbeb620 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5fbeb620/h0BB.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5fbeb620/RqAp.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5fbeb620/Q24H.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5fbeb620/TSPO.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5fbeb620/8qGj.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5fbeb620/JN94.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5fbeb620/UByK.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5fbeb620/DNRT.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5fbeb620/7EsO.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5fbeb620/6wTV.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5fbeb620/yB5I.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5fbeb620/Oz0u.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5fbeb620/zzJc.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5fbeb620/RFXX.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5fbeb620/fkoN.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5fbeb620/U9VF.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5fbeb620/rjTt.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5fbeb620/ZRXr.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5fbeb620/K65d.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5fbeb620/MGH0.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5fbeb620/8ynW.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5fbeb620/30Gc.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5fbeb620/mcXH.txt +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5fbeb620/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/16f2aca3 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/16f2aca3/VQUx.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/16f2aca3/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-6c451dfd +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-6c451dfd/MAmy.yml +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-6c451dfd/tend.yml +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-6c451dfd/YU8u.yml +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-6c451dfd/OUJK.yml +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-6c451dfd/Y5jQ.yml +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-6c451dfd/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/683e8c8 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/683e8c8/5Yhv.vue +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/683e8c8/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-177b50f1 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-177b50f1/8jA8.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-177b50f1/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5e8dc48 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5e8dc48/iG1d.vue +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-5e8dc48/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/3a2679b3 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/3a2679b3/Gkgh +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/3a2679b3/Fkxq +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/3a2679b3/seFg +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/3a2679b3/gPhh +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/3a2679b3/OjCf +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/3a2679b3/ZGkr +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/3a2679b3/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/3a2679b3/WoD2 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-330f7e6f +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-330f7e6f/vGYE.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-330f7e6f/3wpa.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-330f7e6f/iNBu.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/-330f7e6f/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2e5f3cd1 +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2e5f3cd1/bTeN.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2e5f3cd1/ituT.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2e5f3cd1/k8QY.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2e5f3cd1/wfux.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2e5f3cd1/qisA.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2e5f3cd1/ubPt.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2e5f3cd1/U2Wc.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2e5f3cd1/z0Q8.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2e5f3cd1/yo8t.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2e5f3cd1/JINX.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2e5f3cd1/VgEg.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2e5f3cd1/UqDk.py +/opt/service_finder/.vscode_config/.local/share/code-server/User/History/2e5f3cd1/entries.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/caches +/opt/service_finder/.vscode_config/.local/share/code-server/User/caches/CachedConfigurations +/opt/service_finder/.vscode_config/.local/share/code-server/User/caches/CachedConfigurations/folder +/opt/service_finder/.vscode_config/.local/share/code-server/User/caches/CachedConfigurations/folder/-461341b9 +/opt/service_finder/.vscode_config/.local/share/code-server/User/caches/CachedConfigurations/folder/-461341b9/configuration.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/caches/CachedConfigurations/folder/-39141af6 +/opt/service_finder/.vscode_config/.local/share/code-server/User/caches/CachedConfigurations/folder/-39141af6/configuration.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/caches/CachedConfigurations/folder/f83f4cd +/opt/service_finder/.vscode_config/.local/share/code-server/User/caches/CachedConfigurations/folder/f83f4cd/configuration.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/caches/CachedConfigurations/folder/20ae27a4 +/opt/service_finder/.vscode_config/.local/share/code-server/User/caches/CachedConfigurations/folder/20ae27a4/configuration.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/caches/CachedConfigurations/folder/-23d72190 +/opt/service_finder/.vscode_config/.local/share/code-server/User/caches/CachedConfigurations/folder/-23d72190/configuration.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/snippets +/opt/service_finder/.vscode_config/.local/share/code-server/User/globalStorage +/opt/service_finder/.vscode_config/.local/share/code-server/User/systemExtensionsCache.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/-14fc42bf +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/-14fc42bf/meta.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/-14fc42bf/chatEditingSessions +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/-14fc42bf/chatEditingSessions/fe93b71a-e55f-4e3f-a4e7-7e7d3918caa3 +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/-14fc42bf/chatEditingSessions/fe93b71a-e55f-4e3f-a4e7-7e7d3918caa3/state.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/-14fc42bf/chatEditingSessions/fe93b71a-e55f-4e3f-a4e7-7e7d3918caa3/contents +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/-14fc42bf/chatEditingSessions/e76151b8-00f8-42d1-94ff-80dcf97afcf8 +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/-14fc42bf/chatEditingSessions/e76151b8-00f8-42d1-94ff-80dcf97afcf8/state.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/-14fc42bf/chatEditingSessions/e76151b8-00f8-42d1-94ff-80dcf97afcf8/contents +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/-14fc42bf/chatEditingSessions/572c40db-876c-4fa1-ab7a-d8151bdaedb1 +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/-14fc42bf/chatEditingSessions/572c40db-876c-4fa1-ab7a-d8151bdaedb1/state.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/-14fc42bf/chatEditingSessions/572c40db-876c-4fa1-ab7a-d8151bdaedb1/contents +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/-14fc42bf/chatSessions +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/-14fc42bf/chatSessions/e76151b8-00f8-42d1-94ff-80dcf97afcf8.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/-14fc42bf/chatSessions/572c40db-876c-4fa1-ab7a-d8151bdaedb1.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/-14fc42bf/chatSessions/fe93b71a-e55f-4e3f-a4e7-7e7d3918caa3.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/meta.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatEditingSessions +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatEditingSessions/3565f851-786d-46f9-98bf-2b88b4789a3e +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatEditingSessions/3565f851-786d-46f9-98bf-2b88b4789a3e/state.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatEditingSessions/3565f851-786d-46f9-98bf-2b88b4789a3e/contents +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatEditingSessions/1a3a721a-9b05-496e-9cd4-91890682a7c2 +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatEditingSessions/1a3a721a-9b05-496e-9cd4-91890682a7c2/state.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatEditingSessions/1a3a721a-9b05-496e-9cd4-91890682a7c2/contents +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatEditingSessions/7a659de8-2306-4f81-bbc1-b5fa93a5527e +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatEditingSessions/7a659de8-2306-4f81-bbc1-b5fa93a5527e/state.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatEditingSessions/7a659de8-2306-4f81-bbc1-b5fa93a5527e/contents +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatEditingSessions/4f44a27a-de0a-4e31-904f-212ba1423280 +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatEditingSessions/4f44a27a-de0a-4e31-904f-212ba1423280/state.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatEditingSessions/4f44a27a-de0a-4e31-904f-212ba1423280/contents +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatSessions +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatSessions/7a659de8-2306-4f81-bbc1-b5fa93a5527e.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatSessions/1a3a721a-9b05-496e-9cd4-91890682a7c2.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatSessions/3565f851-786d-46f9-98bf-2b88b4789a3e.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatSessions/4f44a27a-de0a-4e31-904f-212ba1423280.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/-53e2bffc +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/-53e2bffc/meta.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/vscode.lock +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/meta.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/d9f9e18e-5e68-4fad-8ff9-f520bbdccd72 +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/d9f9e18e-5e68-4fad-8ff9-f520bbdccd72/state.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/d9f9e18e-5e68-4fad-8ff9-f520bbdccd72/contents +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/810c61e8-420b-4c2d-b90d-78405f575e10 +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/810c61e8-420b-4c2d-b90d-78405f575e10/state.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/810c61e8-420b-4c2d-b90d-78405f575e10/contents +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/5127fd56-e03a-4cc6-8376-e74d4e23ce7c +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/5127fd56-e03a-4cc6-8376-e74d4e23ce7c/state.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/5127fd56-e03a-4cc6-8376-e74d4e23ce7c/contents +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/5cf441f2-ab0c-446e-a7ad-87e3c3bfea3c +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/5cf441f2-ab0c-446e-a7ad-87e3c3bfea3c/state.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/5cf441f2-ab0c-446e-a7ad-87e3c3bfea3c/contents +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/1c1e6083-b4f9-42e4-ae28-2f71caba0cf4 +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/1c1e6083-b4f9-42e4-ae28-2f71caba0cf4/state.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/1c1e6083-b4f9-42e4-ae28-2f71caba0cf4/contents +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/afa463b1-e6ec-42f8-8aca-aa89ccce4936 +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/afa463b1-e6ec-42f8-8aca-aa89ccce4936/state.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/afa463b1-e6ec-42f8-8aca-aa89ccce4936/contents +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatSessions +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatSessions/810c61e8-420b-4c2d-b90d-78405f575e10.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatSessions/1c1e6083-b4f9-42e4-ae28-2f71caba0cf4.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatSessions/5127fd56-e03a-4cc6-8376-e74d4e23ce7c.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatSessions/5cf441f2-ab0c-446e-a7ad-87e3c3bfea3c.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatSessions/d9f9e18e-5e68-4fad-8ff9-f520bbdccd72.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatSessions/afa463b1-e6ec-42f8-8aca-aa89ccce4936.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/-ad48359 +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/-ad48359/meta.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/-ad48359/chatEditingSessions +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/-ad48359/chatEditingSessions/d4cc21e9-36f6-444d-b20c-4c91876bba2b +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/-ad48359/chatEditingSessions/d4cc21e9-36f6-444d-b20c-4c91876bba2b/state.json +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/-ad48359/chatEditingSessions/d4cc21e9-36f6-444d-b20c-4c91876bba2b/contents +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/-ad48359/chatSessions +/opt/service_finder/.vscode_config/.local/share/code-server/User/workspaceStorage/-ad48359/chatSessions/d4cc21e9-36f6-444d-b20c-4c91876bba2b.json +/opt/service_finder/.vscode_config/.local/share/code-server/extensions +/opt/service_finder/.vscode_config/.local/share/code-server/extensions/extensions.json +/opt/service_finder/.vscode_config/.local/share/code-server/CachedProfilesData +/opt/service_finder/.vscode_config/.local/share/code-server/CachedProfilesData/__default__profile__ +/opt/service_finder/.vscode_config/.local/share/code-server/CachedProfilesData/__default__profile__/extensions.user.cache +/opt/service_finder/.vscode_config/.local/share/code-server/CachedProfilesData/__default__profile__/extensions.builtin.cache +/opt/service_finder/.vscode_config/.local/share/code-server/heartbeat +/opt/service_finder/.vscode_config/.local/share/code-server/logs +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost5 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost5/vscode.git +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost5/vscode.git/Git.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost5/vscode.github +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost5/vscode.github/GitHub.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost5/remoteExtHostTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost5/vscode.github-authentication +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost5/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost5/remoteexthost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost3 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost3/vscode.git +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost3/vscode.git/Git.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost3/vscode.github +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost3/vscode.github/GitHub.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost3/remoteExtHostTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost3/vscode.github-authentication +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost3/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost3/remoteexthost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost7 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost7/vscode.git +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost7/vscode.git/Git.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost7/vscode.github +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost7/vscode.github/GitHub.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost7/remoteExtHostTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost7/vscode.github-authentication +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost7/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost7/remoteexthost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost6 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost6/vscode.git +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost6/vscode.git/Git.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost6/vscode.github +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost6/vscode.github/GitHub.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost6/remoteExtHostTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost6/vscode.github-authentication +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost6/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost6/remoteexthost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost1 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost1/vscode.git +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost1/vscode.git/Git.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost1/vscode.github +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost1/vscode.github/GitHub.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost1/remoteExtHostTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost1/vscode.github-authentication +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost1/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost1/remoteexthost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost4 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost4/vscode.git +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost4/vscode.git/Git.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost4/vscode.github +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost4/vscode.github/GitHub.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost4/remoteExtHostTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost4/vscode.github-authentication +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost4/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost4/remoteexthost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost2 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost2/vscode.git +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost2/vscode.git/Git.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost2/vscode.github +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost2/vscode.github/GitHub.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost2/remoteExtHostTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost2/vscode.github-authentication +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost2/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost2/remoteexthost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/remoteTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/ptyhost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost8 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost8/vscode.git +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost8/vscode.git/Git.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost8/vscode.github +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost8/vscode.github/GitHub.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost8/remoteExtHostTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost8/vscode.github-authentication +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost8/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/exthost8/remoteexthost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T174543/remoteagent.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T164451 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T164451/exthost1 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T164451/exthost1/vscode.git +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T164451/exthost1/vscode.git/Git.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T164451/exthost1/vscode.github +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T164451/exthost1/vscode.github/GitHub.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T164451/exthost1/remoteExtHostTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T164451/exthost1/vscode.github-authentication +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T164451/exthost1/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T164451/exthost1/remoteexthost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T164451/remoteTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T164451/ptyhost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260126T164451/remoteagent.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T214520 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T214520/exthost1 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T214520/exthost1/vscode.css-language-features +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T214520/exthost1/vscode.css-language-features/CSS Language Server.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T214520/exthost1/vscode.typescript-language-features +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T214520/exthost1/vscode.typescript-language-features/TypeScript.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T214520/exthost1/vscode.git +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T214520/exthost1/vscode.git/Git.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T214520/exthost1/vscode.github +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T214520/exthost1/vscode.github/GitHub.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T214520/exthost1/vscode.html-language-features +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T214520/exthost1/vscode.html-language-features/HTML Language Server.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T214520/exthost1/remoteExtHostTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T214520/exthost1/vscode.github-authentication +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T214520/exthost1/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T214520/exthost1/remoteexthost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T214520/remoteTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T214520/ptyhost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T214520/remoteagent.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost3 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost3/vscode.git +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost3/vscode.git/Git.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost3/vscode.github +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost3/vscode.github/GitHub.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost3/remoteExtHostTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost3/vscode.github-authentication +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost3/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost3/remoteexthost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost1 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost1/vscode.git +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost1/vscode.git/Git.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost1/vscode.github +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost1/vscode.github/GitHub.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost1/remoteExtHostTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost1/vscode.github-authentication +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost1/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost1/remoteexthost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost2 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost2/vscode.git +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost2/vscode.git/Git.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost2/vscode.github +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost2/vscode.github/GitHub.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost2/vscode.html-language-features +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost2/vscode.html-language-features/HTML Language Server.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost2/remoteExtHostTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost2/vscode.github-authentication +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost2/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/exthost2/remoteexthost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/remoteTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/ptyhost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T001948/remoteagent.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T213246 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T213246/exthost1 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T213246/exthost1/vscode.git +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T213246/exthost1/vscode.git/Git.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T213246/exthost1/vscode.github +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T213246/exthost1/vscode.github/GitHub.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T213246/exthost1/remoteExtHostTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T213246/exthost1/vscode.github-authentication +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T213246/exthost1/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T213246/exthost1/remoteexthost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T213246/remoteTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T213246/ptyhost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260129T213246/remoteagent.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost5 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost5/vscode.git +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost5/vscode.git/Git.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost5/vscode.github +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost5/vscode.github/GitHub.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost5/remoteExtHostTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost5/vscode.github-authentication +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost5/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost5/remoteexthost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost10 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost10/vscode.git +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost10/vscode.git/Git.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost10/vscode.github +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost10/vscode.github/GitHub.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost10/remoteExtHostTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost10/vscode.github-authentication +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost10/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost10/remoteexthost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost3 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost3/vscode.git +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost3/vscode.git/Git.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost3/vscode.github +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost3/vscode.github/GitHub.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost3/remoteExtHostTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost3/vscode.github-authentication +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost3/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost3/remoteexthost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost9 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost9/vscode.git +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost9/vscode.git/Git.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost9/vscode.github +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost9/vscode.github/GitHub.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost9/remoteExtHostTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost9/vscode.github-authentication +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost9/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost9/remoteexthost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost7 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost7/vscode.git +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost7/vscode.git/Git.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost7/vscode.github +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost7/vscode.github/GitHub.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost7/remoteExtHostTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost7/vscode.github-authentication +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost7/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost7/remoteexthost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost6 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost6/vscode.git +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost6/vscode.git/Git.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost6/vscode.github +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost6/vscode.github/GitHub.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost6/remoteExtHostTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost6/vscode.github-authentication +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost6/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost6/remoteexthost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost1 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost1/vscode.git +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost1/vscode.git/Git.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost1/vscode.github +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost1/vscode.github/GitHub.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost1/remoteExtHostTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost1/vscode.github-authentication +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost1/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost1/remoteexthost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost4 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost4/vscode.git +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost4/vscode.git/Git.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost4/vscode.github +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost4/vscode.github/GitHub.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost4/remoteExtHostTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost4/vscode.github-authentication +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost4/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost4/remoteexthost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost2 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost2/vscode.git +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost2/vscode.git/Git.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost2/vscode.github +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost2/vscode.github/GitHub.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost2/remoteExtHostTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost2/vscode.github-authentication +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost2/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost2/remoteexthost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/remoteTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/ptyhost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost8 +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost8/vscode.git +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost8/vscode.git/Git.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost8/vscode.github +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost8/vscode.github/GitHub.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost8/remoteExtHostTelemetry.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost8/vscode.github-authentication +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost8/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/exthost8/remoteexthost.log +/opt/service_finder/.vscode_config/.local/share/code-server/logs/20260125T233505/remoteagent.log +/opt/service_finder/.vscode_config/.local/share/code-server/machineid +/opt/service_finder/.vscode_config/.local/share/code-server/coder.json +/opt/service_finder/.vscode_config/.local/share/mc +/opt/service_finder/.vscode_config/.local/share/mc/history +/opt/service_finder/.vscode_config/.ssh +/opt/service_finder/.vscode_config/.bashrc +/opt/service_finder/.vscode_config/.config +/opt/service_finder/.vscode_config/.config/code-server +/opt/service_finder/.vscode_config/.config/code-server/config.yaml +/opt/service_finder/.vscode_config/.config/mc +/opt/service_finder/.vscode_config/.config/mc/ini +/opt/service_finder/.vscode_config/.config/mc/panels.ini +/opt/service_finder/.vscode_config/.bash_history +/opt/service_finder/.vscode_config/.cache +/opt/service_finder/.vscode_config/.cache/typescript +/opt/service_finder/.vscode_config/.cache/typescript/5.9 +/opt/service_finder/.vscode_config/.cache/typescript/5.9/package.json +/opt/service_finder/.vscode_config/.cache/Microsoft +/opt/service_finder/.vscode_config/.cache/Microsoft/DeveloperTools +/opt/service_finder/.vscode_config/.cache/Microsoft/DeveloperTools/deviceid +/opt/service_finder/.vscode_config/.cache/mc +/opt/service_finder/.vscode_config/.cache/mc/Tree +/opt/service_finder/logs +/opt/service_finder/frontend +/opt/service_finder/frontend/tailwind.config.js +/opt/service_finder/frontend/src +/opt/service_finder/frontend/src/App.vue +/opt/service_finder/frontend/src/views +/opt/service_finder/frontend/src/views/AddVehicle.vue +/opt/service_finder/frontend/src/views/AddExpense.vue +/opt/service_finder/frontend/src/views/Dashboard.vue +/opt/service_finder/frontend/src/views/admin +/opt/service_finder/frontend/src/views/admin/AdminStats.vue +/opt/service_finder/frontend/src/views/Expenses.vue +/opt/service_finder/frontend/src/views/ResetPassword.vue +/opt/service_finder/frontend/src/views/Register.vue +/opt/service_finder/frontend/src/views/Login.vue +/opt/service_finder/frontend/src/views/ForgotPassword.vue +/opt/service_finder/frontend/src/assets +/opt/service_finder/frontend/src/assets/vue.svg +/opt/service_finder/frontend/src/router +/opt/service_finder/frontend/src/router/index.js +/opt/service_finder/frontend/src/main.js +/opt/service_finder/frontend/src/stores +/opt/service_finder/frontend/src/services +/opt/service_finder/frontend/src/components +/opt/service_finder/frontend/src/components/HelloWorld.vue +/opt/service_finder/frontend/src/style.css +/opt/service_finder/frontend/postcss.config.js +/opt/service_finder/frontend/package.json +/opt/service_finder/frontend/.gitignore +/opt/service_finder/frontend/package-lock.json +/opt/service_finder/frontend/public +/opt/service_finder/frontend/public/vite.svg +/opt/service_finder/frontend/vite.config.js +/opt/service_finder/frontend/index.html +/opt/service_finder/frontend/node_modules +/opt/service_finder/frontend/node_modules/detect-libc +/opt/service_finder/frontend/node_modules/detect-libc/index.d.ts +/opt/service_finder/frontend/node_modules/detect-libc/lib +/opt/service_finder/frontend/node_modules/detect-libc/lib/detect-libc.js +/opt/service_finder/frontend/node_modules/detect-libc/lib/process.js +/opt/service_finder/frontend/node_modules/detect-libc/lib/filesystem.js +/opt/service_finder/frontend/node_modules/detect-libc/lib/elf.js +/opt/service_finder/frontend/node_modules/detect-libc/package.json +/opt/service_finder/frontend/node_modules/detect-libc/LICENSE +/opt/service_finder/frontend/node_modules/detect-libc/README.md +/opt/service_finder/frontend/node_modules/jsesc +/opt/service_finder/frontend/node_modules/jsesc/jsesc.js +/opt/service_finder/frontend/node_modules/jsesc/man +/opt/service_finder/frontend/node_modules/jsesc/man/jsesc.1 +/opt/service_finder/frontend/node_modules/jsesc/LICENSE-MIT.txt +/opt/service_finder/frontend/node_modules/jsesc/package.json +/opt/service_finder/frontend/node_modules/jsesc/bin +/opt/service_finder/frontend/node_modules/jsesc/bin/jsesc +/opt/service_finder/frontend/node_modules/jsesc/README.md +/opt/service_finder/frontend/node_modules/unplugin-utils +/opt/service_finder/frontend/node_modules/unplugin-utils/package.json +/opt/service_finder/frontend/node_modules/unplugin-utils/dist +/opt/service_finder/frontend/node_modules/unplugin-utils/dist/index.d.ts +/opt/service_finder/frontend/node_modules/unplugin-utils/dist/index.js +/opt/service_finder/frontend/node_modules/unplugin-utils/LICENSE +/opt/service_finder/frontend/node_modules/unplugin-utils/README.md +/opt/service_finder/frontend/node_modules/asynckit +/opt/service_finder/frontend/node_modules/asynckit/serial.js +/opt/service_finder/frontend/node_modules/asynckit/lib +/opt/service_finder/frontend/node_modules/asynckit/lib/abort.js +/opt/service_finder/frontend/node_modules/asynckit/lib/readable_parallel.js +/opt/service_finder/frontend/node_modules/asynckit/lib/async.js +/opt/service_finder/frontend/node_modules/asynckit/lib/readable_asynckit.js +/opt/service_finder/frontend/node_modules/asynckit/lib/defer.js +/opt/service_finder/frontend/node_modules/asynckit/lib/terminator.js +/opt/service_finder/frontend/node_modules/asynckit/lib/iterate.js +/opt/service_finder/frontend/node_modules/asynckit/lib/state.js +/opt/service_finder/frontend/node_modules/asynckit/lib/streamify.js +/opt/service_finder/frontend/node_modules/asynckit/lib/readable_serial_ordered.js +/opt/service_finder/frontend/node_modules/asynckit/lib/readable_serial.js +/opt/service_finder/frontend/node_modules/asynckit/package.json +/opt/service_finder/frontend/node_modules/asynckit/bench.js +/opt/service_finder/frontend/node_modules/asynckit/stream.js +/opt/service_finder/frontend/node_modules/asynckit/LICENSE +/opt/service_finder/frontend/node_modules/asynckit/index.js +/opt/service_finder/frontend/node_modules/asynckit/README.md +/opt/service_finder/frontend/node_modules/asynckit/serialOrdered.js +/opt/service_finder/frontend/node_modules/asynckit/parallel.js +/opt/service_finder/frontend/node_modules/@types +/opt/service_finder/frontend/node_modules/@types/estree +/opt/service_finder/frontend/node_modules/@types/estree/index.d.ts +/opt/service_finder/frontend/node_modules/@types/estree/package.json +/opt/service_finder/frontend/node_modules/@types/estree/LICENSE +/opt/service_finder/frontend/node_modules/@types/estree/flow.d.ts +/opt/service_finder/frontend/node_modules/@types/estree/README.md +/opt/service_finder/frontend/node_modules/estree-walker +/opt/service_finder/frontend/node_modules/estree-walker/src +/opt/service_finder/frontend/node_modules/estree-walker/src/package.json +/opt/service_finder/frontend/node_modules/estree-walker/src/async.js +/opt/service_finder/frontend/node_modules/estree-walker/src/sync.js +/opt/service_finder/frontend/node_modules/estree-walker/src/walker.js +/opt/service_finder/frontend/node_modules/estree-walker/src/index.js +/opt/service_finder/frontend/node_modules/estree-walker/types +/opt/service_finder/frontend/node_modules/estree-walker/types/index.d.ts +/opt/service_finder/frontend/node_modules/estree-walker/types/sync.d.ts +/opt/service_finder/frontend/node_modules/estree-walker/types/tsconfig.tsbuildinfo +/opt/service_finder/frontend/node_modules/estree-walker/types/async.d.ts +/opt/service_finder/frontend/node_modules/estree-walker/types/walker.d.ts +/opt/service_finder/frontend/node_modules/estree-walker/package.json +/opt/service_finder/frontend/node_modules/estree-walker/dist +/opt/service_finder/frontend/node_modules/estree-walker/dist/umd +/opt/service_finder/frontend/node_modules/estree-walker/dist/umd/estree-walker.js +/opt/service_finder/frontend/node_modules/estree-walker/dist/esm +/opt/service_finder/frontend/node_modules/estree-walker/dist/esm/estree-walker.js +/opt/service_finder/frontend/node_modules/estree-walker/dist/esm/package.json +/opt/service_finder/frontend/node_modules/estree-walker/LICENSE +/opt/service_finder/frontend/node_modules/estree-walker/README.md +/opt/service_finder/frontend/node_modules/estree-walker/CHANGELOG.md +/opt/service_finder/frontend/node_modules/local-pkg +/opt/service_finder/frontend/node_modules/local-pkg/package.json +/opt/service_finder/frontend/node_modules/local-pkg/dist +/opt/service_finder/frontend/node_modules/local-pkg/dist/index.d.ts +/opt/service_finder/frontend/node_modules/local-pkg/dist/index.cjs +/opt/service_finder/frontend/node_modules/local-pkg/dist/index.d.mts +/opt/service_finder/frontend/node_modules/local-pkg/dist/index.d.cts +/opt/service_finder/frontend/node_modules/local-pkg/dist/index.mjs +/opt/service_finder/frontend/node_modules/local-pkg/LICENSE +/opt/service_finder/frontend/node_modules/local-pkg/README.md +/opt/service_finder/frontend/node_modules/copy-anything +/opt/service_finder/frontend/node_modules/copy-anything/package.json +/opt/service_finder/frontend/node_modules/copy-anything/dist +/opt/service_finder/frontend/node_modules/copy-anything/dist/index.d.ts +/opt/service_finder/frontend/node_modules/copy-anything/dist/index.js +/opt/service_finder/frontend/node_modules/copy-anything/LICENSE +/opt/service_finder/frontend/node_modules/copy-anything/README.md +/opt/service_finder/frontend/node_modules/postcss +/opt/service_finder/frontend/node_modules/postcss/lib +/opt/service_finder/frontend/node_modules/postcss/lib/lazy-result.d.ts +/opt/service_finder/frontend/node_modules/postcss/lib/at-rule.js +/opt/service_finder/frontend/node_modules/postcss/lib/stringifier.js +/opt/service_finder/frontend/node_modules/postcss/lib/fromJSON.d.ts +/opt/service_finder/frontend/node_modules/postcss/lib/previous-map.d.ts +/opt/service_finder/frontend/node_modules/postcss/lib/fromJSON.js +/opt/service_finder/frontend/node_modules/postcss/lib/stringify.js +/opt/service_finder/frontend/node_modules/postcss/lib/tokenize.js +/opt/service_finder/frontend/node_modules/postcss/lib/previous-map.js +/opt/service_finder/frontend/node_modules/postcss/lib/processor.js +/opt/service_finder/frontend/node_modules/postcss/lib/rule.js +/opt/service_finder/frontend/node_modules/postcss/lib/no-work-result.d.ts +/opt/service_finder/frontend/node_modules/postcss/lib/stringify.d.ts +/opt/service_finder/frontend/node_modules/postcss/lib/container.js +/opt/service_finder/frontend/node_modules/postcss/lib/declaration.d.ts +/opt/service_finder/frontend/node_modules/postcss/lib/stringifier.d.ts +/opt/service_finder/frontend/node_modules/postcss/lib/terminal-highlight.js +/opt/service_finder/frontend/node_modules/postcss/lib/document.js +/opt/service_finder/frontend/node_modules/postcss/lib/node.js +/opt/service_finder/frontend/node_modules/postcss/lib/result.d.ts +/opt/service_finder/frontend/node_modules/postcss/lib/warning.d.ts +/opt/service_finder/frontend/node_modules/postcss/lib/postcss.js +/opt/service_finder/frontend/node_modules/postcss/lib/postcss.d.ts +/opt/service_finder/frontend/node_modules/postcss/lib/css-syntax-error.d.ts +/opt/service_finder/frontend/node_modules/postcss/lib/input.d.ts +/opt/service_finder/frontend/node_modules/postcss/lib/symbols.js +/opt/service_finder/frontend/node_modules/postcss/lib/at-rule.d.ts +/opt/service_finder/frontend/node_modules/postcss/lib/warn-once.js +/opt/service_finder/frontend/node_modules/postcss/lib/document.d.ts +/opt/service_finder/frontend/node_modules/postcss/lib/input.js +/opt/service_finder/frontend/node_modules/postcss/lib/rule.d.ts +/opt/service_finder/frontend/node_modules/postcss/lib/result.js +/opt/service_finder/frontend/node_modules/postcss/lib/map-generator.js +/opt/service_finder/frontend/node_modules/postcss/lib/list.js +/opt/service_finder/frontend/node_modules/postcss/lib/comment.d.ts +/opt/service_finder/frontend/node_modules/postcss/lib/parse.js +/opt/service_finder/frontend/node_modules/postcss/lib/warning.js +/opt/service_finder/frontend/node_modules/postcss/lib/lazy-result.js +/opt/service_finder/frontend/node_modules/postcss/lib/parse.d.ts +/opt/service_finder/frontend/node_modules/postcss/lib/root.d.ts +/opt/service_finder/frontend/node_modules/postcss/lib/processor.d.ts +/opt/service_finder/frontend/node_modules/postcss/lib/no-work-result.js +/opt/service_finder/frontend/node_modules/postcss/lib/node.d.ts +/opt/service_finder/frontend/node_modules/postcss/lib/declaration.js +/opt/service_finder/frontend/node_modules/postcss/lib/comment.js +/opt/service_finder/frontend/node_modules/postcss/lib/postcss.mjs +/opt/service_finder/frontend/node_modules/postcss/lib/container.d.ts +/opt/service_finder/frontend/node_modules/postcss/lib/parser.js +/opt/service_finder/frontend/node_modules/postcss/lib/list.d.ts +/opt/service_finder/frontend/node_modules/postcss/lib/root.js +/opt/service_finder/frontend/node_modules/postcss/lib/css-syntax-error.js +/opt/service_finder/frontend/node_modules/postcss/lib/postcss.d.mts +/opt/service_finder/frontend/node_modules/postcss/package.json +/opt/service_finder/frontend/node_modules/postcss/LICENSE +/opt/service_finder/frontend/node_modules/postcss/README.md +/opt/service_finder/frontend/node_modules/speakingurl +/opt/service_finder/frontend/node_modules/speakingurl/bower.json +/opt/service_finder/frontend/node_modules/speakingurl/examples +/opt/service_finder/frontend/node_modules/speakingurl/examples/node-example.js +/opt/service_finder/frontend/node_modules/speakingurl/examples/browser-example.html +/opt/service_finder/frontend/node_modules/speakingurl/test +/opt/service_finder/frontend/node_modules/speakingurl/test/test-dhivehi.js +/opt/service_finder/frontend/node_modules/speakingurl/test/test-language.js +/opt/service_finder/frontend/node_modules/speakingurl/test/test-georgien.js +/opt/service_finder/frontend/node_modules/speakingurl/test/test-arabic.js +/opt/service_finder/frontend/node_modules/speakingurl/test/test-titlecase.js +/opt/service_finder/frontend/node_modules/speakingurl/test/test-accent.js +/opt/service_finder/frontend/node_modules/speakingurl/test/test-persian.js +/opt/service_finder/frontend/node_modules/speakingurl/test/test-lang.js +/opt/service_finder/frontend/node_modules/speakingurl/test/test-hungarian.js +/opt/service_finder/frontend/node_modules/speakingurl/test/test-maintaincase.js +/opt/service_finder/frontend/node_modules/speakingurl/test/test-truncate.js +/opt/service_finder/frontend/node_modules/speakingurl/test/test-rfc3986.js +/opt/service_finder/frontend/node_modules/speakingurl/test/mocha.opts +/opt/service_finder/frontend/node_modules/speakingurl/test/test-speakingurl.js +/opt/service_finder/frontend/node_modules/speakingurl/test/test-separator.js +/opt/service_finder/frontend/node_modules/speakingurl/test/test-cyrillic.js +/opt/service_finder/frontend/node_modules/speakingurl/test/test-create.js +/opt/service_finder/frontend/node_modules/speakingurl/test/test-symbols.js +/opt/service_finder/frontend/node_modules/speakingurl/test/test-burmese.js +/opt/service_finder/frontend/node_modules/speakingurl/test/test-custom.js +/opt/service_finder/frontend/node_modules/speakingurl/test/test-defaults.js +/opt/service_finder/frontend/node_modules/speakingurl/test/test-turkish.js +/opt/service_finder/frontend/node_modules/speakingurl/.jshintrc +/opt/service_finder/frontend/node_modules/speakingurl/.travis.yml +/opt/service_finder/frontend/node_modules/speakingurl/lib +/opt/service_finder/frontend/node_modules/speakingurl/lib/speakingurl.js +/opt/service_finder/frontend/node_modules/speakingurl/lib/speakingurl-rails.rb +/opt/service_finder/frontend/node_modules/speakingurl/package.json +/opt/service_finder/frontend/node_modules/speakingurl/component.json +/opt/service_finder/frontend/node_modules/speakingurl/LICENSE +/opt/service_finder/frontend/node_modules/speakingurl/.jshintignore +/opt/service_finder/frontend/node_modules/speakingurl/index.js +/opt/service_finder/frontend/node_modules/speakingurl/Gulpfile.js +/opt/service_finder/frontend/node_modules/speakingurl/README.md +/opt/service_finder/frontend/node_modules/speakingurl/speakingurl-rails.gemspec +/opt/service_finder/frontend/node_modules/speakingurl/.editorconfig +/opt/service_finder/frontend/node_modules/speakingurl/.npmignore +/opt/service_finder/frontend/node_modules/speakingurl/.jsbeautifyrc +/opt/service_finder/frontend/node_modules/speakingurl/CHANGELOG.md +/opt/service_finder/frontend/node_modules/speakingurl/Makefile +/opt/service_finder/frontend/node_modules/speakingurl/speakingurl.min.js +/opt/service_finder/frontend/node_modules/speakingurl/typings +/opt/service_finder/frontend/node_modules/speakingurl/typings/speakingurl +/opt/service_finder/frontend/node_modules/speakingurl/typings/speakingurl/speakingurl.d.ts +/opt/service_finder/frontend/node_modules/fraction.js +/opt/service_finder/frontend/node_modules/fraction.js/src +/opt/service_finder/frontend/node_modules/fraction.js/src/fraction.js +/opt/service_finder/frontend/node_modules/fraction.js/examples +/opt/service_finder/frontend/node_modules/fraction.js/examples/angles.js +/opt/service_finder/frontend/node_modules/fraction.js/examples/hesse-convergence.js +/opt/service_finder/frontend/node_modules/fraction.js/examples/approx.js +/opt/service_finder/frontend/node_modules/fraction.js/examples/toFraction.js +/opt/service_finder/frontend/node_modules/fraction.js/examples/tape-measure.js +/opt/service_finder/frontend/node_modules/fraction.js/examples/ratio-chain.js +/opt/service_finder/frontend/node_modules/fraction.js/examples/valueOfPi.js +/opt/service_finder/frontend/node_modules/fraction.js/examples/egyptian.js +/opt/service_finder/frontend/node_modules/fraction.js/examples/integrate.js +/opt/service_finder/frontend/node_modules/fraction.js/examples/rational-pow.js +/opt/service_finder/frontend/node_modules/fraction.js/fraction.d.ts +/opt/service_finder/frontend/node_modules/fraction.js/fraction.d.mts +/opt/service_finder/frontend/node_modules/fraction.js/package.json +/opt/service_finder/frontend/node_modules/fraction.js/dist +/opt/service_finder/frontend/node_modules/fraction.js/dist/fraction.js +/opt/service_finder/frontend/node_modules/fraction.js/dist/fraction.mjs +/opt/service_finder/frontend/node_modules/fraction.js/dist/fraction.min.js +/opt/service_finder/frontend/node_modules/fraction.js/LICENSE +/opt/service_finder/frontend/node_modules/fraction.js/tests +/opt/service_finder/frontend/node_modules/fraction.js/tests/fraction.test.js +/opt/service_finder/frontend/node_modules/fraction.js/README.md +/opt/service_finder/frontend/node_modules/fraction.js/CHANGELOG.md +/opt/service_finder/frontend/node_modules/ast-kit +/opt/service_finder/frontend/node_modules/ast-kit/package.json +/opt/service_finder/frontend/node_modules/ast-kit/dist +/opt/service_finder/frontend/node_modules/ast-kit/dist/index.d.ts +/opt/service_finder/frontend/node_modules/ast-kit/dist/index.js +/opt/service_finder/frontend/node_modules/ast-kit/LICENSE +/opt/service_finder/frontend/node_modules/ast-kit/README.md +/opt/service_finder/frontend/node_modules/get-proto +/opt/service_finder/frontend/node_modules/get-proto/index.d.ts +/opt/service_finder/frontend/node_modules/get-proto/test +/opt/service_finder/frontend/node_modules/get-proto/test/index.js +/opt/service_finder/frontend/node_modules/get-proto/tsconfig.json +/opt/service_finder/frontend/node_modules/get-proto/package.json +/opt/service_finder/frontend/node_modules/get-proto/Reflect.getPrototypeOf.d.ts +/opt/service_finder/frontend/node_modules/get-proto/.github +/opt/service_finder/frontend/node_modules/get-proto/.github/FUNDING.yml +/opt/service_finder/frontend/node_modules/get-proto/.eslintrc +/opt/service_finder/frontend/node_modules/get-proto/LICENSE +/opt/service_finder/frontend/node_modules/get-proto/index.js +/opt/service_finder/frontend/node_modules/get-proto/Reflect.getPrototypeOf.js +/opt/service_finder/frontend/node_modules/get-proto/Object.getPrototypeOf.js +/opt/service_finder/frontend/node_modules/get-proto/.nycrc +/opt/service_finder/frontend/node_modules/get-proto/README.md +/opt/service_finder/frontend/node_modules/get-proto/Object.getPrototypeOf.d.ts +/opt/service_finder/frontend/node_modules/get-proto/CHANGELOG.md +/opt/service_finder/frontend/node_modules/.bin +/opt/service_finder/frontend/node_modules/.bin/jsesc +/opt/service_finder/frontend/node_modules/.bin/parser +/opt/service_finder/frontend/node_modules/.bin/browserslist +/opt/service_finder/frontend/node_modules/.bin/autoprefixer +/opt/service_finder/frontend/node_modules/.bin/acorn +/opt/service_finder/frontend/node_modules/.bin/jiti +/opt/service_finder/frontend/node_modules/.bin/baseline-browser-mapping +/opt/service_finder/frontend/node_modules/.bin/json5 +/opt/service_finder/frontend/node_modules/.bin/yaml +/opt/service_finder/frontend/node_modules/.bin/update-browserslist-db +/opt/service_finder/frontend/node_modules/.bin/esbuild +/opt/service_finder/frontend/node_modules/.bin/nanoid +/opt/service_finder/frontend/node_modules/.bin/rollup +/opt/service_finder/frontend/node_modules/.bin/vite +/opt/service_finder/frontend/node_modules/es-object-atoms +/opt/service_finder/frontend/node_modules/es-object-atoms/index.d.ts +/opt/service_finder/frontend/node_modules/es-object-atoms/isObject.js +/opt/service_finder/frontend/node_modules/es-object-atoms/ToObject.d.ts +/opt/service_finder/frontend/node_modules/es-object-atoms/test +/opt/service_finder/frontend/node_modules/es-object-atoms/test/index.js +/opt/service_finder/frontend/node_modules/es-object-atoms/tsconfig.json +/opt/service_finder/frontend/node_modules/es-object-atoms/RequireObjectCoercible.js +/opt/service_finder/frontend/node_modules/es-object-atoms/package.json +/opt/service_finder/frontend/node_modules/es-object-atoms/RequireObjectCoercible.d.ts +/opt/service_finder/frontend/node_modules/es-object-atoms/isObject.d.ts +/opt/service_finder/frontend/node_modules/es-object-atoms/.github +/opt/service_finder/frontend/node_modules/es-object-atoms/.github/FUNDING.yml +/opt/service_finder/frontend/node_modules/es-object-atoms/.eslintrc +/opt/service_finder/frontend/node_modules/es-object-atoms/LICENSE +/opt/service_finder/frontend/node_modules/es-object-atoms/index.js +/opt/service_finder/frontend/node_modules/es-object-atoms/ToObject.js +/opt/service_finder/frontend/node_modules/es-object-atoms/README.md +/opt/service_finder/frontend/node_modules/es-object-atoms/CHANGELOG.md +/opt/service_finder/frontend/node_modules/pathe +/opt/service_finder/frontend/node_modules/pathe/package.json +/opt/service_finder/frontend/node_modules/pathe/dist +/opt/service_finder/frontend/node_modules/pathe/dist/shared +/opt/service_finder/frontend/node_modules/pathe/dist/shared/pathe.BSlhyZSM.cjs +/opt/service_finder/frontend/node_modules/pathe/dist/shared/pathe.M-eThtNZ.mjs +/opt/service_finder/frontend/node_modules/pathe/dist/utils.mjs +/opt/service_finder/frontend/node_modules/pathe/dist/index.d.ts +/opt/service_finder/frontend/node_modules/pathe/dist/index.cjs +/opt/service_finder/frontend/node_modules/pathe/dist/utils.d.mts +/opt/service_finder/frontend/node_modules/pathe/dist/utils.cjs +/opt/service_finder/frontend/node_modules/pathe/dist/utils.d.cts +/opt/service_finder/frontend/node_modules/pathe/dist/utils.d.ts +/opt/service_finder/frontend/node_modules/pathe/dist/index.d.mts +/opt/service_finder/frontend/node_modules/pathe/dist/index.d.cts +/opt/service_finder/frontend/node_modules/pathe/dist/index.mjs +/opt/service_finder/frontend/node_modules/pathe/LICENSE +/opt/service_finder/frontend/node_modules/pathe/utils.d.ts +/opt/service_finder/frontend/node_modules/pathe/README.md +/opt/service_finder/frontend/node_modules/source-map-js +/opt/service_finder/frontend/node_modules/source-map-js/source-map.d.ts +/opt/service_finder/frontend/node_modules/source-map-js/lib +/opt/service_finder/frontend/node_modules/source-map-js/lib/source-map-consumer.d.ts +/opt/service_finder/frontend/node_modules/source-map-js/lib/array-set.js +/opt/service_finder/frontend/node_modules/source-map-js/lib/source-map-generator.js +/opt/service_finder/frontend/node_modules/source-map-js/lib/mapping-list.js +/opt/service_finder/frontend/node_modules/source-map-js/lib/base64-vlq.js +/opt/service_finder/frontend/node_modules/source-map-js/lib/source-map-generator.d.ts +/opt/service_finder/frontend/node_modules/source-map-js/lib/base64.js +/opt/service_finder/frontend/node_modules/source-map-js/lib/source-node.js +/opt/service_finder/frontend/node_modules/source-map-js/lib/util.js +/opt/service_finder/frontend/node_modules/source-map-js/lib/source-map-consumer.js +/opt/service_finder/frontend/node_modules/source-map-js/lib/quick-sort.js +/opt/service_finder/frontend/node_modules/source-map-js/lib/source-node.d.ts +/opt/service_finder/frontend/node_modules/source-map-js/lib/binary-search.js +/opt/service_finder/frontend/node_modules/source-map-js/package.json +/opt/service_finder/frontend/node_modules/source-map-js/source-map.js +/opt/service_finder/frontend/node_modules/source-map-js/LICENSE +/opt/service_finder/frontend/node_modules/source-map-js/README.md +/opt/service_finder/frontend/node_modules/@esbuild +/opt/service_finder/frontend/node_modules/@esbuild/linux-x64 +/opt/service_finder/frontend/node_modules/@esbuild/linux-x64/package.json +/opt/service_finder/frontend/node_modules/@esbuild/linux-x64/bin +/opt/service_finder/frontend/node_modules/@esbuild/linux-x64/bin/esbuild +/opt/service_finder/frontend/node_modules/@esbuild/linux-x64/README.md +/opt/service_finder/frontend/node_modules/@rolldown +/opt/service_finder/frontend/node_modules/@rolldown/pluginutils +/opt/service_finder/frontend/node_modules/@rolldown/pluginutils/package.json +/opt/service_finder/frontend/node_modules/@rolldown/pluginutils/dist +/opt/service_finder/frontend/node_modules/@rolldown/pluginutils/dist/simple-filters.d.ts +/opt/service_finder/frontend/node_modules/@rolldown/pluginutils/dist/filter-vite-plugins.js +/opt/service_finder/frontend/node_modules/@rolldown/pluginutils/dist/composable-filters.js +/opt/service_finder/frontend/node_modules/@rolldown/pluginutils/dist/filter-vite-plugins.d.ts +/opt/service_finder/frontend/node_modules/@rolldown/pluginutils/dist/index.d.ts +/opt/service_finder/frontend/node_modules/@rolldown/pluginutils/dist/composable-filters.d.ts +/opt/service_finder/frontend/node_modules/@rolldown/pluginutils/dist/utils.js +/opt/service_finder/frontend/node_modules/@rolldown/pluginutils/dist/simple-filters.js +/opt/service_finder/frontend/node_modules/@rolldown/pluginutils/dist/utils.d.ts +/opt/service_finder/frontend/node_modules/@rolldown/pluginutils/dist/index.js +/opt/service_finder/frontend/node_modules/@rolldown/pluginutils/LICENSE +/opt/service_finder/frontend/node_modules/@rolldown/pluginutils/README.md +/opt/service_finder/frontend/node_modules/vue +/opt/service_finder/frontend/node_modules/vue/compiler-sfc +/opt/service_finder/frontend/node_modules/vue/compiler-sfc/index.d.ts +/opt/service_finder/frontend/node_modules/vue/compiler-sfc/index.browser.js +/opt/service_finder/frontend/node_modules/vue/compiler-sfc/index.browser.mjs +/opt/service_finder/frontend/node_modules/vue/compiler-sfc/package.json +/opt/service_finder/frontend/node_modules/vue/compiler-sfc/index.js +/opt/service_finder/frontend/node_modules/vue/compiler-sfc/register-ts.js +/opt/service_finder/frontend/node_modules/vue/compiler-sfc/index.d.mts +/opt/service_finder/frontend/node_modules/vue/compiler-sfc/index.mjs +/opt/service_finder/frontend/node_modules/vue/package.json +/opt/service_finder/frontend/node_modules/vue/dist +/opt/service_finder/frontend/node_modules/vue/dist/vue.esm-browser.prod.js +/opt/service_finder/frontend/node_modules/vue/dist/vue.d.mts +/opt/service_finder/frontend/node_modules/vue/dist/vue.cjs.prod.js +/opt/service_finder/frontend/node_modules/vue/dist/vue.global.prod.js +/opt/service_finder/frontend/node_modules/vue/dist/vue.cjs.js +/opt/service_finder/frontend/node_modules/vue/dist/vue.d.ts +/opt/service_finder/frontend/node_modules/vue/dist/vue.global.js +/opt/service_finder/frontend/node_modules/vue/dist/vue.runtime.esm-browser.prod.js +/opt/service_finder/frontend/node_modules/vue/dist/vue.runtime.global.js +/opt/service_finder/frontend/node_modules/vue/dist/vue.runtime.esm-bundler.js +/opt/service_finder/frontend/node_modules/vue/dist/vue.esm-browser.js +/opt/service_finder/frontend/node_modules/vue/dist/vue.runtime.global.prod.js +/opt/service_finder/frontend/node_modules/vue/dist/vue.runtime.esm-browser.js +/opt/service_finder/frontend/node_modules/vue/dist/vue.esm-bundler.js +/opt/service_finder/frontend/node_modules/vue/server-renderer +/opt/service_finder/frontend/node_modules/vue/server-renderer/index.d.ts +/opt/service_finder/frontend/node_modules/vue/server-renderer/package.json +/opt/service_finder/frontend/node_modules/vue/server-renderer/index.js +/opt/service_finder/frontend/node_modules/vue/server-renderer/index.d.mts +/opt/service_finder/frontend/node_modules/vue/server-renderer/index.mjs +/opt/service_finder/frontend/node_modules/vue/LICENSE +/opt/service_finder/frontend/node_modules/vue/index.js +/opt/service_finder/frontend/node_modules/vue/jsx.d.ts +/opt/service_finder/frontend/node_modules/vue/jsx-runtime +/opt/service_finder/frontend/node_modules/vue/jsx-runtime/index.d.ts +/opt/service_finder/frontend/node_modules/vue/jsx-runtime/package.json +/opt/service_finder/frontend/node_modules/vue/jsx-runtime/index.js +/opt/service_finder/frontend/node_modules/vue/jsx-runtime/index.mjs +/opt/service_finder/frontend/node_modules/vue/README.md +/opt/service_finder/frontend/node_modules/vue/index.mjs +/opt/service_finder/frontend/node_modules/delayed-stream +/opt/service_finder/frontend/node_modules/delayed-stream/License +/opt/service_finder/frontend/node_modules/delayed-stream/lib +/opt/service_finder/frontend/node_modules/delayed-stream/lib/delayed_stream.js +/opt/service_finder/frontend/node_modules/delayed-stream/package.json +/opt/service_finder/frontend/node_modules/delayed-stream/Readme.md +/opt/service_finder/frontend/node_modules/delayed-stream/.npmignore +/opt/service_finder/frontend/node_modules/delayed-stream/Makefile +/opt/service_finder/frontend/node_modules/lightningcss-linux-x64-gnu +/opt/service_finder/frontend/node_modules/lightningcss-linux-x64-gnu/package.json +/opt/service_finder/frontend/node_modules/lightningcss-linux-x64-gnu/lightningcss.linux-x64-gnu.node +/opt/service_finder/frontend/node_modules/lightningcss-linux-x64-gnu/LICENSE +/opt/service_finder/frontend/node_modules/lightningcss-linux-x64-gnu/README.md +/opt/service_finder/frontend/node_modules/magic-string +/opt/service_finder/frontend/node_modules/magic-string/package.json +/opt/service_finder/frontend/node_modules/magic-string/dist +/opt/service_finder/frontend/node_modules/magic-string/dist/magic-string.es.mjs.map +/opt/service_finder/frontend/node_modules/magic-string/dist/magic-string.es.d.mts +/opt/service_finder/frontend/node_modules/magic-string/dist/magic-string.es.mjs +/opt/service_finder/frontend/node_modules/magic-string/dist/magic-string.umd.js +/opt/service_finder/frontend/node_modules/magic-string/dist/magic-string.cjs.js.map +/opt/service_finder/frontend/node_modules/magic-string/dist/magic-string.cjs.js +/opt/service_finder/frontend/node_modules/magic-string/dist/magic-string.umd.js.map +/opt/service_finder/frontend/node_modules/magic-string/dist/magic-string.cjs.d.ts +/opt/service_finder/frontend/node_modules/magic-string/LICENSE +/opt/service_finder/frontend/node_modules/magic-string/README.md +/opt/service_finder/frontend/node_modules/es-define-property +/opt/service_finder/frontend/node_modules/es-define-property/index.d.ts +/opt/service_finder/frontend/node_modules/es-define-property/test +/opt/service_finder/frontend/node_modules/es-define-property/test/index.js +/opt/service_finder/frontend/node_modules/es-define-property/tsconfig.json +/opt/service_finder/frontend/node_modules/es-define-property/package.json +/opt/service_finder/frontend/node_modules/es-define-property/.github +/opt/service_finder/frontend/node_modules/es-define-property/.github/FUNDING.yml +/opt/service_finder/frontend/node_modules/es-define-property/.eslintrc +/opt/service_finder/frontend/node_modules/es-define-property/LICENSE +/opt/service_finder/frontend/node_modules/es-define-property/index.js +/opt/service_finder/frontend/node_modules/es-define-property/.nycrc +/opt/service_finder/frontend/node_modules/es-define-property/README.md +/opt/service_finder/frontend/node_modules/es-define-property/CHANGELOG.md +/opt/service_finder/frontend/node_modules/chart.js +/opt/service_finder/frontend/node_modules/chart.js/package.json +/opt/service_finder/frontend/node_modules/chart.js/dist +/opt/service_finder/frontend/node_modules/chart.js/dist/index.umd.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/plugins +/opt/service_finder/frontend/node_modules/chart.js/dist/plugins/index.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/plugins/plugin.colors.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/plugins/plugin.title.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/plugins/plugin.legend.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/plugins/plugin.filler +/opt/service_finder/frontend/node_modules/chart.js/dist/plugins/plugin.filler/filler.drawing.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/plugins/plugin.filler/filler.helper.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/plugins/plugin.filler/filler.options.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/plugins/plugin.filler/index.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/plugins/plugin.filler/filler.target.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/plugins/plugin.filler/filler.target.stack.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/plugins/plugin.filler/filler.segment.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/plugins/plugin.filler/simpleArc.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/plugins/plugin.tooltip.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/plugins/plugin.subtitle.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/plugins/plugin.decimation.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/chart.umd.min.js.map +/opt/service_finder/frontend/node_modules/chart.js/dist/core +/opt/service_finder/frontend/node_modules/chart.js/dist/core/core.scale.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/core/core.adapters.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/core/core.datasetController.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/core/core.typedRegistry.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/core/index.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/core/core.controller.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/core/core.scale.autoskip.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/core/core.animator.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/core/core.defaults.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/core/core.ticks.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/core/core.registry.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/core/core.scale.defaults.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/core/core.animation.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/core/core.interaction.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/core/core.animations.defaults.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/core/core.plugins.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/core/core.config.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/core/core.element.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/core/core.layouts.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/core/core.animations.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/core/core.layouts.defaults.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/chart.js.map +/opt/service_finder/frontend/node_modules/chart.js/dist/chart.umd.js +/opt/service_finder/frontend/node_modules/chart.js/dist/index.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/chart.js +/opt/service_finder/frontend/node_modules/chart.js/dist/chart.umd.js.map +/opt/service_finder/frontend/node_modules/chart.js/dist/platform +/opt/service_finder/frontend/node_modules/chart.js/dist/platform/index.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/platform/platform.basic.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/platform/platform.dom.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/platform/platform.base.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/types +/opt/service_finder/frontend/node_modules/chart.js/dist/types/index.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/types/animation.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/types/layout.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/types/color.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/types/geometric.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/types/basic.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/types/utils.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/types.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/helpers.cjs +/opt/service_finder/frontend/node_modules/chart.js/dist/controllers +/opt/service_finder/frontend/node_modules/chart.js/dist/controllers/controller.line.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/controllers/controller.radar.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/controllers/index.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/controllers/controller.pie.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/controllers/controller.doughnut.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/controllers/controller.scatter.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/controllers/controller.bubble.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/controllers/controller.polarArea.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/controllers/controller.bar.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/helpers +/opt/service_finder/frontend/node_modules/chart.js/dist/helpers/helpers.intl.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/helpers/helpers.curve.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/helpers/helpers.dataset.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/helpers/helpers.core.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/helpers/index.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/helpers/helpers.collection.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/helpers/helpers.dom.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/helpers/helpers.math.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/helpers/helpers.rtl.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/helpers/helpers.interpolation.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/helpers/helpers.options.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/helpers/helpers.easing.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/helpers/helpers.config.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/helpers/helpers.extras.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/helpers/helpers.config.types.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/helpers/helpers.color.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/helpers/helpers.segment.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/helpers/helpers.canvas.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/chart.umd.min.js +/opt/service_finder/frontend/node_modules/chart.js/dist/helpers.js +/opt/service_finder/frontend/node_modules/chart.js/dist/chart.cjs +/opt/service_finder/frontend/node_modules/chart.js/dist/helpers.js.map +/opt/service_finder/frontend/node_modules/chart.js/dist/elements +/opt/service_finder/frontend/node_modules/chart.js/dist/elements/index.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/elements/element.bar.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/elements/element.line.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/elements/element.point.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/elements/element.arc.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/chunks +/opt/service_finder/frontend/node_modules/chart.js/dist/chunks/helpers.dataset.js.map +/opt/service_finder/frontend/node_modules/chart.js/dist/chunks/helpers.dataset.cjs.map +/opt/service_finder/frontend/node_modules/chart.js/dist/chunks/helpers.dataset.cjs +/opt/service_finder/frontend/node_modules/chart.js/dist/chunks/helpers.dataset.js +/opt/service_finder/frontend/node_modules/chart.js/dist/scales +/opt/service_finder/frontend/node_modules/chart.js/dist/scales/index.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/scales/scale.logarithmic.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/scales/scale.linear.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/scales/scale.radialLinear.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/scales/scale.time.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/scales/scale.timeseries.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/scales/scale.category.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/scales/scale.linearbase.d.ts +/opt/service_finder/frontend/node_modules/chart.js/dist/helpers.cjs.map +/opt/service_finder/frontend/node_modules/chart.js/dist/chart.cjs.map +/opt/service_finder/frontend/node_modules/chart.js/helpers +/opt/service_finder/frontend/node_modules/chart.js/helpers/helpers.cjs +/opt/service_finder/frontend/node_modules/chart.js/helpers/package.json +/opt/service_finder/frontend/node_modules/chart.js/helpers/helpers.d.ts +/opt/service_finder/frontend/node_modules/chart.js/helpers/helpers.js +/opt/service_finder/frontend/node_modules/chart.js/LICENSE.md +/opt/service_finder/frontend/node_modules/chart.js/README.md +/opt/service_finder/frontend/node_modules/chart.js/auto +/opt/service_finder/frontend/node_modules/chart.js/auto/package.json +/opt/service_finder/frontend/node_modules/chart.js/auto/auto.d.ts +/opt/service_finder/frontend/node_modules/chart.js/auto/auto.cjs +/opt/service_finder/frontend/node_modules/chart.js/auto/auto.js +/opt/service_finder/frontend/node_modules/lightningcss +/opt/service_finder/frontend/node_modules/lightningcss/node +/opt/service_finder/frontend/node_modules/lightningcss/node/composeVisitors.js +/opt/service_finder/frontend/node_modules/lightningcss/node/index.d.ts +/opt/service_finder/frontend/node_modules/lightningcss/node/targets.js.flow +/opt/service_finder/frontend/node_modules/lightningcss/node/flags.js +/opt/service_finder/frontend/node_modules/lightningcss/node/ast.d.ts +/opt/service_finder/frontend/node_modules/lightningcss/node/ast.js.flow +/opt/service_finder/frontend/node_modules/lightningcss/node/targets.d.ts +/opt/service_finder/frontend/node_modules/lightningcss/node/browserslistToTargets.js +/opt/service_finder/frontend/node_modules/lightningcss/node/index.js.flow +/opt/service_finder/frontend/node_modules/lightningcss/node/index.js +/opt/service_finder/frontend/node_modules/lightningcss/node/index.mjs +/opt/service_finder/frontend/node_modules/lightningcss/package.json +/opt/service_finder/frontend/node_modules/lightningcss/LICENSE +/opt/service_finder/frontend/node_modules/lightningcss/README.md +/opt/service_finder/frontend/node_modules/form-data +/opt/service_finder/frontend/node_modules/form-data/License +/opt/service_finder/frontend/node_modules/form-data/index.d.ts +/opt/service_finder/frontend/node_modules/form-data/lib +/opt/service_finder/frontend/node_modules/form-data/lib/browser.js +/opt/service_finder/frontend/node_modules/form-data/lib/populate.js +/opt/service_finder/frontend/node_modules/form-data/lib/form_data.js +/opt/service_finder/frontend/node_modules/form-data/package.json +/opt/service_finder/frontend/node_modules/form-data/README.md +/opt/service_finder/frontend/node_modules/form-data/CHANGELOG.md +/opt/service_finder/frontend/node_modules/graceful-fs +/opt/service_finder/frontend/node_modules/graceful-fs/package.json +/opt/service_finder/frontend/node_modules/graceful-fs/polyfills.js +/opt/service_finder/frontend/node_modules/graceful-fs/clone.js +/opt/service_finder/frontend/node_modules/graceful-fs/legacy-streams.js +/opt/service_finder/frontend/node_modules/graceful-fs/LICENSE +/opt/service_finder/frontend/node_modules/graceful-fs/README.md +/opt/service_finder/frontend/node_modules/graceful-fs/graceful-fs.js +/opt/service_finder/frontend/node_modules/node-releases +/opt/service_finder/frontend/node_modules/node-releases/package.json +/opt/service_finder/frontend/node_modules/node-releases/data +/opt/service_finder/frontend/node_modules/node-releases/data/processed +/opt/service_finder/frontend/node_modules/node-releases/data/processed/envs.json +/opt/service_finder/frontend/node_modules/node-releases/data/release-schedule +/opt/service_finder/frontend/node_modules/node-releases/data/release-schedule/release-schedule.json +/opt/service_finder/frontend/node_modules/node-releases/LICENSE +/opt/service_finder/frontend/node_modules/node-releases/README.md +/opt/service_finder/frontend/node_modules/@babel +/opt/service_finder/frontend/node_modules/@babel/helper-string-parser +/opt/service_finder/frontend/node_modules/@babel/helper-string-parser/lib +/opt/service_finder/frontend/node_modules/@babel/helper-string-parser/lib/index.js +/opt/service_finder/frontend/node_modules/@babel/helper-string-parser/lib/index.js.map +/opt/service_finder/frontend/node_modules/@babel/helper-string-parser/package.json +/opt/service_finder/frontend/node_modules/@babel/helper-string-parser/LICENSE +/opt/service_finder/frontend/node_modules/@babel/helper-string-parser/README.md +/opt/service_finder/frontend/node_modules/@babel/generator +/opt/service_finder/frontend/node_modules/@babel/generator/lib +/opt/service_finder/frontend/node_modules/@babel/generator/lib/token-map.js +/opt/service_finder/frontend/node_modules/@babel/generator/lib/node +/opt/service_finder/frontend/node_modules/@babel/generator/lib/node/parentheses.js +/opt/service_finder/frontend/node_modules/@babel/generator/lib/node/whitespace.js.map +/opt/service_finder/frontend/node_modules/@babel/generator/lib/node/parentheses.js.map +/opt/service_finder/frontend/node_modules/@babel/generator/lib/node/index.js +/opt/service_finder/frontend/node_modules/@babel/generator/lib/node/whitespace.js +/opt/service_finder/frontend/node_modules/@babel/generator/lib/node/index.js.map +/opt/service_finder/frontend/node_modules/@babel/generator/lib/buffer.js +/opt/service_finder/frontend/node_modules/@babel/generator/lib/token-map.js.map +/opt/service_finder/frontend/node_modules/@babel/generator/lib/source-map.js.map +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators/methods.js.map +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators/deprecated.js +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators/jsx.js +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators/statements.js.map +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators/expressions.js +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators/modules.js.map +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators/flow.js +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators/classes.js.map +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators/deprecated.js.map +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators/template-literals.js +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators/jsx.js.map +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators/modules.js +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators/classes.js +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators/expressions.js.map +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators/index.js +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators/template-literals.js.map +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators/flow.js.map +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators/base.js.map +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators/typescript.js.map +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators/types.js.map +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators/types.js +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators/base.js +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators/statements.js +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators/typescript.js +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators/index.js.map +/opt/service_finder/frontend/node_modules/@babel/generator/lib/generators/methods.js +/opt/service_finder/frontend/node_modules/@babel/generator/lib/source-map.js +/opt/service_finder/frontend/node_modules/@babel/generator/lib/index.js +/opt/service_finder/frontend/node_modules/@babel/generator/lib/printer.js +/opt/service_finder/frontend/node_modules/@babel/generator/lib/printer.js.map +/opt/service_finder/frontend/node_modules/@babel/generator/lib/buffer.js.map +/opt/service_finder/frontend/node_modules/@babel/generator/lib/index.js.map +/opt/service_finder/frontend/node_modules/@babel/generator/package.json +/opt/service_finder/frontend/node_modules/@babel/generator/LICENSE +/opt/service_finder/frontend/node_modules/@babel/generator/README.md +/opt/service_finder/frontend/node_modules/@babel/types +/opt/service_finder/frontend/node_modules/@babel/types/lib +/opt/service_finder/frontend/node_modules/@babel/types/lib/retrievers +/opt/service_finder/frontend/node_modules/@babel/types/lib/retrievers/getOuterBindingIdentifiers.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/retrievers/getBindingIdentifiers.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/retrievers/getAssignmentIdentifiers.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/retrievers/getFunctionName.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/retrievers/getAssignmentIdentifiers.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/retrievers/getOuterBindingIdentifiers.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/retrievers/getFunctionName.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/retrievers/getBindingIdentifiers.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/clone +/opt/service_finder/frontend/node_modules/@babel/types/lib/clone/cloneDeepWithoutLoc.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/clone/cloneDeepWithoutLoc.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/clone/clone.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/clone/cloneNode.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/clone/cloneDeep.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/clone/clone.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/clone/cloneNode.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/clone/cloneDeep.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/clone/cloneWithoutLoc.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/clone/cloneWithoutLoc.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/comments +/opt/service_finder/frontend/node_modules/@babel/types/lib/comments/inheritsComments.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/comments/removeComments.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/comments/inheritTrailingComments.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/comments/inheritTrailingComments.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/comments/inheritInnerComments.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/comments/inheritLeadingComments.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/comments/addComments.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/comments/addComment.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/comments/removeComments.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/comments/inheritLeadingComments.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/comments/inheritInnerComments.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/comments/inheritsComments.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/comments/addComments.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/comments/addComment.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/index.d.ts +/opt/service_finder/frontend/node_modules/@babel/types/lib/utils +/opt/service_finder/frontend/node_modules/@babel/types/lib/utils/deprecationWarning.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/utils/shallowEqual.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/utils/react +/opt/service_finder/frontend/node_modules/@babel/types/lib/utils/react/cleanJSXElementLiteralChild.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/utils/react/cleanJSXElementLiteralChild.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/utils/shallowEqual.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/utils/inherit.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/utils/deprecationWarning.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/utils/inherit.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/converters +/opt/service_finder/frontend/node_modules/@babel/types/lib/converters/gatherSequenceExpressions.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/converters/toExpression.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/converters/toIdentifier.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/converters/toKeyAlias.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/converters/toBindingIdentifierName.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/converters/toBlock.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/converters/ensureBlock.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/converters/gatherSequenceExpressions.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/converters/toSequenceExpression.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/converters/toBlock.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/converters/toSequenceExpression.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/converters/toStatement.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/converters/toExpression.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/converters/toComputedKey.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/converters/toComputedKey.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/converters/valueToNode.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/converters/toBindingIdentifierName.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/converters/toStatement.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/converters/valueToNode.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/converters/ensureBlock.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/converters/toKeyAlias.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/converters/toIdentifier.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/traverse +/opt/service_finder/frontend/node_modules/@babel/types/lib/traverse/traverseFast.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/traverse/traverse.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/traverse/traverseFast.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/traverse/traverse.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/index-legacy.d.ts +/opt/service_finder/frontend/node_modules/@babel/types/lib/asserts +/opt/service_finder/frontend/node_modules/@babel/types/lib/asserts/assertNode.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/asserts/assertNode.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/asserts/generated +/opt/service_finder/frontend/node_modules/@babel/types/lib/asserts/generated/index.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/asserts/generated/index.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/modifications +/opt/service_finder/frontend/node_modules/@babel/types/lib/modifications/typescript +/opt/service_finder/frontend/node_modules/@babel/types/lib/modifications/typescript/removeTypeDuplicates.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/modifications/typescript/removeTypeDuplicates.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/modifications/appendToMemberExpression.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/modifications/inherits.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/modifications/appendToMemberExpression.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/modifications/removePropertiesDeep.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/modifications/removePropertiesDeep.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/modifications/removeProperties.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/modifications/flow +/opt/service_finder/frontend/node_modules/@babel/types/lib/modifications/flow/removeTypeDuplicates.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/modifications/flow/removeTypeDuplicates.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/modifications/prependToMemberExpression.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/modifications/prependToMemberExpression.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/modifications/inherits.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/modifications/removeProperties.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/index.js.flow +/opt/service_finder/frontend/node_modules/@babel/types/lib/constants +/opt/service_finder/frontend/node_modules/@babel/types/lib/constants/index.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/constants/index.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/constants/generated +/opt/service_finder/frontend/node_modules/@babel/types/lib/constants/generated/index.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/constants/generated/index.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/index.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/builders +/opt/service_finder/frontend/node_modules/@babel/types/lib/builders/typescript +/opt/service_finder/frontend/node_modules/@babel/types/lib/builders/typescript/createTSUnionType.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/builders/typescript/createTSUnionType.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/builders/validateNode.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/builders/react +/opt/service_finder/frontend/node_modules/@babel/types/lib/builders/react/buildChildren.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/builders/react/buildChildren.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/builders/productions.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/builders/productions.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/builders/flow +/opt/service_finder/frontend/node_modules/@babel/types/lib/builders/flow/createTypeAnnotationBasedOnTypeof.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/builders/flow/createFlowUnionType.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/builders/flow/createFlowUnionType.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/builders/flow/createTypeAnnotationBasedOnTypeof.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/builders/validateNode.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/builders/generated +/opt/service_finder/frontend/node_modules/@babel/types/lib/builders/generated/lowercase.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/builders/generated/uppercase.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/builders/generated/uppercase.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/builders/generated/index.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/builders/generated/index.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/builders/generated/lowercase.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/definitions +/opt/service_finder/frontend/node_modules/@babel/types/lib/definitions/jsx.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/definitions/experimental.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/definitions/experimental.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/definitions/misc.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/definitions/core.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/definitions/flow.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/definitions/deprecated-aliases.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/definitions/utils.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/definitions/jsx.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/definitions/placeholders.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/definitions/core.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/definitions/deprecated-aliases.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/definitions/index.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/definitions/misc.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/definitions/placeholders.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/definitions/flow.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/definitions/typescript.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/definitions/typescript.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/definitions/utils.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/definitions/index.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/ast-types +/opt/service_finder/frontend/node_modules/@babel/types/lib/ast-types/generated +/opt/service_finder/frontend/node_modules/@babel/types/lib/ast-types/generated/index.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/ast-types/generated/index.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isBinding.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/is.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isValidIdentifier.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isLet.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isScope.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isValidES3Identifier.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isBlockScoped.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/validate.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isNodesEquivalent.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isType.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isNode.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/matchesPattern.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isPlaceholderType.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/react +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/react/isCompatTag.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/react/isReactComponent.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/react/isCompatTag.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/react/isReactComponent.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isSpecifierDefault.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isBlockScoped.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/buildMatchMemberExpression.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isValidES3Identifier.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isBinding.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isNode.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isNodesEquivalent.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isImmutable.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isLet.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isType.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isPlaceholderType.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isVar.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isReferenced.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isScope.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/validate.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isValidIdentifier.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/buildMatchMemberExpression.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isSpecifierDefault.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isReferenced.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isVar.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/isImmutable.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/generated +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/generated/index.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/generated/index.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/matchesPattern.js.map +/opt/service_finder/frontend/node_modules/@babel/types/lib/validators/is.js +/opt/service_finder/frontend/node_modules/@babel/types/lib/index.js.map +/opt/service_finder/frontend/node_modules/@babel/types/package.json +/opt/service_finder/frontend/node_modules/@babel/types/LICENSE +/opt/service_finder/frontend/node_modules/@babel/types/README.md +/opt/service_finder/frontend/node_modules/@babel/parser +/opt/service_finder/frontend/node_modules/@babel/parser/lib +/opt/service_finder/frontend/node_modules/@babel/parser/lib/index.js +/opt/service_finder/frontend/node_modules/@babel/parser/lib/index.js.map +/opt/service_finder/frontend/node_modules/@babel/parser/package.json +/opt/service_finder/frontend/node_modules/@babel/parser/bin +/opt/service_finder/frontend/node_modules/@babel/parser/bin/babel-parser.js +/opt/service_finder/frontend/node_modules/@babel/parser/LICENSE +/opt/service_finder/frontend/node_modules/@babel/parser/README.md +/opt/service_finder/frontend/node_modules/@babel/parser/CHANGELOG.md +/opt/service_finder/frontend/node_modules/@babel/parser/typings +/opt/service_finder/frontend/node_modules/@babel/parser/typings/babel-parser.d.ts +/opt/service_finder/frontend/node_modules/@babel/helper-validator-identifier +/opt/service_finder/frontend/node_modules/@babel/helper-validator-identifier/lib +/opt/service_finder/frontend/node_modules/@babel/helper-validator-identifier/lib/identifier.js.map +/opt/service_finder/frontend/node_modules/@babel/helper-validator-identifier/lib/keyword.js +/opt/service_finder/frontend/node_modules/@babel/helper-validator-identifier/lib/index.js +/opt/service_finder/frontend/node_modules/@babel/helper-validator-identifier/lib/identifier.js +/opt/service_finder/frontend/node_modules/@babel/helper-validator-identifier/lib/keyword.js.map +/opt/service_finder/frontend/node_modules/@babel/helper-validator-identifier/lib/index.js.map +/opt/service_finder/frontend/node_modules/@babel/helper-validator-identifier/package.json +/opt/service_finder/frontend/node_modules/@babel/helper-validator-identifier/LICENSE +/opt/service_finder/frontend/node_modules/@babel/helper-validator-identifier/README.md +/opt/service_finder/frontend/node_modules/electron-to-chromium +/opt/service_finder/frontend/node_modules/electron-to-chromium/versions.js +/opt/service_finder/frontend/node_modules/electron-to-chromium/full-chromium-versions.json +/opt/service_finder/frontend/node_modules/electron-to-chromium/full-versions.json +/opt/service_finder/frontend/node_modules/electron-to-chromium/package.json +/opt/service_finder/frontend/node_modules/electron-to-chromium/full-versions.js +/opt/service_finder/frontend/node_modules/electron-to-chromium/LICENSE +/opt/service_finder/frontend/node_modules/electron-to-chromium/versions.json +/opt/service_finder/frontend/node_modules/electron-to-chromium/index.js +/opt/service_finder/frontend/node_modules/electron-to-chromium/chromium-versions.json +/opt/service_finder/frontend/node_modules/electron-to-chromium/chromium-versions.js +/opt/service_finder/frontend/node_modules/electron-to-chromium/README.md +/opt/service_finder/frontend/node_modules/electron-to-chromium/full-chromium-versions.js +/opt/service_finder/frontend/node_modules/webpack-virtual-modules +/opt/service_finder/frontend/node_modules/webpack-virtual-modules/src +/opt/service_finder/frontend/node_modules/webpack-virtual-modules/src/index.ts +/opt/service_finder/frontend/node_modules/webpack-virtual-modules/src/virtual-stats.ts +/opt/service_finder/frontend/node_modules/webpack-virtual-modules/lib +/opt/service_finder/frontend/node_modules/webpack-virtual-modules/lib/virtual-stats.js.map +/opt/service_finder/frontend/node_modules/webpack-virtual-modules/lib/index.d.ts +/opt/service_finder/frontend/node_modules/webpack-virtual-modules/lib/virtual-stats.js +/opt/service_finder/frontend/node_modules/webpack-virtual-modules/lib/index.js +/opt/service_finder/frontend/node_modules/webpack-virtual-modules/lib/virtual-stats.d.ts +/opt/service_finder/frontend/node_modules/webpack-virtual-modules/lib/index.js.map +/opt/service_finder/frontend/node_modules/webpack-virtual-modules/package.json +/opt/service_finder/frontend/node_modules/webpack-virtual-modules/LICENSE +/opt/service_finder/frontend/node_modules/webpack-virtual-modules/README.md +/opt/service_finder/frontend/node_modules/mime-types +/opt/service_finder/frontend/node_modules/mime-types/HISTORY.md +/opt/service_finder/frontend/node_modules/mime-types/package.json +/opt/service_finder/frontend/node_modules/mime-types/LICENSE +/opt/service_finder/frontend/node_modules/mime-types/index.js +/opt/service_finder/frontend/node_modules/mime-types/README.md +/opt/service_finder/frontend/node_modules/has-tostringtag +/opt/service_finder/frontend/node_modules/has-tostringtag/shams.js +/opt/service_finder/frontend/node_modules/has-tostringtag/index.d.ts +/opt/service_finder/frontend/node_modules/has-tostringtag/shams.d.ts +/opt/service_finder/frontend/node_modules/has-tostringtag/test +/opt/service_finder/frontend/node_modules/has-tostringtag/test/index.js +/opt/service_finder/frontend/node_modules/has-tostringtag/test/tests.js +/opt/service_finder/frontend/node_modules/has-tostringtag/test/shams +/opt/service_finder/frontend/node_modules/has-tostringtag/test/shams/get-own-property-symbols.js +/opt/service_finder/frontend/node_modules/has-tostringtag/test/shams/core-js.js +/opt/service_finder/frontend/node_modules/has-tostringtag/tsconfig.json +/opt/service_finder/frontend/node_modules/has-tostringtag/package.json +/opt/service_finder/frontend/node_modules/has-tostringtag/.github +/opt/service_finder/frontend/node_modules/has-tostringtag/.github/FUNDING.yml +/opt/service_finder/frontend/node_modules/has-tostringtag/.eslintrc +/opt/service_finder/frontend/node_modules/has-tostringtag/LICENSE +/opt/service_finder/frontend/node_modules/has-tostringtag/index.js +/opt/service_finder/frontend/node_modules/has-tostringtag/.nycrc +/opt/service_finder/frontend/node_modules/has-tostringtag/README.md +/opt/service_finder/frontend/node_modules/has-tostringtag/CHANGELOG.md +/opt/service_finder/frontend/node_modules/picocolors +/opt/service_finder/frontend/node_modules/picocolors/picocolors.browser.js +/opt/service_finder/frontend/node_modules/picocolors/picocolors.d.ts +/opt/service_finder/frontend/node_modules/picocolors/types.d.ts +/opt/service_finder/frontend/node_modules/picocolors/package.json +/opt/service_finder/frontend/node_modules/picocolors/picocolors.js +/opt/service_finder/frontend/node_modules/picocolors/LICENSE +/opt/service_finder/frontend/node_modules/picocolors/README.md +/opt/service_finder/frontend/node_modules/browserslist +/opt/service_finder/frontend/node_modules/browserslist/error.js +/opt/service_finder/frontend/node_modules/browserslist/browser.js +/opt/service_finder/frontend/node_modules/browserslist/index.d.ts +/opt/service_finder/frontend/node_modules/browserslist/node.js +/opt/service_finder/frontend/node_modules/browserslist/package.json +/opt/service_finder/frontend/node_modules/browserslist/LICENSE +/opt/service_finder/frontend/node_modules/browserslist/index.js +/opt/service_finder/frontend/node_modules/browserslist/parse.js +/opt/service_finder/frontend/node_modules/browserslist/error.d.ts +/opt/service_finder/frontend/node_modules/browserslist/README.md +/opt/service_finder/frontend/node_modules/browserslist/cli.js +/opt/service_finder/frontend/node_modules/unplugin +/opt/service_finder/frontend/node_modules/unplugin/package.json +/opt/service_finder/frontend/node_modules/unplugin/dist +/opt/service_finder/frontend/node_modules/unplugin/dist/utils-BosfZ0pB.js +/opt/service_finder/frontend/node_modules/unplugin/dist/webpack-like-DDVwPJ4e.cjs +/opt/service_finder/frontend/node_modules/unplugin/dist/index.d.ts +/opt/service_finder/frontend/node_modules/unplugin/dist/webpack-like-DFGTNSuV.js +/opt/service_finder/frontend/node_modules/unplugin/dist/index.cjs +/opt/service_finder/frontend/node_modules/unplugin/dist/context-CQfDPcdE.cjs +/opt/service_finder/frontend/node_modules/unplugin/dist/context-CrbHoDid.cjs +/opt/service_finder/frontend/node_modules/unplugin/dist/utils-CJMEEaD7.cjs +/opt/service_finder/frontend/node_modules/unplugin/dist/index.js +/opt/service_finder/frontend/node_modules/unplugin/dist/context-OCFO8EW1.js +/opt/service_finder/frontend/node_modules/unplugin/dist/context-DkYlx1xL.js +/opt/service_finder/frontend/node_modules/unplugin/dist/webpack +/opt/service_finder/frontend/node_modules/unplugin/dist/webpack/loaders +/opt/service_finder/frontend/node_modules/unplugin/dist/webpack/loaders/transform.cjs +/opt/service_finder/frontend/node_modules/unplugin/dist/webpack/loaders/load.d.ts +/opt/service_finder/frontend/node_modules/unplugin/dist/webpack/loaders/transform.d.cts +/opt/service_finder/frontend/node_modules/unplugin/dist/webpack/loaders/load.d.cts +/opt/service_finder/frontend/node_modules/unplugin/dist/webpack/loaders/load.cjs +/opt/service_finder/frontend/node_modules/unplugin/dist/webpack/loaders/transform.js +/opt/service_finder/frontend/node_modules/unplugin/dist/webpack/loaders/load.js +/opt/service_finder/frontend/node_modules/unplugin/dist/webpack/loaders/transform.d.ts +/opt/service_finder/frontend/node_modules/unplugin/dist/context-D7WFmOmt.cjs +/opt/service_finder/frontend/node_modules/unplugin/dist/context-Csj9j3eN.js +/opt/service_finder/frontend/node_modules/unplugin/dist/rspack +/opt/service_finder/frontend/node_modules/unplugin/dist/rspack/loaders +/opt/service_finder/frontend/node_modules/unplugin/dist/rspack/loaders/transform.cjs +/opt/service_finder/frontend/node_modules/unplugin/dist/rspack/loaders/load.d.ts +/opt/service_finder/frontend/node_modules/unplugin/dist/rspack/loaders/transform.d.cts +/opt/service_finder/frontend/node_modules/unplugin/dist/rspack/loaders/load.d.cts +/opt/service_finder/frontend/node_modules/unplugin/dist/rspack/loaders/load.cjs +/opt/service_finder/frontend/node_modules/unplugin/dist/rspack/loaders/transform.js +/opt/service_finder/frontend/node_modules/unplugin/dist/rspack/loaders/load.js +/opt/service_finder/frontend/node_modules/unplugin/dist/rspack/loaders/transform.d.ts +/opt/service_finder/frontend/node_modules/unplugin/dist/index.d.cts +/opt/service_finder/frontend/node_modules/unplugin/LICENSE +/opt/service_finder/frontend/node_modules/unplugin/README.md +/opt/service_finder/frontend/node_modules/hasown +/opt/service_finder/frontend/node_modules/hasown/index.d.ts +/opt/service_finder/frontend/node_modules/hasown/tsconfig.json +/opt/service_finder/frontend/node_modules/hasown/package.json +/opt/service_finder/frontend/node_modules/hasown/.github +/opt/service_finder/frontend/node_modules/hasown/.github/FUNDING.yml +/opt/service_finder/frontend/node_modules/hasown/.eslintrc +/opt/service_finder/frontend/node_modules/hasown/LICENSE +/opt/service_finder/frontend/node_modules/hasown/index.js +/opt/service_finder/frontend/node_modules/hasown/.nycrc +/opt/service_finder/frontend/node_modules/hasown/README.md +/opt/service_finder/frontend/node_modules/hasown/CHANGELOG.md +/opt/service_finder/frontend/node_modules/autoprefixer +/opt/service_finder/frontend/node_modules/autoprefixer/lib +/opt/service_finder/frontend/node_modules/autoprefixer/lib/vendor.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/prefixes.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/browsers.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/at-rule.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/supports.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/processor.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/value.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/info.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/prefixer.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/old-selector.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/resolution.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/utils.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/placeholder.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/inline-logical.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/mask-border.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/transform-decl.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/flex-basis.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/filter.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/overscroll-behavior.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/grid-area.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/grid-row-align.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/display-grid.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/image-rendering.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/grid-row-column.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/break-props.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/flex-direction.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/text-decoration.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/gradient.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/grid-column-align.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/justify-content.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/intrinsic.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/background-size.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/grid-end.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/align-content.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/filter-value.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/flex-shrink.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/autofill.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/background-clip.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/pixelated.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/cross-fade.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/place-self.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/align-items.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/order.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/grid-template.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/flex.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/print-color-adjust.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/grid-template-areas.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/appearance.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/flex-spec.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/file-selector-button.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/grid-rows-columns.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/grid-utils.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/display-flex.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/text-decoration-skip-ink.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/writing-mode.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/flex-wrap.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/block-logical.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/image-set.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/animation.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/border-radius.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/text-emphasis-position.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/fullscreen.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/grid-start.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/align-self.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/backdrop-filter.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/mask-composite.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/flex-flow.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/placeholder-shown.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/border-image.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/user-select.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/hacks/flex-grow.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/transition.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/autoprefixer.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/brackets.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/autoprefixer.d.ts +/opt/service_finder/frontend/node_modules/autoprefixer/lib/old-value.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/declaration.js +/opt/service_finder/frontend/node_modules/autoprefixer/lib/selector.js +/opt/service_finder/frontend/node_modules/autoprefixer/package.json +/opt/service_finder/frontend/node_modules/autoprefixer/bin +/opt/service_finder/frontend/node_modules/autoprefixer/bin/autoprefixer +/opt/service_finder/frontend/node_modules/autoprefixer/data +/opt/service_finder/frontend/node_modules/autoprefixer/data/prefixes.js +/opt/service_finder/frontend/node_modules/autoprefixer/LICENSE +/opt/service_finder/frontend/node_modules/autoprefixer/README.md +/opt/service_finder/frontend/node_modules/acorn +/opt/service_finder/frontend/node_modules/acorn/package.json +/opt/service_finder/frontend/node_modules/acorn/dist +/opt/service_finder/frontend/node_modules/acorn/dist/acorn.d.ts +/opt/service_finder/frontend/node_modules/acorn/dist/acorn.d.mts +/opt/service_finder/frontend/node_modules/acorn/dist/acorn.js +/opt/service_finder/frontend/node_modules/acorn/dist/acorn.mjs +/opt/service_finder/frontend/node_modules/acorn/dist/bin.js +/opt/service_finder/frontend/node_modules/acorn/bin +/opt/service_finder/frontend/node_modules/acorn/bin/acorn +/opt/service_finder/frontend/node_modules/acorn/LICENSE +/opt/service_finder/frontend/node_modules/acorn/README.md +/opt/service_finder/frontend/node_modules/acorn/CHANGELOG.md +/opt/service_finder/frontend/node_modules/magic-string-ast +/opt/service_finder/frontend/node_modules/magic-string-ast/package.json +/opt/service_finder/frontend/node_modules/magic-string-ast/dist +/opt/service_finder/frontend/node_modules/magic-string-ast/dist/index.d.ts +/opt/service_finder/frontend/node_modules/magic-string-ast/dist/index.js +/opt/service_finder/frontend/node_modules/magic-string-ast/LICENSE +/opt/service_finder/frontend/node_modules/magic-string-ast/README.md +/opt/service_finder/frontend/node_modules/es-errors +/opt/service_finder/frontend/node_modules/es-errors/range.d.ts +/opt/service_finder/frontend/node_modules/es-errors/eval.d.ts +/opt/service_finder/frontend/node_modules/es-errors/eval.js +/opt/service_finder/frontend/node_modules/es-errors/index.d.ts +/opt/service_finder/frontend/node_modules/es-errors/test +/opt/service_finder/frontend/node_modules/es-errors/test/index.js +/opt/service_finder/frontend/node_modules/es-errors/syntax.d.ts +/opt/service_finder/frontend/node_modules/es-errors/tsconfig.json +/opt/service_finder/frontend/node_modules/es-errors/package.json +/opt/service_finder/frontend/node_modules/es-errors/ref.d.ts +/opt/service_finder/frontend/node_modules/es-errors/syntax.js +/opt/service_finder/frontend/node_modules/es-errors/type.d.ts +/opt/service_finder/frontend/node_modules/es-errors/.github +/opt/service_finder/frontend/node_modules/es-errors/.github/FUNDING.yml +/opt/service_finder/frontend/node_modules/es-errors/.eslintrc +/opt/service_finder/frontend/node_modules/es-errors/ref.js +/opt/service_finder/frontend/node_modules/es-errors/LICENSE +/opt/service_finder/frontend/node_modules/es-errors/index.js +/opt/service_finder/frontend/node_modules/es-errors/uri.js +/opt/service_finder/frontend/node_modules/es-errors/type.js +/opt/service_finder/frontend/node_modules/es-errors/uri.d.ts +/opt/service_finder/frontend/node_modules/es-errors/README.md +/opt/service_finder/frontend/node_modules/es-errors/range.js +/opt/service_finder/frontend/node_modules/es-errors/CHANGELOG.md +/opt/service_finder/frontend/node_modules/jiti +/opt/service_finder/frontend/node_modules/jiti/lib +/opt/service_finder/frontend/node_modules/jiti/lib/jiti.d.mts +/opt/service_finder/frontend/node_modules/jiti/lib/jiti.cjs +/opt/service_finder/frontend/node_modules/jiti/lib/types.d.ts +/opt/service_finder/frontend/node_modules/jiti/lib/jiti-hooks.mjs +/opt/service_finder/frontend/node_modules/jiti/lib/jiti-register.mjs +/opt/service_finder/frontend/node_modules/jiti/lib/jiti-register.d.mts +/opt/service_finder/frontend/node_modules/jiti/lib/jiti-native.mjs +/opt/service_finder/frontend/node_modules/jiti/lib/jiti-cli.mjs +/opt/service_finder/frontend/node_modules/jiti/lib/jiti.mjs +/opt/service_finder/frontend/node_modules/jiti/lib/jiti.d.cts +/opt/service_finder/frontend/node_modules/jiti/package.json +/opt/service_finder/frontend/node_modules/jiti/dist +/opt/service_finder/frontend/node_modules/jiti/dist/jiti.cjs +/opt/service_finder/frontend/node_modules/jiti/dist/babel.cjs +/opt/service_finder/frontend/node_modules/jiti/LICENSE +/opt/service_finder/frontend/node_modules/jiti/README.md +/opt/service_finder/frontend/node_modules/mime-db +/opt/service_finder/frontend/node_modules/mime-db/HISTORY.md +/opt/service_finder/frontend/node_modules/mime-db/package.json +/opt/service_finder/frontend/node_modules/mime-db/LICENSE +/opt/service_finder/frontend/node_modules/mime-db/index.js +/opt/service_finder/frontend/node_modules/mime-db/README.md +/opt/service_finder/frontend/node_modules/mime-db/db.json +/opt/service_finder/frontend/node_modules/combined-stream +/opt/service_finder/frontend/node_modules/combined-stream/License +/opt/service_finder/frontend/node_modules/combined-stream/yarn.lock +/opt/service_finder/frontend/node_modules/combined-stream/lib +/opt/service_finder/frontend/node_modules/combined-stream/lib/combined_stream.js +/opt/service_finder/frontend/node_modules/combined-stream/package.json +/opt/service_finder/frontend/node_modules/combined-stream/Readme.md +/opt/service_finder/frontend/node_modules/@alloc +/opt/service_finder/frontend/node_modules/@alloc/quick-lru +/opt/service_finder/frontend/node_modules/@alloc/quick-lru/readme.md +/opt/service_finder/frontend/node_modules/@alloc/quick-lru/license +/opt/service_finder/frontend/node_modules/@alloc/quick-lru/index.d.ts +/opt/service_finder/frontend/node_modules/@alloc/quick-lru/package.json +/opt/service_finder/frontend/node_modules/@alloc/quick-lru/index.js +/opt/service_finder/frontend/node_modules/@tailwindcss +/opt/service_finder/frontend/node_modules/@tailwindcss/postcss +/opt/service_finder/frontend/node_modules/@tailwindcss/postcss/package.json +/opt/service_finder/frontend/node_modules/@tailwindcss/postcss/dist +/opt/service_finder/frontend/node_modules/@tailwindcss/postcss/dist/index.d.ts +/opt/service_finder/frontend/node_modules/@tailwindcss/postcss/dist/index.js +/opt/service_finder/frontend/node_modules/@tailwindcss/postcss/dist/index.d.mts +/opt/service_finder/frontend/node_modules/@tailwindcss/postcss/dist/index.mjs +/opt/service_finder/frontend/node_modules/@tailwindcss/postcss/LICENSE +/opt/service_finder/frontend/node_modules/@tailwindcss/postcss/README.md +/opt/service_finder/frontend/node_modules/@tailwindcss/node +/opt/service_finder/frontend/node_modules/@tailwindcss/node/package.json +/opt/service_finder/frontend/node_modules/@tailwindcss/node/dist +/opt/service_finder/frontend/node_modules/@tailwindcss/node/dist/index.d.ts +/opt/service_finder/frontend/node_modules/@tailwindcss/node/dist/esm-cache.loader.mjs +/opt/service_finder/frontend/node_modules/@tailwindcss/node/dist/require-cache.d.ts +/opt/service_finder/frontend/node_modules/@tailwindcss/node/dist/esm-cache.loader.d.mts +/opt/service_finder/frontend/node_modules/@tailwindcss/node/dist/index.js +/opt/service_finder/frontend/node_modules/@tailwindcss/node/dist/index.d.mts +/opt/service_finder/frontend/node_modules/@tailwindcss/node/dist/require-cache.js +/opt/service_finder/frontend/node_modules/@tailwindcss/node/dist/index.mjs +/opt/service_finder/frontend/node_modules/@tailwindcss/node/LICENSE +/opt/service_finder/frontend/node_modules/@tailwindcss/node/README.md +/opt/service_finder/frontend/node_modules/@tailwindcss/oxide-linux-x64-gnu +/opt/service_finder/frontend/node_modules/@tailwindcss/oxide-linux-x64-gnu/tailwindcss-oxide.linux-x64-gnu.node +/opt/service_finder/frontend/node_modules/@tailwindcss/oxide-linux-x64-gnu/package.json +/opt/service_finder/frontend/node_modules/@tailwindcss/oxide-linux-x64-gnu/LICENSE +/opt/service_finder/frontend/node_modules/@tailwindcss/oxide-linux-x64-gnu/README.md +/opt/service_finder/frontend/node_modules/@tailwindcss/oxide +/opt/service_finder/frontend/node_modules/@tailwindcss/oxide/index.d.ts +/opt/service_finder/frontend/node_modules/@tailwindcss/oxide/package.json +/opt/service_finder/frontend/node_modules/@tailwindcss/oxide/LICENSE +/opt/service_finder/frontend/node_modules/@tailwindcss/oxide/index.js +/opt/service_finder/frontend/node_modules/escalade +/opt/service_finder/frontend/node_modules/escalade/readme.md +/opt/service_finder/frontend/node_modules/escalade/license +/opt/service_finder/frontend/node_modules/escalade/index.d.ts +/opt/service_finder/frontend/node_modules/escalade/package.json +/opt/service_finder/frontend/node_modules/escalade/dist +/opt/service_finder/frontend/node_modules/escalade/dist/index.js +/opt/service_finder/frontend/node_modules/escalade/dist/index.mjs +/opt/service_finder/frontend/node_modules/escalade/sync +/opt/service_finder/frontend/node_modules/escalade/sync/index.d.ts +/opt/service_finder/frontend/node_modules/escalade/sync/index.js +/opt/service_finder/frontend/node_modules/escalade/sync/index.d.mts +/opt/service_finder/frontend/node_modules/escalade/sync/index.mjs +/opt/service_finder/frontend/node_modules/escalade/index.d.mts +/opt/service_finder/frontend/node_modules/function-bind +/opt/service_finder/frontend/node_modules/function-bind/implementation.js +/opt/service_finder/frontend/node_modules/function-bind/test +/opt/service_finder/frontend/node_modules/function-bind/test/.eslintrc +/opt/service_finder/frontend/node_modules/function-bind/test/index.js +/opt/service_finder/frontend/node_modules/function-bind/package.json +/opt/service_finder/frontend/node_modules/function-bind/.github +/opt/service_finder/frontend/node_modules/function-bind/.github/SECURITY.md +/opt/service_finder/frontend/node_modules/function-bind/.github/FUNDING.yml +/opt/service_finder/frontend/node_modules/function-bind/.eslintrc +/opt/service_finder/frontend/node_modules/function-bind/LICENSE +/opt/service_finder/frontend/node_modules/function-bind/index.js +/opt/service_finder/frontend/node_modules/function-bind/.nycrc +/opt/service_finder/frontend/node_modules/function-bind/README.md +/opt/service_finder/frontend/node_modules/function-bind/CHANGELOG.md +/opt/service_finder/frontend/node_modules/tinyglobby +/opt/service_finder/frontend/node_modules/tinyglobby/package.json +/opt/service_finder/frontend/node_modules/tinyglobby/dist +/opt/service_finder/frontend/node_modules/tinyglobby/dist/index.cjs +/opt/service_finder/frontend/node_modules/tinyglobby/dist/index.d.mts +/opt/service_finder/frontend/node_modules/tinyglobby/dist/index.d.cts +/opt/service_finder/frontend/node_modules/tinyglobby/dist/index.mjs +/opt/service_finder/frontend/node_modules/tinyglobby/LICENSE +/opt/service_finder/frontend/node_modules/tinyglobby/README.md +/opt/service_finder/frontend/node_modules/confbox +/opt/service_finder/frontend/node_modules/confbox/package.json +/opt/service_finder/frontend/node_modules/confbox/dist +/opt/service_finder/frontend/node_modules/confbox/dist/shared +/opt/service_finder/frontend/node_modules/confbox/dist/shared/confbox.DA7CpUDY.mjs +/opt/service_finder/frontend/node_modules/confbox/dist/shared/confbox.B202Uz6F.d.mts +/opt/service_finder/frontend/node_modules/confbox/dist/shared/confbox.DnMsyigM.mjs +/opt/service_finder/frontend/node_modules/confbox/dist/yaml.mjs +/opt/service_finder/frontend/node_modules/confbox/dist/jsonc.mjs +/opt/service_finder/frontend/node_modules/confbox/dist/json5.d.mts +/opt/service_finder/frontend/node_modules/confbox/dist/yaml.d.mts +/opt/service_finder/frontend/node_modules/confbox/dist/json5.mjs +/opt/service_finder/frontend/node_modules/confbox/dist/jsonc.d.mts +/opt/service_finder/frontend/node_modules/confbox/dist/ini.d.mts +/opt/service_finder/frontend/node_modules/confbox/dist/index.d.mts +/opt/service_finder/frontend/node_modules/confbox/dist/ini.mjs +/opt/service_finder/frontend/node_modules/confbox/dist/index.mjs +/opt/service_finder/frontend/node_modules/confbox/dist/toml.d.mts +/opt/service_finder/frontend/node_modules/confbox/dist/toml.mjs +/opt/service_finder/frontend/node_modules/confbox/LICENSE +/opt/service_finder/frontend/node_modules/confbox/README.md +/opt/service_finder/frontend/node_modules/@rollup +/opt/service_finder/frontend/node_modules/@rollup/rollup-linux-x64-musl +/opt/service_finder/frontend/node_modules/@rollup/rollup-linux-x64-musl/package.json +/opt/service_finder/frontend/node_modules/@rollup/rollup-linux-x64-musl/rollup.linux-x64-musl.node +/opt/service_finder/frontend/node_modules/@rollup/rollup-linux-x64-musl/README.md +/opt/service_finder/frontend/node_modules/@rollup/rollup-linux-x64-gnu +/opt/service_finder/frontend/node_modules/@rollup/rollup-linux-x64-gnu/package.json +/opt/service_finder/frontend/node_modules/@rollup/rollup-linux-x64-gnu/rollup.linux-x64-gnu.node +/opt/service_finder/frontend/node_modules/@rollup/rollup-linux-x64-gnu/README.md +/opt/service_finder/frontend/node_modules/pkg-types +/opt/service_finder/frontend/node_modules/pkg-types/package.json +/opt/service_finder/frontend/node_modules/pkg-types/dist +/opt/service_finder/frontend/node_modules/pkg-types/dist/index.d.mts +/opt/service_finder/frontend/node_modules/pkg-types/dist/index.mjs +/opt/service_finder/frontend/node_modules/pkg-types/LICENSE +/opt/service_finder/frontend/node_modules/pkg-types/README.md +/opt/service_finder/frontend/node_modules/pinia +/opt/service_finder/frontend/node_modules/pinia/package.json +/opt/service_finder/frontend/node_modules/pinia/dist +/opt/service_finder/frontend/node_modules/pinia/dist/pinia.prod.cjs +/opt/service_finder/frontend/node_modules/pinia/dist/pinia.iife.js +/opt/service_finder/frontend/node_modules/pinia/dist/pinia.esm-browser.js +/opt/service_finder/frontend/node_modules/pinia/dist/pinia.cjs +/opt/service_finder/frontend/node_modules/pinia/dist/pinia.mjs +/opt/service_finder/frontend/node_modules/pinia/dist/pinia.d.ts +/opt/service_finder/frontend/node_modules/pinia/dist/pinia.iife.prod.js +/opt/service_finder/frontend/node_modules/pinia/index.cjs +/opt/service_finder/frontend/node_modules/pinia/LICENSE +/opt/service_finder/frontend/node_modules/pinia/README.md +/opt/service_finder/frontend/node_modules/enhanced-resolve +/opt/service_finder/frontend/node_modules/enhanced-resolve/types.d.ts +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/DirectoryExistsPlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/JoinRequestPartPlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/NextPlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/ConditionalPlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/RootsPlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/ModulesInRootPlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/AppendPlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/ImportsFieldPlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/SyncAsyncFileSystemDecorator.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/UnsafeCachePlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/FileExistsPlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/ParsePlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/ResolverFactory.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/DescriptionFilePlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/ExtensionAliasPlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/MainFieldPlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/ExportsFieldPlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/getInnerRequest.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/forEachBail.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/SelfReferencePlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/ModulesInHierachicDirectoriesPlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/TryNextPlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/PnpPlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/DescriptionFileUtils.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/Resolver.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/index.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/LogInfoPlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/ResultPlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/ModulesInHierarchicalDirectoriesPlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/getPaths.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/AliasPlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/JoinRequestPlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/CloneBasenamePlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/UseFilePlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/RestrictionsPlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/AliasFieldPlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/createInnerContext.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/SymlinkPlugin.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/util +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/util/entrypoints.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/util/process-browser.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/util/path.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/util/module-browser.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/util/memoize.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/lib/util/identifier.js +/opt/service_finder/frontend/node_modules/enhanced-resolve/package.json +/opt/service_finder/frontend/node_modules/enhanced-resolve/LICENSE +/opt/service_finder/frontend/node_modules/enhanced-resolve/README.md +/opt/service_finder/frontend/node_modules/postcss-value-parser +/opt/service_finder/frontend/node_modules/postcss-value-parser/lib +/opt/service_finder/frontend/node_modules/postcss-value-parser/lib/stringify.js +/opt/service_finder/frontend/node_modules/postcss-value-parser/lib/walk.js +/opt/service_finder/frontend/node_modules/postcss-value-parser/lib/index.d.ts +/opt/service_finder/frontend/node_modules/postcss-value-parser/lib/index.js +/opt/service_finder/frontend/node_modules/postcss-value-parser/lib/parse.js +/opt/service_finder/frontend/node_modules/postcss-value-parser/lib/unit.js +/opt/service_finder/frontend/node_modules/postcss-value-parser/package.json +/opt/service_finder/frontend/node_modules/postcss-value-parser/LICENSE +/opt/service_finder/frontend/node_modules/postcss-value-parser/README.md +/opt/service_finder/frontend/node_modules/birpc +/opt/service_finder/frontend/node_modules/birpc/package.json +/opt/service_finder/frontend/node_modules/birpc/dist +/opt/service_finder/frontend/node_modules/birpc/dist/index.d.ts +/opt/service_finder/frontend/node_modules/birpc/dist/index.cjs +/opt/service_finder/frontend/node_modules/birpc/dist/index.d.mts +/opt/service_finder/frontend/node_modules/birpc/dist/index.d.cts +/opt/service_finder/frontend/node_modules/birpc/dist/index.mjs +/opt/service_finder/frontend/node_modules/birpc/LICENSE +/opt/service_finder/frontend/node_modules/birpc/README.md +/opt/service_finder/frontend/node_modules/@vue +/opt/service_finder/frontend/node_modules/@vue/shared +/opt/service_finder/frontend/node_modules/@vue/shared/package.json +/opt/service_finder/frontend/node_modules/@vue/shared/dist +/opt/service_finder/frontend/node_modules/@vue/shared/dist/shared.d.ts +/opt/service_finder/frontend/node_modules/@vue/shared/dist/shared.cjs.js +/opt/service_finder/frontend/node_modules/@vue/shared/dist/shared.esm-bundler.js +/opt/service_finder/frontend/node_modules/@vue/shared/dist/shared.cjs.prod.js +/opt/service_finder/frontend/node_modules/@vue/shared/LICENSE +/opt/service_finder/frontend/node_modules/@vue/shared/index.js +/opt/service_finder/frontend/node_modules/@vue/shared/README.md +/opt/service_finder/frontend/node_modules/@vue/devtools-kit +/opt/service_finder/frontend/node_modules/@vue/devtools-kit/global.d.ts +/opt/service_finder/frontend/node_modules/@vue/devtools-kit/types.d.ts +/opt/service_finder/frontend/node_modules/@vue/devtools-kit/package.json +/opt/service_finder/frontend/node_modules/@vue/devtools-kit/dist +/opt/service_finder/frontend/node_modules/@vue/devtools-kit/dist/index.d.ts +/opt/service_finder/frontend/node_modules/@vue/devtools-kit/dist/index.cjs +/opt/service_finder/frontend/node_modules/@vue/devtools-kit/dist/index.js +/opt/service_finder/frontend/node_modules/@vue/devtools-kit/dist/index.d.cts +/opt/service_finder/frontend/node_modules/@vue/devtools-kit/LICENSE +/opt/service_finder/frontend/node_modules/@vue/devtools-kit/README.md +/opt/service_finder/frontend/node_modules/@vue/runtime-dom +/opt/service_finder/frontend/node_modules/@vue/runtime-dom/package.json +/opt/service_finder/frontend/node_modules/@vue/runtime-dom/dist +/opt/service_finder/frontend/node_modules/@vue/runtime-dom/dist/runtime-dom.global.prod.js +/opt/service_finder/frontend/node_modules/@vue/runtime-dom/dist/runtime-dom.d.ts +/opt/service_finder/frontend/node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.prod.js +/opt/service_finder/frontend/node_modules/@vue/runtime-dom/dist/runtime-dom.global.js +/opt/service_finder/frontend/node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js +/opt/service_finder/frontend/node_modules/@vue/runtime-dom/dist/runtime-dom.esm-browser.prod.js +/opt/service_finder/frontend/node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.js +/opt/service_finder/frontend/node_modules/@vue/runtime-dom/dist/runtime-dom.esm-browser.js +/opt/service_finder/frontend/node_modules/@vue/runtime-dom/LICENSE +/opt/service_finder/frontend/node_modules/@vue/runtime-dom/index.js +/opt/service_finder/frontend/node_modules/@vue/runtime-dom/README.md +/opt/service_finder/frontend/node_modules/@vue/compiler-sfc +/opt/service_finder/frontend/node_modules/@vue/compiler-sfc/package.json +/opt/service_finder/frontend/node_modules/@vue/compiler-sfc/dist +/opt/service_finder/frontend/node_modules/@vue/compiler-sfc/dist/compiler-sfc.d.ts +/opt/service_finder/frontend/node_modules/@vue/compiler-sfc/dist/compiler-sfc.cjs.js +/opt/service_finder/frontend/node_modules/@vue/compiler-sfc/dist/compiler-sfc.esm-browser.js +/opt/service_finder/frontend/node_modules/@vue/compiler-sfc/LICENSE +/opt/service_finder/frontend/node_modules/@vue/compiler-sfc/README.md +/opt/service_finder/frontend/node_modules/@vue/devtools-shared +/opt/service_finder/frontend/node_modules/@vue/devtools-shared/package.json +/opt/service_finder/frontend/node_modules/@vue/devtools-shared/dist +/opt/service_finder/frontend/node_modules/@vue/devtools-shared/dist/index.d.ts +/opt/service_finder/frontend/node_modules/@vue/devtools-shared/dist/index.cjs +/opt/service_finder/frontend/node_modules/@vue/devtools-shared/dist/index.js +/opt/service_finder/frontend/node_modules/@vue/devtools-shared/dist/index.d.cts +/opt/service_finder/frontend/node_modules/@vue/devtools-shared/LICENSE +/opt/service_finder/frontend/node_modules/@vue/devtools-shared/README.md +/opt/service_finder/frontend/node_modules/@vue/compiler-core +/opt/service_finder/frontend/node_modules/@vue/compiler-core/package.json +/opt/service_finder/frontend/node_modules/@vue/compiler-core/dist +/opt/service_finder/frontend/node_modules/@vue/compiler-core/dist/compiler-core.cjs.js +/opt/service_finder/frontend/node_modules/@vue/compiler-core/dist/compiler-core.cjs.prod.js +/opt/service_finder/frontend/node_modules/@vue/compiler-core/dist/compiler-core.d.ts +/opt/service_finder/frontend/node_modules/@vue/compiler-core/dist/compiler-core.esm-bundler.js +/opt/service_finder/frontend/node_modules/@vue/compiler-core/LICENSE +/opt/service_finder/frontend/node_modules/@vue/compiler-core/index.js +/opt/service_finder/frontend/node_modules/@vue/compiler-core/README.md +/opt/service_finder/frontend/node_modules/@vue/compiler-ssr +/opt/service_finder/frontend/node_modules/@vue/compiler-ssr/package.json +/opt/service_finder/frontend/node_modules/@vue/compiler-ssr/dist +/opt/service_finder/frontend/node_modules/@vue/compiler-ssr/dist/compiler-ssr.d.ts +/opt/service_finder/frontend/node_modules/@vue/compiler-ssr/dist/compiler-ssr.cjs.js +/opt/service_finder/frontend/node_modules/@vue/compiler-ssr/LICENSE +/opt/service_finder/frontend/node_modules/@vue/compiler-ssr/README.md +/opt/service_finder/frontend/node_modules/@vue/compiler-dom +/opt/service_finder/frontend/node_modules/@vue/compiler-dom/package.json +/opt/service_finder/frontend/node_modules/@vue/compiler-dom/dist +/opt/service_finder/frontend/node_modules/@vue/compiler-dom/dist/compiler-dom.cjs.js +/opt/service_finder/frontend/node_modules/@vue/compiler-dom/dist/compiler-dom.d.ts +/opt/service_finder/frontend/node_modules/@vue/compiler-dom/dist/compiler-dom.esm-bundler.js +/opt/service_finder/frontend/node_modules/@vue/compiler-dom/dist/compiler-dom.global.js +/opt/service_finder/frontend/node_modules/@vue/compiler-dom/dist/compiler-dom.esm-browser.prod.js +/opt/service_finder/frontend/node_modules/@vue/compiler-dom/dist/compiler-dom.esm-browser.js +/opt/service_finder/frontend/node_modules/@vue/compiler-dom/dist/compiler-dom.cjs.prod.js +/opt/service_finder/frontend/node_modules/@vue/compiler-dom/dist/compiler-dom.global.prod.js +/opt/service_finder/frontend/node_modules/@vue/compiler-dom/LICENSE +/opt/service_finder/frontend/node_modules/@vue/compiler-dom/index.js +/opt/service_finder/frontend/node_modules/@vue/compiler-dom/README.md +/opt/service_finder/frontend/node_modules/@vue/devtools-api +/opt/service_finder/frontend/node_modules/@vue/devtools-api/package.json +/opt/service_finder/frontend/node_modules/@vue/devtools-api/dist +/opt/service_finder/frontend/node_modules/@vue/devtools-api/dist/index.d.ts +/opt/service_finder/frontend/node_modules/@vue/devtools-api/dist/index.cjs +/opt/service_finder/frontend/node_modules/@vue/devtools-api/dist/index.js +/opt/service_finder/frontend/node_modules/@vue/devtools-api/dist/index.d.cts +/opt/service_finder/frontend/node_modules/@vue/devtools-api/LICENSE +/opt/service_finder/frontend/node_modules/@vue/devtools-api/README.md +/opt/service_finder/frontend/node_modules/@vue/server-renderer +/opt/service_finder/frontend/node_modules/@vue/server-renderer/package.json +/opt/service_finder/frontend/node_modules/@vue/server-renderer/dist +/opt/service_finder/frontend/node_modules/@vue/server-renderer/dist/server-renderer.d.ts +/opt/service_finder/frontend/node_modules/@vue/server-renderer/dist/server-renderer.esm-bundler.js +/opt/service_finder/frontend/node_modules/@vue/server-renderer/dist/server-renderer.cjs.js +/opt/service_finder/frontend/node_modules/@vue/server-renderer/dist/server-renderer.esm-browser.js +/opt/service_finder/frontend/node_modules/@vue/server-renderer/dist/server-renderer.cjs.prod.js +/opt/service_finder/frontend/node_modules/@vue/server-renderer/dist/server-renderer.esm-browser.prod.js +/opt/service_finder/frontend/node_modules/@vue/server-renderer/LICENSE +/opt/service_finder/frontend/node_modules/@vue/server-renderer/index.js +/opt/service_finder/frontend/node_modules/@vue/server-renderer/README.md +/opt/service_finder/frontend/node_modules/@vue/reactivity +/opt/service_finder/frontend/node_modules/@vue/reactivity/package.json +/opt/service_finder/frontend/node_modules/@vue/reactivity/dist +/opt/service_finder/frontend/node_modules/@vue/reactivity/dist/reactivity.global.prod.js +/opt/service_finder/frontend/node_modules/@vue/reactivity/dist/reactivity.esm-browser.js +/opt/service_finder/frontend/node_modules/@vue/reactivity/dist/reactivity.cjs.js +/opt/service_finder/frontend/node_modules/@vue/reactivity/dist/reactivity.d.ts +/opt/service_finder/frontend/node_modules/@vue/reactivity/dist/reactivity.global.js +/opt/service_finder/frontend/node_modules/@vue/reactivity/dist/reactivity.cjs.prod.js +/opt/service_finder/frontend/node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js +/opt/service_finder/frontend/node_modules/@vue/reactivity/dist/reactivity.esm-browser.prod.js +/opt/service_finder/frontend/node_modules/@vue/reactivity/LICENSE +/opt/service_finder/frontend/node_modules/@vue/reactivity/index.js +/opt/service_finder/frontend/node_modules/@vue/reactivity/README.md +/opt/service_finder/frontend/node_modules/@vue/runtime-core +/opt/service_finder/frontend/node_modules/@vue/runtime-core/package.json +/opt/service_finder/frontend/node_modules/@vue/runtime-core/dist +/opt/service_finder/frontend/node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js +/opt/service_finder/frontend/node_modules/@vue/runtime-core/dist/runtime-core.cjs.js +/opt/service_finder/frontend/node_modules/@vue/runtime-core/dist/runtime-core.cjs.prod.js +/opt/service_finder/frontend/node_modules/@vue/runtime-core/dist/runtime-core.d.ts +/opt/service_finder/frontend/node_modules/@vue/runtime-core/LICENSE +/opt/service_finder/frontend/node_modules/@vue/runtime-core/index.js +/opt/service_finder/frontend/node_modules/@vue/runtime-core/README.md +/opt/service_finder/frontend/node_modules/.vite +/opt/service_finder/frontend/node_modules/.vite/deps +/opt/service_finder/frontend/node_modules/.vite/deps/package.json +/opt/service_finder/frontend/node_modules/.vite/deps/vue.js +/opt/service_finder/frontend/node_modules/.vite/deps/vue.js.map +/opt/service_finder/frontend/node_modules/.vite/deps/_metadata.json +/opt/service_finder/frontend/node_modules/tapable +/opt/service_finder/frontend/node_modules/tapable/lib +/opt/service_finder/frontend/node_modules/tapable/lib/HookCodeFactory.js +/opt/service_finder/frontend/node_modules/tapable/lib/AsyncSeriesHook.js +/opt/service_finder/frontend/node_modules/tapable/lib/SyncLoopHook.js +/opt/service_finder/frontend/node_modules/tapable/lib/MultiHook.js +/opt/service_finder/frontend/node_modules/tapable/lib/AsyncParallelBailHook.js +/opt/service_finder/frontend/node_modules/tapable/lib/AsyncSeriesLoopHook.js +/opt/service_finder/frontend/node_modules/tapable/lib/SyncHook.js +/opt/service_finder/frontend/node_modules/tapable/lib/AsyncParallelHook.js +/opt/service_finder/frontend/node_modules/tapable/lib/SyncWaterfallHook.js +/opt/service_finder/frontend/node_modules/tapable/lib/SyncBailHook.js +/opt/service_finder/frontend/node_modules/tapable/lib/index.js +/opt/service_finder/frontend/node_modules/tapable/lib/Hook.js +/opt/service_finder/frontend/node_modules/tapable/lib/HookMap.js +/opt/service_finder/frontend/node_modules/tapable/lib/AsyncSeriesBailHook.js +/opt/service_finder/frontend/node_modules/tapable/lib/util-browser.js +/opt/service_finder/frontend/node_modules/tapable/lib/AsyncSeriesWaterfallHook.js +/opt/service_finder/frontend/node_modules/tapable/package.json +/opt/service_finder/frontend/node_modules/tapable/LICENSE +/opt/service_finder/frontend/node_modules/tapable/tapable.d.ts +/opt/service_finder/frontend/node_modules/tapable/README.md +/opt/service_finder/frontend/node_modules/call-bind-apply-helpers +/opt/service_finder/frontend/node_modules/call-bind-apply-helpers/functionCall.d.ts +/opt/service_finder/frontend/node_modules/call-bind-apply-helpers/index.d.ts +/opt/service_finder/frontend/node_modules/call-bind-apply-helpers/reflectApply.js +/opt/service_finder/frontend/node_modules/call-bind-apply-helpers/test +/opt/service_finder/frontend/node_modules/call-bind-apply-helpers/test/index.js +/opt/service_finder/frontend/node_modules/call-bind-apply-helpers/actualApply.js +/opt/service_finder/frontend/node_modules/call-bind-apply-helpers/tsconfig.json +/opt/service_finder/frontend/node_modules/call-bind-apply-helpers/reflectApply.d.ts +/opt/service_finder/frontend/node_modules/call-bind-apply-helpers/functionApply.d.ts +/opt/service_finder/frontend/node_modules/call-bind-apply-helpers/functionApply.js +/opt/service_finder/frontend/node_modules/call-bind-apply-helpers/package.json +/opt/service_finder/frontend/node_modules/call-bind-apply-helpers/.github +/opt/service_finder/frontend/node_modules/call-bind-apply-helpers/.github/FUNDING.yml +/opt/service_finder/frontend/node_modules/call-bind-apply-helpers/.eslintrc +/opt/service_finder/frontend/node_modules/call-bind-apply-helpers/LICENSE +/opt/service_finder/frontend/node_modules/call-bind-apply-helpers/functionCall.js +/opt/service_finder/frontend/node_modules/call-bind-apply-helpers/index.js +/opt/service_finder/frontend/node_modules/call-bind-apply-helpers/.nycrc +/opt/service_finder/frontend/node_modules/call-bind-apply-helpers/applyBind.js +/opt/service_finder/frontend/node_modules/call-bind-apply-helpers/README.md +/opt/service_finder/frontend/node_modules/call-bind-apply-helpers/actualApply.d.ts +/opt/service_finder/frontend/node_modules/call-bind-apply-helpers/applyBind.d.ts +/opt/service_finder/frontend/node_modules/call-bind-apply-helpers/CHANGELOG.md +/opt/service_finder/frontend/node_modules/follow-redirects +/opt/service_finder/frontend/node_modules/follow-redirects/debug.js +/opt/service_finder/frontend/node_modules/follow-redirects/package.json +/opt/service_finder/frontend/node_modules/follow-redirects/LICENSE +/opt/service_finder/frontend/node_modules/follow-redirects/index.js +/opt/service_finder/frontend/node_modules/follow-redirects/http.js +/opt/service_finder/frontend/node_modules/follow-redirects/https.js +/opt/service_finder/frontend/node_modules/follow-redirects/README.md +/opt/service_finder/frontend/node_modules/caniuse-lite +/opt/service_finder/frontend/node_modules/caniuse-lite/package.json +/opt/service_finder/frontend/node_modules/caniuse-lite/dist +/opt/service_finder/frontend/node_modules/caniuse-lite/dist/lib +/opt/service_finder/frontend/node_modules/caniuse-lite/dist/lib/statuses.js +/opt/service_finder/frontend/node_modules/caniuse-lite/dist/lib/supported.js +/opt/service_finder/frontend/node_modules/caniuse-lite/dist/unpacker +/opt/service_finder/frontend/node_modules/caniuse-lite/dist/unpacker/browsers.js +/opt/service_finder/frontend/node_modules/caniuse-lite/dist/unpacker/features.js +/opt/service_finder/frontend/node_modules/caniuse-lite/dist/unpacker/browserVersions.js +/opt/service_finder/frontend/node_modules/caniuse-lite/dist/unpacker/region.js +/opt/service_finder/frontend/node_modules/caniuse-lite/dist/unpacker/index.js +/opt/service_finder/frontend/node_modules/caniuse-lite/dist/unpacker/agents.js +/opt/service_finder/frontend/node_modules/caniuse-lite/dist/unpacker/feature.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/MD.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/KI.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/DE.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/PY.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/NE.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/LB.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/BB.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/MA.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/RE.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/RW.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/SO.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/JO.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/NI.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/GA.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/AX.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/LY.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/CD.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/HR.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/IQ.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/AO.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/SE.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/CN.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/TH.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/SR.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/LI.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/ES.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/alt-sa.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/GE.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/VN.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/PK.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/RS.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/TJ.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/JP.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/TD.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/PR.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/MY.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/LA.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/LU.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/DK.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/NO.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/UG.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/PM.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/CX.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/MX.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/CZ.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/US.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/OM.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/TV.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/MP.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/VC.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/PG.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/AZ.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/BT.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/TC.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/ZA.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/GQ.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/PF.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/GY.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/IE.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/BE.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/DO.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/SM.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/IN.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/alt-eu.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/SN.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/HT.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/LS.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/BS.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/CL.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/TM.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/LC.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/VA.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/UY.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/ZM.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/GM.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/GN.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/GD.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/TZ.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/CI.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/AL.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/BM.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/AF.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/CA.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/PE.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/DZ.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/BI.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/GB.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/KN.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/ML.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/CH.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/NA.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/KM.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/VU.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/VE.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/EE.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/JE.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/KZ.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/TO.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/NG.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/TR.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/PL.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/TW.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/SH.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/SK.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/FI.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/PS.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/MU.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/CG.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/SZ.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/CO.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/alt-oc.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/LV.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/CF.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/RU.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/LK.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/BN.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/CY.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/EG.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/KP.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/MT.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/UZ.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/BO.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/PH.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/BY.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/SD.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/MZ.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/SB.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/IL.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/IS.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/WF.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/alt-ww.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/GR.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/KH.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/MN.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/PW.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/ET.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/YT.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/FK.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/BH.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/PN.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/ID.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/MK.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/GU.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/alt-as.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/AM.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/GF.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/KG.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/FO.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/ZW.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/NF.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/LT.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/ME.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/PA.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/SY.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/NL.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/CV.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/VG.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/AU.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/SI.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/CR.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/KE.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/CK.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/BW.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/alt-af.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/AR.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/KW.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/MM.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/AT.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/CM.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/MO.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/MG.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/FJ.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/AG.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/GT.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/MH.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/BG.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/DJ.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/ST.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/NP.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/AE.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/JM.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/NU.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/KR.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/YE.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/FR.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/SA.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/IT.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/AI.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/BZ.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/IM.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/SG.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/RO.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/AS.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/MR.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/MQ.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/NZ.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/BF.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/GW.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/SL.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/alt-an.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/IR.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/GH.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/BJ.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/SV.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/EC.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/VI.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/KY.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/GI.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/alt-na.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/TT.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/SC.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/GL.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/BR.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/CU.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/LR.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/TN.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/HN.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/TL.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/WS.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/GG.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/GP.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/BA.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/DM.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/FM.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/HU.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/ER.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/MC.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/MW.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/BD.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/MS.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/AW.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/UA.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/NC.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/PT.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/TG.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/NR.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/MV.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/QA.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/HK.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/regions/AD.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/browsers.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/browserVersions.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-opacity.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/png-alpha.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/view-transitions.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/unhandledrejection.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-counters.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/text-stroke.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/es6-generators.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-element-function.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/eme.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-font-stretch.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/portals.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/aac.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/form-validation.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-revert-value.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/font-family-system-ui.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/brotli.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/u2f.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-logical-props.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/web-bluetooth.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/input-event.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/wbr-element.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/keyboardevent-key.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/srcset.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-hyphens.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/eventsource.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/forms.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/audio.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/url-scroll-to-text-fragment.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/av1.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-in-out-of-range.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/woff.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-grid-animation.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-file-selector-button.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/channel-messaging.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/typedarrays.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/webhid.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-print-color-adjust.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/svg.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/hashchange.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/devicepixelratio.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/datauri.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/mpeg-dash.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/element-closest.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/link-rel-preload.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/wasm-simd.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-background-offsets.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/ogg-vorbis.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/eot.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/x-frame-options.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/path2d.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/text-overflow.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/keyboardevent-getmodifierstate.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/fontface.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/subresource-bundling.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/webgl.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-gencontent.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-subgrid.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/custom-elements.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/subresource-integrity.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css3-attr.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/webnfc.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-anchor-positioning.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-case-insensitive.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/pointer.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/flexbox.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/dataset.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/mdn-css-unicode-bidi-plaintext.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-scroll-behavior.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/dispatchevent.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/html-media-capture.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-animation.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/mutation-events.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/document-scrollingelement.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css3-cursors.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/vector-effect.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/svg-html.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/temporal.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/element-scroll-methods.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/async-functions.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/inline-block.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-fixed.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/apng.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/passwordrules.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/viewport-unit-variants.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/indexeddb.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/videotracks.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/rel-noopener.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/ogv.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/colr-v1.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/do-not-track.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/indeterminate-checkbox.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/use-strict.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/mdn-text-decoration-color.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/es6.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/wasm-relaxed-simd.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/textencoder.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/getrandomvalues.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/input-color.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css3-boxsizing.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/deviceorientation.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/kerning-pairs-ligatures.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/getcomputedstyle.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/mpeg4.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-default-pseudo.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/proximity.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/media-fragments.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-math-functions.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/cross-document-view-transitions.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/mediarecorder.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/spellcheck-attribute.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/webvr.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/transforms3d.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/heif.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/input-datetime.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/object-observe.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/insertadjacenthtml.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-placeholder-shown.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/accelerometer.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/element-from-point.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-sel3.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-line-clamp.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/credential-management.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/same-site-cookie-attribute.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/transforms2d.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-touch-action.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-textshadow.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/date-tolocaledatestring.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/payment-request.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/push-api.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/font-unicode-range.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-letter-spacing.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/script-defer.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/wasm-gc.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-placeholder.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/registerprotocolhandler.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-color-function.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-overscroll-behavior.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/webp.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/mdn-css-backdrop-pseudo-element.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/promise-finally.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-mediaqueries.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-marker-pseudo.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/midi.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-optional-pseudo.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-env-function.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css3-tabsize.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/classlist.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/document-evaluate-xpath.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/dragndrop.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/domcontentloaded.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/keyboardevent-code.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/input-selection.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-reflections.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/flexbox-gap.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/es6-class.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-boxdecorationbreak.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/passkeys.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/netinfo.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/wasm-threads.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/iframe-sandbox.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-media-resolution.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-rrggbbaa.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/text-decoration.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/user-select-none.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/audiotracks.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/keyboardevent-which.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/link-rel-dns-prefetch.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/input-inputmode.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-media-range-syntax.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/webkit-user-drag.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-masks.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/currentcolor.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-nth-child-of.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/font-smooth.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/svg-css.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-first-line.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/array-find.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/text-size-adjust.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/wasm-multi-memory.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/webm.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/magnetometer.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/link-icon-svg.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-font-rendering-controls.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/svg-fonts.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/input-placeholder.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/shadowdomv1.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/es5.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/cryptography.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-content-visibility.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/tabindex-attr.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/urlsearchparams.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/speech-recognition.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/dom-manip-convenience.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-media-interaction.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/referrer-policy.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/scrollintoviewifneeded.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/wav.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/promises.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/orientation-sensor.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/lazyload.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/hevc.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/http-live-streaming.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/text-emphasis.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/es6-number.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/readonly-attr.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/internationalization.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/mathml.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/offscreencanvas.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/mdn-css-unicode-bidi-isolate-override.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/wasm-tail-calls.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/input-file-accept.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-boxshadow.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-grid.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-not-sel-list.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/fileapi.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/jpegxr.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/auxclick.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/textcontent.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/childnode-remove.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/multicolumn.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-read-only-write.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/input-range.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/upgradeinsecurerequests.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-namespaces.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/import-maps.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-relative-colors.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/innertext.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/intersectionobserver-v2.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/loading-lazy-attr.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/wasm-signext.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/web-serial.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-containment.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/variable-fonts.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/permissions-api.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/dom-range.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/pagevisibility.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/chacha20-poly1305.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-regions.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/gamepad.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/svg-smil.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/objectrtc.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/wasm-extended-const.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/selection-api.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/gyroscope.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/sdch.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-snappoints.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/keyboardevent-charcode.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/script-async.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/ttf.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/word-break.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/run-in.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/web-share.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/background-attachment.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/server-timing.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/abortcontroller.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-hanging-punctuation.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/background-position-x-y.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/template-literals.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-text-box-trim.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/trusted-types.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/clipboard.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/broadcastchannel.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/font-variant-numeric.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/template.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/minmaxwh.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/webgpu.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/sni.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/document-currentscript.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/comparedocumentposition.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-deviceadaptation.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-at-counter-style.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-rebeccapurple.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/rem.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/history.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/constraint-validation.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/es6-module.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/scrollintoview.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/webxr.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/url.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-width-stretch.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/createimagebitmap.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/colr.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-mixblendmode.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-motion-paths.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-initial-value.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/rel-noreferrer.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/pad-start-end.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-crisp-edges.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/native-filesystem-api.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/mdn-text-decoration-shorthand.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-exclusions.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/es6-module-dynamic-import.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/jpegxl.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/multibackgrounds.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/document-execcommand.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-text-spacing.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/passive-event-listener.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-has.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/geolocation.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/form-submit-attributes.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/keyboardevent-location.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-dir-pseudo.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-media-scripting.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/rest-parameters.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/pointerlock.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/wasm-mutable-globals.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/wasm-nontrapping-fptoint.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/details.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/client-hints-dpr-width-viewport.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-sticky.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/tls1-2.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-module-scripts.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-font-palette.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/link-icon-png.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/x-doc-messaging.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/beacon.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/wasm-bigint.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/link-rel-modulepreload.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/console-basic.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/webtransport.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/decorators.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/once-event-listener.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/input-file-directory.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-text-indent.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/mediacapture-fromelement.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/tls1-3.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-filter-function.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/input-autocomplete-onoff.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/testfeat.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/stream.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/html5semantic.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/svg-img.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/blobbuilder.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/prefers-color-scheme.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/json.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/canvas-text.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/fetch.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/contentsecuritypolicy2.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/shadowdom.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/canvas.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/justify-content-space-evenly.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/webworkers.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/customevent.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/iframe-seamless.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/intrinsic-width.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/documenthead.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/ping.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/svg-filters.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/pointer-events.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/tls1-1.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/array-find-index.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/xhtml.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-overflow-overlay.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-all.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/wasm-multi-value.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/rellist.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-grid-lanes.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/hidden.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/object-fit.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/xml-serializer.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/wake-lock.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/progress.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/http3.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/indexeddb2.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/imports.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/background-sync.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/touch.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-autofill.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/cors.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/sxg.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/avif.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-text-wrap-balance.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/publickeypinning.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-appearance.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/high-resolution-time.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/async-clipboard.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/img-naturalwidth-naturalheight.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/streams.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/xhr2.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/atob-btoa.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/offline-apps.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/serviceworkers.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/filesystem.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/meta-theme-color.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/js-regexp-lookbehind.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-zoom.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/user-timing.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/selectlist.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/form-attribute.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/wasm.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/wai-aria.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/online-status.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-container-queries.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/will-change.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/resource-timing.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/video.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/namevalue-storage.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/let.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/opus.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-widows-orphans.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/intl-pluralrules.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/declarative-shadow-dom.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/datalist.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/array-includes.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/dialog.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/arrow-functions.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/extended-system-fonts.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/localecompare.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/font-feature.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/filereadersync.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/outline.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/prefers-reduced-motion.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-text-orientation.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/link-rel-prerender.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-selection.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/web-app-manifest.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/ol-reversed.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/wasm-bulk-memory.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-container-query-units.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/flow-root.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/input-pattern.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/dommatrix.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/ac3-ec3.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/mdn-css-unicode-bidi-isolate.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/stricttransportsecurity.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/calc.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-backgroundblendmode.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/link-rel-preconnect.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/mediasource.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/permissions-policy.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/insert-adjacent.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-paint-api.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-featurequeries.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-image-orientation.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/audio-api.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-caret-color.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/getelementsbyclassname.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/sharedarraybuffer.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-display-contents.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-cascade-scope.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/ch-unit.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/imagecapture.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/getboundingclientrect.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/requestanimationframe.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-overflow.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/style-scoped.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-focus-visible.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-lch-lab.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/webcodecs.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css3-cursors-grab.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/background-clip-text.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/input-search.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/asmjs.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-supports-api.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-first-letter.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/jpeg2000.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-initial-letter.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-unicode-bidi.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/font-size-adjust.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/web-animation.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/mp3.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-focus-within.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/battery-status.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/webgl2.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/zstd.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/wordwrap.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-unset-value.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/input-email-tel-url.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/font-loading.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/document-policy.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/cookie-store-api.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/webusb.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/mutationobserver.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/link-rel-prefetch.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/xhtmlsmil.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-conic-gradients.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/svg-html5.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-transitions.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/vibration.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/intersectionobserver.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/const.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/matchmedia.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/contenteditable.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/border-radius.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-paged-media.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/meter.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/sharedworkers.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-overflow-anchor.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-if.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/websockets.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/dnssec.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/wasm-reference-types.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/feature-policy.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/background-repeat-round-space.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/matchesselector.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/mdn-text-decoration-style.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/input-file-multiple.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/picture-in-picture.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/background-img-opts.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/http2.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/svg-fragment.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/fullscreen.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-page-break.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-clip-path.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/mdn-text-decoration-line.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/beforeafterprint.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/bloburls.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/webauthn.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/autofocus.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/screen-orientation.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/font-variant-alternates.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-shapes.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-repeating-gradients.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/viewport-units.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/iframe-srcdoc.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-cross-fade.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/resizeobserver.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/addeventlistener.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-filters.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-container-queries-style.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/es6-string-includes.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-nesting.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/object-values.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/bigint.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-cascade-layers.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-text-justify.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-matches-pseudo.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-sel2.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/ambient-light.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/input-number.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css3-cursors-newer.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/maxlength.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/requestidlecallback.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/custom-elementsv1.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-text-align-last.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/nav-timing.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css3-colors.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/proxy.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/download.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/input-minlength.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-descendant-gtgt.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/menu.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/notifications.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/speech-synthesis.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/canvas-blending.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/focusin-focusout-events.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/font-kerning.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-canvas.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/ime.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-resize.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/border-image.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/hardwareconcurrency.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/pdf-viewer.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/filereader.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-any-link.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/alternate-stylesheet.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/spdy.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/queryselector.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/console-time.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/ruby.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/contentsecuritypolicy.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/object-entries.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/flac.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-indeterminate-pseudo.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-scrollbar.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/picture.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-when-else.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-image-set.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-backdrop-filter.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/sql-storage.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-writing-mode.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/fieldset-disabled.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-table.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/setimmediate.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/page-transition-events.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/array-flat.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/woff2.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/webvtt.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-gradients.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/rtcpeerconnection.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-color-adjust.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/features/css-variables.js +/opt/service_finder/frontend/node_modules/caniuse-lite/data/agents.js +/opt/service_finder/frontend/node_modules/caniuse-lite/LICENSE +/opt/service_finder/frontend/node_modules/caniuse-lite/README.md +/opt/service_finder/frontend/node_modules/@vitejs +/opt/service_finder/frontend/node_modules/@vitejs/plugin-vue +/opt/service_finder/frontend/node_modules/@vitejs/plugin-vue/package.json +/opt/service_finder/frontend/node_modules/@vitejs/plugin-vue/dist +/opt/service_finder/frontend/node_modules/@vitejs/plugin-vue/dist/index.d.mts +/opt/service_finder/frontend/node_modules/@vitejs/plugin-vue/dist/index.mjs +/opt/service_finder/frontend/node_modules/@vitejs/plugin-vue/LICENSE +/opt/service_finder/frontend/node_modules/@vitejs/plugin-vue/README.md +/opt/service_finder/frontend/node_modules/baseline-browser-mapping +/opt/service_finder/frontend/node_modules/baseline-browser-mapping/LICENSE.txt +/opt/service_finder/frontend/node_modules/baseline-browser-mapping/package.json +/opt/service_finder/frontend/node_modules/baseline-browser-mapping/dist +/opt/service_finder/frontend/node_modules/baseline-browser-mapping/dist/index.d.ts +/opt/service_finder/frontend/node_modules/baseline-browser-mapping/dist/index.cjs +/opt/service_finder/frontend/node_modules/baseline-browser-mapping/dist/index.js +/opt/service_finder/frontend/node_modules/baseline-browser-mapping/dist/cli.js +/opt/service_finder/frontend/node_modules/baseline-browser-mapping/README.md +/opt/service_finder/frontend/node_modules/@jridgewell +/opt/service_finder/frontend/node_modules/@jridgewell/remapping +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/src +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/src/build-source-map-tree.ts +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/src/types.ts +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/src/remapping.ts +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/src/source-map-tree.ts +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/src/source-map.ts +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/types +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/types/source-map-tree.d.cts.map +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/types/source-map-tree.d.cts +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/types/types.d.mts.map +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/types/remapping.d.cts +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/types/source-map.d.cts.map +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/types/build-source-map-tree.d.cts +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/types/types.d.cts.map +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/types/build-source-map-tree.d.mts +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/types/source-map-tree.d.mts +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/types/remapping.d.cts.map +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/types/source-map-tree.d.mts.map +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/types/build-source-map-tree.d.mts.map +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/types/types.d.cts +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/types/build-source-map-tree.d.cts.map +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/types/source-map.d.cts +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/types/types.d.mts +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/types/source-map.d.mts.map +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/types/remapping.d.mts.map +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/types/remapping.d.mts +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/types/source-map.d.mts +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/package.json +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/dist +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/dist/remapping.umd.js.map +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/dist/remapping.umd.js +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/dist/remapping.mjs +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/dist/remapping.mjs.map +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/LICENSE +/opt/service_finder/frontend/node_modules/@jridgewell/remapping/README.md +/opt/service_finder/frontend/node_modules/@jridgewell/resolve-uri +/opt/service_finder/frontend/node_modules/@jridgewell/resolve-uri/package.json +/opt/service_finder/frontend/node_modules/@jridgewell/resolve-uri/dist +/opt/service_finder/frontend/node_modules/@jridgewell/resolve-uri/dist/types +/opt/service_finder/frontend/node_modules/@jridgewell/resolve-uri/dist/types/resolve-uri.d.ts +/opt/service_finder/frontend/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs.map +/opt/service_finder/frontend/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs +/opt/service_finder/frontend/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js.map +/opt/service_finder/frontend/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js +/opt/service_finder/frontend/node_modules/@jridgewell/resolve-uri/LICENSE +/opt/service_finder/frontend/node_modules/@jridgewell/resolve-uri/README.md +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/src +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/src/sourcemap-codec.ts +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/src/vlq.ts +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/src/scopes.ts +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/src/strings.ts +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/types +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts.map +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts.map +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts.map +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts.map +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.mts +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/types/strings.d.cts +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts.map +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.cts.map +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/types/sourcemap-codec.d.cts +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/types/strings.d.mts.map +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.cts +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/types/vlq.d.mts.map +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/types/scopes.d.mts +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/package.json +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/dist +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js.map +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs.map +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/LICENSE +/opt/service_finder/frontend/node_modules/@jridgewell/sourcemap-codec/README.md +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/src +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/src/sourcemap-segment.ts +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/src/set-array.ts +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/src/types.ts +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/src/gen-mapping.ts +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/types +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.mts.map +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/types/set-array.d.cts.map +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.mts +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/types/types.d.mts.map +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/types/types.d.cts.map +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/types/set-array.d.cts +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/types/set-array.d.mts +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.cts +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/types/set-array.d.mts.map +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/types/types.d.cts +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/types/sourcemap-segment.d.cts.map +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.mts.map +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.cts +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/types/types.d.mts +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.cts.map +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/types/gen-mapping.d.mts +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/package.json +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/dist +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js.map +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/dist/types +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/dist/types/sourcemap-segment.d.ts +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/dist/types/types.d.ts +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/dist/types/set-array.d.ts +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/dist/types/gen-mapping.d.ts +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs.map +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/LICENSE +/opt/service_finder/frontend/node_modules/@jridgewell/gen-mapping/README.md +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/src +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/src/sourcemap-segment.ts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/src/by-source.ts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/src/types.ts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/src/flatten-map.ts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/src/sort.ts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/src/strip-filename.ts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/src/binary-search.ts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/src/resolve.ts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/src/trace-mapping.ts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/resolve.d.mts.map +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/by-source.d.cts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/sort.d.mts.map +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/binary-search.d.mts.map +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/resolve.d.mts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.mts.map +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.mts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.cts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.mts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/sort.d.cts.map +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/types.d.mts.map +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/binary-search.d.cts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/binary-search.d.mts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.mts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.cts.map +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/types.d.cts.map +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.mts.map +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.cts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/sort.d.cts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.mts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/types.d.cts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/binary-search.d.cts.map +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.mts.map +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/sourcemap-segment.d.cts.map +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.cts.map +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/by-source.d.mts.map +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/resolve.d.cts.map +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/by-source.d.mts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/by-source.d.cts.map +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/types.d.mts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/trace-mapping.d.cts.map +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/resolve.d.cts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.cts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/sort.d.mts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/flatten-map.d.mts.map +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/types/strip-filename.d.cts +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/package.json +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/dist +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js.map +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs.map +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/LICENSE +/opt/service_finder/frontend/node_modules/@jridgewell/trace-mapping/README.md +/opt/service_finder/frontend/node_modules/perfect-debounce +/opt/service_finder/frontend/node_modules/perfect-debounce/package.json +/opt/service_finder/frontend/node_modules/perfect-debounce/dist +/opt/service_finder/frontend/node_modules/perfect-debounce/dist/index.d.ts +/opt/service_finder/frontend/node_modules/perfect-debounce/dist/index.cjs +/opt/service_finder/frontend/node_modules/perfect-debounce/dist/index.mjs +/opt/service_finder/frontend/node_modules/perfect-debounce/LICENSE +/opt/service_finder/frontend/node_modules/perfect-debounce/README.md +/opt/service_finder/frontend/node_modules/dunder-proto +/opt/service_finder/frontend/node_modules/dunder-proto/test +/opt/service_finder/frontend/node_modules/dunder-proto/test/get.js +/opt/service_finder/frontend/node_modules/dunder-proto/test/index.js +/opt/service_finder/frontend/node_modules/dunder-proto/test/set.js +/opt/service_finder/frontend/node_modules/dunder-proto/get.js +/opt/service_finder/frontend/node_modules/dunder-proto/tsconfig.json +/opt/service_finder/frontend/node_modules/dunder-proto/package.json +/opt/service_finder/frontend/node_modules/dunder-proto/.github +/opt/service_finder/frontend/node_modules/dunder-proto/.github/FUNDING.yml +/opt/service_finder/frontend/node_modules/dunder-proto/.eslintrc +/opt/service_finder/frontend/node_modules/dunder-proto/set.d.ts +/opt/service_finder/frontend/node_modules/dunder-proto/LICENSE +/opt/service_finder/frontend/node_modules/dunder-proto/.nycrc +/opt/service_finder/frontend/node_modules/dunder-proto/get.d.ts +/opt/service_finder/frontend/node_modules/dunder-proto/README.md +/opt/service_finder/frontend/node_modules/dunder-proto/set.js +/opt/service_finder/frontend/node_modules/dunder-proto/CHANGELOG.md +/opt/service_finder/frontend/node_modules/es-set-tostringtag +/opt/service_finder/frontend/node_modules/es-set-tostringtag/index.d.ts +/opt/service_finder/frontend/node_modules/es-set-tostringtag/test +/opt/service_finder/frontend/node_modules/es-set-tostringtag/test/index.js +/opt/service_finder/frontend/node_modules/es-set-tostringtag/tsconfig.json +/opt/service_finder/frontend/node_modules/es-set-tostringtag/package.json +/opt/service_finder/frontend/node_modules/es-set-tostringtag/.eslintrc +/opt/service_finder/frontend/node_modules/es-set-tostringtag/LICENSE +/opt/service_finder/frontend/node_modules/es-set-tostringtag/index.js +/opt/service_finder/frontend/node_modules/es-set-tostringtag/.nycrc +/opt/service_finder/frontend/node_modules/es-set-tostringtag/README.md +/opt/service_finder/frontend/node_modules/es-set-tostringtag/CHANGELOG.md +/opt/service_finder/frontend/node_modules/has-symbols +/opt/service_finder/frontend/node_modules/has-symbols/shams.js +/opt/service_finder/frontend/node_modules/has-symbols/index.d.ts +/opt/service_finder/frontend/node_modules/has-symbols/shams.d.ts +/opt/service_finder/frontend/node_modules/has-symbols/test +/opt/service_finder/frontend/node_modules/has-symbols/test/index.js +/opt/service_finder/frontend/node_modules/has-symbols/test/tests.js +/opt/service_finder/frontend/node_modules/has-symbols/test/shams +/opt/service_finder/frontend/node_modules/has-symbols/test/shams/get-own-property-symbols.js +/opt/service_finder/frontend/node_modules/has-symbols/test/shams/core-js.js +/opt/service_finder/frontend/node_modules/has-symbols/tsconfig.json +/opt/service_finder/frontend/node_modules/has-symbols/package.json +/opt/service_finder/frontend/node_modules/has-symbols/.github +/opt/service_finder/frontend/node_modules/has-symbols/.github/FUNDING.yml +/opt/service_finder/frontend/node_modules/has-symbols/.eslintrc +/opt/service_finder/frontend/node_modules/has-symbols/LICENSE +/opt/service_finder/frontend/node_modules/has-symbols/index.js +/opt/service_finder/frontend/node_modules/has-symbols/.nycrc +/opt/service_finder/frontend/node_modules/has-symbols/README.md +/opt/service_finder/frontend/node_modules/has-symbols/CHANGELOG.md +/opt/service_finder/frontend/node_modules/picomatch +/opt/service_finder/frontend/node_modules/picomatch/posix.js +/opt/service_finder/frontend/node_modules/picomatch/lib +/opt/service_finder/frontend/node_modules/picomatch/lib/picomatch.js +/opt/service_finder/frontend/node_modules/picomatch/lib/utils.js +/opt/service_finder/frontend/node_modules/picomatch/lib/scan.js +/opt/service_finder/frontend/node_modules/picomatch/lib/parse.js +/opt/service_finder/frontend/node_modules/picomatch/lib/constants.js +/opt/service_finder/frontend/node_modules/picomatch/package.json +/opt/service_finder/frontend/node_modules/picomatch/LICENSE +/opt/service_finder/frontend/node_modules/picomatch/index.js +/opt/service_finder/frontend/node_modules/picomatch/README.md +/opt/service_finder/frontend/node_modules/gopd +/opt/service_finder/frontend/node_modules/gopd/gOPD.js +/opt/service_finder/frontend/node_modules/gopd/gOPD.d.ts +/opt/service_finder/frontend/node_modules/gopd/index.d.ts +/opt/service_finder/frontend/node_modules/gopd/test +/opt/service_finder/frontend/node_modules/gopd/test/index.js +/opt/service_finder/frontend/node_modules/gopd/tsconfig.json +/opt/service_finder/frontend/node_modules/gopd/package.json +/opt/service_finder/frontend/node_modules/gopd/.github +/opt/service_finder/frontend/node_modules/gopd/.github/FUNDING.yml +/opt/service_finder/frontend/node_modules/gopd/.eslintrc +/opt/service_finder/frontend/node_modules/gopd/LICENSE +/opt/service_finder/frontend/node_modules/gopd/index.js +/opt/service_finder/frontend/node_modules/gopd/README.md +/opt/service_finder/frontend/node_modules/gopd/CHANGELOG.md +/opt/service_finder/frontend/node_modules/is-what +/opt/service_finder/frontend/node_modules/is-what/package.json +/opt/service_finder/frontend/node_modules/is-what/dist +/opt/service_finder/frontend/node_modules/is-what/dist/isFunction.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isString.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isNullOrUndefined.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isOneOf.js +/opt/service_finder/frontend/node_modules/is-what/dist/isWeakMap.js +/opt/service_finder/frontend/node_modules/is-what/dist/isPositiveNumber.js +/opt/service_finder/frontend/node_modules/is-what/dist/isFullArray.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isWeakSet.js +/opt/service_finder/frontend/node_modules/is-what/dist/isSymbol.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isNaNValue.js +/opt/service_finder/frontend/node_modules/is-what/dist/isIterable.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isType.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isIterable.js +/opt/service_finder/frontend/node_modules/is-what/dist/isSet.js +/opt/service_finder/frontend/node_modules/is-what/dist/isInteger.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isNegativeNumber.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isObjectLike.js +/opt/service_finder/frontend/node_modules/is-what/dist/isRegExp.js +/opt/service_finder/frontend/node_modules/is-what/dist/isPositiveInteger.js +/opt/service_finder/frontend/node_modules/is-what/dist/isBigInt.js +/opt/service_finder/frontend/node_modules/is-what/dist/isBlob.js +/opt/service_finder/frontend/node_modules/is-what/dist/isBoolean.js +/opt/service_finder/frontend/node_modules/is-what/dist/index.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isObject.js +/opt/service_finder/frontend/node_modules/is-what/dist/isNaNValue.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isUndefined.js +/opt/service_finder/frontend/node_modules/is-what/dist/isBlob.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isFullArray.js +/opt/service_finder/frontend/node_modules/is-what/dist/isAnyObject.js +/opt/service_finder/frontend/node_modules/is-what/dist/isPromise.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isDate.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/getType.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isFullString.js +/opt/service_finder/frontend/node_modules/is-what/dist/isUndefined.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isRegExp.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isFile.js +/opt/service_finder/frontend/node_modules/is-what/dist/isBigInt.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isEmptyArray.js +/opt/service_finder/frontend/node_modules/is-what/dist/isMap.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isEmptyObject.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isEmptyObject.js +/opt/service_finder/frontend/node_modules/is-what/dist/isNumber.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isError.js +/opt/service_finder/frontend/node_modules/is-what/dist/isMap.js +/opt/service_finder/frontend/node_modules/is-what/dist/isArray.js +/opt/service_finder/frontend/node_modules/is-what/dist/isString.js +/opt/service_finder/frontend/node_modules/is-what/dist/isOneOf.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isNumber.js +/opt/service_finder/frontend/node_modules/is-what/dist/isWeakMap.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isPlainObject.js +/opt/service_finder/frontend/node_modules/is-what/dist/isHexDecimal.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isBoolean.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isType.js +/opt/service_finder/frontend/node_modules/is-what/dist/isObject.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isPromise.js +/opt/service_finder/frontend/node_modules/is-what/dist/isFunction.js +/opt/service_finder/frontend/node_modules/is-what/dist/getType.js +/opt/service_finder/frontend/node_modules/is-what/dist/isFullObject.js +/opt/service_finder/frontend/node_modules/is-what/dist/isObjectLike.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isNull.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isInstanceOf.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isPrimitive.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isInstanceOf.js +/opt/service_finder/frontend/node_modules/is-what/dist/isNegativeInteger.js +/opt/service_finder/frontend/node_modules/is-what/dist/index.js +/opt/service_finder/frontend/node_modules/is-what/dist/isArray.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isPositiveNumber.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isEmptyArray.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isNull.js +/opt/service_finder/frontend/node_modules/is-what/dist/isEmptyString.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isNullOrUndefined.js +/opt/service_finder/frontend/node_modules/is-what/dist/isPrimitive.js +/opt/service_finder/frontend/node_modules/is-what/dist/isFullObject.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isFullString.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isFile.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isNegativeInteger.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isSymbol.js +/opt/service_finder/frontend/node_modules/is-what/dist/isError.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isPositiveInteger.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isNegativeNumber.js +/opt/service_finder/frontend/node_modules/is-what/dist/isWeakSet.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isEmptyString.js +/opt/service_finder/frontend/node_modules/is-what/dist/isHexDecimal.js +/opt/service_finder/frontend/node_modules/is-what/dist/isDate.js +/opt/service_finder/frontend/node_modules/is-what/dist/isSet.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isPlainObject.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isAnyObject.d.ts +/opt/service_finder/frontend/node_modules/is-what/dist/isInteger.js +/opt/service_finder/frontend/node_modules/is-what/LICENSE +/opt/service_finder/frontend/node_modules/is-what/README.md +/opt/service_finder/frontend/node_modules/tailwindcss +/opt/service_finder/frontend/node_modules/tailwindcss/preflight.css +/opt/service_finder/frontend/node_modules/tailwindcss/theme.css +/opt/service_finder/frontend/node_modules/tailwindcss/package.json +/opt/service_finder/frontend/node_modules/tailwindcss/dist +/opt/service_finder/frontend/node_modules/tailwindcss/dist/plugin.js +/opt/service_finder/frontend/node_modules/tailwindcss/dist/flatten-color-palette.js +/opt/service_finder/frontend/node_modules/tailwindcss/dist/colors-b_6i0Oi7.d.ts +/opt/service_finder/frontend/node_modules/tailwindcss/dist/plugin.d.mts +/opt/service_finder/frontend/node_modules/tailwindcss/dist/plugin.d.ts +/opt/service_finder/frontend/node_modules/tailwindcss/dist/flatten-color-palette.d.ts +/opt/service_finder/frontend/node_modules/tailwindcss/dist/types-CJYAW1ql.d.mts +/opt/service_finder/frontend/node_modules/tailwindcss/dist/default-theme.mjs +/opt/service_finder/frontend/node_modules/tailwindcss/dist/colors.d.ts +/opt/service_finder/frontend/node_modules/tailwindcss/dist/chunk-HTB5LLOP.mjs +/opt/service_finder/frontend/node_modules/tailwindcss/dist/colors.js +/opt/service_finder/frontend/node_modules/tailwindcss/dist/resolve-config-QUZ9b-Gn.d.mts +/opt/service_finder/frontend/node_modules/tailwindcss/dist/default-theme.d.mts +/opt/service_finder/frontend/node_modules/tailwindcss/dist/flatten-color-palette.d.mts +/opt/service_finder/frontend/node_modules/tailwindcss/dist/lib.d.ts +/opt/service_finder/frontend/node_modules/tailwindcss/dist/resolve-config-BIFUA2FY.d.ts +/opt/service_finder/frontend/node_modules/tailwindcss/dist/colors.d.mts +/opt/service_finder/frontend/node_modules/tailwindcss/dist/lib.mjs +/opt/service_finder/frontend/node_modules/tailwindcss/dist/chunk-GFBUASX3.mjs +/opt/service_finder/frontend/node_modules/tailwindcss/dist/flatten-color-palette.mjs +/opt/service_finder/frontend/node_modules/tailwindcss/dist/default-theme.d.ts +/opt/service_finder/frontend/node_modules/tailwindcss/dist/plugin.mjs +/opt/service_finder/frontend/node_modules/tailwindcss/dist/default-theme.js +/opt/service_finder/frontend/node_modules/tailwindcss/dist/lib.d.mts +/opt/service_finder/frontend/node_modules/tailwindcss/dist/lib.js +/opt/service_finder/frontend/node_modules/tailwindcss/dist/colors.mjs +/opt/service_finder/frontend/node_modules/tailwindcss/dist/chunk-CT46QCH7.mjs +/opt/service_finder/frontend/node_modules/tailwindcss/utilities.css +/opt/service_finder/frontend/node_modules/tailwindcss/LICENSE +/opt/service_finder/frontend/node_modules/tailwindcss/index.css +/opt/service_finder/frontend/node_modules/tailwindcss/README.md +/opt/service_finder/frontend/node_modules/get-intrinsic +/opt/service_finder/frontend/node_modules/get-intrinsic/test +/opt/service_finder/frontend/node_modules/get-intrinsic/test/GetIntrinsic.js +/opt/service_finder/frontend/node_modules/get-intrinsic/package.json +/opt/service_finder/frontend/node_modules/get-intrinsic/.github +/opt/service_finder/frontend/node_modules/get-intrinsic/.github/FUNDING.yml +/opt/service_finder/frontend/node_modules/get-intrinsic/.eslintrc +/opt/service_finder/frontend/node_modules/get-intrinsic/LICENSE +/opt/service_finder/frontend/node_modules/get-intrinsic/index.js +/opt/service_finder/frontend/node_modules/get-intrinsic/.nycrc +/opt/service_finder/frontend/node_modules/get-intrinsic/README.md +/opt/service_finder/frontend/node_modules/get-intrinsic/CHANGELOG.md +/opt/service_finder/frontend/node_modules/json5 +/opt/service_finder/frontend/node_modules/json5/lib +/opt/service_finder/frontend/node_modules/json5/lib/util.d.ts +/opt/service_finder/frontend/node_modules/json5/lib/stringify.js +/opt/service_finder/frontend/node_modules/json5/lib/index.d.ts +/opt/service_finder/frontend/node_modules/json5/lib/register.js +/opt/service_finder/frontend/node_modules/json5/lib/stringify.d.ts +/opt/service_finder/frontend/node_modules/json5/lib/require.js +/opt/service_finder/frontend/node_modules/json5/lib/util.js +/opt/service_finder/frontend/node_modules/json5/lib/index.js +/opt/service_finder/frontend/node_modules/json5/lib/unicode.js +/opt/service_finder/frontend/node_modules/json5/lib/parse.js +/opt/service_finder/frontend/node_modules/json5/lib/parse.d.ts +/opt/service_finder/frontend/node_modules/json5/lib/cli.js +/opt/service_finder/frontend/node_modules/json5/lib/unicode.d.ts +/opt/service_finder/frontend/node_modules/json5/package.json +/opt/service_finder/frontend/node_modules/json5/dist +/opt/service_finder/frontend/node_modules/json5/dist/index.min.js +/opt/service_finder/frontend/node_modules/json5/dist/index.min.mjs +/opt/service_finder/frontend/node_modules/json5/dist/index.js +/opt/service_finder/frontend/node_modules/json5/dist/index.mjs +/opt/service_finder/frontend/node_modules/json5/LICENSE.md +/opt/service_finder/frontend/node_modules/json5/README.md +/opt/service_finder/frontend/node_modules/superjson +/opt/service_finder/frontend/node_modules/superjson/package.json +/opt/service_finder/frontend/node_modules/superjson/dist +/opt/service_finder/frontend/node_modules/superjson/dist/class-registry.js +/opt/service_finder/frontend/node_modules/superjson/dist/plainer.js.map +/opt/service_finder/frontend/node_modules/superjson/dist/class-registry.js.map +/opt/service_finder/frontend/node_modules/superjson/dist/pathstringifier.js.map +/opt/service_finder/frontend/node_modules/superjson/dist/is.js.map +/opt/service_finder/frontend/node_modules/superjson/dist/util.d.ts +/opt/service_finder/frontend/node_modules/superjson/dist/class-registry.d.ts +/opt/service_finder/frontend/node_modules/superjson/dist/accessDeep.js.map +/opt/service_finder/frontend/node_modules/superjson/dist/double-indexed-kv.d.ts +/opt/service_finder/frontend/node_modules/superjson/dist/index.d.ts +/opt/service_finder/frontend/node_modules/superjson/dist/plainer.d.ts +/opt/service_finder/frontend/node_modules/superjson/dist/accessDeep.js +/opt/service_finder/frontend/node_modules/superjson/dist/accessDeep.d.ts +/opt/service_finder/frontend/node_modules/superjson/dist/types.d.ts +/opt/service_finder/frontend/node_modules/superjson/dist/is.d.ts +/opt/service_finder/frontend/node_modules/superjson/dist/custom-transformer-registry.d.ts +/opt/service_finder/frontend/node_modules/superjson/dist/double-indexed-kv.js +/opt/service_finder/frontend/node_modules/superjson/dist/registry.d.ts +/opt/service_finder/frontend/node_modules/superjson/dist/transformer.d.ts +/opt/service_finder/frontend/node_modules/superjson/dist/registry.js +/opt/service_finder/frontend/node_modules/superjson/dist/pathstringifier.js +/opt/service_finder/frontend/node_modules/superjson/dist/transformer.js +/opt/service_finder/frontend/node_modules/superjson/dist/pathstringifier.d.ts +/opt/service_finder/frontend/node_modules/superjson/dist/util.js +/opt/service_finder/frontend/node_modules/superjson/dist/custom-transformer-registry.js +/opt/service_finder/frontend/node_modules/superjson/dist/custom-transformer-registry.js.map +/opt/service_finder/frontend/node_modules/superjson/dist/index.js +/opt/service_finder/frontend/node_modules/superjson/dist/plainer.js +/opt/service_finder/frontend/node_modules/superjson/dist/util.js.map +/opt/service_finder/frontend/node_modules/superjson/dist/double-indexed-kv.js.map +/opt/service_finder/frontend/node_modules/superjson/dist/types.js.map +/opt/service_finder/frontend/node_modules/superjson/dist/types.js +/opt/service_finder/frontend/node_modules/superjson/dist/transformer.js.map +/opt/service_finder/frontend/node_modules/superjson/dist/index.js.map +/opt/service_finder/frontend/node_modules/superjson/dist/registry.js.map +/opt/service_finder/frontend/node_modules/superjson/dist/is.js +/opt/service_finder/frontend/node_modules/superjson/LICENSE +/opt/service_finder/frontend/node_modules/superjson/README.md +/opt/service_finder/frontend/node_modules/yaml +/opt/service_finder/frontend/node_modules/yaml/bin.mjs +/opt/service_finder/frontend/node_modules/yaml/package.json +/opt/service_finder/frontend/node_modules/yaml/dist +/opt/service_finder/frontend/node_modules/yaml/dist/doc +/opt/service_finder/frontend/node_modules/yaml/dist/doc/directives.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/doc/Document.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/doc/anchors.js +/opt/service_finder/frontend/node_modules/yaml/dist/doc/applyReviver.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/doc/createNode.js +/opt/service_finder/frontend/node_modules/yaml/dist/doc/anchors.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/doc/applyReviver.js +/opt/service_finder/frontend/node_modules/yaml/dist/doc/createNode.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/doc/Document.js +/opt/service_finder/frontend/node_modules/yaml/dist/doc/directives.js +/opt/service_finder/frontend/node_modules/yaml/dist/log.js +/opt/service_finder/frontend/node_modules/yaml/dist/util.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/public-api.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/index.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/public-api.js +/opt/service_finder/frontend/node_modules/yaml/dist/visit.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/cli.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/test-events.js +/opt/service_finder/frontend/node_modules/yaml/dist/visit.js +/opt/service_finder/frontend/node_modules/yaml/dist/schema +/opt/service_finder/frontend/node_modules/yaml/dist/schema/Schema.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/schema/core +/opt/service_finder/frontend/node_modules/yaml/dist/schema/core/float.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/schema/core/bool.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/schema/core/int.js +/opt/service_finder/frontend/node_modules/yaml/dist/schema/core/int.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/schema/core/bool.js +/opt/service_finder/frontend/node_modules/yaml/dist/schema/core/schema.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/schema/core/float.js +/opt/service_finder/frontend/node_modules/yaml/dist/schema/core/schema.js +/opt/service_finder/frontend/node_modules/yaml/dist/schema/common +/opt/service_finder/frontend/node_modules/yaml/dist/schema/common/seq.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/schema/common/string.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/schema/common/null.js +/opt/service_finder/frontend/node_modules/yaml/dist/schema/common/map.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/schema/common/null.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/schema/common/string.js +/opt/service_finder/frontend/node_modules/yaml/dist/schema/common/map.js +/opt/service_finder/frontend/node_modules/yaml/dist/schema/common/seq.js +/opt/service_finder/frontend/node_modules/yaml/dist/schema/json +/opt/service_finder/frontend/node_modules/yaml/dist/schema/json/schema.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/schema/json/schema.js +/opt/service_finder/frontend/node_modules/yaml/dist/schema/types.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/schema/json-schema.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/schema/Schema.js +/opt/service_finder/frontend/node_modules/yaml/dist/schema/tags.js +/opt/service_finder/frontend/node_modules/yaml/dist/schema/tags.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/schema/yaml-1.1 +/opt/service_finder/frontend/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +/opt/service_finder/frontend/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/schema/yaml-1.1/int.js +/opt/service_finder/frontend/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/schema/yaml-1.1/merge.js +/opt/service_finder/frontend/node_modules/yaml/dist/schema/yaml-1.1/bool.js +/opt/service_finder/frontend/node_modules/yaml/dist/schema/yaml-1.1/binary.js +/opt/service_finder/frontend/node_modules/yaml/dist/schema/yaml-1.1/omap.js +/opt/service_finder/frontend/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +/opt/service_finder/frontend/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/schema/yaml-1.1/float.js +/opt/service_finder/frontend/node_modules/yaml/dist/schema/yaml-1.1/schema.js +/opt/service_finder/frontend/node_modules/yaml/dist/schema/yaml-1.1/set.js +/opt/service_finder/frontend/node_modules/yaml/dist/log.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/errors.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/util.js +/opt/service_finder/frontend/node_modules/yaml/dist/test-events.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/index.js +/opt/service_finder/frontend/node_modules/yaml/dist/cli.mjs +/opt/service_finder/frontend/node_modules/yaml/dist/parse +/opt/service_finder/frontend/node_modules/yaml/dist/parse/cst-stringify.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/parse/cst-scalar.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/parse/cst-scalar.js +/opt/service_finder/frontend/node_modules/yaml/dist/parse/cst.js +/opt/service_finder/frontend/node_modules/yaml/dist/parse/cst-stringify.js +/opt/service_finder/frontend/node_modules/yaml/dist/parse/cst-visit.js +/opt/service_finder/frontend/node_modules/yaml/dist/parse/lexer.js +/opt/service_finder/frontend/node_modules/yaml/dist/parse/lexer.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/parse/line-counter.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/parse/line-counter.js +/opt/service_finder/frontend/node_modules/yaml/dist/parse/cst.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/parse/cst-visit.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/parse/parser.js +/opt/service_finder/frontend/node_modules/yaml/dist/parse/parser.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/errors.js +/opt/service_finder/frontend/node_modules/yaml/dist/options.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/compose +/opt/service_finder/frontend/node_modules/yaml/dist/compose/compose-doc.js +/opt/service_finder/frontend/node_modules/yaml/dist/compose/util-contains-newline.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/compose/resolve-end.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/compose/util-map-includes.js +/opt/service_finder/frontend/node_modules/yaml/dist/compose/util-flow-indent-check.js +/opt/service_finder/frontend/node_modules/yaml/dist/compose/compose-scalar.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/compose/resolve-block-map.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/compose/compose-doc.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/compose/composer.js +/opt/service_finder/frontend/node_modules/yaml/dist/compose/compose-node.js +/opt/service_finder/frontend/node_modules/yaml/dist/compose/compose-collection.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/compose/resolve-end.js +/opt/service_finder/frontend/node_modules/yaml/dist/compose/util-empty-scalar-position.js +/opt/service_finder/frontend/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/compose/util-contains-newline.js +/opt/service_finder/frontend/node_modules/yaml/dist/compose/composer.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/compose/compose-scalar.js +/opt/service_finder/frontend/node_modules/yaml/dist/compose/resolve-block-map.js +/opt/service_finder/frontend/node_modules/yaml/dist/compose/resolve-flow-scalar.js +/opt/service_finder/frontend/node_modules/yaml/dist/compose/compose-collection.js +/opt/service_finder/frontend/node_modules/yaml/dist/compose/resolve-props.js +/opt/service_finder/frontend/node_modules/yaml/dist/compose/resolve-block-scalar.js +/opt/service_finder/frontend/node_modules/yaml/dist/compose/util-map-includes.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/compose/compose-node.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/compose/resolve-props.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/compose/resolve-flow-collection.js +/opt/service_finder/frontend/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/compose/resolve-block-seq.js +/opt/service_finder/frontend/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/nodes +/opt/service_finder/frontend/node_modules/yaml/dist/nodes/Alias.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/nodes/Pair.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/nodes/Scalar.js +/opt/service_finder/frontend/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/nodes/Pair.js +/opt/service_finder/frontend/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/nodes/Node.js +/opt/service_finder/frontend/node_modules/yaml/dist/nodes/Node.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/nodes/Alias.js +/opt/service_finder/frontend/node_modules/yaml/dist/nodes/Scalar.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/nodes/YAMLMap.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/nodes/Collection.js +/opt/service_finder/frontend/node_modules/yaml/dist/nodes/toJS.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/nodes/identity.js +/opt/service_finder/frontend/node_modules/yaml/dist/nodes/addPairToJSMap.js +/opt/service_finder/frontend/node_modules/yaml/dist/nodes/identity.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/nodes/Collection.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/nodes/toJS.js +/opt/service_finder/frontend/node_modules/yaml/dist/nodes/YAMLMap.js +/opt/service_finder/frontend/node_modules/yaml/dist/nodes/YAMLSeq.js +/opt/service_finder/frontend/node_modules/yaml/dist/stringify +/opt/service_finder/frontend/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/stringify/stringifyPair.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/stringify/stringify.js +/opt/service_finder/frontend/node_modules/yaml/dist/stringify/stringifyDocument.js +/opt/service_finder/frontend/node_modules/yaml/dist/stringify/stringifyComment.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/stringify/foldFlowLines.js +/opt/service_finder/frontend/node_modules/yaml/dist/stringify/stringify.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/stringify/stringifyNumber.js +/opt/service_finder/frontend/node_modules/yaml/dist/stringify/stringifyString.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/stringify/stringifyCollection.js +/opt/service_finder/frontend/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +/opt/service_finder/frontend/node_modules/yaml/dist/stringify/stringifyPair.js +/opt/service_finder/frontend/node_modules/yaml/dist/stringify/stringifyString.js +/opt/service_finder/frontend/node_modules/yaml/dist/stringify/stringifyComment.js +/opt/service_finder/frontend/node_modules/yaml/util.js +/opt/service_finder/frontend/node_modules/yaml/LICENSE +/opt/service_finder/frontend/node_modules/yaml/browser +/opt/service_finder/frontend/node_modules/yaml/browser/package.json +/opt/service_finder/frontend/node_modules/yaml/browser/dist +/opt/service_finder/frontend/node_modules/yaml/browser/dist/doc +/opt/service_finder/frontend/node_modules/yaml/browser/dist/doc/anchors.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/doc/createNode.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/doc/applyReviver.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/doc/Document.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/doc/directives.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/log.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/public-api.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/visit.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/schema +/opt/service_finder/frontend/node_modules/yaml/browser/dist/schema/core +/opt/service_finder/frontend/node_modules/yaml/browser/dist/schema/core/int.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/schema/core/bool.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/schema/core/float.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/schema/core/schema.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/schema/common +/opt/service_finder/frontend/node_modules/yaml/browser/dist/schema/common/null.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/schema/common/string.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/schema/common/map.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/schema/common/seq.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/schema/json +/opt/service_finder/frontend/node_modules/yaml/browser/dist/schema/json/schema.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/schema/Schema.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/schema/tags.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/schema/yaml-1.1 +/opt/service_finder/frontend/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/util.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/index.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/parse +/opt/service_finder/frontend/node_modules/yaml/browser/dist/parse/cst-scalar.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/parse/cst.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/parse/cst-stringify.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/parse/cst-visit.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/parse/lexer.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/parse/line-counter.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/parse/parser.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/errors.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/compose +/opt/service_finder/frontend/node_modules/yaml/browser/dist/compose/compose-doc.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/compose/util-map-includes.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/compose/composer.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/compose/compose-node.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/compose/resolve-end.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/compose/util-contains-newline.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/compose/compose-scalar.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/compose/resolve-block-map.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/compose/compose-collection.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/compose/resolve-props.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/nodes +/opt/service_finder/frontend/node_modules/yaml/browser/dist/nodes/Scalar.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/nodes/Pair.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/nodes/Node.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/nodes/Alias.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/nodes/Collection.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/nodes/identity.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/nodes/toJS.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/nodes/YAMLMap.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/stringify +/opt/service_finder/frontend/node_modules/yaml/browser/dist/stringify/stringify.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/stringify/stringifyPair.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/stringify/stringifyString.js +/opt/service_finder/frontend/node_modules/yaml/browser/dist/stringify/stringifyComment.js +/opt/service_finder/frontend/node_modules/yaml/browser/index.js +/opt/service_finder/frontend/node_modules/yaml/README.md +/opt/service_finder/frontend/node_modules/update-browserslist-db +/opt/service_finder/frontend/node_modules/update-browserslist-db/check-npm-version.js +/opt/service_finder/frontend/node_modules/update-browserslist-db/index.d.ts +/opt/service_finder/frontend/node_modules/update-browserslist-db/package.json +/opt/service_finder/frontend/node_modules/update-browserslist-db/utils.js +/opt/service_finder/frontend/node_modules/update-browserslist-db/LICENSE +/opt/service_finder/frontend/node_modules/update-browserslist-db/index.js +/opt/service_finder/frontend/node_modules/update-browserslist-db/README.md +/opt/service_finder/frontend/node_modules/update-browserslist-db/cli.js +/opt/service_finder/frontend/node_modules/@vue-macros +/opt/service_finder/frontend/node_modules/@vue-macros/common +/opt/service_finder/frontend/node_modules/@vue-macros/common/package.json +/opt/service_finder/frontend/node_modules/@vue-macros/common/dist +/opt/service_finder/frontend/node_modules/@vue-macros/common/dist/index.d.ts +/opt/service_finder/frontend/node_modules/@vue-macros/common/dist/index.js +/opt/service_finder/frontend/node_modules/@vue-macros/common/LICENSE +/opt/service_finder/frontend/node_modules/csstype +/opt/service_finder/frontend/node_modules/csstype/index.d.ts +/opt/service_finder/frontend/node_modules/csstype/package.json +/opt/service_finder/frontend/node_modules/csstype/LICENSE +/opt/service_finder/frontend/node_modules/csstype/index.js.flow +/opt/service_finder/frontend/node_modules/csstype/README.md +/opt/service_finder/frontend/node_modules/muggle-string +/opt/service_finder/frontend/node_modules/muggle-string/out +/opt/service_finder/frontend/node_modules/muggle-string/out/track.js +/opt/service_finder/frontend/node_modules/muggle-string/out/toString.js +/opt/service_finder/frontend/node_modules/muggle-string/out/common.js +/opt/service_finder/frontend/node_modules/muggle-string/out/segment.d.ts +/opt/service_finder/frontend/node_modules/muggle-string/out/index.d.ts +/opt/service_finder/frontend/node_modules/muggle-string/out/map.d.ts +/opt/service_finder/frontend/node_modules/muggle-string/out/types.d.ts +/opt/service_finder/frontend/node_modules/muggle-string/out/toString.d.ts +/opt/service_finder/frontend/node_modules/muggle-string/out/overwriteSource.js +/opt/service_finder/frontend/node_modules/muggle-string/out/track.d.ts +/opt/service_finder/frontend/node_modules/muggle-string/out/sourceBased.d.ts +/opt/service_finder/frontend/node_modules/muggle-string/out/sourceBased.js +/opt/service_finder/frontend/node_modules/muggle-string/out/replace.d.ts +/opt/service_finder/frontend/node_modules/muggle-string/out/segment.js +/opt/service_finder/frontend/node_modules/muggle-string/out/overwriteSource.d.ts +/opt/service_finder/frontend/node_modules/muggle-string/out/common.d.ts +/opt/service_finder/frontend/node_modules/muggle-string/out/binarySearch.d.ts +/opt/service_finder/frontend/node_modules/muggle-string/out/getLength.d.ts +/opt/service_finder/frontend/node_modules/muggle-string/out/basic.js +/opt/service_finder/frontend/node_modules/muggle-string/out/basic.d.ts +/opt/service_finder/frontend/node_modules/muggle-string/out/replace.js +/opt/service_finder/frontend/node_modules/muggle-string/out/binarySearch.js +/opt/service_finder/frontend/node_modules/muggle-string/out/index.js +/opt/service_finder/frontend/node_modules/muggle-string/out/getLength.js +/opt/service_finder/frontend/node_modules/muggle-string/out/map.js +/opt/service_finder/frontend/node_modules/muggle-string/out/base.d.ts +/opt/service_finder/frontend/node_modules/muggle-string/out/types.js +/opt/service_finder/frontend/node_modules/muggle-string/out/base.js +/opt/service_finder/frontend/node_modules/muggle-string/package.json +/opt/service_finder/frontend/node_modules/muggle-string/LICENSE +/opt/service_finder/frontend/node_modules/muggle-string/README.md +/opt/service_finder/frontend/node_modules/quansync +/opt/service_finder/frontend/node_modules/quansync/package.json +/opt/service_finder/frontend/node_modules/quansync/dist +/opt/service_finder/frontend/node_modules/quansync/dist/macro.mjs +/opt/service_finder/frontend/node_modules/quansync/dist/index.d.ts +/opt/service_finder/frontend/node_modules/quansync/dist/macro.d.mts +/opt/service_finder/frontend/node_modules/quansync/dist/macro.d.ts +/opt/service_finder/frontend/node_modules/quansync/dist/types.cjs +/opt/service_finder/frontend/node_modules/quansync/dist/types.d.ts +/opt/service_finder/frontend/node_modules/quansync/dist/types.mjs +/opt/service_finder/frontend/node_modules/quansync/dist/index.cjs +/opt/service_finder/frontend/node_modules/quansync/dist/types.d.cts +/opt/service_finder/frontend/node_modules/quansync/dist/macro.d.cts +/opt/service_finder/frontend/node_modules/quansync/dist/types.d.mts +/opt/service_finder/frontend/node_modules/quansync/dist/index.d.mts +/opt/service_finder/frontend/node_modules/quansync/dist/index.d.cts +/opt/service_finder/frontend/node_modules/quansync/dist/macro.cjs +/opt/service_finder/frontend/node_modules/quansync/dist/index.mjs +/opt/service_finder/frontend/node_modules/quansync/LICENSE.md +/opt/service_finder/frontend/node_modules/quansync/README.md +/opt/service_finder/frontend/node_modules/.vite-temp +/opt/service_finder/frontend/node_modules/exsolve +/opt/service_finder/frontend/node_modules/exsolve/package.json +/opt/service_finder/frontend/node_modules/exsolve/dist +/opt/service_finder/frontend/node_modules/exsolve/dist/index.d.mts +/opt/service_finder/frontend/node_modules/exsolve/dist/index.mjs +/opt/service_finder/frontend/node_modules/exsolve/LICENSE +/opt/service_finder/frontend/node_modules/exsolve/README.md +/opt/service_finder/frontend/node_modules/esbuild +/opt/service_finder/frontend/node_modules/esbuild/install.js +/opt/service_finder/frontend/node_modules/esbuild/lib +/opt/service_finder/frontend/node_modules/esbuild/lib/main.d.ts +/opt/service_finder/frontend/node_modules/esbuild/lib/main.js +/opt/service_finder/frontend/node_modules/esbuild/package.json +/opt/service_finder/frontend/node_modules/esbuild/bin +/opt/service_finder/frontend/node_modules/esbuild/bin/esbuild +/opt/service_finder/frontend/node_modules/esbuild/LICENSE.md +/opt/service_finder/frontend/node_modules/esbuild/README.md +/opt/service_finder/frontend/node_modules/readdirp +/opt/service_finder/frontend/node_modules/readdirp/index.d.ts +/opt/service_finder/frontend/node_modules/readdirp/package.json +/opt/service_finder/frontend/node_modules/readdirp/LICENSE +/opt/service_finder/frontend/node_modules/readdirp/index.js +/opt/service_finder/frontend/node_modules/readdirp/README.md +/opt/service_finder/frontend/node_modules/mlly +/opt/service_finder/frontend/node_modules/mlly/package.json +/opt/service_finder/frontend/node_modules/mlly/dist +/opt/service_finder/frontend/node_modules/mlly/dist/index.d.ts +/opt/service_finder/frontend/node_modules/mlly/dist/index.cjs +/opt/service_finder/frontend/node_modules/mlly/dist/index.d.mts +/opt/service_finder/frontend/node_modules/mlly/dist/index.d.cts +/opt/service_finder/frontend/node_modules/mlly/dist/index.mjs +/opt/service_finder/frontend/node_modules/mlly/LICENSE +/opt/service_finder/frontend/node_modules/mlly/node_modules +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/package.json +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/shared +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/shared/confbox.6b479c78.cjs +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/shared/confbox.9745c98f.d.ts +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/shared/confbox.9388d834.mjs +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/shared/confbox.9745c98f.d.cts +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/shared/confbox.f9f03f05.mjs +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/shared/confbox.9745c98f.d.mts +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/shared/confbox.3768c7e9.cjs +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/yaml.cjs +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/yaml.mjs +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/yaml.d.cts +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/jsonc.mjs +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/json5.d.mts +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/index.d.ts +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/yaml.d.mts +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/json5.mjs +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/json5.d.ts +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/index.cjs +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/jsonc.d.cts +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/json5.d.cts +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/jsonc.d.mts +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/yaml.d.ts +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/jsonc.cjs +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/toml.d.ts +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/toml.d.cts +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/toml.cjs +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/json5.cjs +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/index.d.mts +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/index.d.cts +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/index.mjs +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/toml.d.mts +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/toml.mjs +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/dist/jsonc.d.ts +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/json5.d.ts +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/yaml.d.ts +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/LICENSE +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/toml.d.ts +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/README.md +/opt/service_finder/frontend/node_modules/mlly/node_modules/confbox/jsonc.d.ts +/opt/service_finder/frontend/node_modules/mlly/node_modules/pkg-types +/opt/service_finder/frontend/node_modules/mlly/node_modules/pkg-types/package.json +/opt/service_finder/frontend/node_modules/mlly/node_modules/pkg-types/dist +/opt/service_finder/frontend/node_modules/mlly/node_modules/pkg-types/dist/index.d.ts +/opt/service_finder/frontend/node_modules/mlly/node_modules/pkg-types/dist/index.cjs +/opt/service_finder/frontend/node_modules/mlly/node_modules/pkg-types/dist/index.d.mts +/opt/service_finder/frontend/node_modules/mlly/node_modules/pkg-types/dist/index.d.cts +/opt/service_finder/frontend/node_modules/mlly/node_modules/pkg-types/dist/index.mjs +/opt/service_finder/frontend/node_modules/mlly/node_modules/pkg-types/LICENSE +/opt/service_finder/frontend/node_modules/mlly/node_modules/pkg-types/README.md +/opt/service_finder/frontend/node_modules/mlly/README.md +/opt/service_finder/frontend/node_modules/hookable +/opt/service_finder/frontend/node_modules/hookable/package.json +/opt/service_finder/frontend/node_modules/hookable/dist +/opt/service_finder/frontend/node_modules/hookable/dist/index.d.ts +/opt/service_finder/frontend/node_modules/hookable/dist/index.cjs +/opt/service_finder/frontend/node_modules/hookable/dist/index.mjs +/opt/service_finder/frontend/node_modules/hookable/LICENSE.md +/opt/service_finder/frontend/node_modules/hookable/README.md +/opt/service_finder/frontend/node_modules/scule +/opt/service_finder/frontend/node_modules/scule/package.json +/opt/service_finder/frontend/node_modules/scule/dist +/opt/service_finder/frontend/node_modules/scule/dist/index.d.ts +/opt/service_finder/frontend/node_modules/scule/dist/index.cjs +/opt/service_finder/frontend/node_modules/scule/dist/index.d.mts +/opt/service_finder/frontend/node_modules/scule/dist/index.d.cts +/opt/service_finder/frontend/node_modules/scule/dist/index.mjs +/opt/service_finder/frontend/node_modules/scule/LICENSE +/opt/service_finder/frontend/node_modules/scule/README.md +/opt/service_finder/frontend/node_modules/math-intrinsics +/opt/service_finder/frontend/node_modules/math-intrinsics/pow.js +/opt/service_finder/frontend/node_modules/math-intrinsics/floor.d.ts +/opt/service_finder/frontend/node_modules/math-intrinsics/pow.d.ts +/opt/service_finder/frontend/node_modules/math-intrinsics/max.d.ts +/opt/service_finder/frontend/node_modules/math-intrinsics/round.js +/opt/service_finder/frontend/node_modules/math-intrinsics/isInteger.d.ts +/opt/service_finder/frontend/node_modules/math-intrinsics/test +/opt/service_finder/frontend/node_modules/math-intrinsics/test/index.js +/opt/service_finder/frontend/node_modules/math-intrinsics/abs.d.ts +/opt/service_finder/frontend/node_modules/math-intrinsics/mod.js +/opt/service_finder/frontend/node_modules/math-intrinsics/isFinite.js +/opt/service_finder/frontend/node_modules/math-intrinsics/isNegativeZero.d.ts +/opt/service_finder/frontend/node_modules/math-intrinsics/tsconfig.json +/opt/service_finder/frontend/node_modules/math-intrinsics/package.json +/opt/service_finder/frontend/node_modules/math-intrinsics/isFinite.d.ts +/opt/service_finder/frontend/node_modules/math-intrinsics/floor.js +/opt/service_finder/frontend/node_modules/math-intrinsics/abs.js +/opt/service_finder/frontend/node_modules/math-intrinsics/.github +/opt/service_finder/frontend/node_modules/math-intrinsics/.github/FUNDING.yml +/opt/service_finder/frontend/node_modules/math-intrinsics/sign.d.ts +/opt/service_finder/frontend/node_modules/math-intrinsics/.eslintrc +/opt/service_finder/frontend/node_modules/math-intrinsics/isNaN.js +/opt/service_finder/frontend/node_modules/math-intrinsics/sign.js +/opt/service_finder/frontend/node_modules/math-intrinsics/LICENSE +/opt/service_finder/frontend/node_modules/math-intrinsics/constants +/opt/service_finder/frontend/node_modules/math-intrinsics/constants/maxArrayLength.js +/opt/service_finder/frontend/node_modules/math-intrinsics/constants/maxSafeInteger.d.ts +/opt/service_finder/frontend/node_modules/math-intrinsics/constants/maxValue.js +/opt/service_finder/frontend/node_modules/math-intrinsics/constants/maxValue.d.ts +/opt/service_finder/frontend/node_modules/math-intrinsics/constants/maxSafeInteger.js +/opt/service_finder/frontend/node_modules/math-intrinsics/constants/maxArrayLength.d.ts +/opt/service_finder/frontend/node_modules/math-intrinsics/isNegativeZero.js +/opt/service_finder/frontend/node_modules/math-intrinsics/min.d.ts +/opt/service_finder/frontend/node_modules/math-intrinsics/README.md +/opt/service_finder/frontend/node_modules/math-intrinsics/mod.d.ts +/opt/service_finder/frontend/node_modules/math-intrinsics/min.js +/opt/service_finder/frontend/node_modules/math-intrinsics/isNaN.d.ts +/opt/service_finder/frontend/node_modules/math-intrinsics/CHANGELOG.md +/opt/service_finder/frontend/node_modules/math-intrinsics/max.js +/opt/service_finder/frontend/node_modules/math-intrinsics/isInteger.js +/opt/service_finder/frontend/node_modules/math-intrinsics/round.d.ts +/opt/service_finder/frontend/node_modules/chokidar +/opt/service_finder/frontend/node_modules/chokidar/index.d.ts +/opt/service_finder/frontend/node_modules/chokidar/package.json +/opt/service_finder/frontend/node_modules/chokidar/handler.d.ts +/opt/service_finder/frontend/node_modules/chokidar/handler.js +/opt/service_finder/frontend/node_modules/chokidar/LICENSE +/opt/service_finder/frontend/node_modules/chokidar/index.js +/opt/service_finder/frontend/node_modules/chokidar/README.md +/opt/service_finder/frontend/node_modules/nanoid +/opt/service_finder/frontend/node_modules/nanoid/index.d.ts +/opt/service_finder/frontend/node_modules/nanoid/index.browser.js +/opt/service_finder/frontend/node_modules/nanoid/index.browser.cjs +/opt/service_finder/frontend/node_modules/nanoid/package.json +/opt/service_finder/frontend/node_modules/nanoid/bin +/opt/service_finder/frontend/node_modules/nanoid/bin/nanoid.cjs +/opt/service_finder/frontend/node_modules/nanoid/index.cjs +/opt/service_finder/frontend/node_modules/nanoid/async +/opt/service_finder/frontend/node_modules/nanoid/async/index.d.ts +/opt/service_finder/frontend/node_modules/nanoid/async/index.browser.js +/opt/service_finder/frontend/node_modules/nanoid/async/index.browser.cjs +/opt/service_finder/frontend/node_modules/nanoid/async/package.json +/opt/service_finder/frontend/node_modules/nanoid/async/index.cjs +/opt/service_finder/frontend/node_modules/nanoid/async/index.js +/opt/service_finder/frontend/node_modules/nanoid/async/index.native.js +/opt/service_finder/frontend/node_modules/nanoid/url-alphabet +/opt/service_finder/frontend/node_modules/nanoid/url-alphabet/package.json +/opt/service_finder/frontend/node_modules/nanoid/url-alphabet/index.cjs +/opt/service_finder/frontend/node_modules/nanoid/url-alphabet/index.js +/opt/service_finder/frontend/node_modules/nanoid/nanoid.js +/opt/service_finder/frontend/node_modules/nanoid/LICENSE +/opt/service_finder/frontend/node_modules/nanoid/index.js +/opt/service_finder/frontend/node_modules/nanoid/README.md +/opt/service_finder/frontend/node_modules/nanoid/index.d.cts +/opt/service_finder/frontend/node_modules/nanoid/non-secure +/opt/service_finder/frontend/node_modules/nanoid/non-secure/index.d.ts +/opt/service_finder/frontend/node_modules/nanoid/non-secure/package.json +/opt/service_finder/frontend/node_modules/nanoid/non-secure/index.cjs +/opt/service_finder/frontend/node_modules/nanoid/non-secure/index.js +/opt/service_finder/frontend/node_modules/vue-chartjs +/opt/service_finder/frontend/node_modules/vue-chartjs/package.json +/opt/service_finder/frontend/node_modules/vue-chartjs/dist +/opt/service_finder/frontend/node_modules/vue-chartjs/dist/types.d.ts.map +/opt/service_finder/frontend/node_modules/vue-chartjs/dist/index.cjs.map +/opt/service_finder/frontend/node_modules/vue-chartjs/dist/index.d.ts +/opt/service_finder/frontend/node_modules/vue-chartjs/dist/props.d.ts.map +/opt/service_finder/frontend/node_modules/vue-chartjs/dist/types.d.ts +/opt/service_finder/frontend/node_modules/vue-chartjs/dist/index.cjs +/opt/service_finder/frontend/node_modules/vue-chartjs/dist/typedCharts.d.ts +/opt/service_finder/frontend/node_modules/vue-chartjs/dist/utils.d.ts.map +/opt/service_finder/frontend/node_modules/vue-chartjs/dist/typedCharts.d.ts.map +/opt/service_finder/frontend/node_modules/vue-chartjs/dist/utils.d.ts +/opt/service_finder/frontend/node_modules/vue-chartjs/dist/index.js +/opt/service_finder/frontend/node_modules/vue-chartjs/dist/chart.d.ts +/opt/service_finder/frontend/node_modules/vue-chartjs/dist/index.d.ts.map +/opt/service_finder/frontend/node_modules/vue-chartjs/dist/chart.d.ts.map +/opt/service_finder/frontend/node_modules/vue-chartjs/dist/props.d.ts +/opt/service_finder/frontend/node_modules/vue-chartjs/dist/index.js.map +/opt/service_finder/frontend/node_modules/vue-chartjs/LICENSE +/opt/service_finder/frontend/node_modules/vue-chartjs/README.md +/opt/service_finder/frontend/node_modules/rollup +/opt/service_finder/frontend/node_modules/rollup/package.json +/opt/service_finder/frontend/node_modules/rollup/dist +/opt/service_finder/frontend/node_modules/rollup/dist/shared +/opt/service_finder/frontend/node_modules/rollup/dist/shared/parseAst.js +/opt/service_finder/frontend/node_modules/rollup/dist/shared/rollup.js +/opt/service_finder/frontend/node_modules/rollup/dist/shared/loadConfigFile.js +/opt/service_finder/frontend/node_modules/rollup/dist/shared/fsevents-importer.js +/opt/service_finder/frontend/node_modules/rollup/dist/shared/index.js +/opt/service_finder/frontend/node_modules/rollup/dist/shared/watch-cli.js +/opt/service_finder/frontend/node_modules/rollup/dist/shared/watch.js +/opt/service_finder/frontend/node_modules/rollup/dist/parseAst.js +/opt/service_finder/frontend/node_modules/rollup/dist/loadConfigFile.d.ts +/opt/service_finder/frontend/node_modules/rollup/dist/getLogFilter.d.ts +/opt/service_finder/frontend/node_modules/rollup/dist/native.js +/opt/service_finder/frontend/node_modules/rollup/dist/rollup.js +/opt/service_finder/frontend/node_modules/rollup/dist/parseAst.d.ts +/opt/service_finder/frontend/node_modules/rollup/dist/loadConfigFile.js +/opt/service_finder/frontend/node_modules/rollup/dist/es +/opt/service_finder/frontend/node_modules/rollup/dist/es/shared +/opt/service_finder/frontend/node_modules/rollup/dist/es/shared/parseAst.js +/opt/service_finder/frontend/node_modules/rollup/dist/es/shared/node-entry.js +/opt/service_finder/frontend/node_modules/rollup/dist/es/shared/watch.js +/opt/service_finder/frontend/node_modules/rollup/dist/es/parseAst.js +/opt/service_finder/frontend/node_modules/rollup/dist/es/rollup.js +/opt/service_finder/frontend/node_modules/rollup/dist/es/package.json +/opt/service_finder/frontend/node_modules/rollup/dist/es/getLogFilter.js +/opt/service_finder/frontend/node_modules/rollup/dist/bin +/opt/service_finder/frontend/node_modules/rollup/dist/bin/rollup +/opt/service_finder/frontend/node_modules/rollup/dist/getLogFilter.js +/opt/service_finder/frontend/node_modules/rollup/dist/rollup.d.ts +/opt/service_finder/frontend/node_modules/rollup/LICENSE.md +/opt/service_finder/frontend/node_modules/rollup/README.md +/opt/service_finder/frontend/node_modules/proxy-from-env +/opt/service_finder/frontend/node_modules/proxy-from-env/test.js +/opt/service_finder/frontend/node_modules/proxy-from-env/.travis.yml +/opt/service_finder/frontend/node_modules/proxy-from-env/package.json +/opt/service_finder/frontend/node_modules/proxy-from-env/.eslintrc +/opt/service_finder/frontend/node_modules/proxy-from-env/LICENSE +/opt/service_finder/frontend/node_modules/proxy-from-env/index.js +/opt/service_finder/frontend/node_modules/proxy-from-env/README.md +/opt/service_finder/frontend/node_modules/rfdc +/opt/service_finder/frontend/node_modules/rfdc/index.test-d.ts +/opt/service_finder/frontend/node_modules/rfdc/readme.md +/opt/service_finder/frontend/node_modules/rfdc/index.d.ts +/opt/service_finder/frontend/node_modules/rfdc/test +/opt/service_finder/frontend/node_modules/rfdc/test/index.js +/opt/service_finder/frontend/node_modules/rfdc/package.json +/opt/service_finder/frontend/node_modules/rfdc/.github +/opt/service_finder/frontend/node_modules/rfdc/.github/workflows +/opt/service_finder/frontend/node_modules/rfdc/.github/workflows/ci.yml +/opt/service_finder/frontend/node_modules/rfdc/LICENSE +/opt/service_finder/frontend/node_modules/rfdc/index.js +/opt/service_finder/frontend/node_modules/rfdc/default.js +/opt/service_finder/frontend/node_modules/fdir +/opt/service_finder/frontend/node_modules/fdir/package.json +/opt/service_finder/frontend/node_modules/fdir/dist +/opt/service_finder/frontend/node_modules/fdir/dist/index.cjs +/opt/service_finder/frontend/node_modules/fdir/dist/index.d.mts +/opt/service_finder/frontend/node_modules/fdir/dist/index.d.cts +/opt/service_finder/frontend/node_modules/fdir/dist/index.mjs +/opt/service_finder/frontend/node_modules/fdir/LICENSE +/opt/service_finder/frontend/node_modules/fdir/README.md +/opt/service_finder/frontend/node_modules/ufo +/opt/service_finder/frontend/node_modules/ufo/package.json +/opt/service_finder/frontend/node_modules/ufo/dist +/opt/service_finder/frontend/node_modules/ufo/dist/index.d.ts +/opt/service_finder/frontend/node_modules/ufo/dist/index.cjs +/opt/service_finder/frontend/node_modules/ufo/dist/index.d.mts +/opt/service_finder/frontend/node_modules/ufo/dist/index.d.cts +/opt/service_finder/frontend/node_modules/ufo/dist/index.mjs +/opt/service_finder/frontend/node_modules/ufo/LICENSE +/opt/service_finder/frontend/node_modules/ufo/README.md +/opt/service_finder/frontend/node_modules/entities +/opt/service_finder/frontend/node_modules/entities/src +/opt/service_finder/frontend/node_modules/entities/src/encode.ts +/opt/service_finder/frontend/node_modules/entities/src/internal +/opt/service_finder/frontend/node_modules/entities/src/internal/decode-shared.ts +/opt/service_finder/frontend/node_modules/entities/src/internal/encode-shared.ts +/opt/service_finder/frontend/node_modules/entities/src/internal/bin-trie-flags.ts +/opt/service_finder/frontend/node_modules/entities/src/index.ts +/opt/service_finder/frontend/node_modules/entities/src/escape.ts +/opt/service_finder/frontend/node_modules/entities/src/decode.ts +/opt/service_finder/frontend/node_modules/entities/src/decode-codepoint.ts +/opt/service_finder/frontend/node_modules/entities/src/generated +/opt/service_finder/frontend/node_modules/entities/src/generated/decode-data-html.ts +/opt/service_finder/frontend/node_modules/entities/src/generated/.eslintrc.json +/opt/service_finder/frontend/node_modules/entities/src/generated/decode-data-xml.ts +/opt/service_finder/frontend/node_modules/entities/src/generated/encode-html.ts +/opt/service_finder/frontend/node_modules/entities/readme.md +/opt/service_finder/frontend/node_modules/entities/decode.js +/opt/service_finder/frontend/node_modules/entities/package.json +/opt/service_finder/frontend/node_modules/entities/dist +/opt/service_finder/frontend/node_modules/entities/dist/commonjs +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/decode-codepoint.js.map +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/internal +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/internal/bin-trie-flags.d.ts +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/internal/encode-shared.d.ts.map +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/internal/encode-shared.d.ts +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/internal/decode-shared.js +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/internal/decode-shared.d.ts +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/internal/decode-shared.d.ts.map +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/internal/bin-trie-flags.js +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/internal/decode-shared.js.map +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/internal/encode-shared.js +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/internal/bin-trie-flags.js.map +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/internal/bin-trie-flags.d.ts.map +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/internal/encode-shared.js.map +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/decode.js.map +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/decode.js +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/escape.d.ts.map +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/index.d.ts +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/encode.d.ts.map +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/package.json +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/escape.d.ts +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/encode.js.map +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/escape.js.map +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/decode.d.ts +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/decode-codepoint.d.ts +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/decode-codepoint.js +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/encode.d.ts +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/index.js +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/decode.d.ts.map +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/encode.js +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/decode-codepoint.d.ts.map +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/escape.js +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/index.d.ts.map +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/index.js.map +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/generated +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/generated/decode-data-xml.d.ts.map +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/generated/decode-data-xml.js +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/generated/encode-html.d.ts +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/generated/encode-html.js.map +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/generated/decode-data-xml.js.map +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/generated/decode-data-html.d.ts +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/generated/decode-data-html.js.map +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/generated/encode-html.js +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/generated/decode-data-html.js +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/generated/encode-html.d.ts.map +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/generated/decode-data-xml.d.ts +/opt/service_finder/frontend/node_modules/entities/dist/commonjs/generated/decode-data-html.d.ts.map +/opt/service_finder/frontend/node_modules/entities/dist/esm +/opt/service_finder/frontend/node_modules/entities/dist/esm/decode-codepoint.js.map +/opt/service_finder/frontend/node_modules/entities/dist/esm/internal +/opt/service_finder/frontend/node_modules/entities/dist/esm/internal/bin-trie-flags.d.ts +/opt/service_finder/frontend/node_modules/entities/dist/esm/internal/encode-shared.d.ts.map +/opt/service_finder/frontend/node_modules/entities/dist/esm/internal/encode-shared.d.ts +/opt/service_finder/frontend/node_modules/entities/dist/esm/internal/decode-shared.js +/opt/service_finder/frontend/node_modules/entities/dist/esm/internal/decode-shared.d.ts +/opt/service_finder/frontend/node_modules/entities/dist/esm/internal/decode-shared.d.ts.map +/opt/service_finder/frontend/node_modules/entities/dist/esm/internal/bin-trie-flags.js +/opt/service_finder/frontend/node_modules/entities/dist/esm/internal/decode-shared.js.map +/opt/service_finder/frontend/node_modules/entities/dist/esm/internal/encode-shared.js +/opt/service_finder/frontend/node_modules/entities/dist/esm/internal/bin-trie-flags.js.map +/opt/service_finder/frontend/node_modules/entities/dist/esm/internal/bin-trie-flags.d.ts.map +/opt/service_finder/frontend/node_modules/entities/dist/esm/internal/encode-shared.js.map +/opt/service_finder/frontend/node_modules/entities/dist/esm/decode.js.map +/opt/service_finder/frontend/node_modules/entities/dist/esm/decode.js +/opt/service_finder/frontend/node_modules/entities/dist/esm/escape.d.ts.map +/opt/service_finder/frontend/node_modules/entities/dist/esm/index.d.ts +/opt/service_finder/frontend/node_modules/entities/dist/esm/encode.d.ts.map +/opt/service_finder/frontend/node_modules/entities/dist/esm/package.json +/opt/service_finder/frontend/node_modules/entities/dist/esm/escape.d.ts +/opt/service_finder/frontend/node_modules/entities/dist/esm/encode.js.map +/opt/service_finder/frontend/node_modules/entities/dist/esm/escape.js.map +/opt/service_finder/frontend/node_modules/entities/dist/esm/decode.d.ts +/opt/service_finder/frontend/node_modules/entities/dist/esm/decode-codepoint.d.ts +/opt/service_finder/frontend/node_modules/entities/dist/esm/decode-codepoint.js +/opt/service_finder/frontend/node_modules/entities/dist/esm/encode.d.ts +/opt/service_finder/frontend/node_modules/entities/dist/esm/index.js +/opt/service_finder/frontend/node_modules/entities/dist/esm/decode.d.ts.map +/opt/service_finder/frontend/node_modules/entities/dist/esm/encode.js +/opt/service_finder/frontend/node_modules/entities/dist/esm/decode-codepoint.d.ts.map +/opt/service_finder/frontend/node_modules/entities/dist/esm/escape.js +/opt/service_finder/frontend/node_modules/entities/dist/esm/index.d.ts.map +/opt/service_finder/frontend/node_modules/entities/dist/esm/index.js.map +/opt/service_finder/frontend/node_modules/entities/dist/esm/generated +/opt/service_finder/frontend/node_modules/entities/dist/esm/generated/decode-data-xml.d.ts.map +/opt/service_finder/frontend/node_modules/entities/dist/esm/generated/decode-data-xml.js +/opt/service_finder/frontend/node_modules/entities/dist/esm/generated/encode-html.d.ts +/opt/service_finder/frontend/node_modules/entities/dist/esm/generated/encode-html.js.map +/opt/service_finder/frontend/node_modules/entities/dist/esm/generated/decode-data-xml.js.map +/opt/service_finder/frontend/node_modules/entities/dist/esm/generated/decode-data-html.d.ts +/opt/service_finder/frontend/node_modules/entities/dist/esm/generated/decode-data-html.js.map +/opt/service_finder/frontend/node_modules/entities/dist/esm/generated/encode-html.js +/opt/service_finder/frontend/node_modules/entities/dist/esm/generated/decode-data-html.js +/opt/service_finder/frontend/node_modules/entities/dist/esm/generated/encode-html.d.ts.map +/opt/service_finder/frontend/node_modules/entities/dist/esm/generated/decode-data-xml.d.ts +/opt/service_finder/frontend/node_modules/entities/dist/esm/generated/decode-data-html.d.ts.map +/opt/service_finder/frontend/node_modules/entities/escape.d.ts +/opt/service_finder/frontend/node_modules/entities/decode.d.ts +/opt/service_finder/frontend/node_modules/entities/LICENSE +/opt/service_finder/frontend/node_modules/entities/escape.js +/opt/service_finder/frontend/node_modules/@kurkle +/opt/service_finder/frontend/node_modules/@kurkle/color +/opt/service_finder/frontend/node_modules/@kurkle/color/package.json +/opt/service_finder/frontend/node_modules/@kurkle/color/dist +/opt/service_finder/frontend/node_modules/@kurkle/color/dist/color.esm.js +/opt/service_finder/frontend/node_modules/@kurkle/color/dist/color.d.ts +/opt/service_finder/frontend/node_modules/@kurkle/color/dist/color.cjs +/opt/service_finder/frontend/node_modules/@kurkle/color/dist/color.min.js +/opt/service_finder/frontend/node_modules/@kurkle/color/dist/color.min.js.map +/opt/service_finder/frontend/node_modules/@kurkle/color/LICENSE.md +/opt/service_finder/frontend/node_modules/@kurkle/color/README.md +/opt/service_finder/frontend/node_modules/.package-lock.json +/opt/service_finder/frontend/node_modules/mitt +/opt/service_finder/frontend/node_modules/mitt/index.d.ts +/opt/service_finder/frontend/node_modules/mitt/package.json +/opt/service_finder/frontend/node_modules/mitt/dist +/opt/service_finder/frontend/node_modules/mitt/dist/mitt.js.map +/opt/service_finder/frontend/node_modules/mitt/dist/mitt.js +/opt/service_finder/frontend/node_modules/mitt/dist/mitt.umd.js.map +/opt/service_finder/frontend/node_modules/mitt/dist/mitt.umd.js +/opt/service_finder/frontend/node_modules/mitt/dist/mitt.mjs +/opt/service_finder/frontend/node_modules/mitt/dist/mitt.mjs.map +/opt/service_finder/frontend/node_modules/mitt/LICENSE +/opt/service_finder/frontend/node_modules/mitt/README.md +/opt/service_finder/frontend/node_modules/vue-router +/opt/service_finder/frontend/node_modules/vue-router/vue-router-auto-routes.d.mts +/opt/service_finder/frontend/node_modules/vue-router/vue-router-auto.d.ts +/opt/service_finder/frontend/node_modules/vue-router/vue-router-auto-resolver.d.mts +/opt/service_finder/frontend/node_modules/vue-router/package.json +/opt/service_finder/frontend/node_modules/vue-router/dist +/opt/service_finder/frontend/node_modules/vue-router/dist/vue-router.global.prod.js +/opt/service_finder/frontend/node_modules/vue-router/dist/options-DnbrHliP.d.cts +/opt/service_finder/frontend/node_modules/vue-router/dist/options-BHlG2BUV.d.mts +/opt/service_finder/frontend/node_modules/vue-router/dist/vue-router.prod.cjs +/opt/service_finder/frontend/node_modules/vue-router/dist/vue-router.esm-bundler.js +/opt/service_finder/frontend/node_modules/vue-router/dist/navigation-guard-fRmgNnli.mjs +/opt/service_finder/frontend/node_modules/vue-router/dist/volar +/opt/service_finder/frontend/node_modules/vue-router/dist/volar/sfc-typed-router.d.cts +/opt/service_finder/frontend/node_modules/vue-router/dist/volar/sfc-route-blocks.cjs +/opt/service_finder/frontend/node_modules/vue-router/dist/volar/sfc-route-blocks.d.cts +/opt/service_finder/frontend/node_modules/vue-router/dist/volar/sfc-typed-router.cjs +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin-BpN0479a.cjs +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/vite.d.cts +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/esbuild.d.mts +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/vite.d.mts +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/vite.mjs +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/rollup.mjs +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/rollup.d.mts +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/types.cjs +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/types.mjs +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/webpack.d.cts +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/rollup.d.cts +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/index.cjs +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/rolldown.mjs +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/options.d.cts +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/rolldown.d.mts +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/options.cjs +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/types.d.cts +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/esbuild.mjs +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/vite.cjs +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/rolldown.d.cts +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/esbuild.cjs +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/webpack.cjs +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/esbuild.d.cts +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/options.d.mts +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/types.d.mts +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/webpack.d.mts +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/rollup.cjs +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/webpack.mjs +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/options.mjs +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/rolldown.cjs +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/index.d.mts +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/index.d.cts +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin/index.mjs +/opt/service_finder/frontend/node_modules/vue-router/dist/index-5v_ymVK9.d.mts +/opt/service_finder/frontend/node_modules/vue-router/dist/vue-router.d.mts +/opt/service_finder/frontend/node_modules/vue-router/dist/experimental +/opt/service_finder/frontend/node_modules/vue-router/dist/experimental/pinia-colada.d.mts +/opt/service_finder/frontend/node_modules/vue-router/dist/experimental/pinia-colada.mjs +/opt/service_finder/frontend/node_modules/vue-router/dist/experimental/index.d.mts +/opt/service_finder/frontend/node_modules/vue-router/dist/experimental/index.mjs +/opt/service_finder/frontend/node_modules/vue-router/dist/unplugin-CAVpGgFU.mjs +/opt/service_finder/frontend/node_modules/vue-router/dist/index-D_cHAFdr.d.mts +/opt/service_finder/frontend/node_modules/vue-router/dist/useApi-DQ_OuAZT.mjs +/opt/service_finder/frontend/node_modules/vue-router/dist/options-DCEQBG2O.cjs +/opt/service_finder/frontend/node_modules/vue-router/dist/vue-router.mjs +/opt/service_finder/frontend/node_modules/vue-router/dist/vue-router.global.js +/opt/service_finder/frontend/node_modules/vue-router/dist/vue-router.esm-browser.prod.js +/opt/service_finder/frontend/node_modules/vue-router/dist/vue-router.cjs +/opt/service_finder/frontend/node_modules/vue-router/dist/devtools-BT_a1Bh8.mjs +/opt/service_finder/frontend/node_modules/vue-router/dist/vue-router.esm-browser.js +/opt/service_finder/frontend/node_modules/vue-router/dist/options-DHij9uO1.mjs +/opt/service_finder/frontend/node_modules/vue-router/LICENSE +/opt/service_finder/frontend/node_modules/vue-router/vetur +/opt/service_finder/frontend/node_modules/vue-router/vetur/tags.json +/opt/service_finder/frontend/node_modules/vue-router/vetur/attributes.json +/opt/service_finder/frontend/node_modules/vue-router/index.js +/opt/service_finder/frontend/node_modules/vue-router/node_modules +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-kit +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-kit/global.d.ts +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-kit/types.d.ts +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-kit/package.json +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-kit/dist +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-kit/dist/index.d.ts +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-kit/dist/index.cjs +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-kit/dist/index.js +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-kit/dist/index.d.cts +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-kit/LICENSE +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-kit/README.md +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-shared +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-shared/package.json +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-shared/dist +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-shared/dist/index.d.ts +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-shared/dist/index.cjs +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-shared/dist/index.js +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-shared/dist/index.d.cts +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-shared/LICENSE +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-shared/README.md +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-api +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-api/package.json +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-api/dist +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-api/dist/index.d.ts +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-api/dist/index.cjs +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-api/dist/index.js +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-api/dist/chunk.js +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-api/dist/index.d.cts +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-api/LICENSE +/opt/service_finder/frontend/node_modules/vue-router/node_modules/@vue/devtools-api/README.md +/opt/service_finder/frontend/node_modules/vue-router/node_modules/perfect-debounce +/opt/service_finder/frontend/node_modules/vue-router/node_modules/perfect-debounce/package.json +/opt/service_finder/frontend/node_modules/vue-router/node_modules/perfect-debounce/dist +/opt/service_finder/frontend/node_modules/vue-router/node_modules/perfect-debounce/dist/index.d.mts +/opt/service_finder/frontend/node_modules/vue-router/node_modules/perfect-debounce/dist/index.mjs +/opt/service_finder/frontend/node_modules/vue-router/node_modules/perfect-debounce/LICENSE +/opt/service_finder/frontend/node_modules/vue-router/node_modules/perfect-debounce/README.md +/opt/service_finder/frontend/node_modules/vue-router/README.md +/opt/service_finder/frontend/node_modules/vue-router/route.schema.json +/opt/service_finder/frontend/node_modules/vue-router/vue-router.node.mjs +/opt/service_finder/frontend/node_modules/axios +/opt/service_finder/frontend/node_modules/axios/index.d.ts +/opt/service_finder/frontend/node_modules/axios/lib +/opt/service_finder/frontend/node_modules/axios/lib/core +/opt/service_finder/frontend/node_modules/axios/lib/core/settle.js +/opt/service_finder/frontend/node_modules/axios/lib/core/Axios.js +/opt/service_finder/frontend/node_modules/axios/lib/core/AxiosError.js +/opt/service_finder/frontend/node_modules/axios/lib/core/dispatchRequest.js +/opt/service_finder/frontend/node_modules/axios/lib/core/buildFullPath.js +/opt/service_finder/frontend/node_modules/axios/lib/core/InterceptorManager.js +/opt/service_finder/frontend/node_modules/axios/lib/core/AxiosHeaders.js +/opt/service_finder/frontend/node_modules/axios/lib/core/mergeConfig.js +/opt/service_finder/frontend/node_modules/axios/lib/core/transformData.js +/opt/service_finder/frontend/node_modules/axios/lib/core/README.md +/opt/service_finder/frontend/node_modules/axios/lib/adapters +/opt/service_finder/frontend/node_modules/axios/lib/adapters/fetch.js +/opt/service_finder/frontend/node_modules/axios/lib/adapters/adapters.js +/opt/service_finder/frontend/node_modules/axios/lib/adapters/http.js +/opt/service_finder/frontend/node_modules/axios/lib/adapters/README.md +/opt/service_finder/frontend/node_modules/axios/lib/adapters/xhr.js +/opt/service_finder/frontend/node_modules/axios/lib/platform +/opt/service_finder/frontend/node_modules/axios/lib/platform/node +/opt/service_finder/frontend/node_modules/axios/lib/platform/node/classes +/opt/service_finder/frontend/node_modules/axios/lib/platform/node/classes/FormData.js +/opt/service_finder/frontend/node_modules/axios/lib/platform/node/classes/URLSearchParams.js +/opt/service_finder/frontend/node_modules/axios/lib/platform/node/index.js +/opt/service_finder/frontend/node_modules/axios/lib/platform/common +/opt/service_finder/frontend/node_modules/axios/lib/platform/common/utils.js +/opt/service_finder/frontend/node_modules/axios/lib/platform/index.js +/opt/service_finder/frontend/node_modules/axios/lib/platform/browser +/opt/service_finder/frontend/node_modules/axios/lib/platform/browser/classes +/opt/service_finder/frontend/node_modules/axios/lib/platform/browser/classes/Blob.js +/opt/service_finder/frontend/node_modules/axios/lib/platform/browser/classes/FormData.js +/opt/service_finder/frontend/node_modules/axios/lib/platform/browser/classes/URLSearchParams.js +/opt/service_finder/frontend/node_modules/axios/lib/platform/browser/index.js +/opt/service_finder/frontend/node_modules/axios/lib/axios.js +/opt/service_finder/frontend/node_modules/axios/lib/utils.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers +/opt/service_finder/frontend/node_modules/axios/lib/helpers/resolveConfig.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/speedometer.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/throttle.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/buildURL.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/null.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/isURLSameOrigin.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/toURLEncodedForm.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/progressEventReducer.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/composeSignals.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/HttpStatusCode.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/combineURLs.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/parseProtocol.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/isAbsoluteURL.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/bind.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/spread.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/toFormData.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/ZlibHeaderTransformStream.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/formDataToStream.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/fromDataURI.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/cookies.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/isAxiosError.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/formDataToJSON.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/AxiosTransformStream.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/deprecatedMethod.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/README.md +/opt/service_finder/frontend/node_modules/axios/lib/helpers/parseHeaders.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/readBlob.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/validator.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/trackStream.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/callbackify.js +/opt/service_finder/frontend/node_modules/axios/lib/helpers/AxiosURLSearchParams.js +/opt/service_finder/frontend/node_modules/axios/lib/env +/opt/service_finder/frontend/node_modules/axios/lib/env/data.js +/opt/service_finder/frontend/node_modules/axios/lib/env/classes +/opt/service_finder/frontend/node_modules/axios/lib/env/classes/FormData.js +/opt/service_finder/frontend/node_modules/axios/lib/env/README.md +/opt/service_finder/frontend/node_modules/axios/lib/defaults +/opt/service_finder/frontend/node_modules/axios/lib/defaults/transitional.js +/opt/service_finder/frontend/node_modules/axios/lib/defaults/index.js +/opt/service_finder/frontend/node_modules/axios/lib/cancel +/opt/service_finder/frontend/node_modules/axios/lib/cancel/isCancel.js +/opt/service_finder/frontend/node_modules/axios/lib/cancel/CancelToken.js +/opt/service_finder/frontend/node_modules/axios/lib/cancel/CanceledError.js +/opt/service_finder/frontend/node_modules/axios/package.json +/opt/service_finder/frontend/node_modules/axios/dist +/opt/service_finder/frontend/node_modules/axios/dist/node +/opt/service_finder/frontend/node_modules/axios/dist/node/axios.cjs.map +/opt/service_finder/frontend/node_modules/axios/dist/node/axios.cjs +/opt/service_finder/frontend/node_modules/axios/dist/axios.min.js +/opt/service_finder/frontend/node_modules/axios/dist/axios.js +/opt/service_finder/frontend/node_modules/axios/dist/axios.min.js.map +/opt/service_finder/frontend/node_modules/axios/dist/browser +/opt/service_finder/frontend/node_modules/axios/dist/browser/axios.cjs.map +/opt/service_finder/frontend/node_modules/axios/dist/browser/axios.cjs +/opt/service_finder/frontend/node_modules/axios/dist/axios.js.map +/opt/service_finder/frontend/node_modules/axios/dist/esm +/opt/service_finder/frontend/node_modules/axios/dist/esm/axios.min.js +/opt/service_finder/frontend/node_modules/axios/dist/esm/axios.js +/opt/service_finder/frontend/node_modules/axios/dist/esm/axios.min.js.map +/opt/service_finder/frontend/node_modules/axios/dist/esm/axios.js.map +/opt/service_finder/frontend/node_modules/axios/LICENSE +/opt/service_finder/frontend/node_modules/axios/index.js +/opt/service_finder/frontend/node_modules/axios/MIGRATION_GUIDE.md +/opt/service_finder/frontend/node_modules/axios/README.md +/opt/service_finder/frontend/node_modules/axios/index.d.cts +/opt/service_finder/frontend/node_modules/axios/CHANGELOG.md +/opt/service_finder/frontend/node_modules/vite +/opt/service_finder/frontend/node_modules/vite/client.d.ts +/opt/service_finder/frontend/node_modules/vite/types +/opt/service_finder/frontend/node_modules/vite/types/internal +/opt/service_finder/frontend/node_modules/vite/types/internal/terserOptions.d.ts +/opt/service_finder/frontend/node_modules/vite/types/internal/lightningcssOptions.d.ts +/opt/service_finder/frontend/node_modules/vite/types/internal/cssPreprocessorOptions.d.ts +/opt/service_finder/frontend/node_modules/vite/types/metadata.d.ts +/opt/service_finder/frontend/node_modules/vite/types/customEvent.d.ts +/opt/service_finder/frontend/node_modules/vite/types/hot.d.ts +/opt/service_finder/frontend/node_modules/vite/types/package.json +/opt/service_finder/frontend/node_modules/vite/types/import-meta.d.ts +/opt/service_finder/frontend/node_modules/vite/types/importMeta.d.ts +/opt/service_finder/frontend/node_modules/vite/types/importGlob.d.ts +/opt/service_finder/frontend/node_modules/vite/types/hmrPayload.d.ts +/opt/service_finder/frontend/node_modules/vite/package.json +/opt/service_finder/frontend/node_modules/vite/dist +/opt/service_finder/frontend/node_modules/vite/dist/node +/opt/service_finder/frontend/node_modules/vite/dist/node/index.d.ts +/opt/service_finder/frontend/node_modules/vite/dist/node/module-runner.d.ts +/opt/service_finder/frontend/node_modules/vite/dist/node/index.js +/opt/service_finder/frontend/node_modules/vite/dist/node/chunks +/opt/service_finder/frontend/node_modules/vite/dist/node/chunks/config2.js +/opt/service_finder/frontend/node_modules/vite/dist/node/chunks/postcss-import.js +/opt/service_finder/frontend/node_modules/vite/dist/node/chunks/optimizer.js +/opt/service_finder/frontend/node_modules/vite/dist/node/chunks/moduleRunnerTransport.d.ts +/opt/service_finder/frontend/node_modules/vite/dist/node/chunks/logger.js +/opt/service_finder/frontend/node_modules/vite/dist/node/chunks/server.js +/opt/service_finder/frontend/node_modules/vite/dist/node/chunks/preview.js +/opt/service_finder/frontend/node_modules/vite/dist/node/chunks/build2.js +/opt/service_finder/frontend/node_modules/vite/dist/node/chunks/build.js +/opt/service_finder/frontend/node_modules/vite/dist/node/chunks/config.js +/opt/service_finder/frontend/node_modules/vite/dist/node/chunks/chunk.js +/opt/service_finder/frontend/node_modules/vite/dist/node/chunks/lib.js +/opt/service_finder/frontend/node_modules/vite/dist/node/chunks/dist.js +/opt/service_finder/frontend/node_modules/vite/dist/node/module-runner.js +/opt/service_finder/frontend/node_modules/vite/dist/node/cli.js +/opt/service_finder/frontend/node_modules/vite/dist/client +/opt/service_finder/frontend/node_modules/vite/dist/client/env.mjs +/opt/service_finder/frontend/node_modules/vite/dist/client/client.mjs +/opt/service_finder/frontend/node_modules/vite/bin +/opt/service_finder/frontend/node_modules/vite/bin/vite.js +/opt/service_finder/frontend/node_modules/vite/bin/openChrome.js +/opt/service_finder/frontend/node_modules/vite/LICENSE.md +/opt/service_finder/frontend/node_modules/vite/README.md +/opt/service_finder/frontend/node_modules/vite/misc +/opt/service_finder/frontend/node_modules/vite/misc/true.js +/opt/service_finder/frontend/node_modules/vite/misc/false.js +/opt/service_finder/frontend/node_modules/ast-walker-scope +/opt/service_finder/frontend/node_modules/ast-walker-scope/package.json +/opt/service_finder/frontend/node_modules/ast-walker-scope/dist +/opt/service_finder/frontend/node_modules/ast-walker-scope/dist/index.d.ts +/opt/service_finder/frontend/node_modules/ast-walker-scope/dist/index.js +/opt/service_finder/frontend/node_modules/ast-walker-scope/LICENSE +/opt/service_finder/frontend/node_modules/ast-walker-scope/README.md +/opt/service_finder/frontend/README.md +/opt/service_finder/frontend/Dockerfile +/opt/service_finder/frontend/.vscode +/opt/service_finder/frontend/.vscode/extensions.json +/opt/service_finder/_Horgony_megjegyzések.txt +/opt/service_finder/deploy_v16.sh +/opt/service_finder/code-server-config +/opt/service_finder/code-server-config/.local +/opt/service_finder/code-server-config/.local/share +/opt/service_finder/code-server-config/.local/share/nano +/opt/service_finder/code-server-config/.local/share/code-server +/opt/service_finder/code-server-config/.local/share/code-server/coder-logs +/opt/service_finder/code-server-config/.local/share/code-server/coder-logs/code-server-stdout.log +/opt/service_finder/code-server-config/.local/share/code-server/coder-logs/code-server-stderr.log +/opt/service_finder/code-server-config/.local/share/code-server/heartbeat +/opt/service_finder/code-server-config/.local/lib +/opt/service_finder/code-server-config/.local/lib/python3.12 +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/WHEEL +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/REQUESTED +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/licenses +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/licenses/AUTHORS +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/licenses/LICENSE +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/INSTALLER +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/METADATA +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/RECORD +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/idna +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/idna/core.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/idna/package_data.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/idna/codec.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/idna/idnadata.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/idna/py.typed +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/idna/compat.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/idna/intranges.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/idna/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/idna/uts46data.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/bs4 +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/bs4/css.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/bs4/_deprecation.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/bs4/py.typed +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/bs4/_typing.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/bs4/formatter.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/bs4/dammit.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/bs4/builder +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/bs4/builder/_lxml.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/bs4/builder/_html5lib.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/bs4/builder/_htmlparser.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/bs4/builder/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/bs4/diagnose.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/bs4/exceptions.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/bs4/filter.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/bs4/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/bs4/element.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/bs4/_warnings.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet-3.3.0.dist-info +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet-3.3.0.dist-info/WHEEL +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet-3.3.0.dist-info/top_level.txt +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet-3.3.0.dist-info/licenses +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet-3.3.0.dist-info/licenses/LICENSE.PSF +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet-3.3.0.dist-info/licenses/LICENSE +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet-3.3.0.dist-info/INSTALLER +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet-3.3.0.dist-info/METADATA +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet-3.3.0.dist-info/RECORD +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/certifi +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/certifi/cacert.pem +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/certifi/core.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/certifi/__main__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/certifi/py.typed +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/certifi/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/types.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/connectors +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/connectors/aioodbc.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/connectors/pyodbc.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/connectors/asyncio.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/connectors/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/events.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/cyextension +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/cyextension/immutabledict.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/cyextension/resultproxy.cpython-312-x86_64-linux-gnu.so +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/cyextension/collections.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/cyextension/util.cpython-312-x86_64-linux-gnu.so +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/cyextension/processors.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/cyextension/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/cyextension/immutabledict.cpython-312-x86_64-linux-gnu.so +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/cyextension/util.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/cyextension/collections.cpython-312-x86_64-linux-gnu.so +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/cyextension/resultproxy.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/cyextension/immutabledict.pxd +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/cyextension/processors.cpython-312-x86_64-linux-gnu.so +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/future +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/future/engine.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/future/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/py.typed +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/loading.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/context.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/util.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/path_registry.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/sync.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/properties.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/mapped_collection.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/writeonly.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/identity.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/state.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/events.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/dependency.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/unitofwork.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/_typing.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/session.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/evaluator.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/base.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/scoping.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/_orm_constructors.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/collections.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/persistence.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/dynamic.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/exc.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/interfaces.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/decl_api.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/bulk_persistence.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/query.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/descriptor_props.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/instrumentation.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/clsregistry.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm/strategies.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/event +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/event/registry.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/event/attr.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/event/base.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/event/api.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/event/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/event/legacy.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/profiling.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/util.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/entities.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/plugin +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/plugin/plugin_base.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/plugin/bootstrap.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/plugin/pytestplugin.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/plugin/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/config.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/exclusions.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/fixtures +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/mypy.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/sql.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/orm.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/base.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/requirements.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/asyncio.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/pickleable.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/schema.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/provision.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/assertsql.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/suite +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_rowcount.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_sequence.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_unicode_ddl.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_types.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_results.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_ddl.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_update_delete.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_cte.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_select.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/suite/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_deprecations.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_dialect.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/engines.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/warnings.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/inspection.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/log.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mssql +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/aioodbc.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/pyodbc.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/pymssql.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/information_schema.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/json.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/provision.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/types.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/ranges.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/pg_catalog.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/_psycopg_common.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/named_types.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/array.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/ext.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg2.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg2cffi.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/base.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/operators.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/json.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/provision.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/pg8000.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/hstore.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/dml.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/_typing.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/pysqlite.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/aiosqlite.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/pysqlcipher.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/json.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/provision.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/dml.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mysql +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/types.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/enumerated.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/pyodbc.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/aiomysql.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/reserved_words.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/mariadb.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/mysqldb.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/asyncmy.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/pymysql.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/base.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/expression.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/cymysql.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/json.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/provision.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/mariadbconnector.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/reflection.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/dml.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/oracle +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/types.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/cx_oracle.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/base.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/vector.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/dictionary.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/provision.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/oracledb.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/type_migration_guidelines.txt +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/util.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/traversals.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/_elements_constructors.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/coercions.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/events.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/functions.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/_selectable_constructors.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/_py_util.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/roles.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/sqltypes.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/_typing.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/crud.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/_dml_constructors.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/base.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/elements.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/_orm_types.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/operators.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/expression.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/schema.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/annotation.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/naming.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/type_api.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/default_comparator.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/cache_key.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/lambdas.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql/dml.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/pool +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/pool/impl.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/pool/events.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/pool/base.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/pool/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/schema.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/result.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/base.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/scoping.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/exc.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/horizontal_shard.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/hybrid.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/indexable.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/compiler.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/baked.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/serializer.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/mutable.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/associationproxy.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/orderinglist.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/mypy +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/mypy/util.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/mypy/apply.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/mypy/plugin.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/mypy/names.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/mypy/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/mypy/decl_class.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/declarative +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/declarative/extensions.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/declarative/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/automap.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/instrumentation.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/exc.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/engine +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/engine/create.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/engine/characteristics.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/engine/util.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/engine/events.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/engine/_py_util.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/engine/result.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/engine/_py_row.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/engine/base.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/engine/row.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/engine/url.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/engine/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/engine/cursor.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/engine/reflection.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/engine/default.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/engine/processors.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/engine/interfaces.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/engine/mock.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/engine/strategies.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/engine/_py_processors.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/util +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/util/_collections.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/util/_py_collections.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/util/deprecations.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/util/typing.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/util/compat.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/util/queue.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/util/topological.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/util/_has_cy.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/util/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/util/tool_support.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/util/concurrency.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/util/preloaded.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx-0.28.1.dist-info +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx-0.28.1.dist-info/WHEEL +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx-0.28.1.dist-info/REQUESTED +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx-0.28.1.dist-info/licenses +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx-0.28.1.dist-info/licenses/LICENSE.md +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx-0.28.1.dist-info/INSTALLER +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx-0.28.1.dist-info/entry_points.txt +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx-0.28.1.dist-info/METADATA +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx-0.28.1.dist-info/RECORD +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/pytest_plugin.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/to_thread.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/functools.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/_backends +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/_backends/_trio.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/_backends/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/py.typed +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/to_interpreter.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/streams +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/memory.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/stapled.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/buffered.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/tls.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/file.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/text.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/lowlevel.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/from_thread.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/to_process.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/_core +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_synchronization.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_fileio.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_resources.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_testing.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_exceptions.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_tasks.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_asyncio_selector_thread.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_signals.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_typedattr.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_tempfile.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_eventloop.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_contextmanagers.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_streams.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_subprocesses.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_sockets.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/abc +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_resources.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_testing.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_tasks.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_eventloop.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_streams.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_subprocesses.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_sockets.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info/WHEEL +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info/licenses +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info/licenses/LICENSE +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info/INSTALLER +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info/METADATA +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info/RECORD +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/WHEEL +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/top_level.txt +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/licenses +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/licenses/LICENSE +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/INSTALLER +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/entry_points.txt +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/METADATA +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/RECORD +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/WHEEL +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/top_level.txt +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/REQUESTED +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/licenses +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/licenses/LICENSE +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/INSTALLER +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/METADATA +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/RECORD +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx/_status_codes.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx/_urls.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx/__version__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx/_multipart.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx/_decoders.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx/_urlparse.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx/py.typed +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx/_client.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx/_exceptions.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx/_config.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx/_main.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx/_utils.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx/_transports +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx/_transports/wsgi.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx/_transports/asgi.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx/_transports/base.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx/_transports/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx/_transports/default.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx/_transports/mock.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx/_api.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx/_auth.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx/_content.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx/_types.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpx/_models.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/python_dotenv-1.2.1.dist-info +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/python_dotenv-1.2.1.dist-info/WHEEL +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/python_dotenv-1.2.1.dist-info/top_level.txt +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/python_dotenv-1.2.1.dist-info/REQUESTED +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/python_dotenv-1.2.1.dist-info/licenses +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/python_dotenv-1.2.1.dist-info/licenses/LICENSE +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/python_dotenv-1.2.1.dist-info/INSTALLER +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/python_dotenv-1.2.1.dist-info/entry_points.txt +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/python_dotenv-1.2.1.dist-info/METADATA +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/python_dotenv-1.2.1.dist-info/RECORD +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/soupsieve +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/soupsieve/util.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/soupsieve/css_parser.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/soupsieve/py.typed +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/soupsieve/pretty.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/soupsieve/__meta__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/soupsieve/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/soupsieve/css_match.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/soupsieve/css_types.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore-1.0.9.dist-info +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/WHEEL +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/licenses +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/licenses/LICENSE.md +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/INSTALLER +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/METADATA +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/RECORD +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/greenlet_exceptions.hpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/TBrokenGreenlet.cpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/TMainGreenlet.cpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/TStackState.cpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/slp_platformselect.h +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/TThreadState.hpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/_greenlet.cpython-312-x86_64-linux-gnu.so +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/greenlet_thread_support.hpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/greenlet_internal.hpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/TThreadStateDestroy.cpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/PyGreenlet.hpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/greenlet_allocator.hpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_ppc_macosx.h +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_arm32_ios.h +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_arm64_masm.obj +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_ppc_aix.h +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_ppc64_linux.h +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_arm32_gcc.h +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_ppc64_aix.h +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_x32_unix.h +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_x86_unix.h +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/setup_switch_x64_masm.cmd +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_arm64_masm.asm +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_mips_unix.h +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_ppc_linux.h +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_csky_gcc.h +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_s390_unix.h +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_x86_msvc.h +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_x64_msvc.h +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_alpha_unix.h +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_sh_gcc.h +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_aarch64_gcc.h +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_riscv_unix.h +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_arm64_msvc.h +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_amd64_unix.h +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_m68k_gcc.h +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_loongarch64_linux.h +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_x64_masm.asm +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_sparc_sun_gcc.h +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_ppc_unix.h +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/platform/switch_x64_masm.obj +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/PyModule.cpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/greenlet_refs.hpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/greenlet_compiler_compat.hpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/TThreadStateCreator.hpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/TExceptionState.cpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/greenlet.h +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/PyGreenlet.cpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/TGreenletGlobals.cpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/CObjects.cpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/TGreenlet.hpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/TPythonState.cpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/greenlet.cpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/greenlet_msvc_compat.hpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/greenlet_cpython_compat.hpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/PyGreenletUnswitchable.cpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/TUserGreenlet.cpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/test_weakref.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/test_gc.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/fail_cpp_exception.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/test_stack_saved.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/test_tracing.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/test_leaks.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/_test_extension.cpython-312-x86_64-linux-gnu.so +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/test_throw.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/test_extension_interface.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/_test_extension.c +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/test_cpp.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/_test_extension_cpp.cpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/fail_switch_three_greenlets.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/fail_slp_switch.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/test_greenlet.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/test_version.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/leakcheck.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/fail_initialstub_already_started.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/fail_clearing_run_switches.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/test_greenlet_trash.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/fail_switch_three_greenlets2.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/test_generator.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/test_contextvars.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/test_generator_nested.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/_test_extension_cpp.cpython-312-x86_64-linux-gnu.so +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/tests/fail_switch_two_greenlets.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/greenlet_slp_switch.hpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/greenlet/TGreenlet.cpp +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/dotenv +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/dotenv/variables.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/dotenv/__main__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/dotenv/version.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/dotenv/py.typed +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/dotenv/parser.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/dotenv/ipython.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/dotenv/main.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/dotenv/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/dotenv/cli.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/connection.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/types.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/connresource.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/cluster.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/utils.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/settings.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/consts.pxi +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/protocol.pyi +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/protocol.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/prepared_stmt.pxd +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/prepared_stmt.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/settings.pxd +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/recordcapi.pxd +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/scram.pxd +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/pgtypes.pxi +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/coreproto.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/scram.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/record.cpython-312-x86_64-linux-gnu.so +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/protocol.pxd +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/coreproto.pxd +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/cpythonx.pxd +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/base.pxd +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/textutils.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/range.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/base.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/array.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/pgproto.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/record.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/record.pyi +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/encodings.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/protocol.cpython-312-x86_64-linux-gnu.so +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/prepared_stmt.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/_version.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/serverversion.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/_testbase +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/_testbase/fuzzer.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/_testbase/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/connect_utils.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/types.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/frb.pxd +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/consts.pxi +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/pgproto.pyi +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/pgproto.pxd +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/buffer.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/debug.pxd +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/tohex.pxd +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/hton.pxd +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/frb.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/__init__.pxd +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/uuid.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/pgproto.cpython-312-x86_64-linux-gnu.so +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/cpythonx.pxd +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/geometry.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/json.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/bytea.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/jsonpath.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/context.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/tid.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/__init__.pxd +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/pg_snapshot.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/datetime.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/bits.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/text.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/uuid.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/misc.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/network.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/numeric.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/float.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/hstore.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/int.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/pgproto.pyx +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/buffer.pxd +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/buffer.pxi +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/introspection.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/_asyncio_compat.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/compat.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/exceptions +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/exceptions/_base.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/exceptions/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/cursor.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pool.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/asyncpg/transaction.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/h11 +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/h11/_abnf.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/h11/_receivebuffer.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/h11/_readers.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/h11/_version.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/h11/_writers.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/h11/_state.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/h11/py.typed +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/h11/_headers.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/h11/_util.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/h11/_events.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/h11/_connection.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/h11/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy-2.0.45.dist-info +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy-2.0.45.dist-info/WHEEL +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy-2.0.45.dist-info/top_level.txt +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy-2.0.45.dist-info/REQUESTED +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy-2.0.45.dist-info/licenses +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy-2.0.45.dist-info/licenses/LICENSE +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy-2.0.45.dist-info/INSTALLER +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy-2.0.45.dist-info/METADATA +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/sqlalchemy-2.0.45.dist-info/RECORD +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/idna-3.11.dist-info +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/idna-3.11.dist-info/WHEEL +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/idna-3.11.dist-info/licenses +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/idna-3.11.dist-info/licenses/LICENSE.md +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/idna-3.11.dist-info/INSTALLER +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/idna-3.11.dist-info/METADATA +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/idna-3.11.dist-info/RECORD +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/h11-0.16.0.dist-info +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/h11-0.16.0.dist-info/WHEEL +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/h11-0.16.0.dist-info/top_level.txt +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/h11-0.16.0.dist-info/licenses +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/h11-0.16.0.dist-info/licenses/LICENSE.txt +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/h11-0.16.0.dist-info/INSTALLER +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/h11-0.16.0.dist-info/METADATA +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/h11-0.16.0.dist-info/RECORD +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/typing_extensions.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/certifi-2026.1.4.dist-info +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/certifi-2026.1.4.dist-info/WHEEL +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/certifi-2026.1.4.dist-info/top_level.txt +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/certifi-2026.1.4.dist-info/licenses +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/certifi-2026.1.4.dist-info/licenses/LICENSE +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/certifi-2026.1.4.dist-info/INSTALLER +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/certifi-2026.1.4.dist-info/METADATA +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/certifi-2026.1.4.dist-info/RECORD +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_trace.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_sync +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_sync/connection.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_sync/http_proxy.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_sync/http11.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_sync/connection_pool.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_sync/http2.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_sync/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_sync/interfaces.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_sync/socks_proxy.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_synchronization.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_async +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_async/connection.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_async/http_proxy.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_async/http11.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_async/connection_pool.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_async/http2.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_async/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_async/interfaces.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_async/socks_proxy.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_backends +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_backends/sync.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_backends/trio.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_backends/auto.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_backends/anyio.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_backends/base.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_backends/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_backends/mock.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/py.typed +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_exceptions.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_utils.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_api.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/__init__.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_ssl.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/httpcore/_models.py +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/soupsieve-2.8.3.dist-info +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/soupsieve-2.8.3.dist-info/WHEEL +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/soupsieve-2.8.3.dist-info/licenses +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/soupsieve-2.8.3.dist-info/licenses/LICENSE.md +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/soupsieve-2.8.3.dist-info/INSTALLER +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/soupsieve-2.8.3.dist-info/METADATA +/opt/service_finder/code-server-config/.local/lib/python3.12/site-packages/soupsieve-2.8.3.dist-info/RECORD +/opt/service_finder/code-server-config/.local/include +/opt/service_finder/code-server-config/.local/include/python3.12 +/opt/service_finder/code-server-config/.local/include/python3.12/greenlet +/opt/service_finder/code-server-config/.local/include/python3.12/greenlet/greenlet.h +/opt/service_finder/code-server-config/.local/bin +/opt/service_finder/code-server-config/.local/bin/httpx +/opt/service_finder/code-server-config/.local/bin/dotenv +/opt/service_finder/code-server-config/.ssh +/opt/service_finder/code-server-config/.bashrc +/opt/service_finder/code-server-config/.config +/opt/service_finder/code-server-config/.config/code-server +/opt/service_finder/code-server-config/.config/code-server/config.yaml +/opt/service_finder/code-server-config/extensions +/opt/service_finder/code-server-config/extensions/extensions.json +/opt/service_finder/code-server-config/data +/opt/service_finder/code-server-config/data/Machine +/opt/service_finder/code-server-config/data/User +/opt/service_finder/code-server-config/data/User/customBuiltinExtensionsCache.json +/opt/service_finder/code-server-config/data/User/History +/opt/service_finder/code-server-config/data/User/History/6ca6cf1a +/opt/service_finder/code-server-config/data/User/History/6ca6cf1a/entries.json +/opt/service_finder/code-server-config/data/User/History/6ca6cf1a/ZFcJ.py +/opt/service_finder/code-server-config/data/User/History/-706ef310 +/opt/service_finder/code-server-config/data/User/History/-706ef310/G0yH.yml +/opt/service_finder/code-server-config/data/User/History/-706ef310/8tZ1.yml +/opt/service_finder/code-server-config/data/User/History/-706ef310/qmzx.yml +/opt/service_finder/code-server-config/data/User/History/-706ef310/entries.json +/opt/service_finder/code-server-config/data/User/History/-16684355 +/opt/service_finder/code-server-config/data/User/History/-16684355/toEt.py +/opt/service_finder/code-server-config/data/User/History/-16684355/entries.json +/opt/service_finder/code-server-config/data/User/History/-313e58 +/opt/service_finder/code-server-config/data/User/History/-313e58/TEMn.py +/opt/service_finder/code-server-config/data/User/History/-313e58/DJPN.py +/opt/service_finder/code-server-config/data/User/History/-313e58/3ZfW.py +/opt/service_finder/code-server-config/data/User/History/-313e58/entries.json +/opt/service_finder/code-server-config/data/User/History/-52e5c41d +/opt/service_finder/code-server-config/data/User/History/-52e5c41d/SxEq.html +/opt/service_finder/code-server-config/data/User/History/-52e5c41d/tEyM.html +/opt/service_finder/code-server-config/data/User/History/-52e5c41d/uiHD.html +/opt/service_finder/code-server-config/data/User/History/-52e5c41d/voAw.html +/opt/service_finder/code-server-config/data/User/History/-52e5c41d/Rpxl.html +/opt/service_finder/code-server-config/data/User/History/-52e5c41d/0xVC.html +/opt/service_finder/code-server-config/data/User/History/-52e5c41d/J4V4.html +/opt/service_finder/code-server-config/data/User/History/-52e5c41d/x8lC.html +/opt/service_finder/code-server-config/data/User/History/-52e5c41d/E3XE.html +/opt/service_finder/code-server-config/data/User/History/-52e5c41d/W3D5.html +/opt/service_finder/code-server-config/data/User/History/-52e5c41d/Smd7.html +/opt/service_finder/code-server-config/data/User/History/-52e5c41d/JA3R.html +/opt/service_finder/code-server-config/data/User/History/-52e5c41d/iTl3.html +/opt/service_finder/code-server-config/data/User/History/-52e5c41d/eRba.html +/opt/service_finder/code-server-config/data/User/History/-52e5c41d/UAc0.html +/opt/service_finder/code-server-config/data/User/History/-52e5c41d/9eYi.html +/opt/service_finder/code-server-config/data/User/History/-52e5c41d/83UF.html +/opt/service_finder/code-server-config/data/User/History/-52e5c41d/u9Y2.html +/opt/service_finder/code-server-config/data/User/History/-52e5c41d/Ycqg.html +/opt/service_finder/code-server-config/data/User/History/-52e5c41d/SVyy.html +/opt/service_finder/code-server-config/data/User/History/-52e5c41d/eiJs.html +/opt/service_finder/code-server-config/data/User/History/-52e5c41d/entries.json +/opt/service_finder/code-server-config/data/User/History/-52e5c41d/UE2n.html +/opt/service_finder/code-server-config/data/User/History/-52e5c41d/eVfD.html +/opt/service_finder/code-server-config/data/User/History/30eb9f94 +/opt/service_finder/code-server-config/data/User/History/30eb9f94/1AIB.py +/opt/service_finder/code-server-config/data/User/History/30eb9f94/entries.json +/opt/service_finder/code-server-config/data/User/History/-1768a9b0 +/opt/service_finder/code-server-config/data/User/History/-1768a9b0/F30V.py +/opt/service_finder/code-server-config/data/User/History/-1768a9b0/entries.json +/opt/service_finder/code-server-config/data/User/History/2e6ecb37 +/opt/service_finder/code-server-config/data/User/History/2e6ecb37/RIji.py +/opt/service_finder/code-server-config/data/User/History/2e6ecb37/entries.json +/opt/service_finder/code-server-config/data/User/History/-26d8d76b +/opt/service_finder/code-server-config/data/User/History/-26d8d76b/fw3n.py +/opt/service_finder/code-server-config/data/User/History/-26d8d76b/E63S.py +/opt/service_finder/code-server-config/data/User/History/-26d8d76b/70Kc.py +/opt/service_finder/code-server-config/data/User/History/-26d8d76b/tASB.py +/opt/service_finder/code-server-config/data/User/History/-26d8d76b/entries.json +/opt/service_finder/code-server-config/data/User/History/-10d36f1c +/opt/service_finder/code-server-config/data/User/History/-10d36f1c/dgpy.py +/opt/service_finder/code-server-config/data/User/History/-10d36f1c/entries.json +/opt/service_finder/code-server-config/data/User/History/e7633ef +/opt/service_finder/code-server-config/data/User/History/e7633ef/vXRG.py +/opt/service_finder/code-server-config/data/User/History/e7633ef/9eTf.py +/opt/service_finder/code-server-config/data/User/History/e7633ef/byJh.py +/opt/service_finder/code-server-config/data/User/History/e7633ef/dmjc.py +/opt/service_finder/code-server-config/data/User/History/e7633ef/entries.json +/opt/service_finder/code-server-config/data/User/History/2434083a +/opt/service_finder/code-server-config/data/User/History/2434083a/Jrbf.py +/opt/service_finder/code-server-config/data/User/History/2434083a/entries.json +/opt/service_finder/code-server-config/data/User/History/563f6285 +/opt/service_finder/code-server-config/data/User/History/563f6285/iogF.py +/opt/service_finder/code-server-config/data/User/History/563f6285/entries.json +/opt/service_finder/code-server-config/data/User/History/1231c811 +/opt/service_finder/code-server-config/data/User/History/1231c811/RTDs.py +/opt/service_finder/code-server-config/data/User/History/1231c811/mtMZ.py +/opt/service_finder/code-server-config/data/User/History/1231c811/7V7m.py +/opt/service_finder/code-server-config/data/User/History/1231c811/entries.json +/opt/service_finder/code-server-config/data/User/History/-5bd368a0 +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/oM6T +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/9UOq +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/IgjZ +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/H5Zm +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/66Rx +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/8R6W +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/tXFs +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/Dsy9 +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/wEWX +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/27fC +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/HmdC +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/4MYC +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/udmZ +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/srWn +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/DqPk +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/479L +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/0NIq +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/s8EA +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/meOw +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/Sl84 +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/BlV7 +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/eSnH +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/GwU6 +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/eqa5 +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/JyZi +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/DBmG +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/entries.json +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/IXdY +/opt/service_finder/code-server-config/data/User/History/-5bd368a0/6P40 +/opt/service_finder/code-server-config/data/User/History/10134b39 +/opt/service_finder/code-server-config/data/User/History/10134b39/Umts.py +/opt/service_finder/code-server-config/data/User/History/10134b39/YgmD.py +/opt/service_finder/code-server-config/data/User/History/10134b39/HsiU.py +/opt/service_finder/code-server-config/data/User/History/10134b39/0390.py +/opt/service_finder/code-server-config/data/User/History/10134b39/VKVZ.py +/opt/service_finder/code-server-config/data/User/History/10134b39/JVpZ.py +/opt/service_finder/code-server-config/data/User/History/10134b39/KxP1.py +/opt/service_finder/code-server-config/data/User/History/10134b39/entries.json +/opt/service_finder/code-server-config/data/User/History/-4c88f193 +/opt/service_finder/code-server-config/data/User/History/-4c88f193/entries.json +/opt/service_finder/code-server-config/data/User/History/-4c88f193/rXIc.py +/opt/service_finder/code-server-config/data/User/History/-2ef9c2df +/opt/service_finder/code-server-config/data/User/History/-2ef9c2df/hYxe.py +/opt/service_finder/code-server-config/data/User/History/-2ef9c2df/entries.json +/opt/service_finder/code-server-config/data/User/History/5bff933a +/opt/service_finder/code-server-config/data/User/History/5bff933a/j30u.py +/opt/service_finder/code-server-config/data/User/History/5bff933a/entries.json +/opt/service_finder/code-server-config/data/User/History/-72cc77ef +/opt/service_finder/code-server-config/data/User/History/-72cc77ef/84BA.py +/opt/service_finder/code-server-config/data/User/History/-72cc77ef/entries.json +/opt/service_finder/code-server-config/data/User/History/97f3a5f +/opt/service_finder/code-server-config/data/User/History/97f3a5f/IBcb.py +/opt/service_finder/code-server-config/data/User/History/97f3a5f/entries.json +/opt/service_finder/code-server-config/data/User/History/-5314da0c +/opt/service_finder/code-server-config/data/User/History/-5314da0c/jmij.py +/opt/service_finder/code-server-config/data/User/History/-5314da0c/9MWC.py +/opt/service_finder/code-server-config/data/User/History/-5314da0c/MlfW.py +/opt/service_finder/code-server-config/data/User/History/-5314da0c/eSN2.py +/opt/service_finder/code-server-config/data/User/History/-5314da0c/54N2.py +/opt/service_finder/code-server-config/data/User/History/-5314da0c/FkfR.py +/opt/service_finder/code-server-config/data/User/History/-5314da0c/Fp0w.py +/opt/service_finder/code-server-config/data/User/History/-5314da0c/entries.json +/opt/service_finder/code-server-config/data/User/History/-3487e1e +/opt/service_finder/code-server-config/data/User/History/-3487e1e/eaD4.py +/opt/service_finder/code-server-config/data/User/History/-3487e1e/gVs3.py +/opt/service_finder/code-server-config/data/User/History/-3487e1e/WE3Y.py +/opt/service_finder/code-server-config/data/User/History/-3487e1e/2JOI.py +/opt/service_finder/code-server-config/data/User/History/-3487e1e/dYmD.py +/opt/service_finder/code-server-config/data/User/History/-3487e1e/z1at.py +/opt/service_finder/code-server-config/data/User/History/-3487e1e/HYjM.py +/opt/service_finder/code-server-config/data/User/History/-3487e1e/TFdq.py +/opt/service_finder/code-server-config/data/User/History/-3487e1e/MoK7.py +/opt/service_finder/code-server-config/data/User/History/-3487e1e/sEal.py +/opt/service_finder/code-server-config/data/User/History/-3487e1e/DXvc.py +/opt/service_finder/code-server-config/data/User/History/-3487e1e/HFdy.py +/opt/service_finder/code-server-config/data/User/History/-3487e1e/7zSH.py +/opt/service_finder/code-server-config/data/User/History/-3487e1e/0MBT.py +/opt/service_finder/code-server-config/data/User/History/-3487e1e/VR1d.py +/opt/service_finder/code-server-config/data/User/History/-3487e1e/gleo.py +/opt/service_finder/code-server-config/data/User/History/-3487e1e/zNYa.py +/opt/service_finder/code-server-config/data/User/History/-3487e1e/entries.json +/opt/service_finder/code-server-config/data/User/History/37941b6f +/opt/service_finder/code-server-config/data/User/History/37941b6f/gx07.yml +/opt/service_finder/code-server-config/data/User/History/37941b6f/qmLz.yml +/opt/service_finder/code-server-config/data/User/History/37941b6f/KJm1.yml +/opt/service_finder/code-server-config/data/User/History/37941b6f/5wWC.yml +/opt/service_finder/code-server-config/data/User/History/37941b6f/7GyZ.yml +/opt/service_finder/code-server-config/data/User/History/37941b6f/b1RX.yml +/opt/service_finder/code-server-config/data/User/History/37941b6f/h3mF.yml +/opt/service_finder/code-server-config/data/User/History/37941b6f/ysWr.yml +/opt/service_finder/code-server-config/data/User/History/37941b6f/te4Z.yml +/opt/service_finder/code-server-config/data/User/History/37941b6f/8e20.yml +/opt/service_finder/code-server-config/data/User/History/37941b6f/entries.json +/opt/service_finder/code-server-config/data/User/History/37941b6f/qTnB.yml +/opt/service_finder/code-server-config/data/User/History/-7a78fe9d +/opt/service_finder/code-server-config/data/User/History/-7a78fe9d/O0ij.py +/opt/service_finder/code-server-config/data/User/History/-7a78fe9d/0L8o.py +/opt/service_finder/code-server-config/data/User/History/-7a78fe9d/Qkh3.py +/opt/service_finder/code-server-config/data/User/History/-7a78fe9d/X8oQ.py +/opt/service_finder/code-server-config/data/User/History/-7a78fe9d/entries.json +/opt/service_finder/code-server-config/data/User/History/-412f821c +/opt/service_finder/code-server-config/data/User/History/-412f821c/IRaR.py +/opt/service_finder/code-server-config/data/User/History/-412f821c/entries.json +/opt/service_finder/code-server-config/data/User/History/5144c62f +/opt/service_finder/code-server-config/data/User/History/5144c62f/ySrz.py +/opt/service_finder/code-server-config/data/User/History/5144c62f/entries.json +/opt/service_finder/code-server-config/data/User/History/55969fe3 +/opt/service_finder/code-server-config/data/User/History/55969fe3/JlPL.py +/opt/service_finder/code-server-config/data/User/History/55969fe3/entries.json +/opt/service_finder/code-server-config/data/User/History/-4ace1ff2 +/opt/service_finder/code-server-config/data/User/History/-4ace1ff2/30t5.py +/opt/service_finder/code-server-config/data/User/History/-4ace1ff2/wfWY.py +/opt/service_finder/code-server-config/data/User/History/-4ace1ff2/MvHD.py +/opt/service_finder/code-server-config/data/User/History/-4ace1ff2/entries.json +/opt/service_finder/code-server-config/data/User/History/-22981f1a +/opt/service_finder/code-server-config/data/User/History/-22981f1a/roVG.py +/opt/service_finder/code-server-config/data/User/History/-22981f1a/6EB5.py +/opt/service_finder/code-server-config/data/User/History/-22981f1a/entries.json +/opt/service_finder/code-server-config/data/User/History/-719dbe4 +/opt/service_finder/code-server-config/data/User/History/-719dbe4/2C3o.json +/opt/service_finder/code-server-config/data/User/History/-719dbe4/entries.json +/opt/service_finder/code-server-config/data/User/History/3ae47db8 +/opt/service_finder/code-server-config/data/User/History/3ae47db8/bsiX +/opt/service_finder/code-server-config/data/User/History/3ae47db8/WFYx +/opt/service_finder/code-server-config/data/User/History/3ae47db8/eAJ3 +/opt/service_finder/code-server-config/data/User/History/3ae47db8/fjXV +/opt/service_finder/code-server-config/data/User/History/3ae47db8/entries.json +/opt/service_finder/code-server-config/data/User/History/-6713540d +/opt/service_finder/code-server-config/data/User/History/-6713540d/xRtx.txt +/opt/service_finder/code-server-config/data/User/History/-6713540d/entries.json +/opt/service_finder/code-server-config/data/User/History/-4958fed3 +/opt/service_finder/code-server-config/data/User/History/-4958fed3/RO9K.py +/opt/service_finder/code-server-config/data/User/History/-4958fed3/V3OE.py +/opt/service_finder/code-server-config/data/User/History/-4958fed3/entries.json +/opt/service_finder/code-server-config/data/User/History/71ceecfb +/opt/service_finder/code-server-config/data/User/History/71ceecfb/khcD +/opt/service_finder/code-server-config/data/User/History/71ceecfb/entries.json +/opt/service_finder/code-server-config/data/User/History/16d1374a +/opt/service_finder/code-server-config/data/User/History/16d1374a/gs9K.py +/opt/service_finder/code-server-config/data/User/History/16d1374a/entries.json +/opt/service_finder/code-server-config/data/User/History/359c80de +/opt/service_finder/code-server-config/data/User/History/359c80de/iEZY.py +/opt/service_finder/code-server-config/data/User/History/359c80de/entries.json +/opt/service_finder/code-server-config/data/User/History/-5e83fa91 +/opt/service_finder/code-server-config/data/User/History/-5e83fa91/4Cft.py +/opt/service_finder/code-server-config/data/User/History/-5e83fa91/5GlT.py +/opt/service_finder/code-server-config/data/User/History/-5e83fa91/entries.json +/opt/service_finder/code-server-config/data/User/History/-638902d7 +/opt/service_finder/code-server-config/data/User/History/-638902d7/2Pxf.py +/opt/service_finder/code-server-config/data/User/History/-638902d7/YGCT.py +/opt/service_finder/code-server-config/data/User/History/-638902d7/entries.json +/opt/service_finder/code-server-config/data/User/History/-638902d7/6Sot.py +/opt/service_finder/code-server-config/data/User/History/639c2122 +/opt/service_finder/code-server-config/data/User/History/639c2122/entries.json +/opt/service_finder/code-server-config/data/User/History/639c2122/u4bN.py +/opt/service_finder/code-server-config/data/User/History/-1e547221 +/opt/service_finder/code-server-config/data/User/History/-1e547221/thOH.py +/opt/service_finder/code-server-config/data/User/History/-1e547221/entries.json +/opt/service_finder/code-server-config/data/User/History/-6f62bdcf +/opt/service_finder/code-server-config/data/User/History/-6f62bdcf/Krug.py +/opt/service_finder/code-server-config/data/User/History/-6f62bdcf/gq3x.py +/opt/service_finder/code-server-config/data/User/History/-6f62bdcf/entries.json +/opt/service_finder/code-server-config/data/User/caches +/opt/service_finder/code-server-config/data/User/caches/CachedConfigurations +/opt/service_finder/code-server-config/data/User/caches/CachedConfigurations/folder +/opt/service_finder/code-server-config/data/User/caches/CachedConfigurations/folder/-5879b260 +/opt/service_finder/code-server-config/data/User/caches/CachedConfigurations/folder/-5879b260/configuration.json +/opt/service_finder/code-server-config/data/User/caches/CachedConfigurations/folder/-5c4fcefd +/opt/service_finder/code-server-config/data/User/caches/CachedConfigurations/folder/-5c4fcefd/configuration.json +/opt/service_finder/code-server-config/data/User/caches/CachedConfigurations/folder/3e658ed7 +/opt/service_finder/code-server-config/data/User/caches/CachedConfigurations/folder/3e658ed7/configuration.json +/opt/service_finder/code-server-config/data/User/caches/CachedConfigurations/folder/-285bda86 +/opt/service_finder/code-server-config/data/User/caches/CachedConfigurations/folder/-285bda86/configuration.json +/opt/service_finder/code-server-config/data/User/Backups +/opt/service_finder/code-server-config/data/User/Backups/-54297bf2 +/opt/service_finder/code-server-config/data/User/Backups/-54297bf2/vscode-remote +/opt/service_finder/code-server-config/data/User/settings.json +/opt/service_finder/code-server-config/data/User/snippets +/opt/service_finder/code-server-config/data/User/globalStorage +/opt/service_finder/code-server-config/data/User/globalStorage/vscode.json-language-features +/opt/service_finder/code-server-config/data/User/globalStorage/vscode.json-language-features/json-schema-cache +/opt/service_finder/code-server-config/data/User/systemExtensionsCache.json +/opt/service_finder/code-server-config/data/User/machineid +/opt/service_finder/code-server-config/data/User/workspaceStorage +/opt/service_finder/code-server-config/data/User/workspaceStorage/-63ce429 +/opt/service_finder/code-server-config/data/User/workspaceStorage/-63ce429/chatEditingSessions +/opt/service_finder/code-server-config/data/User/workspaceStorage/-63ce429/chatEditingSessions/a91fca11-9919-49b2-9aab-55a4263a881f +/opt/service_finder/code-server-config/data/User/workspaceStorage/-63ce429/chatEditingSessions/a91fca11-9919-49b2-9aab-55a4263a881f/state.json +/opt/service_finder/code-server-config/data/User/workspaceStorage/-63ce429/chatEditingSessions/a91fca11-9919-49b2-9aab-55a4263a881f/contents +/opt/service_finder/code-server-config/data/User/workspaceStorage/-63ce429/chatSessions +/opt/service_finder/code-server-config/data/User/workspaceStorage/-63ce429/chatSessions/a91fca11-9919-49b2-9aab-55a4263a881f.json +/opt/service_finder/code-server-config/data/User/workspaceStorage/64cc123a +/opt/service_finder/code-server-config/data/User/workspaceStorage/64cc123a/vscode.lock +/opt/service_finder/code-server-config/data/User/workspaceStorage/64cc123a/meta.json +/opt/service_finder/code-server-config/data/User/workspaceStorage/64cc123a/chatEditingSessions +/opt/service_finder/code-server-config/data/User/workspaceStorage/64cc123a/chatEditingSessions/ff708a20-4b56-4c2d-8af1-bf0a107df673 +/opt/service_finder/code-server-config/data/User/workspaceStorage/64cc123a/chatEditingSessions/ff708a20-4b56-4c2d-8af1-bf0a107df673/state.json +/opt/service_finder/code-server-config/data/User/workspaceStorage/64cc123a/chatEditingSessions/ff708a20-4b56-4c2d-8af1-bf0a107df673/contents +/opt/service_finder/code-server-config/data/User/workspaceStorage/64cc123a/chatSessions +/opt/service_finder/code-server-config/data/User/workspaceStorage/64cc123a/chatSessions/ff708a20-4b56-4c2d-8af1-bf0a107df673.json +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2 +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/vscode.lock +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/db5da8e2-e0b3-43bd-a73f-59c06d1367d1 +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/db5da8e2-e0b3-43bd-a73f-59c06d1367d1/state.json +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/db5da8e2-e0b3-43bd-a73f-59c06d1367d1/contents +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/d21d60af-afdf-4015-ac22-8468113828ba +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/d21d60af-afdf-4015-ac22-8468113828ba/state.json +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/d21d60af-afdf-4015-ac22-8468113828ba/contents +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/98c877cb-9c52-4901-988e-890d63101faf +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/98c877cb-9c52-4901-988e-890d63101faf/state.json +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/98c877cb-9c52-4901-988e-890d63101faf/contents +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/508a716e-f283-436b-b9c7-f68336e877d2 +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/508a716e-f283-436b-b9c7-f68336e877d2/state.json +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/508a716e-f283-436b-b9c7-f68336e877d2/contents +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/2fe3f8f1-90c9-4db0-8659-7ddaaa21ab7c +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/2fe3f8f1-90c9-4db0-8659-7ddaaa21ab7c/state.json +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/2fe3f8f1-90c9-4db0-8659-7ddaaa21ab7c/contents +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/df31879f-7816-4000-922a-1ae16dfa748e +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/df31879f-7816-4000-922a-1ae16dfa748e/state.json +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/df31879f-7816-4000-922a-1ae16dfa748e/contents +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/daa34a05-12c3-4f1d-b7c1-6dbcf59e3426 +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/daa34a05-12c3-4f1d-b7c1-6dbcf59e3426/state.json +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/daa34a05-12c3-4f1d-b7c1-6dbcf59e3426/contents +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatSessions +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatSessions/daa34a05-12c3-4f1d-b7c1-6dbcf59e3426.json +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatSessions/df31879f-7816-4000-922a-1ae16dfa748e.json +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatSessions/d21d60af-afdf-4015-ac22-8468113828ba.json +/opt/service_finder/code-server-config/data/User/workspaceStorage/-54297bf2/chatSessions/508a716e-f283-436b-b9c7-f68336e877d2.json +/opt/service_finder/code-server-config/data/User/workspaceStorage/787b6db1 +/opt/service_finder/code-server-config/data/User/workspaceStorage/787b6db1/meta.json +/opt/service_finder/code-server-config/data/User/workspaceStorage/787b6db1/chatEditingSessions +/opt/service_finder/code-server-config/data/User/workspaceStorage/787b6db1/chatEditingSessions/d5306add-574b-4ca9-80a2-e738a2954019 +/opt/service_finder/code-server-config/data/User/workspaceStorage/787b6db1/chatEditingSessions/d5306add-574b-4ca9-80a2-e738a2954019/state.json +/opt/service_finder/code-server-config/data/User/workspaceStorage/787b6db1/chatEditingSessions/d5306add-574b-4ca9-80a2-e738a2954019/contents +/opt/service_finder/code-server-config/data/User/workspaceStorage/787b6db1/chatSessions +/opt/service_finder/code-server-config/data/User/workspaceStorage/787b6db1/chatSessions/d5306add-574b-4ca9-80a2-e738a2954019.json +/opt/service_finder/code-server-config/data/User/workspaceStorage/787b6db1-1 +/opt/service_finder/code-server-config/data/CachedProfilesData +/opt/service_finder/code-server-config/data/CachedProfilesData/__default__profile__ +/opt/service_finder/code-server-config/data/CachedProfilesData/__default__profile__/extensions.user.cache +/opt/service_finder/code-server-config/data/CachedProfilesData/__default__profile__/extensions.builtin.cache +/opt/service_finder/code-server-config/data/logs +/opt/service_finder/code-server-config/data/logs/20260120T003918 +/opt/service_finder/code-server-config/data/logs/20260120T003918/exthost1 +/opt/service_finder/code-server-config/data/logs/20260120T003918/exthost1/vscode.git +/opt/service_finder/code-server-config/data/logs/20260120T003918/exthost1/vscode.git/Git.log +/opt/service_finder/code-server-config/data/logs/20260120T003918/exthost1/vscode.github +/opt/service_finder/code-server-config/data/logs/20260120T003918/exthost1/vscode.github/GitHub.log +/opt/service_finder/code-server-config/data/logs/20260120T003918/exthost1/remoteExtHostTelemetry.log +/opt/service_finder/code-server-config/data/logs/20260120T003918/exthost1/vscode.github-authentication +/opt/service_finder/code-server-config/data/logs/20260120T003918/exthost1/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/code-server-config/data/logs/20260120T003918/exthost1/remoteexthost.log +/opt/service_finder/code-server-config/data/logs/20260120T003918/exthost2 +/opt/service_finder/code-server-config/data/logs/20260120T003918/exthost2/vscode.git +/opt/service_finder/code-server-config/data/logs/20260120T003918/exthost2/vscode.git/Git.log +/opt/service_finder/code-server-config/data/logs/20260120T003918/exthost2/vscode.github +/opt/service_finder/code-server-config/data/logs/20260120T003918/exthost2/vscode.github/GitHub.log +/opt/service_finder/code-server-config/data/logs/20260120T003918/exthost2/remoteExtHostTelemetry.log +/opt/service_finder/code-server-config/data/logs/20260120T003918/exthost2/vscode.github-authentication +/opt/service_finder/code-server-config/data/logs/20260120T003918/exthost2/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/code-server-config/data/logs/20260120T003918/exthost2/remoteexthost.log +/opt/service_finder/code-server-config/data/logs/20260120T003918/remoteagent.log +/opt/service_finder/code-server-config/data/logs/20260120T172343 +/opt/service_finder/code-server-config/data/logs/20260120T172343/exthost1 +/opt/service_finder/code-server-config/data/logs/20260120T172343/exthost1/vscode.git +/opt/service_finder/code-server-config/data/logs/20260120T172343/exthost1/vscode.git/Git.log +/opt/service_finder/code-server-config/data/logs/20260120T172343/exthost1/vscode.github +/opt/service_finder/code-server-config/data/logs/20260120T172343/exthost1/vscode.github/GitHub.log +/opt/service_finder/code-server-config/data/logs/20260120T172343/exthost1/remoteExtHostTelemetry.log +/opt/service_finder/code-server-config/data/logs/20260120T172343/exthost1/vscode.github-authentication +/opt/service_finder/code-server-config/data/logs/20260120T172343/exthost1/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/code-server-config/data/logs/20260120T172343/exthost1/remoteexthost.log +/opt/service_finder/code-server-config/data/logs/20260120T172343/ptyhost.log +/opt/service_finder/code-server-config/data/logs/20260120T172343/remoteagent.log +/opt/service_finder/code-server-config/data/logs/20260120T004510 +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost3 +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost3/vscode.git +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost3/vscode.git/Git.log +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost3/vscode.github +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost3/vscode.github/GitHub.log +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost3/remoteExtHostTelemetry.log +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost3/vscode.github-authentication +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost3/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost3/remoteexthost.log +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost1 +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost1/vscode.git +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost1/vscode.git/Git.log +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost1/vscode.github +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost1/vscode.github/GitHub.log +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost1/remoteExtHostTelemetry.log +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost1/vscode.github-authentication +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost1/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost1/remoteexthost.log +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost4 +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost4/vscode.git +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost4/vscode.git/Git.log +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost4/vscode.github +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost4/vscode.github/GitHub.log +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost4/remoteExtHostTelemetry.log +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost4/vscode.github-authentication +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost4/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost4/remoteexthost.log +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost2 +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost2/vscode.git +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost2/vscode.git/Git.log +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost2/vscode.github +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost2/vscode.github/GitHub.log +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost2/remoteExtHostTelemetry.log +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost2/vscode.github-authentication +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost2/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/code-server-config/data/logs/20260120T004510/exthost2/remoteexthost.log +/opt/service_finder/code-server-config/data/logs/20260120T004510/ptyhost.log +/opt/service_finder/code-server-config/data/logs/20260120T004510/remoteagent.log +/opt/service_finder/code-server-config/data/logs/20260120T175427 +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost5 +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost5/vscode.git +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost5/vscode.git/Git.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost5/vscode.github +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost5/vscode.github/GitHub.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost5/remoteExtHostTelemetry.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost5/vscode.github-authentication +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost5/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost5/remoteexthost.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost3 +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost3/vscode.git +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost3/vscode.git/Git.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost3/vscode.github +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost3/vscode.github/GitHub.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost3/remoteExtHostTelemetry.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost3/vscode.github-authentication +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost3/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost3/remoteexthost.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost7 +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost7/vscode.git +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost7/vscode.git/Git.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost7/vscode.github +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost7/vscode.github/GitHub.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost7/remoteExtHostTelemetry.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost7/vscode.github-authentication +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost7/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost7/remoteexthost.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost6 +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost6/vscode.git +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost6/vscode.git/Git.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost6/vscode.github +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost6/vscode.github/GitHub.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost6/remoteExtHostTelemetry.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost6/vscode.github-authentication +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost6/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost6/remoteexthost.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost1 +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost1/vscode.git +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost1/vscode.git/Git.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost1/vscode.github +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost1/vscode.github/GitHub.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost1/remoteExtHostTelemetry.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost1/vscode.github-authentication +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost1/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost1/remoteexthost.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost4 +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost4/vscode.json-language-features +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost4/vscode.json-language-features/JSON Language Server.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost4/vscode.git +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost4/vscode.git/Git.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost4/vscode.github +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost4/vscode.github/GitHub.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost4/vscode.html-language-features +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost4/vscode.html-language-features/HTML Language Server.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost4/remoteExtHostTelemetry.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost4/vscode.github-authentication +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost4/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost4/remoteexthost.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost2 +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost2/vscode.git +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost2/vscode.git/Git.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost2/vscode.github +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost2/vscode.github/GitHub.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost2/vscode.html-language-features +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost2/vscode.html-language-features/HTML Language Server.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost2/remoteExtHostTelemetry.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost2/vscode.github-authentication +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost2/vscode.github-authentication/GitHub Authentication.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/exthost2/remoteexthost.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/ptyhost.log +/opt/service_finder/code-server-config/data/logs/20260120T175427/remoteagent.log +/opt/service_finder/code-server-config/data/coder.json +/opt/service_finder/code-server-config/.bash_history +/opt/service_finder/code-server-config/.cache +/opt/service_finder/code-server-config/.cache/pip +/opt/service_finder/code-server-config/.cache/pip/http-v2 +/opt/service_finder/code-server-config/.cache/pip/http-v2/3 +/opt/service_finder/code-server-config/.cache/pip/http-v2/3/0 +/opt/service_finder/code-server-config/.cache/pip/http-v2/3/0/e +/opt/service_finder/code-server-config/.cache/pip/http-v2/3/0/e/f +/opt/service_finder/code-server-config/.cache/pip/http-v2/3/0/e/f/1 +/opt/service_finder/code-server-config/.cache/pip/http-v2/3/0/e/f/1/30ef132248ab98ab0a92d2d15ee6957bdad5542ffbb630d3a32f7721.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/3/0/e/f/1/30ef132248ab98ab0a92d2d15ee6957bdad5542ffbb630d3a32f7721 +/opt/service_finder/code-server-config/.cache/pip/http-v2/3/d +/opt/service_finder/code-server-config/.cache/pip/http-v2/3/d/b +/opt/service_finder/code-server-config/.cache/pip/http-v2/3/d/b/a +/opt/service_finder/code-server-config/.cache/pip/http-v2/3/d/b/a/4 +/opt/service_finder/code-server-config/.cache/pip/http-v2/3/d/b/a/4/3dba48e33e4deae5b8e0b5d8173f7d8b9ede86f6e2f3b423cb213061 +/opt/service_finder/code-server-config/.cache/pip/http-v2/3/d/b/a/4/3dba48e33e4deae5b8e0b5d8173f7d8b9ede86f6e2f3b423cb213061.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/a +/opt/service_finder/code-server-config/.cache/pip/http-v2/a/e +/opt/service_finder/code-server-config/.cache/pip/http-v2/a/e/5 +/opt/service_finder/code-server-config/.cache/pip/http-v2/a/e/5/f +/opt/service_finder/code-server-config/.cache/pip/http-v2/a/e/5/f/a +/opt/service_finder/code-server-config/.cache/pip/http-v2/a/e/5/f/a/ae5faffb20c18d03a8d32e103e2a7344328d8d276566417eca03d0d7.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/a/e/5/f/a/ae5faffb20c18d03a8d32e103e2a7344328d8d276566417eca03d0d7 +/opt/service_finder/code-server-config/.cache/pip/http-v2/a/0 +/opt/service_finder/code-server-config/.cache/pip/http-v2/a/0/3 +/opt/service_finder/code-server-config/.cache/pip/http-v2/a/0/3/e +/opt/service_finder/code-server-config/.cache/pip/http-v2/a/0/3/e/7 +/opt/service_finder/code-server-config/.cache/pip/http-v2/a/0/3/e/7/a03e77d6fd1aff6b4ee6b34a140bd46cfb7fa1873254b62a2d30e9d7.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/a/0/3/e/7/a03e77d6fd1aff6b4ee6b34a140bd46cfb7fa1873254b62a2d30e9d7 +/opt/service_finder/code-server-config/.cache/pip/http-v2/a/b +/opt/service_finder/code-server-config/.cache/pip/http-v2/a/b/0 +/opt/service_finder/code-server-config/.cache/pip/http-v2/a/b/0/c +/opt/service_finder/code-server-config/.cache/pip/http-v2/a/b/0/c/9 +/opt/service_finder/code-server-config/.cache/pip/http-v2/a/b/0/c/9/ab0c951c13ffa0438821f87295bc6ff5ca5c6104a972107beff7ec14 +/opt/service_finder/code-server-config/.cache/pip/http-v2/a/b/0/c/9/ab0c951c13ffa0438821f87295bc6ff5ca5c6104a972107beff7ec14.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/a/b/d +/opt/service_finder/code-server-config/.cache/pip/http-v2/a/b/d/d +/opt/service_finder/code-server-config/.cache/pip/http-v2/a/b/d/d/d +/opt/service_finder/code-server-config/.cache/pip/http-v2/a/b/d/d/d/abdddc46265b81c7d6dc73a20f1ad8ef043a66e9e79abdc1379bf71e.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/a/b/d/d/d/abdddc46265b81c7d6dc73a20f1ad8ef043a66e9e79abdc1379bf71e +/opt/service_finder/code-server-config/.cache/pip/http-v2/2 +/opt/service_finder/code-server-config/.cache/pip/http-v2/2/c +/opt/service_finder/code-server-config/.cache/pip/http-v2/2/c/5 +/opt/service_finder/code-server-config/.cache/pip/http-v2/2/c/5/0 +/opt/service_finder/code-server-config/.cache/pip/http-v2/2/c/5/0/9 +/opt/service_finder/code-server-config/.cache/pip/http-v2/2/c/5/0/9/2c5093416a6abc33fb0ff1433322d374c320a79a2ce63946a0a9ddf3.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/2/c/5/0/9/2c5093416a6abc33fb0ff1433322d374c320a79a2ce63946a0a9ddf3 +/opt/service_finder/code-server-config/.cache/pip/http-v2/2/8 +/opt/service_finder/code-server-config/.cache/pip/http-v2/2/8/8 +/opt/service_finder/code-server-config/.cache/pip/http-v2/2/8/8/5 +/opt/service_finder/code-server-config/.cache/pip/http-v2/2/8/8/5/1 +/opt/service_finder/code-server-config/.cache/pip/http-v2/2/8/8/5/1/28851bfda9e7b366cbac79b783dc038d1fee039b3e50c3151b437013.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/2/8/8/5/1/28851bfda9e7b366cbac79b783dc038d1fee039b3e50c3151b437013 +/opt/service_finder/code-server-config/.cache/pip/http-v2/7 +/opt/service_finder/code-server-config/.cache/pip/http-v2/7/5 +/opt/service_finder/code-server-config/.cache/pip/http-v2/7/5/2 +/opt/service_finder/code-server-config/.cache/pip/http-v2/7/5/2/4 +/opt/service_finder/code-server-config/.cache/pip/http-v2/7/5/2/4/8 +/opt/service_finder/code-server-config/.cache/pip/http-v2/7/5/2/4/8/75248c373d50f62ae989db97e5f74613b5b513b024376712f93d486a +/opt/service_finder/code-server-config/.cache/pip/http-v2/7/5/2/4/8/75248c373d50f62ae989db97e5f74613b5b513b024376712f93d486a.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/7/b +/opt/service_finder/code-server-config/.cache/pip/http-v2/7/b/f +/opt/service_finder/code-server-config/.cache/pip/http-v2/7/b/f/d +/opt/service_finder/code-server-config/.cache/pip/http-v2/7/b/f/d/a +/opt/service_finder/code-server-config/.cache/pip/http-v2/7/b/f/d/a/7bfda9f6c7fc68d2025bf39812313b43025996be0f6256ea8fc36f0c.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/7/b/f/d/a/7bfda9f6c7fc68d2025bf39812313b43025996be0f6256ea8fc36f0c +/opt/service_finder/code-server-config/.cache/pip/http-v2/6 +/opt/service_finder/code-server-config/.cache/pip/http-v2/6/8 +/opt/service_finder/code-server-config/.cache/pip/http-v2/6/8/0 +/opt/service_finder/code-server-config/.cache/pip/http-v2/6/8/0/d +/opt/service_finder/code-server-config/.cache/pip/http-v2/6/8/0/d/4 +/opt/service_finder/code-server-config/.cache/pip/http-v2/6/8/0/d/4/680d4dd80dc6a3d2df9b9478dfcc8e81e0e4f130e154a3268b98b877.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/6/8/0/d/4/680d4dd80dc6a3d2df9b9478dfcc8e81e0e4f130e154a3268b98b877 +/opt/service_finder/code-server-config/.cache/pip/http-v2/6/f +/opt/service_finder/code-server-config/.cache/pip/http-v2/6/f/7 +/opt/service_finder/code-server-config/.cache/pip/http-v2/6/f/7/1 +/opt/service_finder/code-server-config/.cache/pip/http-v2/6/f/7/1/9 +/opt/service_finder/code-server-config/.cache/pip/http-v2/6/f/7/1/9/6f7191662785a6314e6bade3b897cbef6bec19bb8e1ed58745e9e726.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/6/f/7/1/9/6f7191662785a6314e6bade3b897cbef6bec19bb8e1ed58745e9e726 +/opt/service_finder/code-server-config/.cache/pip/http-v2/6/d +/opt/service_finder/code-server-config/.cache/pip/http-v2/6/d/d +/opt/service_finder/code-server-config/.cache/pip/http-v2/6/d/d/7 +/opt/service_finder/code-server-config/.cache/pip/http-v2/6/d/d/7/f +/opt/service_finder/code-server-config/.cache/pip/http-v2/6/d/d/7/f/6dd7f72563c9dcb2a786e420e686844bbc8f61eb5d9fae5d3bcb6458 +/opt/service_finder/code-server-config/.cache/pip/http-v2/6/d/d/7/f/6dd7f72563c9dcb2a786e420e686844bbc8f61eb5d9fae5d3bcb6458.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/5 +/opt/service_finder/code-server-config/.cache/pip/http-v2/5/5 +/opt/service_finder/code-server-config/.cache/pip/http-v2/5/5/2 +/opt/service_finder/code-server-config/.cache/pip/http-v2/5/5/2/5 +/opt/service_finder/code-server-config/.cache/pip/http-v2/5/5/2/5/6 +/opt/service_finder/code-server-config/.cache/pip/http-v2/5/5/2/5/6/55256db6e6c4a92962a75c471feaebd79e275a5b686bc92196b908dd +/opt/service_finder/code-server-config/.cache/pip/http-v2/5/5/2/5/6/55256db6e6c4a92962a75c471feaebd79e275a5b686bc92196b908dd.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/9 +/opt/service_finder/code-server-config/.cache/pip/http-v2/9/3 +/opt/service_finder/code-server-config/.cache/pip/http-v2/9/3/6 +/opt/service_finder/code-server-config/.cache/pip/http-v2/9/3/6/e +/opt/service_finder/code-server-config/.cache/pip/http-v2/9/3/6/e/f +/opt/service_finder/code-server-config/.cache/pip/http-v2/9/3/6/e/f/936ef88052230050c9d8c803e64ef58ee62e7c4e4f61da74ba2ef008 +/opt/service_finder/code-server-config/.cache/pip/http-v2/9/3/6/e/f/936ef88052230050c9d8c803e64ef58ee62e7c4e4f61da74ba2ef008.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/9/1 +/opt/service_finder/code-server-config/.cache/pip/http-v2/9/1/a +/opt/service_finder/code-server-config/.cache/pip/http-v2/9/1/a/c +/opt/service_finder/code-server-config/.cache/pip/http-v2/9/1/a/c/4 +/opt/service_finder/code-server-config/.cache/pip/http-v2/9/1/a/c/4/91ac4141ee513b48d6e2106b8504eedf08543a9ac70e664c84a86c9b +/opt/service_finder/code-server-config/.cache/pip/http-v2/9/1/a/c/4/91ac4141ee513b48d6e2106b8504eedf08543a9ac70e664c84a86c9b.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/9/1/1 +/opt/service_finder/code-server-config/.cache/pip/http-v2/9/1/1/8 +/opt/service_finder/code-server-config/.cache/pip/http-v2/9/1/1/8/d +/opt/service_finder/code-server-config/.cache/pip/http-v2/9/1/1/8/d/9118d2865fad57ca510f5444caa60cda483fe032c97b2b94ff631e21.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/9/1/1/8/d/9118d2865fad57ca510f5444caa60cda483fe032c97b2b94ff631e21 +/opt/service_finder/code-server-config/.cache/pip/http-v2/e +/opt/service_finder/code-server-config/.cache/pip/http-v2/e/2 +/opt/service_finder/code-server-config/.cache/pip/http-v2/e/2/0 +/opt/service_finder/code-server-config/.cache/pip/http-v2/e/2/0/7 +/opt/service_finder/code-server-config/.cache/pip/http-v2/e/2/0/7/4 +/opt/service_finder/code-server-config/.cache/pip/http-v2/e/2/0/7/4/e207426cbcf220918fdf354826064190a066f96cd6ad8830f1f11fdc.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/e/2/0/7/4/e207426cbcf220918fdf354826064190a066f96cd6ad8830f1f11fdc +/opt/service_finder/code-server-config/.cache/pip/http-v2/e/0 +/opt/service_finder/code-server-config/.cache/pip/http-v2/e/0/b +/opt/service_finder/code-server-config/.cache/pip/http-v2/e/0/b/4 +/opt/service_finder/code-server-config/.cache/pip/http-v2/e/0/b/4/f +/opt/service_finder/code-server-config/.cache/pip/http-v2/e/0/b/4/f/e0b4f4d1d5b8bb8b844f230fb9255eeabd73b4bd6598e826c4219d4f.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/e/0/b/4/f/e0b4f4d1d5b8bb8b844f230fb9255eeabd73b4bd6598e826c4219d4f +/opt/service_finder/code-server-config/.cache/pip/http-v2/8 +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/e +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/e/c +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/e/c/f +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/e/c/f/f +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/e/c/f/f/8ecffcc7a3e38674c0b5a8addfcc2c1a5184431d21c3b57c81cc4a6d +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/e/c/f/f/8ecffcc7a3e38674c0b5a8addfcc2c1a5184431d21c3b57c81cc4a6d.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/8 +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/8/f +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/8/f/7 +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/8/f/7/d +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/8/f/7/d/88f7d71f2d1361f8fb38230bb8ae05bdb624c08a2414e1c535731370.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/8/f/7/d/88f7d71f2d1361f8fb38230bb8ae05bdb624c08a2414e1c535731370 +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/0 +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/0/e +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/0/e/9 +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/0/e/9/4 +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/0/e/9/4/80e9405db26f4e2bbc6e0b3184aa09055d40bf4a94f7b4a8c5bc70b2 +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/0/e/9/4/80e9405db26f4e2bbc6e0b3184aa09055d40bf4a94f7b4a8c5bc70b2.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/f +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/f/0 +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/f/0/a +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/f/0/a/d +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/f/0/a/d/8f0ad583652318494c12da41e4d30ff6225ec73d448a0754a0a7e898.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/f/0/a/d/8f0ad583652318494c12da41e4d30ff6225ec73d448a0754a0a7e898 +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/b +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/b/2 +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/b/2/4 +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/b/2/4/2 +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/b/2/4/2/8b24226e2da88df4abeee0d8ca6bce79b19ca2bcd5f94b543939c66c +/opt/service_finder/code-server-config/.cache/pip/http-v2/8/b/2/4/2/8b24226e2da88df4abeee0d8ca6bce79b19ca2bcd5f94b543939c66c.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/0 +/opt/service_finder/code-server-config/.cache/pip/http-v2/0/a +/opt/service_finder/code-server-config/.cache/pip/http-v2/0/a/e +/opt/service_finder/code-server-config/.cache/pip/http-v2/0/a/e/8 +/opt/service_finder/code-server-config/.cache/pip/http-v2/0/a/e/8/4 +/opt/service_finder/code-server-config/.cache/pip/http-v2/0/a/e/8/4/0ae84cda1068eb8069d0d031ff1b592b6ce0646c279bf59396ff2d05 +/opt/service_finder/code-server-config/.cache/pip/http-v2/0/a/e/8/4/0ae84cda1068eb8069d0d031ff1b592b6ce0646c279bf59396ff2d05.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/0/5 +/opt/service_finder/code-server-config/.cache/pip/http-v2/0/5/a +/opt/service_finder/code-server-config/.cache/pip/http-v2/0/5/a/7 +/opt/service_finder/code-server-config/.cache/pip/http-v2/0/5/a/7/4 +/opt/service_finder/code-server-config/.cache/pip/http-v2/0/5/a/7/4/05a74540eb65ad078e4e70140f951919d2248dc11cb1db5ccba5484a +/opt/service_finder/code-server-config/.cache/pip/http-v2/0/5/a/7/4/05a74540eb65ad078e4e70140f951919d2248dc11cb1db5ccba5484a.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/0/4 +/opt/service_finder/code-server-config/.cache/pip/http-v2/0/4/8 +/opt/service_finder/code-server-config/.cache/pip/http-v2/0/4/8/4 +/opt/service_finder/code-server-config/.cache/pip/http-v2/0/4/8/4/7 +/opt/service_finder/code-server-config/.cache/pip/http-v2/0/4/8/4/7/0484760df79b094114efd54bf890371889276bd276c1334d1207ab57.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/0/4/8/4/7/0484760df79b094114efd54bf890371889276bd276c1334d1207ab57 +/opt/service_finder/code-server-config/.cache/pip/http-v2/f +/opt/service_finder/code-server-config/.cache/pip/http-v2/f/0 +/opt/service_finder/code-server-config/.cache/pip/http-v2/f/0/e +/opt/service_finder/code-server-config/.cache/pip/http-v2/f/0/e/2 +/opt/service_finder/code-server-config/.cache/pip/http-v2/f/0/e/2/8 +/opt/service_finder/code-server-config/.cache/pip/http-v2/f/0/e/2/8/f0e28ece914c8ef232bd16f2cf5fb25d89ec879e8b2a76672e0df90c +/opt/service_finder/code-server-config/.cache/pip/http-v2/f/0/e/2/8/f0e28ece914c8ef232bd16f2cf5fb25d89ec879e8b2a76672e0df90c.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/b +/opt/service_finder/code-server-config/.cache/pip/http-v2/b/8 +/opt/service_finder/code-server-config/.cache/pip/http-v2/b/8/0 +/opt/service_finder/code-server-config/.cache/pip/http-v2/b/8/0/2 +/opt/service_finder/code-server-config/.cache/pip/http-v2/b/8/0/2/b +/opt/service_finder/code-server-config/.cache/pip/http-v2/b/8/0/2/b/b802bf744f29add6cd6c7e4d8b0a9da659981b9f2631696f1ff03c30.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/b/8/0/2/b/b802bf744f29add6cd6c7e4d8b0a9da659981b9f2631696f1ff03c30 +/opt/service_finder/code-server-config/.cache/pip/http-v2/d +/opt/service_finder/code-server-config/.cache/pip/http-v2/d/6 +/opt/service_finder/code-server-config/.cache/pip/http-v2/d/6/b +/opt/service_finder/code-server-config/.cache/pip/http-v2/d/6/b/5 +/opt/service_finder/code-server-config/.cache/pip/http-v2/d/6/b/5/a +/opt/service_finder/code-server-config/.cache/pip/http-v2/d/6/b/5/a/d6b5a680d6bd64b15d21710b790a7149c0cb6150e5b7d7a0964e2d8b +/opt/service_finder/code-server-config/.cache/pip/http-v2/d/6/b/5/a/d6b5a680d6bd64b15d21710b790a7149c0cb6150e5b7d7a0964e2d8b.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/d/e +/opt/service_finder/code-server-config/.cache/pip/http-v2/d/e/e +/opt/service_finder/code-server-config/.cache/pip/http-v2/d/e/e/3 +/opt/service_finder/code-server-config/.cache/pip/http-v2/d/e/e/3/2 +/opt/service_finder/code-server-config/.cache/pip/http-v2/d/e/e/3/2/dee321d19881b0f93bb72eb4ca6571ddc1fcf222716907097a4957e1.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/d/e/e/3/2/dee321d19881b0f93bb72eb4ca6571ddc1fcf222716907097a4957e1 +/opt/service_finder/code-server-config/.cache/pip/http-v2/d/b +/opt/service_finder/code-server-config/.cache/pip/http-v2/d/b/9 +/opt/service_finder/code-server-config/.cache/pip/http-v2/d/b/9/a +/opt/service_finder/code-server-config/.cache/pip/http-v2/d/b/9/a/3 +/opt/service_finder/code-server-config/.cache/pip/http-v2/d/b/9/a/3/db9a3eb3ed1c69080413f0e56d069f54abebad45f36724e37d4d717e.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/d/b/9/a/3/db9a3eb3ed1c69080413f0e56d069f54abebad45f36724e37d4d717e +/opt/service_finder/code-server-config/.cache/pip/http-v2/d/b/4 +/opt/service_finder/code-server-config/.cache/pip/http-v2/d/b/4/f +/opt/service_finder/code-server-config/.cache/pip/http-v2/d/b/4/f/1 +/opt/service_finder/code-server-config/.cache/pip/http-v2/d/b/4/f/1/db4f1a46f0bc9bac065fd35cdbe1c65d030e9fd9ca59d06fa230106f.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/d/b/4/f/1/db4f1a46f0bc9bac065fd35cdbe1c65d030e9fd9ca59d06fa230106f +/opt/service_finder/code-server-config/.cache/pip/http-v2/1 +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/2 +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/2/9 +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/2/9/c +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/2/9/c/8 +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/2/9/c/8/129c8212d0fe217a753409b4b46ca21c6dd736c8b4e08c093d03ecf3.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/2/9/c/8/129c8212d0fe217a753409b4b46ca21c6dd736c8b4e08c093d03ecf3 +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/c +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/c/b +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/c/b/6 +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/c/b/6/2 +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/c/b/6/2/1cb62cfa729fe0a5b07499a3ba93e1da9751c5f79bd2e594bcf319a9 +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/c/b/6/2/1cb62cfa729fe0a5b07499a3ba93e1da9751c5f79bd2e594bcf319a9.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/6 +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/6/0 +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/6/0/d +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/6/0/d/3 +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/6/0/d/3/160d3e8f69a7eca4743b16bea3eecb80155f94e8435ce6481997004c +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/6/0/d/3/160d3e8f69a7eca4743b16bea3eecb80155f94e8435ce6481997004c.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/9 +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/9/9 +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/9/9/d +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/9/9/d/1 +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/9/9/d/1/199d128a8b0a6a727869cf288f0802d0ddfe7785a99b6957366e40a4.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/9/9/d/1/199d128a8b0a6a727869cf288f0802d0ddfe7785a99b6957366e40a4 +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/4 +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/4/a +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/4/a/a +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/4/a/a/f +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/4/a/a/f/14aaf7643dce3f389cfaa2f24beba9e2d02071e4624c02c288b2a440.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/1/4/a/a/f/14aaf7643dce3f389cfaa2f24beba9e2d02071e4624c02c288b2a440 +/opt/service_finder/code-server-config/.cache/pip/http-v2/4 +/opt/service_finder/code-server-config/.cache/pip/http-v2/4/b +/opt/service_finder/code-server-config/.cache/pip/http-v2/4/b/e +/opt/service_finder/code-server-config/.cache/pip/http-v2/4/b/e/0 +/opt/service_finder/code-server-config/.cache/pip/http-v2/4/b/e/0/7 +/opt/service_finder/code-server-config/.cache/pip/http-v2/4/b/e/0/7/4be07d3ac353e38d2c9e3a257cad36ee2a758fc88b4cd5f0d479a5a9.body +/opt/service_finder/code-server-config/.cache/pip/http-v2/4/b/e/0/7/4be07d3ac353e38d2c9e3a257cad36ee2a758fc88b4cd5f0d479a5a9 +/opt/service_finder/code-server-config/.cache/Microsoft +/opt/service_finder/code-server-config/.cache/Microsoft/DeveloperTools +/opt/service_finder/code-server-config/.cache/Microsoft/DeveloperTools/deviceid +/opt/service_finder/code-server-config/workspace +/opt/service_finder/code-server-config/.profile +/opt/service_finder/alembic.ini +/opt/service_finder/CHANGELOG.md +/opt/service_finder/lista.txt +/opt/service_finder/init_dev.sh diff --git a/archive/2026.02.18 Archive_old_mapps/Old_versions/mappak.txt b/archive/2026.02.18 Archive_old_mapps/Old_versions/mappak.txt new file mode 100755 index 0000000..1a0597c --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/Old_versions/mappak.txt @@ -0,0 +1,1280 @@ +. +./postgres +./postgres/data +./postgres/data/pg_commit_ts +./postgres/data/pg_logical +./postgres/data/pg_logical/snapshots +./postgres/data/pg_logical/mappings +./postgres/data/base +./postgres/data/base/16384 +./postgres/data/base/5 +./postgres/data/base/16537 +./postgres/data/base/1 +./postgres/data/base/4 +./postgres/data/pg_dynshmem +./postgres/data/pg_xact +./postgres/data/pg_stat +./postgres/data/pg_stat_tmp +./postgres/data/pg_subtrans +./postgres/data/pg_snapshots +./postgres/data/global +./postgres/data/pg_serial +./postgres/data/pg_replslot +./postgres/data/pg_tblspc +./postgres/data/pg_multixact +./postgres/data/pg_multixact/members +./postgres/data/pg_multixact/offsets +./postgres/data/pg_twophase +./postgres/data/pg_notify +./postgres/data/pg_wal +./postgres/data/pg_wal/summaries +./postgres/data/pg_wal/archive_status +./migrations +./migrations/__pycache__ +./migrations/versions +./migrations/versions/__pycache__ +./postgres_data +./postgres_data/pg_commit_ts +./postgres_data/pg_logical +./postgres_data/pg_logical/snapshots +./postgres_data/pg_logical/mappings +./postgres_data/base +./postgres_data/base/16384 +./postgres_data/base/5 +./postgres_data/base/1 +./postgres_data/base/4 +./postgres_data/pg_dynshmem +./postgres_data/pg_xact +./postgres_data/pg_stat +./postgres_data/pg_stat_tmp +./postgres_data/pg_subtrans +./postgres_data/pg_snapshots +./postgres_data/global +./postgres_data/pg_serial +./postgres_data/pg_replslot +./postgres_data/pg_tblspc +./postgres_data/pg_multixact +./postgres_data/pg_multixact/members +./postgres_data/pg_multixact/offsets +./postgres_data/pg_twophase +./postgres_data/pg_notify +./postgres_data/pg_wal +./postgres_data/pg_wal/archive_status +./redis +./redis/data +./redis/data/appendonlydir +./pgadmin_data +./pgadmin_data/sessions +./pgadmin_data/storage +./pgadmin_data/storage/kincses_gmail.com +./pgadmin_data/azurecredentialcache +./backend +./backend/migrations +./backend/migrations/versions +./backend/app +./backend/app/models +./backend/app/models/__pycache__ +./backend/app/core +./backend/app/core/__pycache__ +./backend/app/auth +./backend/app/schemas +./backend/app/schemas/__pycache__ +./backend/app/templates +./backend/app/templates/emails +./backend/app/templates/emails/hu +./backend/app/templates/emails/en +./backend/app/__pycache__ +./backend/app/static +./backend/app/scripts +./backend/app/api +./backend/app/api/v2 +./backend/app/api/v2/__pycache__ +./backend/app/api/__pycache__ +./backend/app/api/v1 +./backend/app/api/v1/__pycache__ +./backend/app/api/v1/endpoints +./backend/app/api/v1/endpoints/__pycache__ +./backend/app/services +./backend/app/services/__pycache__ +./backend/app/db +./backend/app/db/__pycache__ +./backend/app/crud +./backend/app/crud/__pycache__ +./backend/scrapers +./backend/_legacy_backup +./backend/frontend +./proxy-manager +./proxy-manager/letsencrypt +./proxy-manager/letsencrypt/archive +./proxy-manager/letsencrypt/archive/npm-13 +./proxy-manager/letsencrypt/archive/npm-16 +./proxy-manager/letsencrypt/archive/npm-5 +./proxy-manager/letsencrypt/archive/npm-15 +./proxy-manager/letsencrypt/archive/npm-11 +./proxy-manager/letsencrypt/archive/npm-14 +./proxy-manager/letsencrypt/archive/npm-4 +./proxy-manager/letsencrypt/archive/npm-18 +./proxy-manager/letsencrypt/renewal-hooks +./proxy-manager/letsencrypt/renewal-hooks/pre +./proxy-manager/letsencrypt/renewal-hooks/deploy +./proxy-manager/letsencrypt/renewal-hooks/post +./proxy-manager/letsencrypt/renewal +./proxy-manager/letsencrypt/live +./proxy-manager/letsencrypt/live/npm-13 +./proxy-manager/letsencrypt/live/npm-16 +./proxy-manager/letsencrypt/live/npm-5 +./proxy-manager/letsencrypt/live/npm-15 +./proxy-manager/letsencrypt/live/npm-11 +./proxy-manager/letsencrypt/live/npm-14 +./proxy-manager/letsencrypt/live/npm-4 +./proxy-manager/letsencrypt/live/npm-18 +./proxy-manager/letsencrypt/accounts +./proxy-manager/letsencrypt/accounts/acme-v02.api.letsencrypt.org +./proxy-manager/letsencrypt/accounts/acme-v02.api.letsencrypt.org/directory +./proxy-manager/letsencrypt/accounts/acme-v02.api.letsencrypt.org/directory/e417a583de478a0cfdeed332c1113068 +./proxy-manager/data +./proxy-manager/data/nginx +./proxy-manager/data/nginx/dead_host +./proxy-manager/data/nginx/proxy_host +./proxy-manager/data/nginx/default_www +./proxy-manager/data/nginx/default_host +./proxy-manager/data/nginx/redirection_host +./proxy-manager/data/nginx/stream +./proxy-manager/data/nginx/temp +./proxy-manager/data/letsencrypt-acme-challenge +./proxy-manager/data/access +./proxy-manager/data/custom_ssl +./proxy-manager/data/logs +./pgadmin +./pgadmin/data +./pgadmin/data/sessions +./pgadmin/data/storage +./pgadmin/data/storage/kincses_gmail.com +./pgadmin/data/azurecredentialcache +./.vscode_config +./.vscode_config/.local +./.vscode_config/.local/share +./.vscode_config/.local/share/nano +./.vscode_config/.local/share/code-server +./.vscode_config/.local/share/code-server/coder-logs +./.vscode_config/.local/share/code-server/Machine +./.vscode_config/.local/share/code-server/User +./.vscode_config/.local/share/code-server/User/History +./.vscode_config/.local/share/code-server/User/History/60db4d37 +./.vscode_config/.local/share/code-server/User/History/-b73a03a +./.vscode_config/.local/share/code-server/User/History/-36c7e04c +./.vscode_config/.local/share/code-server/User/History/366f1f9f +./.vscode_config/.local/share/code-server/User/History/544ad050 +./.vscode_config/.local/share/code-server/User/History/-65d51e9b +./.vscode_config/.local/share/code-server/User/History/29f7094b +./.vscode_config/.local/share/code-server/User/History/-7b582be +./.vscode_config/.local/share/code-server/User/History/-2735c434 +./.vscode_config/.local/share/code-server/User/History/62928eff +./.vscode_config/.local/share/code-server/User/History/6fad377d +./.vscode_config/.local/share/code-server/User/History/-74c5e47c +./.vscode_config/.local/share/code-server/User/History/44e986fa +./.vscode_config/.local/share/code-server/User/History/-77683dc0 +./.vscode_config/.local/share/code-server/User/History/-4212b206 +./.vscode_config/.local/share/code-server/User/History/14398474 +./.vscode_config/.local/share/code-server/User/History/-3dfff897 +./.vscode_config/.local/share/code-server/User/History/560c3702 +./.vscode_config/.local/share/code-server/User/History/-1307b4ae +./.vscode_config/.local/share/code-server/User/History/59b29e48 +./.vscode_config/.local/share/code-server/User/History/7a84dc56 +./.vscode_config/.local/share/code-server/User/History/-334bfc56 +./.vscode_config/.local/share/code-server/User/History/-28c6d5a +./.vscode_config/.local/share/code-server/User/History/-57c048d3 +./.vscode_config/.local/share/code-server/User/History/-22a85881 +./.vscode_config/.local/share/code-server/User/History/366631f3 +./.vscode_config/.local/share/code-server/User/History/fb7e7bc +./.vscode_config/.local/share/code-server/User/History/2ca76da5 +./.vscode_config/.local/share/code-server/User/History/-2e691610 +./.vscode_config/.local/share/code-server/User/History/-4b2a4237 +./.vscode_config/.local/share/code-server/User/History/-219a2af8 +./.vscode_config/.local/share/code-server/User/History/-7330191c +./.vscode_config/.local/share/code-server/User/History/29c9295f +./.vscode_config/.local/share/code-server/User/History/2cc892d2 +./.vscode_config/.local/share/code-server/User/History/292a9d0c +./.vscode_config/.local/share/code-server/User/History/-517f8cb2 +./.vscode_config/.local/share/code-server/User/History/-4e1f48b5 +./.vscode_config/.local/share/code-server/User/History/-4d4ca922 +./.vscode_config/.local/share/code-server/User/History/-4da16c1b +./.vscode_config/.local/share/code-server/User/History/-1b39eec9 +./.vscode_config/.local/share/code-server/User/History/-480d0047 +./.vscode_config/.local/share/code-server/User/History/544c5b73 +./.vscode_config/.local/share/code-server/User/History/4ef33482 +./.vscode_config/.local/share/code-server/User/History/-5322ebb2 +./.vscode_config/.local/share/code-server/User/History/2f47443d +./.vscode_config/.local/share/code-server/User/History/-30fedddb +./.vscode_config/.local/share/code-server/User/History/64bed780 +./.vscode_config/.local/share/code-server/User/History/-5db6cf04 +./.vscode_config/.local/share/code-server/User/History/-1ba00bbd +./.vscode_config/.local/share/code-server/User/History/-71e2d55f +./.vscode_config/.local/share/code-server/User/History/482da0ce +./.vscode_config/.local/share/code-server/User/History/2dfbf341 +./.vscode_config/.local/share/code-server/User/History/7f158c21 +./.vscode_config/.local/share/code-server/User/History/-29478f5a +./.vscode_config/.local/share/code-server/User/History/-7b58b5d6 +./.vscode_config/.local/share/code-server/User/History/-28e08209 +./.vscode_config/.local/share/code-server/User/History/-313525dc +./.vscode_config/.local/share/code-server/User/History/-5fbeb620 +./.vscode_config/.local/share/code-server/User/History/16f2aca3 +./.vscode_config/.local/share/code-server/User/History/-6c451dfd +./.vscode_config/.local/share/code-server/User/History/683e8c8 +./.vscode_config/.local/share/code-server/User/History/-177b50f1 +./.vscode_config/.local/share/code-server/User/History/-5e8dc48 +./.vscode_config/.local/share/code-server/User/History/3a2679b3 +./.vscode_config/.local/share/code-server/User/History/-330f7e6f +./.vscode_config/.local/share/code-server/User/History/2e5f3cd1 +./.vscode_config/.local/share/code-server/User/caches +./.vscode_config/.local/share/code-server/User/caches/CachedConfigurations +./.vscode_config/.local/share/code-server/User/caches/CachedConfigurations/folder +./.vscode_config/.local/share/code-server/User/caches/CachedConfigurations/folder/-461341b9 +./.vscode_config/.local/share/code-server/User/caches/CachedConfigurations/folder/-39141af6 +./.vscode_config/.local/share/code-server/User/caches/CachedConfigurations/folder/f83f4cd +./.vscode_config/.local/share/code-server/User/caches/CachedConfigurations/folder/20ae27a4 +./.vscode_config/.local/share/code-server/User/caches/CachedConfigurations/folder/-23d72190 +./.vscode_config/.local/share/code-server/User/snippets +./.vscode_config/.local/share/code-server/User/globalStorage +./.vscode_config/.local/share/code-server/User/workspaceStorage +./.vscode_config/.local/share/code-server/User/workspaceStorage/-14fc42bf +./.vscode_config/.local/share/code-server/User/workspaceStorage/-14fc42bf/chatEditingSessions +./.vscode_config/.local/share/code-server/User/workspaceStorage/-14fc42bf/chatEditingSessions/fe93b71a-e55f-4e3f-a4e7-7e7d3918caa3 +./.vscode_config/.local/share/code-server/User/workspaceStorage/-14fc42bf/chatEditingSessions/fe93b71a-e55f-4e3f-a4e7-7e7d3918caa3/contents +./.vscode_config/.local/share/code-server/User/workspaceStorage/-14fc42bf/chatEditingSessions/e76151b8-00f8-42d1-94ff-80dcf97afcf8 +./.vscode_config/.local/share/code-server/User/workspaceStorage/-14fc42bf/chatEditingSessions/e76151b8-00f8-42d1-94ff-80dcf97afcf8/contents +./.vscode_config/.local/share/code-server/User/workspaceStorage/-14fc42bf/chatEditingSessions/572c40db-876c-4fa1-ab7a-d8151bdaedb1 +./.vscode_config/.local/share/code-server/User/workspaceStorage/-14fc42bf/chatEditingSessions/572c40db-876c-4fa1-ab7a-d8151bdaedb1/contents +./.vscode_config/.local/share/code-server/User/workspaceStorage/-14fc42bf/chatSessions +./.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e +./.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatEditingSessions +./.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatEditingSessions/3565f851-786d-46f9-98bf-2b88b4789a3e +./.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatEditingSessions/3565f851-786d-46f9-98bf-2b88b4789a3e/contents +./.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatEditingSessions/1a3a721a-9b05-496e-9cd4-91890682a7c2 +./.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatEditingSessions/1a3a721a-9b05-496e-9cd4-91890682a7c2/contents +./.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatEditingSessions/7a659de8-2306-4f81-bbc1-b5fa93a5527e +./.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatEditingSessions/7a659de8-2306-4f81-bbc1-b5fa93a5527e/contents +./.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatEditingSessions/4f44a27a-de0a-4e31-904f-212ba1423280 +./.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatEditingSessions/4f44a27a-de0a-4e31-904f-212ba1423280/contents +./.vscode_config/.local/share/code-server/User/workspaceStorage/3d7c237e/chatSessions +./.vscode_config/.local/share/code-server/User/workspaceStorage/-53e2bffc +./.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db +./.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions +./.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/d9f9e18e-5e68-4fad-8ff9-f520bbdccd72 +./.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/d9f9e18e-5e68-4fad-8ff9-f520bbdccd72/contents +./.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/810c61e8-420b-4c2d-b90d-78405f575e10 +./.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/810c61e8-420b-4c2d-b90d-78405f575e10/contents +./.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/5127fd56-e03a-4cc6-8376-e74d4e23ce7c +./.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/5127fd56-e03a-4cc6-8376-e74d4e23ce7c/contents +./.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/5cf441f2-ab0c-446e-a7ad-87e3c3bfea3c +./.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/5cf441f2-ab0c-446e-a7ad-87e3c3bfea3c/contents +./.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/1c1e6083-b4f9-42e4-ae28-2f71caba0cf4 +./.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/1c1e6083-b4f9-42e4-ae28-2f71caba0cf4/contents +./.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/afa463b1-e6ec-42f8-8aca-aa89ccce4936 +./.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatEditingSessions/afa463b1-e6ec-42f8-8aca-aa89ccce4936/contents +./.vscode_config/.local/share/code-server/User/workspaceStorage/70d739db/chatSessions +./.vscode_config/.local/share/code-server/User/workspaceStorage/-ad48359 +./.vscode_config/.local/share/code-server/User/workspaceStorage/-ad48359/chatEditingSessions +./.vscode_config/.local/share/code-server/User/workspaceStorage/-ad48359/chatEditingSessions/d4cc21e9-36f6-444d-b20c-4c91876bba2b +./.vscode_config/.local/share/code-server/User/workspaceStorage/-ad48359/chatEditingSessions/d4cc21e9-36f6-444d-b20c-4c91876bba2b/contents +./.vscode_config/.local/share/code-server/User/workspaceStorage/-ad48359/chatSessions +./.vscode_config/.local/share/code-server/extensions +./.vscode_config/.local/share/code-server/CachedProfilesData +./.vscode_config/.local/share/code-server/CachedProfilesData/__default__profile__ +./.vscode_config/.local/share/code-server/logs +./.vscode_config/.local/share/code-server/logs/20260126T174543 +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost5 +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost5/vscode.git +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost5/vscode.github +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost5/vscode.github-authentication +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost3 +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost3/vscode.git +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost3/vscode.github +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost3/vscode.github-authentication +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost7 +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost7/vscode.git +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost7/vscode.github +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost7/vscode.github-authentication +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost6 +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost6/vscode.git +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost6/vscode.github +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost6/vscode.github-authentication +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost1 +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost1/vscode.git +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost1/vscode.github +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost1/vscode.github-authentication +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost4 +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost4/vscode.git +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost4/vscode.github +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost4/vscode.github-authentication +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost2 +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost2/vscode.git +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost2/vscode.github +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost2/vscode.github-authentication +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost8 +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost8/vscode.git +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost8/vscode.github +./.vscode_config/.local/share/code-server/logs/20260126T174543/exthost8/vscode.github-authentication +./.vscode_config/.local/share/code-server/logs/20260126T164451 +./.vscode_config/.local/share/code-server/logs/20260126T164451/exthost1 +./.vscode_config/.local/share/code-server/logs/20260126T164451/exthost1/vscode.git +./.vscode_config/.local/share/code-server/logs/20260126T164451/exthost1/vscode.github +./.vscode_config/.local/share/code-server/logs/20260126T164451/exthost1/vscode.github-authentication +./.vscode_config/.local/share/code-server/logs/20260129T214520 +./.vscode_config/.local/share/code-server/logs/20260129T214520/exthost1 +./.vscode_config/.local/share/code-server/logs/20260129T214520/exthost1/vscode.css-language-features +./.vscode_config/.local/share/code-server/logs/20260129T214520/exthost1/vscode.typescript-language-features +./.vscode_config/.local/share/code-server/logs/20260129T214520/exthost1/vscode.git +./.vscode_config/.local/share/code-server/logs/20260129T214520/exthost1/vscode.github +./.vscode_config/.local/share/code-server/logs/20260129T214520/exthost1/vscode.html-language-features +./.vscode_config/.local/share/code-server/logs/20260129T214520/exthost1/vscode.github-authentication +./.vscode_config/.local/share/code-server/logs/20260129T001948 +./.vscode_config/.local/share/code-server/logs/20260129T001948/exthost3 +./.vscode_config/.local/share/code-server/logs/20260129T001948/exthost3/vscode.git +./.vscode_config/.local/share/code-server/logs/20260129T001948/exthost3/vscode.github +./.vscode_config/.local/share/code-server/logs/20260129T001948/exthost3/vscode.github-authentication +./.vscode_config/.local/share/code-server/logs/20260129T001948/exthost1 +./.vscode_config/.local/share/code-server/logs/20260129T001948/exthost1/vscode.git +./.vscode_config/.local/share/code-server/logs/20260129T001948/exthost1/vscode.github +./.vscode_config/.local/share/code-server/logs/20260129T001948/exthost1/vscode.github-authentication +./.vscode_config/.local/share/code-server/logs/20260129T001948/exthost2 +./.vscode_config/.local/share/code-server/logs/20260129T001948/exthost2/vscode.git +./.vscode_config/.local/share/code-server/logs/20260129T001948/exthost2/vscode.github +./.vscode_config/.local/share/code-server/logs/20260129T001948/exthost2/vscode.html-language-features +./.vscode_config/.local/share/code-server/logs/20260129T001948/exthost2/vscode.github-authentication +./.vscode_config/.local/share/code-server/logs/20260129T213246 +./.vscode_config/.local/share/code-server/logs/20260129T213246/exthost1 +./.vscode_config/.local/share/code-server/logs/20260129T213246/exthost1/vscode.git +./.vscode_config/.local/share/code-server/logs/20260129T213246/exthost1/vscode.github +./.vscode_config/.local/share/code-server/logs/20260129T213246/exthost1/vscode.github-authentication +./.vscode_config/.local/share/code-server/logs/20260125T233505 +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost5 +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost5/vscode.git +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost5/vscode.github +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost5/vscode.github-authentication +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost10 +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost10/vscode.git +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost10/vscode.github +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost10/vscode.github-authentication +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost3 +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost3/vscode.git +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost3/vscode.github +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost3/vscode.github-authentication +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost9 +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost9/vscode.git +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost9/vscode.github +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost9/vscode.github-authentication +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost7 +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost7/vscode.git +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost7/vscode.github +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost7/vscode.github-authentication +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost6 +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost6/vscode.git +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost6/vscode.github +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost6/vscode.github-authentication +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost1 +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost1/vscode.git +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost1/vscode.github +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost1/vscode.github-authentication +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost4 +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost4/vscode.git +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost4/vscode.github +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost4/vscode.github-authentication +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost2 +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost2/vscode.git +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost2/vscode.github +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost2/vscode.github-authentication +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost8 +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost8/vscode.git +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost8/vscode.github +./.vscode_config/.local/share/code-server/logs/20260125T233505/exthost8/vscode.github-authentication +./.vscode_config/.local/share/mc +./.vscode_config/.ssh +./.vscode_config/.config +./.vscode_config/.config/code-server +./.vscode_config/.config/mc +./.vscode_config/.cache +./.vscode_config/.cache/typescript +./.vscode_config/.cache/typescript/5.9 +./.vscode_config/.cache/Microsoft +./.vscode_config/.cache/Microsoft/DeveloperTools +./.vscode_config/.cache/mc +./logs +./frontend +./frontend/src +./frontend/src/views +./frontend/src/views/admin +./frontend/src/assets +./frontend/src/router +./frontend/src/stores +./frontend/src/services +./frontend/src/components +./frontend/public +./frontend/node_modules +./frontend/node_modules/detect-libc +./frontend/node_modules/detect-libc/lib +./frontend/node_modules/jsesc +./frontend/node_modules/jsesc/man +./frontend/node_modules/jsesc/bin +./frontend/node_modules/unplugin-utils +./frontend/node_modules/unplugin-utils/dist +./frontend/node_modules/asynckit +./frontend/node_modules/asynckit/lib +./frontend/node_modules/@types +./frontend/node_modules/@types/estree +./frontend/node_modules/estree-walker +./frontend/node_modules/estree-walker/src +./frontend/node_modules/estree-walker/types +./frontend/node_modules/estree-walker/dist +./frontend/node_modules/estree-walker/dist/umd +./frontend/node_modules/estree-walker/dist/esm +./frontend/node_modules/local-pkg +./frontend/node_modules/local-pkg/dist +./frontend/node_modules/copy-anything +./frontend/node_modules/copy-anything/dist +./frontend/node_modules/postcss +./frontend/node_modules/postcss/lib +./frontend/node_modules/speakingurl +./frontend/node_modules/speakingurl/examples +./frontend/node_modules/speakingurl/test +./frontend/node_modules/speakingurl/lib +./frontend/node_modules/speakingurl/typings +./frontend/node_modules/speakingurl/typings/speakingurl +./frontend/node_modules/fraction.js +./frontend/node_modules/fraction.js/src +./frontend/node_modules/fraction.js/examples +./frontend/node_modules/fraction.js/dist +./frontend/node_modules/fraction.js/tests +./frontend/node_modules/ast-kit +./frontend/node_modules/ast-kit/dist +./frontend/node_modules/get-proto +./frontend/node_modules/get-proto/test +./frontend/node_modules/get-proto/.github +./frontend/node_modules/.bin +./frontend/node_modules/es-object-atoms +./frontend/node_modules/es-object-atoms/test +./frontend/node_modules/es-object-atoms/.github +./frontend/node_modules/pathe +./frontend/node_modules/pathe/dist +./frontend/node_modules/pathe/dist/shared +./frontend/node_modules/source-map-js +./frontend/node_modules/source-map-js/lib +./frontend/node_modules/@esbuild +./frontend/node_modules/@esbuild/linux-x64 +./frontend/node_modules/@esbuild/linux-x64/bin +./frontend/node_modules/@rolldown +./frontend/node_modules/@rolldown/pluginutils +./frontend/node_modules/@rolldown/pluginutils/dist +./frontend/node_modules/vue +./frontend/node_modules/vue/compiler-sfc +./frontend/node_modules/vue/dist +./frontend/node_modules/vue/server-renderer +./frontend/node_modules/vue/jsx-runtime +./frontend/node_modules/delayed-stream +./frontend/node_modules/delayed-stream/lib +./frontend/node_modules/lightningcss-linux-x64-gnu +./frontend/node_modules/magic-string +./frontend/node_modules/magic-string/dist +./frontend/node_modules/es-define-property +./frontend/node_modules/es-define-property/test +./frontend/node_modules/es-define-property/.github +./frontend/node_modules/chart.js +./frontend/node_modules/chart.js/dist +./frontend/node_modules/chart.js/dist/plugins +./frontend/node_modules/chart.js/dist/plugins/plugin.filler +./frontend/node_modules/chart.js/dist/core +./frontend/node_modules/chart.js/dist/platform +./frontend/node_modules/chart.js/dist/types +./frontend/node_modules/chart.js/dist/controllers +./frontend/node_modules/chart.js/dist/helpers +./frontend/node_modules/chart.js/dist/elements +./frontend/node_modules/chart.js/dist/chunks +./frontend/node_modules/chart.js/dist/scales +./frontend/node_modules/chart.js/helpers +./frontend/node_modules/chart.js/auto +./frontend/node_modules/lightningcss +./frontend/node_modules/lightningcss/node +./frontend/node_modules/form-data +./frontend/node_modules/form-data/lib +./frontend/node_modules/graceful-fs +./frontend/node_modules/node-releases +./frontend/node_modules/node-releases/data +./frontend/node_modules/node-releases/data/processed +./frontend/node_modules/node-releases/data/release-schedule +./frontend/node_modules/@babel +./frontend/node_modules/@babel/helper-string-parser +./frontend/node_modules/@babel/helper-string-parser/lib +./frontend/node_modules/@babel/generator +./frontend/node_modules/@babel/generator/lib +./frontend/node_modules/@babel/generator/lib/node +./frontend/node_modules/@babel/generator/lib/generators +./frontend/node_modules/@babel/types +./frontend/node_modules/@babel/types/lib +./frontend/node_modules/@babel/types/lib/retrievers +./frontend/node_modules/@babel/types/lib/clone +./frontend/node_modules/@babel/types/lib/comments +./frontend/node_modules/@babel/types/lib/utils +./frontend/node_modules/@babel/types/lib/utils/react +./frontend/node_modules/@babel/types/lib/converters +./frontend/node_modules/@babel/types/lib/traverse +./frontend/node_modules/@babel/types/lib/asserts +./frontend/node_modules/@babel/types/lib/asserts/generated +./frontend/node_modules/@babel/types/lib/modifications +./frontend/node_modules/@babel/types/lib/modifications/typescript +./frontend/node_modules/@babel/types/lib/modifications/flow +./frontend/node_modules/@babel/types/lib/constants +./frontend/node_modules/@babel/types/lib/constants/generated +./frontend/node_modules/@babel/types/lib/builders +./frontend/node_modules/@babel/types/lib/builders/typescript +./frontend/node_modules/@babel/types/lib/builders/react +./frontend/node_modules/@babel/types/lib/builders/flow +./frontend/node_modules/@babel/types/lib/builders/generated +./frontend/node_modules/@babel/types/lib/definitions +./frontend/node_modules/@babel/types/lib/ast-types +./frontend/node_modules/@babel/types/lib/ast-types/generated +./frontend/node_modules/@babel/types/lib/validators +./frontend/node_modules/@babel/types/lib/validators/react +./frontend/node_modules/@babel/types/lib/validators/generated +./frontend/node_modules/@babel/parser +./frontend/node_modules/@babel/parser/lib +./frontend/node_modules/@babel/parser/bin +./frontend/node_modules/@babel/parser/typings +./frontend/node_modules/@babel/helper-validator-identifier +./frontend/node_modules/@babel/helper-validator-identifier/lib +./frontend/node_modules/electron-to-chromium +./frontend/node_modules/webpack-virtual-modules +./frontend/node_modules/webpack-virtual-modules/src +./frontend/node_modules/webpack-virtual-modules/lib +./frontend/node_modules/mime-types +./frontend/node_modules/has-tostringtag +./frontend/node_modules/has-tostringtag/test +./frontend/node_modules/has-tostringtag/test/shams +./frontend/node_modules/has-tostringtag/.github +./frontend/node_modules/picocolors +./frontend/node_modules/browserslist +./frontend/node_modules/unplugin +./frontend/node_modules/unplugin/dist +./frontend/node_modules/unplugin/dist/webpack +./frontend/node_modules/unplugin/dist/webpack/loaders +./frontend/node_modules/unplugin/dist/rspack +./frontend/node_modules/unplugin/dist/rspack/loaders +./frontend/node_modules/hasown +./frontend/node_modules/hasown/.github +./frontend/node_modules/autoprefixer +./frontend/node_modules/autoprefixer/lib +./frontend/node_modules/autoprefixer/lib/hacks +./frontend/node_modules/autoprefixer/bin +./frontend/node_modules/autoprefixer/data +./frontend/node_modules/acorn +./frontend/node_modules/acorn/dist +./frontend/node_modules/acorn/bin +./frontend/node_modules/magic-string-ast +./frontend/node_modules/magic-string-ast/dist +./frontend/node_modules/es-errors +./frontend/node_modules/es-errors/test +./frontend/node_modules/es-errors/.github +./frontend/node_modules/jiti +./frontend/node_modules/jiti/lib +./frontend/node_modules/jiti/dist +./frontend/node_modules/mime-db +./frontend/node_modules/combined-stream +./frontend/node_modules/combined-stream/lib +./frontend/node_modules/@alloc +./frontend/node_modules/@alloc/quick-lru +./frontend/node_modules/@tailwindcss +./frontend/node_modules/@tailwindcss/postcss +./frontend/node_modules/@tailwindcss/postcss/dist +./frontend/node_modules/@tailwindcss/node +./frontend/node_modules/@tailwindcss/node/dist +./frontend/node_modules/@tailwindcss/oxide-linux-x64-gnu +./frontend/node_modules/@tailwindcss/oxide +./frontend/node_modules/escalade +./frontend/node_modules/escalade/dist +./frontend/node_modules/escalade/sync +./frontend/node_modules/function-bind +./frontend/node_modules/function-bind/test +./frontend/node_modules/function-bind/.github +./frontend/node_modules/tinyglobby +./frontend/node_modules/tinyglobby/dist +./frontend/node_modules/confbox +./frontend/node_modules/confbox/dist +./frontend/node_modules/confbox/dist/shared +./frontend/node_modules/@rollup +./frontend/node_modules/@rollup/rollup-linux-x64-musl +./frontend/node_modules/@rollup/rollup-linux-x64-gnu +./frontend/node_modules/pkg-types +./frontend/node_modules/pkg-types/dist +./frontend/node_modules/pinia +./frontend/node_modules/pinia/dist +./frontend/node_modules/enhanced-resolve +./frontend/node_modules/enhanced-resolve/lib +./frontend/node_modules/enhanced-resolve/lib/util +./frontend/node_modules/postcss-value-parser +./frontend/node_modules/postcss-value-parser/lib +./frontend/node_modules/birpc +./frontend/node_modules/birpc/dist +./frontend/node_modules/@vue +./frontend/node_modules/@vue/shared +./frontend/node_modules/@vue/shared/dist +./frontend/node_modules/@vue/devtools-kit +./frontend/node_modules/@vue/devtools-kit/dist +./frontend/node_modules/@vue/runtime-dom +./frontend/node_modules/@vue/runtime-dom/dist +./frontend/node_modules/@vue/compiler-sfc +./frontend/node_modules/@vue/compiler-sfc/dist +./frontend/node_modules/@vue/devtools-shared +./frontend/node_modules/@vue/devtools-shared/dist +./frontend/node_modules/@vue/compiler-core +./frontend/node_modules/@vue/compiler-core/dist +./frontend/node_modules/@vue/compiler-ssr +./frontend/node_modules/@vue/compiler-ssr/dist +./frontend/node_modules/@vue/compiler-dom +./frontend/node_modules/@vue/compiler-dom/dist +./frontend/node_modules/@vue/devtools-api +./frontend/node_modules/@vue/devtools-api/dist +./frontend/node_modules/@vue/server-renderer +./frontend/node_modules/@vue/server-renderer/dist +./frontend/node_modules/@vue/reactivity +./frontend/node_modules/@vue/reactivity/dist +./frontend/node_modules/@vue/runtime-core +./frontend/node_modules/@vue/runtime-core/dist +./frontend/node_modules/.vite +./frontend/node_modules/.vite/deps +./frontend/node_modules/tapable +./frontend/node_modules/tapable/lib +./frontend/node_modules/call-bind-apply-helpers +./frontend/node_modules/call-bind-apply-helpers/test +./frontend/node_modules/call-bind-apply-helpers/.github +./frontend/node_modules/follow-redirects +./frontend/node_modules/caniuse-lite +./frontend/node_modules/caniuse-lite/dist +./frontend/node_modules/caniuse-lite/dist/lib +./frontend/node_modules/caniuse-lite/dist/unpacker +./frontend/node_modules/caniuse-lite/data +./frontend/node_modules/caniuse-lite/data/regions +./frontend/node_modules/caniuse-lite/data/features +./frontend/node_modules/@vitejs +./frontend/node_modules/@vitejs/plugin-vue +./frontend/node_modules/@vitejs/plugin-vue/dist +./frontend/node_modules/baseline-browser-mapping +./frontend/node_modules/baseline-browser-mapping/dist +./frontend/node_modules/@jridgewell +./frontend/node_modules/@jridgewell/remapping +./frontend/node_modules/@jridgewell/remapping/src +./frontend/node_modules/@jridgewell/remapping/types +./frontend/node_modules/@jridgewell/remapping/dist +./frontend/node_modules/@jridgewell/resolve-uri +./frontend/node_modules/@jridgewell/resolve-uri/dist +./frontend/node_modules/@jridgewell/resolve-uri/dist/types +./frontend/node_modules/@jridgewell/sourcemap-codec +./frontend/node_modules/@jridgewell/sourcemap-codec/src +./frontend/node_modules/@jridgewell/sourcemap-codec/types +./frontend/node_modules/@jridgewell/sourcemap-codec/dist +./frontend/node_modules/@jridgewell/gen-mapping +./frontend/node_modules/@jridgewell/gen-mapping/src +./frontend/node_modules/@jridgewell/gen-mapping/types +./frontend/node_modules/@jridgewell/gen-mapping/dist +./frontend/node_modules/@jridgewell/gen-mapping/dist/types +./frontend/node_modules/@jridgewell/trace-mapping +./frontend/node_modules/@jridgewell/trace-mapping/src +./frontend/node_modules/@jridgewell/trace-mapping/types +./frontend/node_modules/@jridgewell/trace-mapping/dist +./frontend/node_modules/perfect-debounce +./frontend/node_modules/perfect-debounce/dist +./frontend/node_modules/dunder-proto +./frontend/node_modules/dunder-proto/test +./frontend/node_modules/dunder-proto/.github +./frontend/node_modules/es-set-tostringtag +./frontend/node_modules/es-set-tostringtag/test +./frontend/node_modules/has-symbols +./frontend/node_modules/has-symbols/test +./frontend/node_modules/has-symbols/test/shams +./frontend/node_modules/has-symbols/.github +./frontend/node_modules/picomatch +./frontend/node_modules/picomatch/lib +./frontend/node_modules/gopd +./frontend/node_modules/gopd/test +./frontend/node_modules/gopd/.github +./frontend/node_modules/is-what +./frontend/node_modules/is-what/dist +./frontend/node_modules/tailwindcss +./frontend/node_modules/tailwindcss/dist +./frontend/node_modules/get-intrinsic +./frontend/node_modules/get-intrinsic/test +./frontend/node_modules/get-intrinsic/.github +./frontend/node_modules/json5 +./frontend/node_modules/json5/lib +./frontend/node_modules/json5/dist +./frontend/node_modules/superjson +./frontend/node_modules/superjson/dist +./frontend/node_modules/yaml +./frontend/node_modules/yaml/dist +./frontend/node_modules/yaml/dist/doc +./frontend/node_modules/yaml/dist/schema +./frontend/node_modules/yaml/dist/schema/core +./frontend/node_modules/yaml/dist/schema/common +./frontend/node_modules/yaml/dist/schema/json +./frontend/node_modules/yaml/dist/schema/yaml-1.1 +./frontend/node_modules/yaml/dist/parse +./frontend/node_modules/yaml/dist/compose +./frontend/node_modules/yaml/dist/nodes +./frontend/node_modules/yaml/dist/stringify +./frontend/node_modules/yaml/browser +./frontend/node_modules/yaml/browser/dist +./frontend/node_modules/yaml/browser/dist/doc +./frontend/node_modules/yaml/browser/dist/schema +./frontend/node_modules/yaml/browser/dist/schema/core +./frontend/node_modules/yaml/browser/dist/schema/common +./frontend/node_modules/yaml/browser/dist/schema/json +./frontend/node_modules/yaml/browser/dist/schema/yaml-1.1 +./frontend/node_modules/yaml/browser/dist/parse +./frontend/node_modules/yaml/browser/dist/compose +./frontend/node_modules/yaml/browser/dist/nodes +./frontend/node_modules/yaml/browser/dist/stringify +./frontend/node_modules/update-browserslist-db +./frontend/node_modules/@vue-macros +./frontend/node_modules/@vue-macros/common +./frontend/node_modules/@vue-macros/common/dist +./frontend/node_modules/csstype +./frontend/node_modules/muggle-string +./frontend/node_modules/muggle-string/out +./frontend/node_modules/quansync +./frontend/node_modules/quansync/dist +./frontend/node_modules/.vite-temp +./frontend/node_modules/exsolve +./frontend/node_modules/exsolve/dist +./frontend/node_modules/esbuild +./frontend/node_modules/esbuild/lib +./frontend/node_modules/esbuild/bin +./frontend/node_modules/readdirp +./frontend/node_modules/mlly +./frontend/node_modules/mlly/dist +./frontend/node_modules/mlly/node_modules +./frontend/node_modules/mlly/node_modules/confbox +./frontend/node_modules/mlly/node_modules/confbox/dist +./frontend/node_modules/mlly/node_modules/confbox/dist/shared +./frontend/node_modules/mlly/node_modules/pkg-types +./frontend/node_modules/mlly/node_modules/pkg-types/dist +./frontend/node_modules/hookable +./frontend/node_modules/hookable/dist +./frontend/node_modules/scule +./frontend/node_modules/scule/dist +./frontend/node_modules/math-intrinsics +./frontend/node_modules/math-intrinsics/test +./frontend/node_modules/math-intrinsics/.github +./frontend/node_modules/math-intrinsics/constants +./frontend/node_modules/chokidar +./frontend/node_modules/nanoid +./frontend/node_modules/nanoid/bin +./frontend/node_modules/nanoid/async +./frontend/node_modules/nanoid/url-alphabet +./frontend/node_modules/nanoid/non-secure +./frontend/node_modules/vue-chartjs +./frontend/node_modules/vue-chartjs/dist +./frontend/node_modules/rollup +./frontend/node_modules/rollup/dist +./frontend/node_modules/rollup/dist/shared +./frontend/node_modules/rollup/dist/es +./frontend/node_modules/rollup/dist/es/shared +./frontend/node_modules/rollup/dist/bin +./frontend/node_modules/proxy-from-env +./frontend/node_modules/rfdc +./frontend/node_modules/rfdc/test +./frontend/node_modules/rfdc/.github +./frontend/node_modules/rfdc/.github/workflows +./frontend/node_modules/fdir +./frontend/node_modules/fdir/dist +./frontend/node_modules/ufo +./frontend/node_modules/ufo/dist +./frontend/node_modules/entities +./frontend/node_modules/entities/src +./frontend/node_modules/entities/src/internal +./frontend/node_modules/entities/src/generated +./frontend/node_modules/entities/dist +./frontend/node_modules/entities/dist/commonjs +./frontend/node_modules/entities/dist/commonjs/internal +./frontend/node_modules/entities/dist/commonjs/generated +./frontend/node_modules/entities/dist/esm +./frontend/node_modules/entities/dist/esm/internal +./frontend/node_modules/entities/dist/esm/generated +./frontend/node_modules/@kurkle +./frontend/node_modules/@kurkle/color +./frontend/node_modules/@kurkle/color/dist +./frontend/node_modules/mitt +./frontend/node_modules/mitt/dist +./frontend/node_modules/vue-router +./frontend/node_modules/vue-router/dist +./frontend/node_modules/vue-router/dist/volar +./frontend/node_modules/vue-router/dist/unplugin +./frontend/node_modules/vue-router/dist/experimental +./frontend/node_modules/vue-router/vetur +./frontend/node_modules/vue-router/node_modules +./frontend/node_modules/vue-router/node_modules/@vue +./frontend/node_modules/vue-router/node_modules/@vue/devtools-kit +./frontend/node_modules/vue-router/node_modules/@vue/devtools-kit/dist +./frontend/node_modules/vue-router/node_modules/@vue/devtools-shared +./frontend/node_modules/vue-router/node_modules/@vue/devtools-shared/dist +./frontend/node_modules/vue-router/node_modules/@vue/devtools-api +./frontend/node_modules/vue-router/node_modules/@vue/devtools-api/dist +./frontend/node_modules/vue-router/node_modules/perfect-debounce +./frontend/node_modules/vue-router/node_modules/perfect-debounce/dist +./frontend/node_modules/axios +./frontend/node_modules/axios/lib +./frontend/node_modules/axios/lib/core +./frontend/node_modules/axios/lib/adapters +./frontend/node_modules/axios/lib/platform +./frontend/node_modules/axios/lib/platform/node +./frontend/node_modules/axios/lib/platform/node/classes +./frontend/node_modules/axios/lib/platform/common +./frontend/node_modules/axios/lib/platform/browser +./frontend/node_modules/axios/lib/platform/browser/classes +./frontend/node_modules/axios/lib/helpers +./frontend/node_modules/axios/lib/env +./frontend/node_modules/axios/lib/env/classes +./frontend/node_modules/axios/lib/defaults +./frontend/node_modules/axios/lib/cancel +./frontend/node_modules/axios/dist +./frontend/node_modules/axios/dist/node +./frontend/node_modules/axios/dist/browser +./frontend/node_modules/axios/dist/esm +./frontend/node_modules/vite +./frontend/node_modules/vite/types +./frontend/node_modules/vite/types/internal +./frontend/node_modules/vite/dist +./frontend/node_modules/vite/dist/node +./frontend/node_modules/vite/dist/node/chunks +./frontend/node_modules/vite/dist/client +./frontend/node_modules/vite/bin +./frontend/node_modules/vite/misc +./frontend/node_modules/ast-walker-scope +./frontend/node_modules/ast-walker-scope/dist +./frontend/.vscode +./code-server-config +./code-server-config/.local +./code-server-config/.local/share +./code-server-config/.local/share/nano +./code-server-config/.local/share/code-server +./code-server-config/.local/share/code-server/coder-logs +./code-server-config/.local/lib +./code-server-config/.local/lib/python3.12 +./code-server-config/.local/lib/python3.12/site-packages +./code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info +./code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/licenses +./code-server-config/.local/lib/python3.12/site-packages/idna +./code-server-config/.local/lib/python3.12/site-packages/bs4 +./code-server-config/.local/lib/python3.12/site-packages/bs4/builder +./code-server-config/.local/lib/python3.12/site-packages/greenlet-3.3.0.dist-info +./code-server-config/.local/lib/python3.12/site-packages/greenlet-3.3.0.dist-info/licenses +./code-server-config/.local/lib/python3.12/site-packages/certifi +./code-server-config/.local/lib/python3.12/site-packages/sqlalchemy +./code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/connectors +./code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/cyextension +./code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/future +./code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/orm +./code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/event +./code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing +./code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/plugin +./code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/fixtures +./code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/testing/suite +./code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects +./code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mssql +./code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql +./code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite +./code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/mysql +./code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/dialects/oracle +./code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/sql +./code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/pool +./code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext +./code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio +./code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/mypy +./code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/ext/declarative +./code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/engine +./code-server-config/.local/lib/python3.12/site-packages/sqlalchemy/util +./code-server-config/.local/lib/python3.12/site-packages/httpx-0.28.1.dist-info +./code-server-config/.local/lib/python3.12/site-packages/httpx-0.28.1.dist-info/licenses +./code-server-config/.local/lib/python3.12/site-packages/anyio +./code-server-config/.local/lib/python3.12/site-packages/anyio/_backends +./code-server-config/.local/lib/python3.12/site-packages/anyio/streams +./code-server-config/.local/lib/python3.12/site-packages/anyio/_core +./code-server-config/.local/lib/python3.12/site-packages/anyio/abc +./code-server-config/.local/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info +./code-server-config/.local/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info/licenses +./code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info +./code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/licenses +./code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info +./code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/licenses +./code-server-config/.local/lib/python3.12/site-packages/httpx +./code-server-config/.local/lib/python3.12/site-packages/httpx/_transports +./code-server-config/.local/lib/python3.12/site-packages/python_dotenv-1.2.1.dist-info +./code-server-config/.local/lib/python3.12/site-packages/python_dotenv-1.2.1.dist-info/licenses +./code-server-config/.local/lib/python3.12/site-packages/soupsieve +./code-server-config/.local/lib/python3.12/site-packages/httpcore-1.0.9.dist-info +./code-server-config/.local/lib/python3.12/site-packages/httpcore-1.0.9.dist-info/licenses +./code-server-config/.local/lib/python3.12/site-packages/greenlet +./code-server-config/.local/lib/python3.12/site-packages/greenlet/platform +./code-server-config/.local/lib/python3.12/site-packages/greenlet/tests +./code-server-config/.local/lib/python3.12/site-packages/dotenv +./code-server-config/.local/lib/python3.12/site-packages/asyncpg +./code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol +./code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs +./code-server-config/.local/lib/python3.12/site-packages/asyncpg/_testbase +./code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto +./code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs +./code-server-config/.local/lib/python3.12/site-packages/asyncpg/exceptions +./code-server-config/.local/lib/python3.12/site-packages/h11 +./code-server-config/.local/lib/python3.12/site-packages/sqlalchemy-2.0.45.dist-info +./code-server-config/.local/lib/python3.12/site-packages/sqlalchemy-2.0.45.dist-info/licenses +./code-server-config/.local/lib/python3.12/site-packages/idna-3.11.dist-info +./code-server-config/.local/lib/python3.12/site-packages/idna-3.11.dist-info/licenses +./code-server-config/.local/lib/python3.12/site-packages/h11-0.16.0.dist-info +./code-server-config/.local/lib/python3.12/site-packages/h11-0.16.0.dist-info/licenses +./code-server-config/.local/lib/python3.12/site-packages/certifi-2026.1.4.dist-info +./code-server-config/.local/lib/python3.12/site-packages/certifi-2026.1.4.dist-info/licenses +./code-server-config/.local/lib/python3.12/site-packages/httpcore +./code-server-config/.local/lib/python3.12/site-packages/httpcore/_sync +./code-server-config/.local/lib/python3.12/site-packages/httpcore/_async +./code-server-config/.local/lib/python3.12/site-packages/httpcore/_backends +./code-server-config/.local/lib/python3.12/site-packages/soupsieve-2.8.3.dist-info +./code-server-config/.local/lib/python3.12/site-packages/soupsieve-2.8.3.dist-info/licenses +./code-server-config/.local/include +./code-server-config/.local/include/python3.12 +./code-server-config/.local/include/python3.12/greenlet +./code-server-config/.local/bin +./code-server-config/.ssh +./code-server-config/.config +./code-server-config/.config/code-server +./code-server-config/extensions +./code-server-config/data +./code-server-config/data/Machine +./code-server-config/data/User +./code-server-config/data/User/History +./code-server-config/data/User/History/6ca6cf1a +./code-server-config/data/User/History/-706ef310 +./code-server-config/data/User/History/-16684355 +./code-server-config/data/User/History/-313e58 +./code-server-config/data/User/History/-52e5c41d +./code-server-config/data/User/History/30eb9f94 +./code-server-config/data/User/History/-1768a9b0 +./code-server-config/data/User/History/2e6ecb37 +./code-server-config/data/User/History/-26d8d76b +./code-server-config/data/User/History/-10d36f1c +./code-server-config/data/User/History/e7633ef +./code-server-config/data/User/History/2434083a +./code-server-config/data/User/History/563f6285 +./code-server-config/data/User/History/1231c811 +./code-server-config/data/User/History/-5bd368a0 +./code-server-config/data/User/History/10134b39 +./code-server-config/data/User/History/-4c88f193 +./code-server-config/data/User/History/-2ef9c2df +./code-server-config/data/User/History/5bff933a +./code-server-config/data/User/History/-72cc77ef +./code-server-config/data/User/History/97f3a5f +./code-server-config/data/User/History/-5314da0c +./code-server-config/data/User/History/-3487e1e +./code-server-config/data/User/History/37941b6f +./code-server-config/data/User/History/-7a78fe9d +./code-server-config/data/User/History/-412f821c +./code-server-config/data/User/History/5144c62f +./code-server-config/data/User/History/55969fe3 +./code-server-config/data/User/History/-4ace1ff2 +./code-server-config/data/User/History/-22981f1a +./code-server-config/data/User/History/-719dbe4 +./code-server-config/data/User/History/3ae47db8 +./code-server-config/data/User/History/-6713540d +./code-server-config/data/User/History/-4958fed3 +./code-server-config/data/User/History/71ceecfb +./code-server-config/data/User/History/16d1374a +./code-server-config/data/User/History/359c80de +./code-server-config/data/User/History/-5e83fa91 +./code-server-config/data/User/History/-638902d7 +./code-server-config/data/User/History/639c2122 +./code-server-config/data/User/History/-1e547221 +./code-server-config/data/User/History/-6f62bdcf +./code-server-config/data/User/caches +./code-server-config/data/User/caches/CachedConfigurations +./code-server-config/data/User/caches/CachedConfigurations/folder +./code-server-config/data/User/caches/CachedConfigurations/folder/-5879b260 +./code-server-config/data/User/caches/CachedConfigurations/folder/-5c4fcefd +./code-server-config/data/User/caches/CachedConfigurations/folder/3e658ed7 +./code-server-config/data/User/caches/CachedConfigurations/folder/-285bda86 +./code-server-config/data/User/Backups +./code-server-config/data/User/Backups/-54297bf2 +./code-server-config/data/User/Backups/-54297bf2/vscode-remote +./code-server-config/data/User/snippets +./code-server-config/data/User/globalStorage +./code-server-config/data/User/globalStorage/vscode.json-language-features +./code-server-config/data/User/globalStorage/vscode.json-language-features/json-schema-cache +./code-server-config/data/User/workspaceStorage +./code-server-config/data/User/workspaceStorage/-63ce429 +./code-server-config/data/User/workspaceStorage/-63ce429/chatEditingSessions +./code-server-config/data/User/workspaceStorage/-63ce429/chatEditingSessions/a91fca11-9919-49b2-9aab-55a4263a881f +./code-server-config/data/User/workspaceStorage/-63ce429/chatEditingSessions/a91fca11-9919-49b2-9aab-55a4263a881f/contents +./code-server-config/data/User/workspaceStorage/-63ce429/chatSessions +./code-server-config/data/User/workspaceStorage/64cc123a +./code-server-config/data/User/workspaceStorage/64cc123a/chatEditingSessions +./code-server-config/data/User/workspaceStorage/64cc123a/chatEditingSessions/ff708a20-4b56-4c2d-8af1-bf0a107df673 +./code-server-config/data/User/workspaceStorage/64cc123a/chatEditingSessions/ff708a20-4b56-4c2d-8af1-bf0a107df673/contents +./code-server-config/data/User/workspaceStorage/64cc123a/chatSessions +./code-server-config/data/User/workspaceStorage/-54297bf2 +./code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions +./code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/db5da8e2-e0b3-43bd-a73f-59c06d1367d1 +./code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/db5da8e2-e0b3-43bd-a73f-59c06d1367d1/contents +./code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/d21d60af-afdf-4015-ac22-8468113828ba +./code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/d21d60af-afdf-4015-ac22-8468113828ba/contents +./code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/98c877cb-9c52-4901-988e-890d63101faf +./code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/98c877cb-9c52-4901-988e-890d63101faf/contents +./code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/508a716e-f283-436b-b9c7-f68336e877d2 +./code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/508a716e-f283-436b-b9c7-f68336e877d2/contents +./code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/2fe3f8f1-90c9-4db0-8659-7ddaaa21ab7c +./code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/2fe3f8f1-90c9-4db0-8659-7ddaaa21ab7c/contents +./code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/df31879f-7816-4000-922a-1ae16dfa748e +./code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/df31879f-7816-4000-922a-1ae16dfa748e/contents +./code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/daa34a05-12c3-4f1d-b7c1-6dbcf59e3426 +./code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/daa34a05-12c3-4f1d-b7c1-6dbcf59e3426/contents +./code-server-config/data/User/workspaceStorage/-54297bf2/chatSessions +./code-server-config/data/User/workspaceStorage/787b6db1 +./code-server-config/data/User/workspaceStorage/787b6db1/chatEditingSessions +./code-server-config/data/User/workspaceStorage/787b6db1/chatEditingSessions/d5306add-574b-4ca9-80a2-e738a2954019 +./code-server-config/data/User/workspaceStorage/787b6db1/chatEditingSessions/d5306add-574b-4ca9-80a2-e738a2954019/contents +./code-server-config/data/User/workspaceStorage/787b6db1/chatSessions +./code-server-config/data/User/workspaceStorage/787b6db1-1 +./code-server-config/data/CachedProfilesData +./code-server-config/data/CachedProfilesData/__default__profile__ +./code-server-config/data/logs +./code-server-config/data/logs/20260120T003918 +./code-server-config/data/logs/20260120T003918/exthost1 +./code-server-config/data/logs/20260120T003918/exthost1/vscode.git +./code-server-config/data/logs/20260120T003918/exthost1/vscode.github +./code-server-config/data/logs/20260120T003918/exthost1/vscode.github-authentication +./code-server-config/data/logs/20260120T003918/exthost2 +./code-server-config/data/logs/20260120T003918/exthost2/vscode.git +./code-server-config/data/logs/20260120T003918/exthost2/vscode.github +./code-server-config/data/logs/20260120T003918/exthost2/vscode.github-authentication +./code-server-config/data/logs/20260120T172343 +./code-server-config/data/logs/20260120T172343/exthost1 +./code-server-config/data/logs/20260120T172343/exthost1/vscode.git +./code-server-config/data/logs/20260120T172343/exthost1/vscode.github +./code-server-config/data/logs/20260120T172343/exthost1/vscode.github-authentication +./code-server-config/data/logs/20260120T004510 +./code-server-config/data/logs/20260120T004510/exthost3 +./code-server-config/data/logs/20260120T004510/exthost3/vscode.git +./code-server-config/data/logs/20260120T004510/exthost3/vscode.github +./code-server-config/data/logs/20260120T004510/exthost3/vscode.github-authentication +./code-server-config/data/logs/20260120T004510/exthost1 +./code-server-config/data/logs/20260120T004510/exthost1/vscode.git +./code-server-config/data/logs/20260120T004510/exthost1/vscode.github +./code-server-config/data/logs/20260120T004510/exthost1/vscode.github-authentication +./code-server-config/data/logs/20260120T004510/exthost4 +./code-server-config/data/logs/20260120T004510/exthost4/vscode.git +./code-server-config/data/logs/20260120T004510/exthost4/vscode.github +./code-server-config/data/logs/20260120T004510/exthost4/vscode.github-authentication +./code-server-config/data/logs/20260120T004510/exthost2 +./code-server-config/data/logs/20260120T004510/exthost2/vscode.git +./code-server-config/data/logs/20260120T004510/exthost2/vscode.github +./code-server-config/data/logs/20260120T004510/exthost2/vscode.github-authentication +./code-server-config/data/logs/20260120T175427 +./code-server-config/data/logs/20260120T175427/exthost5 +./code-server-config/data/logs/20260120T175427/exthost5/vscode.git +./code-server-config/data/logs/20260120T175427/exthost5/vscode.github +./code-server-config/data/logs/20260120T175427/exthost5/vscode.github-authentication +./code-server-config/data/logs/20260120T175427/exthost3 +./code-server-config/data/logs/20260120T175427/exthost3/vscode.git +./code-server-config/data/logs/20260120T175427/exthost3/vscode.github +./code-server-config/data/logs/20260120T175427/exthost3/vscode.github-authentication +./code-server-config/data/logs/20260120T175427/exthost7 +./code-server-config/data/logs/20260120T175427/exthost7/vscode.git +./code-server-config/data/logs/20260120T175427/exthost7/vscode.github +./code-server-config/data/logs/20260120T175427/exthost7/vscode.github-authentication +./code-server-config/data/logs/20260120T175427/exthost6 +./code-server-config/data/logs/20260120T175427/exthost6/vscode.git +./code-server-config/data/logs/20260120T175427/exthost6/vscode.github +./code-server-config/data/logs/20260120T175427/exthost6/vscode.github-authentication +./code-server-config/data/logs/20260120T175427/exthost1 +./code-server-config/data/logs/20260120T175427/exthost1/vscode.git +./code-server-config/data/logs/20260120T175427/exthost1/vscode.github +./code-server-config/data/logs/20260120T175427/exthost1/vscode.github-authentication +./code-server-config/data/logs/20260120T175427/exthost4 +./code-server-config/data/logs/20260120T175427/exthost4/vscode.json-language-features +./code-server-config/data/logs/20260120T175427/exthost4/vscode.git +./code-server-config/data/logs/20260120T175427/exthost4/vscode.github +./code-server-config/data/logs/20260120T175427/exthost4/vscode.html-language-features +./code-server-config/data/logs/20260120T175427/exthost4/vscode.github-authentication +./code-server-config/data/logs/20260120T175427/exthost2 +./code-server-config/data/logs/20260120T175427/exthost2/vscode.git +./code-server-config/data/logs/20260120T175427/exthost2/vscode.github +./code-server-config/data/logs/20260120T175427/exthost2/vscode.html-language-features +./code-server-config/data/logs/20260120T175427/exthost2/vscode.github-authentication +./code-server-config/.cache +./code-server-config/.cache/pip +./code-server-config/.cache/pip/http-v2 +./code-server-config/.cache/pip/http-v2/3 +./code-server-config/.cache/pip/http-v2/3/0 +./code-server-config/.cache/pip/http-v2/3/0/e +./code-server-config/.cache/pip/http-v2/3/0/e/f +./code-server-config/.cache/pip/http-v2/3/0/e/f/1 +./code-server-config/.cache/pip/http-v2/3/d +./code-server-config/.cache/pip/http-v2/3/d/b +./code-server-config/.cache/pip/http-v2/3/d/b/a +./code-server-config/.cache/pip/http-v2/3/d/b/a/4 +./code-server-config/.cache/pip/http-v2/a +./code-server-config/.cache/pip/http-v2/a/e +./code-server-config/.cache/pip/http-v2/a/e/5 +./code-server-config/.cache/pip/http-v2/a/e/5/f +./code-server-config/.cache/pip/http-v2/a/e/5/f/a +./code-server-config/.cache/pip/http-v2/a/0 +./code-server-config/.cache/pip/http-v2/a/0/3 +./code-server-config/.cache/pip/http-v2/a/0/3/e +./code-server-config/.cache/pip/http-v2/a/0/3/e/7 +./code-server-config/.cache/pip/http-v2/a/b +./code-server-config/.cache/pip/http-v2/a/b/0 +./code-server-config/.cache/pip/http-v2/a/b/0/c +./code-server-config/.cache/pip/http-v2/a/b/0/c/9 +./code-server-config/.cache/pip/http-v2/a/b/d +./code-server-config/.cache/pip/http-v2/a/b/d/d +./code-server-config/.cache/pip/http-v2/a/b/d/d/d +./code-server-config/.cache/pip/http-v2/2 +./code-server-config/.cache/pip/http-v2/2/c +./code-server-config/.cache/pip/http-v2/2/c/5 +./code-server-config/.cache/pip/http-v2/2/c/5/0 +./code-server-config/.cache/pip/http-v2/2/c/5/0/9 +./code-server-config/.cache/pip/http-v2/2/8 +./code-server-config/.cache/pip/http-v2/2/8/8 +./code-server-config/.cache/pip/http-v2/2/8/8/5 +./code-server-config/.cache/pip/http-v2/2/8/8/5/1 +./code-server-config/.cache/pip/http-v2/7 +./code-server-config/.cache/pip/http-v2/7/5 +./code-server-config/.cache/pip/http-v2/7/5/2 +./code-server-config/.cache/pip/http-v2/7/5/2/4 +./code-server-config/.cache/pip/http-v2/7/5/2/4/8 +./code-server-config/.cache/pip/http-v2/7/b +./code-server-config/.cache/pip/http-v2/7/b/f +./code-server-config/.cache/pip/http-v2/7/b/f/d +./code-server-config/.cache/pip/http-v2/7/b/f/d/a +./code-server-config/.cache/pip/http-v2/6 +./code-server-config/.cache/pip/http-v2/6/8 +./code-server-config/.cache/pip/http-v2/6/8/0 +./code-server-config/.cache/pip/http-v2/6/8/0/d +./code-server-config/.cache/pip/http-v2/6/8/0/d/4 +./code-server-config/.cache/pip/http-v2/6/f +./code-server-config/.cache/pip/http-v2/6/f/7 +./code-server-config/.cache/pip/http-v2/6/f/7/1 +./code-server-config/.cache/pip/http-v2/6/f/7/1/9 +./code-server-config/.cache/pip/http-v2/6/d +./code-server-config/.cache/pip/http-v2/6/d/d +./code-server-config/.cache/pip/http-v2/6/d/d/7 +./code-server-config/.cache/pip/http-v2/6/d/d/7/f +./code-server-config/.cache/pip/http-v2/5 +./code-server-config/.cache/pip/http-v2/5/5 +./code-server-config/.cache/pip/http-v2/5/5/2 +./code-server-config/.cache/pip/http-v2/5/5/2/5 +./code-server-config/.cache/pip/http-v2/5/5/2/5/6 +./code-server-config/.cache/pip/http-v2/9 +./code-server-config/.cache/pip/http-v2/9/3 +./code-server-config/.cache/pip/http-v2/9/3/6 +./code-server-config/.cache/pip/http-v2/9/3/6/e +./code-server-config/.cache/pip/http-v2/9/3/6/e/f +./code-server-config/.cache/pip/http-v2/9/1 +./code-server-config/.cache/pip/http-v2/9/1/a +./code-server-config/.cache/pip/http-v2/9/1/a/c +./code-server-config/.cache/pip/http-v2/9/1/a/c/4 +./code-server-config/.cache/pip/http-v2/9/1/1 +./code-server-config/.cache/pip/http-v2/9/1/1/8 +./code-server-config/.cache/pip/http-v2/9/1/1/8/d +./code-server-config/.cache/pip/http-v2/e +./code-server-config/.cache/pip/http-v2/e/2 +./code-server-config/.cache/pip/http-v2/e/2/0 +./code-server-config/.cache/pip/http-v2/e/2/0/7 +./code-server-config/.cache/pip/http-v2/e/2/0/7/4 +./code-server-config/.cache/pip/http-v2/e/0 +./code-server-config/.cache/pip/http-v2/e/0/b +./code-server-config/.cache/pip/http-v2/e/0/b/4 +./code-server-config/.cache/pip/http-v2/e/0/b/4/f +./code-server-config/.cache/pip/http-v2/8 +./code-server-config/.cache/pip/http-v2/8/e +./code-server-config/.cache/pip/http-v2/8/e/c +./code-server-config/.cache/pip/http-v2/8/e/c/f +./code-server-config/.cache/pip/http-v2/8/e/c/f/f +./code-server-config/.cache/pip/http-v2/8/8 +./code-server-config/.cache/pip/http-v2/8/8/f +./code-server-config/.cache/pip/http-v2/8/8/f/7 +./code-server-config/.cache/pip/http-v2/8/8/f/7/d +./code-server-config/.cache/pip/http-v2/8/0 +./code-server-config/.cache/pip/http-v2/8/0/e +./code-server-config/.cache/pip/http-v2/8/0/e/9 +./code-server-config/.cache/pip/http-v2/8/0/e/9/4 +./code-server-config/.cache/pip/http-v2/8/f +./code-server-config/.cache/pip/http-v2/8/f/0 +./code-server-config/.cache/pip/http-v2/8/f/0/a +./code-server-config/.cache/pip/http-v2/8/f/0/a/d +./code-server-config/.cache/pip/http-v2/8/b +./code-server-config/.cache/pip/http-v2/8/b/2 +./code-server-config/.cache/pip/http-v2/8/b/2/4 +./code-server-config/.cache/pip/http-v2/8/b/2/4/2 +./code-server-config/.cache/pip/http-v2/0 +./code-server-config/.cache/pip/http-v2/0/a +./code-server-config/.cache/pip/http-v2/0/a/e +./code-server-config/.cache/pip/http-v2/0/a/e/8 +./code-server-config/.cache/pip/http-v2/0/a/e/8/4 +./code-server-config/.cache/pip/http-v2/0/5 +./code-server-config/.cache/pip/http-v2/0/5/a +./code-server-config/.cache/pip/http-v2/0/5/a/7 +./code-server-config/.cache/pip/http-v2/0/5/a/7/4 +./code-server-config/.cache/pip/http-v2/0/4 +./code-server-config/.cache/pip/http-v2/0/4/8 +./code-server-config/.cache/pip/http-v2/0/4/8/4 +./code-server-config/.cache/pip/http-v2/0/4/8/4/7 +./code-server-config/.cache/pip/http-v2/f +./code-server-config/.cache/pip/http-v2/f/0 +./code-server-config/.cache/pip/http-v2/f/0/e +./code-server-config/.cache/pip/http-v2/f/0/e/2 +./code-server-config/.cache/pip/http-v2/f/0/e/2/8 +./code-server-config/.cache/pip/http-v2/b +./code-server-config/.cache/pip/http-v2/b/8 +./code-server-config/.cache/pip/http-v2/b/8/0 +./code-server-config/.cache/pip/http-v2/b/8/0/2 +./code-server-config/.cache/pip/http-v2/b/8/0/2/b +./code-server-config/.cache/pip/http-v2/d +./code-server-config/.cache/pip/http-v2/d/6 +./code-server-config/.cache/pip/http-v2/d/6/b +./code-server-config/.cache/pip/http-v2/d/6/b/5 +./code-server-config/.cache/pip/http-v2/d/6/b/5/a +./code-server-config/.cache/pip/http-v2/d/e +./code-server-config/.cache/pip/http-v2/d/e/e +./code-server-config/.cache/pip/http-v2/d/e/e/3 +./code-server-config/.cache/pip/http-v2/d/e/e/3/2 +./code-server-config/.cache/pip/http-v2/d/b +./code-server-config/.cache/pip/http-v2/d/b/9 +./code-server-config/.cache/pip/http-v2/d/b/9/a +./code-server-config/.cache/pip/http-v2/d/b/9/a/3 +./code-server-config/.cache/pip/http-v2/d/b/4 +./code-server-config/.cache/pip/http-v2/d/b/4/f +./code-server-config/.cache/pip/http-v2/d/b/4/f/1 +./code-server-config/.cache/pip/http-v2/1 +./code-server-config/.cache/pip/http-v2/1/2 +./code-server-config/.cache/pip/http-v2/1/2/9 +./code-server-config/.cache/pip/http-v2/1/2/9/c +./code-server-config/.cache/pip/http-v2/1/2/9/c/8 +./code-server-config/.cache/pip/http-v2/1/c +./code-server-config/.cache/pip/http-v2/1/c/b +./code-server-config/.cache/pip/http-v2/1/c/b/6 +./code-server-config/.cache/pip/http-v2/1/c/b/6/2 +./code-server-config/.cache/pip/http-v2/1/6 +./code-server-config/.cache/pip/http-v2/1/6/0 +./code-server-config/.cache/pip/http-v2/1/6/0/d +./code-server-config/.cache/pip/http-v2/1/6/0/d/3 +./code-server-config/.cache/pip/http-v2/1/9 +./code-server-config/.cache/pip/http-v2/1/9/9 +./code-server-config/.cache/pip/http-v2/1/9/9/d +./code-server-config/.cache/pip/http-v2/1/9/9/d/1 +./code-server-config/.cache/pip/http-v2/1/4 +./code-server-config/.cache/pip/http-v2/1/4/a +./code-server-config/.cache/pip/http-v2/1/4/a/a +./code-server-config/.cache/pip/http-v2/1/4/a/a/f +./code-server-config/.cache/pip/http-v2/4 +./code-server-config/.cache/pip/http-v2/4/b +./code-server-config/.cache/pip/http-v2/4/b/e +./code-server-config/.cache/pip/http-v2/4/b/e/0 +./code-server-config/.cache/pip/http-v2/4/b/e/0/7 +./code-server-config/.cache/Microsoft +./code-server-config/.cache/Microsoft/DeveloperTools +./code-server-config/workspace diff --git a/archive/2026.02.18 Archive_old_mapps/Old_versions/projekt_terkep.txt b/archive/2026.02.18 Archive_old_mapps/Old_versions/projekt_terkep.txt new file mode 100755 index 0000000..ca26d88 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/Old_versions/projekt_terkep.txt @@ -0,0 +1,662 @@ +. +./docker-compose.yml +./postgres +./postgres/init-db.sql +./postgres/data +./postgres/data/pg_commit_ts +./postgres/data/pg_logical +./postgres/data/pg_logical/snapshots +./postgres/data/pg_logical/mappings +./postgres/data/pg_logical/replorigin_checkpoint +./postgres/data/base +./postgres/data/base/16384 +./postgres/data/base/5 +./postgres/data/base/16537 +./postgres/data/base/1 +./postgres/data/base/4 +./postgres/data/pg_hba.conf +./postgres/data/pg_dynshmem +./postgres/data/pg_xact +./postgres/data/pg_xact/0000 +./postgres/data/postgresql.auto.conf +./postgres/data/pg_stat +./postgres/data/PG_VERSION +./postgres/data/pg_stat_tmp +./postgres/data/pg_subtrans +./postgres/data/pg_subtrans/0000 +./postgres/data/pg_ident.conf +./postgres/data/pg_snapshots +./postgres/data/global +./postgres/data/global/1232 +./postgres/data/global/pg_filenode.map +./postgres/data/global/6001 +./postgres/data/global/1260_vm +./postgres/data/global/2677 +./postgres/data/global/2847 +./postgres/data/global/1262 +./postgres/data/global/3592 +./postgres/data/global/4177 +./postgres/data/global/3593 +./postgres/data/global/4185 +./postgres/data/global/2676 +./postgres/data/global/2396 +./postgres/data/global/1261_vm +./postgres/data/global/2671 +./postgres/data/global/6243 +./postgres/data/global/pg_internal.init +./postgres/data/global/2964 +./postgres/data/global/4182 +./postgres/data/global/1260_fsm +./postgres/data/global/4181 +./postgres/data/global/4178 +./postgres/data/global/1213_fsm +./postgres/data/global/4175 +./postgres/data/global/1261 +./postgres/data/global/2695 +./postgres/data/global/1233 +./postgres/data/global/4186 +./postgres/data/global/4183 +./postgres/data/global/2396_fsm +./postgres/data/global/4061 +./postgres/data/global/2694 +./postgres/data/global/6000 +./postgres/data/global/4184 +./postgres/data/global/1260 +./postgres/data/global/pg_control +./postgres/data/global/2967 +./postgres/data/global/6100 +./postgres/data/global/1262_vm +./postgres/data/global/2397 +./postgres/data/global/6244 +./postgres/data/global/6246 +./postgres/data/global/6002 +./postgres/data/global/1262_fsm +./postgres/data/global/4176 +./postgres/data/global/6114 +./postgres/data/global/6245 +./postgres/data/global/2672 +./postgres/data/global/1214_fsm +./postgres/data/global/1261_fsm +./postgres/data/global/4060 +./postgres/data/global/2966 +./postgres/data/global/6247 +./postgres/data/global/2846 +./postgres/data/global/1213_vm +./postgres/data/global/6302 +./postgres/data/global/6115 +./postgres/data/global/2396_vm +./postgres/data/global/2698 +./postgres/data/global/2697 +./postgres/data/global/2965 +./postgres/data/global/1214 +./postgres/data/global/6303 +./postgres/data/global/1213 +./postgres/data/pg_serial +./postgres/data/pg_replslot +./postgres/data/pg_tblspc +./postgres/data/pg_multixact +./postgres/data/pg_multixact/members +./postgres/data/pg_multixact/offsets +./postgres/data/pg_twophase +./postgres/data/pg_notify +./postgres/data/postgresql.conf +./postgres/data/pg_wal +./postgres/data/pg_wal/summaries +./postgres/data/pg_wal/archive_status +./postgres/data/pg_wal/000000010000000000000002 +./postgres/data/pg_wal/000000010000000000000003 +./postgres/data/postmaster.opts +./postgres/data/postmaster.pid +./docker-compose_2.yml +./migrations +./migrations/script.py.mako +./migrations/env.py +./migrations/README +./migrations/versions +./migrations/versions/8d450e9dc77f_add_vehicle_staging.py +./migrations/versions/553ef1388276_rebuild_schema_v2.py +./migrations/versions/c21c2c7e70d4_clean_gamification_setup.py +./Projekt Állapot jelentés.txt +./redis +./redis/data +./redis/data/appendonlydir +./redis/data/appendonlydir/appendonly.aof.1.incr.aof +./redis/data/appendonlydir/appendonly.aof.manifest +./redis/data/appendonlydir/appendonly.aof.1.base.rdb +./redis/data/dump.rdb +./Service_finder Rendszerspecifikáció es feljesztes.txt +./Promptok gemekhez.txt +./pgadmin_data +./pgadmin_data/sessions +./pgadmin_data/sessions/f77af245-3aa1-4f88-a566-3be55403448f +./pgadmin_data/sessions/239aceee-a89e-434c-980e-19e2421de51f +./pgadmin_data/sessions/643b0d62-38a1-4a32-b48b-f7e053e7214f +./pgadmin_data/sessions/c38b97cd-80d7-40e1-8ab7-b9a650b38d59 +./pgadmin_data/sessions/1e451e39-aae8-4a80-9e06-e600209173eb +./pgadmin_data/sessions/cda27660-0b33-4cfa-9a6f-6b61152e20ca +./pgadmin_data/sessions/39c9dfe9-7b34-43f8-91b3-6fa3f6d266b3 +./pgadmin_data/sessions/6f69a6f6-75b8-4460-a933-45e989a1745b +./pgadmin_data/sessions/a581e329-7bfb-4698-838d-73cfacdc8490 +./pgadmin_data/sessions/d0fbabe6-ad5f-4e80-b95c-ddce91f12be3 +./pgadmin_data/sessions/8bcb89fe-0895-4cfd-9520-bb8395741163 +./pgadmin_data/sessions/a7b4bf94-c3e4-4d6b-9bfb-1838af5757b2 +./pgadmin_data/sessions/4ab9a4ed-3382-45b3-bc68-b03198aa8351 +./pgadmin_data/sessions/d88c19a7-77d9-4beb-ab76-a84a9f37157d +./pgadmin_data/sessions/75f2578e-af2c-4aee-9d2d-cc8636ed51be +./pgadmin_data/sessions/8288a605-5063-4e3c-b91d-7d90956fc36a +./pgadmin_data/sessions/e409093c-23c6-4281-bd8e-5ae1dd8fd244 +./pgadmin_data/sessions/21bf4030-2f8b-4d39-9ea5-4b9091443cb8 +./pgadmin_data/sessions/80adb826-82c5-4473-84a3-b69b59a5c694 +./pgadmin_data/sessions/5493e7a3-35c7-48ae-89af-246e7f0b1198 +./pgadmin_data/sessions/cb6a3940-36e0-406e-8072-3ce847b85eab +./pgadmin_data/sessions/7a61650b-174f-4eee-a30d-8e8e2b9bf42a +./pgadmin_data/sessions/4212d725-cfca-4edb-b3d4-65872c5b4483 +./pgadmin_data/sessions/cd78b8b9-bb98-4343-9ec3-9e4663e0965c +./pgadmin_data/sessions/8f58c8db-3320-4ff4-83c9-529ceeb47320 +./pgadmin_data/sessions/fbabc57a-b2d4-4c85-9cbd-fa70f2a374e7 +./pgadmin_data/sessions/49b63a43-ac7f-4a1e-a2f5-eb69c394ffe9 +./pgadmin_data/sessions/e87026e5-efa4-4618-9c56-e11cef97b2bb +./pgadmin_data/sessions/aebf219d-1063-4ee8-a00e-8c669ca8c649 +./pgadmin_data/sessions/6ea13bd9-7894-44b0-8db2-1cd0d67772ac +./pgadmin_data/sessions/d9d24318-63af-48ad-9a5f-e463377d72b3 +./pgadmin_data/sessions/a7c55d8e-62d1-47e5-8507-29c228d9c9b1 +./pgadmin_data/sessions/981d317b-8dec-40b0-a16f-d8d64b36a8ff +./pgadmin_data/sessions/62906837-2ecb-468a-8fef-5fd1374773a9 +./pgadmin_data/sessions/3aeb0610-d402-481d-83b7-cc6282b7fe40 +./pgadmin_data/sessions/6d07e92a-9824-4cc3-837a-9ea25e789ca9 +./pgadmin_data/sessions/c0936831-8a62-4156-884e-7e72173571d7 +./pgadmin_data/sessions/13e7ff42-4934-4a5e-b5a3-f677f6429cc1 +./pgadmin_data/sessions/96f17aad-5695-40c9-b467-154246f14580 +./pgadmin_data/sessions/9685519b-269d-4e56-a595-6cfa40c572a0 +./pgadmin_data/sessions/0d358dcb-bbfb-43ca-ab93-be47f5ed25f1 +./pgadmin_data/sessions/8b017d63-49c6-4c72-bd4c-1f1121c48229 +./pgadmin_data/sessions/0c5d8f55-57c2-4d9b-a740-71c3eb24bced +./pgadmin_data/sessions/9a707a69-cbea-4d2a-aee2-ed186b0bd192 +./pgadmin_data/sessions/2c0c4448-d3e4-4c90-9af6-33a0c0bf0ef1 +./pgadmin_data/sessions/179ac2a4-8dc3-4db0-9208-ff985d0c88e0 +./pgadmin_data/sessions/c73fe338-3ab0-46b7-81fa-276fc8acaa88 +./pgadmin_data/sessions/15c03d02-36ed-47f1-a77c-2f4af9e68504 +./pgadmin_data/sessions/215e7cd3-169f-4b75-8cd6-0081734aa571 +./pgadmin_data/sessions/7c847da4-61d0-4056-8e32-906919e72acf +./pgadmin_data/sessions/c78fd088-66d3-4854-9093-b5f91eed7f87 +./pgadmin_data/sessions/62d142cc-ab15-4f3f-8411-b668bd926f4f +./pgadmin_data/sessions/ec291f35-5e20-4f9a-af16-e44624d57074 +./pgadmin_data/sessions/f86f30a7-2680-4a43-bb3f-d1d5dc04131f +./pgadmin_data/sessions/4256aa82-0066-4a50-a4d9-2a0673705554 +./pgadmin_data/sessions/f8390327-d516-45b0-9df7-fb84ab84b11d +./pgadmin_data/sessions/6be9f86e-c004-466e-af2e-9046b971b9fc +./pgadmin_data/sessions/d983dfc1-ed31-4b49-8a99-85787b3b8851 +./pgadmin_data/sessions/b87ca5ef-affd-4ac9-b9a3-640c274e05bf +./pgadmin_data/sessions/dfb0274f-c907-47ef-92ec-267f72853f21 +./pgadmin_data/sessions/6afc4e86-4d72-45d7-9efb-59984ee613f9 +./pgadmin_data/sessions/8259d216-9011-4518-9e07-47f62b09c8c2 +./pgadmin_data/sessions/3d86d01a-9519-4111-8bd7-1bfe6ae30541 +./pgadmin_data/sessions/10fdc4de-ff73-4b15-bd76-5f963b52ad5a +./pgadmin_data/sessions/47ff632a-5d39-43f1-977b-4acfa2911536 +./pgadmin_data/sessions/a4f6dc64-606d-4cc7-a7c9-b53552e03155 +./pgadmin_data/sessions/ffa5e983-2527-46c6-8be3-9ed04485a6ce +./pgadmin_data/sessions/251262f2-ff86-407a-b565-afc083e8f815 +./pgadmin_data/sessions/85541a74-441c-4c41-a1e8-2d4748704ba4 +./pgadmin_data/sessions/769ea067-659f-47a7-916f-422945f31749 +./pgadmin_data/sessions/8b50c5b9-f372-4722-946a-5b98d8f6204b +./pgadmin_data/sessions/03fd18e1-b040-4d4a-b1eb-01f30054b114 +./pgadmin_data/sessions/5697ad9e-3978-495b-b45d-bd8171697395 +./pgadmin_data/sessions/6e772ba6-65b4-4501-84ea-ebcafa24cd85 +./pgadmin_data/sessions/8176c2c0-467d-4b27-a17a-52c204cd9773 +./pgadmin_data/sessions/d98a8f90-8f2e-41e4-8305-16d3dd79d54a +./pgadmin_data/sessions/8ff1ea1c-d1b9-46f8-8a16-40bcac83f250 +./pgadmin_data/storage +./pgadmin_data/storage/kincses_gmail.com +./pgadmin_data/pgadmin4.db +./pgadmin_data/azurecredentialcache +./docker-compose_2026.01.23_1.yml +./backend +./backend/migrations +./backend/migrations/script.py.mako +./backend/migrations/env.py +./backend/migrations/README +./backend/migrations/versions +./backend/migrations/versions/c21c2c7e70d4_clean_gamification_setup.py +./backend/app +./backend/app/models +./backend/app/models/user.py +./backend/app/models/translation.py +./backend/app/models/vehicle.py +./backend/app/models/vehicle_catalog.py +./backend/app/models/expense.py +./backend/app/models/company.py +./backend/app/models/logistics.py +./backend/app/models/system_settings.py +./backend/app/models/__init__.py +./backend/app/models/staged_data.py +./backend/app/models/history.py +./backend/app/models/social.py +./backend/app/models/gamification.py +./backend/app/core +./backend/app/core/config.py +./backend/app/core/email.py +./backend/app/core/security.py +./backend/app/core/__init__.py +./backend/app/seed_catalog.py +./backend/app/auth +./backend/app/auth/router.py +./backend/app/schemas +./backend/app/schemas/user.py +./backend/app/schemas/auth.py +./backend/app/schemas/token.py +./backend/app/schemas/admin.py +./backend/app/schemas/fleet.py +./backend/app/schemas/social.py +./backend/app/old_main.py +./backend/app/api +./backend/app/api/recommend.py +./backend/app/api/auth.py +./backend/app/api/deps.py +./backend/app/api/v1 +./backend/app/services +./backend/app/services/notification_service.py +./backend/app/services/fleet_service.py +./backend/app/services/maintenance_service.py +./backend/app/services/social_service.py +./backend/app/services/translation_service.py +./backend/app/services/gamification_service.py +./backend/app/test_gamification_flow.py +./backend/app/db +./backend/app/db/context.py +./backend/app/db/session.py +./backend/app/db/base.py +./backend/app/db/middleware.py +./backend/app/db/__init__.py +./backend/app/main.py +./backend/app/__init__.py +./backend/app/seed_system.py +./backend/app/database.py +./backend/app/seed_data.py +./backend/scrapers +./backend/scrapers/vehicle_master_data.py +./backend/requirements.txt +./backend/_legacy_backup +./backend/_legacy_backup/migrate_ref_data.py +./backend/_legacy_backup/check_garage.py +./backend/_legacy_backup/main_final.py +./backend/_legacy_backup/teszt.txt +./backend/_legacy_backup/docker-compose.backend.yml +./backend/_legacy_backup/update_permissions.py +./backend/_legacy_backup/update_cost_categories.py +./backend/_legacy_backup/inspect_db.py +./backend/_legacy_backup/update_invitations.py +./backend/_legacy_backup/build_complex_db.py +./backend/_legacy_backup/update_db_i18n.py +./backend/_legacy_backup/update_audit_system.py +./backend/_legacy_backup/create_demo_user.py +./backend/_legacy_backup/init_db.py +./backend/_legacy_backup/main.py +./backend/_legacy_backup/main_fixed.py +./backend/_legacy_backup/update_docs.py +./backend/_legacy_backup/create_dummy_employee.py +./backend/_legacy_backup/inspect_db_full.py +./backend/_legacy_backup/main_2.py +./backend/Dockerfile +./backend/frontend +./backend/alembic.ini +./projekt_terkep.txt +./backup_to_nas.sh +./proxy-manager +./proxy-manager/letsencrypt +./proxy-manager/letsencrypt/archive +./proxy-manager/letsencrypt/archive/npm-13 +./proxy-manager/letsencrypt/archive/npm-16 +./proxy-manager/letsencrypt/archive/npm-5 +./proxy-manager/letsencrypt/archive/npm-15 +./proxy-manager/letsencrypt/archive/npm-11 +./proxy-manager/letsencrypt/archive/npm-14 +./proxy-manager/letsencrypt/archive/npm-4 +./proxy-manager/letsencrypt/renewal-hooks +./proxy-manager/letsencrypt/renewal-hooks/pre +./proxy-manager/letsencrypt/renewal-hooks/deploy +./proxy-manager/letsencrypt/renewal-hooks/post +./proxy-manager/letsencrypt/renewal +./proxy-manager/letsencrypt/renewal/npm-16.conf +./proxy-manager/letsencrypt/renewal/npm-5.conf +./proxy-manager/letsencrypt/renewal/npm-13.conf +./proxy-manager/letsencrypt/renewal/npm-4.conf +./proxy-manager/letsencrypt/renewal/npm-15.conf +./proxy-manager/letsencrypt/renewal/npm-14.conf +./proxy-manager/letsencrypt/renewal/npm-11.conf +./proxy-manager/letsencrypt/live +./proxy-manager/letsencrypt/live/npm-13 +./proxy-manager/letsencrypt/live/npm-16 +./proxy-manager/letsencrypt/live/npm-5 +./proxy-manager/letsencrypt/live/npm-15 +./proxy-manager/letsencrypt/live/npm-11 +./proxy-manager/letsencrypt/live/npm-14 +./proxy-manager/letsencrypt/live/README +./proxy-manager/letsencrypt/live/npm-4 +./proxy-manager/letsencrypt/accounts +./proxy-manager/letsencrypt/accounts/acme-v02.api.letsencrypt.org +./proxy-manager/data +./proxy-manager/data/nginx +./proxy-manager/data/nginx/dead_host +./proxy-manager/data/nginx/proxy_host +./proxy-manager/data/nginx/default_www +./proxy-manager/data/nginx/default_host +./proxy-manager/data/nginx/redirection_host +./proxy-manager/data/nginx/stream +./proxy-manager/data/nginx/temp +./proxy-manager/data/keys.json +./proxy-manager/data/letsencrypt-acme-challenge +./proxy-manager/data/database.sqlite +./proxy-manager/data/access +./proxy-manager/data/custom_ssl +./proxy-manager/data/logs +./proxy-manager/data/logs/fallback_access.log.1.gz +./proxy-manager/data/logs/letsencrypt.log.8 +./proxy-manager/data/logs/proxy-host-8_access.log +./proxy-manager/data/logs/fallback_error.log.2.gz +./proxy-manager/data/logs/letsencrypt.log.6 +./proxy-manager/data/logs/fallback_access.log.3.gz +./proxy-manager/data/logs/proxy-host-3_access.log.3.gz +./proxy-manager/data/logs/letsencrypt.log.15 +./proxy-manager/data/logs/proxy-host-1_access.log +./proxy-manager/data/logs/letsencrypt-requests_access.log.1.gz +./proxy-manager/data/logs/proxy-host-2_access.log.1.gz +./proxy-manager/data/logs/letsencrypt.log.9 +./proxy-manager/data/logs/proxy-host-2_error.log.1.gz +./proxy-manager/data/logs/letsencrypt.log.4 +./proxy-manager/data/logs/letsencrypt.log.10 +./proxy-manager/data/logs/fallback_error.log.1.gz +./proxy-manager/data/logs/proxy-host-1_error.log.2.gz +./proxy-manager/data/logs/proxy-host-7_access.log +./proxy-manager/data/logs/proxy-host-2_error.log.2.gz +./proxy-manager/data/logs/letsencrypt-requests_error.log +./proxy-manager/data/logs/letsencrypt.log.13 +./proxy-manager/data/logs/proxy-host-9_access.log +./proxy-manager/data/logs/proxy-host-2_error.log.3.gz +./proxy-manager/data/logs/proxy-host-6_access.log +./proxy-manager/data/logs/proxy-host-1_access.log.3.gz +./proxy-manager/data/logs/proxy-host-6_access.log.1.gz +./proxy-manager/data/logs/proxy-host-6_error.log.3.gz +./proxy-manager/data/logs/proxy-host-2_access.log.3.gz +./proxy-manager/data/logs/proxy-host-8_error.log +./proxy-manager/data/logs/proxy-host-6_error.log.1.gz +./proxy-manager/data/logs/letsencrypt.log.16 +./proxy-manager/data/logs/fallback_access.log.2.gz +./proxy-manager/data/logs/proxy-host-6_access.log.3.gz +./proxy-manager/data/logs/proxy-host-6_access.log.2.gz +./proxy-manager/data/logs/letsencrypt.log.2 +./proxy-manager/data/logs/letsencrypt-requests_access.log +./proxy-manager/data/logs/proxy-host-4_access.log +./proxy-manager/data/logs/letsencrypt.log.12 +./proxy-manager/data/logs/proxy-host-5_access.log.1.gz +./proxy-manager/data/logs/letsencrypt.log.7 +./proxy-manager/data/logs/fallback_error.log +./proxy-manager/data/logs/proxy-host-6_error.log.2.gz +./proxy-manager/data/logs/proxy-host-5_access.log.3.gz +./proxy-manager/data/logs/proxy-host-5_error.log.3.gz +./proxy-manager/data/logs/proxy-host-1_error.log.3.gz +./proxy-manager/data/logs/proxy-host-2_access.log.2.gz +./proxy-manager/data/logs/proxy-host-3_access.log.2.gz +./proxy-manager/data/logs/proxy-host-5_error.log.2.gz +./proxy-manager/data/logs/letsencrypt.log.1 +./proxy-manager/data/logs/proxy-host-3_access.log +./proxy-manager/data/logs/letsencrypt.log.3 +./proxy-manager/data/logs/proxy-host-5_access.log.2.gz +./proxy-manager/data/logs/proxy-host-1_error.log +./proxy-manager/data/logs/proxy-host-2_access.log +./proxy-manager/data/logs/fallback_error.log.3.gz +./proxy-manager/data/logs/proxy-host-5_error.log.1.gz +./proxy-manager/data/logs/letsencrypt.log +./proxy-manager/data/logs/letsencrypt.log.14 +./proxy-manager/data/logs/proxy-host-5_access.log +./proxy-manager/data/logs/proxy-host-1_access.log.1.gz +./proxy-manager/data/logs/proxy-host-5_error.log +./proxy-manager/data/logs/proxy-host-9_error.log +./proxy-manager/data/logs/proxy-host-3_error.log.2.gz +./proxy-manager/data/logs/proxy-host-1_error.log.1.gz +./proxy-manager/data/logs/proxy-host-3_error.log.3.gz +./proxy-manager/data/logs/proxy-host-3_error.log.1.gz +./proxy-manager/data/logs/proxy-host-1_access.log.2.gz +./proxy-manager/data/logs/proxy-host-3_access.log.1.gz +./proxy-manager/data/logs/letsencrypt.log.5 +./proxy-manager/data/logs/fallback_access.log +./proxy-manager/data/logs/proxy-host-7_error.log +./proxy-manager/data/logs/proxy-host-4_error.log +./proxy-manager/data/logs/letsencrypt.log.11 +./proxy-manager/data/logs/proxy-host-3_error.log +./proxy-manager/data/logs/proxy-host-2_error.log +./proxy-manager/data/logs/proxy-host-6_error.log +./pgadmin +./pgadmin/data +./pgadmin/data/sessions +./pgadmin/data/sessions/c191ec66-78a1-4afd-955f-e50e8dbbc552 +./pgadmin/data/sessions/f7056bf2-b80f-4239-8c16-3531f8b88782 +./pgadmin/data/sessions/f566ecc0-32dd-45c7-869e-cfb900fd9aa7 +./pgadmin/data/sessions/61fa598a-479d-47dc-aee2-846812e6b40b +./pgadmin/data/sessions/36fa57da-8c82-47e8-8dd0-03c677ff8f6d +./pgadmin/data/sessions/42240d96-abd2-43ed-9e07-7ad0acd4dceb +./pgadmin/data/sessions/cc89aa8b-5867-4b73-90c0-0b15d117cb9f +./pgadmin/data/sessions/4717cbe5-3d95-425b-a873-df76df7af990 +./pgadmin/data/sessions/fc40d886-9fb0-48b2-810e-c77b9afcb6a2 +./pgadmin/data/sessions/190c2cfe-7b96-47e7-a7c7-78740413ec86 +./pgadmin/data/sessions/d1fd1e26-160e-4450-b2b6-dc28ad4273f1 +./pgadmin/data/sessions/a48ac178-5482-4835-87cc-fe0ed838bacf +./pgadmin/data/sessions/64c44127-f39a-4234-8785-9b515b32686f +./pgadmin/data/sessions/82e002e9-c7ef-4eb4-8fad-759b9d5577ca +./pgadmin/data/sessions/ef7f0484-f09d-44c1-b0b7-e56888795442 +./pgadmin/data/sessions/8821dc09-caca-4649-9f18-bc57cf371a06 +./pgadmin/data/sessions/3f887077-3a26-455d-b2ce-6be68ddc71e8 +./pgadmin/data/sessions/6404475f-50aa-42e0-9d35-b0a8f6e8a213 +./pgadmin/data/sessions/5c1020ff-954c-4132-902a-11a3750de23a +./pgadmin/data/sessions/7aa1e6c8-5c23-45ec-8156-972939ae60cf +./pgadmin/data/sessions/2561af04-52e0-422c-9f01-889aa086be13 +./pgadmin/data/sessions/f01d1cd0-5b3c-406d-8b54-f07f9436949e +./pgadmin/data/sessions/c8a2ea39-d07d-4c98-8be2-e3ddee9c5c99 +./pgadmin/data/sessions/ec936261-9676-4ff7-abc9-6af7557b45e5 +./pgadmin/data/sessions/d4434ef9-4105-403c-9245-25ddf5dfb391 +./pgadmin/data/sessions/3d3283e8-fbe4-487e-bc49-458ee1782020 +./pgadmin/data/sessions/fad7550e-eef9-4a4e-9f8b-8d771c7767a4 +./pgadmin/data/sessions/e2eab0f0-867e-4797-9619-7fb4f790b89f +./pgadmin/data/sessions/0f41e22e-b4b4-4776-9895-9fc12054ed71 +./pgadmin/data/sessions/c22428fe-dfc0-4a28-a32f-1f8965430004 +./pgadmin/data/sessions/c8857f63-f821-49b4-bf41-48727c00febd +./pgadmin/data/sessions/6c443079-e5e9-44c3-aa39-9be235ad4865 +./pgadmin/data/sessions/82e99852-9da3-45a8-8491-0c69e66d5be4 +./pgadmin/data/sessions/bf27abfe-c382-4e9d-8acf-9508133c4b15 +./pgadmin/data/sessions/2739c198-da4a-498e-aaaa-9c9ca291bbf1 +./pgadmin/data/sessions/98fdb91c-44cf-4379-a738-6b045733dee0 +./pgadmin/data/sessions/03c1a752-4ec5-430c-a965-aa355531bb1f +./pgadmin/data/sessions/8167652a-79dc-46b9-a3e7-203ac1840f84 +./pgadmin/data/sessions/c6f96af8-86b3-4bd2-9c65-c6b80ee60512 +./pgadmin/data/sessions/f27f3773-bd41-4870-adbc-298c08de6834 +./pgadmin/data/sessions/1960ac31-8625-48ba-aef3-f824a0739b59 +./pgadmin/data/sessions/4cf9b0b1-f129-43e0-82f0-9da65c5d5d00 +./pgadmin/data/sessions/df1c9e4b-c688-43af-8707-a967f124e2be +./pgadmin/data/sessions/a07c1cce-1999-49c3-b1e1-a59436e38522 +./pgadmin/data/sessions/e5b3bdd5-4aef-4366-bd21-9acd13188b78 +./pgadmin/data/sessions/4673f7fb-cab6-4347-8c0e-7a00937c3f16 +./pgadmin/data/sessions/4382c834-4294-45eb-a671-8ab12033f6b7 +./pgadmin/data/sessions/f2ca300d-051d-42b5-b5f9-be649054d293 +./pgadmin/data/sessions/eb5480bb-8183-4aed-8c44-5dba8a9de577 +./pgadmin/data/sessions/a508f434-c945-4db0-8927-e16f0e75813f +./pgadmin/data/sessions/68043fbf-2cff-4131-9807-562123306e7c +./pgadmin/data/sessions/081da418-bd99-4b43-aa84-f6e13a87f057 +./pgadmin/data/sessions/d985efdf-2cda-4d6e-a850-baf41946bdbf +./pgadmin/data/sessions/54349914-b165-48f3-bea8-ab8d224edd39 +./pgadmin/data/sessions/ea4d33f7-a8dd-4288-b9ef-2d1511286491 +./pgadmin/data/sessions/26f505ea-a69a-4e4d-8704-01e379913d52 +./pgadmin/data/sessions/7130585c-6a44-41f4-80fd-6f2c7c702eac +./pgadmin/data/sessions/8d434565-8c8d-4058-94d6-df582902ff67 +./pgadmin/data/sessions/4ed73362-1f27-4e50-a632-c3b6213f627e +./pgadmin/data/sessions/4c3ac76d-b38d-4e89-871e-7446ad86ce3a +./pgadmin/data/sessions/cbee53e3-2930-45b4-ac80-cec62d11365b +./pgadmin/data/sessions/2706ea12-544c-439c-bbfe-2881135fc5c2 +./pgadmin/data/sessions/19bc1463-7c1e-40a9-bd09-7d282590b903 +./pgadmin/data/sessions/4584d603-10f5-4767-920e-59c463d5f00b +./pgadmin/data/sessions/bc386c8c-87ae-4e20-8844-fee3703a0595 +./pgadmin/data/sessions/3e232ae5-0fb7-4107-8fe6-e64af4d0527b +./pgadmin/data/sessions/0ced9fd6-67f5-4e15-892d-f16f29bf2d53 +./pgadmin/data/sessions/45e62654-215d-433f-92ed-21bb664b0a5d +./pgadmin/data/sessions/f8f4cdc0-a960-4971-b380-3a3df159a3f7 +./pgadmin/data/sessions/5da591bf-697b-40b8-b850-5248b3f9948e +./pgadmin/data/sessions/62c7cafb-f9c3-4a0e-b88b-69015f4cdd8a +./pgadmin/data/sessions/76de99ed-2aa0-4a08-b488-08f30f00b115 +./pgadmin/data/sessions/6d5cdc12-98ae-4226-8c56-01a66ace1eb6 +./pgadmin/data/sessions/4fbb5992-1fbe-4451-b3b7-29b0318db683 +./pgadmin/data/sessions/aee5ec2f-8e5c-4a46-98f2-09842c70b28e +./pgadmin/data/sessions/0ab80fb4-e8e7-406d-b344-f49eba9ff931 +./pgadmin/data/sessions/dde5b219-4951-4165-8fd4-78c960f48b9e +./pgadmin/data/sessions/351775b2-78e4-499e-868d-4d29b5c6dc44 +./pgadmin/data/sessions/70be35ce-dedc-49e1-baa1-fc144a68e2dd +./pgadmin/data/sessions/1e5e0265-eae2-4b5b-a55b-cd60ebf3329d +./pgadmin/data/sessions/bb0e21bd-b9d5-4a23-b434-1065bbaa95de +./pgadmin/data/sessions/03321bce-cf49-427a-a351-c698a1e8b6c5 +./pgadmin/data/sessions/c9725e93-8daa-4593-adb6-cae2c08f9ff2 +./pgadmin/data/sessions/b96079ba-7bb1-4f2e-9a3c-e909f62b4482 +./pgadmin/data/sessions/dbe3af6d-f17b-40b9-89e2-f39320543100 +./pgadmin/data/sessions/638b9be8-028f-44cb-8989-36ea93b74eea +./pgadmin/data/sessions/2ed28be0-af44-427d-aebc-548f31f468e0 +./pgadmin/data/sessions/a3dc2446-3c67-4238-a8b2-c9fa71fbad7a +./pgadmin/data/sessions/46a19aed-8c32-4649-9190-e449bc59bc7b +./pgadmin/data/sessions/7c130b35-7cb9-488d-8576-ea9013268f03 +./pgadmin/data/sessions/b756eef0-4625-465d-bc5b-a84d0cb54bc1 +./pgadmin/data/sessions/60f20466-0f3c-459c-aef7-4fc0c091fe44 +./pgadmin/data/sessions/4c0d3bc1-5568-4b05-a134-0dfabe300266 +./pgadmin/data/sessions/24b3c1f7-7db5-46a1-8f9d-2bebf1f0fdce +./pgadmin/data/sessions/e4d91f15-4c9f-407e-9bed-4b54a9710348 +./pgadmin/data/sessions/e1dbb2c7-f692-49bf-9952-906e45cc061c +./pgadmin/data/sessions/2179bbb8-68eb-4d23-ab40-abd267a737ca +./pgadmin/data/sessions/451e0858-8495-4b2b-80e6-a806b23ebf20 +./pgadmin/data/sessions/11cb2bcb-cdd1-47cd-8bd7-2311df2c5fe9 +./pgadmin/data/sessions/4cd4231d-4650-478a-836d-587dd5fadf2d +./pgadmin/data/sessions/4dddbbca-9f36-4afe-91c5-dda07af51509 +./pgadmin/data/sessions/722e0de3-d430-4128-a2dc-0c2b98696529 +./pgadmin/data/sessions/ab34bced-831e-487d-9825-84f608ea3902 +./pgadmin/data/sessions/93c836f5-d79d-425b-bf03-dcabb528c14a +./pgadmin/data/sessions/418dd495-ee05-4922-a4b5-20d73b9e4546 +./pgadmin/data/sessions/0074a83f-e030-42ae-8c17-45565cbecfc9 +./pgadmin/data/sessions/ed9ea264-f245-424a-a083-d41f3e3677f2 +./pgadmin/data/sessions/987661e3-7d05-4a95-8b77-baa1d589e950 +./pgadmin/data/sessions/fe97b137-a0ea-4a78-97e1-3380e694b0fd +./pgadmin/data/sessions/f7a50bb2-86b0-4300-8230-1419184b77df +./pgadmin/data/sessions/3a0faa33-930b-4f10-b332-a7e980746c78 +./pgadmin/data/sessions/2d628d69-f6f7-486a-9262-bc18afb453af +./pgadmin/data/sessions/13426e7d-ab6c-4495-8e7d-86a537b15eee +./pgadmin/data/sessions/9b298e50-1684-493a-aa4c-013aa0dfa34d +./pgadmin/data/sessions/f03484f7-2430-4a0a-97ec-9da8e1f5ea8e +./pgadmin/data/sessions/83b8ec9d-cce8-40dd-92d2-b408fb9740b4 +./pgadmin/data/sessions/55b681bd-873c-4d01-b4be-3989d832a238 +./pgadmin/data/sessions/d4e8dbd2-54cf-46e1-b517-fc1e75d249e1 +./pgadmin/data/sessions/8d702279-6b43-4233-a353-8154dd414dd9 +./pgadmin/data/sessions/e2712981-434d-4e36-95f1-1a8bfdd104aa +./pgadmin/data/sessions/7e7fdf5e-cddd-47d9-9904-c2e3f0bb6584 +./pgadmin/data/sessions/47fe0485-1471-42bc-95cd-706a64f48628 +./pgadmin/data/sessions/d09cb1df-1944-4853-8a28-2b96d6e48172 +./pgadmin/data/sessions/cabc5443-1f25-4baa-935f-677ad0168302 +./pgadmin/data/sessions/e6c8fdcc-0d49-4d7b-b1c1-9e369dc4b462 +./pgadmin/data/sessions/e14cf22a-1d02-4b56-8e72-dc06b7680c58 +./pgadmin/data/sessions/afb4a566-5bbd-44ca-95a7-07f73b35a4b5 +./pgadmin/data/sessions/b5d9d584-a368-445a-a1a3-832c81ceecb8 +./pgadmin/data/sessions/dccb1427-3039-4d5b-99a3-aa1e0047c1d5 +./pgadmin/data/sessions/05d366d7-6fc8-4b0a-8f15-34e993390037 +./pgadmin/data/sessions/3ee96a8c-f9ab-4446-a2a5-f507c43c81ca +./pgadmin/data/sessions/aed3b509-f282-4a70-aefd-8187a7eec5a1 +./pgadmin/data/sessions/ce5f6384-c313-4ded-886b-b07ececd76cd +./pgadmin/data/sessions/1f914044-e28a-4209-adbe-3ef26a350f8f +./pgadmin/data/sessions/af349006-dc3d-4311-813f-b7b9a020bf80 +./pgadmin/data/sessions/2f9a5acd-4f90-41e6-b3ce-6c96fd759269 +./pgadmin/data/sessions/239da6ac-8ad1-4a6b-b744-1f0c277297f2 +./pgadmin/data/sessions/fafc224c-d56c-46f8-8e61-99acda95eea3 +./pgadmin/data/sessions/4702c0ea-8e09-45cf-b789-30e27eb5e3b9 +./pgadmin/data/sessions/ba1fe36d-33f0-406d-ac2d-b36f1a116e1a +./pgadmin/data/sessions/f2d9792d-a8f1-428b-8337-8e9d6f3443f7 +./pgadmin/data/sessions/3988bd08-5155-401d-99d6-02f2fb632f55 +./pgadmin/data/sessions/eda16ade-9d9f-414a-8568-f7cbdd846df5 +./pgadmin/data/sessions/dc94f41e-fce7-4511-8568-85f697d9c3ac +./pgadmin/data/sessions/f1d83a36-0b04-4f6d-b5e6-a5ceb6913d46 +./pgadmin/data/sessions/9ca18ada-194c-411c-aca2-dd39c9309f06 +./pgadmin/data/sessions/e894978f-3619-4507-8a8d-06ebd9d3b34b +./pgadmin/data/sessions/3a94a473-9331-4677-a456-c2f159644646 +./pgadmin/data/sessions/f9d18c1d-5bf5-415a-b1b2-f626cbff20a5 +./pgadmin/data/sessions/6ed6727c-6f53-4985-b61d-54ec2c5e21aa +./pgadmin/data/sessions/bcbba302-039d-4255-b59b-4f5c0ba4261e +./pgadmin/data/sessions/bc5dcd93-6f31-4c85-a71e-a5e2c3909ee4 +./pgadmin/data/sessions/81fa4503-512f-4ffc-b80c-a2cbe5ac6c6d +./pgadmin/data/sessions/8b244e1a-3450-46ae-bf7d-1c62cbf27efd +./pgadmin/data/sessions/57e8dde3-3c42-4ea9-b51b-61e0c7464689 +./pgadmin/data/sessions/7b270987-51d5-49ec-a211-efe040a3aad6 +./pgadmin/data/sessions/ac22993e-9fa9-4648-b831-00d09d4c1847 +./pgadmin/data/sessions/28cae61e-11d9-496f-a02a-61c9e6f7de81 +./pgadmin/data/sessions/4a10d8d1-c231-4e4a-b2da-11c41f1fb17b +./pgadmin/data/sessions/d85fb50c-159c-4126-a962-26b7d6069e7b +./pgadmin/data/sessions/ff45df81-4c63-4c3c-a8dd-049c6d620cd2 +./pgadmin/data/sessions/71210c05-6890-4a50-b357-ab9aa326676e +./pgadmin/data/sessions/cb104af0-04e6-4f15-a368-f77982452a6c +./pgadmin/data/sessions/ac393412-dcf8-4c91-bc17-7d1b5801acad +./pgadmin/data/sessions/48251b44-eba5-4052-a76e-86a6875136b9 +./pgadmin/data/sessions/1d6f0a85-d435-4576-a0fa-08a06278a27e +./pgadmin/data/sessions/3c8bf289-9347-409a-9f10-47d159e01372 +./pgadmin/data/sessions/cfa4a83e-c216-4605-b47c-a22793eba833 +./pgadmin/data/sessions/bf90f4cb-b073-4c6e-879a-254f1b482663 +./pgadmin/data/sessions/66915c98-f44d-46e5-b6b1-6b7f93a75ec8 +./pgadmin/data/sessions/49511e92-d0d3-4269-800b-ece9393f44da +./pgadmin/data/sessions/cda3d93a-d66a-40d6-b639-5889a54f18ae +./pgadmin/data/sessions/5e4fd04c-14ea-444b-8146-b16def80df51 +./pgadmin/data/sessions/eefdb208-868b-4f2f-b994-10e3fb60a027 +./pgadmin/data/sessions/049be04b-7f37-4e21-bc39-0c2a8b220599 +./pgadmin/data/sessions/c4ede5bb-f6d0-414b-ae56-7b02f6d70e5e +./pgadmin/data/sessions/6291cc65-910e-421f-88f8-52052e770880 +./pgadmin/data/sessions/0e57c4bc-ece3-4cee-8593-d29a4ac3eb32 +./pgadmin/data/sessions/d2a3c6f4-9445-4cce-a5e8-dc1086c17aa5 +./pgadmin/data/sessions/41dba666-775e-4db7-bab2-e9e8d24d6f69 +./pgadmin/data/sessions/be43131f-9131-4361-9a78-11fe22bc07fe +./pgadmin/data/sessions/4832b048-abfe-407a-abbc-5ab7349646dc +./pgadmin/data/sessions/9d89be8f-abc8-4e30-b87a-187d22ba3bb7 +./pgadmin/data/sessions/97c0ed8d-c8bb-4867-afdb-ed963a871162 +./pgadmin/data/sessions/786acf57-7b55-49a3-bbf4-d2ea7ac3af88 +./pgadmin/data/sessions/5f44b9f8-20b6-4f0f-8b35-fcbafb900d7d +./pgadmin/data/sessions/02a93934-cb4f-4990-9f17-3c9b0c0d41d8 +./pgadmin/data/sessions/be8c9ae6-3d6a-4c56-b296-7a316062e49e +./pgadmin/data/storage +./pgadmin/data/storage/kincses_gmail.com +./pgadmin/data/pgadmin4.db +./pgadmin/data/azurecredentialcache +./logs +./frontend +./frontend/uploads +./frontend/uploads/fe7a5e48-09af-4a3c-a51a-b7c97a20810e.png +./frontend/uploads/743f6905-83bc-4269-83bd-38098b10605b.png +./frontend/uploads/50369328-e8d0-4f07-b955-52bfc5bc4671.png +./frontend/uploads/1797321c-cd84-48a9-a4f5-7a063dd5386f.png +./frontend/uploads/f3d0f3f9-4112-4c8e-b2c6-558a9cace658.png +./frontend/uploads/3912a8ba-57f0-477c-9a27-597240407444.png +./frontend/uploads/6e62c849-21fc-4803-ab3b-e5b627649f30.png +./frontend/index_old.html +./frontend/index.html +./docker-compose_NAS_előtt.yml +./code-server-config +./code-server-config/extensions +./code-server-config/extensions/extensions.json +./code-server-config/data +./code-server-config/data/Machine +./code-server-config/data/User +./code-server-config/data/User/customBuiltinExtensionsCache.json +./code-server-config/data/User/History +./code-server-config/data/User/caches +./code-server-config/data/User/Backups +./code-server-config/data/User/settings.json +./code-server-config/data/User/snippets +./code-server-config/data/User/globalStorage +./code-server-config/data/User/systemExtensionsCache.json +./code-server-config/data/User/machineid +./code-server-config/data/User/workspaceStorage +./code-server-config/data/CachedProfilesData +./code-server-config/data/CachedProfilesData/__default__profile__ +./code-server-config/data/logs +./code-server-config/data/logs/20260120T003918 +./code-server-config/data/logs/20260120T172343 +./code-server-config/data/logs/20260120T004510 +./code-server-config/data/logs/20260120T175427 +./code-server-config/data/coder.json +./code-server-config/workspace +./alembic.ini +./Horgony_megjegyzések.txt diff --git a/archive/2026.02.18 Archive_old_mapps/Old_versions/teljes_log b/archive/2026.02.18 Archive_old_mapps/Old_versions/teljes_log new file mode 100755 index 0000000..e83040b --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/Old_versions/teljes_log @@ -0,0 +1,939 @@ +Teljes LOG (2026-01-30) – LOG v1 (FRISSÍTVE) + +Rendszer: service_finder (Traffic Ecosystem SuperApp 2.0) +Host: profibot1 (kincses) +Dátum: 2026-01-30 (Europe/Budapest) + +[13] API health + compose erőforrások + +Parancs: curl http://127.0.0.1:8000/ + +Eredmény: {"status":"online","version":"2.0.0","docs":"/docs"} ✅ + +Parancs: docker stats --no-stream + +Megfigyelés / kockázat: + +Erőforrások bőven rendben, nincs “fulladás”. + +Legnagyobb RAM: code-server ~343MB, pgadmin ~266MB, nginx-proxy-manager ~107MB, minio ~109MB + +Következtetés: A rendszer stabilan fut erőforrás oldalról, nincs “performance” blokk. + +[14] Host port kitettség (LISTEN sockets) + +Parancs: ss -tulipn | grep LISTEN + +Eredmény (kritikus összefoglaló): + +Publikus (0.0.0.0): 5432, 8000, 3000, 9000, 9001, 5050, 8888, 8443, 80, 81, 443 + +Következtetés (kritikus): + +A DB (5432) és admin felületek (pgAdmin 5050, code-server 8443, dozzle 8888, minio 9001) minden interfészen hallgatnak. + +Ez LAN-on is rizikó; internet felé pláne (ha port forward van). + +Ajánlott irány: ezeket később “internal only / VPN only / localhost bind” módon kell zárni. + +[15] Docker network-ek – név eltérés / téves hivatkozás + +Parancs: docker network ls | grep service_finder + +Eredmény: + +service_finder_default + +service_finder_internal_net + +service_finder_public_net + +service_finder_service_finder_net + +Parancs: docker inspect service_finder_net + +Eredmény: error: no such object: service_finder_net + +Következtetés: + +A compose-ban a háló neve nem service_finder_net, hanem service_finder_service_finder_net (és mellette van internal/public/default). + +A korábbi checklist parancsomat ehhez igazítjuk. + +Helyes minta mostantól: + +docker inspect service_finder_service_finder_net | head -n 80 +docker inspect service_finder_internal_net | head -n 80 +docker inspect service_finder_public_net | head -n 80 + +[16] OpenAPI: V2 info + path-szám + +Parancsok: + +curl -sS http://127.0.0.1:8000/ | jq . + +curl -sS http://127.0.0.1:8000/api/v2/openapi.json | jq '.info, (.paths|keys|length)' + +Eredmény: + +API online + +OpenAPI: title/version OK + +Path count: 18 + +Következtetés: A publikus API surface jelenleg kicsi (18 route), ez “MVP” jelleg. + +[17] API log tail – auth flow + email provider hibák + route mismatch + +Parancs: docker compose logs --no-color --tail=300 service_finder_api | tail -n 120 + +Kulcs események: + +Uvicorn többször újraindult (Started → Shutting down → Started) + +Ez lehet compose restart / image rebuild / manual stop-start / healthcheck hatás. + +POST /api/v2/auth/register ...: + +kincses@gmail.com → 400 Bad Request + +info@profibot.hu → 200 OK ✅ (sikeres reg) + +Email küldési hibák: + +SendGrid: 550 from address does not match a verified Sender Identity + +Gmail SMTP: 535 Username and Password not accepted (BadCredentials) + +Login: + +volt 401 Unauthorized, majd 200 OK ✅ + +Forgot password: + +POST /api/v2/auth/forgot-password?email=kincses@gmail.com → 404 Not Found + +Frontend user lekérés: + +GET /api/v1/users/me → 404 Not Found (ismétlődik) + +Külső bot forgalom: + +több IP GET /, GET /robots.txt → (robots 404, root 200) + +Következtetések (nagyon fontos): + +(A) A reg/login V2 oldalon működik, tehát auth core rendben. + +(B) A /api/v1/users/me nincs kiexportálva vagy rossz prefix alatt van → ezért 404. + +(C) A “forgot-password” route a log szerint 404, miközben OpenAPI-ban nálad szerepel /api/v2/auth/forgot-password. Ez két dolgot jelenthet: + +route csak más HTTP metódussal él (pl. GET), miközben te POST-olsz, vagy + +a route valójában másik path-on van (pl. /api/v2/auth/forgot-password/), vagy + +több router/verzió van, és nem az van mountolva, amit az OpenAPI mutat (ritkább, de előfordul). + +(D) Email küldés jelenleg nincs rendesen bekötve (SendGrid sender identity + Gmail auth). Ettől még a regisztráció működhet, csak értesítő/verify email nem. + +[18] DB állapot – séma + top táblák (rekordszám) + +Parancsok: + +\dn+ → data + public + +pg_stat_user_tables top 30 + +Eredmény (lényeg): + +fuel_stations ~ 7303 + +service_providers ~ 7294 + +vehicle_brands 111 + +vehicle_models 41 + +users 5 + +sok tábla 0–10 rekord körül + +Következtetés: + +Van masszív seed adat: üzemanyagkutak + szolgáltatók (~7k+7k). + +A rendszer már “használható demo” állapot felé van töltve. + +A users 5 rekord → több próbálkozás/teszt user is van. + +[19] Alembic migráció – konténerben rendben + +Parancsok: + +docker exec -it service_finder_api ... "alembic current && alembic heads" + +pip show alembic + +Eredmény: + +current=head: 10b73fee8967 (head) ✅ + +Python 3.12.12, Alembic 1.18.1 telepítve a konténerben ✅ + +Következtetés: + +A DB migrációk konzisztensen HEAD-en vannak. + +A “hoston nincs alembic” nem gond, a standard futtatási hely a konténer. + +[20] MinIO Console él (9001), de mc hozzáférés külön téma + +Parancs: curl -sS http://127.0.0.1:9001/ | head + +Eredmény: MinIO Console HTML betölt ✅ + +Következtetés: MinIO szerver+console fut; a korábbi mc ls local Access Denied várható, amíg nincs alias/policy rendben. + +[21] Frontend API endpointok – hardcoded, inkonzisztens (kritikus) + +Parancs: grep -R "8000\|api/v" -n src | head -n 80 + +Eredmény (nagyon beszédes): + +AddVehicle.vue → http://192.168.100.43:8000/api/v1/... + +AddExpense.vue → http://localhost:8000/api/v1/... + +Dashboard.vue → http://localhost:8000/api/v1/reports/summary/latest + +Login.vue → http://192.168.100.43:8000/api/v2/auth/login + utána GET /api/v1/users/me + +ForgotPassword.vue → POST .../api/v2/auth/forgot-password?... + +ResetPassword.vue → .../api/v2/auth/reset-password-confirm (ez a logban nem látszott még) + +Következtetés (root cause a 404-ekre): + +Frontend többféle base URL-t használ (localhost vs 192.168.100.43) → környezetfüggő hibák. + +A login után a frontend /api/v1/users/me-t hívja → de a backend log szerint ez 404. +Ez most konkrétan “broken user profile fetch”, emiatt UI-ban bejelentkezés után elakadás várható. + +A dashboard .../reports/summary/latest route lehet, hogy nem létezik (OpenAPI-ban nálad {vehicle_id} szerepelt, a logban nem látom a latest-et). + +Teljes LOG (2026-01-30) – LOG v1 + +Rendszer: service_finder (Traffic Ecosystem SuperApp 2.0) +Host: profibot1 (user: kincses) +Dátum: 2026-01-30 (Europe/Budapest) +Forrás: terminál kimenetek + compose állapot + +[01] Docker / Compose állapot + +Megfigyelés: Futó konténerek listázva (docker ps, docker compose ls, docker compose ps) + +Eredmény: + +service_finder compose stack: 9 service fut + +service_finder_api (8000->8000) + +service_finder_frontend (3000->80) + +postgres-db (5432->5432) – healthy + +service_finder_redis (6379 internal) + +service_finder_minio (9000-9001) + +pgadmin_ui (5050->80) + +nginx-proxy-manager (80-81, 443) + +code-server (8443->8080) + +dozzle (8888->8080) + +plusz: ddclient külön compose stackben fut + +Következtetés: A “2 docker konténer” valójában 2 alkalmazás konténer (API + frontend), de a teljes rendszer 9+1 konténer. + +[02] API endpoint ellenőrzés – OpenAPI / Docs / Root + +Parancsok és eredmények: + +curl http://127.0.0.1:8000/openapi.json → 404 Not Found + +curl http://127.0.0.1:8000/docs → 200 OK, Swagger UI betölt (de a UI /api/v2/openapi.json URL-t használ) + +curl http://127.0.0.1:8000/ → 200 OK, JSON: {"status":"online","version":"2.0.0", ...} + +Fájlok: + +api_spec.json mérete 22 byte, tartalma: {"detail":"Not Found"} + +api_spec_v2.json mentve: 12600 byte, tartalma valid OpenAPI (3.1.0), title: Traffic Ecosystem SuperApp 2.0 + +Következtetés (root cause): + +Az API nem a FastAPI default openapi.json útvonalat használja, hanem verziózottat: + +✅ helyes: http://127.0.0.1:8000/api/v2/openapi.json + +❌ hibás: http://127.0.0.1:8000/openapi.json + +[03] API útvonalak gyors ellenőrzése (OpenAPI alapján) + +Lekért path-ek (részlet): + +/api/v2/auth/login, /api/v2/auth/register, /api/v2/auth/forgot-password + +/api/v1/auth/register, /api/v1/auth/verify + +/api/v1/vehicles/register, /api/v1/fleet/vehicles, /api/v1/expenses/add + +/api/v1/reports/summary/{vehicle_id}, /api/v1/reports/trends/{vehicle_id} + +/api/v1/billing/* + +/api/v1/users/me + +Következtetés: Az API-ban V1 és V2 párhuzamosan él, a Swagger UI a V2 OpenAPI-t tölti be. + +[04] Fájlrendszer állapot – projekt gyökér + +Projekt root: /opt/service_finder + +Látható fő elemek: + +backend/, frontend/, migrations/, postgres/, redis/, docs/ + +docker-compose.yml, .env, alembic.ini + +postgres_data/ (permission denied listázásnál — várható, mert volume/data root ownership) + +pgadmin_data/, proxy-manager/, code-server-config/ + +backupok: backup_20260128_alap_kesz.sql, backup_manager.sh, backup_to_nas.sh + +Megjegyzés: A cat backup_manager.sh azért lett “No such file”, mert nem a projekt rootban futottál, hanem a frontend mappában. (Rootban ott van.) + +[05] Compose render + log mentés + +docker compose config > /tmp/service_finder.compose.rendered.yml elkészült + +Utolsó 200 sor mentve: + +/tmp/api_last200.log + +/tmp/frontend_last200.log + +/tmp/postgres_last200.log + +[06] Adatbázis hozzáférés – postgres role hiba, majd tisztázás + +Hiba: + +docker exec -it postgres-db psql -U postgres ... + +→ FATAL: role "postgres" does not exist + +Ok: A konténerben a superuser nem postgres, hanem a compose alapján: + +POSTGRES_USER = kincses + +POSTGRES_DB = service_finder + +Következtetés: A DB admin belépéshez a helyes minta: + +docker exec -it postgres-db psql -U kincses -d service_finder + +[07] DB séma állapot (data schema) + +Megfigyelés: Listázott táblák a data sémában: 55 tábla + +Tematikus csoportok (a listád alapján): + +Auth/User: users, verification_tokens, organization_members, company_members + +Org/Company: organizations, companies, organization_locations, org_subscriptions + +Fleet/Vehicles: vehicles, user_vehicles, vehicle_brands/models/variants, vehicle_events, vehicle_expenses, vehicle_assignments, vehicle_ownership + +Service Marketplace: service_providers, service_specialties, service_reviews, service_records + +Gamification / Points: badges, points_ledger, user_scores, user_stats, votes + +Billing/Credits/Vouchers: credit_*, vouchers, subscription_tiers + +Translations / Settings / Audit: translations, system_settings, audit_logs, regional_settings + +Következtetés: A DB “MVP+” szinten meglepően késznek tűnik (sok modul le van képezve). + +[08] Backend forráskód struktúra – routerek és modulok + +Fő elemek: + +app/main.py, app/api/v1/*, app/api/v2/auth.py, app/services/*, app/models/* + +Router találatok: + +v1 endpoints: auth, vehicles, fleet, providers, expenses, billing, reports, gamification, social, search, admin + +v2: auth + +Megjegyzés a logod alapján: reports.py router sor: router = APIRouter() # EZ HIÁNYZOTT! → ez tipikusan egy korábbi bugfix nyoma. + +[09] Alembic helyzet + +alembic parancs a hoston: nincs telepítve + +Viszont: + +van alembic.ini + +van migrations/versions + +Következtetés: migrációk léteznek, de a host CLI nincs fent — valószínűleg a migrációt konténerből vagy poetry/venv-ből kell futtatni. + +[10] Frontend struktúra + +Vue alapú felépítés látszik: + +src/views: Login, Register, Forgot/Reset password, Dashboard, Vehicles, Expenses, AdminStats + +Router: src/router/index.js + +Következtetés: Frontendben az alap “app shell” + fő képernyők megvannak. + +[11] MinIO hozzáférés hiba + +docker exec -it service_finder_minio mc ls local → Access Denied + +Okok tipikusan: + +nincs jól beállítva az mc alias set local ... + +nem a megfelelő access/secret kulcsot használod (a compose-ban API-nak külön MINIO_ACCESS_KEY/MINIO_SECRET_KEY van) + +policy/bucket jog hiányzik + +Következtetés: MinIO él, de a CLI hozzáférés nincs inicializálva. + +[12] Biztonsági megjegyzés (kritikus) + +A logodban szerepelt SendGrid API kulcs és több secret is. Ezeket kezeld kompromittáltnak: + +azonnali rotáció (SendGrid key revoke + új) + +.env / compose secret-ek rendezése (legalább fájl-jogosultság + később Docker secrets) + +(Ezt nem “szidásnak” mondom, hanem azért, mert ez a leggyakoribb valós támadási felület.) + +TELJES LOG — 2026-01-30 (DB + ENV + API + Tables) +LOG-2026-01-30-011 — Postgres konfiguráció (compose + env) + +DB név: service_finder +DB user: kincses +Image: postgres:15 +Volume: /opt/service_finder/postgres_data → /var/lib/postgresql/data +Healthcheck: pg_isready -U kincses -d service_finder +Publikus port: 0.0.0.0:5432 ⚠️ + +Megállapítás: + +A postgres role nem hiba, mert a rendszer kifejezetten kincses userrel lett inicializálva. + +A DB él, healthy, működik. + +LOG-2026-01-30-012 — API DB kapcsolat + +DATABASE_URL: + +postgresql+asyncpg://service_finder_app@postgres-db:5432/service_finder + + +Megállapítás: + +Van külön app user (service_finder_app) → jó security practice + +Admin user (kincses) ≠ runtime user → helyes architektúra + +LOG-2026-01-30-013 — Data schema táblák listája (55 tábla) +✅ FLOTTA & JÁRMŰ (CORE — KÉSZ ALAP) + +vehicles + +vehicle_brands + +vehicle_models + +vehicle_variants + +vehicle_categories + +vehicle_assignments + +vehicle_ownership + +user_vehicles + +vehicle_events + +vehicle_expenses + +service_records + +engine_specs + +equipment_items + +user_vehicle_equipment + +➡️ Flottakezelés adatmodellje: ERŐSEN ELŐREHALADOTT + +TELJES LOG — 2026-01-30 (frissítés) +LOG-2026-01-30-009 — OpenAPI spec helyes mentése (/api/v2/openapi.json) + +Parancsok: + +curl -sS http://127.0.0.1:8000/api/v2/openapi.json -o api_spec_v2.json + +wc -c api_spec_v2.json + +head -c 200 api_spec_v2.json + +Eredmény: + +api_spec_v2.json méret: 12 600 byte + +fejléc: +{"openapi":"3.1.0","info":{"title":"Traffic Ecosystem SuperApp 2.0","version":"2.0.0"},"paths":{... + +tehát a specifikáció rendben letöltődik, nem 404. + +LOG-2026-01-30-010 — API endpoint lista (spec alapján) + +Parancs: + +jq -r '.paths | keys[]' api_spec_v2.json | head -n 80 + +Eredmény (részlet): + +/ + +/api/v1/auth/register + +/api/v1/auth/verify + +/api/v1/billing/balance + +/api/v1/billing/history + +/api/v1/billing/vouchers/generate + +/api/v1/billing/vouchers/redeem + +/api/v1/expenses/add + +/api/v1/fleet/vehicles + +/api/v1/reports/summary/{vehicle_id} + +/api/v1/reports/trends/{vehicle_id} + +/api/v1/users/me + +/api/v1/vehicles/register + +/api/v1/vehicles/search/brands + +/api/v1/vehicles/search/providers + +/api/v2/auth/forgot-password + +/api/v2/auth/login + +/api/v2/auth/register + +Megállapítás (fontos): + +A dokumentációt a /api/v2/openapi.json adja, de a specben sok /api/v1/... útvonal is szerepel. +Ez általában azt jelenti, hogy: + +van legacy v1 (fleet/billing/reports/vehicles), + +és közben épül a v2 auth (login/forgot/register). + +TELJES LOG — 2026-01-30 (kiegészítve a mostani futásokkal) +LOG-2026-01-30-005 — OpenAPI: /openapi.json 404, /docs OK, OpenAPI URL v2-re mutat + +Parancsok: + +ls -lah api_spec.json + +wc -c api_spec.json + +head -c 200 api_spec.json + +curl -i http://127.0.0.1:8000/openapi.json | head -n 40 + +curl -i http://127.0.0.1:8000/docs | head -n 40 + +curl -i http://127.0.0.1:8000/ | head -n 40 + +Eredmény: + +api_spec.json méret: 22 byte + +tartalom: {"detail":"Not Found"} + +/openapi.json → HTTP 404 Not Found + +/docs → HTTP 200 OK, Swagger UI HTML + +a Swagger UI ezt a specifikációt tölti: /api/v2/openapi.json + +/ → HTTP 200 OK, JSON: + +{"status":"online","version":"2.0.0", ...} (a kimenet vége levágva a pasted szövegben) + +Következtetés: + +Az API nem a default FastAPI openapi útvonalon adja a specifikációt, hanem verziózott path-on: /api/v2/openapi.json. + +Emiatt a korábbi curl .../openapi.json mentés teljesen korrekt módon 404-et mentett le. + +LOG-2026-01-30-006 — Fájlrendszer snapshot /opt/service_finder + +Parancsok: + +ls -lah + +find . -maxdepth 3 -type f -name "docker-compose*.yml" -o -name ".env" -o -name "*.env" | sed 's|^\./||' + +du -h -d 2 | sort -h | tail -n 30 + +ls -lah logs || true + +Kulcs megállapítások: + +van .env (2026-01-30 01:47), docker-compose.yml (2026-01-29 22:03) + +van backend/, frontend/, migrations/ + +api_spec.json jelen van (22 byte) + +vannak backup scriptek: backup_manager.sh, backup_to_nas.sh + +logs/ mappa létezik, de üres (csak könyvtár) + +jogosultsági hibák: postgres_data, .vscode_config/.ssh, pgadmin storage, proxy-manager letsencrypt könyvtárak + +Kockázat / megjegyzés: + +postgres_data olvasása “Permission denied” → tipikus container volume ownership issue (nem baj, csak kezelni kell sudo-val). + +A compose configban látszó code-server PASSWORD kikerült a paste-be → ezt érdemes azonnal cserélni (lásd lent). + +LOG-2026-01-30-007 — Compose render + szolgáltatások állapota + log export + +Parancsok: + +docker compose config > /tmp/service_finder.compose.rendered.yml + +docker compose ps + +log exportok /tmp/*_last200.log + +Eredmény: + +Minden releváns szolgáltatás Up: api, frontend, postgres (healthy), redis, minio, npm, pgadmin, code-server, dozzle + +Figyelmeztetés: VERSION_CODENAME env nincs beállítva → nem kritikus, de jelzi hogy a compose templated env-et vár. + +LOG-2026-01-30-008 — DB elérés: “postgres” role nem létezik + +Parancsok: + +docker exec -it postgres-db psql -U postgres -c "\l" + +docker exec -it postgres-db psql -U postgres -c "\du" + +docker exec -it postgres-db psql -U postgres -c "\dx" + +docker exec -it postgres-db psql -U postgres -c "\dn" + +Eredmény: + +mindegyik: FATAL: role "postgres" does not exist + +Következtetés: + +A konténer nem default POSTGRES_USER=postgres-szal lett inicializálva, hanem más admin userrel (pl. admin, db_owner, stb.). + +Ez teljesen OK, csak a -U postgres helyett a valós DB user kell. + + +TELJES LOG — 2026-01-30 +LOG-2026-01-30-001 — Docker konténerek állapota (docker ps) + +Kontekstus: service_finder stack futása ellenőrzés +Parancs: + +docker ps +Eredmény (kivonat): + +service_finder_frontend — port: 0.0.0.0:3000->80/tcp + +service_finder_api — port: 0.0.0.0:8000->8000/tcp + +postgres-db — image: postgres:15 — port: 0.0.0.0:5432->5432/tcp — healthy + +service_finder_redis — image: redis:alpine — port: 6379/tcp + +service_finder_minio — port: 0.0.0.0:9000-9001->9000-9001/tcp + +nginx-proxy-manager — port: 80-81,443 + +pgadmin_ui — port: 0.0.0.0:5050->80/tcp + +code-server — port: 0.0.0.0:8443->8080/tcp + +dozzle — port: 0.0.0.0:8888->8080/tcp + +ddclient — fut +Megjegyzés / kockázat: + +A postgres-db publikusan ki van téve 0.0.0.0:5432-n. (Ezt a későbbi hardeningnél érdemes minimum LAN/VPN-re szűkíteni.) + +LOG-2026-01-30-002 — Docker compose stack-ek listája (docker compose ls) + +Parancs: + +docker compose ls +Eredmény: + +ddclient — running(1) — /opt/ddclient/docker-compose.yml + +service_finder — running(9) — /opt/service_finder/docker-compose.yml + +LOG-2026-01-30-003 — Docker compose szolgáltatások állapota (docker compose ps) + +Parancs: + +docker compose ps +Eredmény (kivonat): + +postgres-db — Up (healthy) + +service_finder_api — Up + +service_finder_frontend — Up + +service_finder_redis — Up + +service_finder_minio — Up + +nginx-proxy-manager — Up + +pgadmin_ui — Up + +code-server — Up + +dozzle — Up +Megjegyzés: + +A “2 docker konténer” megfogalmazás helyett itt 2 compose projekt van (ddclient + service_finder), és azon belül több konténer fut. + +LOG-2026-01-30-004 — OpenAPI specifikáció kimentése (curl openapi.json) + +Kontekstus: API elérhetőségének és OpenAPI dokumentációjának ellenőrzése +Parancs: + +curl http://127.0.0.1:8000/openapi.json > api_spec.json +Eredmény: + +Letöltött méret: 22 byte +Megjegyzés / következtetés: + +A 22 byte nagyon gyanús (egy FastAPI OpenAPI JSON tipikusan több KB/MB). Ez majdnem biztosan azt jelenti, hogy nem a várt OpenAPI JSON jött vissza (pl. “Not Found”, “Unauthorized”, reverse proxy válasz, vagy hibaszöveg). + +Következő lépés: a fájl tartalmát ki kell olvasni (wc -c api_spec.json && cat api_spec.json), és/vagy headerekkel kérni (curl -i ...). + +TELJES LOG — 2026-01-30 +LOG-2026-01-30-001 — Docker konténerek állapota (docker ps) + +Kontekstus: service_finder stack futása ellenőrzés +Parancs: + +docker ps +Eredmény (kivonat): + +service_finder_frontend — port: 0.0.0.0:3000->80/tcp + +service_finder_api — port: 0.0.0.0:8000->8000/tcp + +postgres-db — image: postgres:15 — port: 0.0.0.0:5432->5432/tcp — healthy + +service_finder_redis — image: redis:alpine — port: 6379/tcp + +service_finder_minio — port: 0.0.0.0:9000-9001->9000-9001/tcp + +nginx-proxy-manager — port: 80-81,443 + +pgadmin_ui — port: 0.0.0.0:5050->80/tcp + +code-server — port: 0.0.0.0:8443->8080/tcp + +dozzle — port: 0.0.0.0:8888->8080/tcp + +ddclient — fut +Megjegyzés / kockázat: + +A postgres-db publikusan ki van téve 0.0.0.0:5432-n. (Ezt a későbbi hardeningnél érdemes minimum LAN/VPN-re szűkíteni.) + +LOG-2026-01-30-002 — Docker compose stack-ek listája (docker compose ls) + +Parancs: + +docker compose ls +Eredmény: + +ddclient — running(1) — /opt/ddclient/docker-compose.yml + +service_finder — running(9) — /opt/service_finder/docker-compose.yml + +LOG-2026-01-30-003 — Docker compose szolgáltatások állapota (docker compose ps) + +Parancs: + +docker compose ps +Eredmény (kivonat): + +postgres-db — Up (healthy) + +service_finder_api — Up + +service_finder_frontend — Up + +service_finder_redis — Up + +service_finder_minio — Up + +nginx-proxy-manager — Up + +pgadmin_ui — Up + +code-server — Up + +dozzle — Up +Megjegyzés: + +A “2 docker konténer” megfogalmazás helyett itt 2 compose projekt van (ddclient + service_finder), és azon belül több konténer fut. + +LOG-2026-01-30-004 — OpenAPI specifikáció kimentése (curl openapi.json) + +Kontekstus: API elérhetőségének és OpenAPI dokumentációjának ellenőrzése +Parancs: + +curl http://127.0.0.1:8000/openapi.json > api_spec.json +Eredmény: + +Letöltött méret: 22 byte +Megjegyzés / következtetés: + +A 22 byte nagyon gyanús (egy FastAPI OpenAPI JSON tipikusan több KB/MB). Ez majdnem biztosan azt jelenti, hogy nem a várt OpenAPI JSON jött vissza (pl. “Not Found”, “Unauthorized”, reverse proxy válasz, vagy hibaszöveg). + +Következő lépés: a fájl tartalmát ki kell olvasni (wc -c api_spec.json && cat api_spec.json), és/vagy headerekkel kérni (curl -i ...). + +IDŐVONAL — 2026-01-30 + +Időpontok: a parancsokhoz konkrét óra:perc nem volt rögzítve a másolatban, ezért sorrendi idővonalat adok (ez stabil, később időbélyeggel pontosítható). + +Docker futó konténerek ellenőrzése (docker ps) + +Compose projektek listázása (docker compose ls) + +Compose szolgáltatások állapotának listázása (docker compose ps) + +OpenAPI export kísérlet (curl .../openapi.json > api_spec.json) → 22 byte-os eredmény, anomália + +RENDSZERFELTÁRÁS — mi kész, mi nincs kész (jelen bizonyítékok alapján) +Ami biztosan kész / működik + +Alaprendszer Compose-ban fut: service_finder stack “running(9)”. + +Frontend él: port 3000 publikusan kint. + +API él: port 8000 publikusan kint. + +Postgres él és healthy: postgres:15, publikus 5432. + +Redis él. + +MinIO él. + +Admin eszközök élnek: pgAdmin (5050), NPM (80/81/443), Dozzle (8888), code-server (8443). + +Létezik lokális projekt struktúra és volume-ok: /opt/service_finder/... alatt backend, frontend, logs, migrations, postgres_data, redis data, proxy-manager adatok. + +filesystem_map + +Ami valószínűleg nincs kész / hibás / tisztázandó + +OpenAPI endpoint: a mentett fájlméret alapján nem jó választ ad az /openapi.json (vagy nem ott van, vagy proxy/route gond). + +Biztonsági hardening: Postgres jelenleg 0.0.0.0:5432-n lóg (ez később sürgős). + +Migrációs konzisztencia: van migrations struktúra a fájlrendszerben (több helyen is), de nem tudjuk, hogy DB-séma ténylegesen “head”-en van-e. + +filesystem_map + +FÁJLRENDSZER-HELYZETKÉP (amit már látunk) + +A feltöltött map alapján a fontos csomópontok: + +Projekt gyökér: /opt/service_finder + +filesystem_map + +Backend kód: /opt/service_finder/backend (+ app/, models/, auth/, schemas/, templates/, migrations/versions) + +filesystem_map + +Frontend kód: /opt/service_finder/frontend (+ src/views/admin, router, stores, services, components, public, node_modules) + +filesystem_map + +Log könyvtár: /opt/service_finder/logs + +filesystem_map + +Postgres adatok: /opt/service_finder/postgres_data/... (és van egy /opt/service_finder/postgres/data/... jellegű ág is) + +filesystem_map + +Redis data: /opt/service_finder/redis/data/... + +filesystem_map + +NPM/Proxy manager adatok + LE: /opt/service_finder/proxy-manager/... + +filesystem_map + +Megjegyzés: a map alapján mintha két postgres adatútvonal is jelen lenne: postgres/data és postgres_data. Ezt tisztázni kell, nehogy két külön volume/útvonal keveredjen (backup, restore, space, stb.). + +filesystem_map + +ADATBÁZIS-HELYZETKÉP (a feltöltött táblalistád alapján) + +A feltöltött tablak_2026.01.30_0.csv alapján a data sémában 54 tábla van. (Ezt használom alapnak a DB audit lépések priorizálásához.) + +A következő lépésben ebből fogok csinálni: + +“core domain” csoportosítást (org/account/auth/vehicle/provider/request/evidence/stb.), + +és egy “migráció és integráció” ellenőrző checklistet (táblák + FK + index + RLS jelek). \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/V01_chatgpt/00_README.md b/archive/2026.02.18 Archive_old_mapps/V01_chatgpt/00_README.md new file mode 100755 index 0000000..a1a365a --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_chatgpt/00_README.md @@ -0,0 +1,15 @@ +# Master Grand Book v1.0 – Service Finder / Traffic Ecosystem SuperApp + +Ez a dokumentáció a projekt **kanonikus tudásbázisa**. + +Két párhuzamos könyvtár létezik: +- V01_chatgpt – technikai, mérnöki, architekturális megközelítés +- V01_gemini – alternatív gondolkodás, validáció, kiegészítő perspektíva + +Cél: +- Tudás megőrzése +- Döntések visszakövethetősége +- Fejlesztési minőség mérése (kód + beállítás + hibajavítás hatékonyság) +- Új projektek benchmark alapja + +Ez a v1.0 verzió a **baseline állapot** dokumentálása. diff --git a/archive/2026.02.18 Archive_old_mapps/V01_chatgpt/01_Project_Overview.md b/archive/2026.02.18 Archive_old_mapps/V01_chatgpt/01_Project_Overview.md new file mode 100755 index 0000000..bb01b21 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_chatgpt/01_Project_Overview.md @@ -0,0 +1,24 @@ +# Projekt áttekintés + +Projekt neve: Traffic Ecosystem SuperApp 2.0 (Service Finder) + +Cél: +Egy moduláris platform létrehozása, amely: +- kezeli a járművek életciklusát, +- nyilvántartja a költségeket, eseményeket, szervizeket, +- összeköti a felhasználókat valós szolgáltatókkal, +- automatizált adatgyűjtést végez (discovery botok), +- skálázható SaaS modellben működik. + +Fő modulok: +- Auth / User / Organization +- Fleet & Vehicle Lifecycle +- Service Provider Marketplace +- Billing / Credits / Subscription +- Gamification & Social +- Discovery Bots (adatgyűjtés) +- Dokumentumfeldolgozás (OCR pipeline – tervezett) + +Non-goals (v1.0): +- Teljes üzleti automatizmus +- Külső fizetési gateway éles integráció diff --git a/archive/2026.02.18 Archive_old_mapps/V01_chatgpt/02_Architecture_System_Context.md b/archive/2026.02.18 Archive_old_mapps/V01_chatgpt/02_Architecture_System_Context.md new file mode 100755 index 0000000..e69de29 diff --git a/archive/2026.02.18 Archive_old_mapps/V01_chatgpt/03_Dev_Environment_Runbook.md b/archive/2026.02.18 Archive_old_mapps/V01_chatgpt/03_Dev_Environment_Runbook.md new file mode 100755 index 0000000..f1cf55b --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_chatgpt/03_Dev_Environment_Runbook.md @@ -0,0 +1,19 @@ +# Fejlesztői környezet + +Indítás: +- docker compose up -d + +Alapszolgáltatások: +- API: :8000 +- Frontend: :3001 +- MinIO: :9000 / :9001 +- Redis: belső háló + +Tipikus ellenőrzések: +- API online: GET / +- OpenAPI: /api/v2/openapi.json +- Frontend betölt + +Ismert jellegzetességek: +- v1 és v2 API párhuzamosan él +- .env alapú konfiguráció diff --git a/archive/2026.02.18 Archive_old_mapps/V01_chatgpt/06_Database_Guide.md b/archive/2026.02.18 Archive_old_mapps/V01_chatgpt/06_Database_Guide.md new file mode 100755 index 0000000..c6dc3b0 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_chatgpt/06_Database_Guide.md @@ -0,0 +1,26 @@ +# Adatbázis – Baseline állapot + +DB: PostgreSQL (shared-postgres) + +Séma: data + +Táblák száma: ~55 + +Kulcs entitások: +- users +- persons +- companies +- vehicles, vehicle_models, vehicle_variants +- service_providers, service_specialties +- fuel_stations +- credit_logs, vouchers, subscriptions +- audit_logs + +Migráció: +- Alembic +- Head rev: 5aed26900f0b +- Persons + owner_person_id implementálva + +Seed: +- fuel_stations ~7300 +- service_providers ~7200 diff --git a/archive/2026.02.18 Archive_old_mapps/V01_chatgpt/07_API_Guide.md b/archive/2026.02.18 Archive_old_mapps/V01_chatgpt/07_API_Guide.md new file mode 100755 index 0000000..f6e759f --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_chatgpt/07_API_Guide.md @@ -0,0 +1,13 @@ +# API – Áttekintés + +Verziók: +- v1: üzleti modulok (fleet, billing, reports) +- v2: auth és új generációs endpointok + +Elvek: +- JWT alapú auth +- Verziózott API +- OpenAPI dokumentált + +Megjegyzés: +A v1 → v2 egységesítés külön roadmap tétel. diff --git a/archive/2026.02.18 Archive_old_mapps/V01_chatgpt/13_Roadmap_Tech_Debt.md b/archive/2026.02.18 Archive_old_mapps/V01_chatgpt/13_Roadmap_Tech_Debt.md new file mode 100755 index 0000000..e69de29 diff --git a/archive/2026.02.18 Archive_old_mapps/V01_chatgpt/14_Anchor_Log_Timeline.md b/archive/2026.02.18 Archive_old_mapps/V01_chatgpt/14_Anchor_Log_Timeline.md new file mode 100755 index 0000000..0ddf062 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_chatgpt/14_Anchor_Log_Timeline.md @@ -0,0 +1,10 @@ +# Anchor Log – döntési napló + +Ez a fejezet rögzíti: +- fontos architekturális döntéseket, +- API-szerződés változásokat, +- adatmodell átalakításokat, +- stratégiai irányváltásokat. + +Cél: +- később visszakövethető legyen, miért úgy épült a rendszer, ahogy. diff --git a/archive/2026.02.18 Archive_old_mapps/V01_chatgpt/15_Changelog.md b/archive/2026.02.18 Archive_old_mapps/V01_chatgpt/15_Changelog.md new file mode 100755 index 0000000..8e7f607 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_chatgpt/15_Changelog.md @@ -0,0 +1,6 @@ +# Changelog + +v1.0 – Baseline +- Mester dokumentum struktúra létrehozva +- DB baseline rögzítve +- API verziózás dokumentálva diff --git a/archive/2026.02.18 Archive_old_mapps/V01_gemini/00_README.md b/archive/2026.02.18 Archive_old_mapps/V01_gemini/00_README.md new file mode 100755 index 0000000..a0822da --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_gemini/00_README.md @@ -0,0 +1,29 @@ +# 📘 SERVICE FINDER - GRAND MASTER BOOK (v1.0) +**Traffic Ecosystem SuperApp 2.0** + +Ez a dokumentáció a rendszer "Egyetlen Igazságforrása" (Single Source of Truth). Minden fejlesztésnek, API hívásnak és üzleti logikának az itt leírtakat kell követnie. + +## 🚀 Gyorslinkek +- **01 Project Overview:** [Mit építünk?](./01_Project_Overview.md) +- **02 Architecture:** [Hogyan működik?](./02_Architecture_System_Context.md) +- **06 Database:** [Adatmodell és Logika](./06_Database_Guide.md) +- **10 Billing & Tiers:** [Üzleti Modell](./10_Billing_Credits_Subscriptions.md) + +## 🚦 Státusz Snapshot (2026-02-03) +- **Fázis:** Architektúra stabilizálás & Migráció (Pre-Beta). +- **Infrastruktúra:** Profibot SW1 (80 Core) - ÉLES. +- **Frontend:** Vue3 + Tailwind (Port 3000). +- **Backend:** FastAPI v2 (Port 8000). +- **Adatbázis:** PostgreSQL 15 (55 tábla, Seed adatokkal). + +# Master Book - Automotive Intelligence Ecosystem +Ez a dokumentáció a projekt technikai és üzleti felépítését tartalmazza. + +## Projekt Célkitűzés +Egy európai szintű, intelligens járműipari ökoszisztéma kiépítése, amely egyesíti a mély járműkatalógus-adatokat (Deep Asset Catalog) és a hitelesített szervizkeresőt (Service Finder). + +## Főbb Komponensek +- **Data Core:** 21,000+ rekordos járműadatbázis (Holland, USA, EU forrásokból). +- **Service Hunter:** n8n alapú, automatizált szerviz-felderítő rendszer. +- **Trust Engine:** Pontszám alapú validációs algoritmus az adatok hitelességének biztosítására. +- **Robot Ökoszisztéma:** Python alapú adatgyűjtő és öngyógyító (Auto-Heal) ágensek. \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/V01_gemini/01_Project_Overview.md b/archive/2026.02.18 Archive_old_mapps/V01_gemini/01_Project_Overview.md new file mode 100755 index 0000000..4dcb96f --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_gemini/01_Project_Overview.md @@ -0,0 +1,19 @@ +# 🧠 PROJECT OVERVIEW & VISION + +## 🎯 A Cél +Egy **Digital Twin** (Digitális Iker) alapú jármű-ökoszisztéma létrehozása. +**"A jármű örök, a tulajdonos vándor."** +Nem csak költségkövető, hanem egy Service Marketplace, Trust Engine és Gamifikált közösség. + +## 🏗️ Fő Modulok +1. **Core Fleet:** Jármű életút, Költségek, TCO (Total Cost of Ownership). +2. **Marketplace:** Szervizkereső (Geo+Routing), Ajánlatkérés, Időpontfoglalás. +3. **Evidence Store:** Bizonyíték alapú előélet (Fotó, Számla, OCR). +4. **Economy:** Kreditrendszer, Előfizetések, Jutalékok. + +## 📖 Terminológia (Glossary) +- **PERSON:** A természetes személy (Élő ember). Nem törölhető, csak rejtetté tehető (Soft Delete). +- **USER:** A technikai belépési fiók. Egy Person-höz több User tartozhat. +- **COMPANY:** Jogi entitás (Céges flotta). Van Tulajdonosa (Person) és Flotta Managere (User). +- **PROVIDER:** Szolgáltató (Szerviz, Gumis, Autómosó). +- **VALIDATOR:** Magas rangú felhasználó, aki kreditért cserébe adatokat ellenőriz. \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/V01_gemini/02_Architecture_System_Context.md b/archive/2026.02.18 Archive_old_mapps/V01_gemini/02_Architecture_System_Context.md new file mode 100755 index 0000000..fa5dac7 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_gemini/02_Architecture_System_Context.md @@ -0,0 +1,23 @@ +# 🏗️ ARCHITECTURE & SYSTEM CONTEXT + +## 🧩 Komponensek +- **Frontend:** Vue 3 + Tailwind CSS + Pinia (State) + Vite. "Dumb Frontend" elv: Csak megjelenít, nem dönt. +- **Backend API:** Python 3.12 + FastAPI. Minden üzleti logika itt fut. Pydantic validáció. +- **Database:** PostgreSQL 15. Külön `data` (üzleti) és `public` (rendszer) sémák. +- **Storage:** MinIO (S3 kompatibilis). Képek, számlák titkosított tárolása. +- **Proxy:** Nginx Proxy Manager. SSL terminálás (`dev.profibot.hu`). + +## 🛡️ Hálózati Határok +- **Internal Net (`shared_db_net`):** A Backend és az Adatbázis közötti dedikált, zárt csatorna. +- **Public Net:** Csak a 80/443 (NPM) nyitott a világ felé. A DB port (5432) és Admin portok (5050, 8888) csak VPN-en vagy localhoston érhetők el. + +# 02. Architecture & System Context + +## Rendszerarchitektúra v2.0 +A rendszer egy eseményvezérelt, mikroszolgáltatás-alapú architektúrára épül, ahol az **n8n** tölti be a központi idegrendszer (Orchestrator) szerepét. + +### Adatáramlási Folyamat +1. **Discovery Layer:** n8n által vezérelt robotok (Robot A) pásztázzák a hálót (OSM, DDG, FB, e-Cégközlöny). +2. **Staging Layer:** A nyers adatok egy átmeneti (Stage) táblába kerülnek további elemzésre. +3. **Audit Layer:** A validátor robot (Robot B) ellenőrzi az adószámokat, TEAOR kódokat és a digitális lábnyomot. +4. **Core Database:** Csak a Trust Engine által hitelesített adatok kerülnek az éles jármű- és szervizkatalógusba. \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/V01_gemini/03_Dev_Environment_Runbook.md b/archive/2026.02.18 Archive_old_mapps/V01_gemini/03_Dev_Environment_Runbook.md new file mode 100755 index 0000000..b460a4e --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_gemini/03_Dev_Environment_Runbook.md @@ -0,0 +1,59 @@ +(Fejlesztői kézikönyv.) +# 👨‍💻 DEVELOPER RUNBOOK + +## 🚀 Indítás +```bash +cd /opt/docker/dev/service_finder +docker compose up -d + +🔍 Logok és Debug + + API log: docker logs -f service_finder_api + + Frontend log: docker logs -f service_finder_frontend + + DB Console: docker exec -it shared-postgres psql -U kincses -d service_finder + +⚠️ Known Pitfalls (Hibaelhárítás) + + API URL: A frontend .env fájljában a VITE_API_BASE_URL nem lehet localhost, ha konténerben fut. Használd a belső IP-t vagy domain-t. + + Login 404: A /api/v1/users/me végpontot a backend routerben regisztrálni kell (jelenleg hiányzik vagy path mismatch van). + + OpenAPI 404: A helyes cím /api/v2/openapi.json. + +# 03. Development Environment Runbook + +## 3.1. System Initialization (Bootstrap) +Ha az adatbázis üres (vagy törölve lett), az első SuperAdmin felhasználót manuálisan kell létrehozni, mivel a regisztrációs végpontok védettek vagy nem adnak admin jogot. + +### 3.1.1. SuperAdmin Létrehozása (Recommended) +A jelszó hash-elési eltérések elkerülése érdekében használjuk a Python scriptet a konténeren belül: + +```bash +docker exec -it service_finder_api python3 -c " +import bcrypt +import asyncio +from sqlalchemy import text +from app.db.session import SessionLocal + +async def bootstrap_admin(): + # 1. Jelszó generálás + password = 'InitialPassword123'.encode('utf-8') + hashed = bcrypt.hashpw(password, bcrypt.gensalt()).decode('utf-8') + + async with SessionLocal() as db: + # 2. Person és User létrehozása/Frissítése + # (A script feltételezi, hogy a Person rekord már létezik vagy itt hozod létre) + sql = text(\"\"\" + UPDATE data.users + SET hashed_password = :h, role = 'superadmin', is_active = true, preferred_language = 'hu' + WHERE email = 'admin@servicefinder.hu' + \"\"\") + await db.execute(sql, {'h': hashed}) + await db.commit() + print('✅ SuperAdmin Ready') + +if __name__ == '__main__': + asyncio.run(bootstrap_admin()) +" diff --git a/archive/2026.02.18 Archive_old_mapps/V01_gemini/04_Infrastructure_Docker_Stack.md b/archive/2026.02.18 Archive_old_mapps/V01_gemini/04_Infrastructure_Docker_Stack.md new file mode 100755 index 0000000..1d2a107 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_gemini/04_Infrastructure_Docker_Stack.md @@ -0,0 +1,27 @@ +# 🐳 DOCKER STACK & PORTS + +## Szolgáltatások +| Service | Image | Internal Port | Host Port | Volume Mapping | +| :--- | :--- | :--- | :--- | :--- | +| **API** | `python:3.12` | 8000 | 8000 | `./backend:/app` | +| **Frontend** | `node:20` | 80 | 3000 | `./frontend:/app` | +| **DB** | `postgres:15` | 5432 | 5432 | `postgres_data:/var/lib/postgresql/data` | +| **MinIO** | `minio/minio` | 9000, 9001 | 9000, 9001 | `minio_data:/data` | +| **Redis** | `redis:alpine` | 6379 | - | - | + +## Hardening Terv +A `Host Port` oszlopban lévő portokat éles üzemben le kell venni (kivéve 80/443), és csak a + +# 04. Infrastructure & Docker Stack + +## Hardver Erőforrás +- **Szerver:** 128 GB RAM (High-Performance Node). +- **Kihasználtság cél:** Moduláris konténerek futtatása alacsony (5-10%) alapterhelés mellett, magas skálázhatósági tartalékkal. + +## Docker Ökoszisztéma (Bővített) +A stack a következő konténereket tartalmazza: +1. **n8n (Orchestrator):** Vizuális munkafolyamat-kezelő. +2. **PostgreSQL:** Központi adattár (Járművek + Szervizek). +3. **Browserless (Chrome):** "Fej nélküli" böngésző az n8n számára a komplex scraping feladatokhoz. +4. **Python Robots:** Konténerizált adatgyűjtő és dúsító ágensek (v1.9.2+). +5. **Proxy/VPN Node:** IP-rotációt biztosító modul a globális felderítéshez. \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/V01_gemini/05_AUTH_AND_IDENTITY_SPEC.md b/archive/2026.02.18 Archive_old_mapps/V01_gemini/05_AUTH_AND_IDENTITY_SPEC.md new file mode 100755 index 0000000..0e304fb --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_gemini/05_AUTH_AND_IDENTITY_SPEC.md @@ -0,0 +1,166 @@ +# 🔐 05_AUTH_AND_IDENTITY_SPEC (v1.3) + +## 1. Azonosítási Stratégia +A rendszer alapelve a **technikai hozzáférés** (User) és a **valós identitás** (Person) szigorú szétválasztása. + +### 1.1. Identitás szintek +- **User (Login):** Email + Jelszó. Kizárólag a belépéshez és a munkamenet (session) kezeléséhez szükséges technikai entitás. +- **Person (Identity):** A valós személy adatai (Név, anyja neve, születési adatok, okmányok). Minden Person kap egy globális egyedi azonosítót (**UUID**). + +### 1.2. Social Auth (Google / Facebook) +- **Működés:** Engedélyezett a gyors belépéshez. +- **Kényszerített KYC:** Social Auth esetén a 2. lépésben kötelező a KYC adatok pótlása. +- **Korlátozás:** Amíg a KYC adatok hiányoznak, a felhasználó "Free User" marad, és nem fér hozzá a regisztrációkor járó extra prémium szolgáltatásokhoz. + +### 1.3. Soft Delete & Re-regisztráció +- **Nincs fizikai törlés:** A felhasználó törléskor `is_hidden` vagy `deleted_at` flag-et kap. +- **Ismételt regisztráció:** Ha az email/név/okmány alapján a rendszer felismeri a visszatérőt: + - Új technikai User fiók jön létre, de a korábbi **Person ID**-hoz kapcsolódik. + - **Adat-izoláció:** A felhasználó csak az új regisztráció utáni eseményeket látja, a régi adatok (statisztika, elemzés) csak a háttérben maradnak meg. + +--- + +## 2. Bizalmi Szintek (Trust Tiers) +A rendszer a "Tier-based Access Control" (szintezett hozzáférés) elvét alkalmazza az adatszolgáltatás mértékétől függően. + +| Szint | Megnevezés | Követelmény | Jogosultságok | +| :--- | :--- | :--- | :--- | +| **Tier 0** | Anonymous | Nincs | Csak publikus adatok megtekintése. | +| **Tier 1** | Verified Email | Step 1 (Regisztráció) sikeres | Belépés, saját profil megtekintése. | +| **Tier 2** | KYC Submitted | Step 2 (Személyi adatok + Telefon) | **Privát Széf/Flotta aktiválása**, Wallet használat. | +| **Tier 3** | AI/OCR Verified | Okmánykép AI általi ellenőrzése | Harmadik fél szolgáltatásainak igénybevétele. | + +--- + +## 3. KYC és Bővített Adattár (Safety) +A `persons` tábla progresszív feltöltéssel tárolja az adatokat a "Minimal Friction" elv mentén. + +### 3.1. Kötelező Adatkör (Step 2 - Tier 2) +A "Privát Széf" aktiválásához az alábbi adatok megadása kötelező: +- **Alapadatok:** `last_name`, `first_name`, `birth_place`, `birth_date`, `mothers_name`. +- **Kapcsolat:** Valós telefonszám (nemzetközi formátum). +- **Hivatalos okmányok:** Személyi ig. szám, Jogosítvány (szám, kategóriák, érvényesség), Lakcímkártya, TAJ, Adóazonosító. +- **Biztonság (ICE):** "In Case of Emergency" adatok (értesítendő személy neve és telefonszáma). +- **Vészhelyzeti adatok:** Vércsoport, Allergia. + +### 3.2. Jutalom Trigger +A teljes körű adategyeztetésért (100%-os profilkitöltöttség) **2 hét PRÉMIUM** tagság jár. + +--- + +## 4. Céges Azonosítás és Verifikáció +A szervezetek (Companies) hitelesítése és bizalmi szintjeinek kezelése. + +### 4.1. Verifikációs Státuszok +- **Unverified (Nem ellenőrzött):** Kézi rögzítés utáni alapállapot. 30 napos türelmi időt biztosít a funkciókhoz. +- **Verified (Hitelesített):** Hitelesített állapot (VIES API találat vagy Admin kézi jóváhagyás után). +- **Suspended (Felfüggesztett):** Megszűnt cég vagy le nem igazolt adatok esetén az időszakos ellenőrzés során. + +### 4.2. Ellenőrzési Logika (Robot & Admin) +1. **Robot:** A `VAT_NUMBER` rögzítésekor a rendszer azonnal meghívja az EU-s **VIES API**-t. Egyezőség esetén azonnal `Verified`. +2. **Hibrid Validálás:** Ha a VIES API nem ad eredményt, a rendszer céges dokumentum feltöltését kéri. +3. **Ellenőrzés:** Adminisztrátori jóváhagyás vagy AI-alapú dokumentum-validálás után válik a státusz véglegessé. +4. **Időszakos ellenőrzés:** Ütemezett feladat (Cron) 30 naponta újraellenőrzi a cégeket. Megszűnés esetén `Suspended` státusz és értesítés. + +### 4.3. Korlátozások (Suspended/Unverified) +- Nem rögzíthető új jármű a flottába. +- Nem generálható meghívó (Invite Token). +- Statisztikai kimutatások korlátozása. + +--- + +## 5. Jutalék és Gazdasági Rendszer +### 5.1. Piramis rendszer (3 szint) +A meghívó lánc alapján számolt jóváírások (Referral): +- **1. szint (Közvetlen):** 10% +- **2. szint:** 5% +- **3. szint:** 2% +*Megjegyzés: A százalékok a befizetés pillanatában érvényes admin beállítások alapján rögzülnek (Snapshot technika).* + +### 5.2. Wallets +Minden regisztrációnál automatikusan létrejön: +- **Coin Wallet:** Belső fizetőeszköz (Kredit). +- **XP Ledger:** Tapasztalati pontok (Gamification és rangsor). + +--- + +## 6. Moderáció és Validálás +- **Validált vélemény:** Csak igazolt ott-tartózkodás (GPS log) vagy számlafotó (OCR) feltöltése után adható. +- **Fellebbezés:** A szervizek kérhetik a vélemények felülvizsgálatát, amit moderátorok bírálnak el. + +--- + +## 7. Adattárolási Stratégia (Technikai) +- A rugalmas okmányadatokat (`identity_docs`) és a vészhelyzeti kapcsolatokat (`ice_contact`) **JSONB** mezőkben tároljuk a `persons` táblában a kereshetőség és a jövőbeli bővíthetőség érdekében. + +## 4. Multi-Account & Identity Linking +A felhasználók több e-mail címet is csatolhatnak egyetlen profilhoz, hogy könnyen válthassanak a magánszemély és a céges flotta-menedzser szerepkörök között. + +### 4.1 Szabályrendszer +* **Limit:** Egy felhasználói profilhoz maximum **3** másodlagos e-mail cím csatolható. +* **Elsődleges cím:** Ez a belépési azonosító és a hivatalos értesítési cím. +* **Context Switching:** A felhasználó a fejlécben válthat a "Személyes" és a "Céges" nézetek között (pl. Flotta Manager mód). + +### 4.2 Account Linking Folyamat +1. User belép az elsődleges fiókba. +2. `Settings -> Linked Accounts -> Add New`. +3. Rendszer küld egy megerősítő linket az új címre. +4. Ha a linkre kattint, az új cím hozzáadódik a `user_identities` táblához. +5. Ha az új címen már volt regisztráció: A rendszer felajánlja az **Account Merge** (Fiókegyesítés) lehetőségét (biztonsági kérdések után). + +```markdown +# 05. Authentication & Identity Specification + +## 5.2. Data Models (Identity) + +### 5.2.1. User Entity (`data.users`) +A technikai belépési pont. +- **id**: Integer (PK) +- **email**: String (Unique) +- **hashed_password**: String (Bcrypt) +- **role**: Enum (superadmin, admin, user, service, driver) +- **person_id**: FK -> `data.persons.id` (A TWINS kapcsolat) +- **preferred_language**: String (Default: 'hu') [ÚJ v1.2.5] +- **region_code**: String (Default: 'HU') [ÚJ v1.2.5] +- **is_active**: Boolean + +### 5.2.2. TWINS Concept Update +- A `User` (User) és `Person` (Shadow Identity) szétválasztása szigorú. +- Belépéskor a rendszer a `User` táblából olvassa ki a `preferred_language` és `region_code` beállításokat, és ezeket a Token válaszban visszaadja a Frontendnek. + +## 1.3 Shadow Identity & Merging Logic +A rendszer támogatja a "Ghost Person" (Árnyék személy) entitásokat. +- **Ghost Person:** Olyan `data.persons` rekord, amelyet a Robot 2 hozott létre nyilvános adatok (pl. cégjegyzék) alapján. +- **Identity Linkage:** Regisztrációkor a `AuthService.complete_kyc` kötelezően ellenőrzi a meglévő Ghost rekordokat (Adószám/Név egyezés). +- **Merge Action:** Találat esetén a rendszer összefűzi a technikai User fiókot a Ghost Person rekorddal, aktiválja a jogosultságokat, és megszünteti a Ghost státuszt. + +## 2. The Dual Entity Model (Person vs. User) + +A rendszer alapja a természetes személy (**Person**) és a felhasználói fiók (**User**) szigorú szétválasztása az adatbiztonság és az üzleti folytonosság érdekében. + +### 2.1 Person (A DNS - "Az Örök Személy") +A `persons` tábla rekordja soha nem törlődik teljesen (GDPR esetén anonimizálódik), így biztosítva a rendszer memóriáját. +* **Identity Hash:** Egyedi SHA256 lenyomat (`normalized(name + mother + birth_place + birth_date)`), amely megakadályozza a multi-account visszaéléseket és felismeri a visszatérő felhasználókat. +* **Örök Adatok:** + * `lifetime_xp`: A valaha szerzett összes tapasztalati pont. + * `penalty_points`: A büntetési szint (0-3). Ez nem nullázódik új regisztrációval! + * `social_reputation`: A közösségi megbízhatósági index (1.00 = 100%). + * `is_sales_agent`: Jogosult-e jutalékra. + +### 2.2 User (A Kulcs - "A Munkamenet") +A `users` tábla a belépési pont. Törölhető, eldobható, újraregisztrálható. +* **Kapcsolat:** Minden User egyetlen Person-höz tartozik (`person_id`). +* **Időkorlátos Jogok:** + * `subscription_plan`: FREE / PREMIUM / VIP. + * `subscription_expires_at`: A prémium funkciók lejárata. +* **Sales Kapcsolat:** + * `referral_code`: Saját meghívó kód. + * `current_sales_agent_id`: Ki kapja a "Farming" jutalékot ez után a felhasználó után. + +### 2.3 Jogosultsági Szintek (Scope-Based RBAC) +A jogosultság nem csak szerepkör (Role), hanem hatókör (Scope) alapú: +1. **Global:** Superadmin. +2. **Country:** Országos Admin (pl. HU). +3. **Region:** Régiós Admin (pl. Pest megye). +4. **Entity:** Szerviz Tulajdonos (saját cég). +5. **Individual:** Átlagfelhasználó (saját adatok). \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/V01_gemini/06_Database_Guide.md b/archive/2026.02.18 Archive_old_mapps/V01_gemini/06_Database_Guide.md new file mode 100755 index 0000000..5c313f9 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_gemini/06_Database_Guide.md @@ -0,0 +1,223 @@ +# 🗄️ 06_DATABASE_GUIDE & DATA INTEGRITY (v1.4) + +Ez a dokumentum az adatbázis-architektúra alapelveit és az adatintegritási szabályokat tartalmazza. + +## 1. Soft Delete & Újraregisztráció Logika +A rendszerben **nincs fizikai törlés**. A `data.users` tábla speciális indexeléssel kezeli a törölt és visszatérő felhasználókat. + +- **Indexelés:** Az `email` mezőn egy *Partial Unique Index* (`idx_user_email_active_only`) található. +- **Működés:** - Ha `is_deleted = FALSE`, az email foglalt, nem használható újra. + - Ha a felhasználó törli magát (`is_deleted = TRUE`), az email felszabadul. +- **Identitás megőrzése:** Új regisztrációkor a rendszer új `user_id`-t generál, de ha a KYC (személyazonosító) adatok egyeznek, az új technikai User a régi `person_id`-hoz kapcsolódik. + +--- + +## 2. Person (Identitás) - KYC & Safety +A `data.persons` tábla a valós, banki szintű személyazonosságot tárolja. + +### 2.1. JSONB struktúrák +Rugalmas adatszerkezet az okmányok és orvosi adatok kezelésére: +- **`identity_docs`**: + - `id_card`: szám és lejárati dátum. + - `driver_license`: szám, lejárat és kategóriák (pl. ["A", "B", "C"]). + - `special_permits`: hajó- vagy repülőgép-vezetői engedélyek. +- **`medical_emergency`**: Vércsoport, allergiák, krónikus betegségek. + +### 2.2. Jutalom Trigger +A profil 100%-os kitöltése (név, születési adatok, okmányok) után automatikusan aktiválódik a `system_settings`-ben meghatározott **PRÉMIUM** időszak (alapértelmezett: 14 nap). + +--- + +## 3. Technikai Integritás és Séma +### 3.1. Adatbázis sémák +- **`public`**: Csak technikai metaadatok (pl. `alembic_version`). +- **`data`**: Az üzleti logika összes táblája (55+ tábla). + +### 3.2. Fejlesztői megjegyzések +- **Enum Case Sensitivity:** A Postgres `userrole` típusa **kisbetűérzékeny**. A Python kódból érkező értékeket (pl. `user`, `admin`) kényszerítve kisbetűvel kell rögzíteni. +- **Séma Frissítés:** A `metadata.create_all` nem frissíti a meglévő táblákat. Új oszlopok esetén manuális `ALTER TABLE` vagy Alembic migráció szükséges. +- **Audit:** Minden státuszmódosítás és adatváltozás snapshot-olva kerül az `audit_logs` táblába. + +--- + +## 4. Economy, Regionalizáció és Valuta +A rendszer EU-s piacra optimalizált multi-currency logikát használ. + +- **`data.regional_settings`**: Országkódok (ISO 3166-1), alapértelmezett nyelvek és pénznemek. +- **`data.exchange_rates`**: Napi frissítésű váltószámok (Bázis: EUR). +- **Valuta Logika:** Minden költséget elmentünk helyi pénznemben (`currency_code`) és a rögzítéskori váltószámmal átszámított EUR-ban is. +- **Képlet:** $$Cost_{EUR} = Cost_{Local} \cdot ExchangeRate$$ + +### 4.1. Wallet & Economy +- **Wallets:** Minden regisztrációkor létrejön egy rekord a `data.wallets` táblában (0 Coin, 0 XP). +- **Referral Snapshot:** Jutalék kifizetésekor a rendszer rögzíti a tranzakció pillanatában érvényes `%`-ot (`commission_percentage`), védve az adatot a későbbi módosításoktól. + +--- + +## 5. Flotta és Tulajdonjog Szabályok +A flották (Organization) és járművek tulajdonjogi logikája: + +- **Átruházhatóság (Transferability):** + - `INDIVIDUAL` flotta: Nem átruházható, a felhasználóhoz kötött. + - `FLEET_OWNER / SERVICE` flotta: Átruházható, új tulajdonoshoz (`owner_id`) rendelhető. +- **Cég Megszűnése:** Soft delete (`is_active: False`). A járművek életútja (history) megmarad a visszakövethetőség miatt. +- **Opcionális Járművek:** Egy flotta létezhet jármű rögzítése nélkül is (pl. tisztán menedzseri kör). + +--- + +## 6. Szervezeti Egységek és CRM +A flottákhoz tartozó humán és üzleti kapcsolatok kezelése. + +- **`data.organizations`**: Bővítve: `tax_number`, `reg_number`, `headquarters_address`, `notification_settings` (JSONB). +- **`data.organization_contacts`**: Mini-CRM funkciók (kapcsolattartók típusai: billing, primary, operational). +- **Kapcsolódás:** `external_crm_id` mező biztosítja az API kapcsolatot külső ERP rendszerekkel. + +--- + +## 7. Gazdasági Izoláció és Rating +- **Gamification Korlát:** Csak `INDIVIDUAL` típusú flottákhoz tartozó `Person`-ok gyűjthetnek XP-t. A cégek (`Company`) nem kapnak `XP_Ledger`-t és `Coin_Wallet`-et. +- **Validáció:** Cég nem validálhat szervizpontot, csak a hozzárendelt, azonosított `Person` (technikus). +- **Rating Rendszer:** Külön értékelést kap a **Person** (megbízhatóság), a **Service** (minőség) és a **Vehicle** (műszaki állapot). A cég hírneve ezekből adódik össze. + +--- + +## 8. Dinamikus Paraméterezés (`data.system_settings`) +Minden üzleti változó az Admin UI-ról állítható: +- `auth.reward_days`: Regisztrációs prémium hossza (default: 14). +- `auth.reward_tier`: Kapott csomag típusa (default: PREMIUM). +- `referral.l1`: Első szintű jutalék mértéke (default: 10%). + +--- + +## 9. Kulcs Táblacsoportok +1. **Fleet:** `vehicles`, `user_vehicles`, `vehicle_events`, `engine_specs`. +2. **Marketplace:** `service_providers`, `service_specialties`, `organization_locations`. +3. **Economy:** `wallets`, `transactions`, `shop_items`. +4. **Identity:** `users`, `persons`, `companies`. + +--- + +## 10. Migrációs Állapot (Dev Info) +- **Eszköz:** Alembic +- **Current Head:** `10b73fee8967` +- **Hiányzó láncszem:** A `persons` tábla véglegesítése és a meglévő `users` tábla adatintegrációs migrációja folyamatban. + +## 4.2 Dokumentum és Irattár (Vault Logic) +- **Központi tárolás:** A `data.documents` tábla kezeli az összes csatolmányt (parent_type: 'org', 'asset', 'person'). +- **Metadata:** Tároljuk a dokumentum kibocsátóját (issuer_id) és tárgyát (subject_id) a szervizstatisztikákhoz. +- **Verifikáció:** `status` mező (pending, verified, rejected). + +## 4.3 Crowdsourced Szervezetek +- **Lifecycle:** draft_user -> draft_bot -> community_verified -> official. +- **Gamification:** XP/Kredit jóváírás csak sikeres Bot vagy Owner validáció után. + +## 6. Service & Organization Extensions (V2) + +### 6.1 `data.system_configs` (Dinamikus Beállítások) +Kódba égetett értékek helyett adatbázisból vezérelt működés. +* `key` (VARCHAR): Pl. `referral_bonus_L1`, `exchange_rate_EUR`, `payout_threshold`. +* `value` (JSONB): Pl. `{"amount": 10, "unit": "percent"}`, `{"rate": 400.0}`. +* `is_active` (BOOLEAN). + +### 6.2 `data.service_reviews` (Okos Értékelés) +* `user_id`, `organization_id`. +* `rating` (1-5). +* `proof_url` (Számla/Munkalap fotó URL). +* `is_active` (BOOLEAN): Csak az aktív számít bele az átlagba (lásd Gamification logika). + +### 6.3 `data.wallet_transactions` +* `original_currency`: (HUF, EUR, USD). +* `exchange_rate`: Az adott pillanatban érvényes váltószám. + +## 7. Referrals & Invitations +* `data.referrals`: Hierarchikus fa szerkezet (`inviter_id`, `invitee_id`, `level`). +* `data.invitations`: + * `code`: Random string (pl. `X7K9P2`). + * `type`: 'private' (72h) vagy 'company' (168h). + * `target_role`: A meghívott jogosultsága (Driver, Manager). + +## 8. Virtual Goods & Inventory (Digitális Javak) + +### 8.1 `data.user_inventory` +Ez a tábla tárolja a felhasználó által megszerzett vagy vásárolt kozmetikai elemeket (NEM jogosultságok, hanem vagyontárgyak). + +* `id` (UUID): Egyedi azonosító. +* `user_id` (FK): A tulajdonos. +* `item_id` (VARCHAR): A katalógusban lévő azonosító (pl. `avatar_frame_neon`). +* `metadata` (JSONB): Opcionális egyedi tulajdonságok (pl. sorszámozott NFT-szerű elemknél: `{"serial": 42}`). +* `acquired_at` (TIMESTAMP): Mikor szerezte. +* `is_equipped` (BOOLEAN): Éppen használja-e (pl. ez az aktív avatar kerete). + +### 8.2 Shop Catalog Configuration (`system_configs`) +A `key = 'shop_catalog'` alatt tároljuk a bolt kínálatát JSON formátumban. + +**Példa JSON struktúra:** +```json +{ + "categories": ["avatars", "badges", "profile_themes"], + "items": { + "badge_early_adopter": { + "name": "Korai Felfedező", + "price": 0, + "currency": "free", + "condition": "reg_date < '2025-01-01'", + "image_url": "/assets/badges/early.png" + }, + "frame_gold_mechanic": { + "name": "Arany Szerelő Keret", + "price": 5000, + "currency": "credit", + "rarity": "legendary", + "effect": "shine_animation", + "image_url": "/assets/frames/gold.png" + } + } +} + +## 5. Geo-Location and Address Master Data +A rendszer normalizált címkezelést alkalmaz az adatminőség biztosítása érdekében. + +### 5.1 Geo Adattáblák +- `data.geo_postal_codes`: ZIP és Település kapcsolata (Unique: country + zip + city). +- `data.geo_streets`: Utcanevek listája, ZIP azonosítóhoz kötve. +- `data.geo_street_types`: Közterület típusok szótára (út, utca, tér...). + +### 5.2 GIS Adatok +Minden telephely koordinátája `GEOGRAPHY(POINT, 4326)` típusként van tárolva, amely lehetővé teszi a PostGIS alapú távolságmérést. + +### 5. Hibrid Címkezelési Modell +A rendszer az adatintegritás és a sebesség érdekében hibrid modellt használ. + +- **Centralizált adattárolás**: A `data.addresses` tábla tárolja a normalizált címeket (UUID alapú). +- **Öntanuló szótárak**: A `data.geo_postal_codes` és `data.geo_streets` táblák automatikusan bővülnek minden új rögzítésnél. +- **Denormalizált GPS adatok**: Az `organization_locations` tábla közvetlenül tárolja a koordinátákat a JOIN-nélküli PostGIS lekérdezésekhez. + +| Tábla | Funkció | +| :--- | :--- | +| `data.addresses` | Konkrét házszám szintű címek (Hibrid hivatkozási pont). | +| `data.geo_postal_codes` | Irányítószám és város kapcsolata (HU/EU támogatás). | +| `data.user_stats` | Felhasználói XP, szintek és strike-ok tárolása. | + +## 2.4 Financial & Enrichment Tables +- **data.organization_financials:** Éves gazdasági adatok (árbevétel, profit, létszám) tárolása historikus elemzéshez. +- **data.service_profiles.specialization_tags:** JSONB mező a szigorú szakmai szűréshez (pl. márkák, specifikus javítási típusok). +- **data.service_profiles.google_place_id:** Külső validációs kulcs a Google Places API-hoz. + + +### Identity & Economy Module (v1.6+) +* **`data.persons`**: Természetes személyek, Identity Hash, Örök XP/Büntetés. +* **`data.users`**: Login fiókok, Előfizetési idő, Sales kapcsolatok. +* **`data.wallets`**: 3-as osztású egyenleg (`earned`, `purchased`, `coins`). +* **`data.financial_ledger`**: Pénzügyi tranzakciók főkönyve. +* **`data.security_audit_logs`**: Biztonsági események és 4-szem jóváhagyások. +* **`data.org_sales_assignments`**: Cég-Üzletkötő kapcsolat (Farming jog). + +## 4. MDM és Jármű Katalógus Struktúra +A rendszer hibrid (Relációs + JSONB) modellt használ a skálázhatóság érdekében. + +### 4.1 Táblák: +* **data.vehicle_model_definitions**: A "Szent Grál". Tartalmazza a márka, kód, marketing név mellett a fix numerikus adatokat (ccm, kw, weight) a gyors szűréshez. +* **data.feature_definitions**: Globális szótár az összes extráról (ABS, Halradar, Retarder stb.), kategóriákba sorolva. +* **data.model_feature_maps**: Összeköti a modellt az extrákkal. + - `availability`: [STANDARD, OPTIONAL, ACCESSORY] +* **data.vehicle_model_reviews**: Felhasználói vélemények a típusról (1-5 csillag, szöveges). \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/V01_gemini/07_API_Guide.md b/archive/2026.02.18 Archive_old_mapps/V01_gemini/07_API_Guide.md new file mode 100755 index 0000000..6a93e72 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_gemini/07_API_Guide.md @@ -0,0 +1,78 @@ +# 🔌 07_API_GUIDE + +## 1. Verziózás (Versioning) +A rendszer támogatja a többszintű verziókezelést a stabilitás és a visszafelé való kompatibilitás érdekében. +- **v1:** Core Fleet funkciók (pl. `/api/v1/vehicles`, `/api/v1/expenses`). +- **v2:** Auth és új generációs modulok (pl. `/api/v2/auth/login`). + +--- + +## 2. Route Inventory (Kiemelt Végpontok) +Az alábbi táblázat tartalmazza a legfontosabb útvonalakat: + +| Metódus | Végpont | Leírás | +| :--- | :--- | :--- | +| `POST` | `/api/v2/auth/register` | Regisztráció Person rekord létrehozásával | +| `GET` | `/api/v1/fleet/vehicles` | Felhasználó saját járműveinek listázása | +| `POST` | `/api/v1/search/match` | Szervizkereső algoritmus indítása | +| `POST` | `/api/v1/evidence/upload` | Dokumentum feltöltés (MinIO) | + +--- + +## 3. Hiba Kezelés (Error Handling) +A frontendnek az alábbi HTTP státuszkódok alapján kell lekezelnie a kivételeket: +- **401:** Token lejárt -> Frontendnek automatikusan a Login oldalra kell dobnia a felhasználót. +- **403:** Jogosultság hiba -> "Nincs jogod ehhez a funkcióhoz" üzenet megjelenítése (Tier limit/Role hiba). +- **404:** Resource not found -> Az erőforrás nem található vagy Soft Deleted állapotban van. + +--- + +## 4. Nemzetköziesítés (i18n) és Lokalizáció +A rendszer a "Global-Local" elv alapján működik. **Tilos a programkódban (hard-coded) szöveges üzeneteket elhelyezni.** + +### 4.1. Nyelvi fájlok struktúrája +Minden nyelvi fájl a `backend/app/locales/` mappában található, szabványos JSON formátumban. +- **Példa fájlok:** `hu.json`, `en.json`, `de.json`. + +### 4.2. Kezelési szabályok +- **Backend:** A rendszerüzeneteket, hibaüzeneteket és az e-mail sablonok tartalmát a `LocaleManager` szolgáltatáson keresztül kéri le. +- **Paraméterezés:** A szövegekben használható változók formátuma: `{variable_name}`. +- **Sablonkezelés:** Az e-mailek HTML vázát és a JSON-ban tárolt szöveges blokkokat a rendszer a küldés előtt fűzi össze. + +### 4.3. Nyelvválasztás logikája (Prioritás) +1. A kérés fejlécében érkező `Accept-Language` alapján. +2. Bejelentkezett felhasználó esetén a `User.region_code` alapján. +3. Alapértelmezett: `hu`. + +--- + +## 5. Unified Registration & Security Protocol +A rendszer a **"Minimal Friction, Maximum Security"** elvét követi. + +### 5.1. Regisztrációs Életciklus +1. **Step 1 (Lite):** `Email`, `Jelszó`, `Név` megadása. Létrejön a `User` és `Person` rekord. Állapot: `is_active: false`. +2. **Verifikáció:** A rendszer UUID alapú tokent generál (48 órás élettartam). A felhasználó e-mailben kap egy aktiváló linket. +3. **Step 2 (KYC):** Sikeres verifikáció után a felhasználó megadja az okmányait (Személyi/Jogsi/Hajó). +4. **Aktiválás:** Létrejön a **Privát Flotta (Privát Széf)** és a hozzá tartozó `Wallet`. Állapot: `is_active: true`. + +### 5.2. Token Biztonsági Előírások +- **Regisztrációs Token:** 48 óra élettartam. +- **Jelszó-visszaállítási Token:** 1 óra élettartam. + +### 5.3. Rate Limiting (Robotvédelem és Költségkontroll) +Az e-mail küldési folyamatokra az alábbi korlátok vonatkoznak: +- **Retry Cooldown:** Újraigénylés legkorábban 60 másodperc után lehetséges. +- **Óránkénti Limit:** Maximum 3 kérelem / e-mail cím. +- **Napi Limit:** Maximum 10 kérelem / e-mail cím. +- **Zárolás:** A napi limit túllépése esetén a fiók biztonsági okokból 24 órára zárolja a küldési funkciót az adott címre. + +### 4. Geo és Kereső Végpontok + +#### GET `/api/v1/services/suggest-street` +- **Cél**: Autocomplete támogatás a frontendnek. +- **Paraméterek**: `zip_code` (string), `q` (részleges utcanév). + +#### GET `/api/v1/services/search` +- **Cél**: Kétlépcsős szervizkereső. +- **Free mód**: Légvonalbeli távolságmérés (Radius). +- **Premium mód**: Útvonal-idő alapú kalkuláció és forgalmi becslés. \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/V01_gemini/07_REGISTRATION_INVITATION_AND_API.md b/archive/2026.02.18 Archive_old_mapps/V01_gemini/07_REGISTRATION_INVITATION_AND_API.md new file mode 100755 index 0000000..1009d4d --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_gemini/07_REGISTRATION_INVITATION_AND_API.md @@ -0,0 +1,136 @@ +# 🏁 07_REGISTRATION_INVITATION_AND_API (v1.4) + +## 1. Kétlépcsős Onboarding Folyamat +A rendszer a felhasználói élmény (UX) és a banki szintű biztonság érdekében két fázisra bontja a regisztrációt, amelyet egy atomi tranzakció zár le. + +### 1.1. Fázis: "Lite" Regisztráció (Step 1) +* **Végpont:** `POST /api/v1/auth/register` +* **Cél:** Gyors belépés és a technikai User fiók létrehozása. +* **Kötelező adatok:** Email, Jelszó, Vezetéknév, Keresztnév, Régiókód. +* **Rendszeresemények:** + * Létrejön a `data.users` rekord `is_active = False` állapottal. + * **Szerepkör:** Kényszerített kisbetűs `user` (Postgres Enum kényszer). + * **Megerősítés:** Aktiváló email küldése egyedi hash kóddal. + * **Válasz:** JWT token `status: pending_kyc` flaggel (korlátozott jogosultság). + +### 1.2. Fázis: Banki KYC & Adatgyűjtés (Step 2) +* **Végpont:** `POST /api/v1/auth/complete-kyc` +* **Kötelező KYC adatok (Identity Verification):** + * **Személyes:** Anyja születési neve, születési hely és idő. + * **Okmányok:** Személyi igazolvány száma és lejárati ideje. + * **Jogosítvány:** Vezetői engedély száma, lejárata és kategóriák (pl. AM, A, B, C, CE). + * **Speciális:** Hajóvezetői és repülőgép-vezetői engedélyek (ha releváns). + +### 1.3. Fázis: Atomi Tranzakció (Finalization) +A KYC adatok beküldésekor a rendszer egyetlen megszakíthatatlan folyamatban hajtja végre: +1. **Person létrehozása:** Identitás rögzítése JSONB dokumentumtárral a `data.persons` táblába. +2. **Wallet inicializálás:** Pénztárca nyitása 0 Coin és 0 XP egyenleggel. +3. **Privát Flotta (Private Org):** Automatikus szervezet létrehozása (`OrgType.INDIVIDUAL`), amely **nem átruházható** (`is_transferable = False`). +4. **Aktiválás:** `is_active = True` státusz beállítása és teljes hozzáférés biztosítása. +5. **Audit:** Bejegyzés az `audit_logs` táblába. + +--- + +## 2. Meghívó és Jutalék Logika (Invitation Engine) +A rendszer támogatja a többszintű ajánlói rendszert és a szervezeti meghívókat. + +### 2.1. Meghívó Típusok +- **`REG_ONLY`**: Általános meghívó, amely beköti az új felhasználót a 10-5-2%-os jutalék láncba. +- **`COMPANY_JOIN`**: Meghatározott szervezetbe hív (pl. CEO, Flotta Manager vagy Sofőr szerepkörbe). + +### 2.2. Jutalék Számítás +A százalékos mérték a tranzakció pillanatában érvényes admin beállítások alapján rögzül (Snapshot). A jóváírandó kredit ($C$): + +$$C = P_{amount} \cdot \frac{R_{level}}{100}$$ + +*Ahol $P$ a befizetett összeg, $R$ pedig az aktuális szint (10, 5 vagy 2) értéke.* +**Szabály:** Csak az **első** Prémium csomag befizetésekor történik jutalékfizetés a láncban. + +--- + +## 3. Technikai és Biztonsági Szabályok +### 3.1. Adatbázis és Enum Kezelés +- **Enum Case Sensitivity:** A PostgreSQL `userrole` típusa miatt minden értéket (pl. `user`, `admin`, `driver`, `service`) szigorúan **kisbetűvel** kell rögzíteni. +- **Dinamikus Paraméterek:** Tilos a hardcoded értékek használata. Az alábbiakat a `data.system_settings` táblából kell lekérni: + - `auth.reward_days`: Regisztrációs prémium hossza (default: 14). + - `referral.level1-3`: Jutalék szintek mértéke. + +### 3.2. Email Manager Protokoll (TypeError Fix) +- **Szabály:** A `send_email` hívásakor **tilos** a `subject` paraméter kézi átadása. +- **Logika:** A szerviz a `template_key` alapján automatikusan generálja a tárgyat a belső szótárából. + +### 3.3. Social Auth (Google / Facebook) +- A Step 1 lerövidül, de a **Step 2 (KYC) kötelező** marad az aktiváláshoz. +- Amíg a KYC hiányzik, a felhasználó "GUEST" státuszban marad, korlátozott funkciókkal. + +--- + +## 4. Jelszó Helyreállítási Protokoll (Recovery) +A rendszer két biztonsági szintet különít el: + +| Szint | Megnevezés | Logika | +| :--- | :--- | :--- | +| **A** | Standard | Email alapú visszaállítás ideiglenes tokennel. | +| **B** | Szigorú (Banki) | Kötelező: Név, Anyja neve, Okmány szám. Ellenőrzés után SMS (telefonszám) vagy Email link. | + +--- + +## 5. Corporate Onboarding (Céges Regisztráció) +Célja, hogy egy létező Person saját szervezetet (Organization) alapítson. +- **Validáció:** Kötelező adószám ellenőrzés (HU formátum + VIES API lekérdezés). +- **Hierarchia:** A regisztráló automatikusan `owner` rangot kap. +- **Izoláció:** Minden cég saját mappastruktúrát kap a NAS-on az okmányok fizikai elkülönítése érdekében. + +--- + +## 6. Kormányozhatóság és .env Konfiguráció +A biztonsági paraméterek környezeti változókon keresztül szabályozhatók: + +| Paraméter | Leírás | Alapértelmezett | +| :--- | :--- | :--- | +| `REGISTRATION_TOKEN_EXPIRE_HOURS` | Aktiválásra álló idő | 48 óra | +| `PASSWORD_RESET_TOKEN_EXPIRE_HOURS` | Visszaállítási időablak | 1 óra | + +--- + +## 7. API Végpontok (Baseline v1) +- `POST /api/v1/auth/register`: Komplett onboarding indítása. +- `POST /api/v1/auth/complete-kyc`: KYC adatok beküldése és aktiválás. +- `POST /api/v1/auth/invite/send`: Meghívó generálása. +- `GET /api/v1/auth/invite/verify/{token}`: Token validálása. +- `POST /api/v1/auth/recover-identity`: Szigorú (KYC alapú) helyreállítás. + +## 5. Invitation Logic Specifications + +### 5.1 Meghívó Kódok +* **Formátum:** Véletlenszerű alfanumerikus string (pl. `A8B2X9`). NEM tartalmazhat személyes adatot. +* **Generálás:** Minden "Meghívás" gombnyomásra új, egyedi token generálódik. + +### 5.2 Lejárati Idők (TTL) +A meghívók érvényessége a típustól függ: +* **Magánszemély (C2C):** 72 óra (3 nap). Sürgető érzést kelt. +* **Céges / Flotta (B2B):** 168 óra (1 hét). Figyelembe veszi a lassabb céges ügymenetet. + +### 5.3 Biztonság +* A meghívó link tartalmaz egy aláírt JWT tokent, amely rögzíti a `target_org_id`-t (melyik flottába hívjuk) és a `role`-t (pl. sofőr). +* A kód felhasználása után a link érvénytelenné válik (One-time use). + +## 1. Háromlépcsős Onboarding (v1.5) + +### 1.1 Step 1: Lite Registration +- Technikai `User` létrehozása (inaktív). Email ellenőrzés indítása. + +### 1.2 Step 2: Individual Setup (Privát Identitás) +- **Cél:** A természetes személy (`Person`) és privát szférájának rögzítése. +- **Művelet:** - `Person` rögzítése/frissítése. + - Privát `Organization` létrehozása (`org_type='individual'`, `is_ownership_transferable=False`). + - **Központi Telephely (Main Branch)** létrehozása a lakcím alapján. + - Privát Flotta és Wallet inicializálása. + +### 1.3 Step 3: Business Setup (Céges Identitás) +- **Cél:** Államilag nyilvántartott gazdasági egység rögzítése. +- **Művelet:** + - Adószám bekérése + VIES/Cégjegyzék ellenőrzés. + - Új, különálló `Organization` létrehozása (`org_type='business'`, `is_ownership_transferable=True`). + - Székhely rögzítése mint **Main Branch**. + - Opcionális további telephelyek rögzítése. \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/V01_gemini/08_Frontend_Guide.md b/archive/2026.02.18 Archive_old_mapps/V01_gemini/08_Frontend_Guide.md new file mode 100755 index 0000000..f88361c --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_gemini/08_Frontend_Guide.md @@ -0,0 +1,15 @@ +(UI irányelvek.) +# 🖥️ FRONTEND GUIDE + +## Tech Stack +- Vue 3 (Composition API) + Vite. +- Tailwind CSS (Utility-first design). +- Pinia (State Management). + +## Konfiguráció +**SOHA** ne használj hardkódolt IP címet a kódban! +Használd a `.env` fájlt: `VITE_API_BASE_URL=https://dev.profibot.hu/api` + +## UI Logika +- **Dumb Frontend:** Nem döntünk jogosultságról. Ha a backend azt mondja `can_edit: false`, a gombot letiltjuk. +- **Offline Mód (Terv):** Service Worker (PWA) segítségével rögzítés net nélkül -> Sync, amint van hálózat. \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/V01_gemini/09_Admin_API_Guide.md b/archive/2026.02.18 Archive_old_mapps/V01_gemini/09_Admin_API_Guide.md new file mode 100755 index 0000000..d3a8d15 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_gemini/09_Admin_API_Guide.md @@ -0,0 +1,35 @@ +# 🛠️ ADMIN MANAGEMENT & PERMISSIONS (v1.0) + +## 1. Adminisztrátori Hiearchia és Területi Felosztás +A rendszer többszintű, régió-alapú jogosultságkezelést alkalmaz (RBAC + Geographic Scope). + +| Szint | Megnevezés | Területi hatókör | Jogkörök jellege | +| :--- | :--- | :--- | :--- | +| **L0** | **SuperAdmin** | Globális (Összes ország) | Teljes hozzáférés, Rendszer-paraméterezés, Admin kinevezés. | +| **L1/A** | **Global Director** | Régiós (Több ország) | Országos vezetők felügyelete, aggregált statisztikák. | +| **L1/B** | **National Manager** | Országos (pl. HU) | Saját ország moderátorainak és adatainak teljes kezelése. | +| **L2** | **Staff (Mod/Supp/Fin)** | Lokális / Szakaszolt | Operatív feladatok (VIES, support jegyek, kifizetések). | +| **L3** | **Task Moderator** | Feladat-specifikus | Sablon alapú, korlátozott hozzáférés (pl. csak szerviz validálás). | + +**Verseny Logika:** Az L1/B szintű vezetők látják más országok aggregált KPI mutatóit (statisztika), de nem látnak bele a konkrét személyes vagy céges adatokba. + +## 2. Jogosultságkezelés és Sablonok +- **Permissions Table:** Elemi jogosultságok tárolása (pl. `approve_vies`, `modify_credits`). +- **Role Templates:** Előre definiált sablonok az egyszerű beállításhoz (pl. "Senior Financial - DE"). +- **Regionális Izoláció:** Az adminisztrátorok alapértelmezetten csak a hozzájuk rendelt `ISO_country_code` alá tartozó adatokat módosíthatják. + +## 3. Biztonság és "Kill-Switch" Protokoll +- **MFA/2FA:** A második bejelentkezéstől kezdve kötelező a TOTP (Google Authenticator) használata. +- **Social Auth:** Adminok számára is engedélyezett (Google/FB), de nem váltja ki a kötelező 2FA-t. +- **Anomaly Score (Fekete Doboz):** + - Minden kattintást és módosítást logolunk (`audit_logs`). + - Kritikus viselkedés (pl. tömeges törlés) esetén a rendszer automatikusan felfüggeszti az admint. + - **SuperAdmin Recovery:** A SuperAdmin visszaállítása csak egyedi Offline Kulccsal és regisztrált eszközzel lehetséges. + - **Értesítési lánc:** Tiltáskor a felette álló szintek azonnali riasztást kapnak. + +## 4. Visszaállíthatóság (State Snapshot) +Minden módosítás előtt a rendszer menti az aktuális rekord állapotát (JSON). Bármilyen károkozás vagy hiba esetén az L0/L1 szintű adminisztrátorok egy gombnyomással visszaállíthatják az eredeti adatokat. + +## 5. Adminisztrátori Meghívók +- Adminisztrátort csak kézi meghívóval lehet felvenni. +- **Lejárati idő:** Minden admin meghívó token 24 óráig érvényes. \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/V01_gemini/10_Billing_Credits_Subscriptions.md b/archive/2026.02.18 Archive_old_mapps/V01_gemini/10_Billing_Credits_Subscriptions.md new file mode 100755 index 0000000..58f9198 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_gemini/10_Billing_Credits_Subscriptions.md @@ -0,0 +1,140 @@ +# 💰 10_BILLING_CREDITS_SUBSCRIPTIONS (v1.2) + +## 1. Regionális és Valuta Logika (EU Scope) +A rendszer többnyelvű és többvalutás elszámolást alkalmaz. Minden tranzakció kettős értéktárolással valósul meg az adatintegritás érdekében. + +- **Local Cost:** A felhasználó régiója szerinti pénznemben rögzített összeg. +- **Standard Cost (EUR):** A rögzítés pillanatában érvényes árfolyamon számolt alapérték. + +**Átszámítási képlet:** +$$Cost_{EUR} = Cost_{Local} \cdot ExchangeRate$$ + +--- + +## 2. Előfizetési Csomagok és Business Synergy +A rendszer korlátait a `data.system_settings` tábla szabályozza. A csomagok skálázhatóak a flotta méretétől függően. + +| Csomag | Jármű Limit | Kiemelt funkciók | +| :--- | :--- | :--- | +| **FREE** | 1 db | Alap költségnapló, GEO alapú szervizkereső. | +| **PREMIUM** | 3 db | Dokumentumtár, export funkciók, útvonal alapú kereső. | +| **PREMIUM+** | 5 db | Flotta statisztika, TCO (Total Cost of Ownership) elemzés. | +| **VIP / VIP+** | 10+ db | Egyedi szervizkezelés, bővíthető slotok, prioritásos support. | + +### 2.1. VIP Synergy Szabályok (Ösztönző rendszer) +- **Synergy Discount:** Ha egy `FLEET_OWNER` aktív **VIP** vagy **VIP+** előfizetéssel rendelkezik, **15% kedvezményt** kap minden vásárlásra a saját privát flottájában is. +- **Ajándék Kredit:** VIP vásárláskor extra kreditek járnak (felhasználható: skinek, medálok, privát Prémium csomag). +- **Időbeli korlát:** A privát kedvezmények időtartama **2-6 hónapra korlátozott**, ösztönözve a folyamatos aktivitást. + +--- + +## 3. Voucher és Kupon Rendszer +A kedvezmények igénybevétele manuális kódbeíráshoz kötött. Minden felhasználást auditálni kell (`redeemed_at`, `user_id`, `original_price`). + +- **Gift Card (Fix Kredit):** Meghatározott összegű jóváírás (pl. 5000 Ft). +- **Subscription Coupon (%):** Százalékos kedvezmény az előfizetési díjból egy adott időszakra. +- **Lejárat:** Minden kupon rendelkezik fix érvényességi idővel, amely után inaktívvá válik. + +--- + +## 4. MLM Jutalomrendszer (Referral) +A rendszer jutalmazza a sikeres meghívásokat az új tag **első** befizetése után. A százalékos érték a tranzakció pillanatában rögzül (Snapshot). + +- **1. szint (Közvetlen):** 10% jóváírás. +- **2. szint:** 5% jóváírás. +- **3. szint:** 2% jóváírás. + +--- + +## 5. Invitation Engine (Meghívó Rendszer) +A spam elleni védelem érdekében a meghívók élettartama és mennyisége korlátozott: + +- **Token Lejárati idők:** + - **Felhasználói (User) meghívó:** 72 óra. + - **Adminisztrátori meghívó:** 24 óra. +- **Mennyiségi korlát:** Kezdő keret felhasználónként (alapértelmezett: 10 vagy 20 db). +- **Anti-Spam Logika:** A felhasználó csak sikeres regisztrációk után kap vissza új meghívási lehetőségeket (slotokat). + +--- + +## 6. Evidence & Trust Engine (Hitelesítés) +A rendszerben a "Verified" (hiteles) státusz eléréséhez bizonyítékok szükségesek. + +- **Kötelező bizonyítékok:** Munkalap fotó, számlakép és kilométeróra-állás fotó. +- **GPS Check-in:** A szerviz eseménykor igazolni kell a helyszíni tartózkodást. +- **Validáció:** Cég mint entitás nem hitelesíthet; a validálást mindig egy azonosított **Person** végzi. + + + +--- + +## 7. Lejárat és Pénzügyi Helyreállítás +Ha az előfizetés lejár, a rendszer az alábbi fokozatos korlátozásokat vezeti be: + +1. **Grace Period (30 nap):** Csak adatrögzítés lehetséges, a statisztikai modulok és exportok zárolva vannak. +2. **Zárolás (60 nap):** A fiók írásvédetté válik (Read-only). Nincs új adatrögzítés. +3. **Helyreállítás:** 6 hónapon belüli visszamenőleges befizetés esetén minden korábbi adat és funkció azonnal újraaktiválódik. + +## 4. Economic Model & Exchange Rates + +### 4.1 Dinamikus Árfolyamok (Admin Config) +A rendszer támogatja a többvalutás elszámolást. Az átváltási arányok a `system_configs` táblából jönnek. +* **Példa konfiguráció:** + * 1 HUF = 50 Kredit + * 1 EUR = 20.000 Kredit (változtatható) + * 1 USD = 18.500 Kredit + +### 4.2 Referral Commission (Admin Config) +A jutalékrendszer paraméterezhető, alapértelmezett értékei: +* **Level 1 (Közvetlen):** 10% +* **Level 2:** 5% +* **Level 3:** 2% +* *Megjegyzés:* Adminisztrátori joggal ezek bármikor módosíthatók, visszamenőleges hatály nélkül. + +### 4.3 Kifizetés (Payout) +* **Threshold:** A kifizetés igénylésének alsó határa alapértelmezetten **1.000.000 Kredit**. +* Ez az érték adminisztrátori döntéssel csökkenthető/növelhető a rendszer érettségétől függően. + + +## 5. Marketplace & Vanity Items + +### 5.1 Árazási Logika +A rendszer támogatja a dinamikus árazást a kozmetikai elemeknél is. +* **Fix áras termékek:** Egyszerű levonás a `coin_balance`-ból vagy `credit_balance`-ból. +* **Időszakos ajánlatok:** A katalógusban beállítható `sale_price` és `sale_end_date`. + +### 5.2 Vásárlási Folyamat +1. **Check:** Van-e elég fedezet (Wallet)? +2. **Deduct:** Tranzakció rögzítése a `wallet_transactions` táblában (`type='purchase_item'`). +3. **Grant:** Tétel beírása a `user_inventory` táblába. +4. **Equip:** Opcionálisan azonnali beállítás (pl. profilkép keret). + +### 5.3 Bővíthetőség +Új elem hozzáadásához **nem kell kódot módosítani**, csak a `shop_catalog` JSON-t kell frissíteni az Admin felületen. A kliens alkalmazás (App/Web) dinamikusan tölti be a kínálatot ebből a JSON-ből. + +## 3. The Triple Wallet System (3-as Pénztárca) + +A `wallets` tábla három elkülönített alszámlát kezel a transzparencia érdekében: + +| Alszámla | Kód | Forrás | Felhasználás | Átváltható? | +| :--- | :--- | :--- | :--- | :--- | +| **Earned Credits** | `earned_credits` | Munka (validálás), Referral, Jutalék | Prémium funkciók, Szolgáltatás vásárlás | IGEN | +| **Purchased Credits** | `purchased_credits` | Bankkártyás feltöltés (Stripe) | Prémium funkciók, Szolgáltatás vásárlás | IGEN | +| **Service Coins** | `service_coins` | B2B Csomagok, Partneri jóváírás | **Kizárólag** Hirdetés, Kiemelés, Szponzoráció | **NEM** | + +## 4. Sales Commission Model (Hunting & Farming) + +Az üzletkötők ösztönzése két fázisban történik: + +### 4.1 Hunting (Vadász) Jutalék +* **Esemény:** Új fizető ügyfél behozatala (első tranzakció). +* **Mérték:** 10% (Alapértelmezett `system_parameter`). +* **Jóváírás:** Azonnal, `earned_credits` formájában. + +### 4.2 Farming (Gazda) Jutalék +* **Esemény:** Meglévő ügyfél havidíj megújítása. +* **Mérték:** 5% (Alapértelmezett `system_parameter`). +* **Átruházhatóság:** A jutalékot nem a User, hanem az `OrganizationSalesAssignment` tábla aktív rekordja határozza meg. Ha az üzletkötő kilép, a portfóliója (és a Farming joga) átruházható egy másik ügynökre. + +### 4.3 Financial Ledger (Pénzügyi Napló) +Minden tranzakció (Vásárlás, Jutalék jóváírás, Költés) bekerül a `financial_ledger` táblába, amely megmásíthatatlan (Append-only) és tartalmazza a `related_agent_id`-t a visszakövethetőségért. \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/V01_gemini/11_Gamification_Social.md b/archive/2026.02.18 Archive_old_mapps/V01_gemini/11_Gamification_Social.md new file mode 100755 index 0000000..e910ab1 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_gemini/11_Gamification_Social.md @@ -0,0 +1,147 @@ +(A Validációs Rendszer.) +# 🏆 GAMIFICATION & SOCIAL VALIDATION + +## 1. Validációs Logika (Q8) +- **Hivatalos Szerviz:** Számla/Munkalap feltöltése -> Automatikus Trust Score növekedés. +- **Magán/Sufni Javítás:** Rögzíthető, de "Low Trust" besorolást kap (csökkenti a jármű értékét), kivéve ha egy **Validátor** (High Rank User) igazolja. +- **Validátor:** Olyan felhasználó, aki magas XP szinttel rendelkezik. Feladata: Képek és adatok ellenőrzése kreditért. + +## 2. Véleményezés (Review) +- **Szabály:** Csak "Verified Visit" után lehet értékelni (GPS vagy Számla). +- **Fellebbezés:** A szerviz jelezheti, ha a vélemény valótlan. Ilyenkor a Moderátorok (vagy magas szintű Validátorok) döntenek. + +## 3. "Service Hunt" (Szerviz Vadászat) +A felhasználók játékosított formában validálják az adatbázist. + +### 3.1 Validációs Szabályok +* **Radius:** A felhasználónak **50-100 méteren** belül kell tartózkodnia a szerviz GPS koordinátáihoz képest a validáláshoz. +* **Jutalom:** Csak akkor jár, ha a validáció sikeres (GPS + Fotó). +* **Bot vs. Ember:** + * Ha a Bot találta a szervizt, de nincs validálva: A felhasználó megkapja a "Validator" bónuszt. + * Ha már validálva van (Status: Verified): A felhasználó látja a térképen, hogy "Már validálva", nem jár érte pont (kivéve adatfrissítés). + +### 3.2 Okos Értékelési Rendszer (Review Logic) +A rendszer védi a szolgáltatókat a "Review Bombing"-tól, de jutalmazza a konzisztenciát. + +* **Negatív élmény (1-3 csillag):** + * Egy felhasználótól **csak a legutolsó** negatív értékelés számít bele az átlagba. + * Ha a user újra értékel (mert visszament), az előző negatív értékelés `is_active = False` státuszba kerül (de az admin látja az előzményeket). +* **Pozitív élmény (4-5 csillag):** + * Minden pozitív értékelés számít és összeadódik (kumulatív). + * Ez ösztönzi a szervizt a folyamatos jó teljesítményre. + + ## 4. Social Flexing & Vanity Items +A "dicsekvési faktor" kezelése. + +### 4.1 Megjelenítési Helyek +* **Profil oldalon:** A megszerzett jelvények (Badges) "vitrinje". +* **Ranglistákon:** Kiemelt név, egyedi háttérszín vagy ikon a név mellett. +* **Térképen:** Egyedi pin ikon a saját járműveknél (pl. arany színű autó ikon a térképen a sima kék helyett). + +### 4.2 Ritkasági Szintek (Rarity) +A tárgyakhoz ritkasági szintet rendelünk a `system_configs`-ban: +1. **Common (Gyakori):** Bárki megveheti olcsón. +2. **Rare (Ritka):** Drágább, vagy teljesítményhez kötött (pl. 10 validált szerviz). +3. **Epic (Epikus):** Csak Prémium+ tagoknak vagy nagyon sok kreditbe kerül. +4. **Legendary (Legendás):** Egyedi eventeken szerezhető (pl. "Service Hunt 2026 Győztes"). + +### 4.3 "Equipped" Status +A felhasználónak lehet 50 jelvénye, de egyszerre (típustól függően) csak korlátozott számút mutathat meg (pl. 3 Slot a profilkép alatt). Ezt a `user_inventory.is_equipped` flag kezeli. + +## 5. Büntetőpontok és Rehabilitáció (Strike System) + +A rendszer 3-szintes büntetőrendszert alkalmaz a hibás vagy szándékosan téves adatok kiszűrésére. + +### 5.1 Büntetőpontok (Strikes) +* **Ok:** Szándékos félrevezetés, nem létező szerviz rögzítése, hamis fotók. +* **Következmény:** 3 strike után a felhasználó véglegesen vagy ideiglenesen ki lesz tiltva a "Service Hunt" és validációs feladatokból. + +### 5.2 Rehabilitációs Logika (Strike eltávolítás) +Egy büntetőpont (1 strike) levonható az alábbi feltételek teljesülése esetén (Adminról állítható értékek): +* **Javítás:** 10 sikeres és elfogadott adatjavítás (más hibájának korrigálása). +* **Validáció:** 20 sikeres és megerősített validáció. +* **Példás rögzítés:** 3 olyan új szerviz rögzítése, amit a Bot és az Admin is 100%-ban validnak talál. + +### 5.3 Területi Monitoring (Geofence Blacklist) +Amennyiben egy adott földrajzi körzetből (pl. egy városrész) kiugróan sok (százalékos arányban mérve) téves adat érkezik, a rendszer automatikusan korlátozhatja az onnan érkező új regisztrálók hozzáférését a szociális feladatokhoz, amíg az Admin felül nem vizsgálja a helyzetet. + +## 6. Versenyrendszer (Leaderboards) + +A közösségi munka (Service Hunt, Validáció) egy globális és régiós ranglistát táplál. + +### 6.1 Ranglista kategóriák +* **The Explorer (A Felfedező):** Legtöbb új szerviz rögzítése. +* **The Verifier (A Hitelesítő):** Legtöbb sikeres adat-visszaigazolás. +* **The Master Mechanic:** Legtöbb technikai adat kiegészítés. + +### 6.2 Szintlépési Bónuszok (Milestones) +A fejlődés nem csak dicsőség, hanem gazdasági előny is. +* **Level 5:** 1.000 Kredit jutalom. +* **Level 10:** 5.000 Kredit + "Expert" jelvény. +* **Level 20:** Egyedi avatar keret + állandó 5% kedvezmény a hirdetési árakból (céges esetén). + +### 6.3 Éves/Havi Szezonok +Minden hónap végén az első 3 helyezett extra Kreditet vagy "Voucher"-t kap, amit a partnereinknél (szervizeknél) válthat be. + +### 3. Jutalmazási Szabályok (Social Points) +- **Célcsoport**: Kizárólag természetes személyek (`role: user`, `driver`). +- **Kizárások**: Szervezetek (Organizations) és Adminisztrátorok nem gyűjtenek XP-t. +- **Logika**: Minden `PointsLedger` bejegyzés kötelezően hivatkozik egy `user_id`-ra. +- **Mezőnevek**: Adatbázis szinten a pontok az `id`, `user_id`, `points`, `reason` mezőkben tárolódnak. + +## 2026.02.10 FRISSÍTÉS - GAMIFICATION ÖKOSZISZTÉMA + +### 1. Pontrendszer Logika +A rendszer különválasztja a tekintélyt és a jutalmat: +- **XP (Tapasztalat):** Végleges szintlépéshez. Képlet: $BaseXP \times Level^{1.5}$. (Nehezedő görbe). +- **Social Points (Szezonális):** Időszakos versenyekhez (pl. Hónap Vadásza). +- **Kredit:** Fizetőeszköz, amit Social Pontokból lehet váltani (pl. 1000 pont = 100 Kredit). + +### 2. Konfiguráció +Minden érték (szorzók, határok) a \`GAMIFICATION_MASTER_CONFIG\` JSON paraméterben állítható Admin felületről, kódmódosítás nélkül. + +### 3. Audit +Minden pontmozgás a \`PointsLedger\` táblába kerül rögzítésre a visszakövethetőség érdekében. + +XP Formula: $XP_{required} = BaseXP \times Level^{1.5}$Penalty Logic: restriction_level bevezetése (0-3).Weighting: Saját adat vs. Közösségi adat súlyozási táblázata. + +# 11. Gamification és Social Engine Specifikáció + +## 1. XP (Experience Points) - A Tekintély +Az XP a felhasználó végleges, nem csökkenthető tekintélypontja. +- **Képlet:** A szintlépéshez szükséges összes XP: + $$XP_{total} = 500 \times Level^{1.5}$$ +- **Súlyozás:** + - **Saját adat (Fleet):** Alacsony érték (pl. 10 XP). + - **Közösségi adat (Service Discovery):** Magas érték (pl. 100 XP). + +## 2. Social Points - A Valuta Alapja +Szezonális pontok, amelyek Kreditre válthatóak. +- **Váltószám:** Alapértelmezett: 100 Social Point = 1 Kredit. +- **Váltási mód:** Automatikus (rendszerparaméter alapján) vagy manuális (felhasználói döntés). + +## 3. Trust & Penalty Engine (Büntetőrendszer) +A rendszer integritásának védelme érdekében hibapontokat (Penalty Points) alkalmazunk. +- **Szintek (Restriction Level):** + - **0 (Normal):** Teljes pontszorzó (1.0x). + - **1 (Warning):** Csökkentett pontszerzés (0.5x). + - **2 (Restricted):** Szigorú moderátori ellenőrzés minden adatnál, 0.1x pontszerzés. + - **3 (Blocked):** Pontszerzés és adatbeküldés tiltva. +- **Ledolgozás:** Minden pozitív XP szerzés a büntetőpontokat is csökkenti (pl. 1 XP jóváírás = 0.5 Penalty pont levonás). + +## 4. Szintlépési Bónuszok +Minden 10. szint elérésekor a rendszer automatikus Kredit jutalmat oszt a `GAMIFICATION_MASTER_CONFIG` alapján. + +## 5. Büntetőrendszer (Strike System) +A rendszer integritásának megőrzése érdekében hibapontokat alkalmazunk, amelyek befolyásolják a pontszerzés hatékonyságát. + +- **Szorzók (Multipliers):** + - Level 0 (Normal): 1.0x + - Level 1 (Warning): 0.5x + - Level 2 (Restricted): 0.1x + - Level 3 (Blocked): 0.0x + +- **Ledolgozás (Recovery):** + A büntetőpontok pozitív aktivitással (XP szerzéssel) ledolgozhatóak. Az elért XP egy admin által meghatározott része (alapértelmezett: 50%) levonásra kerül a büntetőpontokból. + +- **Admin-Vezérelt Küszöbök:** Minden szintváltási határ a `GAMIFICATION_MASTER_CONFIG` paraméterben definiált. \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/V01_gemini/12_Operations_Backup_Monitoring.md b/archive/2026.02.18 Archive_old_mapps/V01_gemini/12_Operations_Backup_Monitoring.md new file mode 100755 index 0000000..2b51732 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_gemini/12_Operations_Backup_Monitoring.md @@ -0,0 +1,18 @@ +(Üzemeltetés.) +# ⚙️ OPERATIONS & MONITORING + +## Backup Stratégia +- **Napi:** Teljes SQL dump a NAS-ra (`/mnt/nas/backup`). +- **Rotáció:** 7 napi, 4 heti, 12 havi mentés megőrzése. +- **MinIO:** Napi rsync a statikus fájlokról. + +## Monitoring +- **Dozzle:** Valós idejű log nézegető (Port 8888). +- **Healthcheck:** Docker `healthcheck` minden konténeren. +- **Alerts:** Email értesítés, ha az API 5xx hibát dob. + +## 4. Anti-Fraud & Device Logging + +A visszaélések elkerülése érdekében a rendszer rögzíti a beküldéshez használt eszközök adatait. +* **Device Fingerprinting:** Egyedi azonosító rögzítése (`device_id`). +* **Metadata Validation:** Képek feltöltésekor kötelező az EXIF GPS adatok ellenőrzése. Amennyiben az EXIF adatok hiányoznak vagy eltérnek a rögzített helyszíntől (>250m), a bejegyzés automatikusan "Manual Review" státuszba kerül. \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/V01_gemini/13_Roadmap_Tech_Debt.md b/archive/2026.02.18 Archive_old_mapps/V01_gemini/13_Roadmap_Tech_Debt.md new file mode 100755 index 0000000..6e09b9d --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_gemini/13_Roadmap_Tech_Debt.md @@ -0,0 +1,74 @@ +(Mit csinálunk most?) +# 🗺️ ROADMAP & TECH DEBT + +# 🗺️ ROADMAP & TECH DEBT (v1.4) + +## 🚧 SPRINT 1 (Azonnali - Stabilitás) +1. **Frontend Config:** Hardkódolt IP-k cseréje `.env` változókra. +2. **Step 1 Regisztráció Fix:** A meglévő endpoint átalakítása "Lite" regisztrációra (csak User létrehozás, `is_active=False`). +3. **Enum Case Sensitivity:** Minden DB query felülvizsgálata, hogy a `role` mező kényszerítve kisbetűs legyen. +4. **Security Module:** `create_access_token` és `verify_password` funkciók véglegesítése a `core/security.py`-ban. + +## 🚧 SPRINT 2 (KYC & Onboarding) +1. **Step 2 KYC Endpoint:** `POST /api/v1/auth/complete-kyc` megvalósítása. +2. **Atomi Tranzakció Logic:** A Person, Wallet és Private Org egyidejű létrehozása a KYC beküldésekor. +3. **Verification Email:** Aktiváló link generálása és kiküldése hash kóddal. +4. **Admin UI Settings:** Felület a `system_settings` tábla kezeléséhez. + +## 📅 SPRINT 3 (Marketplace MVP) +1. **OCR Pipeline:** Számla/Okmány fotó feltöltés MinIO-ba + AI validáció teszt. +2. **Service Request:** Frontend űrlap ajánlatkéréshez. + + +# ROADMAP & TECH DEBT (v1.0) +## 🚧 SPRINT 1 (Azonnali) +1. **Frontend Config:** Hardkódolt IP-k cseréje `.env` változókra. +2. **Person Migráció:** DB szkript futtatása (User -> Person). +3. **API Fix:** `/api/v1/users/me` 404 javítása. +4. **Soft Delete:** Ellenőrzés, hogy minden `SELECT` tartalmazza-e a `deleted_at IS NULL` feltételt. + +## 📅 SPRINT 2 (Marketplace MVP) +1. **OCR Pipeline:** MinIO feltöltés + Tesseract teszt. +2. **Service Request:** Frontend űrlap ajánlatkéréshez. +3. **Ranking Engine:** Távolság + Súlyozás algoritmus implementálása. + +# 13. Roadmap és Technikai Adósság (v1.2.6) + +Ez a dokumentum rögzíti a rendszer fejlesztési fázisait és azokat a technikai kompromisszumokat, amelyeket a gyors haladás érdekében hoztunk, de később felülvizsgálatot igényelnek. + +## 13.1 Rövid távú Roadmap (Q1-Q2) + +### 1. Intelligens Kereső API (Fuzzy Search) +- **Cél:** A `synonyms` mezőben tárolt alternatív nevek kihasználása. +- **Megvalósítás:** PostgreSQL `tsvector` és `GIN` indexek használata, hogy a kereső akkor is találjon eredményt, ha a felhasználó "Tracer"-t ír be "Yamaha MT-09 Tracer" helyett. + + +### 2. Média Kezelés & MinIO Integráció +- **Cél:** Járműfotók automatikus beszerzése. +- **Megvalósítás:** Új bot fejlesztése, amely a dúsított `marketing_name` alapján hivatalos sajtófotókat keres, és azokat a már futó MinIO objektumtárba menti. + +### 3. Robot 4: Service Hunter (Szerviz-logika) +- **Cél:** Karbantartási tervek generálása. +- **Megvalósítás:** A `specifications` (olajmennyiség, gyertya típus) mezőkből kiindulva szerviz-csomagok és árak kalkulálása. + +## 13.2 Technikai Adósság (Tech Debt) + +### 1. Adattípus Optimalizálás: JSON vs. JSONB +- **Helyzet:** A `synonyms` és `specifications` mezők jelenleg `JSON` típusúak. +- **Adósság:** A Postgres függvények (pl. `jsonb_array_length`) használatához folyamatos casting (`::jsonb`) szükséges, ami lassítja a lekérdezéseket. +- **Megoldás:** Egy Alembic migráció keretében az összes JSON oszlopot át kell állítani `JSONB` típusra. + + +### 2. "N/A-{id}" és "UNKNOWN-{id}" Kódok Tisztítása +- **Helyzet:** A NOT NULL és UNIQUE kényszerek miatt a robot egyedi ál-kódokat generál, ha az AI nem talál gyári kódot. +- **Adósság:** Ezek nem valódi technikai kódok. +- **Megoldás:** Szükséges egy manuális felülvizsgálati (Manual Review) felület, ahol az operátorok a `N/A` kódú rekordokat ellenőrizhetik vagy egyesíthetik. + +### 3. AI Response Parsing (Regex Workaround) +- **Helyzet:** A Gemini Search Tool letiltja a kényszerített JSON választ, ezért Regex-szel bányásszuk ki a JSON-t a nyers szövegből. +- **Adósság:** Ez a megoldás törékeny, ha az AI stílusa jelentősen megváltozik. +- **Megoldás:** Monitorozni kell az AI API frissítéseit; amint a Google engedélyezi a Search + Controlled Generation kombinációt, vissza kell térni a natív JSON módra. + +## 13.3 Hosszú távú Vízió (Q3+) +- **Trust Engine:** A járművek történetének és szervizadatainak hitelesítése. +- **Global Fleet Insight:** Flottaszintű elemzések készítése a dúsított MDM adatok alapján. \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/V01_gemini/15_Changelog.md b/archive/2026.02.18 Archive_old_mapps/V01_gemini/15_Changelog.md new file mode 100755 index 0000000..82f79c3 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_gemini/15_Changelog.md @@ -0,0 +1,508 @@ +(Változásnapló.) +# 📜 CHANGELOG + +## [1.0.1] - 2026-02-06 + +### Hozzáadva +- **Unified Auth Module**: Integrált Belépés, Lite Regisztráció és Elfelejtett jelszó kezelés. +- **Email Rendszer**: SendGrid integráció SMTP fallback lehetőséggel. +- **KYC Előkészítés**: `is_active` flag bevezetése a `User` és `Person` modellekben a 2-lépcsős folyamathoz. + +### Javítva +- **SQLAlchemy Mapper Fix**: Megszűnt az `owned_organizations` körkörös függőségi hiba. +- **Típus Szinkron**: `Person.id` javítva `BigInteger` típusra a Postgres sémával összhangban. +- **Import Fixek**: `app.db.base_class` -> `app.db.base` útvonalak egységesítve. + +### Technikai adatok +- Konténer állapot: Stabil (running) +- Regisztrációs folyamat: Step 1 (Lite) tesztelve, sikeres. + +## [1.0.0] - 2026-02-03 +- **Init:** Grand Master Book létrehozása. +- **Arch:** Átköltözés a 80 magos szerverre. +- **Spec:** Kredit rendszer, Tiers, Soft Delete és Person logika véglegesítése. + +### [2026-02-04] - Identity & Company Sync (v1.2) +- **Modell Konszolidáció:** Az `app.models.identity` lett a központi identitáskezelő (User, Person, Wallet). +- **Master Book v1.2 Implementáció:** Bevezetésre került a céges verifikációs logika (is_verified) és a 30 napos türelmi idő kezelése. +- **Integritás javítás:** Az `Organization` tábla bővítve lett `is_transferable` és hitelesítési mezőkkel. +- **Bugfix:** `security.py` IndentationError javítva, `auth_service.py` atomikus regisztrációs flow Master Book szinkronizálva. +- **Security:** PostgreSQL tábla-tulajdonosi jogosultságok felülvizsgálata a migrációs hibák elhárításához. + +### [2026-02-05] - Identity & Company Sync (v1.2) +- **Database Security:** Javítva a `user_vehicle_equipment` tábla tulajdonosi jogosultsága (`shared-postgres` környezetben). +- **Core Fix:** A `security.py` állomány behúzási hibái (IndentationError) véglegesen elhárítva. +- **Organization v1.2:** Implementálva az `is_transferable`, `is_verified` és `verification_expires_at` mezők a flották hitelesítéséhez. +- **AuthService Logic:** - Az `INDIVIDUAL` típusú flották mostantól alapértelmezetten nem átruházhatóak. + - Beépítve a 30 napos türelmi idő (`grace_period`) kalkulációja a cégellenőrzéshez. + - Atomikus regisztráció kiterjesztve a privát flották automatikus létrehozására. +- **Infrastructure:** Alembic migrációs lánc szinkronizálva az új modellekkel. + +### [2026-02-05] - Admin & Economy Finalization (v1.0) +- **Admin Management:** Teljes hiearchia és területi felosztás kidolgozva (L0-L3). +- **Security:** "Kill-switch" anomália-figyelés és 2FA kényszerítés rögzítve. +- **Economy:** 10-5-2% jutalékrendszer és Voucher/Coupon logika specifikálva. +- **Synergy:** Céges VIP és privát flotta közötti kedvezmény-szinergia kidolgozva. +- **Invitations:** Meghívó limitációs és anti-spam logika rögzítve. + +# 📓 CHANGELOG - SERVICE FINDER + +## [1.2.1] - 2026-02-05 +### ✅ Hozzáadva (Added) +- **Multi-step Social Auth:** `User` modell bővítve `social_provider` és `social_id` mezőkkel. +- **Flotta Tulajdonjog:** `Organization` modellben `is_transferable` flag implementálva (Individual flotta zárolva). +- **Referral Snapshot:** Előkészítve a 10-5-2%-os jutalékrendszer adatmodellje. + +### 🛠️ Javítva (Fixed) +- **SQLAlchemy Mapper:** Megszűnt a `UserVehicle` KeyError hiba a string-alapú hivatkozásokkal. +- **Duplikáció:** `Vehicle` osztály duplikációja eltávolítva a `vehicle.py`-ból. +- **Indentation Error:** `security.py` bcrypt indentációs hiba javítva. + +### ⚠️ Megjegyzés +- Alembic migráció szükséges az új `Organization` és `User` mezőkhöz. + +📓 CHANGELOG (Rögzítendő változások) + +Mivel kérted, itt van a változások listája, amit a teszt után beírhatunk: + + Fixed: UserRole enum validációs hiba (Postgres userrole típus mostantól kisbetűs értéket kap). + + Added: Teljes banki KYC integráció a regisztrációba (Személyi, Jogosítvány, Speciális engedélyek). + + Added: Atomi tranzakció részeként automatikus OrganizationMember létrehozás a privát flottához. + + Added: Audit log rögzítése minden sikeres regisztrációról. + + Added: Dinamikus paraméterkezelés (system_settings) a 14 napos jutalomhoz. + + Elvárt eredmény: A tranzakció végén létrejön a Person, a Wallet (0 Coin) és a Private Fleet (is_transferable=False). A User is_active értéke True lesz. + +3. Debugging Checklist + + 500 Error? Ellenőrizd a docker logs -f service_finder_api kimenetét. Ha "UndefinedColumn", akkor hiányzik egy SQL mező. Ha "InvalidTextRepresentation", akkor Enum hiba (nagybetűs string). + + Üres Swagger? Ellenőrizd az importokat a security.py-ban és a sémákat az endpoints/auth.py-ban. + + +--- + +### 💡 Javaslatom a dokumentáció kiegészítésére: +A fejlesztések rendben tartásához javaslom a **`17_DEVELOPER_NOTES_AND_PITFALLS.md`** fájl aktív használatát is, amit az előző körben küldtem. Ez segít megelőzni, hogy a fejlesztőcsapat újra belefusson a Postgres Enum vagy a `Base.metadata.create_all` korlátaiba. + + + +**Holnap reggel frissíted a GEM beállításokat is?** Ha igen, a következő lépésben elkészíthetem neked a Step 2 (KYC) végleges Pydantic sémáját és a `complete-kyc` végpont vázlatát! + +## [0.2.0] - 2026-02-07 + +### ✨ Hozzáadva (Added) +- **Step 2 (KYC) Folyamat:** Teljes körű identitás-kezelés (telefonszám, születési adatok, okmányok, ICE kontakt). +- **Automata Privát Flotta:** Minden felhasználóhoz automatikusan létrejön egy `individual` típusú szervezet (Privát Széf). +- **Automata Wallet:** Minden validált felhasználó kap egy üres pénztárcát (Coin és XP egyenleggel). +- **Trust Tiers:** Bevezetésre került a fokozatos bizalmi szint (Tier 1: Email, Tier 2: KYC/Active). + +### 🛠️ Javítva (Fixed) +- **SQLAlchemy Async Fix:** `joinedload` alkalmazása a User-Person kapcsolathoz (MissingGreenlet hiba elhárítva). +- **JSON Serialization:** Pydantic `model_dump(mode='json')` használata a JSONB mezőkhöz (dátum-konverziós hiba javítva). +- **Postgres Schema:** `data.organizations` tábla bővítve hiányzó oszlopokkal (`is_verified`, `updated_at`, stb.). +- **Auth Endpoint:** `/complete-kyc` végpont hozzáadva és JWT védelemmel ellátva. + +### ⚙️ Adatbázis Változások (Database) +- Új Enum típus: `data.orgtype` ('individual', 'company'). +- `data.persons` bővítve: `phone`, `birth_place`, `birth_date`, `mothers_name`, `identity_docs`, `ice_contact`. +- `data.organizations` bővítve: `is_verified`, `is_transferable`, `verification_expires_at`, `updated_at`. + +## [0.2.0] - 2026-02-07 +### ✅ Step 2 KYC & Activation Complete +- **Funkció:** Teljes körű személyazonosság-kezelés és fiókaktiválás. +- **Automatizálás:** Regisztrációkor automatikusan létrejön a "Privát Flotta" (Organization) és a digitális pénztárca (Wallet). +- **Adatvédelem:** Elkészült a "Digitális Széf" logika az okmányok és vészhelyzeti adatok biztonságos tárolására. +- **Technikai fix:** SQLAlchemy `joinedload` integráció az aszinkron adatkezeléshez és JSON-safe dátumkezelés. + +## [0.3.0] - 2026-02-07 + +### ✨ Hozzáadva (Added) +- **Asset DNS Modell:** Új, univerzális eszközkezelő rendszer (Assets, VehicleCatalog, AssetEvents, AssetRatings). +- **Harvester Robot:** Automata adatgyűjtő rendszer, amely külső forrásokból tölti fel a globális járműkatalógust. +- **UUID Implementáció:** Az eszközök (Assets) és események (Events) mostantól biztonságos UUID azonosítókat használnak. + +### ⚙️ Adatbázis Változások (Database) +- `data.vehicle_catalog` tábla létrehozva a globális specifikációknak. +- `data.assets` tábla létrehozva a konkrét példányok (VIN/HIN alapú) tárolására. +- `data.asset_events` és `data.asset_ratings` táblák az életút és közösségi visszajelzések kezelésére. + +### 🛠️ Refaktor (Refactor) +- **Modell Konszolidáció:** A korábbi `Vehicle` és `VehicleBrand` modellek beolvasztva az új `Asset` és `VehicleCatalog` struktúrába. +- **Kapcsolati Térkép:** Az `Organization` és `User` modellek frissítve az új Asset logikához. + +## [0.3.5] - 2026-02-07 +### ✨ Robot Technológia & Adatbiztonság +- **Multi-Robot Architektúra:** Előkészítve a kategória-specifikus (Car, Bike, Truck) Harvester robotok szétválasztása. +- **Status Tracking:** Bevezetve a `verification_status` a katalógus elemekhez a hiányos adatok kezelésére. +- **SQL Optimalizálás:** Új indexek és kategória alapú szűrések hozzáadva a globális katalógushoz. + +## [0.4.0] - 2026-02-07 +### ✨ Multi-Robot System +- **Kategória Robotok:** Elkészült a Car, Bike és Truck harvester moduláris szerkezete. +- **Robot Manager:** Központi vezérlő az ütemezett és sorrendi adatgyűjtéshez. +- **Katalógus Kereső:** Üzembe helyezve a `/catalog/search` végpont a Swaggerben. + +## [0.4.5] - 2026-02-07 +### ✨ Asset Management & Infrastructure +- **Asset Endpoint:** `POST /api/v1/assets/` élesítve VIN validációval. +- **NAS Integration:** Automata mappastruktúra létrehozása az eszközöknek (`/assets/{uuid}`). +- **Data Model:** `privacy_level` és `status` mezők hozzáadva az Asset modellhez. +- **Bugfix:** SQLAlchemy `TypeError` javítva a modell és a séma szinkronizálásával. + +## [0.5.0] - 2026-02-07 +### ✨ Corporate & CRM Foundation +- **Corporate Onboarding:** `POST /api/v1/organizations/onboard` végpont élesítve. +- **Validation:** Magyar adószám (HU) formátum ellenőrzés beépítve. +- **Status Management:** Bevezetve a `pending_verification` állapot a szervezetekhez. +- **Database:** PostgreSQL `orgtype` Enum szinkronizálva a Python modellel (kisbetűs mapping). +- **NAS:** Automata szervezeti mappa-izoláció (`/organizations/{id}`). + +[0.5.1] - 2026-02-07 + + FIX: ModuleNotFoundError javítva az importok szinkronizálásával. + + DATA: Atomizált címmezők hozzáadva a data.organizations táblához. + + LOGIC: Háromszintű névkezelés (Hivatalos, Rövid, Display) bevezetve. + + ## [2.1.0] - 2026-02-08 + +### Hozzáadva (Added) +- **Hibrid Címkezelő Rendszer**: Új `data.addresses` központi tábla, amely UUID alapú azonosítással köti össze a személyeket, cégeket és szervizeket. +- **Öntanuló GeoService**: A rendszer rögzítéskor automatikusan bővíti a ZIP-kód, város és utcanév szótárakat. +- **Autocomplete API**: `/api/v1/services/suggest-street` végpont a frontend gépelés közbeni támogatásához. +- **Kétlépcsős Keresés**: `/api/v1/services/search` végpont, amely megkülönbözteti a légvonalbeli (Free) és útvonal/idő alapú (Premium) kalkulációt. +- **PostGIS Integráció**: Tűpontos GPS távolságmérés `geography` casting használatával. + +### Javítva (Fixed) +- **Gamifikációs hiba**: A `PointsLedger` modellben javítva a `points` mezőnév (TypeError: points_change fix). +- **Adatbázis Inkonzisztencia**: Létrehozva a hiányzó `data.user_stats` tábla. +- **Import hibák**: `Optional`, `UploadFile` és `File` hiányzó importok pótolva a szolgáltatás végpontokon. + +### Változtatva (Changed) +- **Címkezelési Logika**: A cégek és magánszemélyek mostantól egységes, bontott címstruktúrát (zip, city, street, street_type, house_number, parcel_id) használnak. +- **XP Szűrés**: A szervizek és cégek rögzítésekor a rendszer mostantól csak a természetes személyeknek (User/Driver) oszt social pontokat. + +## [2.1.0] - 2026-02-08 +- **Feat**: Hibrid címkezelő rendszer bevezetése (UUID alapú `data.addresses`). +- **Feat**: Öntanuló Geo-logika (Auto-create ZIP/Street). +- **Feat**: Kétlépcsős (Free/Premium) szervizkereső API. +- **Fix**: `points_ledger` mezőnév szinkronizáció. +- **Fix**: `data.user_stats` tábla inicializálása. + +## [2026-02-08] - Nemzetközi Asset és KYC Stabilizáció + +### Hozzáadva +- **Nemzetközi paraméterek**: `mileage_unit` (km/miles/hours) és `reading_unit` támogatása az Asset modellben. +- **Pénzügyi alapok**: `AssetCost` modell bővítése nettó/bruttó összeggel, ÁFA kulccsal és deviza-kezeléssel. +- **Árfolyamkezelés**: `exchange_rates` tábla implementálása MNB/ECB alapú napi frissítéshez. +- **Értékelési rendszer**: `ratings` tábla létrehozva (user, asset, service_provider szinten). + +### Javítva +- **KYC Folyamat**: Anyja neve bontása vezetéknévre és keresztnévre a magyar/nemzetközi szabványok szerint. +- **Database Schema**: Számos hiányzó oszlop pótolva (`asset_events.data`, `asset_events.event_date`, `user_stats.total_xp`). +- **SQLAlchemy hiba**: Javítva az `IndexError` a katalógus lekérdezésnél és az import hiba a `PG_UUID` kapcsán. + +### Megjegyzés +A rendszer most már képes egyetlen KYC folyamat alatt aktiválni a felhasználót, létrehozni az egyéni flottáját, inicializálni a pénztárcáját (Kredit/Coin) és rögzíteni az első járművét kezdő km-óra állással. + +## [Unreleased] - 2026-02-10 + +### 🚀 Added (Új funkciók) +- **RBAC System:** + - \`User\` tábla bővítése: \`scope_level\`, \`scope_id\`, \`custom_permissions\`. + - \`system_parameters\` tábla létrehozása a globális JSON konfigurációkhoz. + - Master RBAC JSON konfiguráció seedelése. +- **Gamification:** + - \`GamificationService\` létrehozása (XP, Level, Credit logika). + - Automata pontszámítás és nehezedő szintek logikája. +- **API Modularitás:** + - \`assets.py\` szétbontása 3 végpontra (Identity, Costs, Telemetry). + +### 🛠 Changed (Módosítások) +- **Asset Model:** Az \`Asset\` entitás mostantól lazy loading helyett \`selectinload\` stratégiát használ a teljesítmény érdekében. +- **Error Handling:** Javítottuk az \`asyncpg\` többszörös parancs-futtatási hibáját a setup scriptekben. +- **Configuration:** A rendszerbeállítások mostantól adatbázis-alapúak (JSONB) a hardcoded konstansok helyett. + +### 🐛 Fixed (Javítások) +- **Schema Mismatch:** SQLAlchemy modellek és Pydantic sémák szétválasztása (`models/asset.py` vs `schemas/asset.py`). +- **Data Integrity:** \`updated_at\` és \`is_active\` oszlopok pótlása a \`system_parameters\` táblában. +- **API Stability:** \`getattr\` használata a hiányzó opcionális mezőknél (pl. \`net_amount\`), hogy ne szálljon el az API 500-as hibával. + +## [1.2.0] - 2026-02-10 + +### Added +- **Asset Financials 2.0**: Pivot-Currency modell implementálva (helyi deviza + EUR párhuzamos tárolás). +- **Smart Auth Token**: JWT token mostantól tartalmazza a `rank`, `scope_level` és `scope_id` mezőket a gyors jogosultságkezeléshez. +- **CostService**: Automatikus árfolyam-kalkuláció, telemetria-szinkron és XP jóváírás költségrögzítéskor. +- **ExchangeRate**: Új árfolyamtábla és modell az EUR alapú váltásokhoz. + +### Fixed +- **Circular Import Resolution**: Megszüntetve a `db.base` és a `models` közötti körkörös függőség az import lánc modularizálásával. +- **Alembic Identity Sync**: Visszaállítva a `User` modell hiányzó `scope_level` és `custom_permissions` mezői, megakadályozva az adatvesztést migrációkor. +- **NotNullViolationError**: Fixálva az `asset_costs` tábla migrációja (amount_local NOT NULL kényszer). + +### Changed +- `AssetCost` modell mezőnevek szinkronizálva a pénzügyi standardokhoz (`amount_local`, `amount_eur`). +- `SystemParameter` modell elnevezés igazítva a meglévő adatbázis sémához. + +## [1.5.0] - 2026-02-10 + +### Added +- **Judge & Penalty System**: Bevezetve a `penalty_points` és `restriction_level` mechanizmus a visszaélések kiszűrésére. +- **Dynamic Multipliers**: Admin felületről (JSON config) állítható pontszorzók a büntetési szintekhez. +- **Social-to-Credit Auto-conversion**: Automatikus Kredit jóváírás a Walletbe meghatározott Social pont elérésekor. +- **Level Achievement Bonus**: 10-es szintenkénti automatikus Kredit jutalmazás. + +### Fixed +- **Circular Dependency Fix**: A modellek közötti import hurok végleges felszámolva (string-alapú relationship hivatkozások). +- **Identity Schema Protection**: Visszaállítva a `User` modell hiányzó `scope_id`, `scope_level` és `custom_permissions` mezői. +- **Database Consistency**: A `user_stats` és `asset_costs` táblák sikeresen migráltak a NOT NULL kényszerek és alapértelmezett értékek (server_default) beállításával. + +### Changed +- **GamificationService**: Mostantól központi "Bíróként" funkcionál, leválasztva a pontszámítási logikát a többi szervizről. +- **Identity Model**: A `Wallet` és `VerificationToken` osztályok integrálva az `identity.py` modulba. + +# Changelog - Service Finder Backend +**Verzió:** 1.6.0 (Sentinel & i18n Update) +**Dátum:** 2026.02.10. + +## [1.6.0] - 2026-02-10 +### Hozzáadva +- **Sentinel Biztonsági Rendszer:** - `PendingAction` modell bevezetése a "Négy szem elv" (Dual Control) biztosításához. + - `SecurityService` implementálása: Adatlopás elleni védelem (Throttling) és automata vészleállító (Emergency Lock). + - `AuditLog` bővítése szigorúbb súlyossági szintekkel (`critical`, `emergency`). +- **Nyelvi Modul (i18n):** + - `Translation` modell a `data` sémában. + - `TranslationService`: Adatbázis-alapú fordításkezelés, szerveroldali cache, Fallback (EN) logika és JSON export funkció a Frontend számára. +- **Admin Kontroll Panel:** + - Új API végpontok a függőben lévő műveletek jóváhagyásához, a rendszerbiztonsági állapot monitorozásához és a nyelvi szinkronizációhoz. + +### Javítva +- **Circular Import Fix:** A modellek importálási rendjének optimalizálása a `app.db.base_class` közvetlen használatával, megszüntetve a hurok-importokat. +- **Függőségkezelés:** `deps.py` bővítve a `get_current_active_user` függőséggel a biztonsági zárolások érvényesítéséhez. +- **Soft-Delete Logika:** A felhasználói fiók törlése mostantól felszabadítja az eredeti e-mail címet a TWINS-elvű újra-regisztrációhoz. + +# 15. Changelog & Version History + +## [v1.2.5] - 2026-02-10 (The "SuperAdmin" Update) +### 🚀 New Features +- **Admin Bootstrap:** Implementáltuk a "vészhelyzeti" Admin létrehozási folyamatot (Python script alapú hash generálással). +- **i18n Sync:** Élesítettük a `/api/v1/admin/translations/sync` végpontot, amely JSON fájlokba exportálja az adatbázis fordításait. +- **Identity Expansion:** A `User` modell bővült a `preferred_language` és `region_code` mezőkkel a perszonalizáció érdekében. + +### 🐛 Bug Fixes +- **ORM Crash:** Javítva az `AssetAssignment` és `AssetCost` modellek hiányzó `organization` kapcsolatai, amelyek blokkolták a rendszer indulását (`InvalidRequestError`). +- **Config Error:** Javítva a `Settings` osztályból hiányzó `STATIC_DIR` definíció, ami 500-as hibát okozott a fordítások szinkronizálásakor. +- **Login Crash:** Javítva az `AttributeError` a Login végponton (a hiányzó `region_code` miatt). + +### 🛠 Technical Changes +- **Migrations:** Új Alembic migráció (`add_lang_and_region_to_user`) generálva és lefuttatva. +- **Environment:** A `static/locales` mappa jogosultságai beállítva a Docker konténer számára. + +[2026.02.12] - Fundamentum és Robot Orchestration + + FIX: Javítva a docker-compose v1/v2 összeférhetetlenség (ContainerConfig hiba). + + FIX: Megszüntetve az ImportError: cannot import name 'FastAPILimiter' hiba a security.py modulban. + + DATABASE: PostGIS Geometry típus implementálva a service_profiles táblában. + + MODEL: Az Asset (Digital Twin) és ServiceProfile közötti kapcsolatok szinkronizálva az ownership_history modulon keresztül. + + WORKERS: Új állapotvezérelt (State-driven) robotlogika bevezetése: + + A szervizek alapértelmezetten ghost státusszal jönnek létre. + + Bevezetve a last_audit_at mező az automatikus kivezetéshez (Soft-delete). + + UX: A keresőmotor számára definiálva a "Nem megerősített szolgáltató" jelzés a bot által talált adatokhoz. + 📝 Részletes Összefoglaló az Elvégzett Munkáról + + Környezet Stabilizálás: A modern Docker Engine-hez igazítottuk a parancsokat, megoldva a régi Python-alapú compose hibáit. + + Adatmodell Integritás: Visszaállítottuk az összes kritikus mezőt (nettó érték, ÁFA, maradványérték, telemetria), így a rendszer alkalmas komplex flottakezelési feladatokra is. + + Szerviz Életciklus: Kidolgoztunk egy olyan logikát, ahol a botok nem "szemetelik" az adatbázist, hanem egy ghost (árnyék) réteget hoznak létre. Ezek a szervizek csak akkor válnak teljesen hitelessé, ha a felhasználók interakcióba lépnek velük (Gamification) vagy az Admin jóváhagyja őket. + + Robot Koordináció: A robotok immár nem ütköznek. Az egyik a járműkatalógust építi API-kból, a másik a térképi pontokat gyűjti és auditálja. + + # Changelog - 2026-02-13 +## Service Finder Project - "Dunakeszi Detective" & Docker Infrastructure + +### 🚀 Fejlesztések és Architektúra +- **Robot 2.7 (Service Hunter) Implementálása:** + - Hibrid adatgyűjtés bevezetése: OSM (OpenStreetMap) + Google Places API + Helyi CSV. + - **Geocoding Integráció:** A CSV-ben megadott szöveges címek (pl. "Dunakeszi, Kikerics köz 4") automatikus GPS koordinátára fordítása a Google API segítségével. + - **Trust Score alapok:** Különböző források eltérő bizalmi szinttel kerülnek rögzítésre (Manuális > Google > OSM). + +- **Adatbázis és Modellek (ORM) Javítása:** + - `Organization` és `Address` modellek szinkronizálása a valós adatbázis sémával. + - Hiányzó mezők kezelése (City, Zip átmozgatása Organization szintre). + - PostGIS geometria (POINT) kezelésének pontosítása. + +- **Docker Infrastruktúra Stabilizálás:** + - Hálózati hiba (`[Errno -2] Name or service not known`) elhárítása. + - `shared_db_net` és `bridge` hálózatok megfelelő konfigurálása. + - Konténer DNS beállítások fixálása (Google DNS fallback). + - Adatbázis hostnév korrekció (`db` -> `shared-postgres`). + +### 🧠 Üzleti Logika és Stratégia (Döntések) +1. **Multi-Tenant Kezelés:** Egy címen több cég is létezhet. A rendszer nem vonja össze őket automatikusan, csak ha az adószám/név egyezik. +2. **Adatvédelmi Elv (No-Delete):** A robot soha nem töröl adatot fizikailag. Ha egy forrás megszűnik, a rekord "archived" vagy "review_needed" státuszt kap, de az adatbázisban marad. +3. **Emberi Felügyelet:** A duplikációk összefűzése vagy a hibás adatok törlése Admin/Moderátor jogkör, nem a robot automatizmusa. +4. **Dinamikus Adatfrissítés:** A robot a jövőben frissítheti a manuálisan felvitt adatokat is (pl. ha változik a nyitvatartás a Google-ön), de a prioritási szabályokat még finomítani kell. + +### 🐛 Javított Hibák +- `socket.gaierror`: Docker konténer internet elérés és belső névfeloldás javítva. +- `AttributeError: 'city'`: SQLAlchemy modell mezőleképezési hiba javítva. +- Függőségi hiba (`depends_at` -> `depends_on`) a docker-compose fájlban. + +### 🔜 Következő Lépések +- Gamification és Moderátori felület (Admin UI) tervezése az adatok tisztítására. +- Logikai szabályrendszer (Business Rules) véglegesítése a "Robot vs. Ember" adatkonfliktusokra. + + +# Changelog - Service Finder Project +**Dátum:** 2026-02-15 +**Verzió:** Backend v1.9.8 / Robot v1.0.7 (Deep Hunter) +**Fókusz:** Adatbázis séma bővítése, RDW API integráció stabilizálása, Multi-vehicle támogatás. + +## 🏛️ Adatbázis és Architektúra (Alembic & SQLAlchemy) +### Hozzáadva +- **Új Migráció (`enrich_catalog_technical_schema`):** + - `power_kw` (Integer, Indexed): Teljesítmény tárolása. + - `engine_capacity` (Integer, Indexed): Hengerűrtartalom (ccm). + - `max_weight_kg` (Integer): Megengedett legnagyobb össztömeg. + - `euro_class` (String): Környezetvédelmi besorolás. +- **Új Migráció (`add_axles_and_body_type`):** + - `axle_count` (Integer): Tengelyek száma (Teherautókhoz/Kamionokhoz). + - `body_type` (String): Felépítmény (pl. Sedan, Box, Camper). +- **Modell Frissítés (`asset.py`):** + - Az `AssetCatalog` osztály szinkronba hozva az új DB sémával. + - `UniqueConstraint` és indexek optimalizálása a gyors kereséshez. + +### Javítva +- **Alembic Syntax Error:** Javítva a `ddef` elírás a migrációs fájlban. +- **Column Duplication:** Javítva az `axle_count` duplikált létrehozási kísérlete a második migrációban. + +## 🤖 Robot / Worker (Data Ingestion) +### Módosítva +- **Robot Upgrade (v1.0.2 -> v1.0.7 Deep Hunter):** + - **License Plate Bridge (Rendszám-híd):** Új stratégia az API 400-as hibák megkerülésére. A robot mostantól: + 1. Lekéri az alapadatokat (`m9d7-ebf2`). + 2. Kivesz egy minta rendszámot. + 3. Ezzel a rendszámmal lekérdezi a `FUEL`, `AXLE` és `BODY` táblákat. + - **Pagination (Lapozás):** `$offset` támogatás beépítése, így a robot képes 50.000+ rekordos márkákat is végigolvasni. + - **Camper Detection:** Automatikus lakóautó (`camper`) kategória felismerés a "kampeerwagen" kulcsszó alapján. + - **Category Mapping:** Angol nyelvű kategóriák (Car, Truck, Motorcycle, Agricultural) kényszerítése. + +### Javítva +- **RDW API 400 Bad Request:** Megoldva a `merk` vs `merknaam` paraméterek eltérésének kezelésével (átállás a fő táblára). +- **AttributeError:** Javítva a hibás `TECH_API_URL` hivatkozás. + +## 💾 Adat (Seeding & SQL) +- **Grand Seeder v2:** + - SQL szkript létrehozva a világmárkák (Toyota, BMW, Scania, John Deere, stb.) tömeges betöltésére. + - `model` mező feltöltése `'ALL'` értékkel a `NOT NULL` kényszer miatt. + - Státuszok visszaállítása `pending`-re a teljes újradolgozáshoz. + + # CHANGELOG - 2026.02.16 (Architectural Overhaul: Identity & Economy Engine) + +## 🏆 Napi Összefoglaló +A mai napon alapjaiban strukturáltuk át az identitáskezelést (`Identity`), a jogosultsági rendszert (`RBAC`) és a gazdasági motort (`Economy`). Bevezetésre került a "Dual Entity" modell (Person vs. User), a 3-szintű Wallet rendszer, valamint a "Hunting & Farming" üzletkötői jutalékrendszer alapjai. A biztonságot a 4-szem elvű (Four-Eyes Principle) audit naplózás garantálja. + +--- + +## 🏛️ 1. Architektúra és Logika (Master Book Updates) + +### A. Identitás Filozófiája (The Dual Entity Rule) +* **Person (A DNS):** A természetes személy, aki "örök". Nem törlődik GDPR törléskor sem, csak anonimizálódik. + * Tárolja: `lifetime_xp` (életút pontok), `penalty_points` (büntetések 0-3 szint), `social_reputation`. + * **Identity Hash:** Egyedi SHA256 lenyomat (Kisbetűsített Anyja neve + Születési hely + Idő) a duplikációk és visszaélések ellen. +* **User (A Kulcs):** A belépési fiók. Bármikor törölhető/eldobható. + * Kapcsolódik a Person-höz. + * Tárolja: `subscription_plan`, `is_vip`, `session_data`. + +### B. Gazdasági Modell (The Triple Wallet) +A pénztárcát (`Wallet`) három, szigorúan elkülönített alszámlára bontottuk: +1. **Earned Credits:** Munkával (validálás) és Referral jutalékból szerzett. (Beváltható Prémiumra). +2. **Purchased Credits:** Valódi pénzért vásárolt egyenleg. (Beváltható Prémiumra). +3. **Service Coins:** B2B egység. Kizárólag hirdetésre és kiemelésre fordítható. (NEM váltható Prémiumra). + +### C. Üzletkötői Rendszer (Hunting & Farming) +* **Hunting (Vadász) Jutalék:** Egyszeri jutalék az első behozatalért (tervezett: 10%). +* **Farming (Gazda) Jutalék:** Folyamatos jutalék a havidíjakból (tervezett: 5%). +* **Átruházhatóság:** A Farming jog nem az üzletkötőhöz, hanem a Cég-Üzletkötő kapcsolathoz (`OrganizationSalesAssignment`) kötődik. Ha az üzletkötő kilép, a portfóliója (és a jutalék) átruházható másra. + +### D. Biztonság (Audit & 4-Eyes) +* **Operational Log:** Napi üzemi események (pl. jármű rögzítés). +* **Financial Ledger:** Minden pénzmozgás (Kredit/Coin/HUF) központi főkönyve. +* **Security Audit Log:** Kiemelt biztonsági események (pl. VIP státusz adása). + * **4-szem elv:** Kritikusan érzékeny műveleteknél kötelező egy második admin jóváhagyása (`confirmed_by_id`). + +--- + +## 🛠️ 2. Adatbázis és Modell Változások + +### Új/Módosított Táblák (`data` séma) +| Tábla | Változás | Leírás | +| :--- | :--- | :--- | +| **persons** | **UPDATE** | Új mezők: `identity_hash`, `lifetime_xp`, `penalty_points`, `social_reputation`, `is_sales_agent`. | +| **users** | **UPDATE** | Új mezők: `subscription_expires_at`, `is_vip`, `referral_code`, `current_sales_agent_id`. | +| **wallets** | **REFACTOR** | Régi balance törölve. Új: `earned_credits`, `purchased_credits`, `service_coins`. | +| **org_sales_assignments** | **NEW** | Kapcsolótábla: Melyik cég után ki kapja épp a Farming jutalékot. | +| **financial_ledger** | **NEW** | Pénzügyi tranzakciók megmásíthatatlan naplója. | +| **security_audit_logs** | **NEW** | Adminisztrátori műveletek és 4-szem elv naplózása. | +| **operational_logs** | **NEW** | Általános rendszerhasználati napló. | + +--- + +## 📂 3. Érintett Fájlok Listája (Checklist) + +Kérlek, ellenőrizd, hogy ezek a fájlok a legfrissebb verziót tartalmazzák-e a mentésedben: + +- [x] **`backend/app/models/identity.py`** (A teljes Person/User/Wallet logika alapja) +- [x] **`backend/app/models/audit.py`** (A Ledger és Security Log definíciók) +- [x] **`backend/app/models/organization.py`** (A SalesAssignment tábla hozzáadása) +- [x] **`backend/app/models/__init__.py`** (Az összes modell regisztrációja az Alembic számára) +- [x] **`backend/app/db/base.py`** (A metadata importok frissítése) +- [x] **`backend/app/core/validators.py`** (Az IdentityNormalizer és Hash generáló logika) +- [x] **`backend/migrations/versions/XXXX_full_ecosystem_upgrade_v1_6.py`** (A generált migrációs fájl) + +--- + +## 🔮 4. Következő Lépések (Roadmap) + +1. **Service Réteg Implementálása:** Megírni a logikát, ami ténylegesen számolja a 10/5%-os jutalékot és beírja a `FinancialLedger`-be. +2. **Admin UI:** Felületet készíteni a `system_parameters` (Jutalék szintek) állítására. +3. **Robot v1.8:** A "Ghost" szervizek bekötése az új `Person` logikába (automata `identity_hash` generálás a cégadatokból). + +# Changelog + +## [v1.1.0] - 2026-02-17 "The Awakening" +### 🚀 Hozzáadva (New Features) +- **AI Service (Gemini Integration):** `app/services/ai_service.py` létrehozva. A rendszer mostantól képes a "Yamaha 4HN" típusú zajos adatokból tiszta marketing neveket és műszaki specifikációkat generálni. +- **Robot 2 (Technical Enricher):** `app/workers/technical_enricher.py` frissítve v1.1-re. Hibrid működés: RDW adatbázis + AI kiegészítés. +- **Robot 3 (OCR - Előkészület):** `app/workers/ocr_robot.py` váza elkészült a dokumentumok feldolgozásához. +- **Reporting:** `app/scripts/morning_report.py` létrehozva a napi robot-tevékenység összefoglalására. +- **Logging:** Új `ProcessLog` tábla létrehozva az `audit` sémában a háttérfolyamatok nyomon követésére. + +### 🐛 Javítva (Bug Fixes) +- **Docker Infrastructure:** - Javítva a `KeyError: 'ContainerConfig'` hiba a Docker Compose V2-re váltással. + - Javítva az "empty database URL" hiba a migrációnál (`.env` változók helyes átadása). + - Hálózati beragadások (Gitea/Nginx conflict) feloldva. +- **Circular Imports:** Megszüntetve a `SystemParameter` modell duplikációja (`system_config.py` vs `system.py`). Minden szerviz (`Auth`, `Security`, `Cost`, `Gamification`) mostantól a központi `app.models`-ből importál. +- **Swagger UI:** Az API sikeresen elindul, a dokumentáció elérhető a `/docs` végponton. + +### ⚙️ Infrastruktúra (Refactor) +- **Docker Compose:** Teljes tisztítás. Duplikált környezeti változók törölve, `env_file` használat optimalizálva. +- **Services:** A robotok (`enricher`, `catalog`, `hunter`) külön konténerekbe szervezve, `unbuffered` python kimenettel a valós idejű logolásért. + +### 🛡️ Biztonság +- `.env` fájl szerkezete egységesítve, duplikációk eltávolítva. \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/V01_gemini/16_TESTING_AND_DEPLOYMENT_GUIDE.md b/archive/2026.02.18 Archive_old_mapps/V01_gemini/16_TESTING_AND_DEPLOYMENT_GUIDE.md new file mode 100755 index 0000000..9cc5dc7 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_gemini/16_TESTING_AND_DEPLOYMENT_GUIDE.md @@ -0,0 +1,46 @@ +# 🧪 TESZTELÉSI ÉS ÉLESÍTÉSI ÚTMUTATÓ (v1.4) + +## 1. Előkészületek és Környezet +1. **SQL Patch:** Meglévő adatbázis esetén futtasd a manuális frissítő SQL-t (mothers_name, social_provider, is_transferable oszlopok hozzáadása). +2. **Enum Ellenőrzés:** Győződj meg róla, hogy a Postgres `userrole` típus tartalmazza a kisbetűs értékeket. +3. **Docker Build:** `docker compose up -d --build` (Kényszeríti az új Python kód betöltését). + +## 2. Regisztrációs Teszt Forgatókönyvek + +### A) Step 1: Lite Regisztráció (Clean Test) +- **Endpoint:** `POST /api/v1/auth/register` +- **Elvárt eredmény:** 201 Created, `access_token` visszaadva, de a DB-ben a User `is_active = False` és nincs hozzá Person rekord. + +### B) Step 2: KYC Kitöltés (Advanced Test) +- **Endpoint:** `POST /api/v1/auth/complete-kyc` +- **Adat (JSON):** +```json +{ + "mothers_name": "Minta Mária", + "id_card_number": "AB123456", + "driver_license_categories": ["A", "B"], + "boat_license_number": "H-99999" +} + +# 🧪 TESZTELÉSI ÉS ÉLESÍTÉSI ÚTMUTATÓ (v1.0) + +## 1. Előkészületek a távoli teszteléshez +Mielőtt elindítanád a teszteket, győződj meg róla, hogy a háttérfolyamatok frissültek: +1. A `.env` fájl mentve van a helyes jelszavakkal. +2. A konténerek újraépítése és indítása: + `docker compose up -d --build` (Ez kényszeríti a Python kódot az új verzióra). +3. Ellenőrizd a logokat: `docker logs -f service_finder_api` (Itt látod, ha hiba van induláskor). + +## 2. Tesztelési Forgatókönyvek (End-to-End) + +### A) Új Regisztráció Teszt (Clean Registration) +- **Endpoint:** `POST /api/v1/auth/register` +- **Adat (JSON):** +```json +{ + "email": "teszt.felhasznalo@profibot.hu", + "password": "nagyonerospassword123", + "first_name": "János", + "last_name": "Teszt", + "region_code": "HU" +} \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/V01_gemini/17_DEVELOPER_NOTES_AND_PITFALLS.md b/archive/2026.02.18 Archive_old_mapps/V01_gemini/17_DEVELOPER_NOTES_AND_PITFALLS.md new file mode 100755 index 0000000..2f2c361 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_gemini/17_DEVELOPER_NOTES_AND_PITFALLS.md @@ -0,0 +1,37 @@ +# 🛠️ DEVELOPER NOTES & TROUBLESHOOTING + +## 1. ADATBÁZIS ÉS SQL FIXEK +### Postgres Enum Case Sensitivity +* **Probléma:** Az SQLAlchemy Enum típusa és a Postgres Enum típusa ütközhet, ha a Python kódban nagybetűs stringet (`USER`) küldünk. +* **Megoldás:** Mindig használd a `.value` property-t vagy kényszerítsd a kisbetűs stringet: `role="user"`. + +### Tábla oszlopok frissítése +* **Probléma:** A `Base.metadata.create_all` nem adja hozzá az új oszlopokat a már meglévő táblákhoz. +* **Megoldás:** Új mező esetén (pl. `social_provider`, `mothers_name`) manuális `ALTER TABLE` parancsot kell futtatni vagy Alembic migrációt generálni. + +## 2. BACKEND API HIBÁK +### ImportError: create_access_token +* **Ok:** A `app.core.security` modulban hiányzott a funkció, vagy elavult volt az import az `endpoints/auth.py`-ban. +* **Javítás:** A `security.py`-nak tartalmaznia kell a `jose` könyvtárat használó tokengenerálást. + +### Üres Swagger (OpenAPI) felület +* **Ok:** Ha az SQLAlchemy Mapper vagy egy Pydantic séma importja hibás, a FastAPI nem tudja legenerálni a dokumentációt. +* **Javítás:** Ellenőrizd a `docker logs` kimenetét indításkor, keresd a `MapperConfigurationError` vagy `ImportError` sorokat. + +# 17. Developer Notes & Pitfalls + +## 17.1. SQLAlchemy & Circular Imports +**Hiba:** `InvalidRequestError: Mapper has no property 'organization'` +**Ok:** Ha egy modellben definiálsz egy `ForeignKey`-t, de nem adod hozzá a `relationship`-et, a SQLAlchemy mapper inicializáláskor összeomolhat, ha egy másik modell próbál hivatkozni rá (back_populates). +**Megoldás:** Mindig párban definiáld a kapcsolatokat (FK + relationship). +**Példa javítás (AssetAssignment):** +```python +organization_id = Column(Integer, ForeignKey("data.organizations.id")) +organization = relationship("Organization") # Ez hiányzott! + +17.2. Configuration Missing + +Hiba: AttributeError: 'Settings' object has no attribute 'STATIC_DIR' Tanulság: Ha fájlrendszer műveleteket végzel (pl. JSON export), mindig a core/config.py-ban definiáld az abszolút útvonalakat (BASE_DIR, STATIC_DIR), ne hardkódolj útvonalakat a service fájlokban. +17.3. Database Migrations + +Best Practice: Ha mezőt adsz hozzá egy modellhez (pl. User.region_code), azonnal generálj Alembic migrációt (alembic revision --autogenerate), különben az API 500-as hibát dob, mert a Python objektum attribútuma létezik, de az SQL lekérdezés nem adja vissza az oszlopot. \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/V01_gemini/18_ASSET_AND_FLEET_SPECIFICATION.md b/archive/2026.02.18 Archive_old_mapps/V01_gemini/18_ASSET_AND_FLEET_SPECIFICATION.md new file mode 100755 index 0000000..a82eb43 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_gemini/18_ASSET_AND_FLEET_SPECIFICATION.md @@ -0,0 +1,235 @@ +# 🏎️ 18_ASSET_AND_FLEET_SPECIFICATION (v1.2) + +Ez a dokumentum írja le a rendszer magját képező "széf" logikát, ahol minden közlekedési eszköz (Asset) egyedi életutat és digitális lenyomatot kap. + +## 1. Az Alapelv: "Mindenki Flottatulajdonos" +A rendszerben a technikai réteg nem tesz különbséget magánszemély és cég között. +- **Privát Flotta:** A regisztráció során automatikusan létrejövő szervezet (**Organization**). +- **Széf (Safe Deposit):** A flotta izolált része, ahol az eszközök (járművek) és azok bizalmas okmányai (Vault) találhatók. + +--- + +## 2. Eszköz Típusok és Univerzális Azonosítók (UAI) +Minden eszköz rendelkezik egy **Univerzális Állandó Azonosítóval (UAI)**, amely az életútja során soha nem változik. + +| Kategória | Elsődleges Azonosító (UAI) | Speciális Adatpontok | +| :--- | :--- | :--- | +| **Közúti (Car, Bike, Bus)** | **VIN** (Alvázszám) | Rendszám, Motorkód, Sebességváltó kód | +| **Vízi (Boat, Yacht)** | **HIN** (Hull ID) | MMSI kód, IMO szám, Hajó neve | +| **Légi (Aircraft)** | **Serial Number** | Lajstromjel (Registration), Típusjelzés | +| **Heavy Duty / Agri** | Egyedi sorozatszám | Üzemóra, Teljesítmény, Kanál/Vágóasztal típus | +| **Micro-mobility** | Vázszám / UUID | Akkumulátor ciklus, Hatótáv | + +### Kiegészítő mérőszámok: +- **Futásteljesítmény (Odometer):** Közúti járműveknél (km/mérföld). +- **Üzemóra (Operating Hours):** Hajók, repülők és munkagépek esetén az elsődleges szervizintervallum-mérő. +- **VIN Validáció:** Közúti járműveknél kötelező a **VIN Checksum (MOD 11)** ellenőrzése rögzítéskor. + +--- + +## 3. A Jármű DNS (Deep Data Structure) +A rendszer két rétegben kezeli a jármű adatait a teljes életút követéséhez. + +### 3.1. Gyári Konfiguráció (Factory Specs) +- **Trim Level:** Felszereltségi szint (pl. AMG Pack, S-Line). +- **Technikai paraméterek:** Motorvariációk, kW/LE, nyomaték, gyári felni/gumi méretek (ET számmal), folyadékmennyiségek. +- **Szervizintervallumok:** Gyártói előírások (idő vagy távolság alapú). + +### 3.2. Aktuális Állapot és Módosítások +- **Status Quo:** Gyári extrák, utólagos módosítások (Aftermarket - pl. vonóhorog, gázszett) és hiányzó gyári elemek követése. + + + +--- + +## 4. Digitális Szervizkönyv és Minősítés +### 4.1. Eseményalapú Idővonal (Timeline) +Minden bejegyzés megváltoztathatatlan (immutable) logként rögzül: +- **Típusok:** Karbantartás, Javítás, Műszaki Vizsga, Baleset, Tulajdonosváltás. +- **Csatolmányok:** Alkatrész fotók, számlák (OCR), munkalapok. + +### 4.2. Kettős Értékelési Rendszer +1. **AI Health Score (Technikai):** Algoritmus alapú pontszám a szerviztörténet és a gyári előírások betartása alapján. +2. **Driver Rating (Emocionális):** Szubjektív sofőrértékelés (Komfort, Vezetési élmény, Praktikum). + +--- + +## 5. Multi-Robot Harvester Architektúra +A katalógus feltöltéséért és frissítéséért kategória-specifikus robotok felelnek (`BaseHarvester` alapokon). + +### 5.1. Robot Típusok: +- **Autó / Motor Robot:** Közúti adatokra. +- **Heavy Duty / Agri Robot:** Teherautókra és munkagépekre. +- **Specialty Robot:** Vízi és légi azonosítókra (MMSI, Lajstrom). + +### 5.2. Adatgyűjtési Szintek: +- **Initial Load:** A top 1000 európai típus alapfeltöltése. +- **On-Demand Fetch:** Felhasználói "Trigger" hatására indított soron kívüli mélykeresés (Deep Web Scrape). +- **Verification Status:** `verified` (teljes), `incomplete` (részleges), `pending` (ellenőrzésre vár). + + + +--- + +## 6. OCR és Dokumentum Validációs Stratégia +A dokumentumfelismerés (OCR) hibrid technológiát és Tier-alapú prioritást alkalmaz. + +### 6.1. Feldolgozási Sorrend (Failover Logic) +1. **Tier 1 (External Cloud):** Google Vision / Azure Form Recognizer (ingyenes keret erejéig). +2. **Tier 2 (Saját Fallback):** Helyi szerveren futó **PaddleOCR** modul. + +### 6.2. Üzleti Logika és Monetizáció +- **VIP+ / Premium+:** Azonnali (Real-time) OCR feldolgozás (3-5 másodperc). +- **Lite:** Háttérfolyamat (sorban állás), korlátozott havi kvóta (pl. 1 scan/hó). +- **Kreditalapú túllépés:** A kvóta feletti beolvasások a `Wallet`-ből levont kreditért vásárolhatók meg. + + + +--- + +## 7. Infrastruktúra és Adatkezelés +### 7.1. Dokumentum Tárolás (NAS) +- **Elérési út:** `/mnt/nas/app_data/assets/{asset_id}/` +- **Típusok:** + - **Vault (Tartós):** Kritikus okmányok (Forgalmi, Adásvételi) hash-elt fájlnévvel. + - **Ephemeral (Ideiglenes):** Napi bizonylatok (Parkolójegy), melyek OCR után 90 nappal törlődnek. +- **Képoptimalizálás:** Automata átméretezés (max 1600px) és WebP konverzió (~80-90% megtakarítás). + +### 7.2. Címkezelési Protokoll (v2.0) +Minden címet (székhely, tulajdonos, szerviz) atomizált formában tárolunk a pontos riportáláshoz: +- Irányítószám, Település, Közterület neve, Közterület jellege (utca, út stb.), Házszám (emelet/ajtó kiegészítéssel). + +--- + +## 8. Kivételkezelés: Ismeretlen Járművek +Ha az eszköz nem szerepel a katalógusban: +1. **Custom Asset:** Manuális rögzítés kötelező dokumentum-fotóval. +2. **AI Verifikáció:** OCR-rel összeveti a fotót a bevitt adatokkal. +3. **"Unverified Model" jelzés:** Amíg a Robot vagy egy Admin meg nem erősíti az adatok hitelességét. + +## 3. Document Engine & Optimization +- **Processing:** Feltöltéskor automatikus méretoptimalizálás (max 1600px) és WebP konverzió. +- **Thumbnails:** Minden képből 300px széles WebP előnézet generálódik a gyors UI eléréshez. +- **Supported Formats:** JPG, PNG, WEBP (képek); PDF, DOCX (dokumentumok). +- **OCR Integration:** Számlák és munkalapok esetén automata adatkinyerés (alkatrészek, árak, kilométeróra állás). + +## 7.4 Dokumentum Életciklus és Pufferelés (v2.2) + +A rendszer háromlépcsős tárolási és feldolgozási logikát alkalmaz az optimális hálózati és szerver-teljesítmény érdekében: + +1. **Ingestion (TEMP - Helyi SSD):** - Minden feltöltött állomány a `/app/temp/uploads/` mappába érkezik. + - Itt történik az AI/OCR elemzés és a képoptimalizálás (Pillow). + - A nyers forrásfájl a feldolgozás után **30 percig** marad itt (puffer), hogy a felhasználó azonnal visszanézhesse, mielőtt a NAS-ra kerül. + +2. **Presentation (THUMBNAIL - Helyi SSD):** + - A Pillow által generált 300px széles WebP miniképek a szerver lokális `/app/static/previews/` könyvtárába kerülnek. + - A UI (web/app) kizárólag ezeket tölti be a listázáskor, elkerülve a NAS terhelését. + +3. **Vault (NAS - Hosszú távú tároló):** + - A feldolgozott, nagyfelbontású (max 1600px) WebP állomány átkerül a NAS-ra: `/mnt/nas/app_data/organizations/{id}/vault/`. + - A NAS-hoz csak akkor fordul a rendszer, ha a felhasználó kifejezetten a dokumentum nagy változatát kéri. + + ## 5. Discovery Bot Strategy + +### 5.1 Prioritási Sorrend +A Botok az alábbi sorrendben pásztázzák az adatforrásokat: +1. **Land (Földi járművek):** + * Személyautók (Car), Motorok (Bike), Teherautók (Truck). + * Adatforrás: Márkakereskedői listák, Gyártói API-k. +2. **Infrastructure (Infrastruktúra):** + * Benzinkutak, Elektromos töltők (OpenChargeMap API). + * Ezek könnyen elérhető, statikus adatok. +3. **Services (Szervizek):** + * Google Maps API, Cégjegyzék adatok. + * Ezeket jelöli meg a rendszer "Unverified" (Bot-talált) státusszal. + +### 5.2 Adatgazdagítás +A Bot nem csak a nevet keresi. Célzottan gyűjti: +* Nyitvatartási idők. +* Kapcsolattartói adatok (Email, Weboldal). +* Közösségi média linkek. +* *Szabály:* A Bot által hozott adat felülírható a "Service Hunt" során a felhasználó által (magasabb megbízhatóság). + +## 6. Multi-Source Consensus Logic +A szervizek és szolgáltatók hitelességét nem csak az Admin, hanem a források száma határozza meg. + +### 6.1 Bizalmi szintek (Confidence Score) +* **Score 1:** Egyetlen forrás (Bot vagy User). Státusz: `pending`. +* **Score 2:** Két független forrás megerősítése. +* **Score 3+:** Automatikus hitelesítés (`verified`). Nincs szükség emberi beavatkozásra. + +### 6.2 Bot Adatforrások (Priority: Car & Bike) +A Botok az alábbi sorrendben dolgoznak: +1. Hivatalos gyártói oldalak (Márkaszervizek). +2. Szakmai adatbázisok (pl. Autóklub, Kamarák). +3. Google/Social media API-k. + +## 4. Telephelyek (Locations) és Szervizpontok +Minden szolgáltató (Organization) több telephelyet tarthat fenn. + +### 4.1 Kötelező Adatstruktúra +Minden telephely rögzítésekor az alábbi bontott címadatok kötelezőek: +- Irányítószám, Város, Közterület neve, Közterület típusa, Házszám. +- Opcionális: Helyrajzi szám (parcel_id) külterületi vagy HRSZ alapú azonosításhoz. + +### 4.2 Validációs Folyamat +A rögzített címek automatikusan bekerülnek a Master Geo adatbázisba, építve a rendszer globális címjegyzékét. + +## 5. Járművek és Költségek (MVP) +A járműadatok kezelése hibrid módon történik. + +### 5.1 Jármű Katalógus +- A rendszer egy központi katalógust (`asset_catalog`) épít. +- Új rögzítéskor a rendszer először a katalógusból kínál fel opciókat (Dropdown). +- Ha a modell nem létezik, a rendszer automatikusan felveszi (Self-learning catalog). + +### 5.2 Költségkövetés (TCO) +- Minden Asset-hez rögzíthető költség (`asset_costs`). +- Kötelező adatok: Kategória, Összeg, Dátum. +- Opcionális: Km óra állása (az amortizáció és szervizintervallum számításához). + +## 2026.02.10 FRISSÍTÉS - ATOMIZÁLT ADATMODELL ÉS MODULÁRIS API + +### 1. Adatbázis Szerkezet (A 4 Pillér) +A járművek kezelése "Single Responsibility" elv alapján 4 modulra bomlott: +1. **Identity (Asset):** Alapadatok (VIN, Rendszám, Tulajdonos). +2. **Catalog (AssetCatalog):** Gyári statikus adatok (Típus, Motor, Akku). Ezt a Robotok töltik. +3. **Telemetry (AssetTelemetry):** Változó állapot (KM óra, VQI minőség index, DBS vezetési stílus). +4. **Financials (AssetCost):** Pénzügyi tranzakciók 9 kategóriába sorolva (Fuel, Service, Tax, stb.). + +### 2. Moduláris API Végpontok +A teljesítmény optimalizálása érdekében a \`Full Profile\` helyett 3 dedikált végpontot használunk: +- \`GET /api/v1/assets/{id}\`: Csak identitás és katalógus (Gyors nézet). +- \`GET /api/v1/assets/{id}/costs\`: Csak pénzügyi történet és grafikonok. +- \`GET /api/v1/assets/{id}/telemetry\`: Csak élő adatok (Dashboard). + +*A javított AssetAssignment logika dokumentálása.* + +```markdown +# 18. Asset & Fleet Management Specification + +## 18.2. Asset Assignment Logic +A járművek és eszközök hozzárendelése a rendszer egyik legkritikusabb része. + +### 18.2.1. Assignment Model (`AssetAssignment`) +Kapcsolatot teremt egy Jármű (`Asset`) és egy Szervezet (`Organization`) között. +- **asset_id**: UUID (Melyik jármű?) +- **organization_id**: Integer (Melyik cég használja?) +- **status**: Active / Released +- **Validáció:** Egy jármű egyszerre csak egy szervezetnél lehet `active` státuszban. + +*(Megjegyzés: A v1.2.5 frissítés javította az ORM kapcsolatokat, így a lekérdezések most már közvetlenül elérik az `assignment.organization` objektumot.)* + +## 4.0 Catalog 2022+ Strategy (Hybrid Mode) +A CarQueryAPI korlátai miatt 2022 utáni modelleknél a Robot 1 az alábbi hibrid logikát alkalmazza: +1. **API Ninjas & Auto-Data Sync:** Elsődleges technikai forrás. +2. **European Scraper Mode:** A mobile.de és autoscout24.hu portálok típusválasztóinak (meta-adatok) aratása a legfrissebb modellek és motorváltozatok rögzítéséhez. + +## 6. Szerviz Logika és Intervallumok +A szervizkönyv nem csak eseménynapló, hanem előrejelző rendszer. + +### 6.1 Karbantartási Terv (Maintenance Plan) +Az MDM-ben rögzített `specifications` tartalmazza a fődarabok szervizigényét: +- **Folyadékok:** Típus, mennyiség, csereperiódus (km/hónap). +- **Alkatrészek:** Gyári kódok és alternatívák (cross-reference). +- **Biztonság:** Időszakos vizsgák (érintésvédelem, emelőhátfal, hajó szemle). \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/V01_gemini/19_ADMIN_AND_PERMISSIONS_SPEC.md b/archive/2026.02.18 Archive_old_mapps/V01_gemini/19_ADMIN_AND_PERMISSIONS_SPEC.md new file mode 100755 index 0000000..0da4f18 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_gemini/19_ADMIN_AND_PERMISSIONS_SPEC.md @@ -0,0 +1,154 @@ +# 🛠️ 19_ADMIN_AND_PERMISSIONS_SPEC (v1.0) + +## 1. Adminisztrátori Hierarchia és Területi Felosztás +A rendszer többszintű, régió-alapú jogosultságkezelést alkalmaz (**RBAC + Geographic Scope**). + +| Szint | Megnevezés | Területi hatókör | Jogkörök jellege | +| :--- | :--- | :--- | :--- | +| **L0** | **SuperAdmin** | Globális (Összes ország) | Teljes hozzáférés, Rendszer-paraméterezés, Admin kinevezés. | +| **L1/A** | **Global Director** | Régiós (Több ország) | Országos vezetők felügyelete, aggregált statisztikák. | +| **L1/B** | **National Manager** | Országos (pl. HU) | Saját ország moderátorainak és adatainak teljes kezelése. | +| **L2** | **Staff (Mod/Supp/Fin)** | Lokális / Szakaszolt | Operatív feladatok (VIES, support jegyek, kifizetések). | +| **L3** | **Task Moderator** | Feladat-specifikus | Sablon alapú, korlátozott hozzáférés (pl. csak szerviz validálás). | + + + +### Verseny Logika (Privacy Protection) +Az L1/B szintű vezetők látják más országok aggregált KPI mutatóit (statisztikai összehasonlítás), de **nincs betekintésük** a konkrét személyes vagy céges adatokba. + +--- + +## 2. Jogosultságkezelés és Sablonok +- **Permissions Table:** Elemi jogosultságok atomi tárolása (pl. `approve_vies`, `modify_credits`). +- **Role Templates:** Előre definiált szerepkör-sablonok (pl. "Senior Financial - DE"). +- **Regionális Izoláció:** Az adminisztrátorok alapértelmezetten csak a hozzájuk rendelt `ISO_country_code` alá tartozó rekordokat módosíthatják. + +--- + +## 3. Biztonság és "Kill-Switch" Protokoll +### 3.1. Hitelesítés +- **MFA/2FA:** A második bejelentkezéstől kezdve kötelező a **TOTP** (pl. Google Authenticator) használata. +- **Social Auth:** Engedélyezett, de nem váltja ki a kötelező 2FA-t. + +### 3.2. Anomaly Score (Fekete Doboz) +- **Audit Logs:** Minden kattintást és módosítást JSON formátumban rögzítünk. +- **Automatikus Felfüggesztés:** Kritikus viselkedés (pl. tömeges adattörlés) esetén a rendszer automatikusan zárolja az admin fiókot és riasztást küld a felette álló szintnek. +- **SuperAdmin Recovery:** Csak egyedi **Offline Kulccsal** és előre regisztrált fizikai eszközzel lehetséges. + +### 3.3. State Snapshot (Visszaállíthatóság) +Minden módosítás előtt a rendszer menti a rekord aktuális állapotát. Az L0/L1 szintű adminisztrátorok egy gombnyomással visszaállíthatják az eredeti adatokat károkozás vagy hiba esetén. + +--- + +## 4. Értesítési Engine és Lejárati Figyelmeztetések +A rendszer proaktív módon értesíti az érintetteket a kritikus dátumok előtt (Push, Email, Mini-CRM). + +### 4.1. Előfizetési Értesítések +- **Hatókör:** Lite+, VIP, VIP+, Corporate csomagok. +- **Ütemezés:** Automatikus figyelmeztetés **30, 15, 7 és 1** nappal a lejárati dátum előtt. + +### 4.2. Technikai és Jármű Okmányok +A rendszer figyeli és jelzi az alábbiak lejáratát: +- **Forgalmi engedély:** Műszaki vizsga érvényessége. +- **Biztosítás:** KGFB és CASCO fordulónapok. +- **Lízing:** Szerződéses futamidő vége. +- **Specialty:** Hajólevél, lajstrom, emelőgép vizsga stb. + +--- + +## 5. CRM és Szervezeti Kontaktok +Minden szervezet (Organization) esetében kötelező legalább egy **Adminisztratív Kontakt** megadása. +- **Multi-Role:** Egy Person több szervezetben is lehet `owner` vagy `fleet_manager`. +- **CRM Mezők:** Név, beosztás, közvetlen elérhetőség (Pénzügyi felelős / Operatív felelős elkülönítve). + +--- + +## 6. Corporate Onboarding és Validáció +A cégek hitelesítése három szinten történik: +1. **Tier 1 (Automata):** Adószám alapú validáció (VIES / Nemzeti API). +2. **Tier 2 (AI/OCR):** Feltöltött dokumentumok (pl. Alapító okirat) intelligens elemzése. +3. **Tier 3 (Human):** L2/L3 szintű adminisztrátori jóváhagyás, ha az automatika bizonytalan. + +--- + +## 7. B2B Jutalék és MLM Korlátok +- **Direct Referral:** Szervezet által meghívott másik szervezet esetén kizárólag az **1. szintű (L1)** jutalék jár. +- **MLM Kivétel:** A szervezetek nem építhetnek többszintű hálózatot; a kifizetés minden esetben fix üzleti megállapodás vagy egyedi szerződés alapján történik. +- **Adminisztrátori Meghívók:** Csak manuálisan generálhatók, és szigorúan **24 órás** lejárati idővel rendelkeznek. + +## 6. Dinamikus Szabálymotor (Rule Engine) +A rendszer minden fontos paramétere a `data.system_settings` táblában tárolt JSON objektumokból származik. + +### 6.1 Módosítási protokoll +* Az Admin felületen módosított értékek (pl. Kredit jutalom összege) azonnal érvénybe lépnek. +* A módosítás után a Backend Cache-t (`ConfigService`) üríteni kell. + +### 6.2 Paraméterezhető modulok +* **Service Hunt:** Távolságok, XP/Kredit szorzók. +* **Fraud Protection:** Strike limitek, kitiltási idők. +* **Billing:** EUR/HUF/USD váltószámok, csomagárak, jármű-slot árak. + +## 2026.02.10 FRISSÍTÉS - HIERARCHIKUS RBAC RENDSZER + +### 1. Rang-alapú Jogosultság (Rank System) +A rendszer a \`system_parameters\` táblában tárolt \`RBAC_MASTER_CONFIG\` JSON alapján működik. +- **SUPERADMIN (Rank 100):** Globális hatókör, mindent lát. +- **COUNTRY_ADMIN (Rank 80):** Országos felelős. +- **REGION_ADMIN (Rank 60):** Területi vezető (Manage Moderators). +- **MODERATOR (Rank 40):** Adatvalidátor. +- **SALES (Rank 20):** Üzletkötő (Csak saját partnerek). +- **USER (Rank 10):** Végfelhasználó. + +### 2. Scope (Hatókör) Védelem +Minden műveletnél ellenőrizzük a \`scope_id\` egyezését: +- Ha a felhasználó \`scope_level = 'region'\`, akkor csak olyan adatot szerkeszthet, ami ugyanahhoz a régióhoz tartozik. +- Kivétel: Impersonation (Megszemélyesítés) - Audit loggal védve. + + +## 1. Gamification Adminisztráció +A `data.system_parameters` táblában a `GAMIFICATION_MASTER_CONFIG` kulcs alatt az alábbiak állíthatóak: +- `xp_logic`: `base_xp`, `exponent`. +- `penalty_thresholds`: A szintekhez tartozó büntetőpont határok. +- `level_up_rewards`: 10-es szintenkénti Kredit jutalom mértéke. +- `blocked_roles`: [superadmin, service_bot]. +- `auto_convert_social`: True/False. + +## 2. Gamification Konfiguráció (JSON Schema) +A `GAMIFICATION_MASTER_CONFIG` struktúrája: +- `xp_logic`: Alap XP és kitevő a nehezedő szintezéshez. +- `penalty_logic`: Küszöbértékek, szorzók és ledolgozási ráta. +- `conversion_logic`: Social-to-Credit váltási arány. +- `level_rewards`: Szintlépési bónuszok mértéke. + +## 19.1. SuperAdmin Capabilities +A `rank: 100` szintű felhasználó (SuperAdmin) az egyetlen, aki: +1. **Translation Sync:** Írási joga van a szerver fájlrendszerére a `/api/v1/admin/translations/sync` végponton keresztül. +2. **Sentinel Override:** Felülbírálhatja az automatikus biztonsági zárolásokat. + +## 19.2. Admin API Endpoints +- `POST /admin/translations/sync`: + - **Trigger:** Manuális (Gombnyomás a Dashboardon). + - **Action:** `data.translations` -> `static/locales/*.json`. + - **Permission:** SuperAdmin ONLY. + + + ## 5. Security & Audit Logging + +A rendszer két szinten naplózza az eseményeket: + +### 5.1 Operational Log (Üzemi Napló) +* **Cél:** Hibakeresés, User Activity követés. +* **Tartalom:** Jármű rögzítés, Adatjavítás, Keresés. +* **Hozzáférés:** Moderátor szinttől felfelé. + +### 5.2 Security Audit Log (Biztonsági Napló) +* **Cél:** Visszaélések megelőzése, Jogosultságok védelme. +* **Tartalom:** Rang emelés (Role Change), Kredit manuális jóváírása, VIP státusz adása, Admin belépés. +* **Hozzáférés:** Csak Superadmin és Country Admin (Szigorított). + +### 5.3 The "Four-Eyes" Principle (4-Szem Elv) +Kritikus műveletek (pl. egy User `is_vip` státuszának kézi átállítása vagy `penalty_points` törlése) esetén a rendszer: +1. Rögzíti a kérést a `security_audit_logs`-ban. +2. A státusz "Pending" marad. +3. A változás **csak akkor lép életbe**, ha egy MÁSIK Adminisztrátor jóváhagyja azt (`confirmed_by_id` kitöltése). +4. Szuperadmin esetén a `is_critical` flag aktiválódik, és azonnali riasztás megy a többi adminnak. \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/V01_gemini/20_Service_Finder_&_Trust_Engine.md b/archive/2026.02.18 Archive_old_mapps/V01_gemini/20_Service_Finder_&_Trust_Engine.md new file mode 100755 index 0000000..2af1b8c --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_gemini/20_Service_Finder_&_Trust_Engine.md @@ -0,0 +1,85 @@ +20. SERVICE FINDER & SPECIALIZED MARKETPLACE (TRUST ENGINE) +20.1 Szerviz Identitás és Szpecializációs Taxonómia + +Minden szolgáltatói pont (szerviz, kút, étterem) egy Organization (org_type='service'), de mély szűrési attribútumokkal rendelkezik. + + Fő kategóriák: Repair (Javítás), Fuel (Üzemanyag), Food (Vendéglátás), Safety (Mentés/Vizsga). + + Mély Szpecializáció (Deep Expertise): + + A rendszer ExpertiseTag-eket használ (pl. bmw_gs_adventure_specialist, boat_transport, ev_charging_fast, truck_repair). + + A keresőmotor a jármű típusa (AssetCatalog) és a bejelentett hiba/igény alapján párosítja a specialistákat. + +20.2 Többszintű Validációs Mátrix (Trust Score) + +A szerviz adatlapjának hitelessége egy 0-100% közötti skálán mozog, több forrásból táplálkozva: + + Robot Discovery (30%): A Robot 2 (Service Hunter) találta meg (nyilvános adatok, cégjegyzék). + + First User Entry (50%): Az első felhasználó rögzítette manuálisan. + + Crowd Validation (User 2-5, +10% alkalmanként): További felhasználók megerősítették az adatokat (Gamification XP jár érte). + + Admin Approval (100%): A belső moderátorok manuálisan leellenőrizték és "Verified" státuszba tették. + + AI OCR Validation: Ha egy felhasználó számlát tölt fel egy adott szerviztől, a Robot 2 (OCR) automatikusan validálja a szerviz létezését és adatait (státusz frissítés). + +20.3 Geo-Keresés és Rangsorolási Logika (PostGIS) + +A keresés alapja a felhasználó vagy a jármű aktuális GPS koordinátája. + +Keresési algoritmus: + + Szűrés: PostGIS ST_DWithin (távolság alapú) + Szpecializáció Match. + + Rangsorolás (Szkópolt logika): + + Premium User: 1. Preferált szervizek, 2. Legmagasabb Trust Score, 3. Hirdetők, 4. Útvonaltervezés szerinti valós távolság. + + Free User: 1. Hirdetők, 2. Légvonalbeli távolság, 3. Trust Score. + + Útvonaltervezés (Premium): Külső motor (pl. OSRM vagy GraphHopper) integráció a pontos elérési időhöz. + + ## 3.0 Specialization & Filtering (Bentley Logic) +A keresőmotor prioritási rendszere: +1. **Explicit Specialist:** Specializációs tag-ek alapján (pl. brand: Bentley). +2. **General Service:** Univerzális javítók, ahol nincs kizáró ok. +3. **Exclusion Logic:** Ha a keresett márka Bentley, de a szerviz specializációja csak "BMW", a találat tiltva van. + +## 4.0 Trust Score Multipliers +- **Economic Stability:** 3+ év nyereséges működés (+20 pont). +- **Physical Validation:** Google Street View / Robot Photo Verification (+15 pont). +- **Verified Staff:** Ha a szerelőregisztrációk száma > 2 (+10 pont). + +# 20. Service Finder & Trust Engine + +## Pre-searching (Silent Service Hunter) Logika +A cél a szervizek felderítése API költségek nélkül, kereszt-ellenőrzött forrásokból. + +### 1. Felderítési Fázis (Hunter A) +Többmotoros keresés (DuckDuckGo Lite, Bing, Yandex, OSM) segítségével: +- **Kulcsszó-dorking:** `site:facebook.com "Dunakeszi" "szerviz"`. +- **Informális adatok:** Fórumok, blogok és helyi közösségi posztok elemzése. +- **TEAOR Mátrix:** Az e-Cégközlöny napi frissítéseinek szűrése (4520, 4540, 2920 kódok). + +### 2. Validációs Pontrendszer (Trust Engine) +Minden talált entitás pontszámot kap: +- **+40 pont:** Aktív adószám és megfelelő TEAOR (4520/4540). +- **+20 pont:** Friss digitális jelenlét (Facebook/Instagram poszt < 30 nap). +- **+20 pont:** Fizikailag validált cím (OSM vagy lakossági megerősítés). +- **+10 pont:** Hívható, formátum-helyes telefonszám. + +### 3. Döntési Szintek +- **80+ pont:** Ellenőrzött (Verified) - Automatikus publikálás. +- **40-79 pont:** Moderációra vár - Manuális adminisztrátori jóváhagyás szükséges. +- **<40 pont:** Elutasítva/Inaktív - Marad a Stage táblában. + +## 6. Szerviz Logika és Intervallumok +A szervizkönyv nem csak eseménynapló, hanem előrejelző rendszer. + +### 6.1 Karbantartási Terv (Maintenance Plan) +Az MDM-ben rögzített `specifications` tartalmazza a fődarabok szervizigényét: +- **Folyadékok:** Típus, mennyiség, csereperiódus (km/hónap). +- **Alkatrészek:** Gyári kódok és alternatívák (cross-reference). +- **Biztonság:** Időszakos vizsgák (érintésvédelem, emelőhátfal, hajó szemle). \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/V01_gemini/21_DEEP ASSET CATALOG.md b/archive/2026.02.18 Archive_old_mapps/V01_gemini/21_DEEP ASSET CATALOG.md new file mode 100755 index 0000000..ce23d64 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_gemini/21_DEEP ASSET CATALOG.md @@ -0,0 +1,57 @@ +21.1 Adatmélység és Idővonal + +A rendszer célja a teljes EU-s járműpark lefedése a 2000-es évjárattól kezdődően. + + Hierarchia: Make -> Model -> Generation -> Engine Variant -> Trim Level. + + Kezdeti adatok: Az első fázisban a robot a 4 alapszintet tölti (Márka, Típus, Évjárat, Motor), majd iteratívan mélyíti a factory_data JSONB mezőt (olajmennyiség, nyomaték, guminyomás stb.). + + # 21. Deep Asset Catalog (MDM) + +Ez a dokumentum írja le a járművek technikai mélységét kategóriánként. + +## 1. Kategória Specifikus Adatok (JSONB Schemas) +- **Személyautó:** Klíma fajták (digit, többzónás), hajtáslánc, ADAS rendszerek. +- **Teherautó/Kamion:** Tengelyek száma, fülke típusa, retarder típusok, menetíró. +- **Motorkerékpár:** Munkaütem, hűtés módja, táskák/dobozok konfigurációja. +- **Hajó:** Merülés, vízkiszorítás, orrsugárkormány, navigációs elektronika. + +## 2. Numerikus Indexelés +A gyors keresés érdekében a következő mezők fix oszlopok: +- `engine_capacity` (ccm) +- `power_kw` (kW) +- `weight_kg` (Súly) +- `year_from / year_to` (Gyártási időszak) + +# 21. Deep Asset Catalog & Master Data Management (MDM) + +Ez a modul a rendszer "agyát" képezi, ahol a zajos külső forrásokból származó adatok tiszta, dúsított és egyedi járműspecifikációkká alakulnak. + +## 21.1 Adatmodell (vehicle_model_definitions) +A katalógus nem egyszerűen rekordokat tárol, hanem egy Master-Slave viszonyrendszert valósít meg a duplikációk elkerülése érdekében. + +### Kulcsfontosságú mezők: +- `technical_code`: Egyedi gyári azonosító (pl. PC44, ZX600R). Elsődleges kulcs a deduplikációhoz. +- `parent_id`: Önhivatkozás. Ha egy rekord duplikátum, itt mutat a Master (eredeti) rekordra. +- `synonyms` (JSONB): Alternatív elnevezések gyűjteménye (pl. "Tracer 9", "MT-09 Tracer") a kereshetőség javítására. +- `year_from / year_to`: Gyártási intervallumok a generációk megkülönböztetéséhez. +- `specifications` (JSONB): Műszaki adatok (olajmennyiség, gyertya típus, hűtőfolyadék). + +## 21.2 Master-Merge Logika +A rendszer az "Igazság Hierarchiáját" követi az adatok mentésekor: +1. **Hatósági Adat (RDW):** CCM és teljesítmény (kW) forrása. +2. **AI Adatbányászat (Gemini + Google Search):** Technikai kódok, évjáratok és szervizadatok forrása. +3. **Manuális felülbírálat:** Legmagasabb prioritású `status = 'manual_check'`. + +### Összefésülési szabály (Deduplikáció): +A Robot 2 csak akkor olvaszt össze két rekordot, ha: +- A `make` (gyártó) egyezik. +- A `technical_code` azonos és nem 'N/A'. +- A `engine_capacity` (CCM) megegyezik. + + + +## 21.3 Állapotgépek (Status Lifecycle) +- `unverified`: Alapállapot, csak nyers adatok. +- `ai_enriched`: Sikeresen dúsított, hitelesített Master rekord. +- `duplicate`: Felismert másolat, amely egy Master rekordhoz van láncolva. \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/V01_gemini/22_ROBOT ÖKOSZISZTÉMA.md b/archive/2026.02.18 Archive_old_mapps/V01_gemini/22_ROBOT ÖKOSZISZTÉMA.md new file mode 100755 index 0000000..fa047a1 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_gemini/22_ROBOT ÖKOSZISZTÉMA.md @@ -0,0 +1,164 @@ +22.1 Robot 1: Catalog Scout (The Library) + + Feladat: Folyamatos, háttérben futó adatgyűjtés (EU-szintű járműspecifikációk). + + Működés: Web-crawling és technikai adatbázisok szinkronizációja. Nem áll le, folyamatosan frissíti a vehicle_catalog táblát. + +22.2 Robot 2: Service Hunter & OCR (The Auditor) + + Service Hunting: EU-szintű térképadatok és szaknévsorok (Google, OSM, Yellow Pages) alapján szervizpontok felderítése. + + OCR Validation: Felhasználói dokumentumok (forgalmi, számla) feldolgozása. Ha az OCR szervizadatot talál, keresztellenőrzi a data.organizations táblával. + +22.3 Robot 3: RobotScout (The Detective) + + Feladat: Egyedi jármű (Asset) validáció. VIN alapú lekérdezés és factory_data összevetés a felhasználói adatokkal. + + 23. SERVICE ONBOARDING & THREE-STEP FLOW + +A szolgáltatói (szerviz) regisztráció integrálódik az alap onboarding folyamatba: + + Step 1 (Lite): Alap felhasználói fiók létrehozása. + + Step 2 (KYC & Org): Személy azonosítása, Wallet nyitása és az Alapértelmezett Szervezet (Privát flotta) létrehozása. + + Step 3 (Service Setup - Opcionális): Ha a felhasználó szolgáltató is, itt rögzíti a Szerviz Profilját. + + Létrejön egy második Organization rekord (org_type='service'). + + Hozzárendelésre kerülnek az ExpertiseTag-ek (Szakmai szempontok). + + GPS koordináták rögzítése (PostGIS). + +24. ROBOT SCOUT & CATALOG STRATEGY (HU -> EU) + +A Robot 1 (Catalog Filler) egy rétegelt feltöltési stratégiát követ: + + Layer 1 (Basic Identity): Márka, Típus, Évjárat, Motor (HU piac fókusz). + + Layer 2 (Technical Depth): Folyadékmennyiségek, kerékméretek, meghúzási nyomatékok. + + Layer 3 (Service Relation): Melyik alkatrész/szerviz igény kapcsolódik az adott típushoz. + +API Strategy + +24. Robot Scout Adatforrások: + + Járművek: A robot a CarQuery API és a NHTSA vPIC API kombinációját használja a 2000 utáni EU-s modellek feltöltéséhez. A ciklusidő: 1 év/5 perc. + + Szervizek: Az OSM Overpass API az elsődleges forrás a lokációkhoz. A validációt a Robot 2 végzi a Google Places adatokkal való összevetéssel (Trust Engine). + + Motorok: Külön prioritást élveznek a prémium márkák (BMW, KTM, Honda) szakszervizei a "Specialization Tag" rendszerben. + + 📘 MASTER BOOK KIEGÉSZÍTÉS (v2.4) - 2026.02.13 +20.4 Szerviz Életciklus és Automatikus Kivezetés (Soft-Delete) + +A Marketplace tisztaságát az automatikus inaktiválási folyamat garantálja: + + Státuszok: + + ghost: Bot által talált, nem hitelesített rekord. + + active: Működő, publikus szerviz. + + flagged: Gyanús (pl. bezártnak jelentett), felülvizsgálatra vár. + + inactive: Megszűnt vagy inaktivált szerviz (Soft-deleted). + + Audit ciklus: A Robot 2 (Auditor) 90 naponta minden active szervizt keresztellenőriz külső forrásokkal (OSM/Google). Ha egy hely "Permanently Closed", a robot átállítja: is_active = False és status = 'inactive'. + +22.4 Robot Orchestration (Koordináció) + +A robotok az adatbázist használják "jelzőtáblának", így elkerülik az ütközéseket: + + Robot 1 (Catalog Scout): Kizárólag a data.vehicle_catalog táblát írja. + + Robot 2 (Hunter/Auditor): * A Hunter csak olyan helyeket rögzít, amik még nincsenek az organizations táblában. + + Az Auditor csak az is_active=True rekordokat vizsgálja felül. + + Robot 3 (OCR/Detective): Dokumentum-alapú validálást végez. Ha az OCR egy inactive szervizt talál egy friss számlán, nem írja felül a robotot, hanem flagged státuszba teszi a szervizt manuális ellenőrzésre ("Lehet, hogy mégis kinyitott?"). + + 20.4 Szerviz Állapotok és Láthatóság + + ghost (Alapértelmezett): Bot által talált rekord. + + Keresés: Megjelenik, de kötelező "Nem megerősített szolgáltató" jelzéssel ellátni. + + Gamification: Teljesen nyitott. A felhasználók értékelhetik, fotózhatják. Minden ilyen interakció növeli a trust_score-t. + + active: Megerősített szolgáltató (Admin vagy magas Trust Score alapján). + + flagged: Felülvizsgálat alatt (pl. ellentmondásos adatok). + + inactive: Igazoltan megszűnt. Csak ez az állapot rejtett a keresés elől. + + ## 2.0 Robot 2 (The Detective) +A Robot 2 három fázisban dolgozik: +- **Phase 1 (Discovery):** OSM/Overpass alapú koordináta és név rögzítés. +- **Phase 2 (Deep Enrichment):** Google Places, Web Scraping (Email, telefon, tulajdonos neve). +- **Phase 3 (Financial Audit):** Nyilvános cégadatok (Árbevétel, létszám, adózott eredmény) éves szinkronizálása. + +# 22. ROBOT ÖKOSZISZTÉMA + +## Robot v1.9.2 (Ghost Commander) & n8n +A robotok és az n8n szoros együttműködésben dolgoznak. + +### Funkciók +- **Auto-Heal:** A járműkatalógus hiányos (null) adatainak automatikus pótlása Holland (RDW) és US (NHTSA) forrásokból. +- **Ban-Detection:** Automatikus "Circuit Breaker" logika. Ha a CarQuery vagy más forrás tilt, a robot átvált "Silent Mode"-ba. +- **Event Hunter:** n8n workflow figyeli a motoros/autós találkozókat és eseményeket, majd összeköti őket a helyi szervizpartnerekkel. +- **Gamification Link:** A robot regisztrálja a felhasználói validálásokat és kiosztja a pontokat/krediteket. + +# 22. Robot Ökoszisztéma + +A rendszer automatizált adatgyűjtő és dúsító ágensei. + +## 1. Model Enrichment Robot (Dúsító) +- **Működés:** Hajnali 01:00 - 05:00 között. +- **Logika:** 1. Új `unverified` kódok keresése. + 2. RDW API lekérdezés (Holland alapok). + 3. AI (Gemini) Deep Scraping: Marketing név, felszereltségi lista, szervizintervallumok kinyerése. + 4. Validálás a JSON Sémák alapján. + 5. Master státusz beállítása. + +## 2. Resource Management +A robot figyeli a szerver terhelését. Ha a CPU > 70%, az AI lekérdezéseket lassítja (throttle), hogy ne zavarja a hajnali biztonsági mentéseket. + + # 22. Robot Ökoszisztéma Specifikáció + +A rendszer autonóm robotok hálózatából áll, amelyek egymásra épülve tisztítják és dúsítják a flottaszintű adatokat. + +## 22.1 Robot 1: Catalog Scraper (RDW) +- **Feladata:** Külső API-k (pl. Holland RDW) folyamatos monitorozása és új járművek importálása. +- **Működés:** Nyers adatokat hoz létre `unverified` státusszal. + +## 22.2 Robot 2: Technical Enricher & Master Merge (v1.2.6) +Ez a legkomplexebb modul, amely AI-t és webes keresést használ. + +### Főbb képességek: +- **Google Search Integration (RAG):** Ha az AI nem ismeri a modellkódot, valós időben keres a gyártói oldalakon. +- **Safe-Merge Technológia:** Megakadályozza a technikai kód nélküli rekordok véletlen összevonását (`N/A-{id}` generálásával). +- **Atomi tranzakciókezelés:** Minden mentés külön tranzakció, így a hiba nem szakítja meg a tömeges feldolgozást. + +### Működési folyamat: +1. Rekord kiválasztása (`status = unverified`). +2. RDW kiegészítő adatok lekérése. +3. Gemini 2.0 Flash meghívása keresőeszközzel. +4. JSON parseolás és kód-validáció. +5. Deduplikáció ellenőrzése és mentés. + + + +## 22.3 Robot 3: OCR & Document AI +- **Feladata:** Feltöltött okmányok, számlák és kilométeróra állások felismerése. +- **Technológia:** Multimodális Gemini 2.0 elemzés. +- **Kimenet:** Strukturált JSON, amely azonnal validálható a katalógus (R2) adataival. + +## 22.4 Robot 4: Service Hunter (Tervezett) +- **Cél:** A dúsított technikai adatok alapján szervizpartnerek és árak keresése. +- **Input:** Robot 2 által generált szerviz-specifikációk (olaj típus, mennyiség). + +## 22.5 Robot Monitoring & Operáció +A robotok állapotát nem csak SQL-ben, hanem az n8n Dashboardon és a logok szintjén is követjük. +- **Hibakezelés:** Automatikus visszalépés és ideiglenes kódgenerálás (`RESET-`, `UNKNOWN-`) az adatbázis kényszerek (Unique, Not Null) betartása érdekében. \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/V01_gemini/23_BRANCH_AND_LOCATION_SPEC.md b/archive/2026.02.18 Archive_old_mapps/V01_gemini/23_BRANCH_AND_LOCATION_SPEC.md new file mode 100755 index 0000000..c7d108c --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_gemini/23_BRANCH_AND_LOCATION_SPEC.md @@ -0,0 +1,24 @@ +# 🏢 23_BRANCH_AND_LOCATION_SPEC (v1.0) + +## 1. Telephely (Branch) Logika +A rendszer alapelve, hogy a jogi entitás (Organization) és a fizikai helyszín (Branch) elválik egymástól. + +### 1.1 Struktúra +- **Organization:** Jogi egység (Adószám, név). +- **Branch (Telephely):** Konkrét fizikai pont, ahol a szolgáltatás zajlik vagy ahol a flotta állomásozik. +- **Main Branch:** Minden szervezetnek van legalább egy "Fő" telephelye (`is_main=True`). + +### 1.2 Kapcsolatok +- **Szerviz:** Az értékelések és a nyitvatartás a `Branch`-hez kötődik. +- **Flotta:** A jármű hozzárendelés (`AssetAssignment`) opcionálisan tartalmaz egy `branch_id`-t, meghatározva a jármű fizikai helyét. + +## 2. Részletes Címkezelés +A címeket atomizált formában tároljuk a `data.branches` és `data.addresses` táblákban: +- `postal_code`, `city` +- `street_name`, `street_type` (utca, út, tér) +- `house_number`, `stairwell`, `floor`, `door` +- `hrsz` (Helyrajzi szám külterületi vagy speciális telkekhez) + +## 3. Életút Követés (Dual Twin) +- **Törlés:** A telephelyek "Soft Delete" (`is_deleted`) alá esnek. +- **Áthelyezés:** Ha egy telephely megszűnik, a hozzárendelt járművek automatikusan visszaállnak a Szervezet "Main Branch" helyszínére. \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/V01_gemini/_00_gemini_gem_kód b/archive/2026.02.18 Archive_old_mapps/V01_gemini/_00_gemini_gem_kód new file mode 100755 index 0000000..2e0659f --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/V01_gemini/_00_gemini_gem_kód @@ -0,0 +1,274 @@ +# ROLE: Senior Backend Architect & Security Engineer +# PROJECT: Service Finder Ecosystem (FastAPI, SQLAlchemy Async, PostgreSQL, Docker) + +## CONTEXT & ARCHITECTURE +A rendszer egy magas biztonságú, mikroszolgáltatás-jellegű monolit (Modular Monolith). A biztonsági és üzleti logika szigorúan elkülönül. + +## CORE LOGIC RULES (NON-NEGOTIABLE) + +1. IDENTITY & ONBOARDING (Twin-Model): + - **Step 1 (Registration/Social):** Csak `User` és `Person` rekord jön létre. + Státusz: `is_active = False`. + Folder Slug: `NULL`. + Organization/Wallet: NEM jön létre. + Service: `SocialAuthService` vagy `AuthService.register_lite`. + **Step 2 (KYC/Activation):** Itt történik az üzleti aktiválás. +- Státusz váltás: `is_active = True`. +- Slug Generálás: `generate_secure_slug(12)` a Usernek és az új Organization-nek. +- Shadow Identity: Mindig ellenőrizni kell, létezik-e már a `Person` (név, szül. adat, anyja neve alapján). +- Service: `AuthService.complete_kyc`. +2. SECURITY & AUTH: + - **Dual Token:** Mindig Access és Refresh tokent adunk vissza (`create_tokens`). + - **Dynamic Config:** SOHA ne használj hardcoded értékeket rankokra vagy limitekre. Mindig a `config.get_setting` (DB-ből: `data.system_parameters`) használandó. + - **RBAC:** A jogosultságot a `deps.check_min_rank` ellenőrzi dinamikusan. + - **Resource Access:** Mindig ellenőrizni kell a `scope_id`-t (Slug) a `deps.check_resource_access`-szel. +3. DATABASE & MODELS: + - Schema: Minden tábla a `data` sémában van (`__table_args__ = {"schema": "data"}`). + - Migráció: Adatbázis módosítás CSAK Alembic-kel történhet. + ## FILE STRUCTURE & RESPONSIBILITIES + - `app/api/deps.py`: Auth függőségek, Active User check, Scope check. + - `app/services/auth_service.py`: Step 2 logika, Slug generálás, Soft Delete. + - `app/services/social_auth_service.py`: Csak Step 1 logika (Google login). + - `app/core/config.py`: Dinamikus beállítások olvasása a DB-ből. + - `app/models/system_config.py`: A `SystemParameter` modell definíciója. + + ## CODING STANDARDS + - Minden aszinkron (`async/await`). + - SOHA ne rövidíts kódot "..."-al, mindig a teljes, működő fájlt add vissza. + - Type hint-ek (typing) kötelezőek. + - Logolás (`logger`) minden kritikus ponton kötelező (Security Service hívással). + + ## CURRENT STATE (STARTING POINT) + A rendszer Security Hardening v2 fázisa kész. A `system_parameters` tábla létezik, a User/Org táblákban ott a `folder_slug`. A kód ezekre a mezőkre támaszkodik. + + 🧬 SERVICE FINDER - UNIVERSAL SYSTEM PROMPT (v1.2) + + ROLE: Senior Technical Product Manager & Lead System Architect PROJECT: Service Finder - Traffic Ecosystem SuperApp SOURCE OF TRUTH: Grand Master Book (00–19) + 2026.02.10 System Updates CONTEXT: Monolit-moduláris refaktorálás (FastAPI, Vue3, Postgres 15). + 1. VÍZIÓ ÉS KONTEXTUS (00, 01) + + Nem egy egyszerű nyilvántartó rendszert építünk, hanem egy Digital Twin (Digitális Iker) alapú ökoszisztémát. + + Core Philosophy: "A jármű örök, a tulajdonos vándor." (Vehicle-Centric Architecture). + + Pillére: + + Core Fleet: Életút és TCO követés. + + Marketplace: Szervizkereső és időpontfoglalás. + + Trust Engine: Bizonyíték alapú előélet (OCR, Fotó). + + Economy: Kredit és Gamification. + + 2. TECHNOLÓGIAI STACK ÉS INFRA (02, 03, 04, 08) + + Frontend: Vue 3 (Composition API) + Vite + Tailwind CSS + Pinia. Dumb Frontend elv. + + Backend: Python 3.12 + FastAPI. Szigorú Pydantic validáció. + + Adatbázis: PostgreSQL 15. Két séma: data (üzleti), public (rendszer). + + Storage: MinIO (S3 kompatibilis) titkosított dokumentumokhoz. + + Hálózat: Internal Net (shared_db_net) zárt. Public Net: csak 80/443 (NPM Proxy). + + Config: Minden konfiguráció .env fájlból vagy data.system_parameters táblából jön. Hardkódolás TILOS. + + 3. IDENTITÁS ÉS ONBOARDING (05, 07) + + Szétválasztás: + + USER: Technikai fiók (Email/Pass). + + PERSON: Valós jogi személy (Okmányok, KYC). Nem törölhető. + + Folyamat: Kétlépcsős (2-Step) Onboarding. + + Lite: Csak User létrehozása (is_active=False). + + KYC: Okmányok feltöltése -> Person létrehozása -> Wallet nyitása -> Aktiválás (Atomi tranzakció). + + 4. ATOMIZÁLT ASSET MODELL (18) [FRISSÍTVE 2026.02.10] + + A járművek kezelése 4 elkülönített modulra bomlott (SRP elv): + + Identity (Asset): VIN, Rendszám, Tulajdonos (AssetAssignment). + + Catalog (AssetCatalog): Gyári statikus adatok. Robot Scout tölti. + + Telemetry (AssetTelemetry): Változó állapot (KM, VQI, DBS). + + Financials (AssetCost): Pénzügyi tranzakciók 9 kategóriában. + + API Design: 3 külön végpont (/assets/{id}, /assets/{id}/costs, /assets/{id}/telemetry). + + 5. HIERARCHIKUS JOGOSULTSÁG (RBAC & SCOPE) (09, 19) [FRISSÍTVE 2026.02.10] + + A rendszer egy Rang- és Hatókör-alapú mátrixot használ (RBAC_MASTER_CONFIG JSON). + + Szintek (Rank): + + SUPERADMIN (100): Globális (L0). + + COUNTRY_ADMIN (80): Országos (L1). + + REGION_ADMIN (60): Területi (L1/B). + + MODERATOR (40): Adatvalidátor (L2). + + SALES (20): Üzletkötő (L3). + + USER (10): Végfelhasználó. + + Védelem: Middleware szinten: Token Role >= Required Rank ÉS User Scope == Resource Scope. + + Adattábla: User tábla új mezői: scope_level, scope_id, custom_permissions. + + 6. GAMIFICATION ÉS ECONOMY (10, 11) [FRISSÍTVE 2026.02.10] + + XP (Tapasztalat): Végleges szintlépés (BaseXP×Level1.5). Nem csökken. + + Social Points: Szezonális, resetelhető pontok. + + Kredit: Valuta, Social pontokból váltható. + + Service: GamificationService és PointsLedger (auditált naplózás). + + Billing: Többvalutás rendszer (HUF/EUR tárolás). + + 7. ÜZEMELTETÉS ÉS ADATINTEGRITÁS (06, 12, 16, 17) + + Soft Delete: Nincs DELETE parancs, csak is_deleted vagy is_active flag. + + Audit: Kritikus műveletek (pl. Impersonation) előtt/után állapotmentés az audit_logs táblába. + + Enum: Postgres Enum típusok mindig kisbetűsek (pl. role='user'). + + Migráció: Minden DB módosításhoz SQL script + Alembic migráció kötelező. + + 🚀 KÖVETKEZŐ LÉPÉSEK (ACTION PLAN - 2026.02.11) + + A rendszer magja (Asset, RBAC, Gamification) stabil. A következő fejlesztési ciklus célja a biztonsági réteg és az automatizáció bekapcsolása. + 🔴 PRIORITY 1: SMART AUTH TOKEN (Security) + + Feladat: A Login (/auth/login) folyamat átírása. + + Cél: A generált JWT Token tartalmazza a DB-ből frissen kinyert RBAC adatokat: role, rank, scope_level, scope_id. + + Miért: Hogy a Middleware DB-lekérdezés nélkül tudjon dönteni a jogosultságról. + + File: backend/app/core/security.py, backend/app/api/v1/endpoints/auth.py. + + 🟠 PRIORITY 2: IMPERSONATION ENGINE (Ops) + + Feladat: POST /api/v1/admin/impersonate végpont. + + Logika: SuperAdmin token cseréje egy cél-felhasználó tokenjére (időkorlátos). + + Biztonság: Szigorú naplózás az audit_logs táblába (reason kötelező). + + 🟡 PRIORITY 3: ROBOT SCOUT (Automation) + + Feladat: Háttérfolyamat (Worker) indítása create_asset után. + + Logika: VIN alapján külső API / Mock adatbázis lekérdezése -> AssetCatalog.factory_data feltöltése. + + # 📘 SERVICE FINDER - MASTER ARCHITECT SYSTEM INSTRUCTIONS + + ROLE: Senior Technical Product Manager & System Architect PROJECT: Service Finder - Traffic Ecosystem SuperApp 2.0 CONTEXT: Monolit-moduláris refaktorálás (FastAPI backend, Vue3 frontend, PostgreSQL 15). SSoT: Grand Master Book (v1.4). + 🎯 ALAPVETŐ MŰKÖDÉSI PROTOKOLL + + Zéró Találgatás: Tilos feltételezésekre alapozva kódot írni. Ha egy összefüggés (adatbázis-program-fájlrendszer) nem egyértelmű, pontosító kérdéseket kell feltenni. + + Fájlbekérési Kényszer: Minden módosítás vagy hibajavítás előtt kötelező bekérni az érintett fájlok aktuális, teljes tartalmát. Tilos korábbi logikát törölni; a meglévő kódrészeket integrálni kell a tiszta kód elvei szerint. + + Teljes Kódközlés: Mindig a teljes, javított állományt kell visszaadni, nem csak kódrészleteket. + + Gitea & Changelog: Csak működő, tesztelt verziók után generálj Git commit üzenetet és frissítsd a Changelog.md fájlt (.md formátumban). + + 🏗️ ARCHITEKTURÁLIS ÉS ÜZLETI LOGIKA + + Identity Strategy: Szigorú elválasztás a technikai User (fiók) és a valós Person (identitás) között. A Person nem törölhető (Soft Delete). Újraregisztrációkor a KYC adatok alapján kötelező a korábbi person_id összekötése. + + Kétlépcsős Onboarding: * Step 1 (Lite): is_active = False, csak technikai User jön létre. + + Step 2 (KYC/Aktiválás): Atomi tranzakcióban: Person rögzítése, Wallet nyitása, Private Org létrehozása, aktiválás. + + Economy & Dynamic Config: * A 10-5-2%-os jutalék és minden üzleti változó (pl. auth.reward_days) kizárólag a data.system_settings táblából jöhet. Tilos beégetett (hardcoded) változók használata. + + Minden költséget helyi pénznemben és EUR-ban is tárolni kell (CostEUR​=CostLocal​⋅ExchangeRate). + + Admin Hierarchy & Security: L0 (SuperAdmin) -> L3 szintek közötti jogosultságkezelés. Regionális izoláció alkalmazása: az adminok csak a hozzájuk rendelt country_code adatait láthatják. + + 🗄️ ADATBÁZIS ÉS SQL IRÁNYELVEK + + Séma: Üzleti logika a data, rendszeradatok a public sémában. + + Enumok: A Postgres Enum típusok miatt minden szerepkört és státuszt kényszerített kisbetűvel kell kezelni (role="user"). + + Migráció: Minden adatbázis-módosításhoz pgAdmin felületen futtatható SQL-t és Alembic migrációs szkriptet kell készíteni. + + Audit Trail: Minden módosítás előtt és után State Snapshot (JSON) mentése az audit_logs táblába. + + 🛠️ TECHNIKAI STACK SPECIFIKÁCIÓK + + Backend: Python 3.12, FastAPI, SQLAlchemy (Alembic), Pydantic validáció. + + Frontend: Vue 3 (Composition API), Vite, Tailwind CSS, Pinia. Hardkódolt IP tilos, csak .env (VITE_API_BASE_URL). + + Storage: MinIO (S3 kompatibilis) számlákhoz és okmányokhoz. + + Útvonalak: A projekt gyökere: /opt/docker/dev/service_finder. Dokumentációk a /docs/V01_gemini/ mappában. + + 💬 KOMMUNIKÁCIÓ ÉS DOKUMENTÁCIÓ + + Ha a Master Book specifikációja és a kérés ütközik, jelezd és tegyél javaslatot a Master Book frissítésére. + + Minden megoldás után frissítsd a megfelelő Master Book fejezetet, ha a rendszerlogika változott. + + Használj technikai angol kifejezéseket a magyar szövegkörnyezetben (pl. refactoring, dependency injection, endpoint). + könyvtárszerkezetét Bash tree -I "node_modules|vendor|.git|dist|build|storage" -L 3 + adatbázis szerkezet Bash docker exec -it shared-postgres pg_dump -U kincses -s service_finder > schema_dump.sq + + + + ## 🛠️ SERVICE FINDER - SYSTEM ARCHITECT GEM CONFIGURATION + + ROLE: Senior Technical Product Manager & System Architect PROJECT: Service Finder - Flotta Menedzsment Rendszer OBJECTIVE: MVP Refaktorálás (Monolit -> Moduláris) a "Grand Master Book" (v1.0) elvei mentén. + 🎯 ALAPVETŐ MŰKÖDÉSI PROTOKOLL + + Szigorú Adatgyűjtés: Kódmódosítás vagy javítás előtt kötelező bekérni az érintett fájlok teljes tartalmát. Tilos korábbi logikát törölni vagy módosítani anélkül, hogy tisztáznánk annak összefüggéseit a rendszer többi részével. + + Single Source of Truth (SSoT): Minden válasz alapja a Master Book (00-17.md dokumentumok). Ha a Master Book és a kód ellentmondásban van, vagy a leírás hiányos, állj meg, tegyél javaslatot a kiegészítésre, és csak a tisztázás után folytasd a kódolást. + + Tiszta és Teljes Kód: Mindig a teljes, javított fájltartalmat add vissza. Kerüld a töredékes kódokat. A kódnak tartalmaznia kell a Master Bookban rögzített logikai folyamatokat (clean code thought process). + + Zéró Találgatás: Ha egy összefüggés (adatbázis-program-fájlrendszer) nem egyértelmű, tegyél fel pontosító kérdéseket. Inkább több tisztázó kör, mint hibás kód. + + 🏗️ ARCHITEKTÚRA ÉS FEJLESZTÉS + + Modularitás: A fejlesztés iránya a monolitból a moduláris felépítés felé mutat. Minden új kódnak támogatnia kell a skálázhatóságot. + + Adatbázis & SQL: SQL módosításokat pgAdmin felületre optimalizálva készíts. Minden adatbázis-módosításhoz kötelező migrációs szkriptet generálni az egységesség megőrzése érdekében. + + Fájlstruktúra: Tartsd be a projekt meglévő könyvtárszerkezetét. Ne javasolj olyan útvonalakat, amelyek eltérnek a meglévő rendszertől. + + 📝 DOKUMENTÁCIÓ ÉS VERZIÓKEZELÉS + + Gitea: Csak a már tesztelt, működő és jóváhagyott javítások után generálj Git commit üzeneteket és instrukciókat. + + Changelog.md: Minden sikeres módosítás után kötelező legenerálni a Changelog.md bejegyzést, amely tartalmazza a változtatások pontos listáját. + + Master Book Frissítés: Ha a fejlesztés során új logika születik, vagy pontosítunk egy meglévőt, generáld le a Master Book megfelelő fejezetének (pl. 07_API_Guide.md vagy 06_Database_Guide.md) frissített szöveges részét is. + + 💬 KOMMUNIKÁCIÓS STÍLUS + + Szakmai, tömör és határozott. + + Használj technikai angol szakkifejezéseket a magyar kontextusban (pl. refactoring, dependency injection, migration). + + Minden válasz elején röviden összegezd a megértett problémát, mielőtt a megoldásra térsz. + + könyvtárszerkezetét Bash tree -I "node_modules|vendor|.git|dist|build|storage" -L 3 + adatbázis szerkezet Bash docker exec -it shared-postgres pg_dump -U kincses -s service_finder > schema_dump.sq + \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/_legacy_backup/build_complex_db.py b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/build_complex_db.py new file mode 100755 index 0000000..4e59309 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/build_complex_db.py @@ -0,0 +1,95 @@ +import asyncio +import os +from sqlalchemy.ext.asyncio import create_async_engine +from sqlalchemy import text +from dotenv import load_dotenv + +load_dotenv() + +# Cím beállítása +raw_url = os.getenv("DATABASE_URL") +if not raw_url: + raw_url = "postgresql://admin:PASSWORD_111@postgres-db:5432/service_finder" +DATABASE_URL = raw_url.replace("postgresql://", "postgresql+asyncpg://").replace("/service_finder_db", "/service_finder") + +async def build_db(): + print(f"🔌 Kapcsolódás a rendszerhez...") + engine = create_async_engine(DATABASE_URL) + + async with engine.begin() as conn: + print("🏗️ 'DATA' séma előkészítése...") + await conn.execute(text("CREATE SCHEMA IF NOT EXISTS data;")) + + # 1. FELHASZNÁLÓK TÁBLA (Céges/Magán logika) + print("👤 Users tábla létrehozása...") + await conn.execute(text(""" + CREATE TABLE IF NOT EXISTS data.users ( + id SERIAL PRIMARY KEY, + email VARCHAR(255) UNIQUE NOT NULL, + password_hash VARCHAR(255) NOT NULL, + role VARCHAR(20) DEFAULT 'PRIVATE', -- 'PRIVATE', 'COMPANY', 'ADMIN' + company_name VARCHAR(255), -- Ha cég + tax_number VARCHAR(50), -- Ha cég + is_active BOOLEAN DEFAULT FALSE, -- Email megerősítésig + created_at TIMESTAMP DEFAULT NOW() + ); + """)) + + # 2. JÁRMŰ TÖRZS (A Fizikai Vas - Tulajdonos nélkül!) + print("🚗 Vehicles tábla létrehozása (A Vas)...") + await conn.execute(text(""" + CREATE TABLE IF NOT EXISTS data.vehicles ( + id SERIAL PRIMARY KEY, + model_id INTEGER REFERENCES ref.vehicle_models(id), + vin VARCHAR(50) UNIQUE NOT NULL, -- ALVÁZSZÁM (Az igazi kulcs) + current_plate VARCHAR(20) NOT NULL, -- A mostani rendszám + production_year INTEGER, + created_at TIMESTAMP DEFAULT NOW() + ); + """)) + + # 3. ÉLETÚT ÉS JOGOSULTSÁG (A Történelem) + print("📜 History tábla létrehozása (Kié mikor volt?)...") + await conn.execute(text(""" + CREATE TABLE IF NOT EXISTS data.vehicle_history ( + id SERIAL PRIMARY KEY, + vehicle_id INTEGER REFERENCES data.vehicles(id), + user_id INTEGER REFERENCES data.users(id), + + role VARCHAR(20) NOT NULL, -- 'OWNER' (Tulaj), 'DRIVER' (Sofőr), 'LEASE' (Lízingelő) + + start_date DATE NOT NULL, -- Mikor vette át? + end_date DATE, -- Mikor adta le? (Ha NULL, akkor nála van!) + + start_mileage INTEGER, -- Óraállás átvételkor + end_mileage INTEGER, -- Óraállás leadáskor + + is_active BOOLEAN GENERATED ALWAYS AS (end_date IS NULL) STORED -- Segédmező a gyors kereséshez + ); + """)) + + # 4. KÖLTSÉGEK (Szeparált pénzügyek) + print("💸 Costs tábla létrehozása...") + await conn.execute(text(""" + CREATE TABLE IF NOT EXISTS data.costs ( + id SERIAL PRIMARY KEY, + vehicle_id INTEGER REFERENCES data.vehicles(id), + user_id INTEGER REFERENCES data.users(id), -- Ki fizette? (Csak ő láthatja!) + + cost_type VARCHAR(50) NOT NULL, -- FUEL, SERVICE, TAX, INSURANCE, LEASE... + amount DECIMAL(10, 2) NOT NULL, + date DATE NOT NULL, + mileage_at_cost INTEGER, + + description TEXT, + document_url VARCHAR(255), -- Fotó linkje + + created_at TIMESTAMP DEFAULT NOW() + ); + """)) + + print("✅ KÉSZ! A Professzionális Adatmodell felépült.") + await engine.dispose() + +if __name__ == "__main__": + asyncio.run(build_db()) diff --git a/archive/2026.02.18 Archive_old_mapps/_legacy_backup/check_garage.py b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/check_garage.py new file mode 100755 index 0000000..ce89d01 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/check_garage.py @@ -0,0 +1,51 @@ +import asyncio +import os +from sqlalchemy.ext.asyncio import create_async_engine +from sqlalchemy import text +from dotenv import load_dotenv + +load_dotenv() + +# DB Config +raw_url = os.getenv("DATABASE_URL") +if not raw_url: + raw_url = "postgresql://admin:PASSWORD_111@postgres-db:5432/service_finder" +DATABASE_URL = raw_url.replace("postgresql://", "postgresql+asyncpg://").replace("/service_finder_db", "/service_finder") + +async def check_data(): + engine = create_async_engine(DATABASE_URL) + async with engine.begin() as conn: + print("\n🚗 A TE GARÁZSOD (User ID: 1):") + print("-" * 80) + + # Ez a lekérdezés összeköti a Történelmet (History), a Vasat (Vehicle) és a Katalógust (Model) + query = text(""" + SELECT + vh.role, + vh.start_date, + v.vin, + v.current_plate, + m.name as brand, + mo.model_name + FROM data.vehicle_history vh + JOIN data.vehicles v ON vh.vehicle_id = v.id + JOIN ref.vehicle_models mo ON v.model_id = mo.id + JOIN ref.vehicle_makes m ON mo.make_id = m.id + WHERE vh.user_id = 1; + """) + + result = await conn.execute(query) + rows = result.fetchall() + + if not rows: + print("📭 A garázs üres.") + else: + for r in rows: + print(f"🔹 {r.brand} {r.model_name} | 🆔 {r.vin} | 🔢 {r.current_plate}") + print(f" Jogviszony: {r.role} | Kezdete: {r.start_date}") + print("-" * 80) + + await engine.dispose() + +if __name__ == "__main__": + asyncio.run(check_data()) diff --git a/archive/2026.02.18 Archive_old_mapps/_legacy_backup/create_demo_user.py b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/create_demo_user.py new file mode 100755 index 0000000..4f2f5fe --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/create_demo_user.py @@ -0,0 +1,35 @@ +import asyncio +import os +from sqlalchemy.ext.asyncio import create_async_engine +from sqlalchemy import text +from dotenv import load_dotenv + +load_dotenv() + +# Adatbázis elérés +raw_url = os.getenv("DATABASE_URL") +if not raw_url: + raw_url = "postgresql://admin:PASSWORD_111@postgres-db:5432/service_finder" +DATABASE_URL = raw_url.replace("postgresql://", "postgresql+asyncpg://").replace("/service_finder_db", "/service_finder") + +async def create_user(): + print(f"🔌 Kapcsolódás...") + engine = create_async_engine(DATABASE_URL) + + async with engine.begin() as conn: + print("👤 1-es számú felhasználó beszúrása...") + # Kényszerítjük az ID=1-et, hogy passzoljon a main.py-hoz + await conn.execute(text(""" + INSERT INTO data.users (id, email, password_hash, role, is_active) + VALUES (1, 'demo@user.com', 'dummy_hash', 'PRIVATE', TRUE) + ON CONFLICT (id) DO NOTHING; + """)) + + # Frissítjük a számlálót, hogy a következő user ID 2 legyen (ne akadjon össze) + await conn.execute(text("SELECT setval('data.users_id_seq', (SELECT MAX(id) FROM data.users));")) + + print("✅ KÉSZ! A Demo User (ID: 1) létezik.") + await engine.dispose() + +if __name__ == "__main__": + asyncio.run(create_user()) diff --git a/archive/2026.02.18 Archive_old_mapps/_legacy_backup/create_dummy_employee.py b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/create_dummy_employee.py new file mode 100755 index 0000000..f601b9c --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/create_dummy_employee.py @@ -0,0 +1,42 @@ +import asyncio +import os +from sqlalchemy.ext.asyncio import create_async_engine +from sqlalchemy import text +from dotenv import load_dotenv + +load_dotenv() + +raw_url = os.getenv("DATABASE_URL") +if not raw_url: + raw_url = "postgresql://admin:PASSWORD_111@postgres-db:5432/service_finder" +DATABASE_URL = raw_url.replace("postgresql://", "postgresql+asyncpg://").replace("/service_finder_db", "/service_finder") + +async def hire_driver(): + engine = create_async_engine(DATABASE_URL) + + async with engine.begin() as conn: + print("👤 Kovács János (User ID: 2) létrehozása...") + # Létrehozzuk a User-t + await conn.execute(text(""" + INSERT INTO data.users (id, email, password_hash, role, country, default_currency, is_active) + VALUES (2, 'sofor@ceg.hu', 'hash123', 'PRIVATE', 'HU', 'HUF', TRUE) + ON CONFLICT (id) DO NOTHING; + """)) + + # Frissítjük a sorrendet + await conn.execute(text("SELECT setval('data.users_id_seq', (SELECT MAX(id) FROM data.users));")) + + print("🤝 Hozzárendelés a Te cégedhez (ID: 1)...") + # Betesszük a fleet_members táblába + await conn.execute(text(""" + INSERT INTO data.fleet_members (user_id, owner_id, role) + VALUES (2, 1, 'DRIVER') + ON CONFLICT (user_id, owner_id) DO NOTHING; + """)) + + print("✅ KÉSZ! Kovács János mostantól a csapatod tagja.") + await engine.dispose() + +if __name__ == "__main__": + asyncio.run(hire_driver()) + \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/_legacy_backup/docker-compose.backend.yml b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/docker-compose.backend.yml new file mode 100755 index 0000000..6f33629 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/docker-compose.backend.yml @@ -0,0 +1,17 @@ +services: + service_finder_api: + build: . + container_name: service_finder_api + env_file: + - .env + networks: + - existing_net + ports: + - "8000:8000" + restart: unless-stopped + +networks: + existing_net: + external: true + name: docker-server_internal_net + diff --git a/archive/2026.02.18 Archive_old_mapps/_legacy_backup/init_db.py b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/init_db.py new file mode 100755 index 0000000..bc5f5db --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/init_db.py @@ -0,0 +1,81 @@ +import asyncio +import os +from sqlalchemy.ext.asyncio import create_async_engine +from sqlalchemy import text +from dotenv import load_dotenv + +load_dotenv() + +# Cím összeállítása (Ugyanaz a logika, mint a main.py-ban) +raw_url = os.getenv("DATABASE_URL") +if not raw_url: + raw_url = "postgresql://admin:PASSWORD_111@postgres-db:5432/service_finder" +DATABASE_URL = raw_url.replace("postgresql://", "postgresql+asyncpg://").replace("/service_finder_db", "/service_finder") + +async def init_db(): + print(f"🔌 Kapcsolódás ide: {DATABASE_URL}") + engine = create_async_engine(DATABASE_URL) + + async with engine.begin() as conn: + print("🏗️ Séma és Táblák létrehozása...") + + # 1. Séma létrehozása + await conn.execute(text("CREATE SCHEMA IF NOT EXISTS ref;")) + + # 2. Márka tábla + await conn.execute(text(""" + CREATE TABLE IF NOT EXISTS ref.vehicle_makes ( + id SERIAL PRIMARY KEY, + name VARCHAR(100) NOT NULL UNIQUE + ); + """)) + + # 3. Modell tábla + await conn.execute(text(""" + CREATE TABLE IF NOT EXISTS ref.vehicle_models ( + id SERIAL PRIMARY KEY, + make_id INTEGER REFERENCES ref.vehicle_makes(id), + model_name VARCHAR(100) NOT NULL, + category VARCHAR(50) + ); + """)) + + print("🧹 Meglévő adatok törlése (Tiszta lap)...") + await conn.execute(text("TRUNCATE TABLE ref.vehicle_models, ref.vehicle_makes RESTART IDENTITY CASCADE;")) + + print("🚗 Adatok beszúrása...") + + # Adatok + makes = ["BMW", "Audi", "Mercedes-Benz", "Toyota", "Honda", "Suzuki", "Volkswagen"] + + models = [ + ("BMW", "3 Series", "Autó"), ("BMW", "5 Series", "Autó"), ("BMW", "X5", "Autó"), ("BMW", "R 1250 GS", "Motor"), + ("Audi", "A3", "Autó"), ("Audi", "A4", "Autó"), ("Audi", "A6", "Autó"), ("Audi", "Q5", "Autó"), + ("Mercedes-Benz", "C-Class", "Autó"), ("Mercedes-Benz", "E-Class", "Autó"), ("Mercedes-Benz", "S-Class", "Autó"), ("Mercedes-Benz", "G-Class", "Autó"), + ("Toyota", "Corolla", "Autó"), ("Toyota", "Yaris", "Autó"), ("Toyota", "RAV4", "Autó"), ("Toyota", "Hilux", "Autó"), + ("Honda", "Civic", "Autó"), ("Honda", "CR-V", "Autó"), ("Honda", "Africa Twin", "Motor"), ("Honda", "CB500X", "Motor"), + ("Suzuki", "Swift", "Autó"), ("Suzuki", "Vitara", "Autó"), ("Suzuki", "S-Cross", "Autó"), ("Suzuki", "DL 650 V-Strom", "Motor"), + ("Volkswagen", "Golf", "Autó"), ("Volkswagen", "Passat", "Autó"), ("Volkswagen", "Polo", "Autó"), ("Volkswagen", "Tiguan", "Autó") + ] + + # Márkák beszúrása + for make in makes: + await conn.execute(text(f"INSERT INTO ref.vehicle_makes (name) VALUES ('{make}') ON CONFLICT DO NOTHING;")) + + # Modellek beszúrása (kicsit trükkös, mert kell a make_id) + for brand, model, cat in models: + # Megkeressük az ID-t + result = await conn.execute(text(f"SELECT id FROM ref.vehicle_makes WHERE name = '{brand}'")) + make_id = result.scalar() + + # Beszúrjuk a modellt + await conn.execute(text(f""" + INSERT INTO ref.vehicle_models (make_id, model_name, category) + VALUES ({make_id}, '{model}', '{cat}') + """)) + + print("✅ KÉSZ! Az adatbázis feltöltve.") + await engine.dispose() + +if __name__ == "__main__": + asyncio.run(init_db()) diff --git a/archive/2026.02.18 Archive_old_mapps/_legacy_backup/inspect_db.py b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/inspect_db.py new file mode 100755 index 0000000..1651cfc --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/inspect_db.py @@ -0,0 +1,61 @@ +import asyncio +import os +from sqlalchemy.ext.asyncio import create_async_engine +from sqlalchemy import text +from dotenv import load_dotenv + +load_dotenv() + +# Cím beállítása +raw_url = os.getenv("DATABASE_URL") +if not raw_url: + raw_url = "postgresql://admin:PASSWORD_111@postgres-db:5432/service_finder" +DATABASE_URL = raw_url.replace("postgresql://", "postgresql+asyncpg://").replace("/service_finder_db", "/service_finder") + +async def inspect_schema(): + print(f"🔎 Kapcsolódás az adatbázishoz...") + engine = create_async_engine(DATABASE_URL) + + async with engine.begin() as conn: + # SQL lekérdezés a rendszer katalógusból (information_schema) + # Ez megmondja milyen táblák és oszlopok léteznek + query = text(""" + SELECT + table_schema, + table_name, + column_name, + data_type, + is_nullable + FROM information_schema.columns + WHERE table_schema IN ('public', 'ref', 'data') + ORDER BY table_schema, table_name, ordinal_position; + """) + + result = await conn.execute(query) + rows = result.fetchall() + + if not rows: + print("⚠️ Nem találtam táblákat a 'ref' vagy 'data' sémákban!") + + current_table = "" + for row in rows: + schema = row.table_schema + table = row.table_name + full_table_name = f"{schema}.{table}" + + # Ha új táblához érünk, kiírjuk a nevét + if full_table_name != current_table: + print(f"\n📦 TÁBLA: {full_table_name.upper()}") + print("-" * 50) + print(f"{'OSZLOP NÉV':<20} | {'TÍPUS':<15} | {'KÖTELEZŐ?'}") + print("-" * 50) + current_table = full_table_name + + # Oszlop adatok + req = "IGEN" if row.is_nullable == 'NO' else "nem" + print(f"{row.column_name:<20} | {row.data_type:<15} | {req}") + + await engine.dispose() + +if __name__ == "__main__": + asyncio.run(inspect_schema()) diff --git a/archive/2026.02.18 Archive_old_mapps/_legacy_backup/inspect_db_full.py b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/inspect_db_full.py new file mode 100755 index 0000000..98be8b1 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/inspect_db_full.py @@ -0,0 +1,69 @@ +import asyncio +from sqlalchemy import inspect, text +from sqlalchemy.ext.asyncio import create_async_engine + +# CSERÉLD KI a saját adataidra, ha nem ezeket használod! +DATABASE_URL = "postgresql+asyncpg://kincses:MiskociA74@postgres-db:5432/service_finder" + +async def run_inspection(): + # Aszinkron motor létrehozása + engine = create_async_engine(DATABASE_URL) + + async with engine.connect() as conn: + def do_inspect(sync_conn): + inspector = inspect(sync_conn) + + # 1. Sémák lekérése (amiket mi hoztunk létre + public) + target_schemas = ['public', 'data', 'ref'] + all_schemas = inspector.get_schema_names() + schemas_to_check = [s for s in target_schemas if s in all_schemas] + + print(f"{'='*60}") + print(f" JÁRMŰNYILVÁNTARTÓ RENDSZER - ADATBÁZIS AUDIT") + print(f"{'='*60}") + + for schema in schemas_to_check: + print(f"\n--- SÉMA: {schema.upper()} ---") + tables = inspector.get_table_names(schema=schema) + + if not tables: + print(" (Nincsenek táblák ebben a sémában)") + continue + + for table_name in tables: + print(f"\n[Tábla: {schema}.{table_name}]") + + # Oszlopok részletei + columns = inspector.get_columns(table_name, schema=schema) + for col in columns: + pk = " [PK]" if col['primary_key'] else "" + nullable = "NULL" if col['nullable'] else "NOT NULL" + print(f" L {col['name']:<15} | {str(col['type']):<12} | {nullable}{pk}") + + # Idegen kulcsok (Kapcsolatok) + fks = inspector.get_foreign_keys(table_name, schema=schema) + for fk in fks: + constrained = fk['constrained_columns'] + referred_schema = fk['referred_schema'] + referred_table = fk['referred_table'] + referred_cols = fk['referred_columns'] + print(f" --> Kapcsolat: {constrained} -> {referred_schema}.{referred_table}({referred_cols})") + + # Mivel az SQLAlchemy inspector alapvetően szinkron, run_sync-et használunk + await conn.run_sync(do_inspect) + + # 2. Extra: Kiterjesztések ellenőrzése + print(f"\n{'='*60}") + print(" AKTÍV POSTGRESQL KITERJESZTÉSEK:") + result = await conn.execute(text("SELECT extname FROM pg_extension;")) + for row in result: + print(f" - {row[0]}") + print(f"{'='*60}") + + await engine.dispose() + +if __name__ == "__main__": + try: + asyncio.run(run_inspection()) + except Exception as e: + print(f"HIBA TÖRTÉNT: {e}") diff --git a/archive/2026.02.18 Archive_old_mapps/_legacy_backup/main.py b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/main.py new file mode 100755 index 0000000..bc8f551 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/main.py @@ -0,0 +1,81 @@ +from fastapi import FastAPI, HTTPException, Form, Depends +from fastapi.responses import FileResponse, JSONResponse +from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm +from pydantic import BaseModel +from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession +from sqlalchemy.orm import sessionmaker +from sqlalchemy import text +from datetime import datetime, timedelta, date +from jose import jwt +import bcrypt, os, traceback +from dotenv import load_dotenv + +load_dotenv() + +SECRET_KEY = "SZUPER_TITKOS_KULCS_2026" +ALGORITHM = "HS256" +oauth2_scheme = OAuth2PasswordBearer(tokenUrl="api/auth/login") +DATABASE_URL = os.getenv("DATABASE_URL", "").replace("postgresql://", "postgresql+asyncpg://") +engine = create_async_engine(DATABASE_URL, pool_pre_ping=True) +AsyncSessionLocal = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) + +app = FastAPI() + +# --- AUTH --- +def get_password_hash(p): return bcrypt.hashpw(p.encode('utf-8')[:72], bcrypt.gensalt()).decode('utf-8') +def verify_password(p, h): return bcrypt.checkpw(p.encode('utf-8')[:72], h.encode('utf-8')) + +async def get_current_user(token: str = Depends(oauth2_scheme)): + try: + p = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) + return int(p.get("sub")) + except: raise HTTPException(status_code=401) + +@app.post("/api/auth/register") +async def register(email: str = Form(...), password: str = Form(...)): + try: + async with AsyncSessionLocal() as session: + async with session.begin(): + await session.execute(text("INSERT INTO data.users (email, password_hash) VALUES (:e, :p)"), + {"e": email, "p": get_password_hash(password)}) + return {"status": "success"} + except Exception as e: + return JSONResponse(status_code=400, content={"detail": "Email már létezik vagy adatbázis hiba."}) + +@app.post("/api/auth/login") +async def login(f: OAuth2PasswordRequestForm = Depends()): + async with AsyncSessionLocal() as session: + res = await session.execute(text("SELECT id, password_hash FROM data.users WHERE email = :e"), {"e": f.username}) + u = res.fetchone() + if not u or not verify_password(f.password, u.password_hash): raise HTTPException(status_code=401, detail="Hibás adatok") + t = jwt.encode({"sub": str(u.id), "exp": datetime.utcnow() + timedelta(days=1)}, SECRET_KEY, algorithm=ALGORITHM) + return {"access_token": t, "token_type": "bearer"} + +# --- DATA --- +@app.get("/api/meta/vehicle-hierarchy") +async def get_hierarchy(): + async with AsyncSessionLocal() as session: + q = text("SELECT vm.category, m.name as brand, vm.id as model_id, vm.model_name FROM ref.vehicle_models vm JOIN ref.vehicle_makes m ON vm.make_id = m.id ORDER BY vm.category, m.name") + res = await session.execute(q) + h = {} + for r in res: + if r.category not in h: h[r.category] = {} + if r.brand not in h[r.category]: h[r.category][r.brand] = [] + h[r.category][r.brand].append({"id": r.model_id, "name": r.model_name}) + return h + +@app.get("/api/meta/cost-types") +async def get_cost_types(): + async with AsyncSessionLocal() as session: + res = await session.execute(text("SELECT code, name FROM ref.cost_types ORDER BY name")) + return {r.code: r.name for r in res.fetchall()} + +@app.get("/api/my_vehicles") +async def my_vehicles(uid: int = Depends(get_current_user)): + async with AsyncSessionLocal() as session: + q = text("SELECT v.id as vehicle_id, v.current_plate as plate, m.name as brand, mo.model_name as model, v.status FROM data.vehicle_history vh JOIN data.vehicles v ON vh.vehicle_id = v.id JOIN ref.vehicle_models mo ON v.model_id = mo.id JOIN ref.vehicle_makes m ON mo.make_id = m.id WHERE vh.user_id = :uid AND vh.end_date IS NULL") + res = await session.execute(q, {"uid": uid}) + return [dict(r._mapping) for r in res.fetchall()] + +@app.get("/") +async def index(): return FileResponse("/app/frontend/index.html") \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/_legacy_backup/main_2.py b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/main_2.py new file mode 100755 index 0000000..a6c5497 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/main_2.py @@ -0,0 +1,120 @@ +from fastapi import FastAPI, HTTPException +from fastapi.staticfiles import StaticFiles +from fastapi.responses import FileResponse +from pydantic import BaseModel, validator +from typing import Optional +from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession +from sqlalchemy.orm import sessionmaker +from sqlalchemy import text +import os +from datetime import date +from dotenv import load_dotenv + +load_dotenv() + +# --- 1. ADATBÁZIS KAPCSOLAT --- +raw_url = os.getenv("DATABASE_URL") +if not raw_url: + raw_url = "postgresql://admin:PASSWORD_111@postgres-db:5432/service_finder" +fixed_url = raw_url.replace("postgresql://", "postgresql+asyncpg://").replace("/service_finder_db", "/service_finder") + +engine = create_async_engine(fixed_url) +AsyncSessionLocal = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) + +app = FastAPI(title="Service Finder API") + +# --- 2. ADATMODELLEK (VALIDÁCIÓVAL) --- +class VehicleRegister(BaseModel): + model_id: int + vin: str # Alvázszám (KÖTELEZŐ!) + plate: str # Rendszám + mileage: int # Km óra + purchase_date: date + role: str = "OWNER" # Alapértelmezett: Tulajdonos + + # Adatőr: Automatikus nagybetűsítés és tisztítás + @validator('vin') + def clean_vin(cls, v): + if len(v) < 5: raise ValueError('Az alvázszám túl rövid!') + return v.upper().replace("-", "").replace(" ", "") + + @validator('plate') + def clean_plate(cls, v): + return v.upper().replace("-", "").replace(" ", "") + + @validator('mileage') + def positive_mileage(cls, v): + if v < 0: raise ValueError('A kilométer nem lehet negatív!') + return v + +# --- 3. VÉGPONTOK --- + +# Lista lekérése (Katalógus) +@app.get("/api/vehicles") +async def get_vehicles(): + async with AsyncSessionLocal() as session: + result = await session.execute(text(""" + SELECT vm.id, m.name as brand, vm.model_name, vm.category + FROM ref.vehicle_models vm + JOIN ref.vehicle_makes m ON vm.make_id = m.id + ORDER BY m.name, vm.model_name + """)) + return [{"id": r.id, "brand": r.brand, "model": r.model_name, "category": r.category} for r in result.fetchall()] + +# ÚJ: JÁRMŰ REGISZTRÁCIÓ (A Nagy Logika) +@app.post("/api/register") +async def register_vehicle(data: VehicleRegister): + async with AsyncSessionLocal() as session: + async with session.begin(): # Tranzakció indítása + try: + # 1. Megnézzük, létezik-e már ez a VAS (Alvázszám alapján)? + check_query = text("SELECT id FROM data.vehicles WHERE vin = :vin") + result = await session.execute(check_query, {"vin": data.vin}) + existing_car_id = result.scalar() + + vehicle_id = existing_car_id + + # 2. HA NEM LÉTEZIK -> Létrehozzuk a VASAT + if not vehicle_id: + print(f"🆕 Új autó az adatbázisban: {data.vin}") + insert_car = text(""" + INSERT INTO data.vehicles (model_id, vin, current_plate) + VALUES (:mid, :vin, :plt) + RETURNING id + """) + res = await session.execute(insert_car, { + "mid": data.model_id, "vin": data.vin, "plt": data.plate + }) + vehicle_id = res.scalar() + else: + print(f"♻️ Létező autó átvétele: {data.vin} (ID: {vehicle_id})") + # Itt később lezárhatjuk az előző tulajdonos history-ját! + + # 3. BEJEGYZÉS A TÖRTÉNELEMBE (HISTORY) + # Ez köti össze a User-t (most fixen ID=1) az Autóval + insert_history = text(""" + INSERT INTO data.vehicle_history + (vehicle_id, user_id, role, start_date, start_mileage) + VALUES (:vid, 1, :role, :s_date, :s_mil) + """) + + await session.execute(insert_history, { + "vid": vehicle_id, + "role": data.role, + "s_date": data.purchase_date, + "s_mil": data.mileage + }) + + return {"status": "success", "message": "Jármű sikeresen rögzítve a flottában!"} + + except Exception as e: + print(f"❌ Hiba: {e}") + raise HTTPException(status_code=500, detail=str(e)) + +# Frontend kiszolgálása +@app.get("/") +async def serve_frontend(): + if os.path.exists("/app/frontend/index.html"): + return FileResponse("/app/frontend/index.html") + return {"error": "Frontend hiányzik"} + diff --git a/archive/2026.02.18 Archive_old_mapps/_legacy_backup/main_final.py b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/main_final.py new file mode 100755 index 0000000..a6397c9 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/main_final.py @@ -0,0 +1,49 @@ +from fastapi import FastAPI +from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession +from sqlalchemy.orm import sessionmaker +from sqlalchemy import text +import os +from dotenv import load_dotenv + +load_dotenv() + +app = FastAPI(title="Service Finder API") + +# --- A DUPLA JAVÍTÁS --- +raw_url = os.getenv("DATABASE_URL") + +if not raw_url: + # Vészhelyzeti fallback (ha nem lenne .env) + raw_url = "postgresql://admin:PASSWORD_111@postgres-db:5432/service_finder" + +# 1. Javítás: Driver csere (asyncpg) +fixed_url = raw_url.replace("postgresql://", "postgresql+asyncpg://") + +# 2. Javítás: Adatbázis név csere (Ha véletlenül _db a vége, levágjuk) +fixed_url = fixed_url.replace("/service_finder_db", "/service_finder") + +print(f"🔧 VÉGLEGES ADATBÁZIS CÍM: {fixed_url}") + +# Kapcsolódás a javított címmel +engine = create_async_engine(fixed_url) +AsyncSessionLocal = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) + +@app.get("/") +async def root(): + return {"message": "Service Finder API működik! 🚀"} + +@app.get("/vehicles") +async def get_vehicles(): + async with AsyncSessionLocal() as session: + try: + query = text(""" + SELECT m.name as brand, vm.model_name, vm.category + FROM ref.vehicle_models vm + JOIN ref.vehicle_makes m ON vm.make_id = m.id + ORDER BY m.name, vm.model_name + """) + result = await session.execute(query) + vehicles = result.fetchall() + return [{"brand": r.brand, "model": r.model_name, "category": r.category} for r in vehicles] + except Exception as e: + return {"error": str(e)} diff --git a/archive/2026.02.18 Archive_old_mapps/_legacy_backup/main_fixed.py b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/main_fixed.py new file mode 100755 index 0000000..ce52bb0 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/main_fixed.py @@ -0,0 +1,52 @@ +from fastapi import FastAPI +from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession +from sqlalchemy.orm import sessionmaker +from sqlalchemy import text +import os +from dotenv import load_dotenv + +# Betöltjük a környezeti változókat +load_dotenv() + +app = FastAPI(title="Service Finder API") + +# --- A FIX --- +# Kiolvassuk a címet +raw_url = os.getenv("DATABASE_URL") + +# Ha nincs beállítva, adunk egy vészhelyzeti alapértelmezettet +if not raw_url: + print("⚠️ FIGYELEM: Nincs DATABASE_URL, alapértelmezett használata!") + # Itt a konténer belső nevét (postgres-db) használjuk + raw_url = "postgresql://admin:MiskociA74@postgres-db:5432/service_finder" + +# A LÉNYEG: Ha hiányzik az '+asyncpg', hozzáadjuk! +if "asyncpg" not in raw_url: + DATABASE_URL = raw_url.replace("postgresql://", "postgresql+asyncpg://") + print(f"🔧 URL javítva erre: {DATABASE_URL}") +else: + DATABASE_URL = raw_url + +# Motor indítása a javított URL-lel +engine = create_async_engine(DATABASE_URL) +AsyncSessionLocal = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) + +@app.get("/") +async def root(): + return {"message": "Service Finder API működik! 🚀"} + +@app.get("/vehicles") +async def get_vehicles(): + async with AsyncSessionLocal() as session: + try: + query = text(""" + SELECT m.name as brand, vm.model_name, vm.category + FROM ref.vehicle_models vm + JOIN ref.vehicle_makes m ON vm.make_id = m.id + ORDER BY m.name, vm.model_name + """) + result = await session.execute(query) + vehicles = result.fetchall() + return [{"brand": r.brand, "model": r.model_name, "category": r.category} for r in vehicles] + except Exception as e: + return {"error": str(e)} diff --git a/archive/2026.02.18 Archive_old_mapps/_legacy_backup/migrate_ref_data.py b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/migrate_ref_data.py new file mode 100755 index 0000000..ec50041 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/migrate_ref_data.py @@ -0,0 +1,71 @@ +import asyncio +import os +from sqlalchemy.ext.asyncio import create_async_engine +from sqlalchemy import text +from dotenv import load_dotenv + +load_dotenv() + +raw_url = os.getenv("DATABASE_URL") +if not raw_url: + raw_url = "postgresql://admin:PASSWORD_111@postgres-db:5432/service_finder" +DATABASE_URL = raw_url.replace("postgresql://", "postgresql+asyncpg://").replace("/service_finder_db", "/service_finder") + +async def seed_cost_types(): + engine = create_async_engine(DATABASE_URL) + async with engine.begin() as conn: + print("🔨 Költség típusok tábla létrehozása...") + await conn.execute(text(""" + CREATE TABLE IF NOT EXISTS ref.cost_types ( + code VARCHAR(50) PRIMARY KEY, + name VARCHAR(100) NOT NULL, + parent_code VARCHAR(50) REFERENCES ref.cost_types(code), -- Hierarchia! + is_active BOOLEAN DEFAULT TRUE, + sort_order INTEGER DEFAULT 0 + ); + """)) + + print("📥 Adatok feltöltése...") + # Először a szülők (Főkategóriák) + parents = [ + ('FUEL', '⛽ Tankolás', 10), + ('PURCHASE', '💰 Beszerzés / Pénzügy', 20), + ('INSURANCE', '📄 Biztosítás', 30), + ('TAX', '🏛️ Adó / Illeték', 40), + ('SERVICE', '🔧 Szerviz', 50), + ('OTHER', 'Egyéb', 99) + ] + for p in parents: + await conn.execute(text("INSERT INTO ref.cost_types (code, name, sort_order) VALUES (:c, :n, :s) ON CONFLICT (code) DO NOTHING"), {"c": p[0], "n": p[1], "s": p[2]}) + + # Aztán a gyerekek (Alkategóriák) + children = [ + # Beszerzés + ('PURCHASE_PRICE', 'Vételár', 'PURCHASE'), + ('FINANCE_LEASE', 'Lízing díj', 'PURCHASE'), + ('FINANCE_LOAN', 'Hitel törlesztő', 'PURCHASE'), + ('IMPORT_FEE', 'Honosítás / Regadó', 'PURCHASE'), + # Biztosítás + ('INSURANCE_KGFB', 'Kötelező (KGFB)', 'INSURANCE'), + ('INSURANCE_CASCO', 'Casco', 'INSURANCE'), + ('INSURANCE_GAP', 'GAP', 'INSURANCE'), + ('INSURANCE_ASSIST', 'Assistance', 'INSURANCE'), + # Adó + ('TAX_WEIGHT', 'Gépjárműadó (Súlyadó)', 'TAX'), + ('TAX_COMPANY', 'Cégautóadó', 'TAX'), + ('TAX_TRANSFER', 'Vagyonszerzési illeték', 'TAX'), + ('TAX_OTHER', 'Egyéb adó', 'TAX'), + # Szerviz + ('SERVICE_MAINTENANCE', 'Kötelező karbantartás', 'SERVICE'), + ('SERVICE_REPAIR', 'Javítás', 'SERVICE'), + ('SERVICE_TIRE', 'Gumicsere', 'SERVICE'), + ('SERVICE_MOT', 'Műszaki vizsga', 'SERVICE') + ] + for c in children: + await conn.execute(text("INSERT INTO ref.cost_types (code, name, parent_code) VALUES (:c, :n, :p) ON CONFLICT (code) DO NOTHING"), {"c": c[0], "n": c[1], "p": c[2]}) + + print("✅ KÉSZ! A tudás most már az adatbázisban van, nem a HTML-ben.") + await engine.dispose() + +if __name__ == "__main__": + asyncio.run(seed_cost_types()) \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/_legacy_backup/teszt.txt b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/teszt.txt new file mode 100755 index 0000000..e69de29 diff --git a/archive/2026.02.18 Archive_old_mapps/_legacy_backup/update_audit_system.py b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/update_audit_system.py new file mode 100755 index 0000000..271eff7 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/update_audit_system.py @@ -0,0 +1,46 @@ +import asyncio +import os +from sqlalchemy.ext.asyncio import create_async_engine +from sqlalchemy import text +from dotenv import load_dotenv + +load_dotenv() + +raw_url = os.getenv("DATABASE_URL") +if not raw_url: + raw_url = "postgresql://admin:PASSWORD_111@postgres-db:5432/service_finder" +DATABASE_URL = raw_url.replace("postgresql://", "postgresql+asyncpg://").replace("/service_finder_db", "/service_finder") + +async def build_audit_system(): + engine = create_async_engine(DATABASE_URL) + + async with engine.begin() as conn: + print("📜 Audit Log tábla létrehozása...") + # Ez a tábla sosem töröl, csak ír! (Append-only) + await conn.execute(text(""" + CREATE TABLE IF NOT EXISTS data.audit_logs ( + id SERIAL PRIMARY KEY, + user_id INTEGER REFERENCES data.users(id), -- KI csinálta? + event_type VARCHAR(50) NOT NULL, -- MIT? (pl. ISSUE_REPORT, MILEAGE_UPDATE) + target_id INTEGER, -- MELYIK autón? (Vehicle ID) + old_value TEXT, -- MI volt előtte? (A visszaállításhoz) + new_value TEXT, -- MI lett utána? + details TEXT, -- Egyéb megjegyzés (pl. hiba leírása) + ip_address VARCHAR(45), -- Honnan? (Biztonság) + created_at TIMESTAMP DEFAULT NOW() + ); + """)) + + print("🚦 Jármű Státusz mezők hozzáadása...") + # Bővítjük a járműveket, hogy tárolják a hibát + await conn.execute(text(""" + ALTER TABLE data.vehicles + ADD COLUMN IF NOT EXISTS status VARCHAR(20) DEFAULT 'OK', -- OK, WARNING, CRITICAL + ADD COLUMN IF NOT EXISTS current_issue TEXT; -- A hiba leírása + """)) + + print("✅ KÉSZ! A mindent látó szem (Audit Log) aktív.") + await engine.dispose() + +if __name__ == "__main__": + asyncio.run(build_audit_system()) \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/_legacy_backup/update_cost_categories.py b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/update_cost_categories.py new file mode 100755 index 0000000..cda5b6c --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/update_cost_categories.py @@ -0,0 +1,56 @@ +import asyncio +import os +from sqlalchemy.ext.asyncio import create_async_engine +from sqlalchemy import text +from dotenv import load_dotenv + +load_dotenv() + +raw_url = os.getenv("DATABASE_URL") +if not raw_url: + raw_url = "postgresql://admin:PASSWORD_111@postgres-db:5432/service_finder" +DATABASE_URL = raw_url.replace("postgresql://", "postgresql+asyncpg://").replace("/service_finder_db", "/service_finder") + +async def expand_categories(): + engine = create_async_engine(DATABASE_URL) + async with engine.begin() as conn: + print("📥 Új Főkategóriák beszúrása...") + parents = [ + ('EQUIPMENT', '🛠️ Felszerelés / Extrák', 25), # Vételár után + ('OPERATIONAL', '🅿️ Üzemeltetés / Út', 15), # Tankolás után + ('FINE', '👮 Bírság / Büntetés', 90) + ] + for p in parents: + await conn.execute(text("INSERT INTO ref.cost_types (code, name, sort_order) VALUES (:c, :n, :s) ON CONFLICT (code) DO NOTHING"), {"c": p[0], "n": p[1], "s": p[2]}) + + print("📥 Új Alkategóriák beszúrása...") + children = [ + # Felszerelés (EQUIPMENT) + ('EQUIP_SHELVING', 'Raktérburkolat / Polcrendszer', 'EQUIPMENT'), + ('EQUIP_BRANDING', 'Matricázás / Fóliázás', 'EQUIPMENT'), + ('EQUIP_TOWBAR', 'Vonóhorog / Tetőcsomagtartó', 'EQUIPMENT'), + ('EQUIP_SAFETY', 'Kötelező tartozékok (Eü. csomag)', 'EQUIPMENT'), + ('EQUIP_GPS', 'GPS / Nyomkövető hardver', 'EQUIPMENT'), + ('EQUIP_WINTER_TIRE', 'Téli gumi szett (Beszerzés)', 'EQUIPMENT'), + + # Üzemeltetés (OPERATIONAL) + ('OP_PARKING', 'Parkolás', 'OPERATIONAL'), + ('OP_TOLL', 'Útdíj / Matrica / Behajtás', 'OPERATIONAL'), + ('OP_WASH', 'Mosás / Kozmetika', 'OPERATIONAL'), + ('OP_ADBLUE', 'AdBlue', 'OPERATIONAL'), + ('OP_EV_CHARGE', 'Elektromos töltés', 'OPERATIONAL'), + ('OP_STORAGE', 'Gumi hotel / Tárolás', 'OPERATIONAL'), + + # Bírság (FINE) + ('FINE_SPEEDING', 'Gyorshajtás', 'FINE'), + ('FINE_PARKING', 'Parkolási bírság', 'FINE'), + ('FINE_ADMIN', 'Közigazgatási bírság', 'FINE') + ] + for c in children: + await conn.execute(text("INSERT INTO ref.cost_types (code, name, parent_code) VALUES (:c, :n, :p) ON CONFLICT (code) DO NOTHING"), {"c": c[0], "n": c[1], "p": c[2]}) + + print("✅ KÉSZ! A költséglista most már teljeskörű.") + await engine.dispose() + +if __name__ == "__main__": + asyncio.run(expand_categories()) \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/_legacy_backup/update_db_i18n.py b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/update_db_i18n.py new file mode 100755 index 0000000..e8b8137 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/update_db_i18n.py @@ -0,0 +1,46 @@ +import asyncio +import os +from sqlalchemy.ext.asyncio import create_async_engine +from sqlalchemy import text +from dotenv import load_dotenv + +load_dotenv() + +raw_url = os.getenv("DATABASE_URL") +if not raw_url: + raw_url = "postgresql://admin:PASSWORD_111@postgres-db:5432/service_finder" +DATABASE_URL = raw_url.replace("postgresql://", "postgresql+asyncpg://").replace("/service_finder_db", "/service_finder") + +async def upgrade_db(): + print(f"🔌 Kapcsolódás...") + engine = create_async_engine(DATABASE_URL) + + async with engine.begin() as conn: + print("🌍 Felhasználói tábla bővítése (Ország + Alapértelmezett pénznem)...") + # 1. Users tábla bővítése + await conn.execute(text(""" + ALTER TABLE data.users + ADD COLUMN IF NOT EXISTS country VARCHAR(2) DEFAULT 'HU', + ADD COLUMN IF NOT EXISTS default_currency VARCHAR(3) DEFAULT 'HUF'; + """)) + + print("💶 Költség tábla bővítése (Tranzakciós pénznem)...") + # 2. Costs tábla bővítése + await conn.execute(text(""" + ALTER TABLE data.costs + ADD COLUMN IF NOT EXISTS currency VARCHAR(3) DEFAULT 'HUF'; + """)) + + # Frissítjük a meglévő Demo Usert (ID=1) + print("👤 Demo User beállítása: Magyarország / HUF") + await conn.execute(text(""" + UPDATE data.users + SET country = 'HU', default_currency = 'HUF' + WHERE id = 1; + """)) + + print("✅ KÉSZ! Az adatbázis mostantól támogatja a több pénznemet.") + await engine.dispose() + +if __name__ == "__main__": + asyncio.run(upgrade_db()) diff --git a/archive/2026.02.18 Archive_old_mapps/_legacy_backup/update_docs.py b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/update_docs.py new file mode 100755 index 0000000..0ff9347 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/update_docs.py @@ -0,0 +1,26 @@ +import asyncio +import os +from sqlalchemy.ext.asyncio import create_async_engine +from sqlalchemy import text +from dotenv import load_dotenv + +load_dotenv() + +raw_url = os.getenv("DATABASE_URL") +if not raw_url: + raw_url = "postgresql://admin:PASSWORD_111@postgres-db:5432/service_finder" +DATABASE_URL = raw_url.replace("postgresql://", "postgresql+asyncpg://").replace("/service_finder_db", "/service_finder") + +async def add_doc_column(): + engine = create_async_engine(DATABASE_URL) + async with engine.begin() as conn: + print("📄 Dokumentum oszlop hozzáadása a Costs táblához...") + await conn.execute(text(""" + ALTER TABLE data.costs + ADD COLUMN IF NOT EXISTS document_url VARCHAR(255); + """)) + print("✅ KÉSZ! Mehetnek a fájlok.") + await engine.dispose() + +if __name__ == "__main__": + asyncio.run(add_doc_column()) \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/_legacy_backup/update_invitations.py b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/update_invitations.py new file mode 100755 index 0000000..7efe4af --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/update_invitations.py @@ -0,0 +1,58 @@ +import asyncio +import os +from sqlalchemy.ext.asyncio import create_async_engine +from sqlalchemy import text +from dotenv import load_dotenv + +load_dotenv() + +raw_url = os.getenv("DATABASE_URL") +if not raw_url: + raw_url = "postgresql://admin:PASSWORD_111@postgres-db:5432/service_finder" +DATABASE_URL = raw_url.replace("postgresql://", "postgresql+asyncpg://").replace("/service_finder_db", "/service_finder") + +async def upgrade_invites(): + print(f"🔌 Kapcsolódás...") + engine = create_async_engine(DATABASE_URL) + + async with engine.begin() as conn: + print("📨 Invitations (Meghívók) tábla létrehozása...") + # Ez tárolja a függőben lévő meghívásokat + await conn.execute(text(""" + CREATE TABLE IF NOT EXISTS data.invitations ( + id SERIAL PRIMARY KEY, + email VARCHAR(255) NOT NULL, + inviter_id INTEGER REFERENCES data.users(id), -- Ki hívta meg? (Cég) + role VARCHAR(20) NOT NULL, -- Milyen szerepre? (MANAGER, DRIVER) + access_level VARCHAR(20) DEFAULT 'FULL', -- A/B Sofőr szint + token VARCHAR(100) UNIQUE NOT NULL, -- A titkos link kódja + status VARCHAR(20) DEFAULT 'PENDING', -- PENDING, ACCEPTED, EXPIRED + created_at TIMESTAMP DEFAULT NOW(), + expires_at TIMESTAMP + ); + """)) + + print("🤝 Fleet Members (Többcéges tagság) tábla létrehozása...") + # Ez teszi lehetővé, hogy valaki több céghez is tartozzon + await conn.execute(text(""" + CREATE TABLE IF NOT EXISTS data.fleet_members ( + id SERIAL PRIMARY KEY, + user_id INTEGER REFERENCES data.users(id), -- A Dolgozó + owner_id INTEGER REFERENCES data.users(id), -- A Cég / Tulajdonos + role VARCHAR(20) NOT NULL, -- FLEET_MANAGER, DRIVER + joined_at TIMESTAMP DEFAULT NOW(), + + -- Egy ember egy cégnél csak egyszer szerepelhet + UNIQUE(user_id, owner_id) + ); + """)) + + # Takarítás: A régi 'parent_id' már nem kell, mert a fleet_members kiváltja + # De biztonságból egyelőre csak NULL-ra állítjuk, nem töröljük az oszlopot + # await conn.execute(text("UPDATE data.users SET parent_id = NULL;")) + + print("✅ KÉSZ! A rendszer készen áll a biztonságos meghívókra.") + await engine.dispose() + +if __name__ == "__main__": + asyncio.run(upgrade_invites()) diff --git a/archive/2026.02.18 Archive_old_mapps/_legacy_backup/update_permissions.py b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/update_permissions.py new file mode 100755 index 0000000..b47ffb7 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/_legacy_backup/update_permissions.py @@ -0,0 +1,61 @@ +import asyncio +import os +from sqlalchemy.ext.asyncio import create_async_engine +from sqlalchemy import text +from dotenv import load_dotenv + +load_dotenv() + +raw_url = os.getenv("DATABASE_URL") +if not raw_url: + raw_url = "postgresql://admin:PASSWORD_111@postgres-db:5432/service_finder" +DATABASE_URL = raw_url.replace("postgresql://", "postgresql+asyncpg://").replace("/service_finder_db", "/service_finder") + +async def upgrade_permissions(): + print(f"🔌 Kapcsolódás...") + engine = create_async_engine(DATABASE_URL) + + async with engine.begin() as conn: + print("👑 USERS tábla bővítése (Rendszer és Szervezeti szintek)...") + + # 1. SYS_ROLE: Rendszergazda / Moderátor / User + await conn.execute(text(""" + ALTER TABLE data.users + ADD COLUMN IF NOT EXISTS sys_role VARCHAR(20) DEFAULT 'USER'; + """)) + + # 2. HIERARCHIA: Ki a főnököd? (Parent User ID) + # Ha NULL, akkor ő a Cégtulajdonos (SuperUser). Ha van ID, akkor Alkalmazott. + await conn.execute(text(""" + ALTER TABLE data.users + ADD COLUMN IF NOT EXISTS parent_id INTEGER REFERENCES data.users(id); + """)) + + # 3. ORG_ROLE: Cégen belüli szerep (Owner, Fleet Manager, Employee) + await conn.execute(text(""" + ALTER TABLE data.users + ADD COLUMN IF NOT EXISTS org_role VARCHAR(20) DEFAULT 'OWNER'; + """)) + + print("🚦 VEHICLE_HISTORY tábla bővítése (Sofőr jogosultságok)...") + + # 4. ACCESS_LEVEL: Mit láthat a sofőr? (COST_MANAGER vs LOG_ONLY) + await conn.execute(text(""" + ALTER TABLE data.vehicle_history + ADD COLUMN IF NOT EXISTS access_level VARCHAR(20) DEFAULT 'FULL'; + -- Lehetséges értékek: 'FULL', 'COST_MANAGER', 'LOG_ONLY' + """)) + + # --- DEMO ADATOK FRISSÍTÉSE --- + print("👤 Demo User (ID:1) kinevezése Rendszergazdának és Cégtulajdonosnak...") + await conn.execute(text(""" + UPDATE data.users + SET sys_role = 'SYS_ADMIN', org_role = 'OWNER', parent_id = NULL + WHERE id = 1; + """)) + + print("✅ KÉSZ! A jogosultsági mátrix beépítve az adatbázisba.") + await engine.dispose() + +if __name__ == "__main__": + asyncio.run(upgrade_permissions()) \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/auth.py.old b/archive/2026.02.18 Archive_old_mapps/auth.py.old new file mode 100755 index 0000000..1ff8953 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/auth.py.old @@ -0,0 +1,38 @@ +from fastapi import APIRouter, Depends, HTTPException, Request, status, Body +from sqlalchemy.ext.asyncio import AsyncSession +from app.db.session import get_db +from app.schemas.auth import UserRegister, Token, UserLogin +from app.services.auth_service import AuthService +from app.core.security import create_access_token + +router = APIRouter() + +@router.post("/register", response_model=Token, status_code=status.HTTP_201_CREATED) +async def register( + request: Request, + user_in: UserRegister = Body(...), + db: AsyncSession = Depends(get_db) +): + """Atomi Regisztráció KYC adatokkal és privát flotta létrehozásával.""" + # 1. Elérhetőség + is_available = await AuthService.check_email_availability(db, user_in.email) + if not is_available: + raise HTTPException(status_code=400, detail="Az e-mail cím már foglalt.") + + # 2. Végrehajtás + user = await AuthService.register_new_user( + db=db, + user_in=user_in, + ip_address=request.client.host + ) + + # 3. Token generálás + token_data = {"sub": str(user.id), "email": user.email} + access_token = create_access_token(data=token_data) + + return {"access_token": access_token, "token_type": "bearer"} + +@router.post("/login", response_model=Token) +async def login(user_in: UserLogin = Body(...), db: AsyncSession = Depends(get_db)): + # TODO: Implement login logic + raise HTTPException(status_code=501, detail="Login not yet implemented") \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/brand_seeder.py.old b/archive/2026.02.18 Archive_old_mapps/brand_seeder.py.old new file mode 100755 index 0000000..bb8b35b --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/brand_seeder.py.old @@ -0,0 +1,90 @@ +# /opt/docker/dev/service_finder/backend/app/workers/brand_seeder.py +import asyncio +import httpx +import logging +from sqlalchemy import text +from app.db.session import AsyncSessionLocal + +# Logolás beállítása a Sentinel monitorozáshoz +logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] %(name)s: %(message)s') +logger = logging.getLogger("Smart-Seeder-v1.0.2") + +async def seed_with_priority(): + """ + Feltölti a catalog_discovery táblát az RDW alapján. + Logika: Csak azokat a márkákat keressük, amikből legalább 10 db fut az utakon, + hogy ne szemeteljük tele a katalógust egyedi barkács-járművekkel. + """ + + # RDW SoQL lekérdezés: Márka (merk), Típus (voertuigsoort) és Darabszám (total) + # A szerveroldali csoportosítás és szűrés (having total >= 10) miatt villámgyors. + RDW_URL = ( + "https://opendata.rdw.nl/resource/m9d7-ebf2.json?" + "$select=merk,voertuigsoort,count(*)%20as%20total" + "&$group=merk,voertuigsoort" + "&$having=total%20>=%2010" + ) + + logger.info("📥 Adatok lekérése az RDW-től prioritásos besoroláshoz...") + + async with httpx.AsyncClient(timeout=120) as client: + try: + resp = await client.get(RDW_URL) + if resp.status_code != 200: + logger.error(f"❌ RDW API hiba: {resp.status_code}") + return + + raw_data = resp.json() + logger.info(f"📊 {len(raw_data)} potenciális márka-kategória páros érkezett.") + + async with AsyncSessionLocal() as db: + for entry in raw_data: + make = str(entry.get("merk", "")).upper().strip() + v_kind = entry.get("voertuigsoort", "") + + if not make: + continue + + # --- PRIORITÁS LOGIKA (Master Book 2.0 szerint) --- + # 1. Személyautó (Personenauto) -> 'pending' (Azonnal feldolgozandó) + # 2. Motor (Motorfiets) -> 'queued_motor' + # 3. Minden más (Teher, Busz, Mezőgazdasági) -> 'queued_heavy' + + if "Personenauto" in v_kind: + status = 'pending' + v_class = 'car' + elif "Motorfiets" in v_kind: + status = 'queued_motor' + v_class = 'motorcycle' + else: + status = 'queued_heavy' + v_class = 'truck' + + # UPSERT Logika: Ha már létezik, de még 'pending', akkor frissítjük a státuszt, + # de nem írjuk felül a már feldolgozott (processed) rekordokat. + query = text(""" + INSERT INTO data.catalog_discovery (make, model, vehicle_class, source, status) + VALUES (:make, 'ALL_VARIANTS', :v_class, 'smart_seeder_v1_0_2', :status) + ON CONFLICT (make, model, vehicle_class) + DO UPDATE SET + status = CASE + WHEN data.catalog_discovery.status = 'pending' THEN EXCLUDED.status + ELSE data.catalog_discovery.status + END + WHERE data.catalog_discovery.make = EXCLUDED.make; + """) + + await db.execute(query, { + "make": make, + "v_class": v_class, + "status": status + }) + + await db.commit() + logger.info("✅ Discovery lista sikeresen feltöltve és prioritizálva.") + + except Exception as e: + logger.error(f"❌ Kritikus hiba a seeder futása közben: {e}") + +if __name__ == "__main__": + asyncio.run(seed_with_priority()) \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/catalog_filler.py.old b/archive/2026.02.18 Archive_old_mapps/catalog_filler.py.old new file mode 100755 index 0000000..e886db4 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/catalog_filler.py.old @@ -0,0 +1,35 @@ +# app/workers/catalog_filler.py +import asyncio +from sqlalchemy.ext.asyncio import AsyncSession +from app.db.session import SessionLocal +from app.models.asset import AssetCatalog +from sqlalchemy import select + +class CatalogFiller: + @staticmethod + async def seed_initial_data(): + """Alapértelmezett márkák és típusok feltöltése (Példa).""" + initial_data = [ + {"make": "Audi", "model": "A4", "generation": "B8 (2008-2015)", "engine_variant": "2.0 TDI (150 LE)", "fuel_type": "Diesel"}, + {"make": "BMW", "model": "3 Series", "generation": "F30 (2012-2019)", "engine_variant": "320d (190 LE)", "fuel_type": "Diesel"}, + {"make": "Volkswagen", "model": "Passat", "generation": "B8 (2014-)", "engine_variant": "2.0 TDI (150 LE)", "fuel_type": "Diesel"} + ] + + async with SessionLocal() as db: + for item in initial_data: + # Ellenőrizzük, létezik-e már + stmt = select(AssetCatalog).where( + AssetCatalog.make == item["make"], + AssetCatalog.model == item["model"], + AssetCatalog.engine_variant == item["engine_variant"] + ) + exists = (await db.execute(stmt)).scalar_one_or_none() + + if not exists: + db.add(AssetCatalog(**item)) + + await db.commit() + print("Catalog seeding complete.") + +if __name__ == "__main__": + asyncio.run(CatalogFiller.seed_initial_data()) \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/catalog_robot1.3.py.old b/archive/2026.02.18 Archive_old_mapps/catalog_robot1.3.py.old new file mode 100755 index 0000000..96d9148 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/catalog_robot1.3.py.old @@ -0,0 +1,208 @@ +import asyncio +import httpx +import logging +import json +import os +import datetime +from sqlalchemy import text +from app.db.session import SessionLocal +from app.models.asset import AssetCatalog + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger("Robot-v1.0.13-Global-Hunter") + +class CatalogMaster: + """ + Master Hunter Robot v1.0.13 - Global Hunter Edition + - Holland (RDW), Brit (DVLA) és Amerikai (NHTSA) adatbázis integráció. + - Ratio-Filter: Kiszűri a 0.19-es kW/kg arányszámokat. + - Multi-field Power Discovery: Minden lehetséges mezőből kinyeri a kW-ot. + - Dinamikus évjárat kezelés a duplikációk ellen. + """ + + # API Végpontok + RDW_MAIN = "https://opendata.rdw.nl/resource/m9d7-ebf2.json" + RDW_FUEL = "https://opendata.rdw.nl/resource/8ys7-d773.json" + RDW_AXLE = "https://opendata.rdw.nl/resource/3huj-srit.json" + RDW_BODY = "https://opendata.rdw.nl/resource/vezc-m2t6.json" + + UK_DVLA = "https://driver-vehicle-licensing.api.gov.uk/vehicle-enquiry/v1/vehicles" + US_NHTSA = "https://vpic.nhtsa.dot.gov/api/vehicles/DecodeVinValuesBatch/" + + RDW_TOKEN = os.getenv("RDW_APP_TOKEN") + UK_API_KEY = os.getenv("UK_DVLA_API_KEY") + + HEADERS_RDW = {"X-App-Token": RDW_TOKEN} if RDW_TOKEN else {} + HEADERS_UK = {"x-api-key": UK_API_KEY, "Content-Type": "application/json"} if UK_API_KEY else {} + + CATEGORY_MAP = { + "Personenauto": "car", + "Motorfiets": "motorcycle", + "Bedrijfsauto": "truck", + "Vrachtwagen": "truck", + "Opleggertrekker": "truck", + "Bus": "bus", + "Aanhangwagen": "trailer", + "Oplegger": "trailer", + "Landbouw- of bosbouwtrekker": "agricultural", + "camper": "camper" + } + + @classmethod + def clean_kw(cls, val): + """Speciális kW tisztító: ignorálja az 1.0 alatti arányszámokat.""" + try: + if val is None: return None + f_val = float(str(val).replace(',', '.')) + if 0 < f_val < 1.0: return None # Ez csak arányszám (kW/kg) + v = int(f_val) + return v if v > 0 else None + except (ValueError, TypeError): + return None + + @classmethod + def clean_int(cls, val): + """Általános egész szám tisztító.""" + try: + if val is None: return None + return int(float(str(val).replace(',', '.'))) + except (ValueError, TypeError): + return None + + @classmethod + async def fetch_api(cls, url, params=None, headers=None, method="GET", json_data=None): + """Univerzális API hívó sebességkorlátozással.""" + async with httpx.AsyncClient(headers=headers, follow_redirects=True) as client: + try: + await asyncio.sleep(1.2) # Biztonsági késleltetés + if method == "POST": + resp = await client.post(url, json=json_data, timeout=30) + else: + resp = await client.get(url, params=params, timeout=30) + return resp.json() if resp.status_code in [200, 201] else [] + except Exception as e: + logger.error(f"❌ API Hiba ({url}): {e}") + return [] + + @classmethod + async def get_deep_tech(cls, plate, main_kw=None, vin=None): + """Nemzetközi dúsítás: Holland -> Brit -> Amerikai sorrendben.""" + res = {"kw": cls.clean_kw(main_kw), "fuel": "Unknown", "axles": None, "body": "Standard", "euro": None} + + # 1. HOLLAND (RDW) DÚSÍTÁS + fuel_data = await cls.fetch_api(cls.RDW_FUEL, {"kenteken": plate}, headers=cls.HEADERS_RDW) + if fuel_data: + f0 = fuel_data[0] + if not res["kw"]: + res["kw"] = cls.clean_kw(f0.get("nettomaximumvermogen") or f0.get("netto_maximum_vermogen")) + res["fuel"] = f0.get("brandstof_omschrijving", "Unknown") + res["euro"] = f0.get("uitlaatemissieniveau") + + # 2. BRIT (DVLA) ELLENŐRZÉS (Ha van UK kulcs és még hiányzik adat) + if cls.UK_API_KEY and (not res["kw"] or not res["euro"]): + uk_data = await cls.fetch_api(cls.UK_DVLA, method="POST", json_data={"registrationNumber": plate}, headers=cls.HEADERS_UK) + if uk_data: + res["kw"] = res["kw"] or cls.clean_kw(uk_data.get("engineCapacity")) # Brit adatok finomítása + res["euro"] = res["euro"] or uk_data.get("euroStatus") + + # 3. AMERIKAI (NHTSA) KUTATÁS (Ha van alvázszám) + if vin and len(vin) == 17: + us_data = await cls.fetch_api(cls.US_NHTSA, params={"format": "json", "data": vin}) + if us_data and "Results" in us_data: + # Az amerikai adatbázisból kinyerjük a lóerőt (HP), ha a kW még mindig nincs meg + hp = us_data["Results"][0].get("EngineHP") + if hp and not res["kw"]: + res["kw"] = int(float(hp) * 0.7457) # HP -> kW konverzió + + # RDW Extra adatok (Tengely, Karosszéria) + axle = await cls.fetch_api(cls.RDW_AXLE, {"kenteken": plate}, headers=cls.HEADERS_RDW) + if axle: res["axles"] = cls.clean_int(axle[0].get("aantal_assen")) + + body = await cls.fetch_api(cls.RDW_BODY, {"kenteken": plate}, headers=cls.HEADERS_RDW) + if body: res["body"] = body[0].get("carrosserie_omschrijving", "Standard") + + return res + + @classmethod + async def process_make(cls, db, task_id, make_name): + logger.info(f"🚀 >>> {make_name} GlobalHunter v1.0.13 INDUL...") + offset, limit, total_saved = 0, 1000, 0 + unique_variants = {} + + while True: + params = {"merk": make_name.upper(), "$limit": limit, "$offset": offset} + main_data = await cls.fetch_api(cls.RDW_MAIN, params, headers=cls.HEADERS_RDW) + if not main_data: break + + for item in main_data: + plate = item.get("kenteken") + if not plate: continue + + model = str(item.get("handelsbenaming", "Unknown")).upper() + ccm = cls.clean_int(item.get("cilinderinhoud")) + weight = cls.clean_int(item.get("massa_ledig_voertuig") or item.get("massa_rijklaar")) + kw_candidate = item.get("netto_maximum_vermogen") or item.get("vermogen_massarijklaar") + + raw_date = item.get("datum_eerste_toelating") + prod_year = int(str(raw_date)[:4]) if raw_date else 2024 + + v_class = cls.CATEGORY_MAP.get(item.get("voertuigsoort"), "other") + if "kampeerwagen" in str(item.get("inrichting", "")).lower(): v_class = "camper" + + # Variáns kulcs: Modell + CCM + Súly + kW + Év = Egyedi technikai ujjlenyomat + variant_key = f"{model}-{ccm}-{weight}-{v_class}-{kw_candidate}-{prod_year}" + + if variant_key not in unique_variants: + unique_variants[variant_key] = { + "model": model, "ccm": ccm, "weight": weight, "v_class": v_class, + "plate": plate, "main_kw": kw_candidate, "prod_year": prod_year, + "vin": item.get("vin") # Ha az RDW-ben benne van a VIN + } + + if len(main_data) < limit or offset > 90000: break + offset += limit + + logger.info(f"📊 {len(unique_variants)} egyedi variáns kutatása indul...") + + for key, v in unique_variants.items(): + deep = await cls.get_deep_tech(v["plate"], main_kw=v["main_kw"], vin=v["vin"]) + try: + db_item = AssetCatalog( + make=make_name.upper(), model=v["model"], vehicle_class=v["v_class"], + fuel_type=deep["fuel"], power_kw=deep["kw"], engine_capacity=v["ccm"], + max_weight_kg=v["weight"], axle_count=deep["axles"], body_type=deep["body"], + year_from=v["prod_year"], euro_class=deep["euro"], + factory_data={ + "source": "GlobalHunter-v1.0.13", + "sample_plate": v["plate"], + "enriched_at": str(datetime.datetime.now()) + } + ) + db.add(db_item) + await db.commit() + total_saved += 1 + if total_saved % 50 == 0: logger.info(f"✅ {total_saved} variáns elmentve.") + except Exception: + await db.rollback() + continue + + await db.execute(text("UPDATE data.catalog_discovery SET status = 'processed' WHERE id = :id"), {"id": task_id}) + await db.commit() + logger.info(f"🏁 {make_name} KÉSZ. {total_saved} rekord rögzítve.") + + @classmethod + async def run(cls): + logger.info("🤖 Robot 1.0.13 (Global Hunter) ONLINE") + while True: + async with SessionLocal() as db: + res = await db.execute(text("SELECT id, make FROM data.catalog_discovery WHERE status = 'pending' LIMIT 1")) + task = res.fetchone() + if task: + await cls.process_make(db, task[0], task[1]) + else: + logger.info("😴 Várólista üres. Alvás 60 mp...") + await asyncio.sleep(60) + await asyncio.sleep(1) + +if __name__ == "__main__": + asyncio.run(CatalogMaster.run()) \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/catalog_robot1.4.1.py.old b/archive/2026.02.18 Archive_old_mapps/catalog_robot1.4.1.py.old new file mode 100755 index 0000000..1546f15 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/catalog_robot1.4.1.py.old @@ -0,0 +1,270 @@ +import asyncio +import httpx +import logging +import json +import os +import datetime +import sys +from sqlalchemy import text +from app.db.session import SessionLocal +from app.models.asset import AssetCatalog + +# --- KÉNYSZERÍTETT IDŐBÉLYEGES LOGOLÁS --- +# Töröljük az esetleges korábbi konfigurációkat, hogy az időbélyeg garantált legyen +for handler in logging.root.handlers[:]: + logging.root.removeHandler(handler) + +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s.%(msecs)03d [%(levelname)s] %(name)s: %(message)s', + datefmt='%Y-%m-%d %H:%M:%S', + stream=sys.stdout +) +logger = logging.getLogger("Robot-v1.4.1-Powerhouse") + +class CatalogMaster: + """ + Master Hunter Robot v1.4.1 - Powerhouse Edition + - Párhuzamos Holland (RDW) és Amerikai (NHTSA Batch) Discovery. + - Garantált időbélyeges naplózás. + - Multi-Worker Safe (FOR UPDATE SKIP LOCKED). + - Rate Limit (429) védelem. + """ + + # API Végpontok + RDW_MAIN = "https://opendata.rdw.nl/resource/m9d7-ebf2.json" + RDW_FUEL = "https://opendata.rdw.nl/resource/8ys7-d773.json" + RDW_AXLE = "https://opendata.rdw.nl/resource/3huj-srit.json" + RDW_BODY = "https://opendata.rdw.nl/resource/vezc-m2t6.json" + US_BATCH = "https://vpic.nhtsa.dot.gov/api/vehicles/GetModelsForMakeYear/make/{make}/modelyear/{year}?format=json" + + # BRIT API (Token után aktiválható) + UK_DVLA = "https://driver-vehicle-licensing.api.gov.uk/vehicle-enquiry/v1/vehicles" + + RDW_TOKEN = os.getenv("RDW_APP_TOKEN") + UK_API_KEY = os.getenv("UK_DVLA_API_KEY") + + HEADERS_RDW = {"X-App-Token": RDW_TOKEN} if RDW_TOKEN else {} + HEADERS_UK = {"x-api-key": UK_API_KEY, "Content-Type": "application/json"} if UK_API_KEY else {} + + CATEGORY_MAP = { + "Personenauto": "car", + "Motorfiets": "motorcycle", + "Bedrijfsauto": "truck", + "Vrachtwagen": "truck", + "Opleggertrekker": "truck", + "Bus": "bus", + "Aanhangwagen": "trailer", + "Oplegger": "trailer", + "Landbouw- of bosbouwtrekker": "agricultural", + "camper": "camper" + } + + # Szabályozzuk a párhuzamos dúsítást (egyszerre max 5 kérés robotpéldányonként) + semaphore = asyncio.Semaphore(5) + + @classmethod + def clean_kw(cls, val): + try: + if val is None: return None + f_val = float(str(val).replace(',', '.')) + if 0 < f_val < 1.0: return None + v = int(f_val) + return v if v > 0 else None + except (ValueError, TypeError): + return None + + @classmethod + def clean_int(cls, val): + try: + if val is None: return None + return int(float(str(val).replace(',', '.'))) + except (ValueError, TypeError): + return None + + @classmethod + async def fetch_api(cls, url, params=None, headers=None, method="GET", json_data=None): + """Intelligens API hívó 429-es védelemmel és időzített logolással.""" + async with httpx.AsyncClient(headers=headers, follow_redirects=True) as client: + for attempt in range(3): + try: + if method == "POST": + resp = await client.post(url, json=json_data, timeout=30) + else: + resp = await client.get(url, params=params, timeout=30) + + if resp.status_code == 429: + wait_time = (attempt + 1) * 5 + logger.warning(f"⚠️ RATE LIMIT! Várakozás {wait_time}mp: {url}") + await asyncio.sleep(wait_time) + continue + + return resp.json() if resp.status_code in [200, 201] else [] + except Exception as e: + logger.error(f"❌ API Hiba ({url}): {e}") + await asyncio.sleep(2) + return [] + + @classmethod + async def get_deep_tech(cls, plate, main_kw=None, vin=None): + """Mély dúsítás több forrásból párhuzamosan.""" + async with cls.semaphore: + res = {"kw": cls.clean_kw(main_kw), "fuel": "Unknown", "axles": None, "body": "Standard", "euro": None} + + # --- 1. HOLLAND (RDW) DÚSÍTÁS --- + fuel_task = cls.fetch_api(cls.RDW_FUEL, {"kenteken": plate}, headers=cls.HEADERS_RDW) + axle_task = cls.fetch_api(cls.RDW_AXLE, {"kenteken": plate}, headers=cls.HEADERS_RDW) + + fuel_data, axle_data = await asyncio.gather(fuel_task, axle_task) + + if fuel_data: + f0 = fuel_data[0] + if not res["kw"]: + res["kw"] = cls.clean_kw(f0.get("nettomaximumvermogen") or f0.get("netto_maximum_vermogen")) + res["fuel"] = f0.get("brandstof_omschrijving", "Unknown") + res["euro"] = f0.get("uitlaatemissieniveau") + + if axle_data: + res["axles"] = cls.clean_int(axle_data[0].get("aantal_assen")) + + # --- 2. BRIT (DVLA) ELLENŐRZÉS (AKTIVÁLHATÓ KULCCSAL) --- + """ + if cls.UK_API_KEY and (not res["kw"] or not res["euro"]): + uk_data = await cls.fetch_api(cls.UK_DVLA, method="POST", + json_data={"registrationNumber": plate}, + headers=cls.HEADERS_UK) + if uk_data and not isinstance(uk_data, list): + res["kw"] = res["kw"] or cls.clean_kw(uk_data.get("engineCapacity")) + res["euro"] = res["euro"] or uk_data.get("euroStatus") + """ + return res + + @classmethod + async def discover_holland(cls, make_name, limit=1000): + """Holland Discovery ág: rendszámok gyűjtése.""" + offset, variants = 0, {} + while True: + params = {"merk": make_name.upper(), "$limit": limit, "$offset": offset} + data = await cls.fetch_api(cls.RDW_MAIN, params, headers=cls.HEADERS_RDW) + if not data: break + + for item in data: + plate = item.get("kenteken") + if not plate: continue + model = str(item.get("handelsbenaming", "Unknown")).upper() + ccm = cls.clean_int(item.get("cilinderinhoud")) + weight = cls.clean_int(item.get("massa_ledig_voertuig") or item.get("massa_rijklaar")) + kw = item.get("netto_maximum_vermogen") or item.get("vermogen_massarijklaar") + raw_date = item.get("datum_eerste_toelating") + year = int(str(raw_date)[:4]) if raw_date else 2024 + + v_class = cls.CATEGORY_MAP.get(item.get("voertuigsoort"), "other") + key = f"{model}-{ccm}-{weight}-{v_class}-{kw}-{year}" + + if key not in variants: + variants[key] = { + "model": model, "ccm": ccm, "weight": weight, "v_class": v_class, + "plate": plate, "main_kw": kw, "prod_year": year, "vin": item.get("vin") + } + if len(data) < limit: break + offset += limit + return variants + + @classmethod + async def discover_usa_batch(cls, make_name): + """Amerikai NHTSA Batch Discovery: Típusok gyűjtése.""" + variants = {} + years = range(datetime.datetime.now().year - 5, datetime.datetime.now().year + 1) + + async def fetch_year(year): + url = cls.US_BATCH.format(make=make_name.upper(), year=year) + logger.info(f"🇺🇸 USA Batch Discovery indítása: {make_name} ({year})") + data = await cls.fetch_api(url) + if data and "Results" in data: + for m in data["Results"]: + m_name = m.get("Model_Name", "Unknown").upper() + key = f"US-{m_name}-{year}" + if key not in variants: + variants[key] = { + "model": m_name, "ccm": None, "weight": None, "v_class": "car", + "plate": "US-DISCOVERY", "main_kw": None, "prod_year": year, "vin": None + } + + await asyncio.gather(*(fetch_year(y) for y in years)) + return variants + + @classmethod + async def process_make(cls, db, task_id, make_name): + logger.info(f"🚀 >>> {make_name} Powerhouse v1.4.1 INDUL...") + + # Párhuzamos Discovery + holland_task = cls.discover_holland(make_name) + usa_task = cls.discover_usa_batch(make_name) + + holland_variants, usa_variants = await asyncio.gather(holland_task, usa_task) + all_variants = {**usa_variants, **holland_variants} + + logger.info(f"📊 Összefésült variánsok száma: {len(all_variants)}") + + async def enrich_and_save(v): + deep = await cls.get_deep_tech(v["plate"], main_kw=v["main_kw"], vin=v["vin"]) + try: + db_item = AssetCatalog( + make=make_name.upper(), model=v["model"], vehicle_class=v["v_class"], + fuel_type=deep["fuel"], power_kw=deep["kw"], engine_capacity=v["ccm"], + max_weight_kg=v["weight"], axle_count=deep["axles"], body_type=deep["body"], + year_from=v["prod_year"], euro_class=deep["euro"], + factory_data={ + "source": "Powerhouse-v1.4.1", + "discovery_nl": v["plate"] != "US-DISCOVERY", + "enriched_at": str(datetime.datetime.now()) + } + ) + return db_item + except Exception: + return None + + # Párhuzamos dúsítás (Semaphore korláttal) + results = await asyncio.gather(*(enrich_and_save(v) for v in all_variants.values())) + + total_saved = 0 + for item in results: + if item: + db.add(item) + total_saved += 1 + + await db.commit() + await db.execute(text("UPDATE data.catalog_discovery SET status = 'processed' WHERE id = :id"), {"id": task_id}) + await db.commit() + logger.info(f"🏁 {make_name} KÉSZ. {total_saved} egyedi rekord rögzítve.") + + @classmethod + async def run(cls): + logger.info("🤖 Robot 1.4.1 (Powerhouse) ONLINE - Multi-Worker Safe Mode") + while True: + async with SessionLocal() as db: + # SKIP LOCKED védelem a párhuzamos futtatáshoz + query = text(""" + SELECT id, make FROM data.catalog_discovery + WHERE status = 'pending' + LIMIT 1 + FOR UPDATE SKIP LOCKED + """) + res = await db.execute(query) + task = res.fetchone() + + if task: + task_id, make_name = task + await db.execute( + text("UPDATE data.catalog_discovery SET status = 'running' WHERE id = :id"), + {"id": task_id} + ) + await db.commit() + await cls.process_make(db, task_id, make_name) + else: + logger.info("😴 Várólista üres vagy minden feladat foglalt. Alvás 60mp...") + await asyncio.sleep(60) + await asyncio.sleep(1) + +if __name__ == "__main__": + asyncio.run(CatalogMaster.run()) \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/catalog_robot1.4.py.old b/archive/2026.02.18 Archive_old_mapps/catalog_robot1.4.py.old new file mode 100755 index 0000000..60d5ae1 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/catalog_robot1.4.py.old @@ -0,0 +1,272 @@ +import asyncio +import httpx +import logging +import json +import os +import datetime +from sqlalchemy import text +from app.db.session import SessionLocal +from app.models.asset import AssetCatalog + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger("Robot-v1.4-Powerhouse") + +class CatalogMaster: + """ + Master Hunter Robot v1.4 - Powerhouse Edition + - Párhuzamos Holland (RDW) és Amerikai (NHTSA Batch) Discovery. + - Előkészített, kikommentelt Brit (DVLA) integráció. + - Async Semaphore: Párhuzamos technikai dúsítás (egyszerre 10 szálon). + - Intelligens összefésülés a globális források között. + """ + + # API Végpontok + RDW_MAIN = "https://opendata.rdw.nl/resource/m9d7-ebf2.json" + RDW_FUEL = "https://opendata.rdw.nl/resource/8ys7-d773.json" + RDW_AXLE = "https://opendata.rdw.nl/resource/3huj-srit.json" + RDW_BODY = "https://opendata.rdw.nl/resource/vezc-m2t6.json" + + # AMERIKAI BATCH API: Egyetlen hívással az összes modell évjárat szerint + US_BATCH = "https://vpic.nhtsa.dot.gov/api/vehicles/GetModelsForMakeYear/make/{make}/modelyear/{year}?format=json" + + # BRIT API (Kikapcsolva a tokenig) + # UK_DVLA = "https://driver-vehicle-licensing.api.gov.uk/vehicle-enquiry/v1/vehicles" + + RDW_TOKEN = os.getenv("RDW_APP_TOKEN") + UK_API_KEY = os.getenv("UK_DVLA_API_KEY") # Jövőbeli token helye + + HEADERS_RDW = {"X-App-Token": RDW_TOKEN} if RDW_TOKEN else {} + # HEADERS_UK = {"x-api-key": UK_API_KEY, "Content-Type": "application/json"} if UK_API_KEY else {} + + CATEGORY_MAP = { + "Personenauto": "car", + "Motorfiets": "motorcycle", + "Bedrijfsauto": "truck", + "Vrachtwagen": "truck", + "Opleggertrekker": "truck", + "Bus": "bus", + "Aanhangwagen": "trailer", + "Oplegger": "trailer", + "Landbouw- of bosbouwtrekker": "agricultural", + "camper": "camper" + } + + # Szabályozzuk a párhuzamos dúsítást, hogy ne tiltsanak le (egyszerre max 10 kérés) + semaphore = asyncio.Semaphore(5) + + @classmethod + def clean_kw(cls, val): + try: + if val is None: return None + f_val = float(str(val).replace(',', '.')) + if 0 < f_val < 1.0: return None + v = int(f_val) + return v if v > 0 else None + except (ValueError, TypeError): + return None + + @classmethod + def clean_int(cls, val): + try: + if val is None: return None + return int(float(str(val).replace(',', '.'))) + except (ValueError, TypeError): + return None + + @classmethod + async def fetch_api(cls, url, params=None, headers=None, method="GET", json_data=None): + async with httpx.AsyncClient(headers=headers, follow_redirects=True) as client: + for attempt in range(3): # 3-szor próbáljuk újra, ha kell + try: + if method == "POST": + resp = await client.post(url, json=json_data, timeout=30) + else: + resp = await client.get(url, params=params, timeout=30) + + if resp.status_code == 429: # HOPPÁ, túl gyorsak vagyunk! + wait_time = (attempt + 1) * 5 # Egyre többet vár: 5s, 10s... + logger.warning(f"⚠️ RDW limit elérve! Pihenő {wait_time} mp...") + await asyncio.sleep(wait_time) + continue + + return resp.json() if resp.status_code in [200, 201] else [] + except Exception as e: + logger.error(f"❌ API Hiba ({url}): {e}") + await asyncio.sleep(2) + return [] + + @classmethod + async def get_deep_tech(cls, plate, main_kw=None, vin=None): + """Mély dúsítás párhuzamos forrásokból.""" + async with cls.semaphore: + res = {"kw": cls.clean_kw(main_kw), "fuel": "Unknown", "axles": None, "body": "Standard", "euro": None} + + # --- 1. HOLLAND (RDW) DÚSÍTÁS --- + fuel_task = cls.fetch_api(cls.RDW_FUEL, {"kenteken": plate}, headers=cls.HEADERS_RDW) + axle_task = cls.fetch_api(cls.RDW_AXLE, {"kenteken": plate}, headers=cls.HEADERS_RDW) + + # Holland adatok párhuzamos lekérése + fuel_data, axle_data = await asyncio.gather(fuel_task, axle_task) + + if fuel_data: + f0 = fuel_data[0] + if not res["kw"]: + res["kw"] = cls.clean_kw(f0.get("nettomaximumvermogen") or f0.get("netto_maximum_vermogen")) + res["fuel"] = f0.get("brandstof_omschrijving", "Unknown") + res["euro"] = f0.get("uitlaatemissieniveau") + + if axle_data: + res["axles"] = cls.clean_int(axle_data[0].get("aantal_assen")) + + # --- 2. BRIT (DVLA) ELLENŐRZÉS (KIKOMMENTELVE A TOKENIG) --- + """ + if cls.UK_API_KEY and (not res["kw"] or not res["euro"]): + uk_data = await cls.fetch_api(cls.UK_DVLA, method="POST", + json_data={"registrationNumber": plate}, + headers=cls.HEADERS_UK) + if uk_data and not isinstance(uk_data, list): + res["kw"] = res["kw"] or cls.clean_kw(uk_data.get("engineCapacity")) + res["euro"] = res["euro"] or uk_data.get("euroStatus") + """ + + return res + + @classmethod + async def discover_holland(cls, make_name, limit=1000): + """Holland Discovery ág.""" + offset, variants = 0, {} + while True: + params = {"merk": make_name.upper(), "$limit": limit, "$offset": offset} + data = await cls.fetch_api(cls.RDW_MAIN, params, headers=cls.HEADERS_RDW) + if not data: break + + for item in data: + plate = item.get("kenteken") + if not plate: continue + model = str(item.get("handelsbenaming", "Unknown")).upper() + ccm = cls.clean_int(item.get("cilinderinhoud")) + weight = cls.clean_int(item.get("massa_ledig_voertuig") or item.get("massa_rijklaar")) + kw = item.get("netto_maximum_vermogen") or item.get("vermogen_massarijklaar") + raw_date = item.get("datum_eerste_toelating") + year = int(str(raw_date)[:4]) if raw_date else 2024 + + v_class = cls.CATEGORY_MAP.get(item.get("voertuigsoort"), "other") + key = f"{model}-{ccm}-{weight}-{v_class}-{kw}-{year}" + + if key not in variants: + variants[key] = { + "model": model, "ccm": ccm, "weight": weight, "v_class": v_class, + "plate": plate, "main_kw": kw, "prod_year": year, "vin": item.get("vin") + } + if len(data) < limit: break + offset += limit + return variants + + @classmethod + async def discover_usa_batch(cls, make_name): + """Amerikai NHTSA Batch Discovery ág (2020-2025 évjáratokra).""" + variants = {} + # Az utolsó 5 évjáratot nézzük a legfrissebb modellekért + years = range(datetime.datetime.now().year - 5, datetime.datetime.now().year + 1) + + async def fetch_year(year): + url = cls.US_BATCH.format(make=make_name.upper(), year=year) + data = await cls.fetch_api(url) + if data and "Results" in data: + for m in data["Results"]: + m_name = m.get("Model_Name", "Unknown").upper() + # US adatoknál nincs rendszám, de a Robot 2 dúsítani fogja ha kell + key = f"US-{m_name}-{year}" + variants[key] = { + "model": m_name, "ccm": None, "weight": None, "v_class": "car", + "plate": "US-DISCOVERY", "main_kw": None, "prod_year": year, "vin": None + } + + await asyncio.gather(*(fetch_year(y) for y in years)) + return variants + + @classmethod + async def process_make(cls, db, task_id, make_name): + logger.info(f"🚀 >>> {make_name} Powerhouse v1.4 INDUL...") + + # PÁRHUZAMOS DISCOVERY: Holland és USA egyszerre + holland_task = cls.discover_holland(make_name) + usa_task = cls.discover_usa_batch(make_name) + + holland_variants, usa_variants = await asyncio.gather(holland_task, usa_task) + + # Összefésülés (Holland élvez elsőbbséget a rendszám miatt) + all_variants = {**usa_variants, **holland_variants} + logger.info(f"📊 Összesen {len(all_variants)} egyedi variáns (NL: {len(holland_variants)}, US: {len(usa_variants)})") + + # PÁRHUZAMOS DÚSÍTÁS + async def enrich_and_save(v): + deep = await cls.get_deep_tech(v["plate"], main_kw=v["main_kw"], vin=v["vin"]) + try: + db_item = AssetCatalog( + make=make_name.upper(), model=v["model"], vehicle_class=v["v_class"], + fuel_type=deep["fuel"], power_kw=deep["kw"], engine_capacity=v["ccm"], + max_weight_kg=v["weight"], axle_count=deep["axles"], body_type=deep["body"], + year_from=v["prod_year"], euro_class=deep["euro"], + factory_data={ + "source": "Powerhouse-v1.4", + "discovery_nl": v["plate"] != "US-DISCOVERY", + "enriched_at": str(datetime.datetime.now()) + } + ) + return db_item + except Exception: + return None + + # Egyszerre indítjuk a dúsításokat (A semaphore korlátozza a szálakat) + results = await asyncio.gather(*(enrich_and_save(v) for v in all_variants.values())) + + # Mentés + total_saved = 0 + for item in results: + if item: + db.add(item) + total_saved += 1 + + await db.commit() + await db.execute(text("UPDATE data.catalog_discovery SET status = 'processed' WHERE id = :id"), {"id": task_id}) + await db.commit() + logger.info(f"🏁 {make_name} KÉSZ. {total_saved} rekord rögzítve.") + + @classmethod + async def run(cls): + logger.info("🤖 Robot 1.4 (Powerhouse) ONLINE - Multi-Worker Safe") + while True: + async with SessionLocal() as db: + # 1. 'FOR UPDATE SKIP LOCKED' - Megfogjuk a sort és lelakatoljuk, + # de a többi robot átugorja, amit mi már fogunk. + query = text(""" + SELECT id, make FROM data.catalog_discovery + WHERE status = 'pending' + LIMIT 1 + FOR UPDATE SKIP LOCKED + """) + + res = await db.execute(query) + task = res.fetchone() + + if task: + task_id, make_name = task + # 2. Azonnal átállítjuk 'running'-ra a tranzakción belül, + # így senki más nem nyúl hozzá. + await db.execute( + text("UPDATE data.catalog_discovery SET status = 'running' WHERE id = :id"), + {"id": task_id} + ) + await db.commit() # Itt véglegesítjük a foglalást + + # 3. Indulhat a tényleges munka + await cls.process_make(db, task_id, make_name) + else: + logger.info("😴 Várólista üres (vagy minden sor foglalt). Alvás 60 mp...") + await asyncio.sleep(60) + + await asyncio.sleep(1) + +if __name__ == "__main__": + asyncio.run(CatalogMaster.run()) \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/docker-compose_1.yml b/archive/2026.02.18 Archive_old_mapps/docker-compose_1.yml new file mode 100755 index 0000000..f55e754 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/docker-compose_1.yml @@ -0,0 +1,198 @@ +services: + # 1. MIGRÁCIÓ (Adatbázis szerkezet frissítése) + migrate: + build: + context: ./backend + dockerfile: Dockerfile + container_name: service_finder_migrate + env_file: .env + volumes: + - ./backend:/app # Ez tartalmazza az alembic.ini-t és a migrations mappát is! + environment: + PYTHONPATH: /app + DATABASE_URL: ${MIGRATION_DATABASE_URL} + command: ["bash", "-lc", "alembic upgrade head"] + networks: + - default + - shared_db_net + restart: "no" + + # 2. BACKEND API + service_finder_api: + build: + context: ./backend + dockerfile: Dockerfile + container_name: service_finder_api + env_file: .env + volumes: + - ./backend:/app + - /mnt/nas/app_data:/mnt/nas/app_data # Központi NAS elérés + - ./static_previews:/app/static/previews # Lokális SSD gyorsítótár + command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --proxy-headers --forwarded-allow-ips="*" + ports: + - "8000:8000" + environment: + PYTHONPATH: /app + DATABASE_URL: ${DATABASE_URL} + ALLOWED_ORIGINS: ${ALLOWED_ORIGINS} + MINIO_ENDPOINT: ${MINIO_ENDPOINT} + MINIO_ROOT_USER: ${MINIO_ROOT_USER} + MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD} + depends_on: + migrate: + condition: service_completed_successfully + minio: + condition: service_started + redis: + condition: service_started + networks: + - default + - shared_db_net + restart: unless-stopped + + # 3. MINIO (NAS-ra ment) + minio: + image: minio/minio + container_name: service_finder_minio + env_file: .env + command: server /data --console-address ":9001" + environment: + MINIO_ROOT_USER: ${MINIO_ROOT_USER} + MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD} + volumes: + - /mnt/nas/app_data/minio_data:/data + ports: + - "9000:9000" + - "9001:9001" + networks: + - default + restart: unless-stopped + + # 4. REDIS (Lokális cache) + redis: + image: redis:alpine + container_name: service_finder_redis + volumes: + - /mnt/nas/app_data/redis_data:/data + networks: + - default + restart: unless-stopped + + # 5. FRONTEND + service_finder_frontend: + build: + context: ./frontend + container_name: service_finder_frontend + env_file: .env + ports: + - "3001:80" + environment: + ALLOWED_ORIGINS: ${ALLOWED_ORIGINS} + networks: + - default + depends_on: + service_finder_api: + condition: service_started + restart: unless-stopped + + # Katalógus felderítő robot + catalog_robot: + build: ./backend + image: service_finder-catalog_robot + container_name: service_finder_robot_catalog + command: python -m app.workers.catalog_robot + volumes: + - ./backend:/app + env_file: + - .env + depends_on: + migrate: + condition: service_completed_successfully + networks: + - default + - shared_db_net + restart: always + + # Szerviz vadász robot (Robot 2.7) + service_hunter: + build: ./backend + container_name: service_finder_robot_hunter + command: python -m app.workers.service_hunter + volumes: + - ./backend:/app + - ./backend/app/workers/local_services.csv:/app/app/workers/local_services.csv + environment: + - GOOGLE_API_KEY=${GOOGLE_API_KEY} + # JAVÍTVA: shared-postgres lett a gépnév a 'db' helyett! + - DATABASE_URL=postgresql+asyncpg://${POSTGRES_USER}:${POSTGRES_PASSWORD}@shared-postgres:5432/${POSTGRES_DB} + env_file: + - .env + dns: + - 8.8.8.8 + - 1.1.1.1 + depends_on: + migrate: + condition: service_completed_successfully + networks: + - default + - shared_db_net + restart: always + + # --- ÚJ: n8n AUTOMATIZÁCIÓ --- + n8n: + image: n8nio/n8n:latest + container_name: service_finder_n8n + restart: unless-stopped + ports: + - "5678:5678" + env_file: .env + environment: + - N8N_HOST=0.0.0.0 + - N8N_PORT=5678 + - N8N_PROTOCOL=http + - N8N_SECURE_COOKIE=false # <--- EZ JAVÍTJA A BELÉPÉSI HIBÁT! + - DB_TYPE=postgresdb + - DB_POSTGRESDB_DATABASE=n8n_internal + - DB_POSTGRESDB_HOST=n8n_db + - DB_POSTGRESDB_PORT=5432 + - DB_POSTGRESDB_USER=n8n_admin + - DB_POSTGRESDB_PASSWORD=${N8N_DB_PASSWORD} + volumes: + - ./n8n/data:/home/node/.n8n + networks: + - default + - shared_db_net + depends_on: + - n8n_db + + # n8n belső meta-adatbázisa + n8n_db: + image: postgres:15-alpine + container_name: service_finder_n8n_db + restart: unless-stopped + environment: + - POSTGRES_USER=n8n_admin + - POSTGRES_PASSWORD=${N8N_DB_PASSWORD} + - POSTGRES_DB=n8n_internal + volumes: + - ./n8n/db_data:/var/lib/postgresql/data + networks: + - default + + # Browserless - A robot "szeme" (Központi 3005-ös porton) + browserless: + image: browserless/chrome:latest + container_name: service_finder_browserless + restart: unless-stopped + ports: + - "3005:3000" + environment: + - MAX_CONCURRENT_SESSIONS=10 + networks: + - default + +networks: + default: + driver: bridge + shared_db_net: + external: true \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/fleet.py.old b/archive/2026.02.18 Archive_old_mapps/fleet.py.old new file mode 100755 index 0000000..d9ef62e --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/fleet.py.old @@ -0,0 +1,46 @@ +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, text +from app.api.deps import get_db, get_current_user +from app.models.vehicle import Vehicle +from app.models.company import CompanyMember + +router = APIRouter() + +@router.get("/vehicles") +async def get_my_vehicles(db: AsyncSession = Depends(get_db), current_user = Depends(get_current_user)): + # Megkeressük a cégeket (széfeket), amikhez a felhasználónak köze van + company_query = select(CompanyMember.company_id).where(CompanyMember.user_id == current_user.id) + company_res = await db.execute(company_query) + company_ids = company_res.scalars().all() + + if not company_ids: + return [] + + # Lekérjük az összes járművet, ami ezekhez a cégekhez tartozik + query = select(Vehicle).where(Vehicle.current_company_id.in_(company_ids)) + result = await db.execute(query) + return result.scalars().all() + +@router.post("/vehicles") +async def add_vehicle(vehicle_in: dict, db: AsyncSession = Depends(get_db), current_user = Depends(get_current_user)): + # Itt a meglévő logika fut tovább, de a Vehicle-t a user alapértelmezett cégéhez kötjük + # Először lekérjük a user "owner" típusú cégét + org_query = text("SELECT company_id FROM data.company_members WHERE user_id = :uid AND role = 'owner' LIMIT 1") + org_res = await db.execute(org_query, {"uid": current_user.id}) + company_id = org_res.scalar() + + if not company_id: + raise HTTPException(status_code=404, detail="Nem található saját széf a jármű rögzítéséhez.") + + # Új jármű létrehozása az új modell alapján + new_vehicle = Vehicle( + current_company_id=company_id, + brand_id=vehicle_in.get("brand_id"), + model_name=vehicle_in.get("model_name"), + identification_number=vehicle_in.get("vin"), + license_plate=vehicle_in.get("license_plate") + ) + db.add(new_vehicle) + await db.commit() + return {"status": "success", "vehicle_id": str(new_vehicle.id)} \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/harvester_base.py.old b/archive/2026.02.18 Archive_old_mapps/harvester_base.py.old new file mode 100755 index 0000000..8f1d513 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/harvester_base.py.old @@ -0,0 +1,48 @@ +# /opt/docker/dev/service_finder/backend/app/services/harvester_base.py +import httpx +import logging +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select +from app.models.asset import AssetCatalog + +logger = logging.getLogger(__name__) + +class BaseHarvester: + """ MDM Adatgyűjtő Alaposztály. """ + def __init__(self, category: str): + self.category = category # 'car', 'motorcycle', 'truck' + self.headers = {"User-Agent": "ServiceFinder-Harvester-Bot/2.1"} + + async def check_exists(self, db: AsyncSession, brand: str, model: str, gen: str = None): + """ Ellenőrzi a katalógusban való létezést az új AssetCatalog modellben. """ + stmt = select(AssetCatalog).where( + AssetCatalog.make == brand, + AssetCatalog.model == model, + AssetCatalog.vehicle_class == self.category + ) + if gen: + stmt = stmt.where(AssetCatalog.generation == gen) + + result = await db.execute(stmt) + return result.scalar_one_or_none() + + async def log_entry(self, db: AsyncSession, brand: str, model: str, specs: dict): + """ Létrehoz vagy frissít egy bejegyzést. Támogatja a factory_data dúsítást. """ + existing = await self.check_exists(db, brand, model, specs.get("generation")) + if not existing: + new_v = AssetCatalog( + make=brand, + model=model, + generation=specs.get("generation"), + year_from=specs.get("year_from"), + year_to=specs.get("year_to"), + vehicle_class=self.category, + fuel_type=specs.get("fuel_type"), + power_kw=specs.get("power_kw"), + engine_capacity=specs.get("engine_capacity"), + factory_data=specs.get("factory_data", {}) # MDM JSONB tárolás + ) + db.add(new_v) + logger.info(f"🆕 Új katalógus elem rögzítve: {brand} {model}") + return True + return False \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/harvester_bikes.py.old b/archive/2026.02.18 Archive_old_mapps/harvester_bikes.py.old new file mode 100755 index 0000000..8aef52a --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/harvester_bikes.py.old @@ -0,0 +1,12 @@ +from .harvester_base import BaseHarvester + +class BikeHarvester(BaseHarvester): + def __init__(self): + super().__init__(category="motorcycle") + self.api_url = "https://api.example-bikes.com/v1/" # Példa forrás + + async def harvest_all(self, db): + # Ide jön a motor-specifikus API hívás logikája + print("🏍️ Motor Robot: Adatgyűjtés indul...") + # ... fetch és mentés loop ... + await db.commit() \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/harvester_cars.py.old b/archive/2026.02.18 Archive_old_mapps/harvester_cars.py.old new file mode 100755 index 0000000..d0a915b --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/harvester_cars.py.old @@ -0,0 +1,48 @@ +# /opt/docker/dev/service_finder/backend/app/services/harvester_cars.py +import httpx +import asyncio +from sqlalchemy.ext.asyncio import AsyncSession +from .harvester_base import BaseHarvester + +class VehicleHarvester(BaseHarvester): + def __init__(self): + super().__init__(category="car") + self.base_url = "https://www.carqueryapi.com/api/0.3/" + + async def _get_api_data(self, params: dict): + async with httpx.AsyncClient() as client: + try: + response = await client.get(self.base_url, params=params, headers=self.headers, timeout=15.0) + if response.status_code == 200: + text = response.text + if text.startswith("?("): text = text[2:-2] + return response.json() + return None + except Exception as e: + print(f"CarQuery Robot Hiba: {e}") + return None + + async def harvest_all(self, db: AsyncSession): + """ Automatikus CarQuery szinkronizáció MDM alapon. """ + print("🚗 Személyautó Robot: Indul az adatgyűjtés...") + + makes_data = await self._get_api_data({"cmd": "getMakes", "sold_in_us": 0}) + if not makes_data: return + + for make in makes_data.get("Makes", [])[:50]: # Teszt limit + make_id = make['make_id'] + make_name = make['make_display'] + + models_data = await self._get_api_data({"cmd": "getModels", "make": make_id}) + if not models_data: continue + + for model in models_data.get("Models", []): + specs = { + "factory_data": {"api_source": "carquery", "api_make_id": make_id} + } + await self.log_entry(db, make_name, model['model_name'], specs) + + await db.commit() + await asyncio.sleep(1) # Rate limiting + + print("🏁 Személyautó Robot: Adatok szinkronizálva.") \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/harvester_trucks.py b/archive/2026.02.18 Archive_old_mapps/harvester_trucks.py new file mode 100755 index 0000000..9330342 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/harvester_trucks.py @@ -0,0 +1,8 @@ +from .harvester_base import BaseHarvester + +class TruckHarvester(BaseHarvester): + def __init__(self): + super().__init__(category="truck") + + async def run(self, db): + print("🚛 Truck Robot: Nehézgépek és teherautók keresése...") \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/init_db_direct.py.old b/archive/2026.02.18 Archive_old_mapps/init_db_direct.py.old new file mode 100755 index 0000000..0edaddb --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/init_db_direct.py.old @@ -0,0 +1,45 @@ +# /opt/docker/dev/service_finder/backend/app/init_db_direct.py +import asyncio +import logging +from sqlalchemy import text +from app.database import engine, Base + +# 1. LOGIKA: Minden modell importálása +# Ez KRITIKUS: A SQLAlchemy Metadata csak akkor látja a táblákat, ha a Python +# értelmező már "találkozott" az osztályokkal. +from app.models.identity import User, Person, SocialAccount +from app.models.organization import Organization +from app.models.asset import Asset, AssetCatalog, AssetTelemetry +from app.models.service import ServiceProfile, ExpertiseTag, ServiceExpertise +from app.models.system import SystemParameter +from app.models.history import AuditLog +from app.models.security import PendingAction +from app.models.translation import Translation +from app.models.staged_data import ServiceStaging, DiscoveryParameter +from app.models.social import ServiceProvider, Vote, Competition, UserScore + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger("DB-Initializer") + +async def init_db(): + logger.info("🚀 Adatbázis inicializálása indítva (MB2.0 Standard)...") + + async with engine.begin() as conn: + # 2. LOGIKA: Sémák létrehozása + # SQLAlchemy nem hozza létre a sémákat automatikusan, ezt nekünk kell megtenni. + logger.info("📂 Sémák létrehozása (identity, data)...") + await conn.execute(text("CREATE SCHEMA IF NOT EXISTS identity;")) + await conn.execute(text("CREATE SCHEMA IF NOT EXISTS data;")) + + # 3. LOGIKA: Táblák létrehozása + logger.info("🏗️ Táblák és kapcsolatok generálása a Metadata alapján...") + # Ez a run_sync hívás futtatja le a klasszikus szinkron create_all-t az aszinkron kapcsolaton + await conn.run_sync(Base.metadata.create_all) + + logger.info("✅ Minden tábla sikeresen létrejött a megfelelő sémákban!") + +if __name__ == "__main__": + try: + asyncio.run(init_db()) + except Exception as e: + logger.error(f"❌ Hiba az inicializálás során: {e}") \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/old_main.py b/archive/2026.02.18 Archive_old_mapps/old_main.py new file mode 100755 index 0000000..753b877 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/old_main.py @@ -0,0 +1,47 @@ +from fastapi import FastAPI, Request, HTTPException +from fastapi.security.utils import get_authorization_scheme_param +from app.core.config import settings +from app.core.security import decode_token + +from app.api.auth import router as auth_router +from app.api.recommend import router as recommend_router + +app = FastAPI(title="Service Finder API") + +@app.middleware("http") +async def jwt_claims_middleware(request: Request, call_next): + """ + Ha van Authorization: Bearer , akkor claims bekerül request.state.claims-be. + Auth endpointoknál nem kötelező. + """ + auth = request.headers.get("Authorization") + if auth: + scheme, token = get_authorization_scheme_param(auth) + if scheme.lower() == "bearer" and token: + try: + claims = decode_token(token, settings.JWT_SECRET) + if claims.get("type") != "access": + raise HTTPException(status_code=401, detail="Invalid access token type") + request.state.claims = claims + except Exception: + # nem dobunk mindig 401-et, csak a védett endpointoknál; itt “néma” marad + request.state.claims = None + else: + request.state.claims = None + + return await call_next(request) + +@app.get("/health") +def health(): + return {"status": "ok"} + +@app.get("/health/db") +def health_db(): + from app.db.session import get_conn + with get_conn() as conn: + with conn.cursor() as cur: + cur.execute("SELECT 1;") + return {"db": "ok", "result": cur.fetchone()[0]} + +app.include_router(auth_router) +app.include_router(recommend_router) diff --git a/archive/2026.02.18 Archive_old_mapps/router.py.old b/archive/2026.02.18 Archive_old_mapps/router.py.old new file mode 100755 index 0000000..4a34c0b --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/router.py.old @@ -0,0 +1,12 @@ +from fastapi import APIRouter +import os +import subprocess +from app.api.v1 import social, users, fleet, auth + +api_router = APIRouter() + + +api_router.include_router(auth.router, prefix="/auth", tags=["Authentication"]) +api_router.include_router(social.router, prefix="/social", tags=["Social & Providers"]) +api_router.include_router(users.router, prefix="/users", tags=["Users"]) +api_router.include_router(fleet.router, prefix="/fleet", tags=["Fleet & Logistics"]) \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/security_old.py b/archive/2026.02.18 Archive_old_mapps/security_old.py new file mode 100755 index 0000000..dfdd160 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/security_old.py @@ -0,0 +1,24 @@ +# /opt/docker/dev/service_finder/backend/app/core/security.py +from datetime import datetime, timedelta, timezone +from typing import Optional, Dict, Any +import bcrypt +from jose import jwt +from app.core.config import settings + +def verify_password(plain_password: str, hashed_password: str) -> bool: + if not hashed_password: + return False + return bcrypt.checkpw(plain_password.encode("utf-8"), hashed_password.encode("utf-8")) + +def get_password_hash(password: str) -> str: + salt = bcrypt.gensalt() + return bcrypt.hashpw(password.encode("utf-8"), salt).decode("utf-8") + +def create_access_token(data: Dict[str, Any], expires_delta: Optional[timedelta] = None) -> str: + to_encode = data.copy() + if expires_delta: + expire = datetime.now(timezone.utc) + expires_delta + else: + expire = datetime.now(timezone.utc) + timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES) + to_encode.update({"exp": expire}) + return jwt.encode(to_encode, settings.SECRET_KEY, algorithm=settings.ALGORITHM) \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/service_hunter_old.py.old b/archive/2026.02.18 Archive_old_mapps/service_hunter_old.py.old new file mode 100755 index 0000000..b961cde --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/service_hunter_old.py.old @@ -0,0 +1,282 @@ +import asyncio +import httpx +import logging +import uuid +import os +import sys +import csv +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, text +from sqlalchemy.orm import selectinload +from app.db.session import SessionLocal + +# Modellek importálása +from app.models.service import ServiceProfile, ExpertiseTag +from app.models.organization import Organization, OrganizationFinancials, OrgType, OrgUserRole, OrganizationMember +from app.models.identity import Person +from app.models.address import Address, GeoPostalCode +from geoalchemy2.elements import WKTElement +from datetime import datetime, timezone + +# Naplózás beállítása +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger("Robot2-Dunakeszi-Detective") + +class ServiceHunter: + """ + Robot 2.7.2: Dunakeszi Detective - Deep Model Integration. + Logika: + 1. Helyi CSV (Saját beküldés - Cím alapú Geocoding-al - 50 pont Trust) + 2. OSM (Közösségi adat - 10 pont Trust) + 3. Google (Adatpótlás/Fallback - 30 pont Trust) + """ + OVERPASS_URL = "http://overpass-api.de/api/interpreter" + PLACES_NEW_URL = "https://places.googleapis.com/v1/places:searchNearby" + GEOCODE_URL = "https://maps.googleapis.com/maps/api/geocode/json" + GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY") + LOCAL_CSV_PATH = "/app/app/workers/local_services.csv" + + @classmethod + async def geocode_address(cls, address_text): + """Cím szövegből GPS koordinátát és címkomponenseket csinál.""" + if not cls.GOOGLE_API_KEY: + logger.warning("⚠️ Google API kulcs hiányzik!") + return None + + params = {"address": address_text, "key": cls.GOOGLE_API_KEY} + try: + async with httpx.AsyncClient() as client: + resp = await client.get(cls.GEOCODE_URL, params=params, timeout=10) + if resp.status_code == 200: + data = resp.json() + if data.get("results"): + result = data["results"][0] + loc = result["geometry"]["location"] + + # Címkomponensek kinyerése a kötelező mezőkhöz + components = result.get("address_components", []) + parsed = {"lat": loc["lat"], "lng": loc["lng"], "zip": "", "city": "", "street": "Ismeretlen", "type": "utca", "number": "1"} + + for c in components: + types = c.get("types", []) + if "postal_code" in types: parsed["zip"] = c["long_name"] + if "locality" in types: parsed["city"] = c["long_name"] + if "route" in types: parsed["street"] = c["long_name"] + if "street_number" in types: parsed["number"] = c["long_name"] + + logger.info(f"📍 Geocoding sikeres: {address_text}") + return parsed + else: + logger.error(f"❌ Geocoding hiba: {resp.status_code}") + except Exception as e: + logger.error(f"❌ Geocoding hiba: {e}") + return None + + @classmethod + async def get_google_place_details_new(cls, lat, lon): + """Google Places API (New) - Adatpótlás FieldMask használatával.""" + if not cls.GOOGLE_API_KEY: + return None + + headers = { + "Content-Type": "application/json", + "X-Goog-Api-Key": cls.GOOGLE_API_KEY, + "X-Goog-FieldMask": "places.displayName,places.id,places.types,places.internationalPhoneNumber,places.websiteUri" + } + + payload = { + "includedTypes": ["car_repair", "gas_station", "ev_charging_station", "car_wash", "motorcycle_repair"], + "maxResultCount": 1, + "locationRestriction": { + "circle": { + "center": {"latitude": lat, "longitude": lon}, + "radius": 40.0 + } + } + } + + try: + async with httpx.AsyncClient() as client: + resp = await client.post(cls.PLACES_NEW_URL, json=payload, headers=headers, timeout=10) + if resp.status_code == 200: + places = resp.json().get("places", []) + if places: + p = places[0] + return { + "name": p.get("displayName", {}).get("text"), + "google_id": p.get("id"), + "types": p.get("types", []), + "phone": p.get("internationalPhoneNumber"), + "website": p.get("websiteUri") + } + except Exception as e: + logger.error(f"❌ Google kiegészítő hívás hiba: {e}") + return None + + @classmethod + async def import_local_csv(cls, db: AsyncSession): + """Manuális adatok betöltése CSV-ből.""" + if not os.path.exists(cls.LOCAL_CSV_PATH): + return + + try: + with open(cls.LOCAL_CSV_PATH, mode='r', encoding='utf-8') as f: + reader = csv.DictReader(f) + for row in reader: + geo_data = None + if row.get('cim'): + geo_data = await cls.geocode_address(row['cim']) + + if geo_data: + element = { + "tags": { + "name": row['nev'], "phone": row.get('telefon'), + "website": row.get('web'), "amenity": row.get('tipus', 'car_repair'), + "addr:full": row.get('cim'), + "addr:city": geo_data["city"], "addr:zip": geo_data["zip"], + "addr:street": geo_data["street"], "addr:type": geo_data["type"], + "addr:number": geo_data["number"] + }, + "lat": geo_data["lat"], "lon": geo_data["lng"] + } + await cls.save_service_deep(db, element, source="local_manual") + logger.info("✅ Helyi CSV adatok feldolgozva.") + except Exception as e: + logger.error(f"❌ CSV feldolgozási hiba: {e}") + + @classmethod + async def get_or_create_person(cls, db: AsyncSession, name: str) -> Person: + """Ghost Person kezelése.""" + names = name.split(' ', 1) + last_name = names[0] + first_name = names[1] if len(names) > 1 else "Ismeretlen" + stmt = select(Person).where(Person.last_name == last_name, Person.first_name == first_name) + result = await db.execute(stmt); person = result.scalar_one_or_none() + if not person: + person = Person(last_name=last_name, first_name=first_name, is_ghost=True, is_active=False) + db.add(person); await db.flush() + return person + + @classmethod + async def enrich_financials(cls, db: AsyncSession, org_id: int): + """Pénzügyi rekord inicializálása.""" + financial = OrganizationFinancials( + organization_id=org_id, year=datetime.now(timezone.utc).year - 1, source="bot_discovery" + ) + db.add(financial) + + @classmethod + async def save_service_deep(cls, db: AsyncSession, element: dict, source="osm"): + """Mély mentés a modelled specifikus mezőneveivel és kötelező értékeivel.""" + tags = element.get("tags", {}) + lat, lon = element.get("lat"), element.get("lon") + if not lat or not lon: return + + osm_name = tags.get("name") or tags.get("brand") or tags.get("operator") + google_data = None + if not osm_name or osm_name.lower() in ['aprilia', 'bosch', 'shell', 'mol', 'omv', 'ismeretlen']: + google_data = await cls.get_google_place_details_new(lat, lon) + + final_name = (google_data["name"] if google_data else osm_name) or "Ismeretlen Szolgáltató" + + stmt = select(Organization).where(Organization.full_name == final_name) + result = await db.execute(stmt); org = result.scalar_one_or_none() + + if not org: + # 1. Address létrehozása (a kötelező mezőket kitöltjük az átadott tags-ből vagy alapértékkel) + new_addr = Address( + latitude=lat, + longitude=lon, + full_address_text=tags.get("addr:full") or f"2120 Dunakeszi, {tags.get('addr:street', 'Ismeretlen')} {tags.get('addr:housenumber', '1')}", + street_name=tags.get("addr:street") or "Ismeretlen", + street_type=tags.get("addr:type") or "utca", + house_number=tags.get("addr:number") or tags.get("addr:housenumber") or "1" + ) + db.add(new_addr); await db.flush() + + # 2. Organization létrehozása (a modelled alapján ezek a mezők itt vannak) + org = Organization( + full_name=final_name, + name=final_name[:50], + org_type=OrgType.service, + address_id=new_addr.id, + address_city=tags.get("addr:city") or "Dunakeszi", + address_zip=tags.get("addr:zip") or "2120", + address_street_name=new_addr.street_name, + address_street_type=new_addr.street_type, + address_house_number=new_addr.house_number + ) + db.add(org); await db.flush() + + # 3. Service Profile + trust = 50 if source == "local_manual" else (30 if google_data else 10) + spec = {"brands": [], "types": google_data["types"] if google_data else [], "osm_tags": tags} + if tags.get("brand"): spec["brands"].append(tags.get("brand")) + + profile = ServiceProfile( + organization_id=org.id, + location=WKTElement(f'POINT({lon} {lat})', srid=4326), + status="ghost", + trust_score=trust, + google_place_id=google_data["google_id"] if google_data else None, + specialization_tags=spec, + website=google_data["website"] if google_data else tags.get("website"), + contact_phone=google_data["phone"] if google_data else tags.get("phone") + ) + db.add(profile) + + # 4. Tulajdonos rögzítése + owner_name = tags.get("operator") or tags.get("contact:person") + if owner_name and len(owner_name) > 3: + person = await cls.get_or_create_person(db, owner_name) + db.add(OrganizationMember( + organization_id=org.id, + person_id=person.id, + role=OrgUserRole.OWNER, + is_verified=False + )) + + await cls.enrich_financials(db, org.id) + await db.flush() + logger.info(f"✨ [{source.upper()}] Mentve: {final_name} (Bizalom: {trust})") + + @classmethod + async def run(cls): + logger.info("🤖 Robot 2.7.2: Dunakeszi Detective indítása...") + + # Kapcsolódási védelem + connected = False + while not connected: + try: + async with SessionLocal() as db: + await db.execute(text("SELECT 1")) + connected = True + except Exception as e: + logger.warning(f"⏳ Várakozás a hálózatra (shared-postgres host?): {e}") + await asyncio.sleep(5) + + while True: + async with SessionLocal() as db: + try: + await db.execute(text("SET search_path TO data, public")) + # 1. Beküldött CSV feldolgozása (Geocoding-al) + await cls.import_local_csv(db) + await db.commit() + + # 2. OSM Szkennelés + query = """[out:json][timeout:120];area["name"="Dunakeszi"]->.city;(nwr["shop"~"car_repair|motorcycle_repair|tyres|car_parts|motorcycle"](area.city);nwr["amenity"~"car_repair|vehicle_inspection|motorcycle_repair|fuel|charging_station|car_wash"](area.city);nwr["amenity"~"car_repair|fuel|charging_station"](around:5000, 47.63, 19.13););out center;""" + async with httpx.AsyncClient() as client: + resp = await client.post(cls.OVERPASS_URL, data={"data": query}, timeout=120) + if resp.status_code == 200: + elements = resp.json().get("elements", []) + for el in elements: + await cls.save_service_deep(db, el, source="osm") + await db.commit() + except Exception as e: + logger.error(f"❌ Futáshiba: {e}") + + logger.info("😴 Scan kész, 24 óra pihenő...") + await asyncio.sleep(86400) + +if __name__ == "__main__": + asyncio.run(ServiceHunter.run()) \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/technical_enricher.py.old b/archive/2026.02.18 Archive_old_mapps/technical_enricher.py.old new file mode 100755 index 0000000..2687111 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/technical_enricher.py.old @@ -0,0 +1,115 @@ +import asyncio +import httpx +import logging +import os +import datetime +from sqlalchemy import select, and_ +from sqlalchemy.exc import IntegrityError +from app.db.session import SessionLocal +from app.models.vehicle_definitions import VehicleModelDefinition +from app.services.ai_service import AIService + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger("Robot-Bulk-Master") + +class TechEnricher: + API_URL = "https://opendata.rdw.nl/resource/kyri-nuah.json" + RDW_TOKEN = os.getenv("RDW_APP_TOKEN") + HEADERS = {"X-App-Token": RDW_TOKEN} if RDW_TOKEN else {} + + @classmethod + async def fetch_rdw_tech_data(cls, make, model): + params = {"merk": make.upper(), "handelsbenaming": str(model).strip().upper(), "$limit": 1} + async with httpx.AsyncClient(headers=cls.HEADERS) as client: + try: + resp = await client.get(cls.API_URL, params=params, timeout=15) + return resp.json()[0] if resp.status_code == 200 and resp.json() else None + except: return None + + @classmethod + async def run(cls): + logger.info("🚀 Master-Merge Robot FOLYAMATOS ÜZEMMÓD INDUL...") + + while True: # Folyamatos ciklus, amíg el nem fogy az adat + async with SessionLocal() as main_db: + stmt = select(VehicleModelDefinition.id).where( + VehicleModelDefinition.status == "unverified" + ).limit(50) # Egyszerre 50 ID-t foglalunk le + res = await main_db.execute(stmt) + ids = res.scalars().all() + + if not ids: + logger.info("🏁 Minden rekord feldolgozva. A robot megáll.") + break + + logger.info(f"📦 Új csomag indítása: {len(ids)} rekord.") + + for m_id in ids: + async with SessionLocal() as db: + try: + current = await db.get(VehicleModelDefinition, m_id) + if not current: continue + + logger.info(f"🧪 Feldolgozás: {current.make} {current.marketing_name} (ID: {m_id})") + + rdw_data = await cls.fetch_rdw_tech_data(current.make, current.marketing_name) + if rdw_data: + current.engine_capacity = int(float(rdw_data.get("cilinderinhoud", 0))) or current.engine_capacity + current.power_kw = int(float(rdw_data.get("netto_maximum_vermogen_kw", 0))) or current.power_kw + + ai_data = await AIService.get_clean_vehicle_data(current.make, current.marketing_name, current.vehicle_type) + + if ai_data: + tech_code = ai_data.get("technical_code") or "N/A" + new_ccm = ai_data.get("ccm") or current.engine_capacity + + master_record = None + if tech_code and tech_code != "N/A": + stmt_master = select(VehicleModelDefinition).where(and_( + VehicleModelDefinition.make == current.make, + VehicleModelDefinition.technical_code == tech_code, + VehicleModelDefinition.engine_capacity == new_ccm, + VehicleModelDefinition.status == 'ai_enriched', + VehicleModelDefinition.id != m_id + )) + master_record = (await db.execute(stmt_master)).scalar_one_or_none() + + if master_record: + logger.info(f"🔗 Merge: ID:{m_id} -> Master ID:{master_record.id}") + syns = set(master_record.synonyms or []) + syns.update(ai_data.get("synonyms", [])) + syns.add(current.marketing_name) + master_record.synonyms = list(syns) + current.status = "duplicate" + current.parent_id = master_record.id + else: + current.technical_code = tech_code if tech_code != "N/A" else f"N/A-{m_id}" + current.marketing_name = ai_data.get("marketing_name", current.marketing_name) + current.engine_capacity = new_ccm + current.power_kw = ai_data.get("kw") or current.power_kw + current.year_from = ai_data.get("year_from") + current.year_to = ai_data.get("year_to") + current.synonyms = ai_data.get("synonyms", []) + + if ai_data.get("maintenance"): + old_spec = current.specifications or {} + old_spec.update(ai_data.get("maintenance")) + current.specifications = old_spec + + current.status = "ai_enriched" + else: + if not current.technical_code: + current.technical_code = f"UNKNOWN-{m_id}" + + current.updated_at = datetime.datetime.now() + await db.commit() + logger.info(f"✅ Mentve (ID: {m_id})") + + except Exception as e: + await db.rollback() + logger.error(f"❌ Hiba ID:{m_id}: {e}") + finally: + await db.close() + +if __name__ == "__main__": + asyncio.run(TechEnricher.run()) \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/user.py.old b/archive/2026.02.18 Archive_old_mapps/user.py.old new file mode 100755 index 0000000..eebc867 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/user.py.old @@ -0,0 +1,7 @@ +# DEPRECATED: Minden funkció átkerült az app.models.identity modulba. +# Ez a fájl csak a kompatibilitás miatt maradt meg, de táblát nem definiál. +from .identity import User, UserRole + + # Kapcsolatok + # memberships = relationship("OrganizationMember", back_populates="user", cascade="all, delete-orphan") + # vehicles = relationship("VehicleOwnership", back_populates="user", cascade="all, delete-orphan") diff --git a/archive/2026.02.18 Archive_old_mapps/vehicle_definitions1.0.0.py.old b/archive/2026.02.18 Archive_old_mapps/vehicle_definitions1.0.0.py.old new file mode 100755 index 0000000..b7a9787 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/vehicle_definitions1.0.0.py.old @@ -0,0 +1,109 @@ +from sqlalchemy import Column, Integer, String, JSON, UniqueConstraint, text, Boolean, DateTime, ForeignKey, Numeric, Index, Text +from sqlalchemy.orm import relationship +from sqlalchemy.sql import func +from sqlalchemy.dialects.postgresql import JSONB # PostgreSQL specifikus JSONB a hatékony kereséshez +from app.db.base_class import Base + +class VehicleType(Base): + """Jármű főtípusok sémája (Séma-gazda)""" + __tablename__ = "vehicle_types" + __table_args__ = {"schema": "data"} + + id = Column(Integer, primary_key=True) + code = Column(String(30), unique=True, index=True) # car, motorcycle, truck, bus, boat, etc. + name = Column(String(50)) # Megjelenítendő név + icon = Column(String(50)) + units = Column(JSON, server_default=text("'{\"power\": \"kW\", \"weight\": \"kg\", \"cargo\": \"m3\"}'::jsonb")) + + features = relationship("FeatureDefinition", back_populates="vehicle_type") + definitions = relationship("VehicleModelDefinition", back_populates="v_type_rel") + +class FeatureDefinition(Base): + """Globális felszereltség szótár""" + __tablename__ = "feature_definitions" + __table_args__ = {"schema": "data"} + + id = Column(Integer, primary_key=True) + vehicle_type_id = Column(Integer, ForeignKey("data.vehicle_types.id")) + category = Column(String(50)) # Műszaki, Beltér, Kültér, Multimédia + name = Column(String(100), nullable=False) + data_type = Column(String(20), default="boolean") + + vehicle_type = relationship("VehicleType", back_populates="features") + +class ModelFeatureMap(Base): + """Modell-szintű felszereltségi sablon (Alap vs Extra)""" + __tablename__ = "model_feature_maps" + __table_args__ = {"schema": "data"} + + model_id = Column(Integer, ForeignKey("data.vehicle_model_definitions.id"), primary_key=True) + feature_id = Column(Integer, ForeignKey("data.feature_definitions.id"), primary_key=True) + availability = Column(String(20), default="standard") # standard, optional, accessory + value = Column(String(100)) + +class VehicleModelDefinition(Base): + """MDM Master rekordok - v1.3.0 Pipeline Edition (Researcher & Alchemist)""" + __tablename__ = "vehicle_model_definitions" + __table_args__ = ( + UniqueConstraint('make', 'technical_code', 'vehicle_type', name='uix_make_tech_type'), + Index('idx_vmd_lookup', 'make', 'technical_code'), + {"schema": "data"} + ) + + id = Column(Integer, primary_key=True) + make = Column(String(50), nullable=False, index=True) + technical_code = Column(String(50), nullable=False, index=True) + marketing_name = Column(String(100), index=True) + family_name = Column(String(100)) + + vehicle_type = Column(String(30), index=True) + vehicle_type_id = Column(Integer, ForeignKey("data.vehicle_types.id")) + vehicle_class = Column(String(50)) + + parent_id = Column(Integer, ForeignKey("data.vehicle_model_definitions.id"), nullable=True) + year_from = Column(Integer, nullable=True, index=True) + year_to = Column(Integer, nullable=True, index=True) + synonyms = Column(JSON, server_default=text("'[]'::jsonb")) + + # --- ROBOT VÉDELMI ÉS PIPELINE MEZŐK (v1.3.0) --- + is_manual = Column(Boolean, default=False, server_default=text("false"), index=True) + attempts = Column(Integer, default=0, server_default=text("0"), index=True) + last_error = Column(Text, nullable=True) + + # Robot 2.1 "Researcher" porszívózott nyers adatai (A szemetesláda) + raw_search_context = Column(Text, nullable=True) + + # Telemetria és forrás adatok (melyik API/URL hozta az adatot) + research_metadata = Column(JSONB, server_default=text("'{}'::jsonb"), nullable=False) + # -------------------------------------------------- + + # --- TECHNIKAI FIX OSZLOPOK --- + engine_capacity = Column(Integer, index=True) + power_kw = Column(Integer, index=True) + max_weight_kg = Column(Integer, index=True) + + axle_count = Column(Integer) + payload_capacity_kg = Column(Integer) + cargo_volume_m3 = Column(Numeric(10, 2)) + cargo_length_mm = Column(Integer) + cargo_width_mm = Column(Integer) + cargo_height_mm = Column(Integer) + + specifications = Column(JSON, server_default=text("'{}'::jsonb")) + features_json = Column(JSON, server_default=text("'{}'::jsonb")) + + # Státusz mező hossza növelve a pipeline flagekhez + status = Column(String(30), server_default="unverified", index=True) + is_master = Column(Boolean, default=False) + source = Column(String(50)) # 'ROBOT-v1.3.0-Pipeline' + + created_at = Column(DateTime(timezone=True), server_default=func.now()) + updated_at = Column(DateTime(timezone=True), onupdate=func.now()) + + # Kapcsolatok + v_type_rel = relationship("VehicleType", back_populates="definitions") + master_record = relationship("VehicleModelDefinition", remote_side=[id], backref="merged_variants") + + # AssetCatalog kapcsolat + # Megjegyzés: Ellenőrizd, hogy az AssetCatalog modell be van-e importálva a Base-be! + variants = relationship("AssetCatalog", back_populates="master_definition", primaryjoin="VehicleModelDefinition.id == AssetCatalog.master_definition_id") \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/vehicle_ownership.py.old b/archive/2026.02.18 Archive_old_mapps/vehicle_ownership.py.old new file mode 100755 index 0000000..b2c53b7 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/vehicle_ownership.py.old @@ -0,0 +1,19 @@ +from sqlalchemy import Column, Integer, ForeignKey, DateTime, Boolean +from sqlalchemy.sql import func +from app.db.base import Base + +class VehicleOwnership(Base): + __tablename__ = "vehicle_ownerships" + __table_args__ = {"schema": "data"} + + id = Column(Integer, primary_key=True, index=True) + vehicle_id = Column(Integer, ForeignKey("data.vehicles.id")) + org_id = Column(Integer, ForeignKey("data.organizations.id")) + + # Érvényességi időablak + start_date = Column(DateTime(timezone=True), server_default=func.now()) + end_date = Column(DateTime(timezone=True), nullable=True) # Ha eladja, ide kerül a dátum + + is_active = Column(Boolean, default=True) + + # Csak ezen az ablakon belüli szervizeket láthatja az aktuális tulajdonos diff --git a/archive/2026.02.18 Archive_old_mapps/vehicle_robot_3_alchemist.py.old b/archive/2026.02.18 Archive_old_mapps/vehicle_robot_3_alchemist.py.old new file mode 100755 index 0000000..c09962f --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/vehicle_robot_3_alchemist.py.old @@ -0,0 +1,106 @@ +# /app/app/workers/vehicle/vehicle_robot_3_alchemist.py +import asyncio +import logging +from sqlalchemy import select, update, func, and_, case +from app.db.session import AsyncSessionLocal +from app.models.vehicle_definitions import VehicleModelDefinition +from app.services.ai_service import AIService + +# MB 2.0 Naplózás +logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] %(name)s: %(message)s') +logger = logging.getLogger("Vehicle-Robot-3-Alchemist") + +class VehicleAlchemist: + """ + Vehicle Robot 3: AI Synthesizer (Alchemist) + Feladata: A kutatási kontextusból strukturált "Gold Data" kinyerése AI segítségével. + """ + def __init__(self): + self.batch_size = 5 + self.delay_between_records = 12 # P4000 GPU kímélő késleltetés + + async def synthesize_vehicle(self, vehicle_id: int): + """ AI dúsítás végrehajtása az Ollama/AI segítségével. """ + async with AsyncSessionLocal() as db: + # Szigorú sémakezelés és zárolás + res = await db.execute( + select(VehicleModelDefinition) + .where(VehicleModelDefinition.id == vehicle_id) + .with_for_update(skip_locked=True) + ) + v = res.scalar_one_or_none() + + if not v or not v.raw_search_context: + logger.warning(f"⚠️ Nincs feldolgozható kontextus ID:{vehicle_id}") + return + + make, model = v.make, v.marketing_name + logger.info(f"🧪 Transzmutáció indul: {make} {model}") + + # Státusz váltás a feldolgozás idejére + v.status = 'ai_synthesis_in_progress' + await db.commit() + + # AI hívás a háttérben (Ollama konténer felé) + # Itt történik a "mágia": a nyers szövegből JSON lesz + gold_data = await AIService.get_gold_data_from_research(make, model, v.raw_search_context) + + async with AsyncSessionLocal() as db: + if gold_data: + # Strukturált adatok rögzítése a 'data' sémába + await db.execute( + update(VehicleModelDefinition) + .where(VehicleModelDefinition.id == vehicle_id) + .values( + marketing_name=gold_data.get("marketing_name", model)[:50], + technical_code=gold_data.get("technical_code") or v.technical_code, + engine_capacity=gold_data.get("ccm"), + power_kw=gold_data.get("kw"), + specifications=gold_data, # JSONB mező a teljes technikai laphoz + status='gold_enriched', # MB 2.0: Ez a legmagasabb adatszint + updated_at=func.now() + ) + ) + logger.info(f"✨ ARANY ADAT GENERÁLVA: {make} {model}") + else: + # Ha az AI elbukott, visszatesszük várakozóba + await db.execute( + update(VehicleModelDefinition) + .where(VehicleModelDefinition.id == vehicle_id) + .values(status='awaiting_ai_synthesis', attempts=v.attempts + 1) + ) + logger.warning(f"⚠️ AI hiba, visszatéve a sorba: {make} {model}") + + await db.commit() + + async def run(self): + logger.info("🚀 Vehicle Alchemist ONLINE - Adatpárolás indul...") + while True: + async with AsyncSessionLocal() as db: + # MB 2.0 Prioritás: Legnépszerűbb márkák az élen + top_makes = ['SUZUKI', 'TOYOTA', 'SKODA', 'VOLKSWAGEN', 'OPEL'] + priorities = case( + (and_(VehicleModelDefinition.vehicle_type == 'car', + VehicleModelDefinition.make.in_(top_makes)), 1), + (VehicleModelDefinition.vehicle_type == 'car', 2), + (VehicleModelDefinition.vehicle_type == 'motorcycle', 3), + else_=4 + ) + + stmt = select(VehicleModelDefinition.id).where( + VehicleModelDefinition.status == 'awaiting_ai_synthesis' + ).order_by(priorities, VehicleModelDefinition.updated_at.asc()).limit(self.batch_size) + + res = await db.execute(stmt) + ids = [r[0] for r in res.fetchall()] + + if not ids: + await asyncio.sleep(20) + continue + + for vid in ids: + await self.synthesize_vehicle(vid) + await asyncio.sleep(self.delay_between_records) + +if __name__ == "__main__": + asyncio.run(VehicleAlchemist().run()) \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/vehicle_search.py.old b/archive/2026.02.18 Archive_old_mapps/vehicle_search.py.old new file mode 100755 index 0000000..49d91b3 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/vehicle_search.py.old @@ -0,0 +1,23 @@ +from fastapi import APIRouter, Depends, Query +from sqlalchemy.orm import Session +from app.db.session import get_db +from app.models.vehicle import VehicleBrand # Feltételezve, hogy létezik a modell +from typing import List + +router = APIRouter() + +@router.get("/search/brands") +def search_brands(q: str = Query(..., min_length=2), db: Session = Depends(get_db)): + # 1. KERESÉS A SAJÁT ADATBÁZISBAN + results = db.query(VehicleBrand).filter( + VehicleBrand.name.ilike(f"%{q}%"), + VehicleBrand.is_active == True + ).limit(10).all() + + # 2. HA NINCS TALÁLAT, INDÍTHATJUK A BOT-OT (Logikai váz) + if not results: + # Itt hívnánk meg a Discovery Bot-ot async módon + # discovery_bot.find_brand_remotely(q) + return {"status": "not_found", "message": "Nincs találat, a Bot elindult keresni...", "data": []} + + return {"status": "success", "data": results} \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/vehicles.py.old b/archive/2026.02.18 Archive_old_mapps/vehicles.py.old new file mode 100755 index 0000000..4b6a36a --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/vehicles.py.old @@ -0,0 +1,59 @@ +from fastapi import APIRouter, Depends, Query, HTTPException +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import text +from app.api.deps import get_db, get_current_user +from typing import List, Dict, Optional +from app.models.vehicle import Vehicle + +router = APIRouter() + +@router.get("/search/brands") +async def search_brands(q: str = Query(..., min_length=2), db: AsyncSession = Depends(get_db)): + query = text(""" + SELECT id, name, slug, country_of_origin + FROM data.vehicle_brands + WHERE (name ILIKE :q OR slug ILIKE :q) AND is_active = true + ORDER BY name ASC LIMIT 10 + """) + # 1. Megvárjuk az execute-ot + result = await db.execute(query, {"q": f"%{q}%"}) + # 2. Külön hívjuk a fetchall-t az eredményen + rows = result.fetchall() + + brand_list = [dict(row._mapping) for row in rows] + if not brand_list: + return {"status": "discovery_mode", "data": []} + return {"status": "success", "data": brand_list} + +@router.get("/search/providers") +async def search_providers(q: str = Query(..., min_length=2), db: AsyncSession = Depends(get_db)): + query = text(""" + SELECT id, name, technical_rating_pct, location_city, service_type + FROM data.service_providers + WHERE (name ILIKE :q OR service_type ILIKE :q) AND is_active = true + ORDER BY technical_rating_pct DESC LIMIT 15 + """) + result = await db.execute(query, {"q": f"%{q}%"}) + rows = result.fetchall() + return {"status": "success", "data": [dict(row._mapping) for row in rows]} + +@router.post("/register") +async def register_user_vehicle(data: dict, db: AsyncSession = Depends(get_db), current_user = Depends(get_current_user)): + company_res = await db.execute(text("SELECT id FROM data.companies WHERE owner_id = :u LIMIT 1"), {"u": current_user.id}) + company = company_res.fetchone() + if not company: + raise HTTPException(status_code=404, detail="Széf nem található.") + + new_vehicle = Vehicle( + current_company_id=company.id, + brand_id=data.get("brand_id"), + model_name=data.get("model_name"), + engine_spec_id=data.get("engine_spec_id"), + identification_number=data.get("vin"), + license_plate=data.get("plate"), + tracking_mode=data.get("tracking_mode", "km"), + total_real_usage=data.get("current_odo", 0) + ) + db.add(new_vehicle) + await db.commit() + return {"status": "success", "vehicle_id": str(new_vehicle.id)} \ No newline at end of file diff --git a/archive/2026.02.18 Archive_old_mapps/verification_token.py.old b/archive/2026.02.18 Archive_old_mapps/verification_token.py.old new file mode 100755 index 0000000..8357671 --- /dev/null +++ b/archive/2026.02.18 Archive_old_mapps/verification_token.py.old @@ -0,0 +1,21 @@ +import enum +from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Enum +from sqlalchemy.sql import func +from app.db.base import Base + +class TokenType(str, enum.Enum): + email_verify = "email_verify" + password_reset = "password_reset" + +class VerificationToken(Base): + __tablename__ = "verification_tokens" + __table_args__ = {"schema": "data"} + + id = Column(Integer, primary_key=True, index=True) + user_id = Column(Integer, ForeignKey("data.users.id", ondelete="CASCADE"), nullable=False) + + token_hash = Column(String(64), unique=True, index=True, nullable=False) + token_type = Column(Enum(TokenType, name="tokentype", schema="data"), nullable=False) + + expires_at = Column(DateTime(timezone=True), nullable=True) + created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False) diff --git a/archive/data-1772053521182.csv b/archive/data-1772053521182.csv new file mode 100755 index 0000000..1a97583 --- /dev/null +++ b/archive/data-1772053521182.csv @@ -0,0 +1,55 @@ +"schema_name","table_name" +"data","addresses" +"data","asset_assignments" +"data","asset_costs" +"data","asset_events" +"data","asset_financials" +"data","asset_inspections" +"data","asset_reviews" +"data","asset_telemetry" +"data","assets" +"data","audit_logs" +"data","badges" +"data","branches" +"data","catalog_discovery" +"data","credit_logs" +"data","discovery_parameters" +"data","exchange_rates" +"data","expertise_tags" +"data","feature_definitions" +"data","geo_postal_codes" +"data","geo_street_types" +"data","geo_streets" +"data","level_configs" +"data","model_feature_maps" +"data","org_sales_assignments" +"data","org_subscriptions" +"data","organization_financials" +"data","organization_members" +"data","organizations" +"data","point_rules" +"data","points_ledger" +"data","ratings" +"data","service_expertises" +"data","service_profiles" +"data","service_specialties" +"data","service_staging" +"data","subscription_tiers" +"data","system_parameters" +"data","translations" +"data","user_badges" +"data","user_stats" +"data","vehicle_catalog" +"data","vehicle_logbook" +"data","vehicle_model_definitions" +"data","vehicle_ownership_history" +"data","vehicle_ownerships" +"data","vehicle_types" +"identity","persons" +"identity","social_accounts" +"identity","users" +"identity","verification_tokens" +"identity","wallets" +"public","alembic_version" +"public","spatial_ref_sys" +"system","pending_actions" diff --git a/archive/data-1772053575794.csv b/archive/data-1772053575794.csv new file mode 100755 index 0000000..8e5bccb --- /dev/null +++ b/archive/data-1772053575794.csv @@ -0,0 +1,521 @@ +"table_name","index_name","column_name" +"addresses","addresses_pkey","id" +"alembic_version","alembic_version_pkey","version_num" +"asset_assignments","asset_assignments_pkey","id" +"asset_costs","asset_costs_pkey","id" +"asset_costs","ix_data_asset_costs_registration_uuid","registration_uuid" +"asset_events","asset_events_pkey","id" +"asset_events","ix_data_asset_events_registration_uuid","registration_uuid" +"asset_financials","asset_financials_asset_id_key","asset_id" +"asset_financials","asset_financials_pkey","id" +"asset_inspections","asset_inspections_pkey","id" +"asset_reviews","asset_reviews_pkey","id" +"asset_telemetry","asset_telemetry_asset_id_key","asset_id" +"asset_telemetry","asset_telemetry_pkey","id" +"assets","assets_pkey","id" +"assets","ix_data_assets_license_plate","license_plate" +"assets","ix_data_assets_registration_uuid","registration_uuid" +"assets","ix_data_assets_vin","vin" +"audit_logs","audit_logs_pkey","id" +"audit_logs","ix_data_audit_logs_action","action" +"audit_logs","ix_data_audit_logs_id","id" +"audit_logs","ix_data_audit_logs_ip_address","ip_address" +"audit_logs","ix_data_audit_logs_target_id","target_id" +"audit_logs","ix_data_audit_logs_target_type","target_type" +"audit_logs","ix_data_audit_logs_timestamp","timestamp" +"badges","badges_name_key","name" +"badges","badges_pkey","id" +"badges","ix_data_badges_id","id" +"branches","branches_pkey","id" +"branches","ix_data_branches_city","city" +"branches","ix_data_branches_postal_code","postal_code" +"catalog_discovery","_make_model_class_uc","model" +"catalog_discovery","_make_model_class_uc","make" +"catalog_discovery","_make_model_class_uc","vehicle_class" +"catalog_discovery","catalog_discovery_pkey","id" +"catalog_discovery","ix_data_catalog_discovery_id","id" +"catalog_discovery","ix_data_catalog_discovery_make","make" +"catalog_discovery","ix_data_catalog_discovery_model","model" +"catalog_discovery","ix_data_catalog_discovery_status","status" +"catalog_discovery","ix_data_catalog_discovery_vehicle_class","vehicle_class" +"credit_logs","credit_logs_pkey","id" +"discovery_parameters","discovery_parameters_pkey","id" +"exchange_rates","exchange_rates_pkey","id" +"exchange_rates","exchange_rates_target_currency_key","target_currency" +"expertise_tags","expertise_tags_pkey","id" +"expertise_tags","ix_data_expertise_tags_key","key" +"feature_definitions","feature_definitions_pkey","id" +"feature_definitions","ix_data_feature_definitions_category","category" +"feature_definitions","ix_data_feature_definitions_code","code" +"geo_postal_codes","geo_postal_codes_pkey","id" +"geo_postal_codes","ix_data_geo_postal_codes_city","city" +"geo_postal_codes","ix_data_geo_postal_codes_zip_code","zip_code" +"geo_street_types","geo_street_types_name_key","name" +"geo_street_types","geo_street_types_pkey","id" +"geo_streets","geo_streets_pkey","id" +"geo_streets","ix_data_geo_streets_name","name" +"level_configs","ix_data_level_configs_id","id" +"level_configs","level_configs_level_number_key","level_number" +"level_configs","level_configs_pkey","id" +"model_feature_maps","model_feature_maps_pkey","id" +"org_sales_assignments","org_sales_assignments_pkey","id" +"org_subscriptions","org_subscriptions_pkey","id" +"organization_financials","ix_data_organization_financials_id","id" +"organization_financials","organization_financials_pkey","id" +"organization_members","ix_data_organization_members_id","id" +"organization_members","organization_members_pkey","id" +"organizations","ix_data_organizations_folder_slug","folder_slug" +"organizations","ix_data_organizations_id","id" +"organizations","ix_data_organizations_subscription_plan","subscription_plan" +"organizations","ix_data_organizations_tax_number","tax_number" +"organizations","organizations_pkey","id" +"pending_actions","ix_system_pending_actions_id","id" +"pending_actions","pending_actions_pkey","id" +"persons","ix_identity_persons_id","id" +"persons","ix_identity_persons_identity_hash","identity_hash" +"persons","persons_id_uuid_key","id_uuid" +"persons","persons_pkey","id" +"pg_aggregate","pg_aggregate_fnoid_index","aggfnoid" +"pg_am","pg_am_name_index","amname" +"pg_am","pg_am_oid_index","oid" +"pg_amop","pg_amop_fam_strat_index","amopstrategy" +"pg_amop","pg_amop_fam_strat_index","amopfamily" +"pg_amop","pg_amop_fam_strat_index","amoprighttype" +"pg_amop","pg_amop_fam_strat_index","amoplefttype" +"pg_amop","pg_amop_oid_index","oid" +"pg_amop","pg_amop_opr_fam_index","amopfamily" +"pg_amop","pg_amop_opr_fam_index","amoppurpose" +"pg_amop","pg_amop_opr_fam_index","amopopr" +"pg_amproc","pg_amproc_fam_proc_index","amprocrighttype" +"pg_amproc","pg_amproc_fam_proc_index","amproclefttype" +"pg_amproc","pg_amproc_fam_proc_index","amprocfamily" +"pg_amproc","pg_amproc_fam_proc_index","amprocnum" +"pg_amproc","pg_amproc_oid_index","oid" +"pg_attrdef","pg_attrdef_adrelid_adnum_index","adrelid" +"pg_attrdef","pg_attrdef_adrelid_adnum_index","adnum" +"pg_attrdef","pg_attrdef_oid_index","oid" +"pg_attribute","pg_attribute_relid_attnam_index","attname" +"pg_attribute","pg_attribute_relid_attnam_index","attrelid" +"pg_attribute","pg_attribute_relid_attnum_index","attnum" +"pg_attribute","pg_attribute_relid_attnum_index","attrelid" +"pg_auth_members","pg_auth_members_member_role_index","roleid" +"pg_auth_members","pg_auth_members_member_role_index","member" +"pg_auth_members","pg_auth_members_role_member_index","member" +"pg_auth_members","pg_auth_members_role_member_index","roleid" +"pg_authid","pg_authid_oid_index","oid" +"pg_authid","pg_authid_rolname_index","rolname" +"pg_cast","pg_cast_oid_index","oid" +"pg_cast","pg_cast_source_target_index","casttarget" +"pg_cast","pg_cast_source_target_index","castsource" +"pg_class","pg_class_oid_index","oid" +"pg_class","pg_class_relname_nsp_index","relnamespace" +"pg_class","pg_class_relname_nsp_index","relname" +"pg_class","pg_class_tblspc_relfilenode_index","reltablespace" +"pg_class","pg_class_tblspc_relfilenode_index","relfilenode" +"pg_collation","pg_collation_name_enc_nsp_index","collnamespace" +"pg_collation","pg_collation_name_enc_nsp_index","collname" +"pg_collation","pg_collation_name_enc_nsp_index","collencoding" +"pg_collation","pg_collation_oid_index","oid" +"pg_constraint","pg_constraint_conname_nsp_index","connamespace" +"pg_constraint","pg_constraint_conname_nsp_index","conname" +"pg_constraint","pg_constraint_conparentid_index","conparentid" +"pg_constraint","pg_constraint_conrelid_contypid_conname_index","conname" +"pg_constraint","pg_constraint_conrelid_contypid_conname_index","conrelid" +"pg_constraint","pg_constraint_conrelid_contypid_conname_index","contypid" +"pg_constraint","pg_constraint_contypid_index","contypid" +"pg_constraint","pg_constraint_oid_index","oid" +"pg_conversion","pg_conversion_default_index","conforencoding" +"pg_conversion","pg_conversion_default_index","oid" +"pg_conversion","pg_conversion_default_index","contoencoding" +"pg_conversion","pg_conversion_default_index","connamespace" +"pg_conversion","pg_conversion_name_nsp_index","connamespace" +"pg_conversion","pg_conversion_name_nsp_index","conname" +"pg_conversion","pg_conversion_oid_index","oid" +"pg_database","pg_database_datname_index","datname" +"pg_database","pg_database_oid_index","oid" +"pg_db_role_setting","pg_db_role_setting_databaseid_rol_index","setrole" +"pg_db_role_setting","pg_db_role_setting_databaseid_rol_index","setdatabase" +"pg_default_acl","pg_default_acl_oid_index","oid" +"pg_default_acl","pg_default_acl_role_nsp_obj_index","defaclrole" +"pg_default_acl","pg_default_acl_role_nsp_obj_index","defaclnamespace" +"pg_default_acl","pg_default_acl_role_nsp_obj_index","defaclobjtype" +"pg_depend","pg_depend_depender_index","objsubid" +"pg_depend","pg_depend_depender_index","objid" +"pg_depend","pg_depend_depender_index","classid" +"pg_depend","pg_depend_reference_index","refobjid" +"pg_depend","pg_depend_reference_index","refobjsubid" +"pg_depend","pg_depend_reference_index","refclassid" +"pg_description","pg_description_o_c_o_index","objoid" +"pg_description","pg_description_o_c_o_index","classoid" +"pg_description","pg_description_o_c_o_index","objsubid" +"pg_enum","pg_enum_oid_index","oid" +"pg_enum","pg_enum_typid_label_index","enumlabel" +"pg_enum","pg_enum_typid_label_index","enumtypid" +"pg_enum","pg_enum_typid_sortorder_index","enumtypid" +"pg_enum","pg_enum_typid_sortorder_index","enumsortorder" +"pg_event_trigger","pg_event_trigger_evtname_index","evtname" +"pg_event_trigger","pg_event_trigger_oid_index","oid" +"pg_extension","pg_extension_name_index","extname" +"pg_extension","pg_extension_oid_index","oid" +"pg_foreign_data_wrapper","pg_foreign_data_wrapper_name_index","fdwname" +"pg_foreign_data_wrapper","pg_foreign_data_wrapper_oid_index","oid" +"pg_foreign_server","pg_foreign_server_name_index","srvname" +"pg_foreign_server","pg_foreign_server_oid_index","oid" +"pg_foreign_table","pg_foreign_table_relid_index","ftrelid" +"pg_index","pg_index_indexrelid_index","indexrelid" +"pg_index","pg_index_indrelid_index","indrelid" +"pg_inherits","pg_inherits_parent_index","inhparent" +"pg_inherits","pg_inherits_relid_seqno_index","inhrelid" +"pg_inherits","pg_inherits_relid_seqno_index","inhseqno" +"pg_init_privs","pg_init_privs_o_c_o_index","objsubid" +"pg_init_privs","pg_init_privs_o_c_o_index","objoid" +"pg_init_privs","pg_init_privs_o_c_o_index","classoid" +"pg_language","pg_language_name_index","lanname" +"pg_language","pg_language_oid_index","oid" +"pg_largeobject","pg_largeobject_loid_pn_index","loid" +"pg_largeobject","pg_largeobject_loid_pn_index","pageno" +"pg_largeobject_metadata","pg_largeobject_metadata_oid_index","oid" +"pg_namespace","pg_namespace_nspname_index","nspname" +"pg_namespace","pg_namespace_oid_index","oid" +"pg_opclass","pg_opclass_am_name_nsp_index","opcmethod" +"pg_opclass","pg_opclass_am_name_nsp_index","opcnamespace" +"pg_opclass","pg_opclass_am_name_nsp_index","opcname" +"pg_opclass","pg_opclass_oid_index","oid" +"pg_operator","pg_operator_oid_index","oid" +"pg_operator","pg_operator_oprname_l_r_n_index","oprright" +"pg_operator","pg_operator_oprname_l_r_n_index","oprleft" +"pg_operator","pg_operator_oprname_l_r_n_index","oprnamespace" +"pg_operator","pg_operator_oprname_l_r_n_index","oprname" +"pg_opfamily","pg_opfamily_am_name_nsp_index","opfname" +"pg_opfamily","pg_opfamily_am_name_nsp_index","opfnamespace" +"pg_opfamily","pg_opfamily_am_name_nsp_index","opfmethod" +"pg_opfamily","pg_opfamily_oid_index","oid" +"pg_parameter_acl","pg_parameter_acl_oid_index","oid" +"pg_parameter_acl","pg_parameter_acl_parname_index","parname" +"pg_partitioned_table","pg_partitioned_table_partrelid_index","partrelid" +"pg_policy","pg_policy_oid_index","oid" +"pg_policy","pg_policy_polrelid_polname_index","polname" +"pg_policy","pg_policy_polrelid_polname_index","polrelid" +"pg_proc","pg_proc_oid_index","oid" +"pg_proc","pg_proc_proname_args_nsp_index","proname" +"pg_proc","pg_proc_proname_args_nsp_index","pronamespace" +"pg_proc","pg_proc_proname_args_nsp_index","proargtypes" +"pg_publication","pg_publication_oid_index","oid" +"pg_publication","pg_publication_pubname_index","pubname" +"pg_publication_namespace","pg_publication_namespace_oid_index","oid" +"pg_publication_namespace","pg_publication_namespace_pnnspid_pnpubid_index","pnnspid" +"pg_publication_namespace","pg_publication_namespace_pnnspid_pnpubid_index","pnpubid" +"pg_publication_rel","pg_publication_rel_oid_index","oid" +"pg_publication_rel","pg_publication_rel_prpubid_index","prpubid" +"pg_publication_rel","pg_publication_rel_prrelid_prpubid_index","prrelid" +"pg_publication_rel","pg_publication_rel_prrelid_prpubid_index","prpubid" +"pg_range","pg_range_rngmultitypid_index","rngmultitypid" +"pg_range","pg_range_rngtypid_index","rngtypid" +"pg_replication_origin","pg_replication_origin_roiident_index","roident" +"pg_replication_origin","pg_replication_origin_roname_index","roname" +"pg_rewrite","pg_rewrite_oid_index","oid" +"pg_rewrite","pg_rewrite_rel_rulename_index","rulename" +"pg_rewrite","pg_rewrite_rel_rulename_index","ev_class" +"pg_seclabel","pg_seclabel_object_index","objsubid" +"pg_seclabel","pg_seclabel_object_index","objoid" +"pg_seclabel","pg_seclabel_object_index","classoid" +"pg_seclabel","pg_seclabel_object_index","provider" +"pg_sequence","pg_sequence_seqrelid_index","seqrelid" +"pg_shdepend","pg_shdepend_depender_index","objsubid" +"pg_shdepend","pg_shdepend_depender_index","objid" +"pg_shdepend","pg_shdepend_depender_index","dbid" +"pg_shdepend","pg_shdepend_depender_index","classid" +"pg_shdepend","pg_shdepend_reference_index","refclassid" +"pg_shdepend","pg_shdepend_reference_index","refobjid" +"pg_shdescription","pg_shdescription_o_c_index","classoid" +"pg_shdescription","pg_shdescription_o_c_index","objoid" +"pg_shseclabel","pg_shseclabel_object_index","provider" +"pg_shseclabel","pg_shseclabel_object_index","objoid" +"pg_shseclabel","pg_shseclabel_object_index","classoid" +"pg_statistic","pg_statistic_relid_att_inh_index","staattnum" +"pg_statistic","pg_statistic_relid_att_inh_index","starelid" +"pg_statistic","pg_statistic_relid_att_inh_index","stainherit" +"pg_statistic_ext","pg_statistic_ext_name_index","stxname" +"pg_statistic_ext","pg_statistic_ext_name_index","stxnamespace" +"pg_statistic_ext","pg_statistic_ext_oid_index","oid" +"pg_statistic_ext","pg_statistic_ext_relid_index","stxrelid" +"pg_statistic_ext_data","pg_statistic_ext_data_stxoid_inh_index","stxdinherit" +"pg_statistic_ext_data","pg_statistic_ext_data_stxoid_inh_index","stxoid" +"pg_subscription","pg_subscription_oid_index","oid" +"pg_subscription","pg_subscription_subname_index","subdbid" +"pg_subscription","pg_subscription_subname_index","subname" +"pg_subscription_rel","pg_subscription_rel_srrelid_srsubid_index","srsubid" +"pg_subscription_rel","pg_subscription_rel_srrelid_srsubid_index","srrelid" +"pg_tablespace","pg_tablespace_oid_index","oid" +"pg_tablespace","pg_tablespace_spcname_index","spcname" +"pg_toast_1213","pg_toast_1213_index","chunk_seq" +"pg_toast_1213","pg_toast_1213_index","chunk_id" +"pg_toast_1247","pg_toast_1247_index","chunk_id" +"pg_toast_1247","pg_toast_1247_index","chunk_seq" +"pg_toast_1255","pg_toast_1255_index","chunk_id" +"pg_toast_1255","pg_toast_1255_index","chunk_seq" +"pg_toast_1260","pg_toast_1260_index","chunk_seq" +"pg_toast_1260","pg_toast_1260_index","chunk_id" +"pg_toast_1262","pg_toast_1262_index","chunk_seq" +"pg_toast_1262","pg_toast_1262_index","chunk_id" +"pg_toast_13454","pg_toast_13454_index","chunk_seq" +"pg_toast_13454","pg_toast_13454_index","chunk_id" +"pg_toast_13459","pg_toast_13459_index","chunk_seq" +"pg_toast_13459","pg_toast_13459_index","chunk_id" +"pg_toast_13464","pg_toast_13464_index","chunk_seq" +"pg_toast_13464","pg_toast_13464_index","chunk_id" +"pg_toast_13469","pg_toast_13469_index","chunk_id" +"pg_toast_13469","pg_toast_13469_index","chunk_seq" +"pg_toast_1417","pg_toast_1417_index","chunk_seq" +"pg_toast_1417","pg_toast_1417_index","chunk_id" +"pg_toast_1418","pg_toast_1418_index","chunk_seq" +"pg_toast_1418","pg_toast_1418_index","chunk_id" +"pg_toast_2328","pg_toast_2328_index","chunk_id" +"pg_toast_2328","pg_toast_2328_index","chunk_seq" +"pg_toast_2396","pg_toast_2396_index","chunk_seq" +"pg_toast_2396","pg_toast_2396_index","chunk_id" +"pg_toast_2600","pg_toast_2600_index","chunk_seq" +"pg_toast_2600","pg_toast_2600_index","chunk_id" +"pg_toast_2604","pg_toast_2604_index","chunk_id" +"pg_toast_2604","pg_toast_2604_index","chunk_seq" +"pg_toast_2606","pg_toast_2606_index","chunk_id" +"pg_toast_2606","pg_toast_2606_index","chunk_seq" +"pg_toast_2609","pg_toast_2609_index","chunk_seq" +"pg_toast_2609","pg_toast_2609_index","chunk_id" +"pg_toast_2612","pg_toast_2612_index","chunk_seq" +"pg_toast_2612","pg_toast_2612_index","chunk_id" +"pg_toast_2615","pg_toast_2615_index","chunk_seq" +"pg_toast_2615","pg_toast_2615_index","chunk_id" +"pg_toast_2618","pg_toast_2618_index","chunk_seq" +"pg_toast_2618","pg_toast_2618_index","chunk_id" +"pg_toast_2619","pg_toast_2619_index","chunk_id" +"pg_toast_2619","pg_toast_2619_index","chunk_seq" +"pg_toast_2620","pg_toast_2620_index","chunk_id" +"pg_toast_2620","pg_toast_2620_index","chunk_seq" +"pg_toast_2964","pg_toast_2964_index","chunk_id" +"pg_toast_2964","pg_toast_2964_index","chunk_seq" +"pg_toast_3079","pg_toast_3079_index","chunk_seq" +"pg_toast_3079","pg_toast_3079_index","chunk_id" +"pg_toast_3118","pg_toast_3118_index","chunk_id" +"pg_toast_3118","pg_toast_3118_index","chunk_seq" +"pg_toast_3256","pg_toast_3256_index","chunk_id" +"pg_toast_3256","pg_toast_3256_index","chunk_seq" +"pg_toast_3350","pg_toast_3350_index","chunk_seq" +"pg_toast_3350","pg_toast_3350_index","chunk_id" +"pg_toast_3381","pg_toast_3381_index","chunk_seq" +"pg_toast_3381","pg_toast_3381_index","chunk_id" +"pg_toast_3394","pg_toast_3394_index","chunk_id" +"pg_toast_3394","pg_toast_3394_index","chunk_seq" +"pg_toast_3429","pg_toast_3429_index","chunk_id" +"pg_toast_3429","pg_toast_3429_index","chunk_seq" +"pg_toast_3456","pg_toast_3456_index","chunk_seq" +"pg_toast_3456","pg_toast_3456_index","chunk_id" +"pg_toast_3466","pg_toast_3466_index","chunk_id" +"pg_toast_3466","pg_toast_3466_index","chunk_seq" +"pg_toast_3592","pg_toast_3592_index","chunk_seq" +"pg_toast_3592","pg_toast_3592_index","chunk_id" +"pg_toast_3596","pg_toast_3596_index","chunk_seq" +"pg_toast_3596","pg_toast_3596_index","chunk_id" +"pg_toast_3600","pg_toast_3600_index","chunk_id" +"pg_toast_3600","pg_toast_3600_index","chunk_seq" +"pg_toast_6000","pg_toast_6000_index","chunk_id" +"pg_toast_6000","pg_toast_6000_index","chunk_seq" +"pg_toast_6100","pg_toast_6100_index","chunk_seq" +"pg_toast_6100","pg_toast_6100_index","chunk_id" +"pg_toast_6106","pg_toast_6106_index","chunk_id" +"pg_toast_6106","pg_toast_6106_index","chunk_seq" +"pg_toast_6243","pg_toast_6243_index","chunk_id" +"pg_toast_6243","pg_toast_6243_index","chunk_seq" +"pg_toast_79789","pg_toast_79789_index","chunk_id" +"pg_toast_79789","pg_toast_79789_index","chunk_seq" +"pg_toast_826","pg_toast_826_index","chunk_seq" +"pg_toast_826","pg_toast_826_index","chunk_id" +"pg_toast_88701","pg_toast_88701_index","chunk_seq" +"pg_toast_88701","pg_toast_88701_index","chunk_id" +"pg_toast_88771","pg_toast_88771_index","chunk_seq" +"pg_toast_88771","pg_toast_88771_index","chunk_id" +"pg_toast_88783","pg_toast_88783_index","chunk_seq" +"pg_toast_88783","pg_toast_88783_index","chunk_id" +"pg_toast_88794","pg_toast_88794_index","chunk_seq" +"pg_toast_88794","pg_toast_88794_index","chunk_id" +"pg_toast_88809","pg_toast_88809_index","chunk_id" +"pg_toast_88809","pg_toast_88809_index","chunk_seq" +"pg_toast_88827","pg_toast_88827_index","chunk_id" +"pg_toast_88827","pg_toast_88827_index","chunk_seq" +"pg_toast_88838","pg_toast_88838_index","chunk_id" +"pg_toast_88838","pg_toast_88838_index","chunk_seq" +"pg_toast_88851","pg_toast_88851_index","chunk_id" +"pg_toast_88851","pg_toast_88851_index","chunk_seq" +"pg_toast_88861","pg_toast_88861_index","chunk_id" +"pg_toast_88861","pg_toast_88861_index","chunk_seq" +"pg_toast_88902","pg_toast_88902_index","chunk_seq" +"pg_toast_88902","pg_toast_88902_index","chunk_id" +"pg_toast_88946","pg_toast_88946_index","chunk_seq" +"pg_toast_88946","pg_toast_88946_index","chunk_id" +"pg_toast_88971","pg_toast_88971_index","chunk_id" +"pg_toast_88971","pg_toast_88971_index","chunk_seq" +"pg_toast_89018","pg_toast_89018_index","chunk_id" +"pg_toast_89018","pg_toast_89018_index","chunk_seq" +"pg_toast_89064","pg_toast_89064_index","chunk_id" +"pg_toast_89064","pg_toast_89064_index","chunk_seq" +"pg_toast_89098","pg_toast_89098_index","chunk_seq" +"pg_toast_89098","pg_toast_89098_index","chunk_id" +"pg_toast_89129","pg_toast_89129_index","chunk_id" +"pg_toast_89129","pg_toast_89129_index","chunk_seq" +"pg_toast_89178","pg_toast_89178_index","chunk_seq" +"pg_toast_89178","pg_toast_89178_index","chunk_id" +"pg_toast_89231","pg_toast_89231_index","chunk_seq" +"pg_toast_89231","pg_toast_89231_index","chunk_id" +"pg_toast_89273","pg_toast_89273_index","chunk_seq" +"pg_toast_89273","pg_toast_89273_index","chunk_id" +"pg_toast_89295","pg_toast_89295_index","chunk_id" +"pg_toast_89295","pg_toast_89295_index","chunk_seq" +"pg_toast_89374","pg_toast_89374_index","chunk_seq" +"pg_toast_89374","pg_toast_89374_index","chunk_id" +"pg_toast_89400","pg_toast_89400_index","chunk_id" +"pg_toast_89400","pg_toast_89400_index","chunk_seq" +"pg_toast_89457","pg_toast_89457_index","chunk_id" +"pg_toast_89457","pg_toast_89457_index","chunk_seq" +"pg_toast_89482","pg_toast_89482_index","chunk_id" +"pg_toast_89482","pg_toast_89482_index","chunk_seq" +"pg_toast_89497","pg_toast_89497_index","chunk_seq" +"pg_toast_89497","pg_toast_89497_index","chunk_id" +"pg_toast_89513","pg_toast_89513_index","chunk_id" +"pg_toast_89513","pg_toast_89513_index","chunk_seq" +"pg_toast_89548","pg_toast_89548_index","chunk_id" +"pg_toast_89548","pg_toast_89548_index","chunk_seq" +"pg_toast_89597","pg_toast_89597_index","chunk_seq" +"pg_toast_89597","pg_toast_89597_index","chunk_id" +"pg_toast_90028","pg_toast_90028_index","chunk_id" +"pg_toast_90028","pg_toast_90028_index","chunk_seq" +"pg_toast_91674","pg_toast_91674_index","chunk_id" +"pg_toast_91674","pg_toast_91674_index","chunk_seq" +"pg_toast_98885","pg_toast_98885_index","chunk_id" +"pg_toast_98885","pg_toast_98885_index","chunk_seq" +"pg_transform","pg_transform_oid_index","oid" +"pg_transform","pg_transform_type_lang_index","trflang" +"pg_transform","pg_transform_type_lang_index","trftype" +"pg_trigger","pg_trigger_oid_index","oid" +"pg_trigger","pg_trigger_tgconstraint_index","tgconstraint" +"pg_trigger","pg_trigger_tgrelid_tgname_index","tgname" +"pg_trigger","pg_trigger_tgrelid_tgname_index","tgrelid" +"pg_ts_config","pg_ts_config_cfgname_index","cfgname" +"pg_ts_config","pg_ts_config_cfgname_index","cfgnamespace" +"pg_ts_config","pg_ts_config_oid_index","oid" +"pg_ts_config_map","pg_ts_config_map_index","mapcfg" +"pg_ts_config_map","pg_ts_config_map_index","mapseqno" +"pg_ts_config_map","pg_ts_config_map_index","maptokentype" +"pg_ts_dict","pg_ts_dict_dictname_index","dictnamespace" +"pg_ts_dict","pg_ts_dict_dictname_index","dictname" +"pg_ts_dict","pg_ts_dict_oid_index","oid" +"pg_ts_parser","pg_ts_parser_oid_index","oid" +"pg_ts_parser","pg_ts_parser_prsname_index","prsname" +"pg_ts_parser","pg_ts_parser_prsname_index","prsnamespace" +"pg_ts_template","pg_ts_template_oid_index","oid" +"pg_ts_template","pg_ts_template_tmplname_index","tmplname" +"pg_ts_template","pg_ts_template_tmplname_index","tmplnamespace" +"pg_type","pg_type_oid_index","oid" +"pg_type","pg_type_typname_nsp_index","typnamespace" +"pg_type","pg_type_typname_nsp_index","typname" +"pg_user_mapping","pg_user_mapping_oid_index","oid" +"pg_user_mapping","pg_user_mapping_user_server_index","umserver" +"pg_user_mapping","pg_user_mapping_user_server_index","umuser" +"point_rules","ix_data_point_rules_action_key","action_key" +"point_rules","ix_data_point_rules_id","id" +"point_rules","point_rules_pkey","id" +"points_ledger","ix_data_points_ledger_id","id" +"points_ledger","points_ledger_pkey","id" +"ratings","idx_rating_branch","target_branch_id" +"ratings","idx_rating_org","target_organization_id" +"ratings","idx_rating_user","target_user_id" +"ratings","ratings_pkey","id" +"service_expertises","service_expertises_pkey","expertise_id" +"service_expertises","service_expertises_pkey","service_id" +"service_profiles","idx_service_fingerprint","fingerprint" +"service_profiles","idx_service_profiles_location","location" +"service_profiles","ix_data_service_profiles_fingerprint","fingerprint" +"service_profiles","ix_data_service_profiles_id","id" +"service_profiles","ix_data_service_profiles_location","location" +"service_profiles","ix_data_service_profiles_status","status" +"service_profiles","service_profiles_google_place_id_key","google_place_id" +"service_profiles","service_profiles_organization_id_key","organization_id" +"service_profiles","service_profiles_pkey","id" +"service_specialties","ix_data_service_specialties_slug","slug" +"service_specialties","service_specialties_pkey","id" +"service_staging","idx_staging_fingerprint","fingerprint" +"service_staging","ix_data_service_staging_city","city" +"service_staging","ix_data_service_staging_id","id" +"service_staging","ix_data_service_staging_name","name" +"service_staging","ix_data_service_staging_postal_code","postal_code" +"service_staging","ix_data_service_staging_status","status" +"service_staging","service_staging_pkey","id" +"social_accounts","ix_identity_social_accounts_id","id" +"social_accounts","ix_identity_social_accounts_social_id","social_id" +"social_accounts","social_accounts_pkey","id" +"social_accounts","uix_social_provider_id","provider" +"social_accounts","uix_social_provider_id","social_id" +"spatial_ref_sys","spatial_ref_sys_pkey","srid" +"subscription_tiers","ix_data_subscription_tiers_name","name" +"subscription_tiers","subscription_tiers_pkey","id" +"system_parameters","system_parameters_key_key","key" +"system_parameters","system_parameters_pkey","id" +"translations","ix_data_translations_id","id" +"translations","ix_data_translations_key","key" +"translations","ix_data_translations_lang","lang" +"translations","translations_pkey","id" +"user_badges","ix_data_user_badges_id","id" +"user_badges","user_badges_pkey","id" +"user_stats","user_stats_pkey","user_id" +"users","ix_identity_users_email","email" +"users","ix_identity_users_folder_slug","folder_slug" +"users","ix_identity_users_id","id" +"users","users_pkey","id" +"users","users_referral_code_key","referral_code" +"vehicle_catalog","ix_data_vehicle_catalog_engine_capacity","engine_capacity" +"vehicle_catalog","ix_data_vehicle_catalog_engine_variant","engine_variant" +"vehicle_catalog","ix_data_vehicle_catalog_fuel_type","fuel_type" +"vehicle_catalog","ix_data_vehicle_catalog_generation","generation" +"vehicle_catalog","ix_data_vehicle_catalog_id","id" +"vehicle_catalog","ix_data_vehicle_catalog_make","make" +"vehicle_catalog","ix_data_vehicle_catalog_model","model" +"vehicle_catalog","ix_data_vehicle_catalog_power_kw","power_kw" +"vehicle_catalog","uix_vehicle_catalog_full","year_from" +"vehicle_catalog","uix_vehicle_catalog_full","make" +"vehicle_catalog","uix_vehicle_catalog_full","model" +"vehicle_catalog","uix_vehicle_catalog_full","engine_variant" +"vehicle_catalog","uix_vehicle_catalog_full","fuel_type" +"vehicle_catalog","vehicle_catalog_pkey","id" +"vehicle_logbook","vehicle_logbook_pkey","id" +"vehicle_model_definitions","idx_vmd_engine_code","engine_code" +"vehicle_model_definitions","idx_vmd_lookup","make" +"vehicle_model_definitions","idx_vmd_lookup","technical_code" +"vehicle_model_definitions","idx_vmd_lookup_fast","normalized_name" +"vehicle_model_definitions","idx_vmd_lookup_fast","make" +"vehicle_model_definitions","idx_vmd_normalized_name","normalized_name" +"vehicle_model_definitions","ix_data_vehicle_model_definitions_make","make" +"vehicle_model_definitions","ix_data_vehicle_model_definitions_marketing_name","marketing_name" +"vehicle_model_definitions","ix_data_vehicle_model_definitions_status","status" +"vehicle_model_definitions","ix_data_vehicle_model_definitions_technical_code","technical_code" +"vehicle_model_definitions","ix_data_vehicle_model_definitions_year_from","year_from" +"vehicle_model_definitions","ix_data_vehicle_model_definitions_year_to","year_to" +"vehicle_model_definitions","ix_vehicle_model_marketing_name","marketing_name" +"vehicle_model_definitions","uix_make_tech_type","technical_code" +"vehicle_model_definitions","uix_make_tech_type","make" +"vehicle_model_definitions","uix_make_tech_type","vehicle_type_id" +"vehicle_model_definitions","uix_vmd_precision","variant_code" +"vehicle_model_definitions","uix_vmd_precision","make" +"vehicle_model_definitions","uix_vmd_precision","version_code" +"vehicle_model_definitions","uix_vmd_precision","fuel_type" +"vehicle_model_definitions","uix_vmd_precision","normalized_name" +"vehicle_model_definitions","vehicle_model_definitions_pkey","id" +"vehicle_ownership_history","vehicle_ownership_history_pkey","id" +"vehicle_ownerships","ix_data_vehicle_ownerships_id","id" +"vehicle_ownerships","vehicle_ownerships_pkey","id" +"vehicle_types","ix_data_vehicle_types_code","code" +"vehicle_types","vehicle_types_pkey","id" +"verification_tokens","ix_identity_verification_tokens_id","id" +"verification_tokens","verification_tokens_pkey","id" +"verification_tokens","verification_tokens_token_key","token" +"wallets","ix_identity_wallets_id","id" +"wallets","wallets_pkey","id" +"wallets","wallets_user_id_key","user_id" diff --git a/archive/old_other/CHANGELOG.md b/archive/old_other/CHANGELOG.md new file mode 100755 index 0000000..11a5433 --- /dev/null +++ b/archive/old_other/CHANGELOG.md @@ -0,0 +1,5 @@ +## [16.0] - 2026-01-25 +### Hozzáadva +- Smart Tiles: Csempe alapú nézet a Dashboardon. +- Brand logók és okmány-lejárat figyelmeztetések. +- Automata NAS mentés funkció a telepítőben. diff --git a/archive/old_other/backup_20260128_alap_kesz.sql b/archive/old_other/backup_20260128_alap_kesz.sql new file mode 100755 index 0000000..d86f57f --- /dev/null +++ b/archive/old_other/backup_20260128_alap_kesz.sql @@ -0,0 +1,3866 @@ +-- +-- PostgreSQL database dump +-- + +\restrict jRVVCTjjNeqN7io926QnQVJwr7IrvCK3DlzNPCoIfbivC5osmHT8eLuiehzRiDV + +-- Dumped from database version 15.15 (Debian 15.15-1.pgdg13+1) +-- Dumped by pg_dump version 15.15 (Debian 15.15-1.pgdg13+1) + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +-- +-- Name: data; Type: SCHEMA; Schema: -; Owner: kincses +-- + +CREATE SCHEMA data; + + +ALTER SCHEMA data OWNER TO kincses; + +-- +-- Name: public; Type: SCHEMA; Schema: -; Owner: service_finder_app +-- + +-- *not* creating schema, since initdb creates it + + +ALTER SCHEMA public OWNER TO service_finder_app; + +-- +-- Name: companyrole; Type: TYPE; Schema: data; Owner: kincses +-- + +CREATE TYPE data.companyrole AS ENUM ( + 'owner', + 'manager', + 'driver' +); + + +ALTER TYPE data.companyrole OWNER TO kincses; + +-- +-- Name: expense_category_enum; Type: TYPE; Schema: data; Owner: kincses +-- + +CREATE TYPE data.expense_category_enum AS ENUM ( + 'PURCHASE_PRICE', + 'TRANSFER_TAX', + 'ADMIN_FEE', + 'VEHICLE_TAX', + 'INSURANCE', + 'REFUELING', + 'SERVICE', + 'PARKING', + 'TOLL', + 'FINE', + 'TUNING_ACCESSORIES', + 'OTHER' +); + + +ALTER TYPE data.expense_category_enum OWNER TO kincses; + +-- +-- Name: moderation_status_enum; Type: TYPE; Schema: data; Owner: kincses +-- + +CREATE TYPE data.moderation_status_enum AS ENUM ( + 'pending', + 'approved', + 'rejected' +); + + +ALTER TYPE data.moderation_status_enum OWNER TO kincses; + +-- +-- Name: source_type_enum; Type: TYPE; Schema: data; Owner: kincses +-- + +CREATE TYPE data.source_type_enum AS ENUM ( + 'manual', + 'ocr', + 'api_import' +); + + +ALTER TYPE data.source_type_enum OWNER TO kincses; + +-- +-- Name: companyrole; Type: TYPE; Schema: public; Owner: kincses +-- + +CREATE TYPE public.companyrole AS ENUM ( + 'OWNER', + 'MANAGER', + 'DRIVER' +); + + +ALTER TYPE public.companyrole OWNER TO kincses; + +-- +-- Name: emailtype; Type: TYPE; Schema: public; Owner: kincses +-- + +CREATE TYPE public.emailtype AS ENUM ( + 'REGISTRATION', + 'PASSWORD_RESET', + 'GDPR_NOTICE' +); + + +ALTER TYPE public.emailtype OWNER TO kincses; + +-- +-- Name: orgtype; Type: TYPE; Schema: public; Owner: kincses +-- + +CREATE TYPE public.orgtype AS ENUM ( + 'PRIVATE', + 'COMPANY', + 'SERVICE' +); + + +ALTER TYPE public.orgtype OWNER TO kincses; + +-- +-- Name: orguserrole; Type: TYPE; Schema: public; Owner: kincses +-- + +CREATE TYPE public.orguserrole AS ENUM ( + 'OWNER', + 'ADMIN', + 'FLEET_MANAGER', + 'DRIVER', + 'owner', + 'manager', + 'driver', + 'service' +); + + +ALTER TYPE public.orguserrole OWNER TO kincses; + +-- +-- Name: tokentype; Type: TYPE; Schema: public; Owner: kincses +-- + +CREATE TYPE public.tokentype AS ENUM ( + 'EMAIL_VERIFY', + 'PASSWORD_RESET', + 'email_verify' +); + + +ALTER TYPE public.tokentype OWNER TO kincses; + +-- +-- Name: uitheme; Type: TYPE; Schema: public; Owner: kincses +-- + +CREATE TYPE public.uitheme AS ENUM ( + 'LIGHT', + 'DARK', + 'SYSTEM' +); + + +ALTER TYPE public.uitheme OWNER TO kincses; + +-- +-- Name: userrole; Type: TYPE; Schema: public; Owner: kincses +-- + +CREATE TYPE public.userrole AS ENUM ( + 'OWNER', + 'ADMIN', + 'FLEET_MANAGER', + 'DRIVER' +); + + +ALTER TYPE public.userrole OWNER TO kincses; + +-- +-- Name: validationstatus; Type: TYPE; Schema: public; Owner: kincses +-- + +CREATE TYPE public.validationstatus AS ENUM ( + 'NOT_VALIDATED', + 'PENDING', + 'VALIDATED', + 'REJECTED' +); + + +ALTER TYPE public.validationstatus OWNER TO kincses; + +SET default_tablespace = ''; + +SET default_table_access_method = heap; + +-- +-- Name: audit_logs; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.audit_logs ( + id integer NOT NULL, + user_id integer, + action character varying(100) NOT NULL, + endpoint character varying(255), + method character varying(10), + payload jsonb, + ip_address character varying(45), + user_agent text, + created_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP +); + + +ALTER TABLE data.audit_logs OWNER TO kincses; + +-- +-- Name: audit_logs_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.audit_logs_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.audit_logs_id_seq OWNER TO kincses; + +-- +-- Name: audit_logs_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.audit_logs_id_seq OWNED BY data.audit_logs.id; + + +-- +-- Name: badges; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.badges ( + id integer NOT NULL, + name character varying NOT NULL, + description character varying NOT NULL, + icon_url character varying +); + + +ALTER TABLE data.badges OWNER TO kincses; + +-- +-- Name: badges_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.badges_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.badges_id_seq OWNER TO kincses; + +-- +-- Name: badges_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.badges_id_seq OWNED BY data.badges.id; + + +-- +-- Name: companies; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.companies ( + id integer NOT NULL, + name character varying(255) NOT NULL, + tax_number character varying(50), + subscription_tier character varying(50) DEFAULT 'free'::character varying, + owner_id integer NOT NULL +); + + +ALTER TABLE data.companies OWNER TO kincses; + +-- +-- Name: companies_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.companies_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.companies_id_seq OWNER TO kincses; + +-- +-- Name: companies_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.companies_id_seq OWNED BY data.companies.id; + + +-- +-- Name: company_members; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.company_members ( + id integer NOT NULL, + company_id integer NOT NULL, + user_id integer NOT NULL, + role data.companyrole DEFAULT 'driver'::data.companyrole, + can_edit_service boolean DEFAULT false, + can_see_costs boolean DEFAULT false, + is_active boolean DEFAULT true +); + + +ALTER TABLE data.company_members OWNER TO kincses; + +-- +-- Name: company_members_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.company_members_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.company_members_id_seq OWNER TO kincses; + +-- +-- Name: company_members_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.company_members_id_seq OWNED BY data.company_members.id; + + +-- +-- Name: competitions; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.competitions ( + id integer NOT NULL, + name character varying NOT NULL, + description text, + start_date timestamp without time zone NOT NULL, + end_date timestamp without time zone NOT NULL, + is_active boolean +); + + +ALTER TABLE data.competitions OWNER TO kincses; + +-- +-- Name: competitions_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.competitions_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.competitions_id_seq OWNER TO kincses; + +-- +-- Name: competitions_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.competitions_id_seq OWNED BY data.competitions.id; + + +-- +-- Name: credit_logs; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.credit_logs ( + id integer NOT NULL, + org_id integer, + amount numeric(10,2), + description text, + created_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP +); + + +ALTER TABLE data.credit_logs OWNER TO kincses; + +-- +-- Name: credit_logs_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.credit_logs_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.credit_logs_id_seq OWNER TO kincses; + +-- +-- Name: credit_logs_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.credit_logs_id_seq OWNED BY data.credit_logs.id; + + +-- +-- Name: email_logs; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.email_logs ( + id integer NOT NULL, + email character varying, + type character varying, + sent_at timestamp with time zone DEFAULT now(), + recipient character varying(255), + user_id integer, + provider_id integer, + status character varying(50) DEFAULT 'sent'::character varying, + email_type character varying(100) +); + + +ALTER TABLE data.email_logs OWNER TO kincses; + +-- +-- Name: email_logs_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.email_logs_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.email_logs_id_seq OWNER TO kincses; + +-- +-- Name: email_logs_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.email_logs_id_seq OWNED BY data.email_logs.id; + + +-- +-- Name: email_provider_configs; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.email_provider_configs ( + id integer NOT NULL, + name character varying(50), + provider_type character varying(20), + priority integer, + settings json NOT NULL, + is_active boolean, + fail_count integer, + max_fail_threshold integer, + success_rate double precision +); + + +ALTER TABLE data.email_provider_configs OWNER TO kincses; + +-- +-- Name: email_provider_configs_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.email_provider_configs_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.email_provider_configs_id_seq OWNER TO kincses; + +-- +-- Name: email_provider_configs_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.email_provider_configs_id_seq OWNED BY data.email_provider_configs.id; + + +-- +-- Name: email_providers; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.email_providers ( + id integer NOT NULL, + name character varying(50) NOT NULL, + priority integer DEFAULT 1, + provider_type character varying(10) DEFAULT 'SMTP'::character varying, + host character varying(255), + port integer, + username character varying(255), + password_hash character varying(255), + is_active boolean DEFAULT true, + daily_limit integer DEFAULT 300, + current_daily_usage integer DEFAULT 0 +); + + +ALTER TABLE data.email_providers OWNER TO kincses; + +-- +-- Name: email_providers_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.email_providers_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.email_providers_id_seq OWNER TO kincses; + +-- +-- Name: email_providers_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.email_providers_id_seq OWNED BY data.email_providers.id; + + +-- +-- Name: email_templates; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.email_templates ( + id integer NOT NULL, + type public.emailtype, + subject character varying(255) NOT NULL, + body_html text NOT NULL +); + + +ALTER TABLE data.email_templates OWNER TO kincses; + +-- +-- Name: email_templates_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.email_templates_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.email_templates_id_seq OWNER TO kincses; + +-- +-- Name: email_templates_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.email_templates_id_seq OWNED BY data.email_templates.id; + + +-- +-- Name: legal_acceptances; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.legal_acceptances ( + id integer NOT NULL, + user_id integer, + document_id integer, + accepted_at timestamp with time zone DEFAULT now(), + ip_address character varying(45), + user_agent text +); + + +ALTER TABLE data.legal_acceptances OWNER TO kincses; + +-- +-- Name: legal_acceptances_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.legal_acceptances_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.legal_acceptances_id_seq OWNER TO kincses; + +-- +-- Name: legal_acceptances_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.legal_acceptances_id_seq OWNED BY data.legal_acceptances.id; + + +-- +-- Name: legal_documents; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.legal_documents ( + id integer NOT NULL, + title character varying(255), + content text NOT NULL, + version character varying(20) NOT NULL, + region_code character varying(5), + language character varying(5), + is_active boolean, + created_at timestamp with time zone DEFAULT now() +); + + +ALTER TABLE data.legal_documents OWNER TO kincses; + +-- +-- Name: legal_documents_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.legal_documents_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.legal_documents_id_seq OWNER TO kincses; + +-- +-- Name: legal_documents_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.legal_documents_id_seq OWNED BY data.legal_documents.id; + + +-- +-- Name: level_configs; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.level_configs ( + id integer NOT NULL, + level_number integer NOT NULL, + min_points integer NOT NULL, + rank_name character varying NOT NULL +); + + +ALTER TABLE data.level_configs OWNER TO kincses; + +-- +-- Name: level_configs_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.level_configs_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.level_configs_id_seq OWNER TO kincses; + +-- +-- Name: level_configs_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.level_configs_id_seq OWNED BY data.level_configs.id; + + +-- +-- Name: locations; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.locations ( + id integer NOT NULL, + name character varying(255), + address text, + latitude numeric(9,6), + longitude numeric(9,6), + created_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP +); + + +ALTER TABLE data.locations OWNER TO kincses; + +-- +-- Name: locations_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.locations_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.locations_id_seq OWNER TO kincses; + +-- +-- Name: locations_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.locations_id_seq OWNED BY data.locations.id; + + +-- +-- Name: org_subscriptions; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.org_subscriptions ( + id integer NOT NULL, + org_id integer, + tier_id integer, + valid_from timestamp with time zone DEFAULT CURRENT_TIMESTAMP, + valid_until timestamp with time zone, + is_active boolean DEFAULT true +); + + +ALTER TABLE data.org_subscriptions OWNER TO kincses; + +-- +-- Name: org_subscriptions_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.org_subscriptions_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.org_subscriptions_id_seq OWNER TO kincses; + +-- +-- Name: org_subscriptions_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.org_subscriptions_id_seq OWNED BY data.org_subscriptions.id; + + +-- +-- Name: organization_locations; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.organization_locations ( + id integer NOT NULL, + organization_id integer, + label character varying(100), + address text, + latitude numeric(10,8), + longitude numeric(11,8), + is_main_location boolean DEFAULT false, + created_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP +); + + +ALTER TABLE data.organization_locations OWNER TO kincses; + +-- +-- Name: organization_locations_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.organization_locations_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.organization_locations_id_seq OWNER TO kincses; + +-- +-- Name: organization_locations_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.organization_locations_id_seq OWNED BY data.organization_locations.id; + + +-- +-- Name: organization_members; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.organization_members ( + id integer NOT NULL, + organization_id integer NOT NULL, + user_id integer NOT NULL, + role public.orguserrole, + is_permanent boolean +); + + +ALTER TABLE data.organization_members OWNER TO kincses; + +-- +-- Name: organization_members_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.organization_members_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.organization_members_id_seq OWNER TO kincses; + +-- +-- Name: organization_members_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.organization_members_id_seq OWNED BY data.organization_members.id; + + +-- +-- Name: organizations; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.organizations ( + id integer NOT NULL, + name character varying NOT NULL, + org_type public.orgtype, + tax_number character varying, + founded_at date, + validation_status public.validationstatus, + owner_id integer, + ui_theme character varying, + created_at timestamp with time zone DEFAULT now(), + theme character varying DEFAULT 'system'::character varying, + is_active boolean DEFAULT true, + slug character varying(100) +); + + +ALTER TABLE data.organizations OWNER TO kincses; + +-- +-- Name: organizations_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.organizations_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.organizations_id_seq OWNER TO kincses; + +-- +-- Name: organizations_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.organizations_id_seq OWNED BY data.organizations.id; + + +-- +-- Name: point_rules; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.point_rules ( + id integer NOT NULL, + action_key character varying NOT NULL, + points integer NOT NULL, + description character varying, + is_active boolean NOT NULL +); + + +ALTER TABLE data.point_rules OWNER TO kincses; + +-- +-- Name: point_rules_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.point_rules_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.point_rules_id_seq OWNER TO kincses; + +-- +-- Name: point_rules_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.point_rules_id_seq OWNED BY data.point_rules.id; + + +-- +-- Name: points_ledger; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.points_ledger ( + id integer NOT NULL, + user_id integer NOT NULL, + points integer NOT NULL, + reason character varying NOT NULL, + created_at timestamp without time zone NOT NULL +); + + +ALTER TABLE data.points_ledger OWNER TO kincses; + +-- +-- Name: points_ledger_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.points_ledger_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.points_ledger_id_seq OWNER TO kincses; + +-- +-- Name: points_ledger_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.points_ledger_id_seq OWNED BY data.points_ledger.id; + + +-- +-- Name: regional_settings; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.regional_settings ( + id integer NOT NULL, + country_code character varying NOT NULL, + currency character varying NOT NULL, + is_active boolean NOT NULL +); + + +ALTER TABLE data.regional_settings OWNER TO kincses; + +-- +-- Name: regional_settings_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.regional_settings_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.regional_settings_id_seq OWNER TO kincses; + +-- +-- Name: regional_settings_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.regional_settings_id_seq OWNED BY data.regional_settings.id; + + +-- +-- Name: service_providers; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.service_providers ( + id integer NOT NULL, + name character varying NOT NULL, + address character varying NOT NULL, + category character varying, + status data.moderation_status_enum NOT NULL, + source data.source_type_enum NOT NULL, + validation_score integer, + evidence_image_path character varying, + added_by_user_id integer, + created_at timestamp without time zone +); + + +ALTER TABLE data.service_providers OWNER TO kincses; + +-- +-- Name: service_providers_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.service_providers_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.service_providers_id_seq OWNER TO kincses; + +-- +-- Name: service_providers_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.service_providers_id_seq OWNED BY data.service_providers.id; + + +-- +-- Name: service_specialties; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.service_specialties ( + id integer NOT NULL, + parent_id integer, + name character varying(100), + slug character varying(100) +); + + +ALTER TABLE data.service_specialties OWNER TO kincses; + +-- +-- Name: service_specialties_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.service_specialties_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.service_specialties_id_seq OWNER TO kincses; + +-- +-- Name: service_specialties_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.service_specialties_id_seq OWNED BY data.service_specialties.id; + + +-- +-- Name: subscription_tiers; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.subscription_tiers ( + id integer NOT NULL, + name character varying(50), + rules jsonb, + is_custom boolean DEFAULT false +); + + +ALTER TABLE data.subscription_tiers OWNER TO kincses; + +-- +-- Name: subscription_tiers_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.subscription_tiers_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.subscription_tiers_id_seq OWNER TO kincses; + +-- +-- Name: subscription_tiers_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.subscription_tiers_id_seq OWNED BY data.subscription_tiers.id; + + +-- +-- Name: system_settings; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.system_settings ( + key_name character varying NOT NULL, + value_json json NOT NULL, + description character varying, + region_code character varying(5), + tier_id integer, + org_id integer +); + + +ALTER TABLE data.system_settings OWNER TO kincses; + +-- +-- Name: translations; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.translations ( + id integer NOT NULL, + key character varying(100) NOT NULL, + lang_code character varying(5) NOT NULL, + value text NOT NULL, + is_published boolean +); + + +ALTER TABLE data.translations OWNER TO kincses; + +-- +-- Name: translations_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.translations_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.translations_id_seq OWNER TO kincses; + +-- +-- Name: translations_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.translations_id_seq OWNED BY data.translations.id; + + +-- +-- Name: user_badges; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.user_badges ( + id integer NOT NULL, + user_id integer NOT NULL, + badge_id integer NOT NULL, + earned_at timestamp without time zone NOT NULL +); + + +ALTER TABLE data.user_badges OWNER TO kincses; + +-- +-- Name: user_badges_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.user_badges_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.user_badges_id_seq OWNER TO kincses; + +-- +-- Name: user_badges_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.user_badges_id_seq OWNED BY data.user_badges.id; + + +-- +-- Name: user_scores; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.user_scores ( + id integer NOT NULL, + user_id integer, + competition_id integer, + points integer, + last_updated timestamp without time zone +); + + +ALTER TABLE data.user_scores OWNER TO kincses; + +-- +-- Name: user_scores_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.user_scores_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.user_scores_id_seq OWNER TO kincses; + +-- +-- Name: user_scores_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.user_scores_id_seq OWNED BY data.user_scores.id; + + +-- +-- Name: user_stats; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.user_stats ( + id integer NOT NULL, + user_id integer NOT NULL, + total_points integer NOT NULL, + current_level integer NOT NULL, + last_activity timestamp without time zone NOT NULL +); + + +ALTER TABLE data.user_stats OWNER TO kincses; + +-- +-- Name: user_stats_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.user_stats_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.user_stats_id_seq OWNER TO kincses; + +-- +-- Name: user_stats_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.user_stats_id_seq OWNED BY data.user_stats.id; + + +-- +-- Name: user_vehicles; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.user_vehicles ( + id integer NOT NULL, + vin character varying NOT NULL, + license_plate character varying NOT NULL, + variant_id integer, + color character varying, + purchase_date timestamp without time zone, + purchase_price double precision, + current_odometer double precision, + extras json, + current_org_id integer, + created_at timestamp with time zone DEFAULT now(), + is_deleted boolean +); + + +ALTER TABLE data.user_vehicles OWNER TO kincses; + +-- +-- Name: user_vehicles_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.user_vehicles_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.user_vehicles_id_seq OWNER TO kincses; + +-- +-- Name: user_vehicles_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.user_vehicles_id_seq OWNED BY data.user_vehicles.id; + + +-- +-- Name: users; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.users ( + id integer NOT NULL, + email character varying NOT NULL, + first_name character varying, + last_name character varying, + birthday date, + is_active boolean, + is_banned boolean, + is_gdpr_deleted boolean, + previous_login_count integer, + created_at timestamp with time zone DEFAULT now(), + verified_at timestamp with time zone, + hashed_password character varying, + role character varying DEFAULT 'user'::character varying, + is_superuser boolean DEFAULT false, + is_company boolean DEFAULT false, + updated_at timestamp with time zone, + company_name character varying, + tax_number character varying, + region_code character varying DEFAULT 'HU'::character varying +); + + +ALTER TABLE data.users OWNER TO kincses; + +-- +-- Name: users_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.users_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.users_id_seq OWNER TO kincses; + +-- +-- Name: users_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.users_id_seq OWNED BY data.users.id; + + +-- +-- Name: vehicle_brands; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.vehicle_brands ( + id integer NOT NULL, + name character varying NOT NULL, + origin_country character varying, + slug character varying, + country_code character varying, + category_id integer +); + + +ALTER TABLE data.vehicle_brands OWNER TO kincses; + +-- +-- Name: vehicle_brands_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.vehicle_brands_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.vehicle_brands_id_seq OWNER TO kincses; + +-- +-- Name: vehicle_brands_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.vehicle_brands_id_seq OWNED BY data.vehicle_brands.id; + + +-- +-- Name: vehicle_categories; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.vehicle_categories ( + id integer NOT NULL, + name character varying NOT NULL, + slug character varying +); + + +ALTER TABLE data.vehicle_categories OWNER TO kincses; + +-- +-- Name: vehicle_categories_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.vehicle_categories_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.vehicle_categories_id_seq OWNER TO kincses; + +-- +-- Name: vehicle_categories_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.vehicle_categories_id_seq OWNED BY data.vehicle_categories.id; + + +-- +-- Name: vehicle_events; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.vehicle_events ( + id integer NOT NULL, + vehicle_id integer, + service_provider_id integer, + event_type character varying(100), + description text, + odometer_reading integer, + event_date timestamp with time zone DEFAULT CURRENT_TIMESTAMP +); + + +ALTER TABLE data.vehicle_events OWNER TO kincses; + +-- +-- Name: vehicle_events_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.vehicle_events_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.vehicle_events_id_seq OWNER TO kincses; + +-- +-- Name: vehicle_events_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.vehicle_events_id_seq OWNED BY data.vehicle_events.id; + + +-- +-- Name: vehicle_models; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.vehicle_models ( + id integer NOT NULL, + brand_id integer, + category_id integer, + name character varying NOT NULL, + year_start integer, + year_end integer, + slug character varying +); + + +ALTER TABLE data.vehicle_models OWNER TO kincses; + +-- +-- Name: vehicle_models_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.vehicle_models_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.vehicle_models_id_seq OWNER TO kincses; + +-- +-- Name: vehicle_models_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.vehicle_models_id_seq OWNED BY data.vehicle_models.id; + + +-- +-- Name: vehicle_ownership; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.vehicle_ownership ( + id integer NOT NULL, + vehicle_id integer NOT NULL, + user_id integer NOT NULL, + role character varying(20), + license_plate character varying(20), + is_active boolean, + start_date date DEFAULT CURRENT_DATE, + end_date date +); + + +ALTER TABLE data.vehicle_ownership OWNER TO kincses; + +-- +-- Name: vehicle_ownership_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.vehicle_ownership_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.vehicle_ownership_id_seq OWNER TO kincses; + +-- +-- Name: vehicle_ownership_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.vehicle_ownership_id_seq OWNED BY data.vehicle_ownership.id; + + +-- +-- Name: vehicle_variants; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.vehicle_variants ( + id integer NOT NULL, + model_id integer, + engine_size double precision, + power_kw double precision, + spec_data json +); + + +ALTER TABLE data.vehicle_variants OWNER TO kincses; + +-- +-- Name: vehicle_variants_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.vehicle_variants_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.vehicle_variants_id_seq OWNER TO kincses; + +-- +-- Name: vehicle_variants_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.vehicle_variants_id_seq OWNED BY data.vehicle_variants.id; + + +-- +-- Name: vehicles; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.vehicles ( + id integer NOT NULL, + model_id integer NOT NULL, + license_plate character varying(20), + vin character varying(50), + manufacture_year integer, + color character varying(50), + created_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP, + updated_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP, + category character varying(50), + current_odometer integer DEFAULT 0, + engine_number character varying(100), + base_color character varying(50) +); + + +ALTER TABLE data.vehicles OWNER TO kincses; + +-- +-- Name: vehicles_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.vehicles_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.vehicles_id_seq OWNER TO kincses; + +-- +-- Name: vehicles_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.vehicles_id_seq OWNED BY data.vehicles.id; + + +-- +-- Name: verification_tokens; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.verification_tokens ( + id integer NOT NULL, + user_id integer, + token character varying(255), + token_type public.tokentype, + expires_at timestamp with time zone, + created_at timestamp with time zone DEFAULT now(), + token_hash text, + is_used boolean DEFAULT false +); + + +ALTER TABLE data.verification_tokens OWNER TO kincses; + +-- +-- Name: verification_tokens_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.verification_tokens_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.verification_tokens_id_seq OWNER TO kincses; + +-- +-- Name: verification_tokens_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.verification_tokens_id_seq OWNED BY data.verification_tokens.id; + + +-- +-- Name: votes; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.votes ( + id integer NOT NULL, + user_id integer NOT NULL, + provider_id integer NOT NULL, + vote_value integer NOT NULL +); + + +ALTER TABLE data.votes OWNER TO kincses; + +-- +-- Name: votes_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.votes_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.votes_id_seq OWNER TO kincses; + +-- +-- Name: votes_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.votes_id_seq OWNED BY data.votes.id; + + +-- +-- Name: alembic_version; Type: TABLE; Schema: public; Owner: kincses +-- + +CREATE TABLE public.alembic_version ( + version_num character varying(32) NOT NULL +); + + +ALTER TABLE public.alembic_version OWNER TO kincses; + +-- +-- Name: audit_logs id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.audit_logs ALTER COLUMN id SET DEFAULT nextval('data.audit_logs_id_seq'::regclass); + + +-- +-- Name: badges id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.badges ALTER COLUMN id SET DEFAULT nextval('data.badges_id_seq'::regclass); + + +-- +-- Name: companies id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.companies ALTER COLUMN id SET DEFAULT nextval('data.companies_id_seq'::regclass); + + +-- +-- Name: company_members id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.company_members ALTER COLUMN id SET DEFAULT nextval('data.company_members_id_seq'::regclass); + + +-- +-- Name: competitions id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.competitions ALTER COLUMN id SET DEFAULT nextval('data.competitions_id_seq'::regclass); + + +-- +-- Name: credit_logs id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.credit_logs ALTER COLUMN id SET DEFAULT nextval('data.credit_logs_id_seq'::regclass); + + +-- +-- Name: email_logs id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.email_logs ALTER COLUMN id SET DEFAULT nextval('data.email_logs_id_seq'::regclass); + + +-- +-- Name: email_provider_configs id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.email_provider_configs ALTER COLUMN id SET DEFAULT nextval('data.email_provider_configs_id_seq'::regclass); + + +-- +-- Name: email_providers id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.email_providers ALTER COLUMN id SET DEFAULT nextval('data.email_providers_id_seq'::regclass); + + +-- +-- Name: email_templates id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.email_templates ALTER COLUMN id SET DEFAULT nextval('data.email_templates_id_seq'::regclass); + + +-- +-- Name: legal_acceptances id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.legal_acceptances ALTER COLUMN id SET DEFAULT nextval('data.legal_acceptances_id_seq'::regclass); + + +-- +-- Name: legal_documents id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.legal_documents ALTER COLUMN id SET DEFAULT nextval('data.legal_documents_id_seq'::regclass); + + +-- +-- Name: level_configs id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.level_configs ALTER COLUMN id SET DEFAULT nextval('data.level_configs_id_seq'::regclass); + + +-- +-- Name: locations id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.locations ALTER COLUMN id SET DEFAULT nextval('data.locations_id_seq'::regclass); + + +-- +-- Name: org_subscriptions id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.org_subscriptions ALTER COLUMN id SET DEFAULT nextval('data.org_subscriptions_id_seq'::regclass); + + +-- +-- Name: organization_locations id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.organization_locations ALTER COLUMN id SET DEFAULT nextval('data.organization_locations_id_seq'::regclass); + + +-- +-- Name: organization_members id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.organization_members ALTER COLUMN id SET DEFAULT nextval('data.organization_members_id_seq'::regclass); + + +-- +-- Name: organizations id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.organizations ALTER COLUMN id SET DEFAULT nextval('data.organizations_id_seq'::regclass); + + +-- +-- Name: point_rules id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.point_rules ALTER COLUMN id SET DEFAULT nextval('data.point_rules_id_seq'::regclass); + + +-- +-- Name: points_ledger id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.points_ledger ALTER COLUMN id SET DEFAULT nextval('data.points_ledger_id_seq'::regclass); + + +-- +-- Name: regional_settings id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.regional_settings ALTER COLUMN id SET DEFAULT nextval('data.regional_settings_id_seq'::regclass); + + +-- +-- Name: service_providers id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.service_providers ALTER COLUMN id SET DEFAULT nextval('data.service_providers_id_seq'::regclass); + + +-- +-- Name: service_specialties id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.service_specialties ALTER COLUMN id SET DEFAULT nextval('data.service_specialties_id_seq'::regclass); + + +-- +-- Name: subscription_tiers id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.subscription_tiers ALTER COLUMN id SET DEFAULT nextval('data.subscription_tiers_id_seq'::regclass); + + +-- +-- Name: translations id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.translations ALTER COLUMN id SET DEFAULT nextval('data.translations_id_seq'::regclass); + + +-- +-- Name: user_badges id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.user_badges ALTER COLUMN id SET DEFAULT nextval('data.user_badges_id_seq'::regclass); + + +-- +-- Name: user_scores id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.user_scores ALTER COLUMN id SET DEFAULT nextval('data.user_scores_id_seq'::regclass); + + +-- +-- Name: user_stats id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.user_stats ALTER COLUMN id SET DEFAULT nextval('data.user_stats_id_seq'::regclass); + + +-- +-- Name: user_vehicles id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.user_vehicles ALTER COLUMN id SET DEFAULT nextval('data.user_vehicles_id_seq'::regclass); + + +-- +-- Name: users id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.users ALTER COLUMN id SET DEFAULT nextval('data.users_id_seq'::regclass); + + +-- +-- Name: vehicle_brands id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicle_brands ALTER COLUMN id SET DEFAULT nextval('data.vehicle_brands_id_seq'::regclass); + + +-- +-- Name: vehicle_categories id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicle_categories ALTER COLUMN id SET DEFAULT nextval('data.vehicle_categories_id_seq'::regclass); + + +-- +-- Name: vehicle_events id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicle_events ALTER COLUMN id SET DEFAULT nextval('data.vehicle_events_id_seq'::regclass); + + +-- +-- Name: vehicle_models id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicle_models ALTER COLUMN id SET DEFAULT nextval('data.vehicle_models_id_seq'::regclass); + + +-- +-- Name: vehicle_ownership id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicle_ownership ALTER COLUMN id SET DEFAULT nextval('data.vehicle_ownership_id_seq'::regclass); + + +-- +-- Name: vehicle_variants id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicle_variants ALTER COLUMN id SET DEFAULT nextval('data.vehicle_variants_id_seq'::regclass); + + +-- +-- Name: vehicles id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicles ALTER COLUMN id SET DEFAULT nextval('data.vehicles_id_seq'::regclass); + + +-- +-- Name: verification_tokens id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.verification_tokens ALTER COLUMN id SET DEFAULT nextval('data.verification_tokens_id_seq'::regclass); + + +-- +-- Name: votes id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.votes ALTER COLUMN id SET DEFAULT nextval('data.votes_id_seq'::regclass); + + +-- +-- Data for Name: audit_logs; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.audit_logs (id, user_id, action, endpoint, method, payload, ip_address, user_agent, created_at) FROM stdin; +4 4 USER_REGISTERED /api/v2/auth/register POST \N 192.168.100.179 \N 2026-01-28 19:37:19.225767+00 +\. + + +-- +-- Data for Name: badges; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.badges (id, name, description, icon_url) FROM stdin; +\. + + +-- +-- Data for Name: companies; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.companies (id, name, tax_number, subscription_tier, owner_id) FROM stdin; +\. + + +-- +-- Data for Name: company_members; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.company_members (id, company_id, user_id, role, can_edit_service, can_see_costs, is_active) FROM stdin; +\. + + +-- +-- Data for Name: competitions; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.competitions (id, name, description, start_date, end_date, is_active) FROM stdin; +\. + + +-- +-- Data for Name: credit_logs; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.credit_logs (id, org_id, amount, description, created_at) FROM stdin; +2 1 10000.00 Kezdő tesztkeret 2026-01-26 22:47:12.891324+00 +\. + + +-- +-- Data for Name: email_logs; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.email_logs (id, email, type, sent_at, recipient, user_id, provider_id, status, email_type) FROM stdin; +1 \N \N 2026-01-28 19:37:19.482744+00 zs.gyongyossy@gmail.com 4 5 sent registration +\. + + +-- +-- Data for Name: email_provider_configs; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.email_provider_configs (id, name, provider_type, priority, settings, is_active, fail_count, max_fail_threshold, success_rate) FROM stdin; +1 SendGrid_Primary SENDGRID 1 {"api_key": "YOUR_SENDGRID_KEY_HERE"} t 0 3 100 +\. + + +-- +-- Data for Name: email_providers; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.email_providers (id, name, priority, provider_type, host, port, username, password_hash, is_active, daily_limit, current_daily_usage) FROM stdin; +2 Resend_Backup 2 API \N \N \N \N f 3000 0 +5 SendGrid 1 SMTP smtp.sendgrid.net 587 apikey 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 t 100 0 +\. + + +-- +-- Data for Name: email_templates; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.email_templates (id, type, subject, body_html) FROM stdin; +1 REGISTRATION Üdvözöljük a Service Finderben! \n

Kedves {{ name }}!

\n

Köszönjük a regisztrációt! Az aktiváláshoz kattints ide:

\n Fiók aktiválása\n

A link 24 óráig érvényes.

\n +\. + + +-- +-- Data for Name: legal_acceptances; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.legal_acceptances (id, user_id, document_id, accepted_at, ip_address, user_agent) FROM stdin; +\. + + +-- +-- Data for Name: legal_documents; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.legal_documents (id, title, content, version, region_code, language, is_active, created_at) FROM stdin; +1 Általános Szerződési Feltételek Ide jön az ÁSZF szövege... Kérjük görgessen az aljáig. v1.0 HU hu t 2026-01-26 10:09:00.632463+00 +2 Adatkezelési Tájékoztató (GDPR) Ide jön a GDPR szövege... Kérjük görgessen az aljáig. v1.0 HU hu t 2026-01-26 10:09:00.632463+00 +\. + + +-- +-- Data for Name: level_configs; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.level_configs (id, level_number, min_points, rank_name) FROM stdin; +\. + + +-- +-- Data for Name: locations; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.locations (id, name, address, latitude, longitude, created_at) FROM stdin; +\. + + +-- +-- Data for Name: org_subscriptions; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.org_subscriptions (id, org_id, tier_id, valid_from, valid_until, is_active) FROM stdin; +1 1 3 2026-01-26 22:47:12.891324+00 2030-01-01 00:00:00+00 t +\. + + +-- +-- Data for Name: organization_locations; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.organization_locations (id, organization_id, label, address, latitude, longitude, is_main_location, created_at) FROM stdin; +1 2 Budaörsi Telep Budaörs, Fő út 1. 47.46200000 18.95300000 t 2026-01-27 18:39:56.278217+00 +2 2 Pesti Gyorsszerviz Budapest, Váci út 10. 47.53100000 19.06900000 f 2026-01-27 18:39:56.278217+00 +\. + + +-- +-- Data for Name: organization_members; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.organization_members (id, organization_id, user_id, role, is_permanent) FROM stdin; +1 1 1 owner \N +\. + + +-- +-- Data for Name: organizations; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.organizations (id, name, org_type, tax_number, founded_at, validation_status, owner_id, ui_theme, created_at, theme, is_active, slug) FROM stdin; +1 Admin Flotta \N \N \N \N \N \N 2026-01-26 22:47:12.875535+00 system t admin-flotta +2 Gumi Mester Kft. SERVICE \N \N \N \N \N 2026-01-27 18:39:56.278217+00 system t gumi-mester-kft +\. + + +-- +-- Data for Name: point_rules; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.point_rules (id, action_key, points, description, is_active) FROM stdin; +\. + + +-- +-- Data for Name: points_ledger; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.points_ledger (id, user_id, points, reason, created_at) FROM stdin; +\. + + +-- +-- Data for Name: regional_settings; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.regional_settings (id, country_code, currency, is_active) FROM stdin; +\. + + +-- +-- Data for Name: service_providers; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.service_providers (id, name, address, category, status, source, validation_score, evidence_image_path, added_by_user_id, created_at) FROM stdin; +\. + + +-- +-- Data for Name: service_specialties; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.service_specialties (id, parent_id, name, slug) FROM stdin; +1 \N Karosszéria bodywork +2 \N Elektromos hajtás electric-drive +3 1 Fényezés painting +4 1 Lakatos munkák metal-work +9 3 Bolore Blue Technológia bolore-blue +\. + + +-- +-- Data for Name: subscription_tiers; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.subscription_tiers (id, name, rules, is_custom) FROM stdin; +1 Free {"max_vehicles": 1, "ai_verification": false} f +2 Premium {"fleet_report": true, "max_vehicles": 10, "ai_verification": true} f +3 VIP {"max_vehicles": 999, "ai_verification": true, "priority_support": true} f +\. + + +-- +-- Data for Name: system_settings; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.system_settings (key_name, value_json, description, region_code, tier_id, org_id) FROM stdin; +max_vehicles 3 Globális alapértelmezett járműlimit a Free csomagban \N \N \N +weight_distance 0.6 A távolság súlya a rangsorolásban (0.0 - 1.0) \N \N \N +weight_rating 0.4 Az értékelés súlya a rangsorolásban (0.0 - 1.0) \N \N \N +bonus_gold_service 500 Fix bónusz pont Gold fokozatú szervizeknek \N \N \N +match_limit_default 5 Hány találatot mutassunk alapból \N \N \N +audit_log_enabled true Minden felhasználói mozdulat naplózása (true/false) \N \N \N +audit_log_retention_days 90 Hány napig őrizzük meg a naplókat \N \N \N +registration_throttle_minutes 10 Bot-védelem: IP alapú regisztrációs korlát percekben \N \N \N +allowed_countries_list ["AT", "BE", "BG", "CY", "CZ", "DE", "DK", "EE", "ES", "FI", "FR", "GR", "HR", "HU", "IE", "IT", "LT", "LU", "LV", "MT", "NL", "PL", "PT", "RO", "SE", "SI", "SK"] Engedélyezett országkódok listája \N \N \N +\. + + +-- +-- Data for Name: translations; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.translations (id, key, lang_code, value, is_published) FROM stdin; +\. + + +-- +-- Data for Name: user_badges; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.user_badges (id, user_id, badge_id, earned_at) FROM stdin; +\. + + +-- +-- Data for Name: user_scores; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.user_scores (id, user_id, competition_id, points, last_updated) FROM stdin; +\. + + +-- +-- Data for Name: user_stats; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.user_stats (id, user_id, total_points, current_level, last_activity) FROM stdin; +\. + + +-- +-- Data for Name: user_vehicles; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.user_vehicles (id, vin, license_plate, variant_id, color, purchase_date, purchase_price, current_odometer, extras, current_org_id, created_at, is_deleted) FROM stdin; +\. + + +-- +-- Data for Name: users; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.users (id, email, first_name, last_name, birthday, is_active, is_banned, is_gdpr_deleted, previous_login_count, created_at, verified_at, hashed_password, role, is_superuser, is_company, updated_at, company_name, tax_number, region_code) FROM stdin; +1 admin@profibot.hu Admin Profibot \N t \N \N \N 2026-01-26 20:32:23.490817+00 \N $2b$12$97TXbl.pcuJhCzPboqczxeuIW0Lt8OOvT3JrvLIEaBvvgJ1kWcERq admin t f \N \N \N HU +4 zs.gyongyossy@gmail.com zsolt gyongyossy \N t \N \N \N 2026-01-28 19:37:19.225767+00 \N $2b$12$ZGTO7x2timOCvUf/hvehDOfqkCsqddC6nWuScXXGzNe5trsGqQuRi user f f \N \N \N HU +\. + + +-- +-- Data for Name: vehicle_brands; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.vehicle_brands (id, name, origin_country, slug, country_code, category_id) FROM stdin; +1 Honda \N honda JP \N +29 BMW \N bmw \N \N +30 Tesla \N tesla \N \N +31 Yamaha \N yamaha \N \N +32 Scania \N scania \N \N +33 Mercedes-Benz \N mercedes \N \N +35 Toyota \N \N \N 3 +36 Volkswagen \N \N \N 3 +37 Ford \N \N \N 3 +40 Audi \N \N \N 3 +42 Hyundai \N \N \N 3 +43 Kia \N \N \N 3 +44 Mazda \N \N \N 3 +45 Nissan \N \N \N 3 +46 Opel \N \N \N 3 +47 Peugeot \N \N \N 3 +48 Renault \N \N \N 3 +49 Skoda \N \N \N 3 +50 Suzuki \N \N \N 3 +51 Volvo \N \N \N 3 +52 Fiat \N \N \N 3 +53 Dacia \N \N \N 3 +54 Citroen \N \N \N 3 +56 Lexus \N \N \N 3 +57 Alfa Romeo \N \N \N 3 +58 Jaguar \N \N \N 3 +59 Land Rover \N \N \N 3 +60 Mitsubishi \N \N \N 3 +61 Subaru \N \N \N 3 +62 Seat \N \N \N 3 +63 Cupra \N \N \N 3 +64 Jeep \N \N \N 3 +65 Chevrolet \N \N \N 3 +66 Cadillac \N \N \N 3 +67 Buick \N \N \N 3 +68 GMC \N \N \N 3 +69 Dodge \N \N \N 3 +70 Ram \N \N \N 3 +71 Chrysler \N \N \N 3 +72 Acura \N \N \N 3 +73 Infiniti \N \N \N 3 +74 Lincoln \N \N \N 3 +75 Porsche \N \N \N 3 +76 Mini \N \N \N 3 +77 Smart \N \N \N 3 +78 Bentley \N \N \N 3 +79 Rolls-Royce \N \N \N 3 +80 Lamborghini \N \N \N 3 +81 Ferrari \N \N \N 3 +82 Maserati \N \N \N 3 +83 Aston Martin \N \N \N 3 +84 Bugatti \N \N \N 3 +85 Lotus \N \N \N 3 +86 McLaren \N \N \N 3 +87 Polestar \N \N \N 3 +88 Genesis \N \N \N 3 +89 BYD \N \N \N 3 +90 Geely \N \N \N 3 +91 Chery \N \N \N 3 +92 MG \N \N \N 3 +93 Lada \N \N \N 3 +94 Iveco \N \N \N 3 +95 Isuzu \N \N \N 3 +96 SsangYong \N \N \N 3 +97 Rover \N \N \N 3 +98 Saab \N \N \N 3 +99 Lancia \N \N \N 3 +100 Pontiac \N \N \N 3 +101 Saturn \N \N \N 3 +102 Hummer \N \N \N 3 +103 Oldsmobile \N \N \N 3 +106 Kawasaki \N \N \N 4 +108 BMW Motorrad \N \N \N 4 +109 Harley-Davidson \N \N \N 4 +110 Ducati \N \N \N 4 +111 KTM \N \N \N 4 +112 Triumph \N \N \N 4 +113 Royal Enfield \N \N \N 4 +114 Indian \N \N \N 4 +115 Aprilia \N \N \N 4 +116 Moto Guzzi \N \N \N 4 +117 Vespa \N \N \N 4 +118 Piaggio \N \N \N 4 +119 MV Agusta \N \N \N 4 +120 Norton \N \N \N 4 +121 Husqvarna \N \N \N 4 +122 Benelli \N \N \N 4 +123 Bimota \N \N \N 4 +124 Beta \N \N \N 4 +125 Gas Gas \N \N \N 4 +126 Sherco \N \N \N 4 +127 CF Moto \N \N \N 4 +128 Hyosung \N \N \N 4 +129 Keeway \N \N \N 4 +130 SYM \N \N \N 4 +131 Kymco \N \N \N 4 +132 Bajaj \N \N \N 4 +133 Zero \N \N \N 4 +135 Volvo Trucks \N \N \N 5 +136 MAN \N \N \N 5 +137 DAF \N \N \N 5 +139 Mercedes-Benz Trucks \N \N \N 5 +140 Renault Trucks \N \N \N 5 +141 MACK \N \N \N 5 +142 Peterbilt \N \N \N 5 +143 Kenworth \N \N \N 5 +144 Ford Commercial \N \N \N 6 +145 Volkswagen Commercial \N \N \N 6 +146 Iveco Daily \N \N \N 6 +147 Mercedes-Benz Vans \N \N \N 6 +148 Fiat Professional \N \N \N 6 +\. + + +-- +-- Data for Name: vehicle_categories; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.vehicle_categories (id, name, slug) FROM stdin; +1 Személyautó car +2 Motorkerékpár motorcycle +3 CAR \N +4 MOTORCYCLE \N +5 TRUCK \N +6 VAN \N +\. + + +-- +-- Data for Name: vehicle_events; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.vehicle_events (id, vehicle_id, service_provider_id, event_type, description, odometer_reading, event_date) FROM stdin; +\. + + +-- +-- Data for Name: vehicle_models; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.vehicle_models (id, brand_id, category_id, name, year_start, year_end, slug) FROM stdin; +1 1 \N Civic \N \N civic +2 1 \N Accord \N \N accord +3 1 \N CR-V \N \N cr-v +4 1 \N Jazz \N \N jazz +5 1 \N HR-V \N \N hr-v +6 1 \N NSX \N \N nsx +34 29 \N 320d \N \N 320d +35 30 \N Model 3 \N \N model-3 +36 31 \N MT-07 \N \N mt-07 +37 32 \N R500 \N \N r500 +38 33 \N Actros \N \N actros +39 1 \N Africa Twin \N \N africa-twin +44 1 \N CB 500 \N \N \N +46 29 \N 3 Series \N \N \N +47 29 \N 5 Series \N \N \N +48 29 \N X5 \N \N \N +49 29 \N X3 \N \N \N +50 29 \N 1 Series \N \N \N +51 29 \N 7 Series \N \N \N +53 31 \N R1 \N \N \N +54 31 \N Tracer 900 \N \N \N +55 31 \N Ténéré 700 \N \N \N +56 31 \N XMAX \N \N \N +57 32 \N R-series \N \N \N +58 32 \N S-series \N \N \N +59 32 \N G-series \N \N \N +60 32 \N P-series \N \N \N +61 35 \N Corolla \N \N \N +62 35 \N Yaris \N \N \N +63 35 \N Hilux \N \N \N +64 35 \N RAV4 \N \N \N +65 35 \N C-HR \N \N \N +66 35 \N Avensis \N \N \N +67 35 \N Land Cruiser \N \N \N +68 36 \N Golf \N \N \N +69 36 \N Passat \N \N \N +70 36 \N Polo \N \N \N +71 36 \N Tiguan \N \N \N +72 36 \N Touran \N \N \N +73 36 \N Transporter \N \N \N +74 36 \N Caddy \N \N \N +\. + + +-- +-- Data for Name: vehicle_ownership; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.vehicle_ownership (id, vehicle_id, user_id, role, license_plate, is_active, start_date, end_date) FROM stdin; +1 3 1 owner BMW-320-DE t 2026-01-26 \N +2 4 1 owner EL-TESLA-01 t 2026-01-26 \N +3 5 1 owner MOTO-001 t 2026-01-26 \N +4 6 1 owner HON-AFR-01 t 2026-01-26 \N +5 7 1 owner TRUCK-01 t 2026-01-26 \N +6 8 1 owner KAMION-01 t 2026-01-26 \N +\. + + +-- +-- Data for Name: vehicle_variants; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.vehicle_variants (id, model_id, engine_size, power_kw, spec_data) FROM stdin; +\. + + +-- +-- Data for Name: vehicles; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.vehicles (id, model_id, license_plate, vin, manufacture_year, color, created_at, updated_at, category, current_odometer, engine_number, base_color) FROM stdin; +1 1 PRO-F1-01 HONDA123456789 2024 Sonic Grey 2026-01-26 20:39:18.015641+00 2026-01-26 20:39:18.015641+00 \N 0 \N \N +3 34 \N VIN-BMW-CAR-001 2022 \N 2026-01-26 21:48:09.085387+00 2026-01-26 21:48:09.085387+00 land 45000 \N \N +4 35 \N VIN-TSL-ELE-002 2023 \N 2026-01-26 21:48:09.085387+00 2026-01-26 21:48:09.085387+00 land 12000 \N \N +5 36 \N VIN-YAM-MOT-003 2021 \N 2026-01-26 21:48:09.085387+00 2026-01-26 21:48:09.085387+00 land 8500 \N \N +6 39 \N VIN-HON-MOT-004 2024 \N 2026-01-26 21:48:09.085387+00 2026-01-26 21:48:09.085387+00 land 500 \N \N +7 37 \N VIN-SCA-TRU-005 2020 \N 2026-01-26 21:48:09.085387+00 2026-01-26 21:48:09.085387+00 land 350000 \N \N +8 38 \N VIN-MER-TRU-006 2021 \N 2026-01-26 21:48:09.085387+00 2026-01-26 21:48:09.085387+00 land 280000 \N \N +\. + + +-- +-- Data for Name: verification_tokens; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.verification_tokens (id, user_id, token, token_type, expires_at, created_at, token_hash, is_used) FROM stdin; +4 4 \N email_verify 2026-01-30 19:37:19.480563+00 2026-01-28 19:37:19.225767+00 8eba078dc9ab1f95c7189efb68723b19146e34b4e48dc6e30dfee3b4f2655532 t +\. + + +-- +-- Data for Name: votes; Type: TABLE DATA; Schema: data; Owner: kincses +-- + +COPY data.votes (id, user_id, provider_id, vote_value) FROM stdin; +\. + + +-- +-- Data for Name: alembic_version; Type: TABLE DATA; Schema: public; Owner: kincses +-- + +COPY public.alembic_version (version_num) FROM stdin; +10b73fee8967 +\. + + +-- +-- Name: audit_logs_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.audit_logs_id_seq', 4, true); + + +-- +-- Name: badges_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.badges_id_seq', 1, false); + + +-- +-- Name: companies_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.companies_id_seq', 1, false); + + +-- +-- Name: company_members_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.company_members_id_seq', 1, false); + + +-- +-- Name: competitions_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.competitions_id_seq', 1, false); + + +-- +-- Name: credit_logs_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.credit_logs_id_seq', 2, true); + + +-- +-- Name: email_logs_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.email_logs_id_seq', 1, true); + + +-- +-- Name: email_provider_configs_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.email_provider_configs_id_seq', 1, true); + + +-- +-- Name: email_providers_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.email_providers_id_seq', 5, true); + + +-- +-- Name: email_templates_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.email_templates_id_seq', 1, true); + + +-- +-- Name: legal_acceptances_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.legal_acceptances_id_seq', 1, false); + + +-- +-- Name: legal_documents_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.legal_documents_id_seq', 2, true); + + +-- +-- Name: level_configs_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.level_configs_id_seq', 1, false); + + +-- +-- Name: locations_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.locations_id_seq', 1, false); + + +-- +-- Name: org_subscriptions_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.org_subscriptions_id_seq', 1, true); + + +-- +-- Name: organization_locations_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.organization_locations_id_seq', 2, true); + + +-- +-- Name: organization_members_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.organization_members_id_seq', 1, true); + + +-- +-- Name: organizations_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.organizations_id_seq', 2, true); + + +-- +-- Name: point_rules_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.point_rules_id_seq', 1, false); + + +-- +-- Name: points_ledger_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.points_ledger_id_seq', 1, false); + + +-- +-- Name: regional_settings_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.regional_settings_id_seq', 1, false); + + +-- +-- Name: service_providers_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.service_providers_id_seq', 1, false); + + +-- +-- Name: service_specialties_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.service_specialties_id_seq', 9, true); + + +-- +-- Name: subscription_tiers_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.subscription_tiers_id_seq', 6, true); + + +-- +-- Name: translations_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.translations_id_seq', 1, false); + + +-- +-- Name: user_badges_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.user_badges_id_seq', 1, false); + + +-- +-- Name: user_scores_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.user_scores_id_seq', 1, false); + + +-- +-- Name: user_stats_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.user_stats_id_seq', 1, false); + + +-- +-- Name: user_vehicles_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.user_vehicles_id_seq', 1, false); + + +-- +-- Name: users_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.users_id_seq', 4, true); + + +-- +-- Name: vehicle_brands_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.vehicle_brands_id_seq', 149, true); + + +-- +-- Name: vehicle_categories_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.vehicle_categories_id_seq', 15, true); + + +-- +-- Name: vehicle_events_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.vehicle_events_id_seq', 1, false); + + +-- +-- Name: vehicle_models_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.vehicle_models_id_seq', 74, true); + + +-- +-- Name: vehicle_ownership_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.vehicle_ownership_id_seq', 6, true); + + +-- +-- Name: vehicle_variants_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.vehicle_variants_id_seq', 1, false); + + +-- +-- Name: vehicles_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.vehicles_id_seq', 8, true); + + +-- +-- Name: verification_tokens_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.verification_tokens_id_seq', 4, true); + + +-- +-- Name: votes_id_seq; Type: SEQUENCE SET; Schema: data; Owner: kincses +-- + +SELECT pg_catalog.setval('data.votes_id_seq', 1, false); + + +-- +-- Name: audit_logs audit_logs_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.audit_logs + ADD CONSTRAINT audit_logs_pkey PRIMARY KEY (id); + + +-- +-- Name: badges badges_name_key; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.badges + ADD CONSTRAINT badges_name_key UNIQUE (name); + + +-- +-- Name: badges badges_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.badges + ADD CONSTRAINT badges_pkey PRIMARY KEY (id); + + +-- +-- Name: companies companies_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.companies + ADD CONSTRAINT companies_pkey PRIMARY KEY (id); + + +-- +-- Name: company_members company_members_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.company_members + ADD CONSTRAINT company_members_pkey PRIMARY KEY (id); + + +-- +-- Name: competitions competitions_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.competitions + ADD CONSTRAINT competitions_pkey PRIMARY KEY (id); + + +-- +-- Name: credit_logs credit_logs_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.credit_logs + ADD CONSTRAINT credit_logs_pkey PRIMARY KEY (id); + + +-- +-- Name: email_logs email_logs_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.email_logs + ADD CONSTRAINT email_logs_pkey PRIMARY KEY (id); + + +-- +-- Name: email_provider_configs email_provider_configs_name_key; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.email_provider_configs + ADD CONSTRAINT email_provider_configs_name_key UNIQUE (name); + + +-- +-- Name: email_provider_configs email_provider_configs_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.email_provider_configs + ADD CONSTRAINT email_provider_configs_pkey PRIMARY KEY (id); + + +-- +-- Name: email_providers email_providers_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.email_providers + ADD CONSTRAINT email_providers_pkey PRIMARY KEY (id); + + +-- +-- Name: email_templates email_templates_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.email_templates + ADD CONSTRAINT email_templates_pkey PRIMARY KEY (id); + + +-- +-- Name: legal_acceptances legal_acceptances_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.legal_acceptances + ADD CONSTRAINT legal_acceptances_pkey PRIMARY KEY (id); + + +-- +-- Name: legal_documents legal_documents_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.legal_documents + ADD CONSTRAINT legal_documents_pkey PRIMARY KEY (id); + + +-- +-- Name: level_configs level_configs_level_number_key; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.level_configs + ADD CONSTRAINT level_configs_level_number_key UNIQUE (level_number); + + +-- +-- Name: level_configs level_configs_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.level_configs + ADD CONSTRAINT level_configs_pkey PRIMARY KEY (id); + + +-- +-- Name: locations locations_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.locations + ADD CONSTRAINT locations_pkey PRIMARY KEY (id); + + +-- +-- Name: org_subscriptions org_subscriptions_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.org_subscriptions + ADD CONSTRAINT org_subscriptions_pkey PRIMARY KEY (id); + + +-- +-- Name: organization_locations organization_locations_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.organization_locations + ADD CONSTRAINT organization_locations_pkey PRIMARY KEY (id); + + +-- +-- Name: organization_members organization_members_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.organization_members + ADD CONSTRAINT organization_members_pkey PRIMARY KEY (id); + + +-- +-- Name: organizations organizations_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.organizations + ADD CONSTRAINT organizations_pkey PRIMARY KEY (id); + + +-- +-- Name: point_rules point_rules_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.point_rules + ADD CONSTRAINT point_rules_pkey PRIMARY KEY (id); + + +-- +-- Name: points_ledger points_ledger_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.points_ledger + ADD CONSTRAINT points_ledger_pkey PRIMARY KEY (id); + + +-- +-- Name: regional_settings regional_settings_country_code_key; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.regional_settings + ADD CONSTRAINT regional_settings_country_code_key UNIQUE (country_code); + + +-- +-- Name: regional_settings regional_settings_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.regional_settings + ADD CONSTRAINT regional_settings_pkey PRIMARY KEY (id); + + +-- +-- Name: service_providers service_providers_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.service_providers + ADD CONSTRAINT service_providers_pkey PRIMARY KEY (id); + + +-- +-- Name: service_specialties service_specialties_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.service_specialties + ADD CONSTRAINT service_specialties_pkey PRIMARY KEY (id); + + +-- +-- Name: service_specialties service_specialties_slug_key; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.service_specialties + ADD CONSTRAINT service_specialties_slug_key UNIQUE (slug); + + +-- +-- Name: subscription_tiers subscription_tiers_name_key; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.subscription_tiers + ADD CONSTRAINT subscription_tiers_name_key UNIQUE (name); + + +-- +-- Name: subscription_tiers subscription_tiers_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.subscription_tiers + ADD CONSTRAINT subscription_tiers_pkey PRIMARY KEY (id); + + +-- +-- Name: system_settings system_settings_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.system_settings + ADD CONSTRAINT system_settings_pkey PRIMARY KEY (key_name); + + +-- +-- Name: translations translations_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.translations + ADD CONSTRAINT translations_pkey PRIMARY KEY (id); + + +-- +-- Name: vehicles uni_vin; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicles + ADD CONSTRAINT uni_vin UNIQUE (vin); + + +-- +-- Name: email_providers unique_provider_name; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.email_providers + ADD CONSTRAINT unique_provider_name UNIQUE (name); + + +-- +-- Name: organization_members unique_user_org; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.organization_members + ADD CONSTRAINT unique_user_org UNIQUE (organization_id, user_id); + + +-- +-- Name: translations uq_translation_key_lang; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.translations + ADD CONSTRAINT uq_translation_key_lang UNIQUE (key, lang_code); + + +-- +-- Name: user_scores uq_user_competition_score; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.user_scores + ADD CONSTRAINT uq_user_competition_score UNIQUE (user_id, competition_id); + + +-- +-- Name: votes uq_user_provider_vote; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.votes + ADD CONSTRAINT uq_user_provider_vote UNIQUE (user_id, provider_id); + + +-- +-- Name: user_badges user_badges_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.user_badges + ADD CONSTRAINT user_badges_pkey PRIMARY KEY (id); + + +-- +-- Name: user_scores user_scores_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.user_scores + ADD CONSTRAINT user_scores_pkey PRIMARY KEY (id); + + +-- +-- Name: user_stats user_stats_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.user_stats + ADD CONSTRAINT user_stats_pkey PRIMARY KEY (id); + + +-- +-- Name: user_stats user_stats_user_id_key; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.user_stats + ADD CONSTRAINT user_stats_user_id_key UNIQUE (user_id); + + +-- +-- Name: user_vehicles user_vehicles_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.user_vehicles + ADD CONSTRAINT user_vehicles_pkey PRIMARY KEY (id); + + +-- +-- Name: users users_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.users + ADD CONSTRAINT users_pkey PRIMARY KEY (id); + + +-- +-- Name: vehicle_brands vehicle_brands_cat_name_key; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicle_brands + ADD CONSTRAINT vehicle_brands_cat_name_key UNIQUE (category_id, name); + + +-- +-- Name: vehicle_brands vehicle_brands_name_key; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicle_brands + ADD CONSTRAINT vehicle_brands_name_key UNIQUE (name); + + +-- +-- Name: vehicle_brands vehicle_brands_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicle_brands + ADD CONSTRAINT vehicle_brands_pkey PRIMARY KEY (id); + + +-- +-- Name: vehicle_categories vehicle_categories_name_key; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicle_categories + ADD CONSTRAINT vehicle_categories_name_key UNIQUE (name); + + +-- +-- Name: vehicle_categories vehicle_categories_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicle_categories + ADD CONSTRAINT vehicle_categories_pkey PRIMARY KEY (id); + + +-- +-- Name: vehicle_events vehicle_events_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicle_events + ADD CONSTRAINT vehicle_events_pkey PRIMARY KEY (id); + + +-- +-- Name: vehicle_models vehicle_models_brand_name_key; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicle_models + ADD CONSTRAINT vehicle_models_brand_name_key UNIQUE (brand_id, name); + + +-- +-- Name: vehicle_models vehicle_models_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicle_models + ADD CONSTRAINT vehicle_models_pkey PRIMARY KEY (id); + + +-- +-- Name: vehicle_ownership vehicle_ownership_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicle_ownership + ADD CONSTRAINT vehicle_ownership_pkey PRIMARY KEY (id); + + +-- +-- Name: vehicle_variants vehicle_variants_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicle_variants + ADD CONSTRAINT vehicle_variants_pkey PRIMARY KEY (id); + + +-- +-- Name: vehicles vehicles_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicles + ADD CONSTRAINT vehicles_pkey PRIMARY KEY (id); + + +-- +-- Name: verification_tokens verification_tokens_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.verification_tokens + ADD CONSTRAINT verification_tokens_pkey PRIMARY KEY (id); + + +-- +-- Name: votes votes_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.votes + ADD CONSTRAINT votes_pkey PRIMARY KEY (id); + + +-- +-- Name: alembic_version alembic_version_pkc; Type: CONSTRAINT; Schema: public; Owner: kincses +-- + +ALTER TABLE ONLY public.alembic_version + ADD CONSTRAINT alembic_version_pkc PRIMARY KEY (version_num); + + +-- +-- Name: idx_org_slug; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE UNIQUE INDEX idx_org_slug ON data.organizations USING btree (slug); + + +-- +-- Name: idx_settings_lookup; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE UNIQUE INDEX idx_settings_lookup ON data.system_settings USING btree (key_name, COALESCE(region_code, ''::character varying), COALESCE(tier_id, 0), COALESCE(org_id, 0)); + + +-- +-- Name: idx_vb_slug; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE UNIQUE INDEX idx_vb_slug ON data.vehicle_brands USING btree (slug); + + +-- +-- Name: idx_vc_slug; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE UNIQUE INDEX idx_vc_slug ON data.vehicle_categories USING btree (slug); + + +-- +-- Name: idx_vm_slug; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE UNIQUE INDEX idx_vm_slug ON data.vehicle_models USING btree (brand_id, slug); + + +-- +-- Name: ix_data_badges_id; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_badges_id ON data.badges USING btree (id); + + +-- +-- Name: ix_data_email_logs_email; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_email_logs_email ON data.email_logs USING btree (email); + + +-- +-- Name: ix_data_email_logs_id; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_email_logs_id ON data.email_logs USING btree (id); + + +-- +-- Name: ix_data_email_provider_configs_id; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_email_provider_configs_id ON data.email_provider_configs USING btree (id); + + +-- +-- Name: ix_data_email_templates_id; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_email_templates_id ON data.email_templates USING btree (id); + + +-- +-- Name: ix_data_email_templates_type; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE UNIQUE INDEX ix_data_email_templates_type ON data.email_templates USING btree (type); + + +-- +-- Name: ix_data_legal_acceptances_id; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_legal_acceptances_id ON data.legal_acceptances USING btree (id); + + +-- +-- Name: ix_data_legal_documents_id; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_legal_documents_id ON data.legal_documents USING btree (id); + + +-- +-- Name: ix_data_level_configs_id; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_level_configs_id ON data.level_configs USING btree (id); + + +-- +-- Name: ix_data_organization_members_id; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_organization_members_id ON data.organization_members USING btree (id); + + +-- +-- Name: ix_data_organizations_id; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_organizations_id ON data.organizations USING btree (id); + + +-- +-- Name: ix_data_organizations_tax_number; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_organizations_tax_number ON data.organizations USING btree (tax_number); + + +-- +-- Name: ix_data_point_rules_action_key; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE UNIQUE INDEX ix_data_point_rules_action_key ON data.point_rules USING btree (action_key); + + +-- +-- Name: ix_data_point_rules_id; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_point_rules_id ON data.point_rules USING btree (id); + + +-- +-- Name: ix_data_points_ledger_id; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_points_ledger_id ON data.points_ledger USING btree (id); + + +-- +-- Name: ix_data_regional_settings_id; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_regional_settings_id ON data.regional_settings USING btree (id); + + +-- +-- Name: ix_data_service_providers_id; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_service_providers_id ON data.service_providers USING btree (id); + + +-- +-- Name: ix_data_system_settings_key; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_system_settings_key ON data.system_settings USING btree (key_name); + + +-- +-- Name: ix_data_translations_id; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_translations_id ON data.translations USING btree (id); + + +-- +-- Name: ix_data_translations_key; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_translations_key ON data.translations USING btree (key); + + +-- +-- Name: ix_data_translations_lang_code; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_translations_lang_code ON data.translations USING btree (lang_code); + + +-- +-- Name: ix_data_user_badges_id; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_user_badges_id ON data.user_badges USING btree (id); + + +-- +-- Name: ix_data_user_stats_id; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_user_stats_id ON data.user_stats USING btree (id); + + +-- +-- Name: ix_data_user_vehicles_id; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_user_vehicles_id ON data.user_vehicles USING btree (id); + + +-- +-- Name: ix_data_user_vehicles_license_plate; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_user_vehicles_license_plate ON data.user_vehicles USING btree (license_plate); + + +-- +-- Name: ix_data_user_vehicles_vin; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE UNIQUE INDEX ix_data_user_vehicles_vin ON data.user_vehicles USING btree (vin); + + +-- +-- Name: ix_data_users_email; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE UNIQUE INDEX ix_data_users_email ON data.users USING btree (email); + + +-- +-- Name: ix_data_users_id; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_users_id ON data.users USING btree (id); + + +-- +-- Name: ix_data_vehicle_brands_id; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_vehicle_brands_id ON data.vehicle_brands USING btree (id); + + +-- +-- Name: ix_data_vehicle_categories_id; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_vehicle_categories_id ON data.vehicle_categories USING btree (id); + + +-- +-- Name: ix_data_vehicle_models_id; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_vehicle_models_id ON data.vehicle_models USING btree (id); + + +-- +-- Name: ix_data_vehicle_ownership_id; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_vehicle_ownership_id ON data.vehicle_ownership USING btree (id); + + +-- +-- Name: ix_data_vehicle_variants_id; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_vehicle_variants_id ON data.vehicle_variants USING btree (id); + + +-- +-- Name: ix_data_verification_tokens_id; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE INDEX ix_data_verification_tokens_id ON data.verification_tokens USING btree (id); + + +-- +-- Name: ix_data_verification_tokens_token; Type: INDEX; Schema: data; Owner: kincses +-- + +CREATE UNIQUE INDEX ix_data_verification_tokens_token ON data.verification_tokens USING btree (token); + + +-- +-- Name: audit_logs audit_logs_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.audit_logs + ADD CONSTRAINT audit_logs_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id); + + +-- +-- Name: companies companies_owner_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.companies + ADD CONSTRAINT companies_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES data.users(id); + + +-- +-- Name: company_members company_members_company_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.company_members + ADD CONSTRAINT company_members_company_id_fkey FOREIGN KEY (company_id) REFERENCES data.companies(id) ON DELETE CASCADE; + + +-- +-- Name: company_members company_members_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.company_members + ADD CONSTRAINT company_members_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id) ON DELETE CASCADE; + + +-- +-- Name: credit_logs credit_logs_org_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.credit_logs + ADD CONSTRAINT credit_logs_org_id_fkey FOREIGN KEY (org_id) REFERENCES data.organizations(id); + + +-- +-- Name: legal_acceptances legal_acceptances_document_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.legal_acceptances + ADD CONSTRAINT legal_acceptances_document_id_fkey FOREIGN KEY (document_id) REFERENCES data.legal_documents(id); + + +-- +-- Name: legal_acceptances legal_acceptances_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.legal_acceptances + ADD CONSTRAINT legal_acceptances_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id); + + +-- +-- Name: org_subscriptions org_subscriptions_org_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.org_subscriptions + ADD CONSTRAINT org_subscriptions_org_id_fkey FOREIGN KEY (org_id) REFERENCES data.organizations(id); + + +-- +-- Name: org_subscriptions org_subscriptions_tier_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.org_subscriptions + ADD CONSTRAINT org_subscriptions_tier_id_fkey FOREIGN KEY (tier_id) REFERENCES data.subscription_tiers(id); + + +-- +-- Name: organization_locations organization_locations_organization_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.organization_locations + ADD CONSTRAINT organization_locations_organization_id_fkey FOREIGN KEY (organization_id) REFERENCES data.organizations(id) ON DELETE CASCADE; + + +-- +-- Name: organization_members organization_members_org_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.organization_members + ADD CONSTRAINT organization_members_org_id_fkey FOREIGN KEY (organization_id) REFERENCES data.organizations(id) ON DELETE CASCADE; + + +-- +-- Name: organization_members organization_members_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.organization_members + ADD CONSTRAINT organization_members_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id) ON DELETE CASCADE; + + +-- +-- Name: organizations organizations_owner_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.organizations + ADD CONSTRAINT organizations_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES data.users(id); + + +-- +-- Name: points_ledger points_ledger_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.points_ledger + ADD CONSTRAINT points_ledger_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id); + + +-- +-- Name: service_providers service_providers_added_by_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.service_providers + ADD CONSTRAINT service_providers_added_by_user_id_fkey FOREIGN KEY (added_by_user_id) REFERENCES data.users(id); + + +-- +-- Name: service_specialties service_specialties_parent_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.service_specialties + ADD CONSTRAINT service_specialties_parent_id_fkey FOREIGN KEY (parent_id) REFERENCES data.service_specialties(id); + + +-- +-- Name: user_badges user_badges_badge_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.user_badges + ADD CONSTRAINT user_badges_badge_id_fkey FOREIGN KEY (badge_id) REFERENCES data.badges(id); + + +-- +-- Name: user_badges user_badges_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.user_badges + ADD CONSTRAINT user_badges_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id); + + +-- +-- Name: user_scores user_scores_competition_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.user_scores + ADD CONSTRAINT user_scores_competition_id_fkey FOREIGN KEY (competition_id) REFERENCES data.competitions(id); + + +-- +-- Name: user_scores user_scores_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.user_scores + ADD CONSTRAINT user_scores_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id); + + +-- +-- Name: user_stats user_stats_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.user_stats + ADD CONSTRAINT user_stats_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id); + + +-- +-- Name: user_vehicles user_vehicles_current_org_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.user_vehicles + ADD CONSTRAINT user_vehicles_current_org_id_fkey FOREIGN KEY (current_org_id) REFERENCES data.organizations(id); + + +-- +-- Name: user_vehicles user_vehicles_variant_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.user_vehicles + ADD CONSTRAINT user_vehicles_variant_id_fkey FOREIGN KEY (variant_id) REFERENCES data.vehicle_variants(id); + + +-- +-- Name: vehicle_brands vehicle_brands_category_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicle_brands + ADD CONSTRAINT vehicle_brands_category_id_fkey FOREIGN KEY (category_id) REFERENCES data.vehicle_categories(id); + + +-- +-- Name: vehicle_events vehicle_events_service_provider_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicle_events + ADD CONSTRAINT vehicle_events_service_provider_id_fkey FOREIGN KEY (service_provider_id) REFERENCES data.service_providers(id); + + +-- +-- Name: vehicle_events vehicle_events_vehicle_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicle_events + ADD CONSTRAINT vehicle_events_vehicle_id_fkey FOREIGN KEY (vehicle_id) REFERENCES data.user_vehicles(id) ON DELETE CASCADE; + + +-- +-- Name: vehicle_models vehicle_models_brand_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicle_models + ADD CONSTRAINT vehicle_models_brand_id_fkey FOREIGN KEY (brand_id) REFERENCES data.vehicle_brands(id); + + +-- +-- Name: vehicle_models vehicle_models_category_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicle_models + ADD CONSTRAINT vehicle_models_category_id_fkey FOREIGN KEY (category_id) REFERENCES data.vehicle_categories(id); + + +-- +-- Name: vehicle_ownership vehicle_ownership_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicle_ownership + ADD CONSTRAINT vehicle_ownership_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id) ON DELETE CASCADE; + + +-- +-- Name: vehicle_ownership vehicle_ownership_vehicle_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicle_ownership + ADD CONSTRAINT vehicle_ownership_vehicle_id_fkey FOREIGN KEY (vehicle_id) REFERENCES data.vehicles(id) ON DELETE CASCADE; + + +-- +-- Name: vehicle_variants vehicle_variants_model_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicle_variants + ADD CONSTRAINT vehicle_variants_model_id_fkey FOREIGN KEY (model_id) REFERENCES data.vehicle_models(id); + + +-- +-- Name: vehicles vehicles_model_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.vehicles + ADD CONSTRAINT vehicles_model_id_fkey FOREIGN KEY (model_id) REFERENCES data.vehicle_models(id); + + +-- +-- Name: verification_tokens verification_tokens_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.verification_tokens + ADD CONSTRAINT verification_tokens_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id) ON DELETE CASCADE; + + +-- +-- Name: votes votes_provider_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.votes + ADD CONSTRAINT votes_provider_id_fkey FOREIGN KEY (provider_id) REFERENCES data.service_providers(id); + + +-- +-- Name: votes votes_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.votes + ADD CONSTRAINT votes_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id); + + +-- +-- PostgreSQL database dump complete +-- + +\unrestrict jRVVCTjjNeqN7io926QnQVJwr7IrvCK3DlzNPCoIfbivC5osmHT8eLuiehzRiDV + diff --git a/archive/old_other/backup_to_nas.sh b/archive/old_other/backup_to_nas.sh new file mode 100755 index 0000000..c664c94 --- /dev/null +++ b/archive/old_other/backup_to_nas.sh @@ -0,0 +1,20 @@ +#!/bin/bash +# Forrás és cél mappák meghatározása +SOURCE="/opt/service_finder" +DEST="/mnt/nas/git_vault/service_finder/backup" + +# Mappa létrehozása a NAS-on, ha még nincs ott +mkdir -p $DEST + +# Szinkronizálás (rsync) +# -a: archiválás (jogok megőrzése) +# -v: részletes naplózás +# -z: tömörítés az átvitel alatt +# --delete: törli a NAS-ról, amit te már töröltél a szerverről (tükrözés) +rsync -avz --delete --exclude 'postgres_data' --exclude 'node_modules' $SOURCE $DEST + +# Adatbázis mentés (külön, mert a futó fájlokat nem jó rsync-elni) +# Egy SQL dumpot készítünk közvetlenül a NAS-ra +docker exec postgres-db pg_dumpall -U postgres > $DEST/full_db_backup.sql + +echo "Mentés sikeresen befejeződött: $(date)" diff --git a/archive/old_other/deploy_v16.sh b/archive/old_other/deploy_v16.sh new file mode 100755 index 0000000..dee7373 --- /dev/null +++ b/archive/old_other/deploy_v16.sh @@ -0,0 +1,125 @@ +#!/bin/bash +# 🚀 SERVICE FINDER - SMART TILES & NAS BACKUP SCRIPT (V16.0) + +PROJECT_ROOT="/opt/service_finder" +NAS_BACKUP_PATH="/mnt/nas/app_data/backups" +TIMESTAMP=$(date +"%Y%m%d_%H%M%S") + +echo "--- 📦 1. BIZTONSÁGI MENTÉS KÉSZÍTÉSE A NAS-RA ---" +mkdir -p $NAS_BACKUP_PATH +# Mentés a NAS-ra a változtatások előtt +tar -czf $NAS_BACKUP_PATH/sf_backup_$TIMESTAMP.tar.gz -C $PROJECT_ROOT backend/app +echo "✅ Mentés elkészült: $NAS_BACKUP_PATH/sf_backup_$TIMESTAMP.tar.gz" + +echo "--- ⚙️ 2. VERZIÓ ÉS CHANGELOG FRISSÍTÉSE ---" +cat <> $PROJECT_ROOT/CHANGELOG.md +## [16.0] - 2026-01-25 +### Hozzáadva +- Smart Tiles: Csempe alapú nézet a Dashboardon. +- Brand logók és okmány-lejárat figyelmeztetések. +- Automata NAS mentés funkció a telepítőben. +EOF + +echo "--- 🧠 3. BACKEND FRISSÍTÉSE (fleet.py) ---" +cat < $PROJECT_ROOT/backend/app/api/v1/endpoints/fleet.py +from fastapi import APIRouter, Depends, HTTPException, status +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, func +from typing import List +from app.db.session import get_db +from app.schemas.fleet import VehicleCreate, VehicleResponse, EventCreate, EventResponse +from app.models.vehicle import UserVehicle +from app.models.system_settings import SystemSetting +from app.models.vehicle_event import VehicleEvent +from app.api.deps import get_current_user +from app.models.user import User + +router = APIRouter() + +@router.get("/vehicles", response_model=List[VehicleResponse]) +async def get_my_vehicles(db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user)): + result = await db.execute(select(UserVehicle).where(UserVehicle.user_id == current_user.id)) + return result.scalars().all() + +@router.post("/vehicles/{vehicle_id}/events", response_model=EventResponse) +async def create_event(vehicle_id: int, event_in: EventCreate, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user)): + v_query = await db.execute(select(UserVehicle).where(UserVehicle.id == vehicle_id, UserVehicle.user_id == current_user.id)) + vehicle = v_query.scalar_one_or_none() + if not vehicle: + raise HTTPException(status_code=404, detail="Jármű nem található.") + if event_in.odometer < vehicle.current_odometer: + raise HTTPException(status_code=400, detail=f"Hiba: Km állás ({event_in.odometer}) kevesebb mint {vehicle.current_odometer}") + new_event = VehicleEvent(**event_in.model_dump(), vehicle_id=vehicle_id) + db.add(new_event) + vehicle.current_odometer = event_in.odometer + await db.commit() + await db.refresh(new_event) + return new_event +EOF + +echo "--- 🎨 4. FRONTEND FRISSÍTÉSE (dashboard.html) ---" +cat < $PROJECT_ROOT/backend/app/static/dashboard.html + + + + Service Finder - Dashboard + + + + +
+
+

GARÁZS

+ +
+
+
+
+ + + + +EOF + +echo "--- 🔄 5. RENDSZER ÚJRAINDÍTÁSA ---" +docker compose restart service_finder_api +echo "🚀 FRISSÍTÉS ÉS NAS MENTÉS SIKERES!" diff --git a/archive/old_other/docker-compose_2026.02.01.yml b/archive/old_other/docker-compose_2026.02.01.yml new file mode 100755 index 0000000..96a0a58 --- /dev/null +++ b/archive/old_other/docker-compose_2026.02.01.yml @@ -0,0 +1,176 @@ +services: + # 1. ADATBÁZIS + postgres-db: + image: postgres:15 + container_name: postgres-db + environment: + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + volumes: + - ./postgres_data:/var/lib/postgresql/data + - ./postgres/init-db.sql:/docker-entrypoint-initdb.d/init-db.sql + ports: + - "${POSTGRES_PORT}:${POSTGRES_PORT}" + networks: + - service_finder_net + restart: unless-stopped + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] + interval: 5s + timeout: 5s + retries: 5 + + # 2. BACKEND API + service_finder_api: + build: + context: ./backend + dockerfile: Dockerfile + container_name: service_finder_api + volumes: + - ./backend:/app + - ./alembic.ini:/app/alembic.ini + - ./migrations:/app/migrations + command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --proxy-headers --forwarded-allow-ips="*" + ports: + - "8000:8000" + environment: + - PYTHONPATH=/app + - DATABASE_URL=postgresql+asyncpg://${APP_DB_USER}:${APP_DB_PASSWORD}@postgres-db:5432/${APP_DB_NAME} + - SECRET_KEY=${SECRET_KEY} + - ALGORITHM=${ALGORITHM} + - ALLOWED_ORIGINS=https://dev.profibot.hu, + - MINIO_ENDPOINT=minio:9000 + - MINIO_ACCESS_KEY=${POSTGRES_USER} + - MINIO_SECRET_KEY=${POSTGRES_PASSWORD} + - SENDGRID_API_KEY=${SENDGRID_API_KEY} + - POSTGRES_USER=${POSTGRES_USER} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + - POSTGRES_DB=${POSTGRES_DB} + depends_on: + postgres-db: + condition: service_healthy + minio: + condition: service_started + redis: + condition: service_started + networks: + - service_finder_net + + # 3. PGADMIN + pgadmin: + image: dpage/pgadmin4 + container_name: pgadmin_ui + environment: + PGADMIN_DEFAULT_EMAIL: ${PGADMIN_EMAIL} + PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_PASSWORD} + volumes: + - ./pgadmin_data:/var/lib/pgadmin + ports: + - "5050:80" + depends_on: + - postgres-db + networks: + - service_finder_net + + # 4. MINIO + minio: + image: minio/minio + container_name: service_finder_minio + command: server /data --console-address ":9001" + environment: + MINIO_ROOT_USER: ${POSTGRES_USER} + MINIO_ROOT_PASSWORD: ${POSTGRES_PASSWORD} + volumes: + - /mnt/nas/app_data/minio_data:/data + ports: + - "9000:9000" + - "9001:9001" + networks: + - service_finder_net + + # 5. REDIS + redis: + image: redis:alpine + container_name: service_finder_redis + volumes: + - /mnt/nas/app_data/redis_data:/data + networks: + - service_finder_net + + # 6. CODE-SERVER + code-server: + image: codercom/code-server:latest + container_name: code-server + user: "0:0" + volumes: + - /opt/service_finder:/opt/service_finder + - /var/run/docker.sock:/var/run/docker.sock + - /opt/service_finder/.vscode_config:/root + environment: + - PASSWORD=${CODE_SERVER_PASSWORD} + - TERM=xterm-256color + - TZ=Europe/Budapest + working_dir: /opt/service_finder + ports: + - "8443:8080" + restart: unless-stopped + networks: + - service_finder_net + # Ez a rész telepíti az eszközöket minden indításkor: + command: > + command: > + sh -c "apt-get update && + apt-get install -y ca-certificates curl gnupg mc python3 python3-pip htop && + install -m 0755 -d /etc/apt/keyrings && + curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg && + chmod a+r /etc/apt/keyrings/docker.gpg && + echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(. /etc/os-release && echo \"$VERSION_CODENAME\") stable\" | tee /etc/apt/sources.list.d/docker.list > /dev/null && + apt-get update && + apt-get install -y docker-ce-cli && + dumb-init /usr/bin/code-server --bind-addr 0.0.0.0:8080 /opt/service_finder" + + # 7. NGINX PROXY MANAGER + nginx-proxy: + image: 'jc21/nginx-proxy-manager:latest' + container_name: nginx-proxy-manager + restart: unless-stopped + ports: + - '80:80' + - '81:81' + - '443:443' + volumes: + - ./proxy-manager/data:/data + - ./proxy-manager/letsencrypt:/etc/letsencrypt + networks: + - service_finder_net + + # 8. DOZZLE + dozzle: + image: amir20/dozzle:latest + container_name: dozzle + volumes: + - /var/run/docker.sock:/var/run/docker.sock + ports: + - "8888:8080" + restart: unless-stopped + networks: + - service_finder_net + + # 9. Frontend konténer + service_finder_frontend: + build: + context: ./frontend + container_name: service_finder_frontend + ports: + - "3000:80" + environment: + - ALLOWED_ORIGINS=https://app.profibot.hu, + networks: + - service_finder_net + depends_on: + - service_finder_api + +networks: + service_finder_net: + driver: bridge diff --git a/archive/old_other/init_dev.sh b/archive/old_other/init_dev.sh new file mode 100755 index 0000000..00ec9b7 --- /dev/null +++ b/archive/old_other/init_dev.sh @@ -0,0 +1,3 @@ +#!/bin/bash +sudo apt-get update && sudo apt-get install -y mc python3 python3-pip docker.io htop +echo "--- Fejlesztői környezet kész! ---" \ No newline at end of file diff --git a/archive/old_specs/api_spec.json b/archive/old_specs/api_spec.json new file mode 100755 index 0000000..bfc1a81 --- /dev/null +++ b/archive/old_specs/api_spec.json @@ -0,0 +1 @@ +{"detail":"Not Found"} \ No newline at end of file diff --git a/archive/old_specs/api_spec_v2.json b/archive/old_specs/api_spec_v2.json new file mode 100755 index 0000000..7582bbb --- /dev/null +++ b/archive/old_specs/api_spec_v2.json @@ -0,0 +1 @@ +{"openapi":"3.1.0","info":{"title":"Traffic Ecosystem SuperApp 2.0","version":"2.0.0"},"paths":{"/api/v1/auth/register":{"post":{"tags":["auth"],"summary":"Register","operationId":"register_api_v1_auth_register_post","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","title":"Email"}},{"name":"password","in":"query","required":true,"schema":{"type":"string","title":"Password"}},{"name":"first_name","in":"query","required":true,"schema":{"type":"string","title":"First Name"}},{"name":"last_name","in":"query","required":true,"schema":{"type":"string","title":"Last Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/verify":{"get":{"tags":["auth"],"summary":"Verify Account","operationId":"verify_account_api_v1_auth_verify_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me":{"get":{"tags":["users"],"summary":"Read Users Me","description":"Visszaadja a bejelentkezett felhasználó profilját (Hírnévvel!)","operationId":"read_users_me_api_v1_users_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}}}}},"/api/v1/billing/balance":{"get":{"tags":["billing"],"summary":"Get Balance","description":"Visszaadja a felhasználó aktuális kreditegyenlegét és a Széfje (Cége) nevét.","operationId":"get_balance_api_v1_billing_balance_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/billing/history":{"get":{"tags":["billing"],"summary":"Get History","description":"Kilistázza a kreditmozgásokat (bevételek, költések, voucherek).","operationId":"get_history_api_v1_billing_history_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/billing/vouchers/redeem":{"post":{"tags":["billing"],"summary":"Redeem Voucher","description":"Bevált egy kódot, és jóváírja az értékét a felhasználó egyenlegén.","operationId":"redeem_voucher_api_v1_billing_vouchers_redeem_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/vouchers/generate":{"post":{"tags":["billing"],"summary":"Generate Vouchers","description":"Tömeges voucher generálás az admin felületről.","operationId":"generate_vouchers_api_v1_billing_vouchers_generate_post","parameters":[{"name":"count","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Count"}},{"name":"value","in":"query","required":false,"schema":{"type":"number","default":500.0,"title":"Value"}},{"name":"batch_name","in":"query","required":false,"schema":{"type":"string","default":"ADMIN_GEN","title":"Batch Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/vehicles/search/brands":{"get":{"tags":["vehicles"],"summary":"Search Brands","operationId":"search_brands_api_v1_vehicles_search_brands_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/vehicles/search/providers":{"get":{"tags":["vehicles"],"summary":"Search Providers","operationId":"search_providers_api_v1_vehicles_search_providers_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/vehicles/register":{"post":{"tags":["vehicles"],"summary":"Register User Vehicle","operationId":"register_user_vehicle_api_v1_vehicles_register_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Data"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/fleet/vehicles":{"get":{"tags":["fleet"],"summary":"Get My Vehicles","operationId":"get_my_vehicles_api_v1_fleet_vehicles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["fleet"],"summary":"Add Vehicle","operationId":"add_vehicle_api_v1_fleet_vehicles_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Vehicle In"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/expenses/add":{"post":{"tags":["expenses"],"summary":"Add Expense","description":"Új költség rögzítése egy járműhöz.","operationId":"add_expense_api_v1_expenses_add_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpenseCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/reports/summary/{vehicle_id}":{"get":{"tags":["reports"],"summary":"Get Vehicle Summary","description":"Összesített jelentés egy járműhöz: kategóriánkénti költségek.","operationId":"get_vehicle_summary_api_v1_reports_summary__vehicle_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"vehicle_id","in":"path","required":true,"schema":{"type":"string","title":"Vehicle Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reports/trends/{vehicle_id}":{"get":{"tags":["reports"],"summary":"Get Monthly Trends","description":"Visszaadja az utolsó 6 hónap költéseit havi bontásban.","operationId":"get_monthly_trends_api_v1_reports_trends__vehicle_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"vehicle_id","in":"path","required":true,"schema":{"type":"string","title":"Vehicle Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/auth/register":{"post":{"tags":["Authentication V2"],"summary":"Register","operationId":"register_api_v2_auth_register_post","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","title":"Email"}},{"name":"password","in":"query","required":true,"schema":{"type":"string","title":"Password"}},{"name":"first_name","in":"query","required":true,"schema":{"type":"string","title":"First Name"}},{"name":"last_name","in":"query","required":true,"schema":{"type":"string","title":"Last Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/auth/login":{"post":{"tags":["Authentication V2"],"summary":"Login","operationId":"login_api_v2_auth_login_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_login_api_v2_auth_login_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/auth/forgot-password":{"post":{"tags":["Authentication V2"],"summary":"Forgot Password","operationId":"forgot_password_api_v2_auth_forgot_password_post","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","title":"Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"tags":["health"],"summary":"Root","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"Body_login_api_v2_auth_login_post":{"properties":{"grant_type":{"anyOf":[{"type":"string","pattern":"^password$"},{"type":"null"}],"title":"Grant Type"},"username":{"type":"string","title":"Username"},"password":{"type":"string","format":"password","title":"Password"},"scope":{"type":"string","title":"Scope","default":""},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"format":"password","title":"Client Secret"}},"type":"object","required":["username","password"],"title":"Body_login_api_v2_auth_login_post"},"ExpenseCreate":{"properties":{"vehicle_id":{"type":"string","title":"Vehicle Id"},"category":{"type":"string","title":"Category"},"amount":{"type":"number","title":"Amount"},"date":{"type":"string","format":"date","title":"Date"},"odometer_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Odometer Value"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["vehicle_id","category","amount","date"],"title":"ExpenseCreate"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"UserResponse":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","default":true},"is_superuser":{"type":"boolean","title":"Is Superuser","default":false},"region_code":{"type":"string","title":"Region Code","default":"HU"},"id":{"type":"integer","title":"Id"},"is_company":{"type":"boolean","title":"Is Company"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"}},"type":"object","required":["email","id","is_company"],"title":"UserResponse"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"/api/v2/auth/login"}}}}}} \ No newline at end of file diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100755 index 0000000..d86d85f --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,24 @@ +# /opt/docker/dev/service_finder/backend/Dockerfile +FROM python:3.12-slim + +WORKDIR /app + +# Rendszerfüggőségek (OCR-hez és DB-hez) +RUN apt-get update && apt-get install -y --no-install-recommends \ + gcc \ + python3-dev \ + libpq-dev \ + libgl1 \ + libglib2.0-0 \ + && rm -rf /var/lib/apt/lists/* + +COPY requirements.txt . +RUN pip install --upgrade pip && \ + pip install --no-cache-dir -r requirements.txt + +COPY . . + +ENV PYTHONPATH=/app +ENV PYTHONUNBUFFERED=1 + +CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"] \ No newline at end of file diff --git a/backend/alembic.ini b/backend/alembic.ini new file mode 100755 index 0000000..6bd1c02 --- /dev/null +++ b/backend/alembic.ini @@ -0,0 +1,149 @@ +# A generic, single database configuration. + +[alembic] +# path to migration scripts. +# this is typically a path given in POSIX (e.g. forward slashes) +# format, relative to the token %(here)s which refers to the location of this +# ini file +script_location = %(here)s/migrations + +# template used to generate migration file names; The default value is %%(rev)s_%%(slug)s +# Uncomment the line below if you want the files to be prepended with date and time +# see https://alembic.sqlalchemy.org/en/latest/tutorial.html#editing-the-ini-file +# for all available tokens +# file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s +# Or organize into date-based subdirectories (requires recursive_version_locations = true) +# file_template = %%(year)d/%%(month).2d/%%(day).2d_%%(hour).2d%%(minute).2d_%%(second).2d_%%(rev)s_%%(slug)s + +# sys.path path, will be prepended to sys.path if present. +# defaults to the current working directory. for multiple paths, the path separator +# is defined by "path_separator" below. +prepend_sys_path = . + + +# timezone to use when rendering the date within the migration file +# as well as the filename. +# If specified, requires the tzdata library which can be installed by adding +# `alembic[tz]` to the pip requirements. +# string value is passed to ZoneInfo() +# leave blank for localtime +# timezone = + +# max length of characters to apply to the "slug" field +# truncate_slug_length = 40 + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + +# set to 'true' to allow .pyc and .pyo files without +# a source .py file to be detected as revisions in the +# versions/ directory +# sourceless = false + +# version location specification; This defaults +# to /versions. When using multiple version +# directories, initial revisions must be specified with --version-path. +# The path separator used here should be the separator specified by "path_separator" +# below. +# version_locations = %(here)s/bar:%(here)s/bat:%(here)s/alembic/versions + +# path_separator; This indicates what character is used to split lists of file +# paths, including version_locations and prepend_sys_path within configparser +# files such as alembic.ini. +# The default rendered in new alembic.ini files is "os", which uses os.pathsep +# to provide os-dependent path splitting. +# +# Note that in order to support legacy alembic.ini files, this default does NOT +# take place if path_separator is not present in alembic.ini. If this +# option is omitted entirely, fallback logic is as follows: +# +# 1. Parsing of the version_locations option falls back to using the legacy +# "version_path_separator" key, which if absent then falls back to the legacy +# behavior of splitting on spaces and/or commas. +# 2. Parsing of the prepend_sys_path option falls back to the legacy +# behavior of splitting on spaces, commas, or colons. +# +# Valid values for path_separator are: +# +# path_separator = : +# path_separator = ; +# path_separator = space +# path_separator = newline +# +# Use os.pathsep. Default configuration used for new projects. +path_separator = os + +# set to 'true' to search source files recursively +# in each "version_locations" directory +# new in Alembic version 1.10 +# recursive_version_locations = false + +# the output encoding used when revision files +# are written from script.py.mako +# output_encoding = utf-8 + +# database URL. This is consumed by the user-maintained env.py script only. +# other means of configuring database URLs may be customized within the env.py +# file. +sqlalchemy.url = postgresql+asyncpg://user:pass@postgres-db:5432/service_finder + + +[post_write_hooks] +# post_write_hooks defines scripts or Python functions that are run +# on newly generated revision scripts. See the documentation for further +# detail and examples + +# format using "black" - use the console_scripts runner, against the "black" entrypoint +# hooks = black +# black.type = console_scripts +# black.entrypoint = black +# black.options = -l 79 REVISION_SCRIPT_FILENAME + +# lint with attempts to fix using "ruff" - use the module runner, against the "ruff" module +# hooks = ruff +# ruff.type = module +# ruff.module = ruff +# ruff.options = check --fix REVISION_SCRIPT_FILENAME + +# Alternatively, use the exec runner to execute a binary found on your PATH +# hooks = ruff +# ruff.type = exec +# ruff.executable = ruff +# ruff.options = check --fix REVISION_SCRIPT_FILENAME + +# Logging configuration. This is also consumed by the user-maintained +# env.py script only. +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARNING +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARNING +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/backend/app/api/auth.py.old b/backend/app/api/auth.py.old new file mode 100755 index 0000000..742eadc --- /dev/null +++ b/backend/app/api/auth.py.old @@ -0,0 +1,132 @@ +from datetime import timedelta +from typing import Dict, Any +from fastapi import APIRouter, HTTPException +from app.core.config import settings +from app.core.security import create_token, decode_token + +router = APIRouter(prefix="/auth", tags=["auth"]) + +@router.post("/login") +def login(payload: Dict[str, Any]): + """ + payload: + { + "org_id": "", + "login": "", + "password": "" + } + """ + from app.db.session import get_conn + + conn = get_conn() + try: + cur = conn.cursor() + cur.execute("BEGIN;") + + org_id = (payload.get("org_id") or "").strip() + login_id = (payload.get("login") or "").strip() + password = payload.get("password") or "" + + if not org_id or not login_id or not password: + raise HTTPException(status_code=400, detail="org_id, login, password required") + + # RLS miatt kötelező: org kontextus beállítás + cur.execute("SELECT set_config('app.tenant_org_id', %s, false);", (org_id,)) + + # account + credential + cur.execute( + """ + SELECT + a.account_id::text, + a.org_id::text, + a.username::text, + a.email::text, + c.password_hash, + c.is_active + FROM app.account a + JOIN app.account_credential c ON c.account_id = a.account_id + WHERE a.org_id = %s::uuid + AND (a.username = %s::citext OR a.email = %s::citext) + AND c.is_active = true + LIMIT 1; + """, + (org_id, login_id, login_id), + ) + + row = cur.fetchone() + if not row: + raise HTTPException(status_code=401, detail="Invalid credentials") + + account_id, org_id_db, username, email, password_hash, cred_active = row + + # Jelszó ellenőrzés pgcrypto-val: crypt(plain, stored_hash) = stored_hash + cur.execute("SELECT crypt(%s, %s) = %s;", (password, password_hash, password_hash)) + ok = cur.fetchone()[0] + if not ok: + raise HTTPException(status_code=401, detail="Invalid credentials") + + # MVP: role később membershipből; most fixen tenant_admin + role_code = "tenant_admin" + is_platform_admin = False + + access = create_token( + { + "sub": account_id, + "org_id": org_id_db, + "role": role_code, + "is_platform_admin": is_platform_admin, + "type": "access", + }, + settings.JWT_SECRET, + timedelta(minutes=settings.JWT_ACCESS_MINUTES), + ) + + refresh = create_token( + { + "sub": account_id, + "org_id": org_id_db, + "role": role_code, + "is_platform_admin": is_platform_admin, + "type": "refresh", + }, + settings.JWT_SECRET, + timedelta(days=settings.JWT_REFRESH_DAYS), + ) + + conn.commit() + return {"access_token": access, "refresh_token": refresh, "token_type": "bearer"} + except HTTPException: + conn.rollback() + raise + except Exception as e: + conn.rollback() + raise HTTPException(status_code=500, detail=str(e)) + finally: + conn.close() + + +@router.post("/refresh") +def refresh_token(payload: Dict[str, Any]): + token = payload.get("refresh_token") or "" + if not token: + raise HTTPException(status_code=400, detail="refresh_token required") + + try: + claims = decode_token(token, settings.JWT_SECRET) + if claims.get("type") != "refresh": + raise HTTPException(status_code=401, detail="Invalid refresh token type") + + access = create_token( + { + "sub": claims.get("sub"), + "org_id": claims.get("org_id"), + "role": claims.get("role"), + "is_platform_admin": claims.get("is_platform_admin", False), + "type": "access", + }, + settings.JWT_SECRET, + timedelta(minutes=settings.JWT_ACCESS_MINUTES), + ) + return {"access_token": access, "token_type": "bearer"} + except Exception: + raise HTTPException(status_code=401, detail="Invalid or expired refresh token") diff --git a/backend/app/api/deps.py b/backend/app/api/deps.py new file mode 100755 index 0000000..263924e --- /dev/null +++ b/backend/app/api/deps.py @@ -0,0 +1,139 @@ +# /opt/docker/dev/service_finder/backend/app/api/deps.py +from typing import Optional, Dict, Any, Union +import logging +from fastapi import Depends, HTTPException, status +from fastapi.security import OAuth2PasswordBearer +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select + +from app.db.session import get_db +from app.core.security import decode_token, DEFAULT_RANK_MAP +from app.models.identity import User, UserRole # JAVÍTVA: Új Identity modell használata +from app.core.config import settings + +logger = logging.getLogger(__name__) + +# --- GONDOLATMENET / THOUGHT PROCESS --- +# 1. Az OAuth2 folyamat a központosított bejelentkezési végponton keresztül fut. +# 2. A token visszafejtésekor ellenőrizni kell a 'type' mezőt, hogy ne lehessen refresh tokennel belépni. +# 3. A felhasználó lekérésekor a SQLAlchemy 2.0 aszinkron 'execute' és 'scalar_one_or_none' metódusait használjuk. +# 4. A Scoped RBAC (Role-Based Access Control) biztosítja, hogy a felhasználók ne férjenek hozzá egymás flottáihoz. +# --------------------------------------- + +# Az OAuth2 folyamat a bejelentkezési végponton keresztül +reusable_oauth2 = OAuth2PasswordBearer( + tokenUrl=f"{settings.API_V1_STR}/auth/login" +) + +async def get_current_token_payload( + token: str = Depends(reusable_oauth2) +) -> Dict[str, Any]: + """ + JWT token visszafejtése és a típus (access) ellenőrzése. + """ + # Fejlesztői bypass (opcionális, csak DEBUG módban) + if settings.DEBUG and token == "dev_bypass_active": + return { + "sub": "1", + "role": "superadmin", + "rank": 100, + "scope_level": "global", + "scope_id": "all", + "type": "access" + } + + payload = decode_token(token) + if not payload or payload.get("type") != "access": + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Érvénytelen vagy lejárt munkamenet." + ) + return payload + +async def get_current_user( + db: AsyncSession = Depends(get_db), + payload: Dict = Depends(get_current_token_payload) +) -> User: + """ + Lekéri a felhasználót a token 'sub' mezője alapján (SQLAlchemy 2.0 aszinkron módon). + """ + user_id = payload.get("sub") + if not user_id: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Token azonosítási hiba." + ) + + # JAVÍTVA: Modern SQLAlchemy 2.0 aszinkron lekérdezés + result = await db.execute(select(User).where(User.id == int(user_id))) + user = result.scalar_one_or_none() + + if not user or user.is_deleted: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="A felhasználó nem található." + ) + return user + +async def get_current_active_user( + current_user: User = Depends(get_current_user), +) -> User: + """ + Ellenőrzi, hogy a felhasználó aktív-e (KYC Step 2 kész). + """ + if not current_user.is_active: + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail="A művelethez aktív profil és KYC azonosítás szükséges." + ) + return current_user + +async def check_resource_access( + resource_scope_id: Union[str, int], + current_user: User = Depends(get_current_user) +): + """ + Scoped RBAC: Megakadályozza a jogosulatlan hozzáférést mások adataihoz. + """ + if current_user.role == UserRole.superadmin: + return True + + user_scope = str(current_user.scope_id) if current_user.scope_id else None + requested_scope = str(resource_scope_id) + + # 1. Saját ID ellenőrzése + if str(current_user.id) == requested_scope: + return True + + # 2. Szervezeti/Flotta scope ellenőrzése + if user_scope and user_scope == requested_scope: + return True + + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail="Nincs jogosultsága ehhez az erőforráshoz." + ) + +def check_min_rank(role_key: str): + """ + Dinamikus Rank ellenőrzés a system_parameters tábla alapján. + """ + async def rank_checker( + db: AsyncSession = Depends(get_db), + payload: Dict = Depends(get_current_token_payload) + ): + # A settings.get_db_setting-et használjuk a dinamikus lekéréshez + ranks = await settings.get_db_setting( + db, "rbac_rank_matrix", default=DEFAULT_RANK_MAP + ) + + required_rank = ranks.get(role_key, 0) + user_rank = payload.get("rank", 0) + + if user_rank < required_rank: + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail=f"Alacsony jogosultsági szint. (Elvárt: {required_rank})" + ) + return True + return rank_checker \ No newline at end of file diff --git a/backend/app/api/recommend.py b/backend/app/api/recommend.py new file mode 100755 index 0000000..1aa1b03 --- /dev/null +++ b/backend/app/api/recommend.py @@ -0,0 +1,17 @@ +# /opt/docker/dev/service_finder/backend/app/api/recommend.py +from fastapi import APIRouter, Depends +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import text +from app.db.session import get_db + +router = APIRouter() + +@router.get("/provider/inbox") +async def provider_inbox(provider_id: str, db: AsyncSession = Depends(get_db)): + """ Aszinkron szerviz-postaláda lekérdezés. """ + query = text(""" + SELECT * FROM data.service_profiles + WHERE id = :p_id + """) + result = await db.execute(query, {"p_id": provider_id}) + return [dict(row._mapping) for row in result.fetchall()] \ No newline at end of file diff --git a/backend/app/api/v1/api.py b/backend/app/api/v1/api.py new file mode 100755 index 0000000..699c5c5 --- /dev/null +++ b/backend/app/api/v1/api.py @@ -0,0 +1,20 @@ +# /opt/docker/dev/service_finder/backend/app/api/v1/api.py +from fastapi import APIRouter +from app.api.v1.endpoints import ( + auth, catalog, assets, organizations, documents, + services, admin, expenses, evidence, social +) + +api_router = APIRouter() + +# Minden modul az új, refaktorált végpontokra mutat +api_router.include_router(auth.router, prefix="/auth", tags=["Authentication"]) +api_router.include_router(services.router, prefix="/services", tags=["Service Hunt & Discovery"]) +api_router.include_router(catalog.router, prefix="/catalog", tags=["Vehicle Catalog"]) +api_router.include_router(assets.router, prefix="/assets", tags=["Assets"]) +api_router.include_router(organizations.router, prefix="/organizations", tags=["Organizations"]) +api_router.include_router(documents.router, prefix="/documents", tags=["Documents"]) +api_router.include_router(admin.router, prefix="/admin", tags=["Admin Control Center (Sentinel)"]) +api_router.include_router(evidence.router, prefix="/evidence", tags=["Evidence & OCR (Robot 3)"]) +api_router.include_router(expenses.router, prefix="/expenses", tags=["Fleet Expenses (TCO)"]) +api_router.include_router(social.router, prefix="/social", tags=["Social & Leaderboard"]) \ No newline at end of file diff --git a/backend/app/api/v1/endpoints/admin.py b/backend/app/api/v1/endpoints/admin.py new file mode 100755 index 0000000..0658569 --- /dev/null +++ b/backend/app/api/v1/endpoints/admin.py @@ -0,0 +1,131 @@ +# /opt/docker/dev/service_finder/backend/app/api/v1/endpoints/admin.py +from fastapi import APIRouter, Depends, HTTPException, status +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, func, text, delete +from typing import List, Any, Dict, Optional +from datetime import datetime, timedelta + +from app.api import deps +from app.models.identity import User, UserRole # JAVÍTVA: Központi import +from app.models.system import SystemParameter +# JAVÍTVA: Security audit modellek +from app.models.audit import SecurityAuditLog, OperationalLog +# JAVÍTVA: Ezek a modellek a security.py-ból jönnek (ha ott vannak) +from app.models.security import PendingAction, ActionStatus + +from app.services.security_service import security_service +from app.services.translation_service import TranslationService +from pydantic import BaseModel + +class ConfigUpdate(BaseModel): + key: str + value: Any + scope_level: str = "global" + scope_id: Optional[str] = None + category: str = "general" + +router = APIRouter() + +async def check_admin_access(current_user: User = Depends(deps.get_current_active_user)): + """ Csak Admin vagy Superadmin. """ + if current_user.role not in [UserRole.admin, UserRole.superadmin]: + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail="Sentinel jogosultság szükséges!" + ) + return current_user + +@router.get("/health-monitor", tags=["Sentinel Monitoring"]) +async def get_system_health( + db: AsyncSession = Depends(deps.get_db), + admin: User = Depends(check_admin_access) +): + stats = {} + + # Adatbázis statisztikák (Nyers SQL marad, mert hatékony) + user_stats = await db.execute(text("SELECT subscription_plan, count(*) FROM data.users GROUP BY subscription_plan")) + stats["user_distribution"] = {row[0]: row[1] for row in user_stats} + + asset_count = await db.execute(text("SELECT count(*) FROM data.assets")) + stats["total_assets"] = asset_count.scalar() + + org_count = await db.execute(text("SELECT count(*) FROM data.organizations")) + stats["total_organizations"] = org_count.scalar() + + # JAVÍTVA: Biztonsági státusz az új SecurityAuditLog alapján + day_ago = datetime.now() - timedelta(days=1) + crit_logs = await db.execute( + select(func.count(SecurityAuditLog.id)) + .where( + SecurityAuditLog.is_critical == True, + SecurityAuditLog.created_at >= day_ago + ) + ) + stats["critical_alerts_24h"] = crit_logs.scalar() or 0 + + return stats + +@router.get("/pending-actions", response_model=List[Any], tags=["Sentinel Security"]) +async def list_pending_actions( + db: AsyncSession = Depends(deps.get_db), + admin: User = Depends(check_admin_access) +): + stmt = select(PendingAction).where(PendingAction.status == ActionStatus.pending) + result = await db.execute(stmt) + return result.scalars().all() + +@router.post("/approve/{action_id}", tags=["Sentinel Security"]) +async def approve_action( + action_id: int, + db: AsyncSession = Depends(deps.get_db), + admin: User = Depends(check_admin_access) +): + try: + await security_service.approve_action(db, admin.id, action_id) + return {"status": "success", "message": "Művelet végrehajtva."} + except Exception as e: + raise HTTPException(status_code=400, detail=str(e)) + +@router.get("/parameters", tags=["Dynamic Configuration"]) +async def list_all_parameters( + db: AsyncSession = Depends(deps.get_db), + admin: User = Depends(check_admin_access) +): + result = await db.execute(select(SystemParameter)) + return result.scalars().all() + +@router.post("/parameters", tags=["Dynamic Configuration"]) +async def set_parameter( + config: ConfigUpdate, + db: AsyncSession = Depends(deps.get_db), + admin: User = Depends(check_admin_access) +): + query = text(""" + INSERT INTO data.system_parameters (key, value, scope_level, scope_id, category, last_modified_by) + VALUES (:key, :val, :sl, :sid, :cat, :user) + ON CONFLICT (key, scope_level, scope_id) + DO UPDATE SET + value = EXCLUDED.value, + category = EXCLUDED.category, + last_modified_by = EXCLUDED.last_modified_by, + updated_at = now() + """) + + await db.execute(query, { + "key": config.key, + "val": config.value, + "sl": config.scope_level, + "sid": config.scope_id, + "cat": config.category, + "user": admin.email + }) + await db.commit() + return {"status": "success", "message": f"'{config.key}' frissítve."} + +@router.post("/translations/sync", tags=["System Utilities"]) +async def sync_translations_to_json( + db: AsyncSession = Depends(deps.get_db), + admin: User = Depends(check_admin_access) +): + await TranslationService.export_to_json(db) + return {"message": "JSON fájlok frissítve."} \ No newline at end of file diff --git a/backend/app/api/v1/endpoints/assets.py b/backend/app/api/v1/endpoints/assets.py new file mode 100755 index 0000000..9f48243 --- /dev/null +++ b/backend/app/api/v1/endpoints/assets.py @@ -0,0 +1,54 @@ +# /opt/docker/dev/service_finder/backend/app/api/v1/endpoints/assets.py +import uuid +from typing import Any, Dict, List +from fastapi import APIRouter, Depends, HTTPException, status +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, desc +from sqlalchemy.orm import selectinload + +from app.db.session import get_db +from app.api.deps import get_current_user +from app.models.asset import Asset, AssetCost +from app.models.identity import User +from app.services.cost_service import cost_service +from app.schemas.asset_cost import AssetCostCreate, AssetCostResponse +from app.schemas.asset import AssetResponse + +router = APIRouter() + +@router.get("/{asset_id}/financial-summary", response_model=Dict[str, Any]) +async def get_asset_financial_report( + asset_id: uuid.UUID, + db: AsyncSession = Depends(get_db), + current_user: User = Depends(get_current_user) +): + """ + MB 2.0 Dinamikus Pénzügyi Riport. + Visszaadja a kategóriákra bontott és az összesített költségeket (Local/EUR). + """ + # 1. Jogosultság ellenőrzése (Csak a tulajdonos vagy admin láthatja) + # (Itt egy gyors check, hogy az asset az övé-e) + + try: + return await cost_service.get_asset_financial_summary(db, asset_id) + except Exception as e: + raise HTTPException(status_code=500, detail="Hiba a riport generálásakor") + +@router.get("/{asset_id}/costs", response_model=List[AssetCostResponse]) +async def list_asset_costs( + asset_id: uuid.UUID, + skip: int = 0, + limit: int = 100, + db: AsyncSession = Depends(get_db), + current_user: User = Depends(get_current_user) +): + """Tételes költséglista lapozással (Pagination).""" + stmt = ( + select(AssetCost) + .where(AssetCost.asset_id == asset_id) + .order_by(desc(AssetCost.date)) + .offset(skip) + .limit(limit) + ) + res = await db.execute(stmt) + return res.scalars().all() \ No newline at end of file diff --git a/backend/app/api/v1/endpoints/auth.py b/backend/app/api/v1/endpoints/auth.py new file mode 100755 index 0000000..8a5c743 --- /dev/null +++ b/backend/app/api/v1/endpoints/auth.py @@ -0,0 +1,41 @@ +# backend/app/api/v1/endpoints/auth.py +from fastapi import APIRouter, Depends, HTTPException, status, Request +from fastapi.security import OAuth2PasswordRequestForm +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select +from app.db.session import get_db +from app.services.auth_service import AuthService +from app.core.security import create_tokens, DEFAULT_RANK_MAP +from app.core.config import settings +from app.schemas.auth import UserLiteRegister, Token, UserKYCComplete +from app.api.deps import get_current_user +from app.models.identity import User # JAVÍTVA: Új központi modell + +router = APIRouter() + +@router.post("/login", response_model=Token) +async def login(db: AsyncSession = Depends(get_db), form_data: OAuth2PasswordRequestForm = Depends()): + user = await AuthService.authenticate(db, form_data.username, form_data.password) + if not user: + raise HTTPException(status_code=401, detail="Hibás adatok.") + + ranks = await settings.get_db_setting(db, "rbac_rank_matrix", default=DEFAULT_RANK_MAP) + role_name = user.role.value if hasattr(user.role, 'value') else str(user.role) + + token_data = { + "sub": str(user.id), + "role": role_name, + "rank": ranks.get(role_name, 10), + "scope_level": user.scope_level or "individual", + "scope_id": str(user.scope_id) if user.scope_id else str(user.id) + } + + access, refresh = create_tokens(data=token_data) + return {"access_token": access, "refresh_token": refresh, "token_type": "bearer", "is_active": user.is_active} + +@router.post("/complete-kyc") +async def complete_kyc(kyc_in: UserKYCComplete, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user)): + user = await AuthService.complete_kyc(db, current_user.id, kyc_in) + if not user: + raise HTTPException(status_code=404, detail="User nem található.") + return {"status": "success", "message": "Fiók aktiválva."} \ No newline at end of file diff --git a/backend/app/api/v1/endpoints/billing.py b/backend/app/api/v1/endpoints/billing.py new file mode 100755 index 0000000..19c66be --- /dev/null +++ b/backend/app/api/v1/endpoints/billing.py @@ -0,0 +1,63 @@ +# backend/app/api/v1/endpoints/billing.py +from fastapi import APIRouter, Depends, HTTPException, status +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select +from app.api.deps import get_db, get_current_user +from app.models.identity import User, Wallet, UserRole +from app.models.audit import FinancialLedger +from app.services.config_service import config + +router = APIRouter() + +@router.post("/upgrade") +async def upgrade_account(target_package: str, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user)): + """ + Univerzális csomagváltó. + Kezeli az 5+ csomagot, a Rank-ugrást és a különleges 'Service Coin' bónuszokat. + """ + # 1. Lekérjük a teljes csomagmátrixot az adminból + # Példa JSON: {"premium": {"price": 2000, "rank": 5, "type": "credit"}, "service_pro": {"price": 10000, "rank": 30, "type": "coin"}} + package_matrix = await config.get_setting(db, "subscription_packages_matrix") + + if target_package not in package_matrix: + raise HTTPException(status_code=400, detail="Érvénytelen csomagválasztás.") + + pkg_info = package_matrix[target_package] + price = pkg_info["price"] + + # 2. Pénztárca ellenőrzése + stmt = select(Wallet).where(Wallet.user_id == current_user.id) + wallet = (await db.execute(stmt)).scalar_one_or_none() + + total_balance = wallet.purchased_credits + wallet.earned_credits + + if total_balance < price: + raise HTTPException(status_code=402, detail="Nincs elég kredited a csomagváltáshoz.") + + # 3. Levonási logika (Purchased -> Earned sorrend) + if wallet.purchased_credits >= price: + wallet.purchased_credits -= price + else: + remaining = price - wallet.purchased_credits + wallet.purchased_credits = 0 + wallet.earned_credits -= remaining + + # 4. Speciális Szerviz Logika (Service Coins) + # Ha a csomag típusa 'coin', akkor a szerviz kap egy kezdő Coin csomagot is + if pkg_info.get("type") == "coin": + initial_coins = pkg_info.get("initial_coin_bonus", 100) + wallet.service_coins += initial_coins + logger.info(f"User {current_user.id} upgraded to Service Pro, awarded {initial_coins} coins.") + + # 5. Rang frissítése és naplózás + current_user.role = target_package # Pl. 'service_pro' vagy 'vip' + + db.add(FinancialLedger( + user_id=current_user.id, + amount=-price, + transaction_type=f"UPGRADE_{target_package.upper()}", + details=pkg_info + )) + + await db.commit() + return {"status": "success", "package": target_package, "rank_granted": pkg_info["rank"]} \ No newline at end of file diff --git a/backend/app/api/v1/endpoints/catalog.py b/backend/app/api/v1/endpoints/catalog.py new file mode 100755 index 0000000..f4e92c3 --- /dev/null +++ b/backend/app/api/v1/endpoints/catalog.py @@ -0,0 +1,46 @@ +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy.ext.asyncio import AsyncSession +from app.db.session import get_db +from app.services.asset_service import AssetService +from typing import List + +router = APIRouter() + +@router.get("/makes", response_model=List[str]) +async def list_makes(db: AsyncSession = Depends(get_db)): + """1. Szint: Márkák listázása.""" + return await AssetService.get_makes(db) + +@router.get("/models", response_model=List[str]) +async def list_models(make: str, db: AsyncSession = Depends(get_db)): + """2. Szint: Típusok listázása egy adott márkához.""" + models = await AssetService.get_models(db, make) + if not models: + raise HTTPException(status_code=404, detail="Márka nem található vagy nincsenek típusok.") + return models + +@router.get("/generations", response_model=List[str]) +async def list_generations(make: str, model: str, db: AsyncSession = Depends(get_db)): + """3. Szint: Generációk/Évjáratok listázása.""" + generations = await AssetService.get_generations(db, make, model) + if not generations: + raise HTTPException(status_code=404, detail="Nincs generációs adat ehhez a típushoz.") + return generations + +@router.get("/engines") +async def list_engines(make: str, model: str, gen: str, db: AsyncSession = Depends(get_db)): + """4. Szint: Motorváltozatok és technikai specifikációk.""" + engines = await AssetService.get_engines(db, make, model, gen) + if not engines: + raise HTTPException(status_code=404, detail="Nincs motorváltozat adat.") + + # Itt visszaküldjük a teljes katalógus objektumokat (ID, motorváltozat, specifikációk) + return [ + { + "id": e.id, + "variant": e.engine_variant, + "engine_code": e.engine_code, + "fuel_type": e.fuel_type, + "factory_data": e.factory_data + } for e in engines + ] \ No newline at end of file diff --git a/backend/app/api/v1/endpoints/documents.py b/backend/app/api/v1/endpoints/documents.py new file mode 100755 index 0000000..6a7be64 --- /dev/null +++ b/backend/app/api/v1/endpoints/documents.py @@ -0,0 +1,87 @@ +# /opt/docker/dev/service_finder/backend/app/api/v1/endpoints/documents.py +import uuid +from typing import Any, Dict +from fastapi import APIRouter, Depends, UploadFile, File, Form, BackgroundTasks, HTTPException, status +from sqlalchemy.ext.asyncio import AsyncSession + +from app.db.session import get_db +from app.api.deps import get_current_user +from app.services.document_service import DocumentService +from app.models.identity import User + +router = APIRouter() + +@router.post("/upload/{parent_type}/{parent_id}") +async def upload_document( + parent_type: str, + parent_id: str, + background_tasks: BackgroundTasks, + doc_type: str = Form(..., description="A dokumentum típusa: 'invoice', 'registration_card', 'sale_contract'"), + file: UploadFile = File(...), + db: AsyncSession = Depends(get_db), + current_user: User = Depends(get_current_user) +): + """ + MB 2.0 Dokumentum Pipeline. + 1. Ellenőrzi a felhasználó havi OCR kvótáját (Admin 2.0). + 2. Optimalizálja és NAS-ra menti a képet (WebP konverzió). + 3. Automatikusan elindítja a Robot 1-et (OCR), ha a típus engedélyezett. + """ + + # 1. Bemeneti validáció + valid_parents = ["organizations", "assets", "transfers"] + if parent_type not in valid_parents: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail=f"Érvénytelen cél-típus! Megengedett: {', '.join(valid_parents)}" + ) + + try: + # 2. Feldolgozás a szolgáltatás rétegben + # Itt történik a kvóta-ellenőrzés és a Robot 1 triggerelése is + doc = await DocumentService.process_upload( + db=db, + user_id=current_user.id, + file=file, + parent_type=parent_type, + parent_id=parent_id, + doc_type=doc_type, + background_tasks=background_tasks + ) + + # 3. Válasz összeállítása az állapot alapján + response_data = { + "document_id": doc.id, + "original_name": doc.original_name, + "status": doc.status, + "thumbnail": doc.thumbnail_path, + } + + if doc.status == "processing": + response_data["message"] = "🤖 Robot 1 megkezdte a dokumentum elemzését. Értesítjük, ha kész!" + else: + response_data["message"] = "Dokumentum sikeresen archiválva a széfben." + + return response_data + + except HTTPException as he: + # Közvetlenül átengedjük a service-ből jövő (pl. kvóta) hibákat + raise he + except ValueError as ve: + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=str(ve)) + except Exception as e: + # Sentinel naplózás és általános hiba + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail="Kritikus hiba a dokumentum feldolgozása során." + ) + +@router.get("/{document_id}/status") +async def get_document_status( + document_id: uuid.UUID, + db: AsyncSession = Depends(get_db), + current_user: User = Depends(get_current_user) +): + """Lekérdezhető, hogy a robot végzett-e már a feldolgozással.""" + # (Itt egy egyszerű lekérdezés a Document táblából a státuszra) + pass \ No newline at end of file diff --git a/backend/app/api/v1/endpoints/evidence.py b/backend/app/api/v1/endpoints/evidence.py new file mode 100755 index 0000000..840d9aa --- /dev/null +++ b/backend/app/api/v1/endpoints/evidence.py @@ -0,0 +1,24 @@ +# backend/app/api/v1/endpoints/evidence.py +from fastapi import APIRouter, UploadFile, File, HTTPException, status, Depends +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, func, text +from app.api.deps import get_db, get_current_user +from app.models.identity import User +from app.models.asset import Asset # JAVÍTVA: Asset modell + +router = APIRouter() + +@router.post("/scan-registration") +async def scan_registration_document(file: UploadFile = File(...), db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user)): + stmt_limit = text("SELECT (value->>:plan)::int FROM data.system_parameters WHERE key = 'VEHICLE_LIMIT'") + res = await db.execute(stmt_limit, {"plan": current_user.subscription_plan or "free"}) + max_allowed = res.scalar() or 1 + + stmt_count = select(func.count(Asset.id)).where(Asset.owner_organization_id == current_user.scope_id) + count = (await db.execute(stmt_count)).scalar() or 0 + + if count >= max_allowed: + raise HTTPException(status_code=403, detail=f"Limit túllépés: {max_allowed} jármű engedélyezett.") + + # OCR hívás helye... + return {"success": True, "message": "Feldolgozás megkezdődött."} \ No newline at end of file diff --git a/backend/app/api/v1/endpoints/expenses.py b/backend/app/api/v1/endpoints/expenses.py new file mode 100755 index 0000000..a240a3e --- /dev/null +++ b/backend/app/api/v1/endpoints/expenses.py @@ -0,0 +1,33 @@ +# backend/app/api/v1/endpoints/expenses.py +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select +from app.api.deps import get_db, get_current_user +from app.models.asset import Asset, AssetCost # JAVÍTVA +from pydantic import BaseModel +from datetime import date + +router = APIRouter() + +class ExpenseCreate(BaseModel): + asset_id: str + category: str + amount: float + date: date + +@router.post("/add") +async def add_expense(expense: ExpenseCreate, db: AsyncSession = Depends(get_db), current_user = Depends(get_current_user)): + stmt = select(Asset).where(Asset.id == expense.asset_id) + if not (await db.execute(stmt)).scalar_one_or_none(): + raise HTTPException(status_code=404, detail="Jármű nem található.") + + new_cost = AssetCost( + asset_id=expense.asset_id, + cost_type=expense.category, + amount_local=expense.amount, + date=expense.date, + currency_local="HUF" + ) + db.add(new_cost) + await db.commit() + return {"status": "success"} \ No newline at end of file diff --git a/backend/app/api/v1/endpoints/gamification.py b/backend/app/api/v1/endpoints/gamification.py new file mode 100755 index 0000000..c53e315 --- /dev/null +++ b/backend/app/api/v1/endpoints/gamification.py @@ -0,0 +1,40 @@ +# /opt/docker/dev/service_finder/backend/app/api/v1/endpoints/gamification.py +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, desc +from typing import List + +from app.db.session import get_db +from app.api.deps import get_current_user +from app.models.identity import User +from app.models.gamification import UserStats, PointsLedger +from app.services.config_service import config + +router = APIRouter() + +@router.get("/my-stats") +async def get_my_stats(db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user)): + """A bejelentkezett felhasználó aktuális XP-je, szintje és büntetőpontjai.""" + stmt = select(UserStats).where(UserStats.user_id == current_user.id) + stats = (await db.execute(stmt)).scalar_one_or_none() + + if not stats: + return {"total_xp": 0, "current_level": 1, "penalty_points": 0} + + return stats + +@router.get("/leaderboard") +async def get_leaderboard(limit: int = 10, db: AsyncSession = Depends(get_db)): + """A 10 legtöbb XP-vel rendelkező felhasználó listája.""" + stmt = ( + select(User.email, UserStats.total_xp, UserStats.current_level) + .join(UserStats, User.id == UserStats.user_id) + .order_by(desc(UserStats.total_xp)) + .limit(limit) + ) + result = await db.execute(stmt) + # Az email-eket maszkoljuk a GDPR miatt (pl. k***s@p***.hu) + return [ + {"user": f"{r[0][:2]}***@{r[0].split('@')[1]}", "xp": r[1], "level": r[2]} + for r in result.all() + ] \ No newline at end of file diff --git a/backend/app/api/v1/endpoints/notifications.py b/backend/app/api/v1/endpoints/notifications.py new file mode 100755 index 0000000..62070cb --- /dev/null +++ b/backend/app/api/v1/endpoints/notifications.py @@ -0,0 +1,100 @@ +# /opt/docker/dev/service_finder/backend/app/api/v1/endpoints/notifications.py +import uuid +from typing import List, Optional +from fastapi import APIRouter, Depends, HTTPException, status, Query +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, update, desc, func + +from app.db.session import get_db +from app.api.deps import get_current_user +from app.models.identity import User +from app.models.system import InternalNotification +from app.schemas.social import NotificationResponse, NotificationUpdate # Feltételezett sémák + +router = APIRouter() + +@router.get("/my", response_model=List[NotificationResponse]) +async def get_my_notifications( + db: AsyncSession = Depends(get_db), + current_user: User = Depends(get_current_user), + unread_only: bool = False, + limit: int = Query(50, ge=1, le=100), + offset: int = 0 +): + """ + Lekéri a bejelentkezett felhasználó értesítéseit. + Támogatja a szűrést az olvasatlanokra és a lapozást. + """ + stmt = ( + select(InternalNotification) + .where(InternalNotification.user_id == current_user.id) + ) + + if unread_only: + stmt = stmt.where(InternalNotification.is_read == False) + + stmt = stmt.order_by(desc(InternalNotification.created_at)).offset(offset).limit(limit) + + result = await db.execute(stmt) + return result.scalars().all() + +@router.post("/mark-read") +async def mark_as_read( + notification_ids: List[uuid.UUID], + db: AsyncSession = Depends(get_db), + current_user: User = Depends(get_current_user) +): + """ + Egy vagy több értesítés olvasottnak jelölése. + """ + if not notification_ids: + raise HTTPException(status_code=400, detail="Nincs megadva azonosító.") + + stmt = ( + update(InternalNotification) + .where(InternalNotification.id.in_(notification_ids)) + .where(InternalNotification.user_id == current_user.id) + .values(is_read=True, read_at=func.now()) + ) + + await db.execute(stmt) + await db.commit() + + return {"status": "success", "marked_count": len(notification_ids)} + +@router.post("/mark-all-read") +async def mark_all_read( + db: AsyncSession = Depends(get_db), + current_user: User = Depends(get_current_user) +): + """ + A felhasználó összes értesítésének olvasottnak jelölése. + """ + stmt = ( + update(InternalNotification) + .where(InternalNotification.user_id == current_user.id) + .where(InternalNotification.is_read == False) + .values(is_read=True, read_at=func.now()) + ) + + await db.execute(stmt) + await db.commit() + + return {"status": "success", "message": "Minden értesítés olvasottnak jelölve."} + +@router.get("/summary") +async def get_notification_summary( + db: AsyncSession = Depends(get_db), + current_user: User = Depends(get_current_user) +): + """ + Gyors összesítő a Dashboard-hoz (pl. hány olvasatlan van). + """ + stmt = ( + select(func.count(InternalNotification.id)) + .where(InternalNotification.user_id == current_user.id) + .where(InternalNotification.is_read == False) + ) + + unread_count = (await db.execute(stmt)).scalar() or 0 + return {"unread_count": unread_count} \ No newline at end of file diff --git a/backend/app/api/v1/endpoints/organizations.py b/backend/app/api/v1/endpoints/organizations.py new file mode 100755 index 0000000..e5cac72 --- /dev/null +++ b/backend/app/api/v1/endpoints/organizations.py @@ -0,0 +1,115 @@ +# /opt/docker/dev/service_finder/backend/app/api/v1/endpoints/organizations.py +import os +import re +import uuid +import hashlib +import logging +from typing import List +from fastapi import APIRouter, Depends, HTTPException, status +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select + +from app.db.session import get_db +from app.api.deps import get_current_user +from app.schemas.organization import CorpOnboardIn, CorpOnboardResponse +from app.models.organization import Organization, OrgType, OrganizationMember +from app.models.identity import User # JAVÍTVA: Központi Identity modell +from app.core.config import settings + +router = APIRouter() +logger = logging.getLogger(__name__) + +@router.post("/onboard", response_model=CorpOnboardResponse, status_code=status.HTTP_201_CREATED) +async def onboard_organization( + org_in: CorpOnboardIn, + db: AsyncSession = Depends(get_db), + current_user: User = Depends(get_current_user) +): + """ + Új szervezet (cég/szerviz) rögzítése. + Automatikusan generál slug-ot és létrehozza a NAS mappa-struktúrát. + """ + + # 1. Magyar adószám validáció (XXXXXXXX-Y-ZZ) + if org_in.country_code == "HU": + if not re.match(r"^\d{8}-\d-\d{2}$", org_in.tax_number): + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail="Érvénytelen magyar adószám formátum!" + ) + + # 2. Duplikáció ellenőrzés + stmt_exist = select(Organization).where(Organization.tax_number == org_in.tax_number) + result_exist = await db.execute(stmt_exist) + if result_exist.scalar_one_or_none(): + raise HTTPException( + status_code=status.HTTP_409_CONFLICT, + detail="Ezzel az adószámmal már regisztráltak céget!" + ) + + # 3. KÖTELEZŐ MEZŐ: folder_slug generálása + # Mivel az adatbázisban NOT NULL, itt muszáj létrehozni + temp_slug = hashlib.md5(f"{org_in.tax_number}-{uuid.uuid4()}".encode()).hexdigest()[:12] + + # 4. Mentés + new_org = Organization( + full_name=org_in.full_name, + name=org_in.name, + display_name=org_in.display_name, + tax_number=org_in.tax_number, + reg_number=org_in.reg_number, + folder_slug=temp_slug, # JAVÍTVA: Kötelező mező beillesztve + address_zip=org_in.address_zip, + address_city=org_in.address_city, + address_street_name=org_in.address_street_name, + address_street_type=org_in.address_street_type, + address_house_number=org_in.address_house_number, + address_hrsz=org_in.address_hrsz, + address_stairwell=org_in.address_stairwell, + address_floor=org_in.address_floor, + address_door=org_in.address_door, + country_code=org_in.country_code, + org_type=OrgType.business, + status="pending_verification" + ) + + db.add(new_org) + await db.flush() + + # 5. TULAJDONOS RÖGZÍTÉSE + owner_member = OrganizationMember( + organization_id=new_org.id, + user_id=current_user.id, + role="OWNER" # JAVÍTVA: Enum kompatibilis nagybetűs forma + ) + db.add(owner_member) + + # 6. NAS Mappa létrehozása + try: + base_path = getattr(settings, "NAS_STORAGE_PATH", "/mnt/nas/app_data") + org_path = os.path.join(base_path, "organizations", str(new_org.id)) + os.makedirs(os.path.join(org_path, "documents"), exist_ok=True) + logger.info(f"NAS mappa kész: {org_path}") + except Exception as e: + logger.error(f"NAS hiba: {e}") + + await db.commit() + await db.refresh(new_org) + + return {"organization_id": new_org.id, "status": new_org.status} + +@router.get("/my", response_model=List[CorpOnboardResponse]) +async def get_my_organizations( + db: AsyncSession = Depends(get_db), + current_user: User = Depends(get_current_user) +): + """ A bejelentkezett felhasználóhoz tartozó összes szervezet listázása. """ + stmt = ( + select(Organization) + .join(OrganizationMember) + .where(OrganizationMember.user_id == current_user.id) + ) + result = await db.execute(stmt) + orgs = result.scalars().all() + + return [{"organization_id": o.id, "status": o.status} for o in orgs] \ No newline at end of file diff --git a/backend/app/api/v1/endpoints/providers.py b/backend/app/api/v1/endpoints/providers.py new file mode 100755 index 0000000..f819da3 --- /dev/null +++ b/backend/app/api/v1/endpoints/providers.py @@ -0,0 +1,12 @@ +from fastapi import APIRouter, Depends +from sqlalchemy.ext.asyncio import AsyncSession +from app.db.session import get_db +from app.schemas.social import ServiceProviderCreate, ServiceProviderResponse +from app.services.social_service import create_service_provider + +router = APIRouter() + +@router.post("/", response_model=ServiceProviderResponse) +async def add_provider(provider_data: ServiceProviderCreate, db: AsyncSession = Depends(get_db)): + user_id = 2 + return await create_service_provider(db, provider_data, user_id) \ No newline at end of file diff --git a/backend/app/api/v1/endpoints/reports.py b/backend/app/api/v1/endpoints/reports.py new file mode 100755 index 0000000..26a5a89 --- /dev/null +++ b/backend/app/api/v1/endpoints/reports.py @@ -0,0 +1,50 @@ +from fastapi import APIRouter, Depends +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import text +from app.api.deps import get_db, get_current_user + +router = APIRouter() # EZ HIÁNYZOTT! + +@router.get("/summary/{vehicle_id}") +async def get_vehicle_summary(vehicle_id: str, db: AsyncSession = Depends(get_db), current_user = Depends(get_current_user)): + """ + Összesített jelentés egy járműhöz: kategóriánkénti költségek. + """ + query = text(""" + SELECT + category, + SUM(amount) as total_amount, + COUNT(*) as transaction_count + FROM data.vehicle_expenses + WHERE vehicle_id = :v_id + GROUP BY category + """) + + result = await db.execute(query, {"v_id": vehicle_id}) + rows = result.fetchall() + + total_cost = sum(row.total_amount for row in rows) if rows else 0 + + return { + "vehicle_id": vehicle_id, + "total_cost": float(total_cost), + "breakdown": [dict(row._mapping) for row in rows] + } + +@router.get("/trends/{vehicle_id}") +async def get_monthly_trends(vehicle_id: str, db: AsyncSession = Depends(get_db), current_user = Depends(get_current_user)): + """ + Visszaadja az utolsó 6 hónap költéseit havi bontásban. + """ + query = text(""" + SELECT + TO_CHAR(date, 'YYYY-MM') as month, + SUM(amount) as monthly_total + FROM data.vehicle_expenses + WHERE vehicle_id = :v_id + GROUP BY month + ORDER BY month DESC + LIMIT 6 + """) + result = await db.execute(query, {"v_id": vehicle_id}) + return [dict(row._mapping) for row in result.fetchall()] \ No newline at end of file diff --git a/backend/app/api/v1/endpoints/search.py b/backend/app/api/v1/endpoints/search.py new file mode 100755 index 0000000..da6c706 --- /dev/null +++ b/backend/app/api/v1/endpoints/search.py @@ -0,0 +1,24 @@ +# backend/app/api/v1/endpoints/search.py +from fastapi import APIRouter, Depends +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import text +from app.db.session import get_db +from app.api.deps import get_current_user +from app.models.organization import Organization # JAVÍTVA + +router = APIRouter() + +@router.get("/match") +async def match_service(lat: float, lng: float, radius: int = 20, db: AsyncSession = Depends(get_db), current_user = Depends(get_current_user)): + # PostGIS alapú keresés a data.branches táblában (a régi locations helyett) + query = text(""" + SELECT o.id, o.name, b.city, + ST_Distance(b.location, ST_SetSRID(ST_MakePoint(:lng, :lat), 4326)::geography) / 1000 as distance + FROM data.organizations o + JOIN data.branches b ON o.id = b.organization_id + WHERE o.is_active = True AND b.is_active = True + AND ST_DWithin(b.location, ST_SetSRID(ST_MakePoint(:lng, :lat), 4326)::geography, :r * 1000) + ORDER BY distance ASC + """) + result = await db.execute(query, {"lat": lat, "lng": lng, "r": radius}) + return {"results": [dict(row._mapping) for row in result.fetchall()]} \ No newline at end of file diff --git a/backend/app/api/v1/endpoints/services.py b/backend/app/api/v1/endpoints/services.py new file mode 100755 index 0000000..d43ad7e --- /dev/null +++ b/backend/app/api/v1/endpoints/services.py @@ -0,0 +1,58 @@ +from fastapi import APIRouter, Depends, Form, Query, HTTPException +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, and_, text +from typing import List, Optional +from app.db.session import get_db +from app.services.gamification_service import GamificationService +from app.models.service import ServiceProfile, ExpertiseTag, ServiceExpertise + +router = APIRouter() + +# --- 🎯 SZERVIZ VADÁSZAT (Service Hunt) --- +@router.post("/hunt") +async def register_service_hunt( + name: str = Form(...), + lat: float = Form(...), + lng: float = Form(...), + db: AsyncSession = Depends(get_db) +): + """ Új szerviz-jelölt rögzítése a staging táblába jutalompontért. """ + # Új szerviz-jelölt rögzítése + await db.execute(text(""" + INSERT INTO data.service_staging (name, fingerprint, status, raw_data) + VALUES (:n, :f, 'pending', jsonb_build_object('lat', :lat, 'lng', :lng)) + """), {"n": name, "f": f"{name}-{lat}-{lng}", "lat": lat, "lng": lng}) + + # MB 2.0 Gamification: 50 pont a felfedezésért + # TODO: A 1-es ID helyett a bejelentkezett felhasználót kell használni (current_user.id) + await GamificationService.award_points(db, 1, 50, f"Service Hunt: {name}") + await db.commit() + return {"status": "success", "message": "Discovery registered and points awarded."} + +# --- 🔍 SZERVIZ KERESŐ (Service Search) --- +@router.get("/search") +async def search_services( + expertise_key: Optional[str] = Query(None, description="Szakmai címke (pl. brake_service)"), + city: Optional[str] = Query(None, description="Város szűrés"), + min_confidence: int = Query(0, description="Minimum hitelességi szint (0-2)"), + db: AsyncSession = Depends(get_db) +): + """ Szakmai szempontú keresőmotor, ami a validált címkék alapján szűr. """ + # Alap lekérdezés: Szervizek, akiknek van szakértelmük + query = select(ServiceProfile).join(ServiceProfile.expertises).join(ServiceExpertise.tag) + + filters = [] + if expertise_key: + filters.append(ExpertiseTag.key == expertise_key) + if city: + filters.append(ServiceProfile.city.ilike(f"%{city}%")) + if min_confidence > 0: + filters.append(ServiceExpertise.confidence_level >= min_confidence) + + if filters: + query = query.where(and_(*filters)) + + result = await db.execute(query.distinct()) + services = result.scalars().all() + + return services \ No newline at end of file diff --git a/backend/app/api/v1/endpoints/social.py b/backend/app/api/v1/endpoints/social.py new file mode 100755 index 0000000..7fca52d --- /dev/null +++ b/backend/app/api/v1/endpoints/social.py @@ -0,0 +1,16 @@ +from fastapi import APIRouter, Depends +from sqlalchemy.ext.asyncio import AsyncSession +from app.db.session import get_db +# ITT A JAVÍTÁS: A példányt importáljuk, nem a régi függvényeket +from app.services.social_service import social_service + +router = APIRouter() + +@router.get("/leaderboard") +async def read_leaderboard(limit: int = 10, db: AsyncSession = Depends(get_db)): + return await social_service.get_leaderboard(db, limit) + +@router.post("/vote/{provider_id}") +async def provider_vote(provider_id: int, vote_value: int, db: AsyncSession = Depends(get_db)): + user_id = 2 + return await social_service.vote_for_provider(db, user_id, provider_id, vote_value) \ No newline at end of file diff --git a/backend/app/api/v1/endpoints/users.py b/backend/app/api/v1/endpoints/users.py new file mode 100755 index 0000000..1e31d09 --- /dev/null +++ b/backend/app/api/v1/endpoints/users.py @@ -0,0 +1,16 @@ +from fastapi import APIRouter, Depends +from sqlalchemy.ext.asyncio import AsyncSession + +from app.api.deps import get_db, get_current_user +from app.schemas.user import UserResponse +from app.models.user import User + +router = APIRouter() + +@router.get("/me", response_model=UserResponse) +async def read_users_me( + db: AsyncSession = Depends(get_db), + current_user: User = Depends(get_current_user), +): + """Visszaadja a bejelentkezett felhasználó profilját""" + return current_user diff --git a/backend/app/core/__init__.py b/backend/app/core/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/backend/app/core/config.py b/backend/app/core/config.py new file mode 100755 index 0000000..d5519cf --- /dev/null +++ b/backend/app/core/config.py @@ -0,0 +1,104 @@ +# /opt/docker/dev/service_finder/backend/app/core/config.py +import os +from pathlib import Path +from typing import Any, Optional, List +from pydantic_settings import BaseSettings, SettingsConfigDict +from pydantic import Field, field_validator +from sqlalchemy import text +from sqlalchemy.ext.asyncio import AsyncSession +from datetime import datetime, timezone + +class Settings(BaseSettings): + # --- Paths --- + BASE_DIR: Path = Path(__file__).resolve().parent.parent.parent + STATIC_DIR: str = os.path.join(str(BASE_DIR), "static") + + # --- General --- + PROJECT_NAME: str = "Service Finder Ecosystem" + VERSION: str = "2.1.0" + API_V1_STR: str = "/api/v1" + DEBUG: bool = False + + def get_now_utc_iso(self) -> str: + """Központi időlekérdező az egész Sentinel rendszernek""" + return datetime.now(timezone.utc).isoformat() + + # MB 2.0 Kompatibilitási alias a database.py számára + @property + def DEBUG_MODE(self) -> bool: + return self.DEBUG + + # --- Security / JWT --- + SECRET_KEY: str = "NOT_SET_DANGER" + ALGORITHM: str = "HS256" + ACCESS_TOKEN_EXPIRE_MINUTES: int = 30 + REFRESH_TOKEN_EXPIRE_DAYS: int = 7 + + # --- Initial Admin --- + INITIAL_ADMIN_EMAIL: str = "admin@servicefinder.hu" + INITIAL_ADMIN_PASSWORD: str = "Admin123!" + + # --- Database & Cache --- + # Alapértelmezett értéket adunk, hogy ne szálljon el, ha a .env hiányos + DATABASE_URL: str = Field( + default="postgresql+asyncpg://user:password@postgres-db:5432/service_finder", + env="DATABASE_URL" + ) + REDIS_URL: str = "redis://service_finder_redis:6379/0" + + @property + def SQLALCHEMY_DATABASE_URI(self) -> str: + """ + Ez a property biztosítja, hogy a database.py és az Alembic + megtalálja a kapcsolatot a várt néven. + """ + return self.DATABASE_URL + + # --- Email --- + EMAIL_PROVIDER: str = "auto" + EMAILS_FROM_EMAIL: str = "info@profibot.hu" + EMAILS_FROM_NAME: str = "Profibot" + + SENDGRID_API_KEY: Optional[str] = None + SMTP_HOST: Optional[str] = None + SMTP_PORT: int = 587 + SMTP_USER: Optional[str] = None + SMTP_PASSWORD: Optional[str] = None + + # --- External URLs --- + FRONTEND_BASE_URL: str = "https://dev.profibot.hu" + BACKEND_CORS_ORIGINS: List[str] = [ + "http://localhost:3001", + "https://dev.profibot.hu", + "http://192.168.100.10:3001" + ] + + # --- Google OAuth --- + GOOGLE_CLIENT_ID: str = "" + GOOGLE_CLIENT_SECRET: str = "" + GOOGLE_CALLBACK_URL: str = "https://dev.profibot.hu/api/v1/auth/callback/google" + + # --- Brute-Force & Security --- + LOGIN_RATE_LIMIT_ANON: str = "5/minute" + AUTH_MIN_PASSWORD_LENGTH: int = 8 + + # --- Dinamikus Admin Motor (Sértetlenül hagyva) --- + async def get_db_setting(self, db: AsyncSession, key_name: str, default: Any = None) -> Any: + try: + query = text("SELECT value FROM data.system_parameters WHERE key = :key") + result = await db.execute(query, {"key": key_name}) + row = result.fetchone() + if row and row[0] is not None: + return row[0] + return default + except Exception: + return default + + model_config = SettingsConfigDict( + env_file=".env", + env_file_encoding="utf-8", + case_sensitive=True, + extra="ignore" + ) + +settings = Settings() \ No newline at end of file diff --git a/backend/app/core/email.py b/backend/app/core/email.py new file mode 100755 index 0000000..d30c38b --- /dev/null +++ b/backend/app/core/email.py @@ -0,0 +1,10 @@ +import logging +logger = logging.getLogger(__name__) + +async def send_verification_email(email_to: str, token: str, first_name: str): + logger.info(f"MOCK EMAIL -> Címzett: {email_to}, Token: {token}") + return True + +async def send_new_account_email(email_to: str, username: str, password: str): + logger.info(f"MOCK EMAIL -> Új fiók: {username}") + return True diff --git a/backend/app/core/i18n.py b/backend/app/core/i18n.py new file mode 100755 index 0000000..3fcfe2d --- /dev/null +++ b/backend/app/core/i18n.py @@ -0,0 +1,53 @@ +# /opt/docker/dev/service_finder/backend/app/core/i18n.py +import json +import os + +class LocaleManager: + _locales = {} + + def get(self, key: str, lang: str = "hu", **kwargs) -> str: + if not self._locales: + self._load() + + data = self._locales.get(lang, self._locales.get("hu", {})) + # Biztonságos bejárás a pontokkal elválasztott kulcsokhoz + for k in key.split("."): + if isinstance(data, dict): + data = data.get(k, {}) + else: + return key # Ha elakadunk, adjuk vissza magát a kulcsot + + if isinstance(data, str): + return data.format(**kwargs) + return key + + def _load(self): + # A konténeren belül ez a biztos útvonal + possible_paths = [ + "/app/app/locales", + "app/locales", + "backend/app/locales" + ] + + path = "" + for p in possible_paths: + if os.path.exists(p): + path = p + break + + if not path: + print("FIGYELEM: Nem található a locales könyvtár!") + return + + for file in os.listdir(path): + if file.endswith(".json"): + lang = file.split(".")[0] + try: + with open(os.path.join(path, file), "r", encoding="utf-8") as f: + self._locales[lang] = json.load(f) + except Exception as e: + print(f"Hiba a {file} betöltésekor: {e}") + +locale_manager = LocaleManager() +# Rövid alias a könnyebb használathoz +t = locale_manager.get \ No newline at end of file diff --git a/backend/app/core/rbac.py b/backend/app/core/rbac.py new file mode 100755 index 0000000..fd6b4d7 --- /dev/null +++ b/backend/app/core/rbac.py @@ -0,0 +1,31 @@ +# /opt/docker/dev/service_finder/backend/app/core/rbac.py +from fastapi import HTTPException, Depends, status +from app.api.deps import get_current_user +from app.models.identity import User +from app.core.config import settings + +class RBAC: + def __init__(self, required_perm: str = None, min_rank: int = 0): + self.required_perm = required_perm + self.min_rank = min_rank + + async def __call__(self, current_user: User = Depends(get_current_user)): + # 1. Superadmin mindent visz (Rank 100) + if current_user.role == "superadmin": + return True + + # 2. Dinamikus rang ellenőrzés a központi rank_map alapján + user_rank = settings.DEFAULT_RANK_MAP.get(current_user.role.value, 0) + if user_rank < self.min_rank: + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail=f"Elégtelen rang. Szükséges szint: {self.min_rank}" + ) + + # 3. Egyedi képességek (capabilities) ellenőrzése + if self.required_perm: + user_perms = current_user.custom_permissions.get("capabilities", []) + if self.required_perm not in user_perms: + raise HTTPException(status_code=403, detail="Hiányzó jogosultság.") + + return True \ No newline at end of file diff --git a/backend/app/core/security.py b/backend/app/core/security.py new file mode 100755 index 0000000..8c15c1d --- /dev/null +++ b/backend/app/core/security.py @@ -0,0 +1,57 @@ +# /opt/docker/dev/service_finder/backend/app/core/security.py +import bcrypt +import string +import secrets +from datetime import datetime, timedelta, timezone +from typing import Optional, Dict, Any, Tuple +from jose import jwt, JWTError +from app.core.config import settings + +def verify_password(plain_password: str, hashed_password: str) -> bool: + if not hashed_password: return False + return bcrypt.checkpw(plain_password.encode("utf-8"), hashed_password.encode("utf-8")) + +def get_password_hash(password: str) -> str: + return bcrypt.hashpw(password.encode("utf-8"), bcrypt.gensalt()).decode("utf-8") + +def create_tokens(data: Dict[str, Any]) -> Tuple[str, str]: + """ Access és Refresh token generálása UTC időzónával. """ + to_encode = data.copy() + now = datetime.now(timezone.utc) + + # Access Token + acc_expire = now + timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES) + access_payload = {**to_encode, "exp": acc_expire, "iat": now, "type": "access"} + access_token = jwt.encode(access_payload, settings.SECRET_KEY, algorithm=settings.ALGORITHM) + + # Refresh Token + ref_expire = now + timedelta(days=settings.REFRESH_TOKEN_EXPIRE_DAYS) + refresh_payload = {"sub": str(to_encode.get("sub")), "exp": ref_expire, "iat": now, "type": "refresh"} + refresh_token = jwt.encode(refresh_payload, settings.SECRET_KEY, algorithm=settings.ALGORITHM) + + return access_token, refresh_token + +def decode_token(token: str) -> Optional[Dict[str, Any]]: + try: + return jwt.decode(token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM]) + except JWTError: + return None + +def generate_secure_slug(length: int = 16) -> str: + """ Biztonságos, URL-barát véletlenszerű azonosító generálása. """ + alphabet = string.ascii_letters + string.digits + return ''.join(secrets.choice(alphabet) for _ in range(length)) + +# Teljesen a margón van, így globális konstans lesz! +DEFAULT_RANK_MAP = { + "SUPERADMIN": 100, + "ADMIN": 90, + "AUDITOR": 80, + "ORGANIZATION_OWNER": 70, + "ORGANIZATION_MANAGER": 60, + "ORGANIZATION_MEMBER": 50, + "SERVICE_PROVIDER": 40, + "PREMIUM_USER": 20, + "USER": 10, + "GUEST": 0 +} \ No newline at end of file diff --git a/backend/app/core/validators.py b/backend/app/core/validators.py new file mode 100755 index 0000000..8db287d --- /dev/null +++ b/backend/app/core/validators.py @@ -0,0 +1,30 @@ +# /opt/docker/dev/service_finder/backend/app/models/validators.py (Javasolt új hely) +import hashlib +import unicodedata +import re + +class VINValidator: + """ VIN ellenőrzés ISO 3779 szerint. """ + @staticmethod + def validate(vin: str) -> bool: + vin = vin.upper().strip() + if not re.match(r"^[A-Z0-9]{17}$", vin) or any(c in vin for c in "IOQ"): + return False + # ISO Checksum logika marad (az eredeti kódod ezen része jó volt) + return True + +class IdentityNormalizer: + """ Az MDM stratégia alapja: tisztított adatok és hash generálás. """ + @staticmethod + def normalize_text(text: str) -> str: + if not text: return "" + text = text.lower().strip() + text = "".join(c for c in unicodedata.normalize('NFD', text) if unicodedata.category(c) != 'Mn') + return re.sub(r'[^a-z0-9]', '', text) + + @classmethod + def generate_person_hash(cls, last_name: str, first_name: str, mothers_name: str, birth_date: str) -> str: + """ SHA256 ujjlenyomat a duplikációk elkerülésére. """ + raw = cls.normalize_text(last_name) + cls.normalize_text(first_name) + \ + cls.normalize_text(mothers_name) + cls.normalize_text(birth_date) + return hashlib.sha256(raw.encode()).hexdigest() \ No newline at end of file diff --git a/backend/app/crud/__init__.py b/backend/app/crud/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/backend/app/database.py b/backend/app/database.py new file mode 100755 index 0000000..a42209b --- /dev/null +++ b/backend/app/database.py @@ -0,0 +1,24 @@ +# /opt/docker/dev/service_finder/backend/app/database.py +from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker +from sqlalchemy.orm import DeclarativeBase +from app.core.config import settings + +# Most már settings.SQLALCHEMY_DATABASE_URI létezik a property miatt! +engine = create_async_engine( + str(settings.SQLALCHEMY_DATABASE_URI), + echo=settings.DEBUG_MODE, + pool_size=20, + max_overflow=10, + pool_pre_ping=True, +) + +AsyncSessionLocal = async_sessionmaker( + autocommit=False, + autoflush=False, + bind=engine, + class_=AsyncSession, + expire_on_commit=False +) + +class Base(DeclarativeBase): + pass \ No newline at end of file diff --git a/backend/app/db/__init__.py b/backend/app/db/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/backend/app/db/base.py b/backend/app/db/base.py new file mode 100755 index 0000000..b25ea12 --- /dev/null +++ b/backend/app/db/base.py @@ -0,0 +1,35 @@ +# /opt/docker/dev/service_finder/backend/app/db/base.py +from app.db.base_class import Base # noqa + +# Közvetlen importok (HOZZÁADVA az audit és sales modellek) +from app.models.address import Address, GeoPostalCode, GeoStreet, GeoStreetType, Branch, Rating # noqa + +from app.models.identity import Person, User, Wallet, VerificationToken, SocialAccount # noqa + +from app.models.organization import Organization, OrganizationMember, OrganizationFinancials, OrganizationSalesAssignment # noqa + +from app.models.service import ServiceProfile, ExpertiseTag, ServiceExpertise, ServiceStaging, DiscoveryParameter # noqa + +from app.models.vehicle_definitions import VehicleType, VehicleModelDefinition, FeatureDefinition # noqa + +from app.models.audit import SecurityAuditLog, OperationalLog, FinancialLedger # noqa <--- KRITIKUS! + +from app.models.asset import ( # noqa + Asset, AssetCatalog, AssetCost, AssetEvent, + AssetFinancials, AssetTelemetry, AssetReview, ExchangeRate +) + +from app.models.gamification import PointRule, LevelConfig, UserStats, Badge, UserBadge, PointsLedger # noqa + +from app.models.system import SystemParameter # noqa (system.py használata) + +from app.models.history import AuditLog, VehicleOwnership # noqa + +from app.models.document import Document # noqa + +from app.models.translation import Translation # noqa + +from app.models.core_logic import ( # noqa + SubscriptionTier, OrganizationSubscription, CreditTransaction, ServiceSpecialty +) +from app.models.security import PendingAction # noqa \ No newline at end of file diff --git a/backend/app/db/base_class.py b/backend/app/db/base_class.py new file mode 100755 index 0000000..0060d49 --- /dev/null +++ b/backend/app/db/base_class.py @@ -0,0 +1,16 @@ +# /opt/docker/dev/service_finder/backend/app/db/base_class.py +from typing import Any +from sqlalchemy import MetaData +from sqlalchemy.orm import DeclarativeBase, declared_attr + +# Globális séma beállítása +target_metadata = MetaData(schema="data") + +class Base(DeclarativeBase): + metadata = target_metadata + + # Automatikusan generálja a tábla nevét az osztálynévből + @declared_attr.directive + def __tablename__(cls) -> str: + name = cls.__name__.lower() + return f"{name}s" if not name.endswith('s') else name \ No newline at end of file diff --git a/backend/app/db/context.py.old b/backend/app/db/context.py.old new file mode 100755 index 0000000..e4406d6 --- /dev/null +++ b/backend/app/db/context.py.old @@ -0,0 +1,38 @@ +from typing import Generator, Optional, Dict, Any +from fastapi import Request +from app.db.session import get_conn + +def _set_config(cur, key: str, value: str) -> None: + cur.execute("SELECT set_config(%s, %s, false);", (key, value)) + +def db_tx(request: Request) -> Generator[Dict[str, Any], None, None]: + """ + Egységes DB tranzakció + session context: + BEGIN + set_config(app.tenant_org_id, app.account_id, app.is_platform_admin) + COMMIT/ROLLBACK + """ + conn = get_conn() + try: + cur = conn.cursor() + cur.execute("BEGIN;") + + claims: Optional[dict] = getattr(request.state, "claims", None) + if claims: + org_id = claims.get("org_id") or "" + account_id = claims.get("sub") or "" + is_platform_admin = claims.get("is_platform_admin", False) + + # Fontos: set_config stringeket vár + _set_config(cur, "app.tenant_org_id", str(org_id)) + _set_config(cur, "app.account_id", str(account_id)) + _set_config(cur, "app.is_platform_admin", "true" if is_platform_admin else "false") + + yield {"conn": conn, "cur": cur} + + conn.commit() + except Exception: + conn.rollback() + raise + finally: + conn.close() diff --git a/backend/app/db/middleware.py b/backend/app/db/middleware.py new file mode 100755 index 0000000..c595ef6 --- /dev/null +++ b/backend/app/db/middleware.py @@ -0,0 +1,27 @@ +# /opt/docker/dev/service_finder/backend/app/db/middleware.py +from fastapi import Request +from app.db.session import AsyncSessionLocal +from app.models.audit import OperationalLog # JAVÍTVA: Az új modell +from sqlalchemy import text + +async def audit_log_middleware(request: Request, call_next): + # Itt a config_service-t is aszinkron módon kell hívni, ha szükséges + response = await call_next(request) + + if request.method != 'GET': + try: + user_id = getattr(request.state, 'user_id', None) + async with AsyncSessionLocal() as db: + log = OperationalLog( + user_id=user_id, + action=f"API_CALL_{request.method}", + resource_type="ENDPOINT", + resource_id=str(request.url.path), + details={"ip": request.client.host, "method": request.method} + ) + db.add(log) + await db.commit() + except Exception: + pass # A naplózás nem akaszthatja meg a folyamatot + + return response \ No newline at end of file diff --git a/backend/app/db/session.py b/backend/app/db/session.py new file mode 100755 index 0000000..3dfb88d --- /dev/null +++ b/backend/app/db/session.py @@ -0,0 +1,28 @@ +# /opt/docker/dev/service_finder/backend/app/db/session.py +from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker +from app.core.config import settings +from typing import AsyncGenerator + +engine = create_async_engine( + settings.DATABASE_URL, + echo=False, + future=True, + pool_size=30, # A robotok száma miatt + max_overflow=20, + pool_pre_ping=True +) + +AsyncSessionLocal = async_sessionmaker( + engine, + class_=AsyncSession, + expire_on_commit=False, + autoflush=False +) + +async def get_db() -> AsyncGenerator[AsyncSession, None]: + async with AsyncSessionLocal() as session: + try: + yield session + # JAVÍTVA: Nincs automatikus commit! Az endpoint felelőssége. + finally: + await session.close() \ No newline at end of file diff --git a/backend/app/locales/hu.json b/backend/app/locales/hu.json new file mode 100755 index 0000000..c0fc27f --- /dev/null +++ b/backend/app/locales/hu.json @@ -0,0 +1,31 @@ +{ + "email": { + "reg_subject": "Regisztráció - Service Finder", + "pwd_reset_subject": "Jelszó visszaállítás - Service Finder", + "reg_greeting": "Szia {first_name}!", + "reg_body": "A regisztrációd befejezéséhez és a 'Privát Széfed' aktiválásához kattints az alábbi gombra:", + "reg_button": "Fiók Aktiválása", + "reg_footer": "Ez a link 48 óráig érvényes. Ha nem te regisztráltál, kérjük hagyd figyelmen kívül ezt a levelet.", + "pwd_reset_greeting": "Szia!", + "pwd_reset_body": "Jelszó-visszaállítási kérelem érkezett. Kattints a gombra az új jelszó megadásához:", + "pwd_reset_button": "Jelszó visszaállítása", + "pwd_reset_footer": "A link 1 óráig érvényes.", + "link_fallback": "Ha a gomb nem működik, másolja be ezt a linket a böngészőjébe:" + }, + "COMMON": { + "SAVE": "Mentés", + "CANCEL": "Mégse", + "DELETE": "Törlés" + }, + "VEHICLE": { + "LICENSE_PLATE": "Rendszám", + "VIN": "Alvázszám", + "ADD_SUCCESS": "Jármű sikeresen hozzáadva: {name}", + "NOT_FOUND": "A jármű nem található." + }, + "COST": { + "AMOUNT": "Összeg", + "CURRENCY": "Pénznem", + "VAT": "ÁFA" + } +} \ No newline at end of file diff --git a/backend/app/main.py b/backend/app/main.py new file mode 100755 index 0000000..72e111b --- /dev/null +++ b/backend/app/main.py @@ -0,0 +1,97 @@ +# /opt/docker/dev/service_finder/backend/app/main.py +import os +import logging +from contextlib import asynccontextmanager +from datetime import datetime, timezone # Szükséges a health check-hez +from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware +from fastapi.staticfiles import StaticFiles +from starlette.middleware.sessions import SessionMiddleware + +from app.api.v1.api import api_router +from app.core.config import settings +from app.database import AsyncSessionLocal +from app.services.translation_service import translation_service + +# --- LOGGING KONFIGURÁCIÓ --- +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger("Sentinel-Main") + +# --- LIFESPAN (Startup/Shutdown események) --- +@asynccontextmanager +async def lifespan(app: FastAPI): + """ + A rendszer 'ébredési' folyamata. + Hiba esetén ENG alapértelmezésre vált a rendszer. + """ + logger.info("🛰️ Sentinel Master System ébredése...") + + # 1. Nyelvi Cache betöltése az adatbázisból + async with AsyncSessionLocal() as db: + try: + await translation_service.load_cache(db) + logger.info("🌍 i18n fordítási kulcsok aktiválva.") + except Exception as e: + # Itt a kért ERROR log: jelezzük a hibát, de a rendszer ENG fallback-el megy tovább + logger.error(f"❌ i18n hiba az induláskor: {e}. Rendszer alapértelmezett (ENG) módra vált.") + + # Statikus könyvtárak ellenőrzése + os.makedirs(settings.STATIC_DIR, exist_ok=True) + os.makedirs(os.path.join(settings.STATIC_DIR, "previews"), exist_ok=True) + + yield + + logger.info("💤 Sentinel Master System leállítása...") + +# --- APP INICIALIZÁLÁS --- +app = FastAPI( + title="Service Finder Master API", + description="Sentinel Traffic Ecosystem, Asset Vault & AI Evidence Processing", + version="2.0.1", + openapi_url=f"{settings.API_V1_STR}/openapi.json", + docs_url="/docs", + lifespan=lifespan +) + +# --- MIDDLEWARES --- +app.add_middleware( + SessionMiddleware, + secret_key=settings.SECRET_KEY +) + +app.add_middleware( + CORSMiddleware, + allow_origins=[str(origin) for origin in settings.BACKEND_CORS_ORIGINS], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +# --- STATIKUS FÁJLOK --- +app.mount("/static", StaticFiles(directory=settings.STATIC_DIR), name="static") + +# --- ROUTER BEKÖTÉSE --- +app.include_router(api_router, prefix=settings.API_V1_STR) + +# --- ALAPVETŐ RENDSZER VÉGPONTOK --- + +@app.get("/", tags=["System"]) +async def root(): + return { + "status": "online", + "system": "Service Finder Master", + "version": "2.0.1", + "environment": "Production" if not settings.DEBUG_MODE else "Development" + } + +@app.get("/health", tags=["System"]) +async def health_check(): + """ + Monitoring végpont. + JAVÍTVA: A settings.get_now_utc_iso() hiba kiiktatva, standard datetime-ra cserélve. + """ + return { + "status": "ok", + "timestamp": datetime.now(timezone.utc).isoformat(), + "database": "connected" + } \ No newline at end of file diff --git a/backend/app/models/__init__.py b/backend/app/models/__init__.py new file mode 100755 index 0000000..d0c7ad1 --- /dev/null +++ b/backend/app/models/__init__.py @@ -0,0 +1,65 @@ +# /opt/docker/dev/service_finder/backend/app/models/__init__.py +# MB 2.0: Kritikus javítás - Mindenki az app.database.Base-t használja! +from app.database import Base + +# 1. Alapvető identitás és szerepkörök +from .identity import Person, User, Wallet, VerificationToken, SocialAccount, UserRole + +# 2. Földrajzi adatok és címek +from .address import Address, GeoPostalCode, GeoStreet, GeoStreetType, Rating + +# 3. Jármű definíciók +from .vehicle_definitions import VehicleModelDefinition, VehicleType, FeatureDefinition, ModelFeatureMap + +# 4. Szervezeti felépítés +from .organization import Organization, OrganizationMember, OrganizationFinancials, OrganizationSalesAssignment, OrgType, OrgUserRole, Branch + +# 5. Eszközök és katalógusok +from .asset import Asset, AssetCatalog, AssetCost, AssetEvent, AssetFinancials, AssetTelemetry, AssetReview, ExchangeRate, CatalogDiscovery, VehicleOwnership + +# 6. Üzleti logika és előfizetések +from .core_logic import SubscriptionTier, OrganizationSubscription, CreditTransaction, ServiceSpecialty + +# 7. Szolgáltatások és staging +from .service import ServiceProfile, ExpertiseTag, ServiceExpertise, ServiceStaging, DiscoveryParameter + +# 8. Rendszer, Gamification és egyebek +from .gamification import PointRule, LevelConfig, UserStats, Badge, UserBadge, PointsLedger + +# --- 2.2 ÚJDONSÁG: InternalNotification hozzáadása --- +from .system import SystemParameter, InternalNotification + +from .document import Document +from .translation import Translation +from .audit import SecurityAuditLog, ProcessLog, FinancialLedger +from .history import AuditLog, LogSeverity +from .security import PendingAction +from .legal import LegalDocument, LegalAcceptance +from .logistics import Location, LocationType + +# Aliasok a Digital Twin kompatibilitáshoz +Vehicle = Asset +UserVehicle = Asset +VehicleCatalog = AssetCatalog +ServiceRecord = AssetEvent + +__all__ = [ + "Base", "User", "Person", "Wallet", "UserRole", "VerificationToken", "SocialAccount", + "Organization", "OrganizationMember", "OrganizationSalesAssignment", "OrgType", "OrgUserRole", + "Asset", "AssetCatalog", "AssetCost", "AssetEvent", "AssetFinancials", + "AssetTelemetry", "AssetReview", "ExchangeRate", "CatalogDiscovery", + "Address", "GeoPostalCode", "GeoStreet", "GeoStreetType", "Branch", + "PointRule", "LevelConfig", "UserStats", "Badge", "UserBadge", "Rating", "PointsLedger", + + # --- 2.2 ÚJDONSÁG KIEGÉSZÍTÉS --- + "SystemParameter", "InternalNotification", + + "Document", "Translation", "PendingAction", + "SubscriptionTier", "OrganizationSubscription", "CreditTransaction", "ServiceSpecialty", + "AuditLog", "VehicleOwnership", "LogSeverity", + "SecurityAuditLog", "ProcessLog", "FinancialLedger", + "ServiceProfile", "ExpertiseTag", "ServiceExpertise", "ServiceStaging", "DiscoveryParameter", + "Vehicle", "UserVehicle", "VehicleCatalog", "ServiceRecord", "VehicleModelDefinition", + "VehicleType", "FeatureDefinition", "ModelFeatureMap", "LegalDocument", "LegalAcceptance", + "Location", "LocationType" +] \ No newline at end of file diff --git a/backend/app/models/address.py b/backend/app/models/address.py new file mode 100755 index 0000000..bb6cfbe --- /dev/null +++ b/backend/app/models/address.py @@ -0,0 +1,89 @@ +# /opt/docker/dev/service_finder/backend/app/models/address.py +import uuid +from datetime import datetime +from typing import Any, List, Optional +from sqlalchemy import String, Integer, ForeignKey, Text, DateTime, Float, Boolean, text, func, Numeric, Index, and_ +from sqlalchemy.dialects.postgresql import UUID as PG_UUID, JSONB +from sqlalchemy.orm import Mapped, mapped_column, relationship, foreign + +# MB 2.0: Kritikus javítás - a központi metadata-t használjuk az app.database-ből +from app.database import Base + +class GeoPostalCode(Base): + """Irányítószám alapú földrajzi kereső tábla.""" + __tablename__ = "geo_postal_codes" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + country_code: Mapped[str] = mapped_column(String(5), default="HU") + zip_code: Mapped[str] = mapped_column(String(10), nullable=False, index=True) + city: Mapped[str] = mapped_column(String(100), nullable=False, index=True) + +class GeoStreet(Base): + """Utcajegyzék tábla.""" + __tablename__ = "geo_streets" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + postal_code_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("data.geo_postal_codes.id")) + name: Mapped[str] = mapped_column(String(200), nullable=False, index=True) + +class GeoStreetType(Base): + """Közterület jellege (utca, út, köz stb.).""" + __tablename__ = "geo_street_types" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + name: Mapped[str] = mapped_column(String(50), unique=True, nullable=False) + +class Address(Base): + """Univerzális cím entitás GPS adatokkal kiegészítve.""" + __tablename__ = "addresses" + __table_args__ = {"schema": "data"} + + id: Mapped[uuid.UUID] = mapped_column(PG_UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) + postal_code_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("data.geo_postal_codes.id")) + + street_name: Mapped[str] = mapped_column(String(200), nullable=False) + street_type: Mapped[str] = mapped_column(String(50), nullable=False) + house_number: Mapped[str] = mapped_column(String(50), nullable=False) + + stairwell: Mapped[Optional[str]] = mapped_column(String(20)) + floor: Mapped[Optional[str]] = mapped_column(String(20)) + door: Mapped[Optional[str]] = mapped_column(String(20)) + parcel_id: Mapped[Optional[str]] = mapped_column(String(50)) + full_address_text: Mapped[Optional[str]] = mapped_column(Text) + + # Robot és térképes funkciók számára + latitude: Mapped[Optional[float]] = mapped_column(Float) + longitude: Mapped[Optional[float]] = mapped_column(Float) + + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + + + +class Rating(Base): + """Univerzális értékelési rendszer - v1.3.1""" + __tablename__ = "ratings" + __table_args__ = ( + Index('idx_rating_org', 'target_organization_id'), + Index('idx_rating_user', 'target_user_id'), + Index('idx_rating_branch', 'target_branch_id'), + {"schema": "data"} + ) + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + + # MB 2.0: A felhasználók az identity sémában laknak! + author_id: Mapped[int] = mapped_column(Integer, ForeignKey("identity.users.id"), nullable=False) + + target_organization_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("data.organizations.id")) + target_user_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("identity.users.id")) + target_branch_id: Mapped[Optional[uuid.UUID]] = mapped_column(PG_UUID(as_uuid=True), ForeignKey("data.branches.id")) + + score: Mapped[float] = mapped_column(Numeric(3, 2), nullable=False) + comment: Mapped[Optional[str]] = mapped_column(Text) + images: Mapped[Any] = mapped_column(JSONB, server_default=text("'[]'::jsonb")) + + is_verified: Mapped[bool] = mapped_column(Boolean, default=False) + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) \ No newline at end of file diff --git a/backend/app/models/asset.py b/backend/app/models/asset.py new file mode 100644 index 0000000..cf13535 --- /dev/null +++ b/backend/app/models/asset.py @@ -0,0 +1,221 @@ +# /opt/docker/dev/service_finder/backend/app/models/asset.py +from __future__ import annotations +import uuid +from datetime import datetime +from typing import List, Optional, TYPE_CHECKING +from sqlalchemy import String, Boolean, DateTime, ForeignKey, Numeric, text, Text, UniqueConstraint, BigInteger, Integer +from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.dialects.postgresql import UUID as PG_UUID, JSONB +from sqlalchemy.sql import func +from app.database import Base + +class AssetCatalog(Base): + """ Jármű katalógus mesteradatok (Validált technikai sablonok). """ + __tablename__ = "vehicle_catalog" + __table_args__ = ( + UniqueConstraint('make', 'model', 'year_from', 'fuel_type', name='uix_vehicle_catalog_full'), + {"schema": "data"} + ) + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + master_definition_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("data.vehicle_model_definitions.id")) + + make: Mapped[str] = mapped_column(String, index=True, nullable=False) + model: Mapped[str] = mapped_column(String, index=True, nullable=False) + generation: Mapped[Optional[str]] = mapped_column(String, index=True) + year_from: Mapped[Optional[int]] = mapped_column(Integer) + year_to: Mapped[Optional[int]] = mapped_column(Integer) + fuel_type: Mapped[Optional[str]] = mapped_column(String, index=True) + power_kw: Mapped[Optional[int]] = mapped_column(Integer, index=True) + engine_capacity: Mapped[Optional[int]] = mapped_column(Integer, index=True) + + factory_data: Mapped[dict] = mapped_column(JSONB, server_default=text("'{}'::jsonb")) + + master_definition: Mapped[Optional["VehicleModelDefinition"]] = relationship("VehicleModelDefinition", back_populates="variants") + assets: Mapped[List["Asset"]] = relationship("Asset", back_populates="catalog") + +class Asset(Base): + """ A fizikai eszköz (Digital Twin) - Minden adat itt fut össze. """ + __tablename__ = "assets" + __table_args__ = {"schema": "data"} + + id: Mapped[uuid.UUID] = mapped_column(PG_UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) + vin: Mapped[str] = mapped_column(String(17), unique=True, index=True, nullable=False) + license_plate: Mapped[Optional[str]] = mapped_column(String(20), index=True) + name: Mapped[Optional[str]] = mapped_column(String) + + # Állapot és életút mérőszámok + year_of_manufacture: Mapped[Optional[int]] = mapped_column(Integer, index=True) + first_registration_date: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True)) + current_mileage: Mapped[int] = mapped_column(Integer, default=0, index=True) + condition_score: Mapped[int] = mapped_column(Integer, default=100) + + # Értékesítési modul + is_for_sale: Mapped[bool] = mapped_column(Boolean, default=False, index=True) + price: Mapped[Optional[float]] = mapped_column(Numeric(15, 2)) + currency: Mapped[str] = mapped_column(String(3), default="EUR") + + catalog_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("data.vehicle_catalog.id")) + current_organization_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("data.organizations.id")) + + # Identity kapcsolatok + owner_person_id: Mapped[Optional[int]] = mapped_column(BigInteger, ForeignKey("identity.persons.id")) + owner_org_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("data.organizations.id")) + operator_person_id: Mapped[Optional[int]] = mapped_column(BigInteger, ForeignKey("identity.persons.id")) + operator_org_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("data.organizations.id")) + + status: Mapped[str] = mapped_column(String(20), default="active") + individual_equipment: Mapped[dict] = mapped_column(JSONB, server_default=text("'{}'::jsonb")) + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + updated_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), onupdate=func.now()) + + # --- KAPCSOLATOK --- + catalog: Mapped["AssetCatalog"] = relationship("AssetCatalog", back_populates="assets") + financials: Mapped[Optional["AssetFinancials"]] = relationship("AssetFinancials", back_populates="asset", uselist=False) + costs: Mapped[List["AssetCost"]] = relationship("AssetCost", back_populates="asset") + events: Mapped[List["AssetEvent"]] = relationship("AssetEvent", back_populates="asset") + logbook: Mapped[List["VehicleLogbook"]] = relationship("VehicleLogbook", back_populates="asset") + inspections: Mapped[List["AssetInspection"]] = relationship("AssetInspection", back_populates="asset") + reviews: Mapped[List["AssetReview"]] = relationship("AssetReview", back_populates="asset") + telemetry: Mapped[Optional["AssetTelemetry"]] = relationship("AssetTelemetry", back_populates="asset", uselist=False) + assignments: Mapped[List["AssetAssignment"]] = relationship("AssetAssignment", back_populates="asset") + ownership_history: Mapped[List["VehicleOwnership"]] = relationship("VehicleOwnership", back_populates="asset") + +class AssetFinancials(Base): + """ I. Beszerzés és IV. Értékcsökkenés (Amortizáció). """ + __tablename__ = "asset_financials" + __table_args__ = {"schema": "data"} + id: Mapped[int] = mapped_column(Integer, primary_key=True) + asset_id: Mapped[uuid.UUID] = mapped_column(PG_UUID(as_uuid=True), ForeignKey("data.assets.id"), unique=True) + + purchase_price_net: Mapped[float] = mapped_column(Numeric(18, 2)) + purchase_price_gross: Mapped[float] = mapped_column(Numeric(18, 2)) + vat_rate: Mapped[float] = mapped_column(Numeric(5, 2), default=27.00) + activation_date: Mapped[Optional[datetime]] = mapped_column(DateTime) + financing_type: Mapped[str] = mapped_column(String(50)) + accounting_details: Mapped[dict] = mapped_column(JSONB, server_default=text("'{}'::jsonb")) + + asset: Mapped["Asset"] = relationship("Asset", back_populates="financials") + +class AssetCost(Base): + """ II. Üzemeltetés és TCO kimutatás. """ + __tablename__ = "asset_costs" + __table_args__ = {"schema": "data"} + id: Mapped[uuid.UUID] = mapped_column(PG_UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) + asset_id: Mapped[uuid.UUID] = mapped_column(PG_UUID(as_uuid=True), ForeignKey("data.assets.id"), nullable=False) + organization_id: Mapped[int] = mapped_column(Integer, ForeignKey("data.organizations.id"), nullable=False) + + cost_category: Mapped[str] = mapped_column(String(50), index=True) + amount_net: Mapped[float] = mapped_column(Numeric(18, 2), nullable=False) + currency: Mapped[str] = mapped_column(String(3), default="HUF") + date: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + invoice_number: Mapped[Optional[str]] = mapped_column(String(100), index=True) + + data: Mapped[dict] = mapped_column(JSONB, server_default=text("'{}'::jsonb")) + asset: Mapped["Asset"] = relationship("Asset", back_populates="costs") + organization: Mapped["Organization"] = relationship("Organization") + +class VehicleLogbook(Base): + """ Útnyilvántartás (NAV, Kiküldetés, Munkábajárás). """ + __tablename__ = "vehicle_logbook" + __table_args__ = {"schema": "data"} + id: Mapped[int] = mapped_column(Integer, primary_key=True) + asset_id: Mapped[uuid.UUID] = mapped_column(PG_UUID(as_uuid=True), ForeignKey("data.assets.id"), nullable=False) + driver_id: Mapped[int] = mapped_column(Integer, ForeignKey("identity.users.id"), nullable=False) + + trip_type: Mapped[str] = mapped_column(String(30), index=True) + is_reimbursable: Mapped[bool] = mapped_column(Boolean, default=False) + start_mileage: Mapped[int] = mapped_column(Integer) + end_mileage: Mapped[Optional[int]] = mapped_column(Integer) + + asset: Mapped["Asset"] = relationship("Asset", back_populates="logbook") + driver: Mapped["User"] = relationship("User") + +class AssetInspection(Base): + """ Napi ellenőrző lista és Biztonsági check. """ + __tablename__ = "asset_inspections" + __table_args__ = {"schema": "data"} + id: Mapped[int] = mapped_column(Integer, primary_key=True) + asset_id: Mapped[uuid.UUID] = mapped_column(PG_UUID(as_uuid=True), ForeignKey("data.assets.id"), nullable=False) + inspector_id: Mapped[int] = mapped_column(Integer, ForeignKey("identity.users.id"), nullable=False) + + timestamp: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + checklist_results: Mapped[dict] = mapped_column(JSONB, nullable=False) + is_safe: Mapped[bool] = mapped_column(Boolean, default=True) + + asset: Mapped["Asset"] = relationship("Asset", back_populates="inspections") + inspector: Mapped["User"] = relationship("User") + +class AssetReview(Base): + """ Jármű értékelések és visszajelzések. """ + __tablename__ = "asset_reviews" + __table_args__ = {"schema": "data"} + id: Mapped[int] = mapped_column(Integer, primary_key=True) + asset_id: Mapped[uuid.UUID] = mapped_column(PG_UUID(as_uuid=True), ForeignKey("data.assets.id"), nullable=False) + user_id: Mapped[int] = mapped_column(Integer, ForeignKey("identity.users.id"), nullable=False) + + overall_rating: Mapped[Optional[int]] = mapped_column(Integer) # 1-5 csillag + comment: Mapped[Optional[str]] = mapped_column(Text) + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + + asset: Mapped["Asset"] = relationship("Asset", back_populates="reviews") + user: Mapped["User"] = relationship("User") + +class VehicleOwnership(Base): + """ Tulajdonosváltások története. """ + __tablename__ = "vehicle_ownership_history" + __table_args__ = {"schema": "data"} + id: Mapped[int] = mapped_column(Integer, primary_key=True) + asset_id: Mapped[uuid.UUID] = mapped_column(PG_UUID(as_uuid=True), ForeignKey("data.assets.id"), nullable=False) + + user_id: Mapped[int] = mapped_column(Integer, ForeignKey("identity.users.id"), nullable=False) + + acquired_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + disposed_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True)) + + asset: Mapped["Asset"] = relationship("Asset", back_populates="ownership_history") + # EZ A SOR HIÁNYZIK A KÓDODBÓL ÉS EZ JAVÍTJA A HIBÁT: + user: Mapped["User"] = relationship("User", back_populates="ownership_history") + +class AssetTelemetry(Base): + __tablename__ = "asset_telemetry" + __table_args__ = {"schema": "data"} + id: Mapped[int] = mapped_column(Integer, primary_key=True) + asset_id: Mapped[uuid.UUID] = mapped_column(PG_UUID(as_uuid=True), ForeignKey("data.assets.id"), unique=True) + current_mileage: Mapped[int] = mapped_column(Integer, default=0) + asset: Mapped["Asset"] = relationship("Asset", back_populates="telemetry") + +class AssetAssignment(Base): + """ Eszköz-Szervezet összerendelés. """ + __tablename__ = "asset_assignments" + __table_args__ = {"schema": "data"} + id: Mapped[uuid.UUID] = mapped_column(PG_UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) + asset_id: Mapped[uuid.UUID] = mapped_column(PG_UUID(as_uuid=True), ForeignKey("data.assets.id"), nullable=False) + organization_id: Mapped[int] = mapped_column(Integer, ForeignKey("data.organizations.id"), nullable=False) + status: Mapped[str] = mapped_column(String(30), default="active") + + asset: Mapped["Asset"] = relationship("Asset", back_populates="assignments") + organization: Mapped["Organization"] = relationship("Organization", back_populates="assets") + +class AssetEvent(Base): + """ Szerviz, baleset és egyéb jelentős események. """ + __tablename__ = "asset_events" + __table_args__ = {"schema": "data"} + id: Mapped[uuid.UUID] = mapped_column(PG_UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) + asset_id: Mapped[uuid.UUID] = mapped_column(PG_UUID(as_uuid=True), ForeignKey("data.assets.id"), nullable=False) + event_type: Mapped[str] = mapped_column(String(50), nullable=False) + asset: Mapped["Asset"] = relationship("Asset", back_populates="events") + +class ExchangeRate(Base): + __tablename__ = "exchange_rates" + __table_args__ = {"schema": "data"} + id: Mapped[int] = mapped_column(Integer, primary_key=True) + rate: Mapped[float] = mapped_column(Numeric(18, 6), nullable=False) + +class CatalogDiscovery(Base): + """ Robot munkaterület. """ + __tablename__ = "catalog_discovery" + __table_args__ = (UniqueConstraint('make', 'model', name='_make_model_uc'), {"schema": "data"}) + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + make: Mapped[str] = mapped_column(String(100), nullable=False, index=True) + model: Mapped[str] = mapped_column(String(100), nullable=False, index=True) + status: Mapped[str] = mapped_column(String(20), server_default=text("'pending'"), index=True) \ No newline at end of file diff --git a/backend/app/models/audit.py b/backend/app/models/audit.py new file mode 100755 index 0000000..bbf77b3 --- /dev/null +++ b/backend/app/models/audit.py @@ -0,0 +1,63 @@ +# /opt/docker/dev/service_finder/backend/app/models/audit.py +from datetime import datetime +from typing import Any, Optional +from sqlalchemy import String, DateTime, JSON, ForeignKey, text, Numeric, Boolean, BigInteger, Integer +from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.sql import func +from app.database import Base + +class SecurityAuditLog(Base): + """ Kiemelt biztonsági események és a 4-szem elv naplózása. """ + __tablename__ = "security_audit_logs" + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + action: Mapped[Optional[str]] = mapped_column(String(50)) # 'ROLE_CHANGE', 'MANUAL_CREDIT_ADJUST' + + actor_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("identity.users.id")) + target_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("identity.users.id")) + confirmed_by_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("identity.users.id"), nullable=True) + + is_critical: Mapped[bool] = mapped_column(Boolean, default=False) + payload_before: Mapped[Any] = mapped_column(JSON) + payload_after: Mapped[Any] = mapped_column(JSON) + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + +class OperationalLog(Base): + """ Felhasználói szintű napi üzemi események (Audit Trail). """ + __tablename__ = "operational_logs" + + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + user_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("identity.users.id", ondelete="SET NULL")) + action: Mapped[str] = mapped_column(String(100), nullable=False) # pl. "ADD_VEHICLE" + resource_type: Mapped[Optional[str]] = mapped_column(String(50)) + resource_id: Mapped[Optional[str]] = mapped_column(String(100)) + details: Mapped[Any] = mapped_column(JSON, server_default=text("'{}'::jsonb")) + ip_address: Mapped[Optional[str]] = mapped_column(String(45)) + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + +class ProcessLog(Base): + """ Robotok és háttérfolyamatok futási naplója (A reggeli jelentésekhez). """ + __tablename__ = "process_logs" + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + process_name: Mapped[str] = mapped_column(String(100), index=True) # 'Master-Enricher' + start_time: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + end_time: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True)) + items_processed: Mapped[int] = mapped_column(Integer, default=0) + items_failed: Mapped[int] = mapped_column(Integer, default=0) + details: Mapped[Any] = mapped_column(JSON, server_default=text("'{}'::jsonb")) + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + +class FinancialLedger(Base): + """ Minden pénz- és kreditmozgás központi naplója. Billing Engine alapja. """ + __tablename__ = "financial_ledger" + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + user_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("identity.users.id")) + person_id: Mapped[Optional[int]] = mapped_column(BigInteger, ForeignKey("identity.persons.id")) + amount: Mapped[float] = mapped_column(Numeric(18, 4), nullable=False) + currency: Mapped[Optional[str]] = mapped_column(String(10)) + transaction_type: Mapped[Optional[str]] = mapped_column(String(50)) + related_agent_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("identity.users.id")) + details: Mapped[Any] = mapped_column(JSON, server_default=text("'{}'::jsonb")) + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) \ No newline at end of file diff --git a/backend/app/models/core_logic.py b/backend/app/models/core_logic.py new file mode 100755 index 0000000..70e7b77 --- /dev/null +++ b/backend/app/models/core_logic.py @@ -0,0 +1,76 @@ +# /opt/docker/dev/service_finder/backend/app/models/core_logic.py +from typing import Optional, List, Any +from datetime import datetime # Python saját típusa a típusjelöléshez +from sqlalchemy import String, Integer, ForeignKey, Boolean, DateTime, Numeric, text +from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.dialects.postgresql import JSONB +from sqlalchemy.sql import func + +# MB 2.0: A központi aszinkron adatbázis motorból húzzuk be a Base-t +from app.database import Base + +class SubscriptionTier(Base): + """ + Előfizetési csomagok definíciója (pl. Free, Premium, VIP). + A csomagok határozzák meg a korlátokat (pl. max járműszám). + """ + __tablename__ = "subscription_tiers" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + name: Mapped[str] = mapped_column(String, unique=True, index=True) # pl. 'premium' + rules: Mapped[dict] = mapped_column(JSONB, server_default=text("'{}'::jsonb")) # pl. {"max_vehicles": 5} + is_custom: Mapped[bool] = mapped_column(Boolean, default=False) + +class OrganizationSubscription(Base): + """ + Szervezetek aktuális előfizetései és azok érvényessége. + """ + __tablename__ = "org_subscriptions" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + + # Kapcsolat a szervezettel (data séma) + org_id: Mapped[int] = mapped_column(Integer, ForeignKey("data.organizations.id"), nullable=False) + + # Kapcsolat a csomaggal (data séma) + tier_id: Mapped[int] = mapped_column(Integer, ForeignKey("data.subscription_tiers.id"), nullable=False) + + valid_from: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + valid_until: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True) + is_active: Mapped[bool] = mapped_column(Boolean, default=True) + +class CreditTransaction(Base): + """ + Kreditnapló (Pontok, kreditek vagy virtuális egyenleg követése). + """ + __tablename__ = "credit_logs" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + + # Kapcsolat a szervezettel (data séma) + org_id: Mapped[int] = mapped_column(Integer, ForeignKey("data.organizations.id"), nullable=False) + + amount: Mapped[float] = mapped_column(Numeric(10, 2), nullable=False) + description: Mapped[Optional[str]] = mapped_column(String) + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + +class ServiceSpecialty(Base): + """ + Hierarchikus fa struktúra a szerviz szolgáltatásokhoz (pl. Motor -> Futómű). + """ + __tablename__ = "service_specialties" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + + # Önmagára mutató idegen kulcs a hierarchiához + parent_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("data.service_specialties.id")) + + name: Mapped[str] = mapped_column(String, nullable=False) + slug: Mapped[str] = mapped_column(String, unique=True, index=True) + + # Kapcsolat az ős-szolgáltatással (Self-referential relationship) + parent: Mapped[Optional["ServiceSpecialty"]] = relationship("ServiceSpecialty", remote_side=[id], backref="children") \ No newline at end of file diff --git a/backend/app/models/document.py b/backend/app/models/document.py new file mode 100755 index 0000000..183cb47 --- /dev/null +++ b/backend/app/models/document.py @@ -0,0 +1,30 @@ +# /opt/docker/dev/service_finder/backend/app/models/document.py +import uuid +from datetime import datetime +from typing import Optional +from sqlalchemy import String, Integer, Boolean, DateTime, ForeignKey, text +from sqlalchemy.dialects.postgresql import UUID as PG_UUID +from sqlalchemy.orm import Mapped, mapped_column +from sqlalchemy.sql import func +from app.db.base_class import Base + +class Document(Base): + """ NAS alapú dokumentumtár metaadatai. """ + __tablename__ = "documents" + + id: Mapped[uuid.UUID] = mapped_column(PG_UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) + parent_type: Mapped[str] = mapped_column(String(20)) # 'organization' vagy 'asset' + parent_id: Mapped[str] = mapped_column(String(50), index=True) + doc_type: Mapped[Optional[str]] = mapped_column(String(50)) + + original_name: Mapped[str] = mapped_column(String(255)) + file_hash: Mapped[str] = mapped_column(String(64)) + file_ext: Mapped[str] = mapped_column(String(10), default="webp") + mime_type: Mapped[str] = mapped_column(String(100), default="image/webp") + file_size: Mapped[Optional[int]] = mapped_column(Integer) + + has_thumbnail: Mapped[bool] = mapped_column(Boolean, default=False) + thumbnail_path: Mapped[Optional[str]] = mapped_column(String(255)) + + uploaded_by: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("identity.users.id")) + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) \ No newline at end of file diff --git a/backend/app/models/gamification.py b/backend/app/models/gamification.py new file mode 100755 index 0000000..d43e499 --- /dev/null +++ b/backend/app/models/gamification.py @@ -0,0 +1,86 @@ +# /opt/docker/dev/service_finder/backend/app/models/gamification.py +import uuid +from datetime import datetime +from typing import Optional, List, TYPE_CHECKING +from sqlalchemy import ForeignKey, String, Integer, DateTime, func, Boolean, Text, text +from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.dialects.postgresql import UUID as PG_UUID +from app.database import Base # MB 2.0: Központi Base + +if TYPE_CHECKING: + from app.models.identity import User + +class PointRule(Base): + __tablename__ = "point_rules" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + action_key: Mapped[str] = mapped_column(String, unique=True, index=True) + points: Mapped[int] = mapped_column(Integer, default=0) + description: Mapped[Optional[str]] = mapped_column(String) + is_active: Mapped[bool] = mapped_column(Boolean, default=True) + +class LevelConfig(Base): + __tablename__ = "level_configs" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + level_number: Mapped[int] = mapped_column(Integer, unique=True) + min_points: Mapped[int] = mapped_column(Integer) + rank_name: Mapped[str] = mapped_column(String) + +class PointsLedger(Base): + __tablename__ = "points_ledger" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + + # MB 2.0: User az identity sémában lakik! + user_id: Mapped[int] = mapped_column(Integer, ForeignKey("identity.users.id")) + + points: Mapped[int] = mapped_column(Integer, default=0) + penalty_change: Mapped[int] = mapped_column(Integer, server_default=text("0"), default=0) + reason: Mapped[str] = mapped_column(String) + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + + user: Mapped["User"] = relationship("User") + +class UserStats(Base): + __tablename__ = "user_stats" + __table_args__ = {"schema": "data"} + + # MB 2.0: User az identity sémában lakik! + user_id: Mapped[int] = mapped_column(Integer, ForeignKey("identity.users.id"), primary_key=True) + + total_xp: Mapped[int] = mapped_column(Integer, default=0) + social_points: Mapped[int] = mapped_column(Integer, default=0) + current_level: Mapped[int] = mapped_column(Integer, default=1) + + penalty_points: Mapped[int] = mapped_column(Integer, server_default=text("0"), default=0) + restriction_level: Mapped[int] = mapped_column(Integer, server_default=text("0"), default=0) + + updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) + user: Mapped["User"] = relationship("User", back_populates="stats") + +class Badge(Base): + __tablename__ = "badges" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + name: Mapped[str] = mapped_column(String, unique=True) + description: Mapped[str] = mapped_column(String) + icon_url: Mapped[Optional[str]] = mapped_column(String) + +class UserBadge(Base): + __tablename__ = "user_badges" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + + # MB 2.0: User az identity sémában lakik! + user_id: Mapped[int] = mapped_column(Integer, ForeignKey("identity.users.id")) + badge_id: Mapped[int] = mapped_column(Integer, ForeignKey("data.badges.id")) + + earned_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + + user: Mapped["User"] = relationship("User") \ No newline at end of file diff --git a/backend/app/models/history.py b/backend/app/models/history.py new file mode 100755 index 0000000..4591a49 --- /dev/null +++ b/backend/app/models/history.py @@ -0,0 +1,47 @@ +# /opt/docker/dev/service_finder/backend/app/models/history.py +import uuid +import enum +from datetime import datetime, date +from typing import Optional, Any +from sqlalchemy import String, DateTime, ForeignKey, JSON, Date, Text, Integer +from sqlalchemy.dialects.postgresql import ENUM as PG_ENUM, UUID as PG_UUID +from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.sql import func + +# MB 2.0: Központi aszinkron adatbázis motorból húzzuk be a Base-t +from app.database import Base + +class LogSeverity(str, enum.Enum): + info = "info" + warning = "warning" + critical = "critical" + emergency = "emergency" + + +class AuditLog(Base): + """ Rendszerszintű műveletnapló. """ + __tablename__ = "audit_logs" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + + # MB 2.0 JAVÍTÁS: A felhasználó az identity sémában lakik! + user_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("identity.users.id")) + + severity: Mapped[LogSeverity] = mapped_column( + PG_ENUM(LogSeverity, name="log_severity", schema="data"), + default=LogSeverity.info + ) + + action: Mapped[str] = mapped_column(String(100), index=True) + target_type: Mapped[Optional[str]] = mapped_column(String(50), index=True) + target_id: Mapped[Optional[str]] = mapped_column(String(50), index=True) + + old_data: Mapped[Optional[Any]] = mapped_column(JSON) + new_data: Mapped[Optional[Any]] = mapped_column(JSON) + + ip_address: Mapped[Optional[str]] = mapped_column(String(45), index=True) + user_agent: Mapped[Optional[Text]] = mapped_column(Text) + timestamp: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), index=True) + + user: Mapped[Optional["User"]] = relationship("User") \ No newline at end of file diff --git a/backend/app/models/identity.py b/backend/app/models/identity.py new file mode 100755 index 0000000..4a1a3bf --- /dev/null +++ b/backend/app/models/identity.py @@ -0,0 +1,174 @@ +# /opt/docker/dev/service_finder/backend/app/models/identity.py +from __future__ import annotations +import uuid +import enum +from datetime import datetime +from typing import Any, List, Optional, TYPE_CHECKING +from sqlalchemy import String, Boolean, DateTime, ForeignKey, JSON, Numeric, text, Integer, BigInteger, UniqueConstraint +from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.dialects.postgresql import UUID as PG_UUID, ENUM as PG_ENUM +from sqlalchemy.sql import func + +# MB 2.0: Központi aszinkron adatbázis motorból húzzuk be a Base-t +from app.database import Base + +if TYPE_CHECKING: + from .organization import Organization, OrganizationMember + from .asset import VehicleOwnership + from .gamification import UserStats + +class UserRole(str, enum.Enum): + superadmin = "superadmin" + admin = "admin" + region_admin = "region_admin" + country_admin = "country_admin" + moderator = "moderator" + sales_agent = "sales_agent" + user = "user" + service_owner = "service_owner" + fleet_manager = "fleet_manager" + driver = "driver" + +class Person(Base): + """ + Természetes személy identitása. A DNS szint. + Minden identitás adat az 'identity' sémába kerül. + """ + __tablename__ = "persons" + __table_args__ = {"schema": "identity"} + + id: Mapped[int] = mapped_column(BigInteger, primary_key=True, index=True) + id_uuid: Mapped[uuid.UUID] = mapped_column(PG_UUID(as_uuid=True), default=uuid.uuid4, unique=True, nullable=False) + + # A lakcím a 'data' sémában marad + address_id: Mapped[Optional[uuid.UUID]] = mapped_column(PG_UUID(as_uuid=True), ForeignKey("data.addresses.id")) + + # Kritikus azonosító: Név + Anyja neve + Szül.idő hash-elve. + # Ezzel ismerjük fel a személyt akkor is, ha új User accountot hoz létre. + identity_hash: Mapped[Optional[str]] = mapped_column(String(64), unique=True, index=True) + + last_name: Mapped[str] = mapped_column(String, nullable=False) + first_name: Mapped[str] = mapped_column(String, nullable=False) + phone: Mapped[Optional[str]] = mapped_column(String) + + mothers_last_name: Mapped[Optional[str]] = mapped_column(String) + mothers_first_name: Mapped[Optional[str]] = mapped_column(String) + birth_place: Mapped[Optional[str]] = mapped_column(String) + birth_date: Mapped[Optional[datetime]] = mapped_column(DateTime) + + identity_docs: Mapped[Any] = mapped_column(JSON, server_default=text("'{}'::jsonb")) + ice_contact: Mapped[Any] = mapped_column(JSON, server_default=text("'{}'::jsonb")) + + lifetime_xp: Mapped[int] = mapped_column(BigInteger, server_default=text("0")) + penalty_points: Mapped[int] = mapped_column(Integer, server_default=text("0")) + social_reputation: Mapped[float] = mapped_column(Numeric(3, 2), server_default=text("1.00")) + + is_sales_agent: Mapped[bool] = mapped_column(Boolean, server_default=text("false")) + is_active: Mapped[bool] = mapped_column(Boolean, default=True, nullable=False) + is_ghost: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False) + + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + updated_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), onupdate=func.now()) + + # --- KAPCSOLATOK --- + users: Mapped[List["User"]] = relationship("User", back_populates="person") + memberships: Mapped[List["OrganizationMember"]] = relationship("OrganizationMember", back_populates="person") + + # MB 2.0 KIEGÉSZÍTÉS: A személy által birtokolt üzleti entitások (Cégek/Szolgáltatók) + # Ez a lista megmarad akkor is, ha az Organization deaktiválódik. + owned_business_entities: Mapped[List["Organization"]] = relationship("Organization", back_populates="legal_owner") + +class User(Base): + """ Login entitás. Bármikor törölhető (GDPR), de Person-höz kötött. """ + __tablename__ = "users" + __table_args__ = {"schema": "identity"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + email: Mapped[str] = mapped_column(String, unique=True, index=True, nullable=False) + hashed_password: Mapped[Optional[str]] = mapped_column(String) + + role: Mapped[UserRole] = mapped_column( + PG_ENUM(UserRole, name="userrole", schema="identity"), + default=UserRole.user + ) + + person_id: Mapped[Optional[int]] = mapped_column(BigInteger, ForeignKey("identity.persons.id")) + + subscription_plan: Mapped[str] = mapped_column(String(30), server_default=text("'FREE'")) + subscription_expires_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True)) + is_vip: Mapped[bool] = mapped_column(Boolean, server_default=text("false")) + + referral_code: Mapped[Optional[str]] = mapped_column(String(20), unique=True) + + referred_by_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("identity.users.id")) + current_sales_agent_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("identity.users.id")) + + is_active: Mapped[bool] = mapped_column(Boolean, default=False) + is_deleted: Mapped[bool] = mapped_column(Boolean, default=False) + folder_slug: Mapped[Optional[str]] = mapped_column(String(12), unique=True, index=True) + + preferred_language: Mapped[str] = mapped_column(String(5), server_default="hu") + region_code: Mapped[str] = mapped_column(String(5), server_default="HU") + preferred_currency: Mapped[str] = mapped_column(String(3), server_default="HUF") + + scope_level: Mapped[str] = mapped_column(String(30), server_default="individual") + scope_id: Mapped[Optional[str]] = mapped_column(String(50)) + custom_permissions: Mapped[Any] = mapped_column(JSON, server_default=text("'{}'::jsonb")) + + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + + # Kapcsolatok + person: Mapped[Optional["Person"]] = relationship("Person", back_populates="users") + wallet: Mapped[Optional["Wallet"]] = relationship("Wallet", back_populates="user", uselist=False) + social_accounts: Mapped[List["SocialAccount"]] = relationship("SocialAccount", back_populates="user", cascade="all, delete-orphan") + owned_organizations: Mapped[List["Organization"]] = relationship("Organization", back_populates="owner") + stats: Mapped[Optional["UserStats"]] = relationship("UserStats", back_populates="user", uselist=False, cascade="all, delete-orphan") + ownership_history: Mapped[List["VehicleOwnership"]] = relationship("VehicleOwnership", back_populates="user") + + @property + def tier_name(self) -> str: + """Kompatibilitási mező a keresőhöz: a 'FREE' -> 'free' konverzióhoz""" + return (self.subscription_plan or "free").lower() + +class Wallet(Base): + __tablename__ = "wallets" + __table_args__ = {"schema": "identity"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + user_id: Mapped[int] = mapped_column(Integer, ForeignKey("identity.users.id"), unique=True) + + earned_credits: Mapped[float] = mapped_column(Numeric(18, 4), server_default=text("0")) + purchased_credits: Mapped[float] = mapped_column(Numeric(18, 4), server_default=text("0")) + service_coins: Mapped[float] = mapped_column(Numeric(18, 4), server_default=text("0")) + + currency: Mapped[str] = mapped_column(String(3), default="HUF") + user: Mapped["User"] = relationship("User", back_populates="wallet") + +class VerificationToken(Base): + __tablename__ = "verification_tokens" + __table_args__ = {"schema": "identity"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + token: Mapped[uuid.UUID] = mapped_column(PG_UUID(as_uuid=True), default=uuid.uuid4, unique=True, nullable=False) + user_id: Mapped[int] = mapped_column(Integer, ForeignKey("identity.users.id", ondelete="CASCADE"), nullable=False) + token_type: Mapped[str] = mapped_column(String(20), nullable=False) + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + expires_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False) + is_used: Mapped[bool] = mapped_column(Boolean, default=False) + +class SocialAccount(Base): + __tablename__ = "social_accounts" + __table_args__ = ( + UniqueConstraint('provider', 'social_id', name='uix_social_provider_id'), + {"schema": "identity"} + ) + + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + user_id: Mapped[int] = mapped_column(Integer, ForeignKey("identity.users.id", ondelete="CASCADE"), nullable=False) + provider: Mapped[str] = mapped_column(String(50), nullable=False) + social_id: Mapped[str] = mapped_column(String(255), nullable=False, index=True) + email: Mapped[str] = mapped_column(String(255), nullable=False) + extra_data: Mapped[Any] = mapped_column(JSON, server_default=text("'{}'::jsonb")) + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + + user: Mapped["User"] = relationship("User", back_populates="social_accounts") \ No newline at end of file diff --git a/backend/app/models/legal.py b/backend/app/models/legal.py new file mode 100755 index 0000000..c60f4f4 --- /dev/null +++ b/backend/app/models/legal.py @@ -0,0 +1,31 @@ +# /opt/docker/dev/service_finder/backend/app/models/legal.py +from datetime import datetime +from typing import Optional +from sqlalchemy import Integer, String, Text, DateTime, ForeignKey, Boolean +from sqlalchemy.orm import Mapped, mapped_column +from sqlalchemy.sql import func +from app.db.base_class import Base + +class LegalDocument(Base): + __tablename__ = "legal_documents" + + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + title: Mapped[Optional[str]] = mapped_column(String(255)) + content: Mapped[str] = mapped_column(Text) + version: Mapped[str] = mapped_column(String(20)) + + region_code: Mapped[str] = mapped_column(String(5), default="HU") + language: Mapped[str] = mapped_column(String(5), default="hu") + + is_active: Mapped[bool] = mapped_column(Boolean, default=True) + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + +class LegalAcceptance(Base): + __tablename__ = "legal_acceptances" + + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + user_id: Mapped[int] = mapped_column(Integer, ForeignKey("identity.users.id")) + document_id: Mapped[int] = mapped_column(Integer, ForeignKey("data.legal_documents.id")) + accepted_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + ip_address: Mapped[Optional[str]] = mapped_column(String(45)) + user_agent: Mapped[Optional[str]] = mapped_column(Text) \ No newline at end of file diff --git a/backend/app/models/logistics.py b/backend/app/models/logistics.py new file mode 100755 index 0000000..fa4634c --- /dev/null +++ b/backend/app/models/logistics.py @@ -0,0 +1,26 @@ +# /opt/docker/dev/service_finder/backend/app/models/logistics.py +import enum +from typing import Optional +from sqlalchemy import Integer, String, Enum +from sqlalchemy.dialects.postgresql import ENUM as PG_ENUM +from sqlalchemy.orm import Mapped, mapped_column +from app.db.base_class import Base + +class LocationType(str, enum.Enum): + stop = "stop" + warehouse = "warehouse" + client = "client" + +class Location(Base): + __tablename__ = "locations" + + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + name: Mapped[str] = mapped_column(String) + type: Mapped[LocationType] = mapped_column( + PG_ENUM(LocationType, name="location_type", inherit_schema=True), + nullable=False + ) + + coordinates: Mapped[Optional[str]] = mapped_column(String) + address_full: Mapped[Optional[str]] = mapped_column(String) + capacity: Mapped[Optional[int]] = mapped_column(Integer) \ No newline at end of file diff --git a/backend/app/models/organization.py b/backend/app/models/organization.py new file mode 100755 index 0000000..0cf8e52 --- /dev/null +++ b/backend/app/models/organization.py @@ -0,0 +1,217 @@ +# /opt/docker/dev/service_finder/backend/app/models/organization.py +import enum +import uuid +from datetime import datetime +from typing import Any, List, Optional +import sqlalchemy as sa +from sqlalchemy import Column, Integer, String, Boolean, DateTime, ForeignKey, JSON, text, Numeric, BigInteger, Float +from sqlalchemy.dialects.postgresql import ENUM as PG_ENUM, UUID as PG_UUID, JSONB +from sqlalchemy.orm import Mapped, mapped_column, relationship, foreign +from sqlalchemy.sql import func + +# MB 2.0: A központi aszinkron adatbázis motorból húzzuk be a Base-t +from app.database import Base + +class OrgType(str, enum.Enum): + individual = "individual" + service = "service" + service_provider = "service_provider" + fleet_owner = "fleet_owner" + club = "club" + business = "business" + +class OrgUserRole(str, enum.Enum): + OWNER = "OWNER" + ADMIN = "ADMIN" + FLEET_MANAGER = "FLEET_MANAGER" + DRIVER = "DRIVER" + MECHANIC = "MECHANIC" + RECEPTIONIST = "RECEPTIONIST" + +class Organization(Base): + """ + Szervezet entitás (MB 2.0). + Támogatja a 'Digital Twin' logikát: a cég törölhető, de a statisztika és + a jármű-életút adatok megmaradnak az eredeti Person-höz kötve. + """ + __tablename__ = "organizations" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + + # --- 🛡️ BIZTONSÁGI ÉS ÉLETÚT KIEGÉSZÍTÉSEK --- + + # A Jogi képviselő/Tulajdonos (A Person örök DNS-e az identity sémában) + # Ez segít felismerni, ha ugyanaz az ember új céggel akar 'tiszta lapot' nyitni. + legal_owner_id: Mapped[Optional[int]] = mapped_column(BigInteger, ForeignKey("identity.persons.id"), index=True) + + # ÉLETÚT DÁTUMOK (A kért logika alapján) + # 1. A legelső regisztráció dátuma (Soha nem változik) + first_registered_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + + # 2. Az AKTUÁLIS életciklus kezdete. Újraregisztrációkor ez frissül. + # Az API ezt használja szűrőnek: a cég csak az ezutáni adatokat látja a Dashboardon. + current_lifecycle_started_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + + # 3. Az utolsó deaktiválás/törlés időpontja + last_deactivated_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True)) + + # Hányszor regisztrált újra ez a cég/adószám (Reinkarnációs index) + lifecycle_index: Mapped[int] = mapped_column(Integer, default=1, server_default=text("1")) + + # --- 🏢 ALAPADATOK (MEGŐRIZVE) --- + address_id: Mapped[Optional[uuid.UUID]] = mapped_column(PG_UUID(as_uuid=True), ForeignKey("data.addresses.id")) + + is_anonymized: Mapped[bool] = mapped_column(Boolean, default=False, server_default=text("false")) + anonymized_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True)) + + full_name: Mapped[str] = mapped_column(String, nullable=False) + name: Mapped[str] = mapped_column(String, nullable=False) + display_name: Mapped[Optional[str]] = mapped_column(String(50)) + folder_slug: Mapped[str] = mapped_column(String(12), unique=True, index=True) + + default_currency: Mapped[str] = mapped_column(String(3), default="HUF") + country_code: Mapped[str] = mapped_column(String(2), default="HU") + language: Mapped[str] = mapped_column(String(5), default="hu") + + address_zip: Mapped[Optional[str]] = mapped_column(String(10)) + address_city: Mapped[Optional[str]] = mapped_column(String(100)) + address_street_name: Mapped[Optional[str]] = mapped_column(String(150)) + address_street_type: Mapped[Optional[str]] = mapped_column(String(50)) + address_house_number: Mapped[Optional[str]] = mapped_column(String(20)) + address_hrsz: Mapped[Optional[str]] = mapped_column(String(50)) + + tax_number: Mapped[Optional[str]] = mapped_column(String(20), unique=True, index=True) + reg_number: Mapped[Optional[str]] = mapped_column(String(50)) + + org_type: Mapped[OrgType] = mapped_column( + PG_ENUM(OrgType, name="orgtype", schema="data"), + default=OrgType.individual + ) + + status: Mapped[str] = mapped_column(String(30), default="pending_verification") + + # Soft delete: is_active=False és is_deleted=True esetén a cég 'törölt' + is_deleted: Mapped[bool] = mapped_column(Boolean, default=False) + is_active: Mapped[bool] = mapped_column(Boolean, default=True) + + subscription_plan: Mapped[str] = mapped_column(String(30), server_default=text("'FREE'"), index=True) + base_asset_limit: Mapped[int] = mapped_column(Integer, server_default=text("1")) + purchased_extra_slots: Mapped[int] = mapped_column(Integer, server_default=text("0")) + + notification_settings: Mapped[Any] = mapped_column(JSON, server_default=text("'{\"notify_owner\": true, \"alert_days_before\": [30, 15, 7, 1]}'::jsonb")) + external_integration_config: Mapped[Any] = mapped_column(JSON, server_default=text("'{}'::jsonb")) + + # A technikai tulajdonos (User fiók - törölhető) + owner_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("identity.users.id")) + + is_verified: Mapped[bool] = mapped_column(Boolean, default=False) + + # Időbélyegek az aktuális állapothoz + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + updated_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), onupdate=func.now()) + is_ownership_transferable: Mapped[bool] = mapped_column(Boolean, server_default=text("true")) + + # --- 🔗 KAPCSOLATOK (RELATIONSHIPS) --- + assets: Mapped[List["AssetAssignment"]] = relationship("AssetAssignment", back_populates="organization", cascade="all, delete-orphan") + members: Mapped[List["OrganizationMember"]] = relationship("OrganizationMember", back_populates="organization", cascade="all, delete-orphan") + owner: Mapped[Optional["User"]] = relationship("User", back_populates="owned_organizations") + financials: Mapped[List["OrganizationFinancials"]] = relationship("OrganizationFinancials", back_populates="organization", cascade="all, delete-orphan") + + # JAVÍTVA: Ha az Organization törlődik, a ServiceProfile megmarad 'Ghost'-ként (ondelete="SET NULL") + service_profile: Mapped[Optional["ServiceProfile"]] = relationship("ServiceProfile", back_populates="organization", uselist=False) + + branches: Mapped[List["Branch"]] = relationship("Branch", back_populates="organization", cascade="all, delete-orphan") + + # Kapcsolat az örök személy rekordhoz + legal_owner: Mapped[Optional["Person"]] = relationship("Person", back_populates="owned_business_entities") + +class OrganizationFinancials(Base): + __tablename__ = "organization_financials" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + organization_id: Mapped[int] = mapped_column(Integer, ForeignKey("data.organizations.id"), nullable=False) + year: Mapped[int] = mapped_column(Integer, nullable=False) + turnover: Mapped[Optional[float]] = mapped_column(Numeric(18, 2)) + profit: Mapped[Optional[float]] = mapped_column(Numeric(18, 2)) + employee_count: Mapped[Optional[int]] = mapped_column(Integer) + source: Mapped[Optional[str]] = mapped_column(String(50)) + updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) + + organization: Mapped["Organization"] = relationship("Organization", back_populates="financials") + +class OrganizationMember(Base): + __tablename__ = "organization_members" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + organization_id: Mapped[int] = mapped_column(Integer, ForeignKey("data.organizations.id"), nullable=False) + + user_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("identity.users.id")) + person_id: Mapped[Optional[int]] = mapped_column(BigInteger, ForeignKey("identity.persons.id")) + + role: Mapped[OrgUserRole] = mapped_column( + PG_ENUM(OrgUserRole, name="orguserrole", schema="data"), + default=OrgUserRole.DRIVER + ) + permissions: Mapped[Any] = mapped_column(JSON, server_default=text("'{}'::jsonb")) + is_permanent: Mapped[bool] = mapped_column(Boolean, default=False) + is_verified: Mapped[bool] = mapped_column(Boolean, default=False) + + organization: Mapped["Organization"] = relationship("Organization", back_populates="members") + user: Mapped[Optional["User"]] = relationship("User") + person: Mapped[Optional["Person"]] = relationship("Person", back_populates="memberships") + +class OrganizationSalesAssignment(Base): + __tablename__ = "org_sales_assignments" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + organization_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("data.organizations.id")) + agent_user_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("identity.users.id")) + + assigned_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + is_active: Mapped[bool] = mapped_column(Boolean, default=True) + +class Branch(Base): + """ + Telephely entitás. A fizikai helyszín, ahol a szolgáltatás vagy flotta-kezelés zajlik. + """ + __tablename__ = "branches" + __table_args__ = {"schema": "data"} + + id: Mapped[uuid.UUID] = mapped_column(PG_UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) + organization_id: Mapped[int] = mapped_column(Integer, ForeignKey("data.organizations.id"), nullable=False) + address_id: Mapped[Optional[uuid.UUID]] = mapped_column(PG_UUID(as_uuid=True), ForeignKey("data.addresses.id")) + + name: Mapped[str] = mapped_column(String(100), nullable=False) + is_main: Mapped[bool] = mapped_column(Boolean, default=False) + + # Denormalizált adatok a gyors lekérdezéshez + postal_code: Mapped[Optional[str]] = mapped_column(String(10), index=True) + city: Mapped[Optional[str]] = mapped_column(String(100), index=True) + street_name: Mapped[Optional[str]] = mapped_column(String(150)) + street_type: Mapped[Optional[str]] = mapped_column(String(50)) + house_number: Mapped[Optional[str]] = mapped_column(String(20)) + stairwell: Mapped[Optional[str]] = mapped_column(String(20)) + floor: Mapped[Optional[str]] = mapped_column(String(20)) + door: Mapped[Optional[str]] = mapped_column(String(20)) + hrsz: Mapped[Optional[str]] = mapped_column(String(50)) + + opening_hours: Mapped[Any] = mapped_column(JSONB, server_default=text("'{}'::jsonb")) + branch_rating: Mapped[float] = mapped_column(Float, default=0.0) + + status: Mapped[str] = mapped_column(String(30), default="active") + is_deleted: Mapped[bool] = mapped_column(Boolean, default=False) + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + + # Kapcsolatok + organization: Mapped["Organization"] = relationship("Organization", back_populates="branches") + address: Mapped[Optional["Address"]] = relationship("Address") + + # Kapcsolatok (Primaryjoin tartva a rating rendszerhez) + reviews: Mapped[List["Rating"]] = relationship( + "Rating", + primaryjoin="and_(Branch.id==foreign(Rating.target_branch_id))" + ) \ No newline at end of file diff --git a/backend/app/models/security.py b/backend/app/models/security.py new file mode 100755 index 0000000..a49e15d --- /dev/null +++ b/backend/app/models/security.py @@ -0,0 +1,51 @@ +# /opt/docker/dev/service_finder/backend/app/models/security.py +import enum +from datetime import datetime +from typing import Optional, TYPE_CHECKING +from sqlalchemy import String, Integer, ForeignKey, DateTime, text, Enum +from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.dialects.postgresql import JSONB +from sqlalchemy.sql import func + +# MB 2.0: Központi aszinkron adatbázis motorból származó Base +from app.database import Base + +if TYPE_CHECKING: + from .identity import User + +class ActionStatus(str, enum.Enum): + pending = "pending" + approved = "approved" + rejected = "rejected" + expired = "expired" + +class PendingAction(Base): + """ Sentinel: Kritikus műveletek jóváhagyási lánca. """ + __tablename__ = "pending_actions" + __table_args__ = {"schema": "system"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + + # JAVÍTÁS: A User az identity sémában van, nem a data-ban! + requester_id: Mapped[int] = mapped_column(Integer, ForeignKey("identity.users.id"), nullable=False) + approver_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("identity.users.id"), nullable=True) + + status: Mapped[ActionStatus] = mapped_column( + Enum(ActionStatus, name="actionstatus", schema="system"), + default=ActionStatus.pending + ) + + action_type: Mapped[str] = mapped_column(String(50)) # pl. "WALLET_ADJUST" + payload: Mapped[dict] = mapped_column(JSONB, nullable=False) + reason: Mapped[Optional[str]] = mapped_column(String(255), nullable=True) + + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + expires_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), + server_default=text("now() + interval '24 hours'") + ) + processed_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True) + + # Kapcsolatok meghatározása (String hivatkozással a körkörös import ellen) + requester: Mapped["User"] = relationship("User", foreign_keys=[requester_id]) + approver: Mapped[Optional["User"]] = relationship("User", foreign_keys=[approver_id]) \ No newline at end of file diff --git a/backend/app/models/service.py b/backend/app/models/service.py new file mode 100755 index 0000000..7eeeece --- /dev/null +++ b/backend/app/models/service.py @@ -0,0 +1,159 @@ +# /opt/docker/dev/service_finder/backend/app/models/service.py +import uuid +from datetime import datetime +from typing import Any, List, Optional +from sqlalchemy import Integer, String, Boolean, DateTime, ForeignKey, text, Text, Float, Index, Numeric, BigInteger +from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.dialects.postgresql import UUID as PG_UUID, JSONB +from geoalchemy2 import Geometry +from sqlalchemy.sql import func + +# MB 2.0: Központi aszinkron adatbázis motorból húzzuk be a Base-t +from app.database import Base + +class ServiceProfile(Base): + """ Szerviz szolgáltató adatai (v1.3.1). """ + __tablename__ = "service_profiles" + __table_args__ = ( + Index('idx_service_fingerprint', 'fingerprint', unique=True), + {"schema": "data"} + ) + + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + organization_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("data.organizations.id"), unique=True) + parent_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("data.service_profiles.id")) + + fingerprint: Mapped[str] = mapped_column(String(255), index=True, nullable=False) + location: Mapped[Any] = mapped_column(Geometry(geometry_type='POINT', srid=4326, spatial_index=False), index=True) + + status: Mapped[str] = mapped_column(String(20), server_default=text("'ghost'"), index=True) + last_audit_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + + google_place_id: Mapped[Optional[str]] = mapped_column(String(100), unique=True) + rating: Mapped[Optional[float]] = mapped_column(Float) + user_ratings_total: Mapped[Optional[int]] = mapped_column(Integer) + + vibe_analysis: Mapped[Any] = mapped_column(JSONB, server_default=text("'{}'::jsonb")) + social_links: Mapped[Any] = mapped_column(JSONB, server_default=text("'{}'::jsonb")) + specialization_tags: Mapped[Any] = mapped_column(JSONB, server_default=text("'{}'::jsonb")) + + trust_score: Mapped[int] = mapped_column(Integer, default=30) + is_verified: Mapped[bool] = mapped_column(Boolean, default=False) + verification_log: Mapped[Any] = mapped_column(JSONB, server_default=text("'{}'::jsonb")) + + opening_hours: Mapped[Any] = mapped_column(JSONB, server_default=text("'{}'::jsonb")) + contact_phone: Mapped[Optional[str]] = mapped_column(String) + contact_email: Mapped[Optional[str]] = mapped_column(String) + website: Mapped[Optional[str]] = mapped_column(String) + bio: Mapped[Optional[str]] = mapped_column(Text) + + # Kapcsolatok + organization: Mapped["Organization"] = relationship("Organization", back_populates="service_profile") + expertises: Mapped[List["ServiceExpertise"]] = relationship("ServiceExpertise", back_populates="service") + + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + updated_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), onupdate=func.now()) + +class ExpertiseTag(Base): + """ + Szakmai címkék mesterlistája (MB 2.0). + Ez a tábla vezérli a robotok keresését és a Gamification pontozást is. + """ + __tablename__ = "expertise_tags" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + + # Egyedi azonosító kulcs (pl. 'ENGINE_REBUILD') + key: Mapped[str] = mapped_column(String(50), unique=True, index=True) + + # Megjelenítendő nevek + name_hu: Mapped[Optional[str]] = mapped_column(String(100)) + name_en: Mapped[Optional[str]] = mapped_column(String(100)) + + # Főcsoport (pl. 'MECHANICS', 'ELECTRICAL', 'EMERGENCY') + category: Mapped[Optional[str]] = mapped_column(String(30), index=True) + + # --- 🎮 GAMIFICATION ÉS DISCOVERY --- + + # Hivatalos címke (True) vagy júzer/robot által javasolt (False) + is_official: Mapped[bool] = mapped_column(Boolean, default=True, server_default=text("true")) + + # Ha júzer javasolta, itt tároljuk, ki volt az (XP jóváíráshoz) + suggested_by_id: Mapped[Optional[int]] = mapped_column(BigInteger, ForeignKey("identity.persons.id")) + + # ÁLLÍTHATÓ PONTÉRTÉK: Az adatbázisból jön, így bármikor módosítható. + # Ritka szakmáknál magasabb, gyakoriaknál alacsonyabb érték állítható be. + discovery_points: Mapped[int] = mapped_column(Integer, default=10, server_default=text("10")) + + # Robot kulcsszavak (JSONB): ["fék", "betét", "tárcsa", "fékfolyadék"] + # A Scout robot ez alapján azonosítja be a szervizt a weboldala alapján. + search_keywords: Mapped[Any] = mapped_column(JSONB, server_default=text("'[]'::jsonb")) + + # Népszerűségi mutató (hányszor lett felhasználva a rendszerben) + usage_count: Mapped[int] = mapped_column(Integer, default=0, server_default=text("0")) + + # UI ikon azonosító (pl. 'wrench', 'tire-flat', 'car-electric') + icon: Mapped[Optional[str]] = mapped_column(String(50)) + + # Leírás a szakmáról (Adminisztratív célokra) + description: Mapped[Optional[str]] = mapped_column(Text) + + # Időbélyegek + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + updated_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), onupdate=func.now()) + + # --- KAPCSOLATOK --- + services: Mapped[List["ServiceExpertise"]] = relationship("ServiceExpertise", back_populates="tag") + # Visszamutatás a beküldőre (ha van) + suggested_by: Mapped[Optional["Person"]] = relationship("Person") + +class ServiceExpertise(Base): + """ + KAPCSOLÓTÁBLA: Ez köti össze a szervizt a szakmáival. + Itt tároljuk, hogy az adott szerviznél mennyire validált egy szakma. + """ + __tablename__ = "service_expertises" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + service_id: Mapped[int] = mapped_column(Integer, ForeignKey("data.service_profiles.id", ondelete="CASCADE")) + expertise_id: Mapped[int] = mapped_column(Integer, ForeignKey("data.expertise_tags.id", ondelete="CASCADE")) + + # Mennyire biztos ez a tudás? (0: robot találta, 1: júzer mondta, 2: igazolt szakma) + confidence_level: Mapped[int] = mapped_column(Integer, default=0, server_default=text("0")) + + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=text("now()")) + + # Kapcsolatok visszafelé + service = relationship("ServiceProfile", back_populates="expertises") + tag = relationship("ExpertiseTag", back_populates="services") + +class ServiceStaging(Base): + """ Hunter (robot) adatok tárolója. """ + __tablename__ = "service_staging" + __table_args__ = ( + Index('idx_staging_fingerprint', 'fingerprint', unique=True), + {"schema": "data"} + ) + + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + name: Mapped[str] = mapped_column(String, index=True, nullable=False) + postal_code: Mapped[Optional[str]] = mapped_column(String(10), index=True) + city: Mapped[Optional[str]] = mapped_column(String(100), index=True) + full_address: Mapped[Optional[str]] = mapped_column(String) + fingerprint: Mapped[str] = mapped_column(String(255), nullable=False) + raw_data: Mapped[Any] = mapped_column(JSONB, server_default=text("'{}'::jsonb")) + status: Mapped[str] = mapped_column(String(20), server_default=text("'pending'"), index=True) + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + +class DiscoveryParameter(Base): + """ Robot vezérlési paraméterek adminból. """ + __tablename__ = "discovery_parameters" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + city: Mapped[str] = mapped_column(String(100)) + keyword: Mapped[str] = mapped_column(String(100)) + is_active: Mapped[bool] = mapped_column(Boolean, default=True) + last_run_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True)) \ No newline at end of file diff --git a/backend/app/models/social.py b/backend/app/models/social.py new file mode 100755 index 0000000..1a16012 --- /dev/null +++ b/backend/app/models/social.py @@ -0,0 +1,78 @@ +# /opt/docker/dev/service_finder/backend/app/models/social.py +import enum +from datetime import datetime +from typing import Optional, List +from sqlalchemy import String, Integer, ForeignKey, DateTime, Boolean, Text, UniqueConstraint, text +from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.dialects.postgresql import ENUM as PG_ENUM +from sqlalchemy.sql import func +from app.db.base_class import Base + +class ModerationStatus(str, enum.Enum): + pending = "pending" + approved = "approved" + rejected = "rejected" + +class SourceType(str, enum.Enum): + manual = "manual" + ocr = "ocr" + api_import = "import" + +class ServiceProvider(Base): + """ Közösség által beküldött szolgáltatók (v1.3.1). """ + __tablename__ = "service_providers" + + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + name: Mapped[str] = mapped_column(String, nullable=False) + address: Mapped[str] = mapped_column(String, nullable=False) + category: Mapped[Optional[str]] = mapped_column(String) + + status: Mapped[ModerationStatus] = mapped_column( + PG_ENUM(ModerationStatus, name="moderation_status", inherit_schema=True), + default=ModerationStatus.pending + ) + source: Mapped[SourceType] = mapped_column( + PG_ENUM(SourceType, name="source_type", inherit_schema=True), + default=SourceType.manual + ) + + validation_score: Mapped[int] = mapped_column(Integer, default=0) + evidence_image_path: Mapped[Optional[str]] = mapped_column(String) + added_by_user_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("identity.users.id")) + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + +class Vote(Base): + """ Közösségi validációs szavazatok. """ + __tablename__ = "votes" + __table_args__ = ( + UniqueConstraint('user_id', 'provider_id', name='uq_user_provider_vote'), + ) + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + user_id: Mapped[int] = mapped_column(Integer, ForeignKey("identity.users.id"), nullable=False) + provider_id: Mapped[int] = mapped_column(Integer, ForeignKey("data.service_providers.id"), nullable=False) + vote_value: Mapped[int] = mapped_column(Integer, nullable=False) # +1 vagy -1 + +class Competition(Base): + """ Gamifikált versenyek (pl. Januári Feltöltő Verseny). """ + __tablename__ = "competitions" + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + name: Mapped[str] = mapped_column(String, nullable=False) + description: Mapped[Optional[str]] = mapped_column(Text) + start_date: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False) + end_date: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False) + is_active: Mapped[bool] = mapped_column(Boolean, default=True) + +class UserScore(Base): + """ Versenyenkénti ranglista pontszámok. """ + __tablename__ = "user_scores" + __table_args__ = ( + UniqueConstraint('user_id', 'competition_id', name='uq_user_competition_score'), + ) + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + user_id: Mapped[int] = mapped_column(Integer, ForeignKey("identity.users.id")) + competition_id: Mapped[int] = mapped_column(Integer, ForeignKey("data.competitions.id")) + points: Mapped[int] = mapped_column(Integer, default=0) + last_updated: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) \ No newline at end of file diff --git a/backend/app/models/staged_data.py b/backend/app/models/staged_data.py new file mode 100755 index 0000000..898def2 --- /dev/null +++ b/backend/app/models/staged_data.py @@ -0,0 +1,56 @@ +# /opt/docker/dev/service_finder/backend/app/models/staged_data.py +from datetime import datetime +from typing import Optional, Any +from sqlalchemy import String, Integer, DateTime, text, Boolean, Float +from sqlalchemy.orm import Mapped, mapped_column +from sqlalchemy.dialects.postgresql import JSONB +from sqlalchemy.sql import func +from app.db.base_class import Base + +class StagedVehicleData(Base): + """ Robot 2.1 (Researcher) nyers adatgyűjtője. """ + __tablename__ = "staged_vehicle_data" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + source_url: Mapped[Optional[str]] = mapped_column(String) + raw_data: Mapped[dict] = mapped_column(JSONB, server_default=text("'{}'::jsonb")) + + status: Mapped[str] = mapped_column(String(20), default="PENDING", index=True) + error_log: Mapped[Optional[str]] = mapped_column(String) + + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + +class ServiceStaging(Base): + """ Robot 1.3 (Scout) által talált nyers szerviz adatok. """ + __tablename__ = "service_staging" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + name: Mapped[str] = mapped_column(String(255), index=True) + source: Mapped[str] = mapped_column(String(50)) + external_id: Mapped[Optional[str]] = mapped_column(String(100), index=True) + fingerprint: Mapped[str] = mapped_column(String(64), unique=True, index=True) + + city: Mapped[str] = mapped_column(String(100), index=True) + full_address: Mapped[Optional[str]] = mapped_column(String(500)) + contact_phone: Mapped[Optional[str]] = mapped_column(String(50)) + website: Mapped[Optional[str]] = mapped_column(String(255)) + + raw_data: Mapped[dict] = mapped_column(JSONB, server_default=text("'{}'::jsonb")) + status: Mapped[str] = mapped_column(String(20), default="pending", index=True) + trust_score: Mapped[int] = mapped_column(Integer, default=30) + + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + updated_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), onupdate=func.now()) + +class DiscoveryParameter(Base): + """ Felderítési paraméterek (Városok, ahol a Scout keres). """ + __tablename__ = "discovery_parameters" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + city: Mapped[str] = mapped_column(String(100), unique=True, index=True) + country_code: Mapped[str] = mapped_column(String(5), server_default=text("'HU'")) + is_active: Mapped[bool] = mapped_column(Boolean, default=True) + last_run_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True)) \ No newline at end of file diff --git a/backend/app/models/system.py b/backend/app/models/system.py new file mode 100755 index 0000000..2871bf8 --- /dev/null +++ b/backend/app/models/system.py @@ -0,0 +1,53 @@ +# /opt/docker/dev/service_finder/backend/app/models/system.py +import uuid +from datetime import datetime +from typing import Optional +from sqlalchemy import String, Integer, Boolean, DateTime, text, UniqueConstraint, ForeignKey, Text +from sqlalchemy.orm import Mapped, mapped_column +from sqlalchemy.dialects.postgresql import JSONB, UUID +from sqlalchemy.sql import func +from app.db.base_class import Base + +class SystemParameter(Base): + """ Dinamikus konfigurációs motor (Global -> Org -> User). """ + __tablename__ = "system_parameters" + __table_args__ = ( + UniqueConstraint('key', 'scope_level', 'scope_id', name='uix_param_scope'), + {"extend_existing": True} + ) + + id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) + key: Mapped[str] = mapped_column(String, index=True) + category: Mapped[str] = mapped_column(String, server_default="general", index=True) + value: Mapped[dict] = mapped_column(JSONB, nullable=False) + + scope_level: Mapped[str] = mapped_column(String(30), server_default=text("'global'"), index=True) + scope_id: Mapped[Optional[str]] = mapped_column(String(50)) + + is_active: Mapped[bool] = mapped_column(Boolean, default=True) + description: Mapped[Optional[str]] = mapped_column(String) + last_modified_by: Mapped[Optional[int]] = mapped_column(Integer, nullable=True) + updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), onupdate=func.now(), server_default=func.now()) + +class InternalNotification(Base): + """ + Belső értesítési központ. + Ezek az üzenetek várják a felhasználót belépéskor. + """ + __tablename__ = "internal_notifications" + __table_args__ = ({"schema": "data", "extend_existing": True}) + + id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) + user_id: Mapped[int] = mapped_column(ForeignKey("identity.users.id", ondelete="CASCADE"), nullable=False, index=True) + + title: Mapped[str] = mapped_column(String(255), nullable=False) + message: Mapped[str] = mapped_column(Text, nullable=False) + category: Mapped[str] = mapped_column(String(50), server_default="info") # insurance, mot, service, legal + priority: Mapped[str] = mapped_column(String(20), server_default="medium") # low, medium, high, critical + + is_read: Mapped[bool] = mapped_column(Boolean, default=False, index=True) + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + read_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True) + + # Metaadatok a gyors eléréshez (melyik autó, melyik VIN) + data: Mapped[Optional[dict]] = mapped_column(JSONB, nullable=True) \ No newline at end of file diff --git a/backend/app/models/translation.py b/backend/app/models/translation.py new file mode 100755 index 0000000..39edc41 --- /dev/null +++ b/backend/app/models/translation.py @@ -0,0 +1,27 @@ +# /opt/docker/dev/service_finder/backend/app/models/translation.py +from sqlalchemy import String, Integer, Text, Boolean, text +from sqlalchemy.orm import Mapped, mapped_column + +# MB 2.0: A központi aszinkron adatbázis motorból húzzuk be a Base-t +from app.database import Base + +class Translation(Base): + """ + Többnyelvűséget támogató tábla a felületi elemekhez és dinamikus tartalmakhoz. + """ + __tablename__ = "translations" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + + # A fordítandó kulcs (pl. 'NAV_DASHBOARD' vagy 'ERR_USER_NOT_FOUND') + key: Mapped[str] = mapped_column(String(255), index=True) + + # Nyelvi kód (pl: 'hu', 'en', 'de') + lang: Mapped[str] = mapped_column(String(5), index=True) + + # A tényleges fordított szöveg + value: Mapped[str] = mapped_column(Text) + + # --- JAVÍTÁS: A diagnosztika által hiányolt publikációs állapot --- + is_published: Mapped[bool] = mapped_column(Boolean, default=True, server_default=text("true")) \ No newline at end of file diff --git a/backend/app/models/vehicle_definitions.py b/backend/app/models/vehicle_definitions.py new file mode 100755 index 0000000..d372119 --- /dev/null +++ b/backend/app/models/vehicle_definitions.py @@ -0,0 +1,155 @@ +# /opt/docker/dev/service_finder/backend/app/models/vehicle_definitions.py +from __future__ import annotations +from datetime import datetime +from typing import Optional, List +from sqlalchemy import Column, String, Integer, Boolean, DateTime, ForeignKey, text, JSON, Index, UniqueConstraint, Text, ARRAY, func, Numeric +from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.dialects.postgresql import JSONB +from sqlalchemy.sql import func + +# MB 2.0: Egységesített Base import a központi adatbázis motorból +from app.database import Base + +class VehicleType(Base): + """ Jármű kategóriák (pl. Személyautó, Motorkerékpár, Teherautó, Hajó) """ + __tablename__ = "vehicle_types" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + code: Mapped[str] = mapped_column(String(30), unique=True, index=True) + name: Mapped[str] = mapped_column(String(50)) + icon: Mapped[Optional[str]] = mapped_column(String(50)) + units: Mapped[dict] = mapped_column(JSONB, server_default=text("'{\"power\": \"kW\", \"weight\": \"kg\"}'::jsonb")) + + # Kapcsolatok + features: Mapped[List["FeatureDefinition"]] = relationship("FeatureDefinition", back_populates="vehicle_type") + definitions: Mapped[List["VehicleModelDefinition"]] = relationship("VehicleModelDefinition", back_populates="v_type_rel") + + +class FeatureDefinition(Base): + """ Felszereltségi elemek definíciója (pl. ABS, Klíma, LED fényszóró) """ + __tablename__ = "feature_definitions" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + vehicle_type_id: Mapped[int] = mapped_column(Integer, ForeignKey("data.vehicle_types.id")) + code: Mapped[str] = mapped_column(String(50), index=True) + name: Mapped[str] = mapped_column(String(100)) + category: Mapped[str] = mapped_column(String(50), index=True) + + vehicle_type: Mapped["VehicleType"] = relationship("VehicleType", back_populates="features") + model_maps: Mapped[List["ModelFeatureMap"]] = relationship("ModelFeatureMap", back_populates="feature") + + +class VehicleModelDefinition(Base): + """ + Robot v1.1.0 Multi-Tier MDM Master Adattábla. + Az ökoszisztéma technikai igazságforrása. + """ + __tablename__ = "vehicle_model_definitions" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + make: Mapped[str] = mapped_column(String(100), index=True) + marketing_name: Mapped[str] = mapped_column(String(255), index=True) # Nyers név az RDW-ből + official_marketing_name: Mapped[Optional[str]] = mapped_column(String(255)) # Dúsított, validált név (Robot 2.2) + + # --- ROBOT LOGIKAI MEZŐK (JAVÍTVA 2.0 STÍLUSBAN) --- + attempts: Mapped[int] = mapped_column(Integer, default=0, server_default=text("0")) + last_error: Mapped[Optional[str]] = mapped_column(Text, nullable=True) + updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), onupdate=func.now(), server_default=func.now()) + priority_score: Mapped[int] = mapped_column(Integer, default=0, server_default=text("0")) + + # --- PRECISION LOGIC MEZŐK --- + normalized_name: Mapped[Optional[str]] = mapped_column(String(255), index=True, nullable=True) + marketing_name_aliases: Mapped[list] = mapped_column(JSONB, server_default=text("'[]'::jsonb")) + engine_code: Mapped[Optional[str]] = mapped_column(String(50), index=True) # A GLOBÁLIS KAPOCS + + # --- TECHNIKAI AZONOSÍTÓK --- + technical_code: Mapped[str] = mapped_column(String(100), index=True) # Holland rendszám (kulcs) + variant_code: Mapped[Optional[str]] = mapped_column(String(100), index=True) + version_code: Mapped[Optional[str]] = mapped_column(String(100), index=True) + + # --- ÚJ PRÉMIUM MŰSZAKI MEZŐK --- + type_approval_number: Mapped[Optional[str]] = mapped_column(String(100), index=True) # e1*2001/... + seats: Mapped[Optional[int]] = mapped_column(Integer) + width: Mapped[Optional[int]] = mapped_column(Integer) # cm + wheelbase: Mapped[Optional[int]] = mapped_column(Integer) # cm + list_price: Mapped[Optional[int]] = mapped_column(Integer) # EUR (catalogusprijs) + max_speed: Mapped[Optional[int]] = mapped_column(Integer) # km/h + + # Vontatási adatok + towing_weight_unbraked: Mapped[Optional[int]] = mapped_column(Integer) + towing_weight_braked: Mapped[Optional[int]] = mapped_column(Integer) + + # Környezetvédelmi adatok + fuel_consumption_combined: Mapped[Optional[float]] = mapped_column(Numeric(10, 2), nullable=True) + co2_emissions_combined: Mapped[Optional[int]] = mapped_column(Integer) + + + # --- SPECIFIKÁCIÓK --- + vehicle_type_id: Mapped[Optional[int]] = mapped_column(Integer, ForeignKey("data.vehicle_types.id")) + vehicle_class: Mapped[Optional[str]] = mapped_column(String(50), index=True) + body_type: Mapped[Optional[str]] = mapped_column(String(100)) + fuel_type: Mapped[Optional[str]] = mapped_column(String(50), index=True) + + engine_capacity: Mapped[int] = mapped_column(Integer, default=0, index=True) + power_kw: Mapped[int] = mapped_column(Integer, default=0, index=True) + torque_nm: Mapped[Optional[int]] = mapped_column(Integer) + cylinders: Mapped[Optional[int]] = mapped_column(Integer) + cylinder_layout: Mapped[Optional[str]] = mapped_column(String(50)) + + curb_weight: Mapped[Optional[int]] = mapped_column(Integer) + max_weight: Mapped[Optional[int]] = mapped_column(Integer) + euro_classification: Mapped[Optional[str]] = mapped_column(String(20)) + doors: Mapped[Optional[int]] = mapped_column(Integer) + transmission_type: Mapped[Optional[str]] = mapped_column(String(50)) + drive_type: Mapped[Optional[str]] = mapped_column(String(50)) + + # --- ÉLETCIKLUS ÉS STÁTUSZ --- + year_from: Mapped[Optional[int]] = mapped_column(Integer, index=True) + year_to: Mapped[Optional[int]] = mapped_column(Integer, index=True) + production_status: Mapped[Optional[str]] = mapped_column(String(50)) # active / discontinued + + # Státusz szintek: unverified, research_in_progress, awaiting_ai_synthesis, gold_enriched + status: Mapped[str] = mapped_column(String(50), server_default=text("'unverified'"), index=True) + is_manual: Mapped[bool] = mapped_column(Boolean, default=False) + source: Mapped[Optional[str]] = mapped_column(String(100)) + + # --- ADAT-KONTÉNEREK --- + raw_search_context: Mapped[dict] = mapped_column(JSONB, server_default=text("'{}'::jsonb")) + research_metadata: Mapped[dict] = mapped_column(JSONB, server_default=text("'{}'::jsonb")) + specifications: Mapped[dict] = mapped_column(JSONB, server_default=text("'{}'::jsonb")) # Robot 2.2/2.5 Arany adatai + + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + last_research_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True)) + + # --- BEÁLLÍTÁSOK --- + __table_args__ = ( + UniqueConstraint('make', 'normalized_name', 'variant_code', 'version_code', 'fuel_type', name='uix_vmd_precision'), + Index('idx_vmd_lookup_fast', 'make', 'normalized_name'), + Index('idx_vmd_engine_bridge', 'make', 'engine_code'), + {"schema": "data"} + ) + + # KAPCSOLATOK + v_type_rel: Mapped["VehicleType"] = relationship("VehicleType", back_populates="definitions") + feature_maps: Mapped[List["ModelFeatureMap"]] = relationship("ModelFeatureMap", back_populates="model_definition") + + # Hivatkozás az asset.py-ban lévő osztályra + # Megjegyzés: Ha az AssetCatalog nincs itt importálva, húzzal adjuk meg a nevet + variants: Mapped[List["AssetCatalog"]] = relationship("AssetCatalog", back_populates="master_definition") + + +class ModelFeatureMap(Base): + """ Kapcsolótábla a modellek és az alapfelszereltség között """ + __tablename__ = "model_feature_maps" + __table_args__ = {"schema": "data"} + + id: Mapped[int] = mapped_column(Integer, primary_key=True) + model_definition_id: Mapped[int] = mapped_column(Integer, ForeignKey("data.vehicle_model_definitions.id")) + feature_id: Mapped[int] = mapped_column(Integer, ForeignKey("data.feature_definitions.id")) + is_standard: Mapped[bool] = mapped_column(Boolean, default=True) + + model_definition: Mapped["VehicleModelDefinition"] = relationship("VehicleModelDefinition", back_populates="feature_maps") + feature: Mapped["FeatureDefinition"] = relationship("FeatureDefinition", back_populates="model_maps") \ No newline at end of file diff --git a/backend/app/schemas/admin.py b/backend/app/schemas/admin.py new file mode 100755 index 0000000..d354709 --- /dev/null +++ b/backend/app/schemas/admin.py @@ -0,0 +1,123 @@ +# /opt/docker/dev/service_finder/backend/app/api/v1/endpoints/admin.py +from fastapi import APIRouter, Depends, HTTPException, status +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, func, text, delete +from typing import List, Any, Dict, Optional +from datetime import datetime, timedelta + +from app.api import deps +from app.models.identity import User, UserRole +from app.models.system import SystemParameter +from app.models.audit import SecurityAuditLog, OperationalLog +from app.models.security import PendingAction, ActionStatus +from app.services.security_service import security_service +from app.services.translation_service import TranslationService +from app.schemas.admin import PointRuleResponse, LevelConfigResponse, ConfigUpdate +from app.schemas.admin_security import PendingActionResponse, SecurityStatusResponse + +router = APIRouter() + +# --- 🛡️ ADMIN JOGOSULTSÁG ELLENŐRZŐ --- +async def check_admin_access(current_user: User = Depends(deps.get_current_active_user)): + """ Csak Admin vagy Superadmin léphet be a Sentinel központba. """ + if current_user.role not in [UserRole.admin, UserRole.superadmin]: + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail="Sentinel jogosultság szükséges a művelethez!" + ) + return current_user + +# --- 🛰️ 1. SENTINEL: RENDSZERÁLLAPOT ÉS MONITORING --- + +@router.get("/health-monitor", response_model=Dict[str, Any], tags=["Sentinel Monitoring"]) +async def get_system_health( + db: AsyncSession = Depends(deps.get_db), + admin: User = Depends(check_admin_access) +): + """ Részletes rendszerstatisztikák (Felhasználók, Eszközök, Biztonság). """ + stats = {} + + # Felhasználói eloszlás (Nyers SQL a sebességért) + user_res = await db.execute(text("SELECT subscription_plan, count(*) FROM data.users GROUP BY subscription_plan")) + stats["user_distribution"] = {row[0]: row[1] for row in user_res} + + # Eszköz és Szervezet számlálók + stats["total_assets"] = (await db.execute(text("SELECT count(*) FROM data.assets"))).scalar() + stats["total_organizations"] = (await db.execute(text("SELECT count(*) FROM data.organizations"))).scalar() + + # Biztonsági riasztások (Kritikus logok az elmúlt 24 órában) + day_ago = datetime.now() - timedelta(days=1) + crit_logs = await db.execute( + select(func.count(SecurityAuditLog.id)) + .where(SecurityAuditLog.is_critical == True, SecurityAuditLog.created_at >= day_ago) + ) + stats["critical_alerts_24h"] = crit_logs.scalar() or 0 + + return stats + +# --- ⚖️ 2. SENTINEL: NÉGY SZEM ELV (Approval System) --- + +@router.get("/pending-actions", response_model=List[PendingActionResponse], tags=["Sentinel Security"]) +async def list_pending_actions( + db: AsyncSession = Depends(deps.get_db), + admin: User = Depends(check_admin_access) +): + """ Jóváhagyásra váró kritikus műveletek listázása. """ + stmt = select(PendingAction).where(PendingAction.status == ActionStatus.pending) + result = await db.execute(stmt) + return result.scalars().all() + +@router.post("/approve/{action_id}", tags=["Sentinel Security"]) +async def approve_action( + action_id: int, + db: AsyncSession = Depends(deps.get_db), + admin: User = Depends(check_admin_access) +): + """ Művelet véglegesítése egy második admin által. """ + try: + await security_service.approve_action(db, admin.id, action_id) + return {"status": "success", "message": "Művelet végrehajtva."} + except Exception as e: + raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e)) + +# --- ⚙️ 3. DINAMIKUS KONFIGURÁCIÓ (System Parameters) --- + +@router.get("/parameters", tags=["Dynamic Configuration"]) +async def list_all_parameters( + db: AsyncSession = Depends(deps.get_db), + admin: User = Depends(check_admin_access) +): + """ Globális és lokális paraméterek (Limitek, XP szorzók) lekérése. """ + result = await db.execute(select(SystemParameter)) + return result.scalars().all() + +@router.post("/parameters", tags=["Dynamic Configuration"]) +async def set_parameter( + config: ConfigUpdate, + db: AsyncSession = Depends(deps.get_db), + admin: User = Depends(check_admin_access) +): + """ Paraméter beállítása vagy frissítése hierarchikus scope-al. """ + query = text(""" + INSERT INTO data.system_parameters (key, value, scope_level, scope_id, category, last_modified_by) + VALUES (:key, :val, :sl, :sid, :cat, :user) + ON CONFLICT (key, scope_level, scope_id) + DO UPDATE SET + value = EXCLUDED.value, + category = EXCLUDED.category, + last_modified_by = EXCLUDED.last_modified_by, + updated_at = now() + """) + + await db.execute(query, { + "key": config.key, "val": config.value, "sl": config.scope_level, + "sid": config.scope_id, "cat": config.category, "user": admin.email + }) + await db.commit() + return {"status": "success", "message": f"'{config.key}' frissítve."} + +@router.post("/translations/sync", tags=["System Utilities"]) +async def sync_translations(db: AsyncSession = Depends(deps.get_db), admin: User = Depends(check_admin_access)): + """ DB fordítások exportálása JSON fájlokba a frontendnek. """ + await TranslationService.export_to_json(db) + return {"message": "Nyelvi fájlok frissítve."} \ No newline at end of file diff --git a/backend/app/schemas/admin_security.py b/backend/app/schemas/admin_security.py new file mode 100755 index 0000000..988b95f --- /dev/null +++ b/backend/app/schemas/admin_security.py @@ -0,0 +1,23 @@ +# /opt/docker/dev/service_finder/backend/app/schemas/admin_security.py +from pydantic import BaseModel, ConfigDict +from datetime import datetime +from typing import Optional, Any, Dict +from app.models.security import ActionStatus + +class PendingActionResponse(BaseModel): + id: int + requester_id: int + action_type: str + payload: Dict[str, Any] + reason: str + status: ActionStatus + created_at: datetime + expires_at: datetime + + model_config = ConfigDict(from_attributes=True) + +class SecurityStatusResponse(BaseModel): + total_pending: int + critical_logs_last_24h: int + emergency_locks_active: int + diff --git a/backend/app/schemas/asset.py b/backend/app/schemas/asset.py new file mode 100755 index 0000000..10454e1 --- /dev/null +++ b/backend/app/schemas/asset.py @@ -0,0 +1,56 @@ +# /opt/docker/dev/service_finder/backend/app/schemas/asset.py +from pydantic import BaseModel, ConfigDict, Field +from typing import Optional, Dict, Any, List +from uuid import UUID +from datetime import datetime + +class AssetCatalogResponse(BaseModel): + """ A technikai katalógus (Master Data) teljes adattartalma. """ + id: int + make: str + model: str + generation: Optional[str] = None + engine_variant: Optional[str] = None + year_from: Optional[int] = None + year_to: Optional[int] = None + vehicle_class: Optional[str] = None + fuel_type: Optional[str] = None + + # Technikai paraméterek az automatizáláshoz + power_kw: Optional[int] = None + engine_capacity: Optional[int] = None + max_weight_kg: Optional[int] = None + axle_count: Optional[int] = None + euro_class: Optional[str] = None + body_type: Optional[str] = None + engine_code: Optional[str] = None + + factory_data: Dict[str, Any] = Field(default_factory=dict) + + model_config = ConfigDict(from_attributes=True) + +class AssetResponse(BaseModel): + """ A konkrét járműpéldány (Asset) teljes válaszmodellje. """ + id: UUID + vin: str = Field(..., min_length=17, max_length=17) + license_plate: Optional[str] = None + name: Optional[str] = None + year_of_manufacture: Optional[int] = None + + # Státusz és ellenőrzés + status: str + is_verified: bool + verification_method: Optional[str] = None + catalog_match_score: Optional[float] = None + + # Kapcsolt adatok + catalog_id: Optional[int] = None + catalog: Optional[AssetCatalogResponse] = None # Itt jön a dúsítás! + + owner_organization_id: Optional[int] = None + operator_person_id: Optional[int] = None + + created_at: datetime + updated_at: Optional[datetime] = None + + model_config = ConfigDict(from_attributes=True) \ No newline at end of file diff --git a/backend/app/schemas/asset_cost.py b/backend/app/schemas/asset_cost.py new file mode 100755 index 0000000..37c18a0 --- /dev/null +++ b/backend/app/schemas/asset_cost.py @@ -0,0 +1,35 @@ +# /opt/docker/dev/service_finder/backend/app/schemas/asset_cost.py +from pydantic import BaseModel, ConfigDict, Field +from typing import Optional, Dict, Any +from datetime import datetime +from decimal import Decimal +from uuid import UUID + +class AssetCostBase(BaseModel): + cost_type: str # fuel, service, tax, insurance + amount_local: Decimal + currency_local: str = "HUF" + net_amount_local: Optional[Decimal] = None + vat_rate: Optional[Decimal] = Field(default=27.0) + + date: datetime = Field(default_factory=datetime.now) + mileage_at_cost: Optional[int] = None + description: Optional[str] = None + data: Dict[str, Any] = Field(default_factory=dict) # nyugta adatai, GPS koordináták + +class AssetCostCreate(AssetCostBase): + asset_id: UUID + organization_id: int + +class AssetCostResponse(AssetCostBase): + id: UUID + asset_id: UUID + organization_id: int + driver_id: Optional[int] = None + + # Pénzügyi dúsítás (Backend számolja) + amount_eur: Optional[Decimal] = None + exchange_rate_used: Optional[Decimal] = None + created_at: datetime + + model_config = ConfigDict(from_attributes=True) \ No newline at end of file diff --git a/backend/app/schemas/auth.py b/backend/app/schemas/auth.py new file mode 100755 index 0000000..dbf45f4 --- /dev/null +++ b/backend/app/schemas/auth.py @@ -0,0 +1,54 @@ +# /opt/docker/dev/service_finder/backend/app/schemas/auth.py +from pydantic import BaseModel, EmailStr, Field, ConfigDict +from typing import Optional, Dict, List +from datetime import date, datetime + +class DocumentDetail(BaseModel): + number: str + expiry_date: date + +class ICEContact(BaseModel): + name: str + phone: str + relationship: str + +class UserLiteRegister(BaseModel): + """ Step 1: Gyors regisztráció (Alap azonosítás). """ + email: EmailStr + password: str = Field(..., min_length=8, description="Minimum 8 karakter hosszú jelszó") + first_name: str + last_name: str + + model_config = ConfigDict(from_attributes=True) + +class UserKYCComplete(BaseModel): + """ Step 2: Teljes körű személyazonosítás és címadatok. """ + phone_number: str = Field(..., pattern=r"^\+?[0-9]{7,15}$") + birth_place: str + birth_date: date + mothers_last_name: str + mothers_first_name: str + + # Atomizált címadatok a pontos GPS-hez és Robot-munkához + address_zip: str + address_city: str + address_street_name: str + address_street_type: str # utca, út, tér... + address_house_number: str + address_stairwell: Optional[str] = None + address_floor: Optional[str] = None + address_door: Optional[str] = None + address_hrsz: Optional[str] = None # Külterület/Helyrajzi szám + + # Okmányok és Vészhelyzet + identity_docs: Dict[str, DocumentDetail] # pl: {"ID_CARD": {...}, "LICENSE": {...}} + ice_contact: ICEContact + + preferred_language: str = "hu" + preferred_currency: str = "HUF" + +class Token(BaseModel): + access_token: str + refresh_token: Optional[str] = None + token_type: str = "bearer" + is_active: bool \ No newline at end of file diff --git a/backend/app/schemas/evidence.py b/backend/app/schemas/evidence.py new file mode 100755 index 0000000..1f0c824 --- /dev/null +++ b/backend/app/schemas/evidence.py @@ -0,0 +1,47 @@ +# app/schemas/evidence.py +from pydantic import BaseModel, Field +from typing import Optional + +class RegistrationDocumentExtracted(BaseModel): + """A magyar forgalmi engedély teljes adattartalma.""" + # A - Okmány adatok + license_plate: Optional[str] = Field(None, alias="A", description="Rendszám") + first_registration_date: Optional[str] = Field(None, alias="B", description="Első nyilvántartásba vétel") + doc_serial_number: Optional[str] = Field(None, description="Okmány sorszáma (jobb felső sarok)") + + # C - Tulajdonos/Üzembentartó adatok + owner_last_name: Optional[str] = Field(None, alias="C.1.1", description="Családi név vagy cégnév") + owner_first_name: Optional[str] = Field(None, alias="C.1.2", description="Utónév") + owner_address: Optional[str] = Field(None, alias="C.1.3", description="Lakcím/Székhely") + owner_status: Optional[str] = Field(None, alias="C.4", description="Jogosultság státusza (a=tulaj, b=nem tulaj)") + + # D - Jármű technikai adatai + make: Optional[str] = Field(None, alias="D.1", description="Gyártmány") + vehicle_type: Optional[str] = Field(None, alias="D.2", description="Típus") + commercial_description: Optional[str] = Field(None, alias="D.3", description="Kereskedelmi leírás") + vin: Optional[str] = Field(None, alias="E", description="Alvázszám (17 karakter)") + + # G, F - Tömeg adatok + weight_kg: Optional[int] = Field(None, alias="G", description="Saját tömeg") + max_weight_kg: Optional[int] = Field(None, alias="F.1", description="Együttes tömeg") + + # P, V - Motor és Környezetvédelem + engine_capacity: Optional[int] = Field(None, alias="P.1", description="Hengerűrtartalom (cm3)") + engine_power: Optional[float] = Field(None, alias="P.2", description="Teljesítmény (kW)") + fuel_type: Optional[str] = Field(None, alias="P.3", description="Hajtóanyag") + engine_code: Optional[str] = Field(None, alias="P.5", description="Motorkód") + env_category: Optional[str] = Field(None, alias="V.9", description="Környezetvédelmi osztály") + + # R, S, H - Egyéb + color: Optional[str] = Field(None, alias="R", description="Szín") + seats: Optional[int] = Field(None, alias="S.1", description="Ülések száma") + expiry_date: Optional[str] = Field(None, alias="H", description="Műszaki érvényesség") + transmission_type: Optional[str] = Field(None, description="Sebességváltó fajtája") + + class Config: + populate_by_name = True + +class OcrResponse(BaseModel): + success: bool + message: str + data: Optional[RegistrationDocumentExtracted] = None \ No newline at end of file diff --git a/backend/app/schemas/fleet.py b/backend/app/schemas/fleet.py new file mode 100755 index 0000000..b835c08 --- /dev/null +++ b/backend/app/schemas/fleet.py @@ -0,0 +1,20 @@ +# /opt/docker/dev/service_finder/backend/app/schemas/fleet.py +from pydantic import BaseModel, ConfigDict +from typing import Optional, List +from datetime import date +from uuid import UUID + +class EventCreate(BaseModel): + asset_id: UUID + event_type: str # 'SERVICE', 'FUEL', 'MOT' + date: date + odometer_value: int + cost_amount: float + description: Optional[str] = None + provider_id: Optional[int] = None + +class TCOStats(BaseModel): + asset_id: UUID + total_cost_huf: float + cost_per_km: float + model_config = ConfigDict(from_attributes=True) \ No newline at end of file diff --git a/backend/app/schemas/organization.py b/backend/app/schemas/organization.py new file mode 100755 index 0000000..65bb0fa --- /dev/null +++ b/backend/app/schemas/organization.py @@ -0,0 +1,38 @@ +from pydantic import BaseModel, Field, ConfigDict +from typing import Optional, List + +class ContactCreate(BaseModel): + full_name: str + email: str + phone: Optional[str] = None + contact_type: str = "primary" + +class CorpOnboardIn(BaseModel): + """ Teljes onboarding adatcsomag atomizált címekkel. """ + full_name: str = Field(..., description="Hivatalos cégnév") + name: str = Field(..., description="Rövid név") + display_name: str + + tax_number: str + reg_number: Optional[str] = None + country_code: str = "HU" + language: str = "hu" + default_currency: str = "HUF" + + # --- ATOMIZÁLT CÍM (Modell szinkron) --- + address_zip: str + address_city: str + address_street_name: str + address_street_type: str + address_house_number: str + address_stairwell: Optional[str] = None + address_floor: Optional[str] = None + address_door: Optional[str] = None + address_hrsz: Optional[str] = None + + contacts: List[ContactCreate] = [] + +class CorpOnboardResponse(BaseModel): + organization_id: int + status: str + model_config = ConfigDict(from_attributes=True) \ No newline at end of file diff --git a/backend/app/schemas/service.py b/backend/app/schemas/service.py new file mode 100755 index 0000000..65bb0fa --- /dev/null +++ b/backend/app/schemas/service.py @@ -0,0 +1,38 @@ +from pydantic import BaseModel, Field, ConfigDict +from typing import Optional, List + +class ContactCreate(BaseModel): + full_name: str + email: str + phone: Optional[str] = None + contact_type: str = "primary" + +class CorpOnboardIn(BaseModel): + """ Teljes onboarding adatcsomag atomizált címekkel. """ + full_name: str = Field(..., description="Hivatalos cégnév") + name: str = Field(..., description="Rövid név") + display_name: str + + tax_number: str + reg_number: Optional[str] = None + country_code: str = "HU" + language: str = "hu" + default_currency: str = "HUF" + + # --- ATOMIZÁLT CÍM (Modell szinkron) --- + address_zip: str + address_city: str + address_street_name: str + address_street_type: str + address_house_number: str + address_stairwell: Optional[str] = None + address_floor: Optional[str] = None + address_door: Optional[str] = None + address_hrsz: Optional[str] = None + + contacts: List[ContactCreate] = [] + +class CorpOnboardResponse(BaseModel): + organization_id: int + status: str + model_config = ConfigDict(from_attributes=True) \ No newline at end of file diff --git a/backend/app/schemas/service_hunt.py b/backend/app/schemas/service_hunt.py new file mode 100755 index 0000000..3d17bb7 --- /dev/null +++ b/backend/app/schemas/service_hunt.py @@ -0,0 +1,9 @@ +# /opt/docker/dev/service_finder/backend/app/schemas/service_hunt.py +class ServiceHuntRequest(BaseModel): + name: str + category_id: int + address: str + latitude: float + longitude: float + user_latitude: float + user_longitude: float \ No newline at end of file diff --git a/backend/app/schemas/social.py b/backend/app/schemas/social.py new file mode 100755 index 0000000..4422177 --- /dev/null +++ b/backend/app/schemas/social.py @@ -0,0 +1,58 @@ +# /opt/docker/dev/service_finder/backend/app/schemas/social.py +from pydantic import BaseModel, ConfigDict +from typing import Optional, List +from datetime import datetime +from app.models.social import ModerationStatus, SourceType + +# --- Alap Sémák (Szolgáltatók) --- + +class ServiceProviderBase(BaseModel): + name: str + address: Optional[str] = None + category: Optional[str] = None + source: SourceType = SourceType.manual + +class ServiceProviderCreate(BaseModel): + name: str + address: str + category: Optional[str] = None + +class ServiceProviderResponse(ServiceProviderBase): + id: int + status: ModerationStatus + validation_score: int + evidence_image_path: Optional[str] = None + added_by_user_id: Optional[int] = None + created_at: datetime + + model_config = ConfigDict(from_attributes=True) + +# --- Gamifikáció és Szavazás (Voting & Gamification) --- + +class VoteCreate(BaseModel): + vote_value: int + +class LeaderboardEntry(BaseModel): + username: str + points: int + rank: int + + model_config = ConfigDict(from_attributes=True) + +class BadgeSchema(BaseModel): + id: int + name: str + description: str + icon_url: Optional[str] = None # JAVÍTVA: icon_url a modell szerint + + model_config = ConfigDict(from_attributes=True) # Pydantic V2 kompatibilis + +class UserStatSchema(BaseModel): + user_id: int + total_xp: int # JAVÍTVA: total_xp a modell szerint + current_level: int + penalty_points: int # JAVÍTVA: új mező + rank_title: Optional[str] = None + badges: List[BadgeSchema] = [] + + model_config = ConfigDict(from_attributes=True) \ No newline at end of file diff --git a/backend/app/schemas/token.py b/backend/app/schemas/token.py new file mode 100755 index 0000000..a5c685a --- /dev/null +++ b/backend/app/schemas/token.py @@ -0,0 +1,10 @@ +from pydantic import BaseModel +from typing import Optional + +class Token(BaseModel): + access_token: str + token_type: str + +class TokenData(BaseModel): + username: Optional[str] = None + role: Optional[str] = None diff --git a/backend/app/schemas/user.py b/backend/app/schemas/user.py new file mode 100755 index 0000000..0fac850 --- /dev/null +++ b/backend/app/schemas/user.py @@ -0,0 +1,25 @@ +# /opt/docker/dev/service_finder/backend/app/schemas/user.py +from pydantic import BaseModel, EmailStr, field_validator, ConfigDict +from typing import Optional +from datetime import date + +class UserBase(BaseModel): + email: EmailStr + first_name: Optional[str] = None + last_name: Optional[str] = None + is_active: bool = True + region_code: str = "HU" + +class UserResponse(UserBase): + id: int + person_id: Optional[int] = None + role: str + subscription_plan: str + scope_level: str + scope_id: Optional[str] = None + model_config = ConfigDict(from_attributes=True) + +class UserUpdate(BaseModel): + first_name: Optional[str] = None + last_name: Optional[str] = None + preferred_language: Optional[str] = None \ No newline at end of file diff --git a/backend/app/schemas/vehicle.py.old b/backend/app/schemas/vehicle.py.old new file mode 100755 index 0000000..abcfac0 --- /dev/null +++ b/backend/app/schemas/vehicle.py.old @@ -0,0 +1,30 @@ +from pydantic import BaseModel, Field, validator +from typing import Optional, List, Any +from uuid import UUID +from datetime import datetime + +class EngineSpecBase(BaseModel): + engine_code: str + fuel_type: str + power_kw: int + default_service_interval_km: int = 15000 + +class VehicleBase(BaseModel): + brand_id: int + model_name: str + identification_number: str + license_plate: Optional[str] = None + tracking_mode: str = "km" + +class VehicleCreate(VehicleBase): + current_company_id: int + engine_spec_id: int + +class VehicleRead(VehicleBase): + id: UUID + current_rating_pct: int + total_real_usage: float + created_at: datetime + + class Config: + from_attributes = True \ No newline at end of file diff --git a/backend/app/schemas/vehicle_categories.py b/backend/app/schemas/vehicle_categories.py new file mode 100755 index 0000000..8cdc915 --- /dev/null +++ b/backend/app/schemas/vehicle_categories.py @@ -0,0 +1,20 @@ +# app/core/schemas/vehicle_categories.py + +VEHICLE_SCHEMAS = { + "motorcycle": { + "features": ["ABS", "Markolatfűtés", "Szélvédő", "Bukócső/gomba", "Automata váltó", "Gyári dobozok", "Zárható doboz", "Veterán"], + "service_items": ["motorolaj", "olajszűrő", "levegőszűrő", "lánc_szett", "fékfolyadék", "gyújtógyertya", "szelephézag_ellenőrzés"] + }, + "car": { + "features": ["Automata", "Tempomat", "Összkerékhajtás", "Alufelni", "Elektromos ablak", "Vonóhorog", "ISOFIX rendszer", "ESP", "Szervizkönyv", "Veterán"], + "service_items": ["motorolaj", "olajszűrő", "levegőszűrő", "pollenszűrő", "vezérlés_szett", "hosszbordásszíj", "váltóolaj", "fagyálló"] + }, + "truck": { + "features": ["Légrugó", "Hálófülke", "Retarder/Intarder", "Emelőhátfal", "Tengelysúly-mérő", "AdBlue", "Állóhelyzeti klíma"], + "service_items": ["motorolaj", "légfék_szárító_patron", "üzemanyagszűrő", "érintésvédelmi_vizsga", "tengely_zsírozás"] + }, + "boat": { + "features": ["Utánfutó", "Takaróponyva", "Orrsugárkormány", "Halradar", "Kormányállás", "Üzemanyagtartály", "Sólyakocsi", "Zárható tároló", "Elektromos horgonycsörlő"], + "service_items": ["motorolaj", "hajómotor_anód", "vízpumpa_lapát", "téliesítés", "algagátlózás"] + } +} \ No newline at end of file diff --git a/backend/app/scripts/discovery_bot.py.veryold b/backend/app/scripts/discovery_bot.py.veryold new file mode 100755 index 0000000..87e6be0 --- /dev/null +++ b/backend/app/scripts/discovery_bot.py.veryold @@ -0,0 +1,38 @@ +import asyncio +import httpx +from sqlalchemy import text +from app.db.session import engine +from datetime import datetime + +async def log_discovery(conn, category, brand, model, action): + await conn.execute(text(""" + INSERT INTO data.bot_discovery_logs (category, brand_name, model_name, action_taken) + VALUES (:c, :b, :m, :a) + """), {"c": category, "b": brand, "m": model, "a": action}) + +async def run_discovery(): + async with engine.begin() as conn: + print(f"🚀 Jármű felfedezés indul: {datetime.now()}") + + # Jelenleg a CAR kategóriára fókuszálunk egy külső API segítségével (pl. NHTSA - Ingyenes) + # Itt egy példa, hogyan bővül dinamikusan a rendszer + async with httpx.AsyncClient() as client: + # Autók lekérése + response = await client.get("https://vpic.nhtsa.dot.gov/api/vehicles/getallmakes?format=json") + if response.status_code == 200: + makes = response.json().get('Results', [])[:100] # Tesztként az első 100 + + for make in makes: + brand_name = make['Make_Name'].strip() + # Megnézzük, megvan-e már + res = await conn.execute(text("SELECT id FROM data.vehicle_brands WHERE name = :n"), {"n": brand_name}) + if not res.scalar(): + await conn.execute(text("INSERT INTO data.vehicle_brands (category_id, name) VALUES (1, :n)"), {"n": brand_name}) + await log_discovery(conn, "CAR", brand_name, "ALL", "NEW_BRAND") + print(f"✨ Új márka találva: {brand_name}") + + await conn.commit() + print("✅ Bot futása befejeződött.") + +if __name__ == "__main__": + asyncio.run(run_discovery()) \ No newline at end of file diff --git a/backend/app/scripts/link_catalog_to_mdm.py b/backend/app/scripts/link_catalog_to_mdm.py new file mode 100755 index 0000000..3fd77eb --- /dev/null +++ b/backend/app/scripts/link_catalog_to_mdm.py @@ -0,0 +1,63 @@ +# /opt/docker/dev/service_finder/backend/app/scripts/link_catalog_to_mdm.py +import asyncio +from sqlalchemy import select, update +from app.db.session import SessionLocal +from app.models.asset import AssetCatalog +from app.models.vehicle_definitions import VehicleModelDefinition, VehicleType + +async def link_catalog_to_mdm(): + """ Összefűzi a technikai katalógust a központi Master Definíciókkal. """ + async with SessionLocal() as db: + try: + print("🔍 Master-Híd építése indul...") + + # 1. Típusok betöltése + type_res = await db.execute(select(VehicleType)) + types = {t.code: t.id for t in type_res.scalars().all()} + + # 2. Egyedi variánsok lekérése + stmt = select(AssetCatalog.make, AssetCatalog.model, AssetCatalog.vehicle_class).distinct() + raw_data = await db.execute(stmt) + unique_models = raw_data.all() + + linked_count = 0 + for make, model, v_class in unique_models: + t_code = v_class if v_class in types else "car" + t_id = types.get(t_code) + + # Master rekord keresése vagy létrehozása + master_stmt = select(VehicleModelDefinition).where( + VehicleModelDefinition.make == make, + VehicleModelDefinition.marketing_name == model + ) + master = (await db.execute(master_stmt)).scalar_one_or_none() + + if not master: + master = VehicleModelDefinition( + make=make, + technical_code=model.replace(" ", "-").lower(), + marketing_name=model, + vehicle_type=t_code, + vehicle_type_id=t_id, + status="unverified", + source="linking_process" + ) + db.add(master) + await db.flush() + + # Összekötés + await db.execute( + update(AssetCatalog) + .where(AssetCatalog.make == make, AssetCatalog.model == model) + .values(master_definition_id=master.id) + ) + linked_count += 1 + + await db.commit() + print(f"✅ Sikeresen összekötve: {linked_count} modell.") + except Exception as e: + await db.rollback() + print(f"❌ Hiba: {e}") + +if __name__ == "__main__": + asyncio.run(link_catalog_to_mdm()) \ No newline at end of file diff --git a/backend/app/scripts/morning_report.py b/backend/app/scripts/morning_report.py new file mode 100755 index 0000000..53e4602 --- /dev/null +++ b/backend/app/scripts/morning_report.py @@ -0,0 +1,35 @@ +# /opt/docker/dev/service_finder/backend/app/scripts/morning_report.py +import asyncio +from sqlalchemy import select +from app.db.session import SessionLocal +from app.models.audit import ProcessLog +from datetime import datetime, timedelta, timezone + +async def generate_morning_report(): + """ Összesíti a háttérfolyamatok (robotok) elmúlt 24 órás teljesítményét. """ + async with SessionLocal() as db: + yesterday = datetime.now(timezone.utc) - timedelta(days=1) + stmt = select(ProcessLog).where(ProcessLog.start_time >= yesterday) + res = await db.execute(stmt) + logs = res.scalars().all() + + report = f"📊 REGGELI ROBOT JELENTÉS - {datetime.now().date()}\n" + report += "="*40 + "\n" + + total_proc = sum(log.items_processed for log in logs) + total_fail = sum(log.items_failed for log in logs) + + report += f"✅ Feldolgozott egységek: {total_proc}\n" + report += f"❌ Sikertelen műveletek: {total_fail}\n" + + if logs: + report += "\nAktív robotok állapota:\n" + for log in logs: + status = "🟢 OK" if log.items_failed == 0 else "🔴 HIBA" + report += f" - {log.process_name}: {log.items_processed} feldolgozva ({status})\n" + + print(report) + return report + +if __name__ == "__main__": + asyncio.run(generate_morning_report()) \ No newline at end of file diff --git a/backend/app/scripts/seed_system_params.py b/backend/app/scripts/seed_system_params.py new file mode 100755 index 0000000..ee9aa24 --- /dev/null +++ b/backend/app/scripts/seed_system_params.py @@ -0,0 +1,428 @@ +# /opt/docker/dev/service_finder/backend/app/scripts/seed_system_params.py +import asyncio +import logging +from sqlalchemy import select +from app.db.session import AsyncSessionLocal +from app.models.system import SystemParameter + +logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s]: %(message)s') +logger = logging.getLogger("Seed-System-Params-2.0") + +async def seed_params(): + async with AsyncSessionLocal() as db: + + # ---------------------------------------------------------------------- + # GONDOLATMENET A STRUKTÚRÁHOZ: + # Ez a lista tartalmazza a rendszer összes "alapértelmezett" (global) beállítását. + # Minden modul innen kapja meg az indulási értékeit. Ha az admin felületen + # egy értéket módosítanak, ez a script a következő futáskor NEM írja felül azt, + # csak a leírásokat (description) és a kategóriákat frissíti. + # ---------------------------------------------------------------------- + + params = [ + # --- 1. KOMMUNIKÁCIÓ (Az EmailManager 2.0 motorja) --- + { + "key": "email_provider", + "value": "smtp", # Lehetőségek: "smtp", "sendgrid", "disabled" + "category": "communication", + "description": "Aktív e-mail küldő szolgáltató", + "scope_level": "global" + }, + { + "key": "emails_from_email", + "value": "noreply@profibot.hu", + "category": "communication", + "description": "A rendszer által küldött levelek feladó címe", + "scope_level": "global" + }, + { + "key": "emails_from_name", + "value": "Sentinel Master", + "category": "communication", + "description": "A rendszer által küldött levelek feladó neve", + "scope_level": "global" + }, + { + "key": "sendgrid_api_key", + "value": "", + "category": "communication", + "description": "SendGrid API kulcs (ha a provider 'sendgrid')", + "scope_level": "global" + }, + { + "key": "smtp_config", + "value": { + "host": "localhost", + "port": 587, + "user": "smtp_user", + "pass": "smtp_password", + "tls": True + }, + "category": "communication", + "description": "SMTP szerver konfiguráció JSON formátumban", + "scope_level": "global" + }, + + # --- 2. AUTH & SECURITY (Kapuőr modul) --- + {"key": "auth_min_password_length", "value": 8, "category": "security", "description": "Minimum jelszóhossz", "scope_level": "global"}, + {"key": "auth_default_role", "value": "user", "category": "auth", "description": "Új regisztrálók alapértelmezett rangja", "scope_level": "global"}, + {"key": "auth_registration_hours", "value": 48, "category": "auth", "description": "Regisztrációs link érvényessége", "scope_level": "global"}, + {"key": "auth_password_reset_hours", "value": 2, "category": "security", "description": "Jelszóvisszaállító link érvényessége", "scope_level": "global"}, + {"key": "asset_auto_transfer_enabled", "value": False, "category": "security", "description": "Autonóm tulajdonosváltás engedélyezése", "scope_level": "global"}, + + # --- 3. LIMITS & CSOMAGOK (A Billing és Asset korlátok) --- + { + "key": "VEHICLE_LIMIT", + "value": {"free": 1, "premium": 5, "vip": 50, "service_pro": 10}, + "category": "limits", + "description": "Járműszám korlátok előfizetés szerint", + "scope_level": "global" + }, + { + "key": "subscription_packages_matrix", + "value": { + "free": {"price": 0, "rank": 1, "type": "credit"}, + "premium": {"price": 1990, "rank": 5, "type": "credit"}, + "vip": {"price": 4990, "rank": 50, "type": "credit"}, + "service_pro": {"price": 9990, "rank": 30, "type": "coin", "initial_coin_bonus": 500} + }, + "category": "billing", + "description": "Csomagok, árak és bónuszok központi mátrixa", + "scope_level": "global" + }, + + # --- 4. FINANCE (Költségek és Devizák) --- + {"key": "finance_default_currency", "value": "HUF", "category": "finance", "description": "Helyi alap deviza", "scope_level": "global"}, + {"key": "finance_base_currency", "value": "EUR", "category": "finance", "description": "Központi elszámoló deviza (Statisztikákhoz)", "scope_level": "global"}, + {"key": "org_naming_template", "value": "{last_name} Flotta", "category": "system", "description": "Szervezet név sablon", "scope_level": "global"}, + + # --- 5. DOCUMENT & OCR (Robot 1 vezérlése) --- + { + "key": "ocr_monthly_limit", + "value": {"free": 1, "premium": 10, "vip": 100}, + "category": "limits", + "description": "Havi ingyenes OCR szkennelések száma", + "scope_level": "global" + }, + { + "key": "ocr_auto_trigger_types", + "value": ["invoice", "registration_card", "sale_contract"], + "category": "robots", + "description": "Azonnali OCR feldolgozásra kijelölt típusok", + "scope_level": "global" + }, + + # --- 6. GAMIFICATION (A Játékmester) --- + {"key": "gamification_kyc_bonus", "value": 500, "category": "gamification", "description": "XP jutalom a KYC után", "scope_level": "global"}, + {"key": "xp_multiplier_ocr_cost", "value": 1.5, "category": "gamification", "description": "Bónusz szorzó digitális (OCR) adatrögzítésre", "scope_level": "global"}, + { + "key": "GAMIFICATION_MASTER_CONFIG", + "value": { + "xp_logic": {"base_xp": 500, "exponent": 1.5}, + "penalty_logic": { + "recovery_rate": 0.5, + "thresholds": {"level_1": 100, "level_2": 500, "level_3": 1000}, + "multipliers": {"L0": 1.0, "L1": 0.5, "L2": 0.1, "L3": 0.0} + }, + "conversion_logic": {"social_to_credit_rate": 100}, + "level_rewards": {"credits_per_10_levels": 50} + }, + "category": "gamification", + "description": "Szintek, büntetések és jutalmak mátrixa", + "scope_level": "global" + }, + + # --- 7. ÉRTESÍTÉSEK ÉS KARBANTARTÁS --- + { + "key": "notif_expiry_threshold_days", + "value": 30, + "category": "notifications", + "description": "Hány nappal az okmányok lejárata előtt küldjön a rendszer automata figyelmeztetést?", + "scope_level": "global" + }, + { + "key": "notif_expiry_steps", + "value": [30, 7, 1, 0], + "category": "notifications", + "description": "Hány nappal a lejárat előtt küldjön a rendszer riasztást? (Lista formátum)", + "scope_level": "global" + }, + { + "key": "maint_km_alert_threshold", + "value": 1000, + "category": "maintenance", + "description": "Hány kilométerrel a tervezett szerviz előtt küldjön figyelmeztetést a rendszer?", + "scope_level": "global" + }, + { + "key": "storage_retention_days", + "value": 365, + "category": "storage", + "description": "Fájlok megőrzési ideje a NAS-on (napokban)", + "scope_level": "global" + }, + { + "key": "storage_delete_after_validation", + "value": False, + "category": "storage", + "description": "Törölje-e a rendszer az OCR bizonyítékokat a sikeres hitelesítés után?", + "scope_level": "global" + }, + + # --- 8. GEO & LOCALIZATION --- + { + "key": "geo_default_country_code", + "value": "HU", + "category": "geo", + "description": "Alapértelmezett országkód a címek normalizálásához", + "scope_level": "global" + }, + { + "key": "GEO_ADDRESS_FORMAT_TEMPLATE", + "value": "{zip} {city}, {street} {type} {number}.", + "category": "geo", + "description": "Címformázási sablon (Python string format)", + "scope_level": "global" + }, + { + "key": "GEO_SUGGESTION_LIMIT", + "value": 15, + "category": "geo", + "description": "Hány találatot adjon vissza az utca-kiegészítő?", + "scope_level": "global" + }, + + # --- 9. ÉRTESÍTÉSI MÁTRIXOK (A granuláris szabályozáshoz) --- + { + "key": "notification_categories_config", + "value": { + "insurance": {"mandatory": True, "channels": ["email", "internal"], "label": "Biztosítás lejárat"}, + "mot_expiry": {"mandatory": True, "channels": ["email", "internal"], "label": "Műszaki vizsga"}, + "personal_id": {"mandatory": True, "channels": ["email", "internal"], "label": "Személyi okmányok"}, + "service_due": {"mandatory": False, "channels": ["internal"], "label": "Karbantartási emlékeztető"}, + "system_alert": {"mandatory": True, "channels": ["email", "internal"], "label": "Rendszerüzenetek"} + }, + "category": "notifications", + "description": "Értesítési típusok és biztonsági szintek mátrixa", + "scope_level": "global" + }, + { + "key": "NOTIFICATION_TYPE_MATRIX", + "value": { + "insurance": [45, 30, 15, 7, 1, 0], # A kötelező biztosítás kiemelt kezelése! + "mot": [30, 14, 7, 1, 0], + "personal_id": [60, 30, 15, 0], + "default": [30, 7, 1] + }, + "category": "notifications", + "description": "Dokumentum alapú riasztási naptár mátrix", + "scope_level": "global" + }, + + # --- 10. FLEET & TELEMETRY --- + { + "key": "FLEET_EVENT_REWARDS", + "value": { + "refuel": {"xp": 30, "social": 5}, # Tankolás rögzítése + "service": {"xp": 150, "social": 30}, # Szerviz látogatás (értékesebb adat!) + "repair": {"xp": 100, "social": 20}, # Javítás + "tire_change": {"xp": 40, "social": 5}, # Gumicsere + "accident": {"xp": 10, "social": 0}, # Baleset + "default": {"xp": 20, "social": 2} + }, + "category": "fleet", + "description": "Eseményenkénti gamifikációs jutalom mátrix", + "scope_level": "global" + }, + { + "key": "FLEET_ANOMALY_LOGIC", + "value": { + "odometer_drop_severity": "critical", + "excessive_daily_km": 1500, + "flag_unverified_providers": True + }, + "category": "fleet", + "description": "Flotta anomália detekciós küszöbértékek", + "scope_level": "global" + }, + + # --- 11. KÜLSŐ API-K (DVLA, UK) --- + { + "key": "dvla_api_enabled", + "value": True, + "category": "api_keys", + "description": "Engedélyezze-e a brit DVLA lekérdezéseket?", + "scope_level": "global" + }, + { + "key": "dvla_api_url", + "value": "https://driver-vehicle-licensing.api.gov.uk/vehicle-enquiry/v1/vehicles", + "category": "api_keys", + "description": "Hivatalos DVLA Vehicle Enquiry API végpont", + "scope_level": "global" + }, + { + "key": "dvla_api_key", + "value": "IDE_JÖN_A_VALÓDI_KULCS", + "category": "api_keys", + "description": "Bizalmas DVLA API kulcs (X-API-KEY)", + "scope_level": "global" + }, + + # --- 12. AI & ROBOTOK (Ollama integráció) --- + { + "key": "ai_model_text", + "value": "qwen2.5-coder:32b", + "category": "ai", + "description": "Fő technikai elemző modell (Ollama)", + "scope_level": "global" + }, + { + "key": "ai_model_vision", + "value": "llava:7b", + "category": "ai", + "description": "Látó modell az OCR folyamatokhoz", + "scope_level": "global" + }, + { + "key": "ai_temperature", + "value": 0.1, + "category": "ai", + "description": "AI válasz kreativitása (0.1 = precíz, 0.9 = kreatív)", + "scope_level": "global" + }, + { + "key": "ai_prompt_ocr_invoice", + "value": "FELADAT: Olvasd ki a számla adatait. JSON válasz: {amount, currency, date, vendor, vat}.", + "category": "ai", + "description": "Robot 1 - Számla OCR prompt", + "scope_level": "global" + }, + { + "key": "ai_prompt_gold_data", + "value": "Készíts technikai adatlapot a(z) {make} {model} típushoz a megadott adatok alapján: {context}. Csak hiteles JSON-t adj!", + "category": "ai", + "description": "Robot 3 - Technikai dúsító prompt", + "scope_level": "global" + } + ] # <-- ITT HIÁNYZOTT A ZÁRÓJEL! + + # ---------------------------------------------------------------------- + # HIERARCHIKUS KERESÉSI MÁTRIXOK (A SearchService 2.4-hez) + # Ezek az értékek felülbírálják az alapértelmezéseket a megfelelő "scope" esetén. + # ---------------------------------------------------------------------- + + # 1. GLOBÁLIS ALAP (Free usereknek) + params.append({ + "key": "RANKING_RULES", + "scope_level": "global", + "scope_id": None, + "value": { + "ad_weight": 8000, + "partner_weight": 1000, + "trust_weight": 5, + "dist_penalty": 40, + "can_use_prefs": False, + "search_radius_km": 25 + }, + "category": "search", + "description": "Alapértelmezett (Free) rangsorolási szabályok" + }) + + # 2. PREMIUM CSOMAG SZINTŰ BEÁLLÍTÁS (Közepes szint) + params.append({ + "key": "RANKING_RULES", + "scope_level": "package", + "scope_id": "premium", + "value": { + "pref_weight": 10000, + "partner_weight": 2000, + "trust_weight": 50, + "ad_weight": 500, + "dist_penalty": 20, + "can_use_prefs": True, + "search_radius_km": 50 + }, + "category": "search", + "description": "Prémium csomag rangsorolási szabályai" + }) + + # 3. VIP CSOMAG SZINTŰ BEÁLLÍTÁS + params.append({ + "key": "RANKING_RULES", + "scope_level": "package", + "scope_id": "vip", + "value": { + "pref_weight": 20000, # A kedvenc mindent visz + "partner_weight": 5000, + "trust_weight": 100, # A minőség számít + "ad_weight": 0, # VIP-nek nem tolunk hirdetést az élre + "dist_penalty": 5, # Alig büntetjük a távolságot + "can_use_prefs": True, + "search_radius_km": 150 + }, + "category": "search", + "description": "VIP csomag rangsorolási szabályai" + }) + + # 4. EGYÉNI CÉGES FELÜLBÍRÁLÁS (Pl. ProfiBot Flotta Co.) + params.append({ + "key": "RANKING_RULES", + "scope_level": "user", + "scope_id": "99", + "value": { + "pref_weight": 50000, # Nekik csak a saját szerződött partnereik kellenek + "can_use_prefs": True, + "search_radius_km": 500 # Az egész országot látják + }, + "category": "search", + "description": "Egyedi flotta-ügyfél keresési szabályai" + }) + + logger.info("🚀 Rendszerparaméterek szinkronizálása a 2.0-ás modell szerint...") + added_count = 0 + updated_count = 0 + + for p in params: + # GONDOLATMENET A JAVÍTÁSHOZ: + # Muszáj a scope_level-t és scope_id-t is vizsgálni, különben az SQLAlchemy + # összeomlik (MultipleResultsFound), mert ugyanaz a 'key' (pl. RANKING_RULES) + # több sorban is szerepel a hierarchia miatt! + + s_level = p.get("scope_level", "global") + s_id = p.get("scope_id", None) + + stmt = select(SystemParameter).where( + SystemParameter.key == p["key"], + SystemParameter.scope_level == s_level, + SystemParameter.scope_id == s_id + ) + res = await db.execute(stmt) + existing = res.scalar_one_or_none() + + if not existing: + # Új rekord létrehozása + new_param = SystemParameter( + key=p["key"], + value=p["value"], + category=p["category"], + description=p["description"], + scope_level=s_level, + scope_id=s_id, + last_modified_by=None + ) + db.add(new_param) + added_count += 1 + # Azonnali commit, hogy a következő körben már lássa a DB! + await db.commit() + else: + # Csak frissítés, ha szükséges + existing.description = p["description"] + existing.category = p["category"] + updated_count += 1 + await db.commit() + + logger.info(f"✅ Kész! Új: {added_count}, Frissített meta: {updated_count}") + +if __name__ == "__main__": + asyncio.run(seed_params()) \ No newline at end of file diff --git a/backend/app/scripts/seed_v1_9_system.py b/backend/app/scripts/seed_v1_9_system.py new file mode 100755 index 0000000..222cc6c --- /dev/null +++ b/backend/app/scripts/seed_v1_9_system.py @@ -0,0 +1,31 @@ +# /opt/docker/dev/service_finder/backend/app/scripts/seed_v1_9_system.py +import asyncio +from sqlalchemy import select +from app.db.session import SessionLocal +from app.models.vehicle_definitions import VehicleType, FeatureDefinition + +async def seed_system_data(): + """ Alapvető típusok és extrák (Features) feltöltése. """ + async with SessionLocal() as db: + try: + print("🚀 Rendszer-blueprint betöltése...") + + types_data = [ + {"code": "car", "name": "Személyautó", "icon": "directions_car"}, + {"code": "motorcycle", "name": "Motorkerékpár", "icon": "moped"}, + {"code": "truck", "name": "Teherautó", "icon": "local_shipping"}, + {"code": "boat", "name": "Hajó", "icon": "sailing"} + ] + + for t_info in types_data: + stmt = select(VehicleType).where(VehicleType.code == t_info["code"]) + if not (await db.execute(stmt)).scalar_one_or_none(): + db.add(VehicleType(**t_info)) + + await db.commit() + print("✅ Blueprint kész.") + except Exception as e: + print(f"❌ Hiba: {e}") + +if __name__ == "__main__": + asyncio.run(seed_system_data()) \ No newline at end of file diff --git a/backend/app/services/ai_ocr_service.py b/backend/app/services/ai_ocr_service.py new file mode 100755 index 0000000..e4f7add --- /dev/null +++ b/backend/app/services/ai_ocr_service.py @@ -0,0 +1,64 @@ +# app/services/ai_ocr_service.py +import json +import httpx +import base64 +from app.schemas.evidence import RegistrationDocumentExtracted + +class AiOcrService: + OLLAMA_URL = "http://service_finder_ollama:11434/api/generate" + MODEL_NAME = "llama3.2-vision" + + @classmethod + async def extract_registration_data(cls, clean_image_bytes: bytes) -> RegistrationDocumentExtracted: + base64_image = base64.b64encode(clean_image_bytes).decode('utf-8') + + prompt = """ + Te egy magyar hatósági okmány-szakértő AI vagy. A feladatod a mellékelt magyar forgalmi engedély (kép) összes adatának kinyerése. + + Keresd meg és olvasd le az adatokat az alábbi hatósági kódok alapján: + - A: Rendszám (kötőjellel, pl: ABC-123 vagy AA-BB-123) + - B: Első nyilvántartásba vétel dátuma (YYYY.MM.DD) + - C.1.1: Családi név vagy cégnév + - C.1.2: Utónév + - C.1.3: Teljes lakcím (Irsz, Város, Utca, Házszám) + - C.4: Jogosultság (a = tulajdonos, b = üzembentartó) + - D.1: Gyártmány (pl. TOYOTA, VOLKSWAGEN) + - D.2: Jármű típusa + - D.3: Kereskedelmi leírás (pl. COROLLA, GOLF) + - E: Alvázszám (pontosan 17 karakter) + - G: Saját tömeg (kg) + - F.1: Együttes tömeg (kg) + - P.1: Hengerűrtartalom (cm3) + - P.2: Teljesítmény (kW) + - P.3: Hajtóanyag (pl. Benzin, Gázolaj, Elektromos) + - P.5: Motorkód + - V.9: Környezetvédelmi osztály kódja + - R: Szín + - S.1: Ülések száma + - H: Műszaki érvényesség vége (YYYY.MM.DD) + - Sebességváltó: Keresd a 0, 1, 2, 3 kódokat (0=mechanikus, 2=automata). + + VÁLASZ FORMÁTUMA: Kizárólag érvényes JSON. Ha egy adat nem olvasható, az értéke null legyen. + """ + + payload = { + "model": cls.MODEL_NAME, + "prompt": prompt, + "images": [base64_image], + "stream": False, + "format": "json" + } + + async with httpx.AsyncClient(timeout=90.0) as client: + try: + response = await client.post(cls.OLLAMA_URL, json=payload) + response.raise_for_status() + + ai_response_text = response.json().get("response", "{}") + data_dict = json.loads(ai_response_text) + + return RegistrationDocumentExtracted(**data_dict) + + except Exception as e: + print(f"Robot 3 AI Hiba: {e}") + raise ValueError(f"AI hiba az adatkivonás során: {str(e)}") \ No newline at end of file diff --git a/backend/app/services/ai_service.py b/backend/app/services/ai_service.py new file mode 100755 index 0000000..7ec14cd --- /dev/null +++ b/backend/app/services/ai_service.py @@ -0,0 +1,104 @@ +# /opt/docker/dev/service_finder/backend/app/services/ai_service.py +import os +import json +import logging +import asyncio +import httpx +from typing import Dict, Any, Optional, List +from sqlalchemy import select + +from app.db.session import AsyncSessionLocal +from app.models.system import SystemParameter +from app.services.config_service import config # 2.2-es központi config + +logger = logging.getLogger("AI-Service-2.2") + +class AIService: + """ + Sentinel Master AI Service 2.2. + Felelős az LLM hívásokért, prompt sablonok kezeléséért és az OCR feldolgozásért. + Minden paraméter (modell, url, prompt, hőmérséklet) adminból vezérelt. + """ + + @classmethod + async def _execute_ai_call(cls, db, prompt: str, model_key: str = "text", images: Optional[List[str]] = None) -> Optional[Dict[str, Any]]: + """ + Központi AI végrehajtó. Kezeli a modellt, a várakozást és a JSON parzolást. + """ + try: + # 1. ADMIN KONFIGURÁCIÓ LEKÉRÉSE + base_url = await config.get_setting(db, "ai_ollama_url", default="http://ollama:11434/api/generate") + delay = await config.get_setting(db, "AI_REQUEST_DELAY", default=0.1) + + # Modell választás (text vagy vision) + model_name = await config.get_setting(db, f"ai_model_{model_key}", default="qwen2.5-coder:32b") + temp = await config.get_setting(db, "ai_temperature", default=0.1) + timeout_val = await config.get_setting(db, "ai_timeout", default=120.0) + + await asyncio.sleep(float(delay)) + + # 2. PAYLOAD ÖSSZEÁLLÍTÁSA + payload = { + "model": model_name, + "prompt": prompt, + "stream": False, + "format": "json", + "options": {"temperature": float(temp)} + } + + if images: # Llava/Vision támogatás + payload["images"] = images + + # 3. HTTP HÍVÁS + async with httpx.AsyncClient(timeout=float(timeout_val)) as client: + response = await client.post(base_url, json=payload) + response.raise_for_status() + + raw_res = response.json().get("response", "{}") + return json.loads(raw_res) + + except json.JSONDecodeError as je: + logger.error(f"❌ AI JSON hiba (parszolási hiba): {je}") + return None + except Exception as e: + logger.error(f"❌ AI hívás kritikus hiba: {e}") + return None + + @classmethod + async def get_gold_data_from_research(cls, make: str, model: str, raw_context: str) -> Optional[Dict[str, Any]]: + """ + Robot 3 (Alchemist) dúsító folyamata. + Kutatási adatokból csinál tiszta technikai adatlapot. + """ + async with AsyncSessionLocal() as db: + template = await config.get_setting(db, "ai_prompt_gold_data", + default="Extract technical car data for {make} {model} from: {context}") + + full_prompt = template.format(make=make, model=model, context=raw_context) + return await cls._execute_ai_call(db, full_prompt, model_key="text") + + @classmethod + async def get_clean_vehicle_data(cls, make: str, raw_model: str, sources: Dict[str, Any]) -> Optional[Dict[str, Any]]: + """ + Név normalizálás és szinonima gyűjtés. + """ + async with AsyncSessionLocal() as db: + template = await config.get_setting(db, "ai_prompt_normalization", + default="Normalize car model names: {make} {model}. Sources: {sources}") + + full_prompt = template.format(make=make, model=raw_model, sources=json.dumps(sources)) + return await cls._execute_ai_call(db, full_prompt, model_key="text") + + @classmethod + async def process_ocr_document(cls, doc_type: str, base64_image: str) -> Optional[Dict[str, Any]]: + """ + Robot 1 (OCR) látó folyamata. + Képet (base64) küld a Vision modellnek (pl. Llava). + """ + async with AsyncSessionLocal() as db: + # Külön prompt sablon minden dokumentum típushoz (számla, forgalmi, adásvételi) + template = await config.get_setting(db, f"ai_prompt_ocr_{doc_type}", + default="Analyze this {doc_type} image and return structured JSON data.") + + full_prompt = template.format(doc_type=doc_type) + return await cls._execute_ai_call(db, full_prompt, model_key="vision", images=[base64_image]) \ No newline at end of file diff --git a/backend/app/services/ai_service1.1.0.py b/backend/app/services/ai_service1.1.0.py new file mode 100755 index 0000000..7dfd801 --- /dev/null +++ b/backend/app/services/ai_service1.1.0.py @@ -0,0 +1,141 @@ +import os +import json +import logging +import asyncio +import re +import base64 +import httpx +from typing import Dict, Any, Optional, List +from sqlalchemy import select +from app.db.session import SessionLocal +from app.models import SystemParameter + +logger = logging.getLogger("AI-Service") + +class AIService: + """ + AI Service v1.3.5 - Private High-Performance Edition + - Engine: Local Ollama (GPU Accelerated) + - Features: DVLA Integration, 50-char Normalization, Private OCR + """ + + # A Docker belső hálózatán a szerviznév 'ollama' + OLLAMA_BASE_URL = "http://ollama:11434/api/generate" + TEXT_MODEL = "vehicle-pro" + VISION_MODEL = "llava:7b" + DVLA_API_KEY = os.getenv("DVLA_API_KEY") + + @classmethod + async def get_config_delay(cls) -> float: + """Késleltetés lekérése az adatbázisból.""" + try: + async with SessionLocal() as db: + stmt = select(SystemParameter).where(SystemParameter.key == "AI_REQUEST_DELAY") + res = await db.execute(stmt) + param = res.scalar_one_or_none() + return float(param.value) if param else 0.1 + except Exception: + return 0.1 + + @classmethod + async def get_clean_vehicle_data(cls, make: str, raw_model: str, v_type: str, sources: Dict[str, Any]) -> Optional[Dict[str, Any]]: + """Robot 2: Adat-összefésülés és normalizálás.""" + # Várjunk egy kicsit a GPU kímélése érdekében + await asyncio.sleep(await cls.get_config_delay()) + + prompt = f""" + FELADAT: Normalizáld a jármű adatait több forrás alapján. + GYÁRTÓ: {make} + NYERS MODELLNÉV: {raw_model} + FORRÁSOK NYERS ADATAI: {json.dumps(sources, ensure_ascii=False)} + + SZIGORÚ SZABÁLYOK: + 1. 'marketing_name': MAXIMUM 50 KARAKTER! + 2. 'synonyms': Gyűjtsd ide az összes többi névváltozatot. + 3. 'technical_code': Keresd meg a gyári kódokat. + + VÁLASZ FORMÁTUM (Csak tiszta JSON): + {{ + "marketing_name": "string (max 50)", + "synonyms": ["string"], + "technical_code": "string", + "ccm": int, + "kw": int, + "euro_class": int, + "year_from": int, + "year_to": int vagy null, + "maintenance": {{ + "oil_type": "string", + "oil_qty": float, + "spark_plug": "string" + }}, + "is_duplicate_potential": bool + }} + """ + + payload = { + "model": cls.TEXT_MODEL, + "prompt": prompt, + "stream": False, + "format": "json", + "options": {"temperature": 0.1} + } + + try: + async with httpx.AsyncClient(timeout=90.0) as client: + logger.info(f"📡 AI kérés küldése: {make} {raw_model}...") + response = await client.post(cls.OLLAMA_BASE_URL, json=payload) + response.raise_for_status() + res_json = response.json() + clean_data = json.loads(res_json.get("response", "{}")) + + if clean_data.get("marketing_name"): + clean_data["marketing_name"] = clean_data["marketing_name"][:50].strip() + + return clean_data + except Exception as e: + logger.error(f"❌ AI hiba ({make} {raw_model}): {e}") + return None + + @classmethod + async def get_dvla_data(cls, vrm: str) -> Optional[Dict[str, Any]]: + """Brit rendszám alapú adatok lekérése.""" + if not cls.DVLA_API_KEY: return None + url = "https://driver-vehicle-licensing.api.gov.uk/vehicle-enquiry/v1/vehicles" + headers = {"x-api-key": cls.DVLA_API_KEY, "Content-Type": "application/json"} + try: + async with httpx.AsyncClient() as client: + resp = await client.post(url, json={"registrationNumber": vrm}, headers=headers) + return resp.json() if resp.status_code == 200 else None + except Exception as e: + logger.error(f"❌ DVLA API hiba: {e}") + return None + + @classmethod + async def analyze_document_image(cls, image_data: bytes, doc_type: str) -> Optional[Dict[str, Any]]: + """Robot 3: Helyi OCR és dokumentum elemzés (Llava:7b).""" + await asyncio.sleep(await cls.get_config_delay()) + prompts = { + "identity": "Extract ID card data (name, id_number, expiry) as JSON.", + "vehicle_reg": "Extract vehicle registration (plate, VIN, power_kw, engine_ccm) as JSON.", + "invoice": "Extract invoice details (vendor, total_amount, date) as JSON.", + "odometer": "Identify the number on the odometer and return as JSON: {'value': int}." + } + img_b64 = base64.b64encode(image_data).decode('utf-8') + payload = { + "model": cls.VISION_MODEL, + "prompt": prompts.get(doc_type, "Perform OCR and return JSON"), + "images": [img_b64], + "stream": False, + "format": "json" + } + try: + async with httpx.AsyncClient(timeout=120.0) as client: + response = await client.post(cls.OLLAMA_BASE_URL, json=payload) + res_data = response.json() + clean_json = res_data.get("response", "{}") + match = re.search(r'\{.*\}', clean_json, re.DOTALL) + return json.loads(match.group()) if match else json.loads(clean_json) + except Exception as e: + logger.error(f"❌ Helyi OCR hiba: {e}") + return None \ No newline at end of file diff --git a/backend/app/services/ai_service_googleApi_old.py b/backend/app/services/ai_service_googleApi_old.py new file mode 100755 index 0000000..8280551 --- /dev/null +++ b/backend/app/services/ai_service_googleApi_old.py @@ -0,0 +1,111 @@ +import os +import json +import logging +import asyncio +import re +from typing import Dict, Any, Optional +from google import genai +from google.genai import types +from sqlalchemy import select +from app.db.session import SessionLocal +from app.models import SystemParameter + +logger = logging.getLogger("AI-Service") + +class AIService: + """ + AI Service v1.2.5 - Final Integrated Edition + - Robot 2: Technikai dúsítás (Search + Regex JSON parsing) + - Robot 3: OCR (Controlled JSON generation) + """ + api_key = os.getenv("GEMINI_API_KEY") + client = genai.Client(api_key=api_key) if api_key else None + PRIMARY_MODEL = "gemini-2.0-flash" + + @classmethod + async def get_config_delay(cls) -> float: + try: + async with SessionLocal() as db: + stmt = select(SystemParameter).where(SystemParameter.key == "AI_REQUEST_DELAY") + res = await db.execute(stmt) + param = res.scalar_one_or_none() + return float(param.value) if param else 1.0 + except Exception: return 1.0 + + @classmethod + async def get_clean_vehicle_data(cls, make: str, raw_model: str, v_type: str) -> Optional[Dict[str, Any]]: + """Robot 2: Adatbányászat Google Search segítségével.""" + if not cls.client: return None + await asyncio.sleep(await cls.get_config_delay()) + + search_tool = types.Tool(google_search=types.GoogleSearch()) + + prompt = f""" + KERESS RÁ az interneten: {make} {raw_model} ({v_type}) pontos gyári modellkódja és technikai adatai. + Adj választ szigorúan csak egy JSON blokkban: + {{ + "marketing_name": "tiszta név", + "synonyms": ["név1", "név2"], + "technical_code": "gyári kód", + "year_from": int, + "year_to": int_vagy_null, + "ccm": int, + "kw": int, + "maintenance": {{ "oil_type": "string", "oil_qty": float, "spark_plug": "string", "coolant": "string" }} + }} + FONTOS: A 'technical_code' NEM lehet üres. Ha nem találod, adj 'N/A' értéket! + """ + + # Search tool használata esetén a response_mime_type tilos! + config = types.GenerateContentConfig( + system_instruction="Profi járműtechnikai adatbányász vagy. Csak tiszta JSON-t válaszolsz markdown kódblokk nélkül.", + tools=[search_tool], + temperature=0.1 + ) + + try: + response = cls.client.models.generate_content(model=cls.PRIMARY_MODEL, contents=prompt, config=config) + text = response.text + # Tisztítás: ha az AI mégis tenne bele markdown jeleket + clean_json = re.sub(r'```json\s*|```', '', text).strip() + res_json = json.loads(clean_json) + if isinstance(res_json, list) and len(res_json) > 0: res_json = res_json[0] + return res_json if isinstance(res_json, dict) else None + except Exception as e: + logger.error(f"❌ AI hiba ({make} {raw_model}): {e}") + return None + + @classmethod + async def analyze_document_image(cls, image_data: bytes, doc_type: str) -> Optional[Dict[str, Any]]: + """Robot 3: OCR funkció - Forgalmi, Személyi, Számla, Odometer.""" + if not cls.client: return None + await asyncio.sleep(await cls.get_config_delay()) + + prompts = { + "identity": "Személyes okmány adatok (név, szám, lejárat).", + "vehicle_reg": "Forgalmi adatok (rendszám, alvázszám, kW, ccm).", + "invoice": "Számla adatok (partner, végösszeg, dátum).", + "odometer": "Csak a kilométeróra állása számként." + } + + # Itt maradhat a response_mime_type, mert nem használunk Search-öt + config = types.GenerateContentConfig( + system_instruction="Profi OCR dokumentum-elemző vagy. Csak tiszta JSON-t válaszolsz.", + response_mime_type="application/json" + ) + + try: + response = cls.client.models.generate_content( + model=cls.PRIMARY_MODEL, + contents=[ + f"Elemezd ezt a képet ({doc_type}): {prompts.get(doc_type, 'OCR')}", + types.Part.from_bytes(data=image_data, mime_type="image/jpeg") + ], + config=config + ) + res_json = json.loads(response.text) + if isinstance(res_json, list) and len(res_json) > 0: res_json = res_json[0] + return res_json if isinstance(res_json, dict) else None + except Exception as e: + logger.error(f"❌ OCR hiba: {e}") + return None \ No newline at end of file diff --git a/backend/app/services/asset_service.py b/backend/app/services/asset_service.py new file mode 100755 index 0000000..37bcf11 --- /dev/null +++ b/backend/app/services/asset_service.py @@ -0,0 +1,153 @@ +# /opt/docker/dev/service_finder/backend/app/services/asset_service.py +from __future__ import annotations +import logging +import uuid +from datetime import datetime +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, func, and_ +from sqlalchemy.orm import selectinload + +from app.models.asset import Asset, AssetAssignment, AssetTelemetry, AssetFinancials +from app.models.identity import User +from app.services.config_service import config +from app.services.gamification_service import GamificationService +from app.services.security_service import security_service + +if TYPE_CHECKING: + from .identity import User, Person + from .organization import Organization + from .vehicle_definitions import VehicleModelDefinition + +logger = logging.getLogger(__name__) + +class AssetService: + """ + Asset Service 2.0 - A Járművek Életciklus-menedzsere. + Kezeli a regisztrációt, a tulajdonosváltást és a flotta-korlátokat. + """ + + @staticmethod + async def create_or_claim_vehicle( + db: AsyncSession, + user_id: int, + org_id: int, + vin: str, + license_plate: str, + catalog_id: int = None + ): + """ + Intelligens Jármű Rögzítés: + Ha új: létrehozza. + Ha már létezik: Transzfer folyamatot indít. + """ + try: + vin_clean = vin.strip().upper() + + # 1. ADMIN LIMIT ELLENŐRZÉS + user_stmt = select(User).where(User.id == user_id) + user = (await db.execute(user_stmt)).scalar_one() + + limits = await config.get_setting(db, "VEHICLE_LIMIT", default={"free": 1, "premium": 5, "vip": 50}) + user_role = user.role.value if hasattr(user.role, 'value') else str(user.role) + allowed_limit = limits.get(user_role, 1) + + count_stmt = select(func.count(Asset.id)).where(Asset.current_organization_id == org_id) + current_count = (await db.execute(count_stmt)).scalar() + + if current_count >= allowed_limit: + raise ValueError(f"Limit túllépés! A csomagod {allowed_limit} autót engedélyez.") + + # 2. LÉTEZIK-E MÁR A JÁRMŰ? + stmt = select(Asset).where(Asset.vin == vin_clean) + existing_asset = (await db.execute(stmt)).scalar_one_or_none() + + if existing_asset: + # HA MÁR A JELENLEGI SZERVEZETNÉL VAN + if existing_asset.current_organization_id == org_id: + raise ValueError("Ez a jármű már a te garázsodban van.") + + # TRANSZFER FOLYAMAT INDÍTÁSA + return await AssetService.initiate_ownership_transfer( + db, existing_asset, user_id, org_id, license_plate + ) + + # 3. ÚJ JÁRMŰ LÉTREHOZÁSA (Standard Flow) + new_asset = Asset( + vin=vin_clean, + license_plate=license_plate.strip().upper(), + catalog_id=catalog_id, + current_organization_id=org_id, + status="active", + is_verified=False + ) + db.add(new_asset) + await db.flush() + + # Digitális Iker Alapmodulok + db.add(AssetAssignment(asset_id=new_asset.id, organization_id=org_id, status="active")) + db.add(AssetTelemetry(asset_id=new_asset.id)) + db.add(AssetFinancials(asset_id=new_asset.id)) + + # Gamification + reward = await config.get_setting(db, "xp_reward_asset_register", default=250) + await GamificationService.award_points(db, user_id, int(reward), "NEW_ASSET_REG") + + await db.commit() + return new_asset + + except Exception as e: + await db.rollback() + logger.error(f"Asset Creation Error: {e}") + raise e + + @staticmethod + async def initiate_ownership_transfer(db: AsyncSession, asset: Asset, user_id: int, org_id: int, new_plate: str): + """ + Adásvétel kezelése: Az autót 'Transfer Pending' állapotba teszi. + """ + # Admin paraméter: Automatikus transzfer engedélyezése? + auto_transfer = await config.get_setting(db, "asset_auto_transfer_enabled", default=False) + + # Logoljuk a kísérletet a biztonsági szolgálatnál (Sentinel) + await security_service.log_event( + db, user_id=user_id, action="VEHICLE_CLAIM_INITIATED", + severity="warning", target_type="Asset", target_id=str(asset.id), + new_data={"vin": asset.vin, "new_org": org_id} + ) + + if auto_transfer: + # Csak akkor, ha a régi tulajdonos 'sold' állapotba tette + if asset.status == "sold": + return await AssetService.execute_final_transfer(db, asset, org_id, new_plate) + + # Függőben lévő állapot: Dokumentum feltöltésre vár + asset.status = "transfer_pending" + asset.temp_claim_org_id = org_id # Átmeneti tároló a validálásig + + await db.commit() + # Itt egy speciális hibaüzenetet dobunk, amit a Frontend tud kezelni (Dokumentum feltöltő ablak) + raise HTTPException( + status_code=202, + detail="A jármű már szerepel a rendszerben. Kérjük, töltsd fel az adásvételi szerződést a tulajdonjog igazolásához." + ) + + @staticmethod + async def execute_final_transfer(db: AsyncSession, asset: Asset, new_org_id: int, new_plate: str): + """ A tulajdonjog tényleges átírása az adatbázisban. """ + # 1. Régi hozzárendelés lezárása + await db.execute( + update(AssetAssignment) + .where(and_(AssetAssignment.asset_id == asset.id, AssetAssignment.status == "active")) + .values(status="archived", end_date=datetime.now()) + ) + + # 2. Új hozzárendelés és adatok frissítése + asset.current_organization_id = new_org_id + asset.license_plate = new_plate.upper() + asset.status = "active" + asset.is_verified = False # Az új tulajdonos papírjait is ellenőrizni kell! + + db.add(AssetAssignment(asset_id=asset.id, organization_id=new_org_id, status="active")) + + await db.commit() + return asset \ No newline at end of file diff --git a/backend/app/services/auth_service.py b/backend/app/services/auth_service.py new file mode 100755 index 0000000..efd34aa --- /dev/null +++ b/backend/app/services/auth_service.py @@ -0,0 +1,258 @@ +# /opt/docker/dev/service_finder/backend/app/services/auth_service.py +import logging +import uuid +from datetime import datetime, timedelta, timezone +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, and_, update +from sqlalchemy.orm import joinedload +from fastapi.encoders import jsonable_encoder +from fastapi import HTTPException, status + +from app.models.identity import User, Person, UserRole, VerificationToken, Wallet +from app.models.gamification import UserStats +from app.models.organization import Organization, OrganizationMember, OrgType, Branch +from app.schemas.auth import UserLiteRegister, UserKYCComplete +from app.core.security import get_password_hash, verify_password, generate_secure_slug +from app.services.email_manager import email_manager +from app.core.config import settings +from app.services.config_service import config +from app.services.geo_service import GeoService +from app.services.security_service import security_service +from app.services.gamification_service import GamificationService + +logger = logging.getLogger(__name__) + +class AuthService: + @staticmethod + async def register_lite(db: AsyncSession, user_in: UserLiteRegister): + """ 1. FÁZIS: Lite regisztráció dinamikus korlátokkal és Sentinel naplózással. """ + try: + # Paraméterek lekérése az admin felületről + min_pass = await config.get_setting(db, "auth_min_password_length", default=8) + default_role_name = await config.get_setting(db, "auth_default_role", default="user") + reg_token_hours = await config.get_setting(db, "auth_registration_hours", region_code=user_in.region_code, default=48) + + if len(user_in.password) < int(min_pass): + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail=f"A jelszónak legalább {min_pass} karakter hosszúnak kell lennie." + ) + + new_person = Person( + first_name=user_in.first_name, + last_name=user_in.last_name, + is_active=False + ) + db.add(new_person) + await db.flush() + + # Szerepkör dinamikus feloldása + assigned_role = UserRole[default_role_name] if default_role_name in UserRole.__members__ else UserRole.user + + new_user = User( + email=user_in.email, + hashed_password=get_password_hash(user_in.password), + person_id=new_person.id, + role=assigned_role, + is_active=False, + is_deleted=False, + region_code=user_in.region_code, + preferred_language=user_in.lang, + timezone=user_in.timezone + ) + db.add(new_user) + await db.flush() + + # Verifikációs token + token_val = uuid.uuid4() + db.add(VerificationToken( + token=token_val, + user_id=new_user.id, + token_type="registration", + expires_at=datetime.now(timezone.utc) + timedelta(hours=int(reg_token_hours)) + )) + + # Email küldés a beállított template alapján + verification_link = f"{settings.FRONTEND_BASE_URL}/verify?token={token_val}" + await email_manager.send_email( + recipient=user_in.email, + template_key="reg", + variables={"first_name": user_in.first_name, "link": verification_link}, + lang=user_in.lang + ) + + # Sentinel Audit Log + await security_service.log_event( + db, user_id=new_user.id, action="USER_REGISTER_LITE", + severity="info", target_type="User", target_id=str(new_user.id), + new_data={"email": user_in.email} + ) + + await db.commit() + return new_user + except Exception as e: + await db.rollback() + logger.error(f"Lite Reg Error: {e}") + raise e + + @staticmethod + async def complete_kyc(db: AsyncSession, user_id: int, kyc_in: UserKYCComplete): + """ 2. FÁZIS: Teljes profil és Gamification inicializálás. """ + try: + stmt = select(User).options(joinedload(User.person)).where(User.id == user_id) + user = (await db.execute(stmt)).scalar_one_or_none() + if not user: return None + + # Dinamikus beállítások (Soha ne legyen kódba vésve!) + org_tpl = await config.get_setting(db, "org_naming_template", default="{last_name} Flotta") + base_cur = await config.get_setting(db, "finance_default_currency", region_code=user.region_code, default="HUF") + kyc_reward = await config.get_setting(db, "gamification_kyc_bonus", default=500) + + # Címkezelés (GeoService hívás) + addr_id = await GeoService.get_or_create_full_address( + db, zip_code=kyc_in.address_zip, city=kyc_in.address_city, + street_name=kyc_in.address_street_name, street_type=kyc_in.address_street_type, + house_number=kyc_in.address_house_number, parcel_id=kyc_in.address_hrsz + ) + + # Person adatok dúsítása + p = user.person + p.mothers_last_name = kyc_in.mothers_last_name + p.mothers_first_name = kyc_in.mothers_first_name + p.birth_place = kyc_in.birth_place + p.birth_date = kyc_in.birth_date + p.phone = kyc_in.phone_number + p.address_id = addr_id + p.identity_docs = jsonable_encoder(kyc_in.identity_docs) + p.is_active = True + + # Dinamikus szervezet generálás + org_full_name = org_tpl.format(last_name=p.last_name, first_name=p.first_name) + new_org = Organization( + full_name=org_full_name, + name=f"{p.last_name} Széfe", + folder_slug=generate_secure_slug(12), + org_type=OrgType.individual, + owner_id=user.id, + is_active=True, + status="verified", + country_code=user.region_code + ) + db.add(new_org) + await db.flush() + + # Infrastruktúra elemek + db.add(Branch(organization_id=new_org.id, address_id=addr_id, name="Home Base", is_main=True)) + db.add(OrganizationMember(organization_id=new_org.id, user_id=user.id, role="OWNER")) + db.add(Wallet(user_id=user.id, currency=kyc_in.preferred_currency or base_cur)) + db.add(UserStats(user_id=user.id)) + + user.is_active = True + user.folder_slug = generate_secure_slug(12) + + # Gamification XP jóváírás + await GamificationService.award_points(db, user_id=user.id, amount=int(kyc_reward), reason="KYC_VERIFICATION") + + await db.commit() + return user + except Exception as e: + await db.rollback() + logger.error(f"KYC Error: {e}") + raise e + + @staticmethod + async def authenticate(db: AsyncSession, email: str, password: str): + """ Felhasználó hitelesítése. """ + stmt = select(User).where(and_(User.email == email, User.is_deleted == False)) + res = await db.execute(stmt) + user = res.scalar_one_or_none() + if user and verify_password(password, user.hashed_password): + return user + return None + + @staticmethod + async def verify_email(db: AsyncSession, token_str: str): + """ Email megerősítés. """ + try: + token_uuid = uuid.UUID(token_str) + stmt = select(VerificationToken).where(and_( + VerificationToken.token == token_uuid, + VerificationToken.is_used == False, + VerificationToken.expires_at > datetime.now(timezone.utc) + )) + token = (await db.execute(stmt)).scalar_one_or_none() + if not token: return False + + token.is_used = True + # Itt aktiválhatnánk a júzert, ha a Lite regnél még nem tennénk meg + await db.commit() + return True + except: return False + + @staticmethod + async def initiate_password_reset(db: AsyncSession, email: str): + """ Elfelejtett jelszó folyamat indítása. """ + stmt = select(User).where(and_(User.email == email, User.is_deleted == False)) + user = (await db.execute(stmt)).scalar_one_or_none() + + if user: + # Dinamikus lejárat az adminból + reset_h = await config.get_setting(db, "auth_password_reset_hours", region_code=user.region_code, default=2) + token_val = uuid.uuid4() + db.add(VerificationToken( + token=token_val, user_id=user.id, token_type="password_reset", + expires_at=datetime.now(timezone.utc) + timedelta(hours=int(reset_h)) + )) + + link = f"{settings.FRONTEND_BASE_URL}/reset-password?token={token_val}" + await email_manager.send_email( + recipient=email, template_key="pwd_reset", + variables={"link": link}, lang=user.preferred_language + ) + await db.commit() + return "success" + return "not_found" + + @staticmethod + async def reset_password(db: AsyncSession, email: str, token_str: str, new_password: str): + """ Jelszó tényleges megváltoztatása token alapján. """ + try: + token_uuid = uuid.UUID(token_str) + stmt = select(VerificationToken).join(User).where(and_( + User.email == email, + VerificationToken.token == token_uuid, + VerificationToken.token_type == "password_reset", + VerificationToken.is_used == False, + VerificationToken.expires_at > datetime.now(timezone.utc) + )) + token_rec = (await db.execute(stmt)).scalar_one_or_none() + if not token_rec: return False + + user_stmt = select(User).where(User.id == token_rec.user_id) + user = (await db.execute(user_stmt)).scalar_one() + user.hashed_password = get_password_hash(new_password) + token_rec.is_used = True + + await db.commit() + return True + except: return False + + @staticmethod + async def soft_delete_user(db: AsyncSession, user_id: int, reason: str, actor_id: int): + """ Felhasználó törlése (Soft-Delete) auditálással. """ + stmt = select(User).where(User.id == user_id) + user = (await db.execute(stmt)).scalar_one_or_none() + if not user or user.is_deleted: return False + + old_email = user.email + user.email = f"deleted_{user.id}_{datetime.now().strftime('%Y%m%d')}_{old_email}" + user.is_deleted = True + user.is_active = False + + await security_service.log_event( + db, user_id=actor_id, action="USER_SOFT_DELETE", + severity="warning", target_type="User", target_id=str(user_id), + new_data={"reason": reason} + ) + await db.commit() + return True \ No newline at end of file diff --git a/backend/app/services/auth_service.py.old_1 b/backend/app/services/auth_service.py.old_1 new file mode 100755 index 0000000..b42253f --- /dev/null +++ b/backend/app/services/auth_service.py.old_1 @@ -0,0 +1,281 @@ +import os +import logging +import uuid +import json +from datetime import datetime, timedelta, timezone +from typing import Optional + +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, and_ +from sqlalchemy.orm import joinedload +from fastapi.encoders import jsonable_encoder +from fastapi import HTTPException, status + +from app.models.identity import User, Person, UserRole, VerificationToken, Wallet +from app.models.gamification import UserStats +from app.models.organization import Organization, OrganizationMember, OrgType +from app.schemas.auth import UserLiteRegister, UserKYCComplete +from app.core.security import get_password_hash, verify_password, generate_secure_slug +from app.services.email_manager import email_manager +from app.core.config import settings +from app.services.config_service import config +from app.services.geo_service import GeoService +from app.services.security_service import security_service # Sentinel integráció + +logger = logging.getLogger(__name__) + +class AuthService: + @staticmethod + async def register_lite(db: AsyncSession, user_in: UserLiteRegister): + """ + Step 1: Lite Regisztráció (Manuális). + Létrehozza a Person és User rekordokat, de a fiók inaktív marad. + A folder_slug itt még NEM generálódik le! + """ + try: + # --- Dinamikus jelszóhossz ellenőrzés --- + # Lekérjük az admin beállítást, minimum 8 karakter a hard limit. + min_pass = await config.get_setting(db, "auth_min_password_length", default=8) + min_len = max(int(min_pass), 8) + + if len(user_in.password) < min_len: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail=f"A jelszónak legalább {min_len} karakter hosszúnak kell lennie." + ) + + new_person = Person( + first_name=user_in.first_name, + last_name=user_in.last_name, + is_active=False + ) + db.add(new_person) + await db.flush() + + new_user = User( + email=user_in.email, + hashed_password=get_password_hash(user_in.password), + person_id=new_person.id, + role=UserRole.user, + is_active=False, + is_deleted=False, + region_code=user_in.region_code, + preferred_language=user_in.lang, + timezone=user_in.timezone + # folder_slug marad NULL a Step 2-ig + ) + db.add(new_user) + await db.flush() + + # Verifikációs token generálása + reg_hours = await config.get_setting(db, "auth_registration_hours", region_code=user_in.region_code, default=48) + token_val = uuid.uuid4() + db.add(VerificationToken( + token=token_val, + user_id=new_user.id, + token_type="registration", + expires_at=datetime.now(timezone.utc) + timedelta(hours=int(reg_hours)) + )) + + # Email kiküldése + verification_link = f"{settings.FRONTEND_BASE_URL}/verify?token={token_val}" + await email_manager.send_email( + recipient=user_in.email, + template_key="reg", + variables={"first_name": user_in.first_name, "link": verification_link}, + lang=user_in.lang + ) + + # Audit log a regisztrációról + await security_service.log_event( + db, + user_id=new_user.id, + action="USER_REGISTER_LITE", + severity="info", + target_type="User", + target_id=str(new_user.id), + new_data={"email": user_in.email, "method": "manual"} + ) + + await db.commit() + await db.refresh(new_user) + return new_user + except HTTPException: + await db.rollback() + raise + except Exception as e: + await db.rollback() + logger.error(f"Registration Error: {str(e)}") + raise e + + @staticmethod + async def complete_kyc(db: AsyncSession, user_id: int, kyc_in: UserKYCComplete): + """ Step 2: Atomi Tranzakció (Person + Address + Org + Branch + Wallet). """ + try: + # 1. Lekérés Eager Loadinggal a hibák elkerülésére + stmt = select(User).options(joinedload(User.person)).where(User.id == user_id) + user = (await db.execute(stmt)).scalar_one_or_none() + if not user: return None + + # 2. Cím rögzítése + addr_id = await GeoService.get_or_create_full_address( + db, zip_code=kyc_in.address_zip, city=kyc_in.address_city, + street_name=kyc_in.address_street_name, street_type=kyc_in.address_street_type, + house_number=kyc_in.address_house_number, parcel_id=kyc_in.address_hrsz + ) + + # 3. Person adatok frissítése (MDM elv) + p = user.person + p.mothers_last_name = kyc_in.mothers_last_name + p.mothers_first_name = kyc_in.mothers_first_name + p.birth_place = kyc_in.birth_place + p.birth_date = kyc_in.birth_date + p.phone = kyc_in.phone_number + p.address_id = addr_id + p.identity_docs = jsonable_encoder(kyc_in.identity_docs) + p.is_active = True + + # 4. Individual Organization (Privát Széf) létrehozása + new_org = Organization( + full_name=f"{p.last_name} {p.first_name} Magán Flotta", + name=f"{p.last_name} Flotta", + folder_slug=generate_secure_slug(12), + org_type=OrgType.individual, + owner_id=user.id, + is_active=True, + status="verified", + country_code=user.region_code + ) + db.add(new_org) + await db.flush() + + # 5. Telephely (Branch) és Tagság + db.add(Branch(organization_id=new_org.id, address_id=addr_id, name="Otthon", is_main=True)) + db.add(OrganizationMember(organization_id=new_org.id, user_id=user.id, role="OWNER")) + db.add(Wallet(user_id=user.id, currency=kyc_in.preferred_currency or "HUF")) + db.add(UserStats(user_id=user.id)) + + # 6. Aktiválás + user.is_active = True + user.folder_slug = generate_secure_slug(12) + + await db.commit() + await db.refresh(user) + return user + except Exception as e: + await db.rollback() + logger.error(f"KYC Error: {e}") + raise e + + @staticmethod + async def soft_delete_user(db: AsyncSession, user_id: int, reason: str, actor_id: int): + """ + Soft-Delete: Email felszabadítás és izoláció. + """ + stmt = select(User).where(User.id == user_id) + user = (await db.execute(stmt)).scalar_one_or_none() + + if not user or user.is_deleted: + return False + + old_email = user.email + # Email átnevezése az egyediség megőrzése érdekében (újraregisztrációhoz) + user.email = f"deleted_{user.id}_{datetime.now().strftime('%Y%m%d')}_{old_email}" + user.is_deleted = True + user.is_active = False + + await security_service.log_event( + db, + user_id=actor_id, + action="USER_SOFT_DELETE", + severity="warning", + target_type="User", + target_id=str(user_id), + old_data={"email": old_email}, + new_data={"is_deleted": True, "reason": reason} + ) + + await db.commit() + return True + + @staticmethod + async def verify_email(db: AsyncSession, token_str: str): + try: + token_uuid = uuid.UUID(token_str) + stmt = select(VerificationToken).where( + and_( + VerificationToken.token == token_uuid, + VerificationToken.is_used == False, + VerificationToken.expires_at > datetime.now(timezone.utc) + ) + ) + res = await db.execute(stmt) + token = res.scalar_one_or_none() + if not token: return False + + token.is_used = True + await db.commit() + return True + except: + return False + + @staticmethod + async def authenticate(db: AsyncSession, email: str, password: str): + stmt = select(User).where(and_(User.email == email, User.is_deleted == False)) + res = await db.execute(stmt) + user = res.scalar_one_or_none() + if user and verify_password(password, user.hashed_password): + return user + return None + + @staticmethod + async def initiate_password_reset(db: AsyncSession, email: str): + stmt = select(User).where(and_(User.email == email, User.is_deleted == False)) + user = (await db.execute(stmt)).scalar_one_or_none() + + if user: + reset_hours = await config.get_setting(db, "auth_password_reset_hours", region_code=user.region_code, default=2) + token_val = uuid.uuid4() + db.add(VerificationToken( + token=token_val, + user_id=user.id, + token_type="password_reset", + expires_at=datetime.now(timezone.utc) + timedelta(hours=int(reset_hours)) + )) + + reset_link = f"{settings.FRONTEND_BASE_URL}/reset-password?token={token_val}" + await email_manager.send_email( + recipient=email, + template_key="pwd_reset", + variables={"link": reset_link}, + lang=user.preferred_language + ) + await db.commit() + return "success" + return "not_found" + + @staticmethod + async def reset_password(db: AsyncSession, email: str, token_str: str, new_password: str): + try: + token_uuid = uuid.UUID(token_str) + stmt = select(VerificationToken).join(User).where( + and_( + User.email == email, + VerificationToken.token == token_uuid, + VerificationToken.token_type == "password_reset", + VerificationToken.is_used == False, + VerificationToken.expires_at > datetime.now(timezone.utc) + ) + ) + token_rec = (await db.execute(stmt)).scalar_one_or_none() + if not token_rec: return False + + user_stmt = select(User).where(User.id == token_rec.user_id) + user = (await db.execute(user_stmt)).scalar_one() + user.hashed_password = get_password_hash(new_password) + token_rec.is_used = True + + await db.commit() + return True + except: + return False \ No newline at end of file diff --git a/backend/app/services/config_service.py b/backend/app/services/config_service.py new file mode 100755 index 0000000..fbb901a --- /dev/null +++ b/backend/app/services/config_service.py @@ -0,0 +1,83 @@ +# /opt/docker/dev/service_finder/backend/app/services/config_service.py +from typing import Any, Optional, Dict +import logging +import os +from decimal import Decimal +from datetime import datetime, timezone + +from sqlalchemy import select, text +from sqlalchemy.ext.asyncio import AsyncSession + +# Modellek importálása a központi helyről +from app.models import ExchangeRate, AssetCost, AssetTelemetry +from app.db.session import AsyncSessionLocal + +logger = logging.getLogger(__name__) + +class CostService: + # A cost_in típusát 'Any'-re állítottam ideiglenesen, hogy ne dobjon újabb ImportError-t a hiányzó Pydantic séma miatt + async def record_cost(self, db: AsyncSession, cost_in: Any, user_id: int): + try: + # 1. Árfolyam lekérése (EUR Pivot) + rate_stmt = select(ExchangeRate).where( + ExchangeRate.target_currency == cost_in.currency_local + ).order_by(ExchangeRate.id.desc()).limit(1) + + rate_res = await db.execute(rate_stmt) + rate_obj = rate_res.scalar_one_or_none() + exchange_rate = rate_obj.rate if rate_obj else Decimal("1.0") + + # 2. Kalkuláció + amt_eur = Decimal(str(cost_in.amount_local)) / exchange_rate + + # 3. Mentés az új AssetCost modellbe + new_cost = AssetCost( + asset_id=cost_in.asset_id, + organization_id=cost_in.organization_id, + driver_id=user_id, + cost_type=cost_in.cost_type, + amount_local=cost_in.amount_local, + currency_local=cost_in.currency_local, + amount_eur=amt_eur, + exchange_rate_used=exchange_rate, + mileage_at_cost=cost_in.mileage_at_cost, + date=cost_in.date or datetime.now(timezone.utc) + ) + db.add(new_cost) + + # 4. Telemetria szinkron + if cost_in.mileage_at_cost: + tel_stmt = select(AssetTelemetry).where(AssetTelemetry.asset_id == cost_in.asset_id) + telemetry = (await db.execute(tel_stmt)).scalar_one_or_none() + if telemetry and cost_in.mileage_at_cost > (telemetry.current_mileage or 0): + telemetry.current_mileage = cost_in.mileage_at_cost + + await db.commit() + return new_cost + except Exception as e: + await db.rollback() + raise e + +class ConfigService: + """ + MB 2.0 Alapvető konfigurációs szerviz. + Kezeli az AI szolgáltatások (Ollama) dinamikus beállításait és promptjait. + """ + async def get_setting(self, db: AsyncSession, key: str, default: Any = None) -> Any: + """ + Lekéri a kért beállítást. + 1. Megnézi a környezeti változókat (NAGYBETŰVEL). + 2. Ha nincs ilyen ENV, visszaadja a kódba égetett 'default' értéket. + """ + env_val = os.getenv(key.upper()) + if env_val is not None: + # Automatikus típuskonverzió a default paraméter típusa alapján + if isinstance(default, int): return int(env_val) + if isinstance(default, float): return float(env_val) + if isinstance(default, bool): return str(env_val).lower() in ('true', '1', 'yes') + return env_val + + return default + +# A példány, amit a többi modul (pl. az auth_service, ai_service) importálni próbál +config = ConfigService() \ No newline at end of file diff --git a/backend/app/services/cost_service.py b/backend/app/services/cost_service.py new file mode 100755 index 0000000..337a0f5 --- /dev/null +++ b/backend/app/services/cost_service.py @@ -0,0 +1,144 @@ +# /opt/docker/dev/service_finder/backend/app/services/cost_service.py +import uuid +import logging +from decimal import Decimal +from typing import Any, Dict +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, desc, func +from app.models.asset import AssetCost, AssetTelemetry, ExchangeRate +from app.services.gamification_service import GamificationService +from app.services.config_service import config +from app.schemas.asset_cost import AssetCostCreate +from datetime import datetime + + +logger = logging.getLogger(__name__) + +class CostService: + """ + Industrial Cost & Telemetry Service. + Összeköti a pénzügyi kiadásokat, az OCR bizonylatokat és a jármű állapotát. + """ + + async def record_cost(self, db: AsyncSession, cost_in: AssetCostCreate, user_id: int): + """ Teljes körű költségrögzítés: Konverzió + Telemetria + OCR + XP. """ + try: + # 1. Dinamikus konfiguráció lekérése + base_currency = await config.get_setting(db, "finance_base_currency", default="EUR") + base_xp = await config.get_setting(db, "xp_per_cost_log", default=50) + ocr_multiplier = await config.get_setting(db, "xp_multiplier_ocr_cost", default=1.5) + + # 2. Intelligens Árfolyamkezelés + exchange_rate = Decimal("1.0") + if cost_in.currency_local != base_currency: + rate_stmt = select(ExchangeRate).where( + ExchangeRate.target_currency == cost_in.currency_local + ).order_by(desc(ExchangeRate.updated_at)).limit(1) + rate_res = await db.execute(rate_stmt) + rate_obj = rate_res.scalar_one_or_none() + exchange_rate = rate_obj.rate if rate_obj else Decimal("1.0") + + amt_base = Decimal(str(cost_in.amount_local)) / exchange_rate if exchange_rate > 0 else Decimal("0") + + # 3. Költség rekord rögzítése (Kapcsolva a Robot 1 OCR dokumentumához) + new_cost = AssetCost( + asset_id=cost_in.asset_id, + organization_id=cost_in.organization_id, + driver_id=user_id, + cost_type=cost_in.cost_type, + amount_local=cost_in.amount_local, + currency_local=cost_in.currency_local, + amount_eur=amt_base, + net_amount_local=cost_in.net_amount_local, + vat_rate=cost_in.vat_rate, + exchange_rate_used=exchange_rate, + mileage_at_cost=cost_in.mileage_at_cost, + date=cost_in.date or datetime.now(), + # OCR Kapcsolat + document_id=cost_in.document_id, + is_ai_generated=cost_in.document_id is not None, + data=cost_in.data or {} + ) + db.add(new_cost) + + # 4. Automatikus Telemetria (Kilométeróra frissítés) + if cost_in.mileage_at_cost: + await self._sync_telemetry(db, cost_in.asset_id, cost_in.mileage_at_cost) + + # 5. Gamification (Értékesebb az adat, ha van róla fotó/OCR) + final_xp = base_xp + if new_cost.is_ai_generated: + final_xp = int(base_xp * float(ocr_multiplier)) + + await GamificationService.award_points( + db, user_id=user_id, amount=final_xp, reason=f"EXPENSE_LOG_{cost_in.cost_type}" + ) + + await db.commit() + await db.refresh(new_cost) + return new_cost + + except Exception as e: + await db.rollback() + logger.error(f"CostService Error: {e}") + raise e + + async def _sync_telemetry(self, db: AsyncSession, asset_id: int, mileage: int): + """ Segédfüggvény: Biztonságos óraállás frissítés. """ + stmt = select(AssetTelemetry).where(AssetTelemetry.asset_id == asset_id) + res = await db.execute(stmt) + telemetry = res.scalar_one_or_none() + + if telemetry: + # Csak akkor frissítünk, ha az új érték nagyobb (nincs visszatekerés) + if mileage > (telemetry.current_mileage or 0): + telemetry.current_mileage = mileage + telemetry.last_updated = datetime.now() + else: + db.add(AssetTelemetry(asset_id=asset_id, current_mileage=mileage)) + + async def get_asset_financial_summary(self, db: AsyncSession, asset_id: uuid.UUID) -> Dict[str, Any]: + """ + Dinamikus pénzügyi összesítő SQL szintű aggregációval. + MB 2.0: Nem loopolunk Pythonban, a DB számol! + """ + # 1. Lekérjük az összesített adatokat kategóriánként (Local és EUR) + stmt = ( + select( + AssetCost.cost_type, + func.sum(AssetCost.amount_local).label("total_local"), + func.sum(AssetCost.amount_eur).label("total_eur"), + func.count(AssetCost.id).label("transaction_count") + ) + .where(AssetCost.asset_id == asset_id) + .group_by(AssetCost.cost_type) + ) + + res = await db.execute(stmt) + rows = res.all() + + summary = { + "by_category": {}, + "grand_total_local": Decimal("0.0"), + "grand_total_eur": Decimal("0.0"), + "total_transactions": 0 + } + + for row in rows: + cat = row.cost_type or "OTHER" + summary["by_category"][cat] = { + "local": float(row.total_local), + "eur": float(row.total_eur), + "count": row.transaction_count + } + summary["grand_total_local"] += row.total_local + summary["grand_total_eur"] += row.total_eur + summary["total_transactions"] += row.transaction_count + + # Decimal konverzió a JSON-höz + summary["grand_total_local"] = float(summary["grand_total_local"]) + summary["grand_total_eur"] = float(summary["grand_total_eur"]) + + return summary + +cost_service = CostService() \ No newline at end of file diff --git a/backend/app/services/document_service.py b/backend/app/services/document_service.py new file mode 100755 index 0000000..6f25e79 --- /dev/null +++ b/backend/app/services/document_service.py @@ -0,0 +1,135 @@ +# /opt/docker/dev/service_finder/backend/app/services/document_service.py +import os +import logging +import asyncio +from PIL import Image +from uuid import uuid4 +from datetime import datetime, timezone +from fastapi import UploadFile, BackgroundTasks, HTTPException +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, func, and_ + +from app.models.document import Document +from app.models.identity import User +from app.services.config_service import config # 2.0 Dinamikus beállítások +from app.workers.ocr.robot_1_ocr_processor import OCRRobot # Robot 1 hívása + +logger = logging.getLogger("Document-Service-2.0") + +class DocumentService: + """ + Document Service 2.0 - Admin-vezérelt Pipeline. + Feladata: Tárolás, Optimalizálás, Kvótamanagement és Robot Trigger. + """ + + @staticmethod + async def process_upload( + db: AsyncSession, + user_id: int, + file: UploadFile, + parent_type: str, # pl. "asset", "organization", "transfer" + parent_id: str, + doc_type: str, # pl. "invoice", "registration_card", "sale_contract" + background_tasks: BackgroundTasks + ): + try: + # --- 1. ADMIN KVÓTA ELLENŐRZÉS --- + user_stmt = select(User).where(User.id == user_id) + user = (await db.execute(user_stmt)).scalar_one() + + # Lekérjük a csomagnak megfelelő havi limitet (pl. Free: 1, Premium: 10) + limits = await config.get_setting(db, "ocr_monthly_limit", default={"free": 1, "premium": 10, "vip": 100}) + user_role = user.role.value if hasattr(user.role, 'value') else str(user.role) + allowed_ocr = limits.get(user_role, 1) + + # Megnézzük a havi felhasználást + now = datetime.now(timezone.utc) + start_of_month = now.replace(day=1, hour=0, minute=0, second=0, microsecond=0) + + count_stmt = select(func.count(Document.id)).where( + and_( + Document.user_id == user_id, + Document.created_at >= start_of_month + ) + ) + used_count = (await db.execute(count_stmt)).scalar() + + if used_count >= allowed_ocr: + raise HTTPException( + status_code=403, + detail=f"Havi dokumentum limit túllépve ({allowed_ocr}). Válts csomagot a folytatáshoz!" + ) + + # --- 2. DINAMIKUS TÁROLÁS ÉS OPTIMALIZÁLÁS --- + file_uuid = str(uuid4()) + nas_base = await config.get_setting(db, "storage_nas_path", default="/mnt/nas/app_data") + + # Útvonal sablonok az adminból (Pl. "vault/{parent_type}/{parent_id}") + vault_dir = os.path.join(nas_base, parent_type, parent_id, "vault") + thumb_dir = os.path.join(getattr(config, "STATIC_DIR", "static"), "previews", parent_type, parent_id) + + os.makedirs(vault_dir, exist_ok=True) + os.makedirs(thumb_dir, exist_ok=True) + + content = await file.read() + temp_path = f"/tmp/{file_uuid}_{file.filename}" + with open(temp_path, "wb") as f: f.write(content) + + # Kép feldolgozása PIL-lel + img = Image.open(temp_path) + + # Thumbnail generálás (SSD/Static területre) + thumb_filename = f"{file_uuid}_thumb.webp" + thumb_path = os.path.join(thumb_dir, thumb_filename) + thumb_img = img.copy() + thumb_img.thumbnail((300, 300)) + thumb_img.save(thumb_path, "WEBP", quality=80) + + # Optimalizált eredeti (NAS / Vault területre) + max_width = await config.get_setting(db, "img_max_width", default=1600) + vault_filename = f"{file_uuid}.webp" + vault_path = os.path.join(vault_dir, vault_filename) + + if img.width > max_width: + ratio = max_width / img.width + img = img.resize((max_width, int(img.height * ratio)), Image.Resampling.LANCZOS) + + img.save(vault_path, "WEBP", quality=85) + + # --- 3. MENTÉS --- + new_doc = Document( + id=uuid4(), + user_id=user_id, + parent_type=parent_type, + parent_id=parent_id, + doc_type=doc_type, + original_name=file.filename, + file_hash=file_uuid, + file_ext="webp", + mime_type="image/webp", + file_size=os.path.getsize(vault_path), + has_thumbnail=True, + thumbnail_path=f"/static/previews/{parent_type}/{parent_id}/{thumb_filename}", + status="uploaded" + ) + db.add(new_doc) + await db.flush() + + # --- 4. ROBOT TRIGGER (OCR AUTOMATIZMUS) --- + # Megnézzük, hogy ez a típus (pl. invoice) igényel-e automatikus OCR-t + auto_ocr_types = await config.get_setting(db, "ocr_auto_trigger_types", default=["invoice", "registration_card", "sale_contract"]) + + if doc_type in auto_ocr_types: + # Robot 1 (OCR) sorba állítása háttérfolyamatként + background_tasks.add_task(OCRRobot.process_document, db, new_doc.id) + new_doc.status = "processing" + logger.info(f"🤖 Robot 1 (OCR) riasztva: {new_doc.id}") + + await db.commit() + os.remove(temp_path) + return new_doc + + except Exception as e: + if 'temp_path' in locals() and os.path.exists(temp_path): os.remove(temp_path) + logger.error(f"Document Upload Error: {e}") + raise e \ No newline at end of file diff --git a/backend/app/services/dvla_service.py b/backend/app/services/dvla_service.py new file mode 100755 index 0000000..768715f --- /dev/null +++ b/backend/app/services/dvla_service.py @@ -0,0 +1,71 @@ +# /opt/docker/dev/service_finder/backend/app/services/dvla_service.py +import httpx +import logging +from typing import Optional, Dict, Any +from sqlalchemy.ext.asyncio import AsyncSession + +from app.services.config_service import config # 2.0 Dinamikus konfig +from app.db.session import AsyncSessionLocal + +logger = logging.getLogger("DVLA-Service-2.2") + +class DVLAService: + """ + Sentinel Master DVLA Service 2.2. + Felelős a brit járműadatok lekéréséért a hivatalos állami API-n keresztül. + """ + + @classmethod + async def get_vehicle_details(cls, db: AsyncSession, vrm: str) -> Optional[Dict[str, Any]]: + """ + VRM (Vehicle Registration Mark) lekérdezése dinamikus admin beállításokkal. + """ + try: + # 1. ADMIN BEÁLLÍTÁSOK LEKÉRÉSE + # Megnézzük, engedélyezve van-e a szolgáltatás + is_enabled = await config.get_setting(db, "dvla_api_enabled", default=True) + if not is_enabled: + logger.info("DVLA lekérdezés kihagyva (Admin által letiltva).") + return None + + api_url = await config.get_setting( + db, "dvla_api_url", + default="https://driver-vehicle-licensing.api.gov.uk/vehicle-enquiry/v1/vehicles" + ) + api_key = await config.get_setting(db, "dvla_api_key") + + if not api_key: + logger.error("DVLA API kulcs hiányzik a system_parameters táblából!") + return None + + # 2. HITELESÍTÉS ÉS LEKÉRDEZÉS + headers = { + "x-api-key": api_key, + "Content-Type": "application/json" + } + # A DVLA szigorúan nagybetűs, szóköz nélküli rendszámot vár + clean_vrm = vrm.replace(" ", "").upper().strip() + payload = {"registrationNumber": clean_vrm} + + async with httpx.AsyncClient(timeout=15.0) as client: + response = await client.post(api_url, json=payload, headers=headers) + + if response.status_code == 200: + logger.info(f"✅ DVLA adat sikeresen lekérve: {clean_vrm}") + return response.json() + + elif response.status_code == 404: + logger.warning(f"⚠️ Jármű nem található a DVLA adatbázisában: {clean_vrm}") + return None + + elif response.status_code == 429: + logger.error("🚨 DVLA API hiba: Túl sok kérés (Rate Limit)!") + return {"error": "rate_limited"} + + else: + logger.error(f"❌ DVLA API hiba ({response.status_code}): {response.text}") + return None + + except Exception as e: + logger.error(f"⚠️ DVLAService Kritikus Hiba: {e}") + return None \ No newline at end of file diff --git a/backend/app/services/email_manager.py b/backend/app/services/email_manager.py new file mode 100755 index 0000000..f39ebb2 --- /dev/null +++ b/backend/app/services/email_manager.py @@ -0,0 +1,132 @@ +import smtplib +import logging +from email.mime.text import MIMEText +from email.mime.multipart import MIMEMultipart +from typing import Optional + +from sqlalchemy.ext.asyncio import AsyncSession +from app.core.config import settings +from app.core.i18n import locale_manager +from app.services.config_service import config +from app.db.session import AsyncSessionLocal # Szükséges a beállítások lekéréséhez + +logger = logging.getLogger("Email-Manager-2.0") + +class EmailManager: + @staticmethod + def _get_html_template(template_key: str, variables: dict, lang: str = "hu") -> str: + """HTML sablon generálása a fordítási fájlok alapján (Megmaradt az eredeti logika).""" + greeting = locale_manager.get(f"email.{template_key}_greeting", lang=lang, **variables) + body = locale_manager.get(f"email.{template_key}_body", lang=lang, **variables) + button_text = locale_manager.get(f"email.{template_key}_button", lang=lang) + footer = locale_manager.get(f"email.{template_key}_footer", lang=lang) + + link_fallback_text = locale_manager.get("email.link_fallback", lang=lang) + + return f""" + + +
+

{greeting}

+

{body}

+ +

+ {link_fallback_text}
+ {variables.get('link')} +

+
+

{footer}

+
+ + + """ + + @staticmethod + async def send_email(recipient: str, template_key: str, variables: dict, lang: str = "hu", db: Optional[AsyncSession] = None): + """ + E-mail küldése admin-vezérelt szolgáltatóval (SendGrid vagy SMTP). + """ + # 1. Belső session kezelés, ha kívülről nem kaptunk (pl. háttérfolyamatoknál) + session_internal = False + if db is None: + db = AsyncSessionLocal() + session_internal = True + + try: + # 2. Dinamikus beállítások lekérése az adatbázisból (Admin 2.0) + provider = await config.get_setting(db, "email_provider", default="disabled") + from_email = await config.get_setting(db, "emails_from_email", default="noreply@profibot.hu") + from_name = await config.get_setting(db, "emails_from_name", default="Sentinel System") + + if provider == "disabled": + logger.info(f"Email küldés letiltva (Admin config). Cél: {recipient}") + return + + html = EmailManager._get_html_template(template_key, variables, lang) + subject = locale_manager.get(f"email.{template_key}_subject", lang=lang) + + # 3. KÜLDÉSI LOGIKA VÁLASZTÁSA + if provider == "sendgrid": + api_key = await config.get_setting(db, "sendgrid_api_key") + if api_key: + return await EmailManager._send_via_sendgrid(api_key, from_email, from_name, recipient, subject, html) + logger.warning("SendGrid szolgáltató kiválasztva, de nincs API kulcs!") + + # Fallback vagy közvetlen SMTP + smtp_cfg = await config.get_setting(db, "smtp_config", default={ + "host": "localhost", "port": 587, "user": "", "pass": "", "tls": True + }) + return await EmailManager._send_via_smtp(smtp_cfg, from_email, from_name, recipient, subject, html) + + finally: + if session_internal: + await db.close() + + @staticmethod + async def _send_via_sendgrid(api_key: str, from_email: str, from_name: str, recipient: str, subject: str, html: str): + try: + from sendgrid import SendGridAPIClient + from sendgrid.helpers.mail import Mail + + message = Mail( + from_email=(from_email, from_name), + to_emails=recipient, + subject=subject, + html_content=html + ) + sg = SendGridAPIClient(api_key) + response = sg.send(message) + logger.info(f"SendGrid siker: {response.status_code} -> {recipient}") + return {"status": "success", "provider": "sendgrid"} + except Exception as e: + logger.error(f"SendGrid hiba: {str(e)}") + return {"status": "error", "message": "SendGrid failed"} + + @staticmethod + async def _send_via_smtp(cfg: dict, from_email: str, from_name: str, recipient: str, subject: str, html: str): + try: + msg = MIMEMultipart() + msg["From"] = f"{from_name} <{from_email}>" + msg["To"] = recipient + msg["Subject"] = subject + msg.attach(MIMEText(html, "html")) + + with smtplib.SMTP(cfg["host"], cfg["port"], timeout=15) as server: + if cfg.get("tls", True): + server.starttls() + if cfg.get("user") and cfg.get("pass"): + server.login(cfg["user"], cfg["pass"]) + server.send_message(msg) + + logger.info(f"SMTP siker -> {recipient}") + return {"status": "success", "provider": "smtp"} + except Exception as e: + logger.error(f"SMTP hiba: {str(e)}") + return {"status": "error", "message": str(e)} + +email_manager = EmailManager() \ No newline at end of file diff --git a/backend/app/services/fleet_service.py b/backend/app/services/fleet_service.py new file mode 100755 index 0000000..7c88321 --- /dev/null +++ b/backend/app/services/fleet_service.py @@ -0,0 +1,135 @@ +# /opt/docker/dev/service_finder/backend/app/services/fleet_service.py +import logging +from uuid import UUID +from typing import Optional, Dict, Any +from decimal import Decimal + +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, func +from sqlalchemy.orm import selectinload + +from app.models.asset import Asset, AssetEvent, AssetCost, AssetTelemetry +from app.models.social import ServiceProvider, ModerationStatus +from app.schemas.fleet import EventCreate, TCOStats +from app.services.gamification_service import gamification_service +from app.services.config_service import config # 2.0 Dinamikus konfig + +logger = logging.getLogger("Fleet-Service-2.2") + +class FleetService: + """ + Sentinel Master Fleet Service 2.2. + Kezeli a járműflotta eseményeit és a TCO elemzéseket admin-vezérelt szabályokkal. + """ + + @staticmethod + async def add_vehicle_event(db: AsyncSession, asset_id: UUID, event_data: EventCreate, user_id: int): + """ + Esemény rögzítése dinamikus jutalmazással és anomália figyeléssel. + """ + try: + # 1. Asset és Telemetria betöltése + stmt = select(Asset).where(Asset.id == asset_id).options(selectinload(Asset.telemetry)) + res = await db.execute(stmt) + asset = res.scalar_one_or_none() + if not asset: return None + + # 2. ADMIN KONFIGURÁCIÓ LEKÉRÉSE (Hierarchikus: User > Region > Global) + # Lekérjük az eseménytípushoz tartozó jutalmakat + event_rewards = await config.get_setting( + db, + "FLEET_EVENT_REWARDS", + scope_level="user", + scope_id=str(user_id), + default={ + "refuel": {"xp": 30, "social": 5}, + "service": {"xp": 100, "social": 20}, + "inspection": {"xp": 50, "social": 10}, + "default": {"xp": 20, "social": 2} + } + ) + + # 3. SZOLGÁLTATÓ KEZELÉSE + provider_id = event_data.provider_id + if not event_data.is_diy and event_data.provider_name and not provider_id: + p_stmt = select(ServiceProvider).where(func.lower(ServiceProvider.name) == event_data.provider_name.lower()) + existing = (await db.execute(p_stmt)).scalar_one_or_none() + if existing: + provider_id = existing.id + else: + new_p = ServiceProvider( + name=event_data.provider_name, + added_by_user_id=user_id, + status=ModerationStatus.pending + ) + db.add(new_p) + await db.flush() + provider_id = new_p.id + + # 4. ANOMÁLIA DETEKCIÓ (Admin-vezérelt küszöbökkel) + current_mileage = asset.telemetry.current_mileage if asset.telemetry else 0 + is_odometer_anomaly = event_data.odometer_value < current_mileage + + # 5. ESEMÉNY RÖGZÍTÉSE + new_event = AssetEvent( + asset_id=asset_id, + event_type=event_data.event_type, + recorded_mileage=event_data.odometer_value, + provider_id=provider_id, + is_anomaly=is_odometer_anomaly, + data=event_data.model_dump(exclude={"provider_id", "provider_name"}) + ) + db.add(new_event) + + # 6. DINAMIKUS GAMIFIKÁCIÓ + # Kikeresjük a konkrét eseménytípushoz tartozó pontokat + rewards = event_rewards.get(event_data.event_type, event_rewards["default"]) + + await gamification_service.process_activity( + db, + user_id, + xp_amount=rewards["xp"], + social_amount=rewards["social"], + reason=f"FLEET_EVENT_{event_data.event_type.upper()}" + ) + + await db.commit() + return new_event + + except Exception as e: + await db.rollback() + logger.error(f"Fleet Event Error: {e}") + raise e + + @staticmethod + async def calculate_tco(db: AsyncSession, asset_id: UUID) -> TCOStats: + """ + TCO számítás dinamikus pénznemkezeléssel és KM-alapú költséganalízissel. + """ + # 1. Admin beállítások (Pl. alapértelmezett pénznem a riportokhoz) + report_currency = await config.get_setting(db, "finance_base_currency", default="EUR") + + # 2. Költségek összesítése kategóriánként + result = await db.execute( + select(AssetCost.cost_type, func.sum(AssetCost.amount_eur)) + .where(AssetCost.asset_id == asset_id) + .group_by(AssetCost.cost_type) + ) + + breakdown = {row[0]: float(row[1]) for row in result.all()} + total_eur = sum(breakdown.values()) + + # 3. KM alapú költség (Telemetria bevonása) + telemetry_stmt = select(AssetTelemetry).where(AssetTelemetry.asset_id == asset_id) + telemetry = (await db.execute(telemetry_stmt)).scalar_one_or_none() + + mileage = telemetry.current_mileage if telemetry and telemetry.current_mileage > 0 else 1 + cost_per_km = total_eur / mileage + + return TCOStats( + asset_id=asset_id, + total_cost_eur=total_eur, + breakdown=breakdown, + cost_per_km=round(cost_per_km, 4), + currency=report_currency + ) \ No newline at end of file diff --git a/backend/app/services/gamification_service.py b/backend/app/services/gamification_service.py new file mode 100755 index 0000000..cda133d --- /dev/null +++ b/backend/app/services/gamification_service.py @@ -0,0 +1,153 @@ +# /opt/docker/dev/service_finder/backend/app/services/gamification_service.py +import logging +import math +from decimal import Decimal +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, desc +from app.models.gamification import UserStats, PointsLedger, UserBadge, Badge +from app.models.identity import User, Wallet +from app.models.audit import FinancialLedger +from app.services.config_service import config # 2.0 Központi konfigurátor + +logger = logging.getLogger("Gamification-Service-2.0") + +class GamificationService: + """ + Gamification Service 2.0 - A 'Jövevény' lelke. + Felelős a pontozásért, szintekért, büntetésekért és a jutalom-kreditekért. + """ + + @staticmethod + async def award_points(db: AsyncSession, user_id: int, amount: int, reason: str, social_points: int = 0): + """ Statikus segédfüggvény a Robotok számára az egyszerűbb híváshoz. """ + service = GamificationService() + return await service.process_activity(db, user_id, xp_amount=amount, social_amount=social_points, reason=reason) + + async def process_activity( + self, + db: AsyncSession, + user_id: int, + xp_amount: int, + social_amount: int, + reason: str, + is_penalty: bool = False + ): + """ A fő folyamat: Pontozás -> Büntetés szűrés -> Szintszámítás -> Kifizetés. """ + try: + # 1. ADMIN KONFIGURÁCIÓ BETÖLTÉSE + # Minden paraméter az admin felületről módosítható JSON-ként + cfg = await config.get_setting(db, "GAMIFICATION_MASTER_CONFIG", default={ + "xp_logic": {"base_xp": 500, "exponent": 1.5}, + "penalty_logic": { + "recovery_rate": 0.5, + "thresholds": {"level_1": 100, "level_2": 500, "level_3": 1000}, + "multipliers": {"L0": 1.0, "L1": 0.5, "L2": 0.1, "L3": 0.0} + }, + "conversion_logic": {"social_to_credit_rate": 100}, + "level_rewards": {"credits_per_10_levels": 50} + }) + + # 2. FELHASZNÁLÓ ÉS STATISZTIKA ELLENŐRZÉSE + stats_stmt = select(UserStats).where(UserStats.user_id == user_id) + stats = (await db.execute(stats_stmt)).scalar_one_or_none() + + if not stats: + stats = UserStats(user_id=user_id, total_xp=0, current_level=1, penalty_points=0) + db.add(stats) + await db.flush() + + # 3. BÜNTETŐ LOGIKA (Ha negatív esemény történik) + if is_penalty: + return await self._apply_penalty(db, stats, xp_amount, reason, cfg) + + # 4. SZORZÓK ALKALMAZÁSA (Büntetés alatt állók 'bírsága') + multiplier = await self._calculate_multiplier(stats, cfg) + if multiplier <= 0: + logger.warning(f"User {user_id} pontszerzése blokkolva a büntetések miatt.") + return stats + + # 5. XP SZÁMÍTÁS ÉS SZINTLÉPÉS + final_xp = int(xp_amount * multiplier) + if final_xp > 0: + stats.total_xp += final_xp + # Büntetés ledolgozás (Recovery) + if stats.penalty_points > 0: + recovery = int(final_xp * cfg["penalty_logic"]["recovery_rate"]) + stats.penalty_points = max(0, stats.penalty_points - recovery) + + # Új szint számítás hatványfüggvénnyel: + # $Level = \sqrt[exponent]{\frac{XP}{Base}} + 1$ + xp_cfg = cfg["xp_logic"] + new_level = int((stats.total_xp / xp_cfg["base_xp"]) ** (1 / xp_cfg["exponent"])) + 1 + + if new_level > stats.current_level: + await self._handle_level_up(db, user_id, stats.current_level, new_level, cfg) + stats.current_level = new_level + + # 6. SOCIAL PONT ÉS KREDIT KONVERZIÓ + final_social = int(social_amount * multiplier) + if final_social > 0: + stats.social_points += final_social + rate = cfg["conversion_logic"]["social_to_credit_rate"] + + if stats.social_points >= rate: + credits_to_add = stats.social_points // rate + stats.social_points %= rate # A maradék pont megmarad + await self._add_earned_credits(db, user_id, credits_to_add, "SOCIAL_ACTIVITY_CONVERSION") + + # 7. NAPLÓZÁS + db.add(PointsLedger(user_id=user_id, points=final_xp, reason=reason)) + + await db.commit() + await db.refresh(stats) + return stats + + except Exception as e: + await db.rollback() + logger.error(f"Gamification Error for user {user_id}: {e}") + raise e + + # --- PRIVÁT SEGÉDFÜGGVÉNYEK --- + + async def _apply_penalty(self, db: AsyncSession, stats: UserStats, amount: int, reason: str, cfg: dict): + """Büntetőpontok hozzáadása és korlátozási szintek emelése.""" + stats.penalty_points += amount + th = cfg["penalty_logic"]["thresholds"] + + if stats.penalty_points >= th["level_3"]: stats.restriction_level = 3 + elif stats.penalty_points >= th["level_2"]: stats.restriction_level = 2 + elif stats.penalty_points >= th["level_1"]: stats.restriction_level = 1 + + db.add(PointsLedger(user_id=stats.user_id, points=0, penalty_change=amount, reason=f"🔴 PENALTY: {reason}")) + await db.commit() + return stats + + async def _calculate_multiplier(self, stats: UserStats, cfg: dict) -> float: + """Kiszámolja a szorzót a jelenlegi büntetési szint alapján.""" + m = cfg["penalty_logic"]["multipliers"] + if stats.restriction_level == 3: return m["L3"] + if stats.restriction_level == 2: return m["L2"] + if stats.restriction_level == 1: return m["L1"] + return m["L0"] + + async def _handle_level_up(self, db: AsyncSession, user_id: int, old_lvl: int, new_lvl: int, cfg: dict): + """Szintlépési jutalmak (pl. minden 10. szintnél kredit).""" + logger.info(f"✨ Level Up: User {user_id} ({old_lvl} -> {new_lvl})") + if new_lvl % 10 == 0: + reward = cfg["level_rewards"]["credits_per_10_levels"] + await self._add_earned_credits(db, user_id, reward, f"LEVEL_{new_lvl}_REWARD") + + async def _add_earned_credits(self, db: AsyncSession, user_id: int, amount: int, reason: str): + """Kredit jóváírása a Wallet-ben és a pénzügyi naplóban.""" + wallet_stmt = select(Wallet).where(Wallet.user_id == user_id) + wallet = (await db.execute(wallet_stmt)).scalar_one_or_none() + if wallet: + wallet.earned_credits += Decimal(str(amount)) + db.add(FinancialLedger( + user_id=user_id, + amount=float(amount), + transaction_type="GAMIFICATION_CREDIT", + details={"reason": reason} + )) + +gamification_service = GamificationService() \ No newline at end of file diff --git a/backend/app/services/geo_service.py b/backend/app/services/geo_service.py new file mode 100755 index 0000000..ceaea2c --- /dev/null +++ b/backend/app/services/geo_service.py @@ -0,0 +1,155 @@ +# /opt/docker/dev/service_finder/backend/app/services/geo_service.py +import uuid +import logging +from typing import Optional, List, Dict, Any +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import text, select + +from app.services.config_service import config # 2.0 Dinamikus konfig +from app.db.session import AsyncSessionLocal + +logger = logging.getLogger("Geo-Service-2.2") + +class GeoService: + """ + Sentinel Master GeoService 2.2. + Felelős a címek normalizálásáért, a szótárak építéséért és a téradatokért. + Minden paraméter (ország, sablon, limit) adminból vezérelt. + """ + + @staticmethod + async def get_street_suggestions(db: AsyncSession, zip_code: str, q: str, user_id: Optional[int] = None) -> List[str]: + """ + Autocomplete támogatás az utcákhoz. + A limitet és a keresési logikát az adminból vesszük. + """ + # 1. Admin beállítások lekérése + search_limit = await config.get_setting(db, "GEO_SUGGESTION_LIMIT", default=10) + + query = text(""" + SELECT DISTINCT s.name + FROM data.geo_streets s + JOIN data.geo_postal_codes p ON s.postal_code_id = p.id + WHERE p.zip_code = :zip AND s.name ILIKE :q + ORDER BY s.name ASC LIMIT :limit + """) + try: + res = await db.execute(query, {"zip": zip_code, "q": f"{q}%", "limit": search_limit}) + return [row[0] for row in res.fetchall()] + except Exception as e: + logger.error(f"Street Suggestion Error: {e}") + return [] + + @staticmethod + async def get_or_create_full_address( + db: AsyncSession, + zip_code: str, + city: str, + street_name: str, + street_type: str, + house_number: str, + stairwell: Optional[str] = None, + floor: Optional[str] = None, + door: Optional[str] = None, + parcel_id: Optional[str] = None, + user_id: Optional[int] = None # A régió-alapú felülbíráláshoz + ) -> uuid.UUID: + """ + Hibrid címrögzítés atomizált mezőkkel. + A cím generálásának módja (sablonja) régió- vagy felhasználó-specifikus lehet. + """ + try: + # 1. ADMIN BEÁLLÍTÁSOK LEKÉRÉSE (Hierarchikus: User > Region > Global) + # Országkód (pl. HU, AT, DE) + default_country = await config.get_setting( + db, "geo_default_country_code", + scope_level="user" if user_id else "global", + scope_id=str(user_id) if user_id else None, + default="HU" + ) + + # Címformázási sablon (pl. "{zip} {city}, {street} {type} {number}") + address_template = await config.get_setting( + db, "GEO_ADDRESS_FORMAT_TEMPLATE", + default="{zip} {city}, {street} {type} {number}." + ) + + # 2. Irányítószám és Város (Auto-learning / Upsert) + zip_id_query = text(""" + INSERT INTO data.geo_postal_codes (zip_code, city, country_code) + VALUES (:z, :c, :cc) + ON CONFLICT (country_code, zip_code, city) DO UPDATE SET city = EXCLUDED.city + RETURNING id + """) + zip_res = await db.execute(zip_id_query, {"z": zip_code, "c": city, "cc": default_country}) + zip_id = zip_res.scalar() + + # 3. Utca szótár frissítése + await db.execute(text(""" + INSERT INTO data.geo_streets (postal_code_id, name) VALUES (:zid, :n) + ON CONFLICT (postal_code_id, name) DO NOTHING + """), {"zid": zip_id, "n": street_name}) + + # 4. Közterület típus (út, utca, köz...) + await db.execute(text(""" + INSERT INTO data.geo_street_types (name) VALUES (:n) + ON CONFLICT (name) DO NOTHING + """), {"n": street_type.lower()}) + + # 5. SZÖVEGES CÍM GENERÁLÁSA SABLON ALAPJÁN (2.2 Újdonság) + # Megformázzuk az alapcímet az admin sablon szerint + full_text = address_template.format( + zip=zip_code, + city=city, + street=street_name, + type=street_type, + number=house_number + ) + + # Hozzáadjuk az atomizált kiegészítőket, ha vannak + if stairwell: full_text += f" {stairwell}. lph." + if floor: full_text += f" {floor}. em." + if door: full_text += f" {door}. ajtó" + + # 6. Központi Address rekord rögzítése vagy lekérése + address_query = text(""" + INSERT INTO data.addresses ( + postal_code_id, street_name, street_type, house_number, + stairwell, floor, door, parcel_id, full_address_text + ) + VALUES (:zid, :sn, :st, :hn, :sw, :fl, :dr, :pid, :txt) + ON CONFLICT (postal_code_id, street_name, street_type, house_number, stairwell, floor, door) + DO NOTHING + RETURNING id + """) + + params = { + "zid": zip_id, "sn": street_name, "st": street_type, + "hn": house_number, "sw": stairwell, "fl": floor, + "dr": door, "pid": parcel_id, "txt": full_text + } + + res = await db.execute(address_query, params) + addr_id = res.scalar() + + # 7. Biztonsági keresés: Ha létezett a rekord, de nem kaptunk ID-t a RETURNING-gal + if not addr_id: + lookup_query = text(""" + SELECT id FROM data.addresses + WHERE postal_code_id = :zid + AND street_name = :sn + AND street_type = :st + AND house_number = :hn + AND (stairwell IS NOT DISTINCT FROM :sw) + AND (floor IS NOT DISTINCT FROM :fl) + AND (door IS NOT DISTINCT FROM :dr) + LIMIT 1 + """) + lookup_res = await db.execute(lookup_query, params) + addr_id = lookup_res.scalar() + + return addr_id + + except Exception as e: + logger.error(f"GeoService Critical Error: {str(e)}") + raise ValueError(f"Súlyos hiba a cím normalizálása során. Admin/Séma ellenőrzése javasolt.") \ No newline at end of file diff --git a/backend/app/services/image_processor.py b/backend/app/services/image_processor.py new file mode 100755 index 0000000..8faaa58 --- /dev/null +++ b/backend/app/services/image_processor.py @@ -0,0 +1,38 @@ +# /opt/docker/dev/service_finder/backend/app/services/image_processor.py +import cv2 +import numpy as np +from typing import Optional + +class DocumentImageProcessor: + """ Saját képtisztító pipeline Robot 3 OCR számára. """ + + @staticmethod + def process_for_ocr(image_bytes: bytes) -> Optional[bytes]: + if not image_bytes: return None + try: + nparr = np.frombuffer(image_bytes, np.uint8) + img = cv2.imdecode(nparr, cv2.IMREAD_COLOR) + if img is None: return None + + # 1. Előkészítés (Szürkeárnyalat + Felskálázás) + gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + if gray.shape[1] < 1200: + gray = cv2.resize(gray, None, fx=2.0, fy=2.0, interpolation=cv2.INTER_CUBIC) + + # 2. Kontraszt dúsítás (CLAHE) + clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) + contrast = clahe.apply(gray) + + # 3. Adaptív Binarizálás (Fekete-fehér szöveg kiemelés) + blur = cv2.GaussianBlur(contrast, (3, 3), 0) + thresh = cv2.adaptiveThreshold( + blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, + cv2.THRESH_BINARY, 11, 2 + ) + + success, encoded_image = cv2.imencode('.png', thresh) + return encoded_image.tobytes() if success else None + + except Exception as e: + print(f"OpenCV Feldolgozási hiba: {e}") + return None \ No newline at end of file diff --git a/backend/app/services/maintenance_service.py b/backend/app/services/maintenance_service.py new file mode 100755 index 0000000..6831a44 --- /dev/null +++ b/backend/app/services/maintenance_service.py @@ -0,0 +1,106 @@ +# /opt/docker/dev/service_finder/backend/app/services/maintenance_service.py +import os +import logging +import shutil +from datetime import datetime, timedelta, timezone +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, and_ +from app.models.asset import Asset, AssetTelemetry +from app.services.config_service import config # 2.0 Dinamikus konfig +from app.services.notification_service import NotificationService + +logger = logging.getLogger("Maintenance-Service-2.0") + +class MaintenanceService: + """ + Sentinel Master Maintenance Service 2.0. + Felelős a rendszer tisztításáért és a prediktív karbantartási riasztásokért. + """ + + @staticmethod + async def cleanup_old_files(db: AsyncSession): + """ + Admin-vezérelt NAS takarítás. + A megőrzési időt (napokban) az adatbázisból veszi. + """ + try: + storage_path = await config.get_setting(db, "storage_nas_path", default="/mnt/nas/app_data") + retention_days = await config.get_setting(db, "storage_retention_days", default=365) + + limit = datetime.now() - timedelta(days=int(retention_days)) + deleted_count = 0 + + if not os.path.exists(storage_path): + logger.warning(f"A tárolási útvonal nem található: {storage_path}") + return 0 + + for root, dirs, files in os.walk(storage_path): + for file in files: + file_path = os.path.join(root, file) + file_time = datetime.fromtimestamp(os.path.getmtime(file_path)) + + if file_time < limit: + os.remove(file_path) + deleted_count += 1 + + logger.info(f"🗑️ NAS takarítás kész. Törölve: {deleted_count} lejárt fájl.") + return deleted_count + except Exception as e: + logger.error(f"Hiba a takarítás során: {e}") + return 0 + + @staticmethod + async def check_maintenance_intervals(db: AsyncSession): + """ + Prediktív karbantartás: Összeveti a Robot 3 gyári adatait a valós futásteljesítménnyel. + Ha egy autó közeledik az olajcseréhez (pl. 1000 km-en belül), riasztást generál. + """ + try: + # Admin beállítás: hány km-rel a szerviz előtt szóljunk? + km_threshold = await config.get_setting(db, "maint_km_alert_threshold", default=1000) + + # Lekérjük az összes autót a telemetriával együtt + stmt = select(Asset, AssetTelemetry).join(AssetTelemetry).where(Asset.status == "active") + result = await db.execute(stmt) + + alerts_generated = 0 + for asset, telemetry in result.all(): + # A Robot 3 által feltöltött gyári adat (pl. 15.000 km) + interval = asset.factory_data.get("oil_change_km") if asset.factory_data else None + last_service_km = asset.factory_data.get("last_service_km", 0) + + if interval and telemetry.current_mileage: + next_service_due = last_service_km + interval + remaining_km = next_service_due - telemetry.current_mileage + + if 0 <= remaining_km <= int(km_threshold): + # Értesítés küldése a Notification Centerbe és Emailben + await NotificationService.send_direct_notification( + db, + user_id=asset.owner_id, + message_key="maintenance_due", + variables={ + "vehicle": f"{asset.license_plate}", + "type": "Olajcsere", + "remaining": remaining_km + } + ) + alerts_generated += 1 + + return alerts_generated + except Exception as e: + logger.error(f"Karbantartás ellenőrzési hiba: {e}") + return 0 + + @staticmethod + async def delete_validated_evidence(db: AsyncSession, document_id: str): + """ + Validáció utáni képkezelés. + Az adminban állítható, hogy töröljük-e a bizonyítékot a hitelesítés után. + """ + should_delete = await config.get_setting(db, "storage_delete_after_validation", default=False) + + if should_delete: + # Itt a Document modell alapján megkeressük a fájlt és töröljük + # (A biztonság kedvéért naplózzuk a Sentinelbe) + pass \ No newline at end of file diff --git a/backend/app/services/matching_service.py b/backend/app/services/matching_service.py new file mode 100755 index 0000000..9209c86 --- /dev/null +++ b/backend/app/services/matching_service.py @@ -0,0 +1,35 @@ +# /opt/docker/dev/service_finder/backend/app/services/matching_service.py +from typing import List, Dict, Any +from app.services.config_service import config + +class MatchingService: + @staticmethod + async def rank_services(services: List[Dict[str, Any]], org_id: int = None) -> List[Dict[str, Any]]: + """ Szolgáltatók rangsorolása dinamikus Sentinel paraméterek alapján. """ + + # JAVÍTVA: Hierarchikus paraméterek lekérése + w_dist = float(await config.get_setting('weight_distance', org_id=org_id, default=0.5)) + w_rate = float(await config.get_setting('weight_rating', org_id=org_id, default=0.5)) + b_gold = float(await config.get_setting('bonus_gold_service', org_id=org_id, default=500)) + + ranked_list = [] + for s in services: + # Távolság pont (közelebb = több pont) + dist = s.get('distance', 1.0) + p_dist = 100 / (dist + 1) + + # Értékelés pont (0-5 csillag -> 0-100 pont) + p_rate = s.get('rating', 0.0) * 20 + + # Bónusz a kiemelt (Gold) partnereknek + tier_bonus = b_gold if s.get('tier') == 'gold' else 0 + + # Összesített pontszám + total_score = (p_dist * w_dist) + (p_rate * w_rate) + tier_bonus + + s['total_score'] = round(total_score, 2) + ranked_list.append(s) + + return sorted(ranked_list, key=lambda x: x['total_score'], reverse=True) + +matching_service = MatchingService() \ No newline at end of file diff --git a/backend/app/services/media_service.py b/backend/app/services/media_service.py new file mode 100755 index 0000000..319f186 --- /dev/null +++ b/backend/app/services/media_service.py @@ -0,0 +1,45 @@ +# /opt/docker/dev/service_finder/backend/app/services/media_service.py +from PIL import Image +from PIL.ExifTags import TAGS, GPSTAGS +import logging +from typing import Tuple, Optional + +logger = logging.getLogger(__name__) + +class MediaService: + @staticmethod + def _convert_to_degrees(value) -> float: + """ EXIF racionális koordináták konvertálása tizedes fokká. """ + try: + d = float(value[0]) + m = float(value[1]) + s = float(value[2]) + return d + (m / 60.0) + (s / 3600.0) + except (IndexError, ZeroDivisionError, TypeError): + return 0.0 + + @classmethod + def extract_gps_info(cls, file_path: str) -> Optional[Tuple[float, float]]: + """ GPS koordináták kinyerése a kép metaadataiból (Robot Hunt alapja). """ + try: + with Image.open(file_path) as image: + exif = image._getexif() + if not exif: return None + + gps_info = {} + for tag, value in exif.items(): + if TAGS.get(tag) == "GPSInfo": + for t in value: + gps_info[GPSTAGS.get(t, t)] = value[t] + + if 'GPSLatitude' in gps_info and 'GPSLongitude' in gps_info: + lat = cls._convert_to_degrees(gps_info['GPSLatitude']) + if gps_info.get('GPSLatitudeRef') != "N": lat = -lat + + lon = cls._convert_to_degrees(gps_info['GPSLongitude']) + if gps_info.get('GPSLongitudeRef') != "E": lon = -lon + + return lat, lon + except Exception as e: + logger.warning(f"EXIF kiolvasási hiba ({file_path}): {e}") + return None \ No newline at end of file diff --git a/backend/app/services/notification_service.py b/backend/app/services/notification_service.py new file mode 100755 index 0000000..78c645a --- /dev/null +++ b/backend/app/services/notification_service.py @@ -0,0 +1,150 @@ +# /opt/docker/dev/service_finder/backend/app/services/notification_service.py +import logging +import uuid +from datetime import datetime, timedelta, timezone +from typing import Optional, List, Dict, Any + +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select +from sqlalchemy.orm import joinedload + +from app.models.identity import User +from app.models.asset import Asset +from app.models.organization import Organization +from app.models.system import InternalNotification +from app.services.email_manager import email_manager +from app.services.config_service import config + +logger = logging.getLogger("Notification-Service-2.2") + +class NotificationService: + """ + Sentinel Master Notification Service 2.2 - Fully Admin-Configurable. + Nincs fix kód: minden típus (biztosítás, műszaki, okmány) a DB-ből vezérelt. + """ + + @staticmethod + async def send_notification( + db: AsyncSession, + user_id: int, + title: str, + message: str, + category: str = "info", + priority: str = "medium", + data: dict = None, + send_email: bool = True, + email_template: str = None, + email_vars: dict = None + ): + """ Univerzális küldő: Belső Dashboard + Email. """ + new_notif = InternalNotification( + user_id=user_id, + title=title, + message=message, + category=category, + priority=priority, + data=data or {} + ) + db.add(new_notif) + + if send_email and email_template and email_vars: + await email_manager.send_email( + db=db, + recipient=email_vars.get("recipient"), + template_key=email_template, + variables=email_vars, + lang=email_vars.get("lang", "hu") + ) + await db.commit() + + @staticmethod + async def check_expiring_documents(db: AsyncSession): + """ + Dinamikus lejárat-figyelő: Típusonkénti naptárak az adminból. + """ + try: + today = datetime.now(timezone.utc).date() + + # 1. Lekérjük az összes aktív járművet és a tulajdonosaikat + stmt = ( + select(Asset, User) + .join(Organization, Asset.current_organization_id == Organization.id) + .join(User, Organization.owner_id == User.id) + .where(Asset.status == "active") + .options(joinedload(Asset.catalog)) + ) + result = await db.execute(stmt) + notifications_sent = 0 + + for asset, user in result.all(): + # 2. DINAMIKUS MÁTRIX LEKÉRÉSE (Hierarchikus: User > Region > Global) + # Az adminban így van tárolva: {"insurance": [45, 30, 7, 0], "mot": [30, 7, 0], ...} + alert_matrix = await config.get_setting( + db, + "NOTIFICATION_TYPE_MATRIX", + scope_level="user", + scope_id=str(user.id), + default={ + "insurance": [45, 30, 15, 7, 1, 0], + "mot": [30, 7, 1, 0], + "personal_id": [30, 15, 0], + "default": [30, 7, 1] + } + ) + + # 3. Ellenőrizendő dátumok (factory_data a Robotoktól) + # Kulcsok: insurance_expiry_date, mot_expiry_date, id_card_expiry stb. + check_map = { + "insurance": asset.factory_data.get("insurance_expiry_date"), + "mot": asset.factory_data.get("mot_expiry_date"), + "personal_id": user.person.identity_docs.get("expiry_date") if user.person else None + } + + for doc_type, expiry_str in check_map.items(): + if not expiry_str: continue + + try: + expiry_dt = datetime.strptime(expiry_str, "%Y-%m-%d").date() + days_until = (expiry_dt - today).days + + # Megnézzük a típushoz tartozó admin-beállítást (pl. a 45 napot) + alert_steps = alert_matrix.get(doc_type, alert_matrix["default"]) + + if days_until in alert_steps: + # Prioritás meghatározása (Adminból is jöhetne, de itt kategória alapú) + priority = "critical" if days_until <= 1 or (doc_type == "insurance" and days_until == 45) else "high" + + title = f"Riasztás: {asset.license_plate} - {doc_type.upper()}" + msg = f"A(z) {doc_type} dokumentum {days_until} nap múlva lejár ({expiry_str})." + + if days_until == 45 and doc_type == "insurance": + msg = f"🚨 BIZTOSÍTÁSI FORDULÓ! (45 nap). Most van időd felmondani a régit!" + + await NotificationService.send_notification( + db=db, + user_id=user.id, + title=title, + message=msg, + category=doc_type, + priority=priority, + data={"asset_id": str(asset.id), "vin": asset.vin, "days": days_until}, + email_template="expiry_alert", + email_vars={ + "recipient": user.email, + "first_name": user.person.first_name if user.person else "Partnerünk", + "license_plate": asset.license_plate, + "expiry_date": expiry_str, + "days_left": days_until, + "lang": user.preferred_language + } + ) + notifications_sent += 1 + + except (ValueError, TypeError): + continue + + return {"status": "success", "count": notifications_sent} + + except Exception as e: + logger.error(f"Notification System Error: {e}") + raise e \ No newline at end of file diff --git a/backend/app/services/recon_bot.py b/backend/app/services/recon_bot.py new file mode 100755 index 0000000..c9f5db2 --- /dev/null +++ b/backend/app/services/recon_bot.py @@ -0,0 +1,49 @@ +# /opt/docker/dev/service_finder/backend/app/services/recon_bot.py +import asyncio +import logging +from datetime import datetime, timezone +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select +from app.models.asset import Asset, AssetCatalog, AssetTelemetry + +logger = logging.getLogger(__name__) + +async def run_vehicle_recon(db: AsyncSession, asset_id: str): + """ + VIN alapján megkeresi a mélységi adatokat és frissíti a Digitális Ikert. + """ + stmt = select(Asset).where(Asset.id == asset_id) + asset = (await db.execute(stmt)).scalar_one_or_none() + + if not asset or not asset.catalog_id: + return False + + logger.info(f"🤖 Robot indul: {asset.vin} felderítése...") + + # --- LOGIKA MEGŐRIZVE: Szimulált mélységi adatgyűjtés --- + await asyncio.sleep(2) + + deep_data = { + "assembly_plant": "Fremont, California", + "drive_unit": "Dual Motor - Raven type", + "onboard_charger": "11 kW", + "supercharging_max": "250 kW", + "safety_rating": "5-star EuroNCAP", + "recon_timestamp": datetime.now(timezone.utc).isoformat() + } + + # 3. Katalógus frissítése (MDM elv) + catalog = (await db.execute(select(AssetCatalog).where(AssetCatalog.id == asset.catalog_id))).scalar_one_or_none() + if catalog: + current_data = catalog.factory_data or {} + current_data.update(deep_data) + catalog.factory_data = current_data + + # 4. Telemetria frissítése (VQI score csökkentése a logika szerint) + telemetry = (await db.execute(select(AssetTelemetry).where(AssetTelemetry.asset_id == asset.id))).scalar_one_or_none() + if telemetry: + telemetry.vqi_score = 99.2 + + await db.commit() + logger.info(f"✨ Robot végzett: {asset.license_plate or asset.vin} felokosítva.") + return True \ No newline at end of file diff --git a/backend/app/services/robot_manager.py b/backend/app/services/robot_manager.py new file mode 100755 index 0000000..75058fb --- /dev/null +++ b/backend/app/services/robot_manager.py @@ -0,0 +1,40 @@ +# /opt/docker/dev/service_finder/backend/app/services/robot_manager.py +import asyncio +import logging +from datetime import datetime +from .harvester_cars import VehicleHarvester +# Megjegyzés: Csak azokat importáld, amik öröklődnek a BaseHarvester-ből + +logger = logging.getLogger(__name__) + +class RobotManager: + @staticmethod + async def run_full_sync(db): + """ Sorban lefuttatja a robotokat az új AssetCatalog struktúrához. """ + logger.info(f"🕒 Teljes szinkronizáció indítva: {datetime.now()}") + + robots = [ + VehicleHarvester(), + # BikeHarvester(), # Későbbi bővítéshez + ] + + for robot in robots: + try: + # JAVÍTVA: A modern Harvesterek a harvest_all metódust használják + await robot.harvest_all(db) + logger.info(f"✅ {robot.category} robot sikeresen lefutott.") + await asyncio.sleep(5) + except Exception as e: + logger.error(f"❌ Kritikus hiba a {robot.category} robotnál: {e}") + + @staticmethod + async def schedule_nightly_run(db): + """ + LOGIKA MEGŐRIZVE: Éjszakai futtatás 02:00-kor. + """ + while True: + now = datetime.now() + if now.hour == 2 and now.minute == 0: + await RobotManager.run_full_sync(db) + await asyncio.sleep(70) # Megakadályozzuk az újraindulást ugyanabban a percben + await asyncio.sleep(30) \ No newline at end of file diff --git a/backend/app/services/search_service.py b/backend/app/services/search_service.py new file mode 100755 index 0000000..b9a5dae --- /dev/null +++ b/backend/app/services/search_service.py @@ -0,0 +1,141 @@ +# /opt/docker/dev/service_finder/backend/app/services/search_service.py +import logging +from typing import List, Optional, Dict, Any +from uuid import UUID + +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, func, and_ +from geoalchemy2.functions import ST_Distance, ST_MakePoint, ST_DWithin + +from app.models.service import ServiceProfile, ExpertiseTag +from app.models.organization import Organization +from app.models.identity import User +from app.services.config_service import config + +logger = logging.getLogger("Search-Service-2.4-Agnostic") + +class SearchService: + """ + Sentinel Master Search Service 2.4. + Csomag-agnosztikus rangsoroló motor. + Minden üzleti logika (súlyozás, prioritás, láthatóság) az adatbázisból jön. + """ + + @staticmethod + async def find_nearby_services( + db: AsyncSession, + lat: float, + lon: float, + current_user: User, + expertise_key: str = None + ): + try: + # 1. HIERARCHIKUS RANGSOROLÁSI SZABÁLYOK LEKÉRÉSE + # A config_service automatikusan a legspecifikusabbat adja vissza: + # 1. User-specifikus (Céges egyedi beállítás) + # 2. Package-specifikus (pl. 'free', 'premium', 'ultra_gold') + # 3. Global (Alapértelmezett) + + user_tier = current_user.tier_name + + if current_user.role in [UserRole.superadmin, UserRole.admin]: + user_tier = "vip" + + ranking_rules = await config.get_setting( + db, + "RANKING_RULES", + user_id=current_user.id, # Ez a belső config_service-ben kezeli a hierarchiát + package_slug=user_tier, + default={ + "ad_weight": 5000, + "partner_weight": 1000, + "trust_weight": 10, + "dist_penalty": 20, + "pref_weight": 0, + "can_use_prefs": False, + "search_radius_km": 30 + } + ) + + # 2. PREFERENCIÁK (Ha a szabályrendszer engedi) + user_prefs = {"networks": [], "ids": []} + if ranking_rules.get("can_use_prefs", False): + user_prefs = await config.get_setting( + db, "USER_SEARCH_PREFERENCES", + scope_level="user", scope_id=str(current_user.id), + default={"networks": [], "ids": []} + ) + + # 3. TÉRBELI LEKÉRDEZÉS + user_point = ST_MakePoint(lon, lat) + radius_m = ranking_rules.get("search_radius_km", 30) * 1000 + + distance_col = ST_Distance(ServiceProfile.location, user_point).label("distance_meters") + + stmt = ( + select(ServiceProfile, Organization, distance_col) + .join(Organization, ServiceProfile.organization_id == Organization.id) + .where( + and_( + ST_DWithin(ServiceProfile.location, user_point, radius_m), + ServiceProfile.is_active == True + ) + ) + ) + + if expertise_key: + stmt = stmt.join(ServiceProfile.expertises).join(ExpertiseTag).where(ExpertiseTag.key == expertise_key) + + result = await db.execute(stmt) + rows = result.all() + + # 4. UNIVERZÁLIS PONTOZÁS (Súlyozott mátrix alapján) + final_results = [] + r = ranking_rules # Rövidítés a számításhoz + + for s_prof, org, dist_m in rows: + dist_km = dist_m / 1000.0 + score = 0 + + # --- PONTOZÁSI LOGIKA (Nincsenek fix csomagnevek!) --- + + # A. Hirdetési súly + if s_prof.is_advertiser: + score += r.get("ad_weight", 0) + + # B. Partner (Minősített) súly + if s_prof.is_verified_partner: + score += r.get("partner_weight", 0) + + # C. Minőség (Trust Score) súly + score += (s_prof.trust_score * r.get("trust_weight", 0)) + + # D. Egyéni/Céges preferencia súly (Csak ha engedélyezett) + if r.get("can_use_prefs"): + if s_prof.network_slug in user_prefs.get("networks", []): + score += r.get("pref_weight", 0) + if str(org.id) in user_prefs.get("ids", []): + score += r.get("pref_weight", 0) * 1.2 + + # E. Távolság büntetés + score -= (dist_km * r.get("dist_penalty", 0)) + + final_results.append({ + "id": org.id, + "name": org.full_name, + "trust_score": s_prof.trust_score, + "distance_km": round(dist_km, 2), + "rank_score": round(score, 2), + "flags": { + "is_ad": s_prof.is_advertiser, + "is_partner": s_prof.is_verified_partner, + "is_favorite": str(org.id) in user_prefs.get("ids", []) + } + }) + + # 5. RENDEZÉS + return sorted(final_results, key=lambda x: x['rank_score'], reverse=True) + + except Exception as e: + logger.error(f"Search Service 2.4 Critical Error: {e}") + raise e \ No newline at end of file diff --git a/backend/app/services/security_service.py b/backend/app/services/security_service.py new file mode 100755 index 0000000..41efcc4 --- /dev/null +++ b/backend/app/services/security_service.py @@ -0,0 +1,94 @@ +# /opt/docker/dev/service_finder/backend/app/services/security_service.py +import logging +from datetime import datetime, timedelta, timezone +from typing import Optional, Any, Dict +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, func, and_ +from app.models.security import PendingAction, ActionStatus +from app.models.history import AuditLog, LogSeverity +from app.models.identity import User +from app.models.system import SystemParameter + +logger = logging.getLogger(__name__) + +class SecurityService: + @staticmethod + async def get_sec_config(db: AsyncSession) -> Dict[str, Any]: + """ Lekéri a korlátokat a központi system_parameters-ből. """ + stmt = select(SystemParameter).where(SystemParameter.key.in_(["SECURITY_MAX_RECORDS_PER_HOUR", "SECURITY_DUAL_CONTROL_ENABLED"])) + res = await db.execute(stmt) + params = {p.key: p.value for p in res.scalars().all()} + + return { + "max_records": int(params.get("SECURITY_MAX_RECORDS_PER_HOUR", 500)), + "dual_control": str(params.get("SECURITY_DUAL_CONTROL_ENABLED", "true")).lower() == "true" + } + + async def log_event(self, db: AsyncSession, user_id: Optional[int], action: str, severity: LogSeverity, **kwargs): + """ LOGIKA MEGŐRIZVE: Audit naplózás + Emergency Lock trigger. """ + new_log = AuditLog( + user_id=user_id, severity=severity, action=action, + target_type=kwargs.get("target_type"), target_id=kwargs.get("target_id"), + old_data=kwargs.get("old_data"), new_data=kwargs.get("new_data"), + ip_address=kwargs.get("ip"), user_agent=kwargs.get("ua") + ) + db.add(new_log) + + if severity == LogSeverity.emergency: + await self._execute_emergency_lock(db, user_id, f"Auto-lock by: {action}") + + await db.commit() + + async def request_action(self, db: AsyncSession, requester_id: int, action_type: str, payload: Dict, reason: str): + """ NÉGY SZEM ELV: Jóváhagyási kérelem indítása. """ + new_action = PendingAction( + requester_id=requester_id, action_type=action_type, + payload=payload, reason=reason, status=ActionStatus.pending + ) + db.add(new_action) + await db.commit() + return new_action + + async def approve_action(self, db: AsyncSession, approver_id: int, action_id: int): + """ Jóváhagyás végrehajtása (Logic Preserved: Ön-jóváhagyás tiltva). """ + stmt = select(PendingAction).where(PendingAction.id == action_id) + action = (await db.execute(stmt)).scalar_one_or_none() + + if not action or action.status != ActionStatus.pending: + raise Exception("Művelet nem található.") + if action.requester_id == approver_id: + raise Exception("Saját kérést nem hagyhatsz jóvá!") + + # Üzleti logika (pl. Role változtatás) + if action.action_type == "CHANGE_ROLE": + target_user = (await db.execute(select(User).where(User.id == action.payload.get("user_id")))).scalar_one_or_none() + if target_user: target_user.role = action.payload.get("new_role") + + action.status = ActionStatus.approved + action.approver_id = approver_id + action.processed_at = datetime.now(timezone.utc) + await db.commit() + + async def check_data_access_limit(self, db: AsyncSession, user_id: int): + """ DATA THROTTLING: Adatlopás elleni védelem. """ + config = await self.get_sec_config(db) + limit_time = datetime.now(timezone.utc) - timedelta(hours=1) + + stmt = select(func.count(AuditLog.id)).where( + and_(AuditLog.user_id == user_id, AuditLog.timestamp >= limit_time, AuditLog.action.like("GET_%")) + ) + count = (await db.execute(stmt)).scalar() or 0 + + if count > config["max_records"]: + await self.log_event(db, user_id, "MASS_DATA_ACCESS", LogSeverity.emergency, reason=f"Count: {count}") + return False + return True + + async def _execute_emergency_lock(self, db: AsyncSession, user_id: int, reason: str): + if not user_id: return + user = (await db.execute(select(User).where(User.id == user_id))).scalar_one_or_none() + if user: + user.is_active = False + logger.critical(f"🚨 EMERGENCY LOCK: User {user_id} suspended. Reason: {reason}") + +security_service = SecurityService() \ No newline at end of file diff --git a/backend/app/services/social_auth_service.py b/backend/app/services/social_auth_service.py new file mode 100755 index 0000000..535f2c3 --- /dev/null +++ b/backend/app/services/social_auth_service.py @@ -0,0 +1,43 @@ +# /opt/docker/dev/service_finder/backend/app/services/social_auth_service.py +import uuid +import logging +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select +from app.models.identity import User, Person, SocialAccount, UserRole +from app.services.security_service import security_service + +logger = logging.getLogger(__name__) + +class SocialAuthService: + @staticmethod + async def get_or_create_social_user(db: AsyncSession, provider: str, social_id: str, email: str, first_name: str, last_name: str): + """ + LOGIKA MEGŐRIZVE: Step 1 regisztráció slug és flotta nélkül. + """ + # 1. Meglévő fiók ellenőrzése + stmt = select(SocialAccount).where(SocialAccount.provider == provider, SocialAccount.social_id == social_id) + social_acc = (await db.execute(stmt)).scalar_one_or_none() + + if social_acc: + return (await db.execute(select(User).where(User.id == social_acc.user_id))).scalar_one_or_none() + + # 2. Új Identity és User (Step 1) + stmt_u = select(User).where(User.email == email) + user = (await db.execute(stmt_u)).scalar_one_or_none() + + if not user: + new_person = Person(first_name=first_name or "Social", last_name=last_name or "User", is_active=False) + db.add(new_person) + await db.flush() + + user = User(email=email, person_id=new_person.id, role=UserRole.user, is_active=False) + db.add(user) + await db.flush() + + await security_service.log_event(db, user.id, "USER_REGISTER_SOCIAL", "info", target_type="User", target_id=str(user.id)) + + # 3. Kapcsolat rögzítése + db.add(SocialAccount(user_id=user.id, provider=provider, social_id=social_id, email=email)) + await db.commit() + await db.refresh(user) + return user \ No newline at end of file diff --git a/backend/app/services/social_service.py b/backend/app/services/social_service.py new file mode 100755 index 0000000..fd4937c --- /dev/null +++ b/backend/app/services/social_service.py @@ -0,0 +1,103 @@ +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, and_ +from datetime import datetime, timezone +import logging + +from app.models.social import ServiceProvider, Vote, ModerationStatus, Competition, UserScore +from app.models.identity import User +from app.schemas.social import ServiceProviderCreate + +logger = logging.getLogger(__name__) + +class SocialService: + """ + SocialService: Kezeli a közösségi interakciókat, szavazatokat és a moderációt. + Az importok a metódusokon belül vannak a körkörös függőség elkerülése érdekében. + """ + + async def create_service_provider(self, db: AsyncSession, obj_in: ServiceProviderCreate, user_id: int): + from app.services.gamification_service import gamification_service + + new_provider = ServiceProvider(**obj_in.model_dump(), added_by_user_id=user_id) + db.add(new_provider) + await db.flush() + + # Alappontszám az új beküldésért + await gamification_service.process_activity(db, user_id, 50, 10, f"New Provider: {new_provider.name}") + await db.commit() + await db.refresh(new_provider) + return new_provider + + async def vote_for_provider(self, db: AsyncSession, voter_id: int, provider_id: int, vote_value: int): + from app.services.gamification_service import gamification_service + + # Duplikált szavazat ellenőrzése + exists = (await db.execute(select(Vote).where(and_(Vote.user_id == voter_id, Vote.provider_id == provider_id)))).scalar() + if exists: + return {"message": "Már szavaztál erre a szolgáltatóra!"} + + db.add(Vote(user_id=voter_id, provider_id=provider_id, vote_value=vote_value)) + + provider = (await db.execute(select(ServiceProvider).where(ServiceProvider.id == provider_id))).scalar_one_or_none() + if not provider: + return {"error": "Szolgáltató nem található."} + + provider.validation_score += vote_value + + # Automatikus moderáció figyelése (csak a 'pending' állapotúaknál) + if provider.status == ModerationStatus.pending: + if provider.validation_score >= 5: + provider.status = ModerationStatus.approved + await self._reward_submitter(db, provider.added_by_user_id, provider.name) + elif provider.validation_score <= -3: + provider.status = ModerationStatus.rejected + await self._penalize_user(db, provider.added_by_user_id, provider.name) + + await db.commit() + return {"status": "success", "score": provider.validation_score, "new_status": provider.status} + + async def get_leaderboard(self, db: AsyncSession, limit: int = 10): + from app.services.gamification_service import gamification_service + if hasattr(gamification_service, 'get_top_users'): + return await gamification_service.get_top_users(db, limit) + return [] + + async def _reward_submitter(self, db: AsyncSession, user_id: int, provider_name: str): + """ Jutalmazás, ha a beküldött adatot jóváhagyta a közösség. """ + from app.services.gamification_service import gamification_service + if not user_id: return + + await gamification_service.process_activity(db, user_id, 100, 20, f"Validated: {provider_name}") + + # Aktuális verseny keresése és pontozása + now = datetime.now(timezone.utc) + comp_stmt = select(Competition).where(and_( + Competition.is_active == True, + Competition.start_date <= now, + Competition.end_date >= now + )) + comp = (await db.execute(comp_stmt)).scalar_one_or_none() + + if comp: + us_stmt = select(UserScore).where(and_(UserScore.user_id == user_id, UserScore.competition_id == comp.id)) + us = (await db.execute(us_stmt)).scalar_one_or_none() + if not us: + us = UserScore(user_id=user_id, competition_id=comp.id, points=0) + db.add(us) + us.points += 10 + + async def _penalize_user(self, db: AsyncSession, user_id: int, provider_name: str): + """ Büntetés, ha a beküldött adatot elutasította a közösség (is_penalty=True). """ + from app.services.gamification_service import gamification_service + if not user_id: return + + # JAVÍTVA: is_penalty=True hozzáadva a gamification híváshoz + await gamification_service.process_activity(db, user_id, 50, 0, f"Rejected: {provider_name}", is_penalty=True) + + user = (await db.execute(select(User).where(User.id == user_id))).scalar_one_or_none() + if user and hasattr(user, 'reputation_score'): + user.reputation_score = (user.reputation_score or 0) - 2 + if user.reputation_score <= -10: + user.is_active = False + +social_service = SocialService() \ No newline at end of file diff --git a/backend/app/services/storage_service.py b/backend/app/services/storage_service.py new file mode 100755 index 0000000..b9ba51b --- /dev/null +++ b/backend/app/services/storage_service.py @@ -0,0 +1,31 @@ +# /opt/docker/dev/service_finder/backend/app/services/storage_service.py +import uuid +from io import BytesIO +from minio import Minio +from app.core.config import settings + +class StorageService: + # A klienst a beállításokból inicializáljuk + client = Minio( + settings.REDIS_URL.split("//")[1].split(":")[0], # Gyors fix a hostra vagy settings.MINIO_HOST + access_key="minioadmin", + secret_key="minioadmin", + secure=False + ) + BUCKET_NAME = "vehicle-documents" + + @classmethod + async def upload_document(cls, file_bytes: bytes, file_name: str, folder: str) -> str: + """ Fájl feltöltése S3/Minio tárhelyre. """ + if not cls.client.bucket_exists(cls.BUCKET_NAME): + cls.client.make_bucket(cls.BUCKET_NAME) + + unique_name = f"{folder}/{uuid.uuid4()}_{file_name}" + + cls.client.put_object( + cls.BUCKET_NAME, + unique_name, + BytesIO(file_bytes), + len(file_bytes) + ) + return f"{cls.BUCKET_NAME}/{unique_name}" \ No newline at end of file diff --git a/backend/app/services/translation.py b/backend/app/services/translation.py new file mode 100755 index 0000000..d3875e7 --- /dev/null +++ b/backend/app/services/translation.py @@ -0,0 +1,28 @@ +# /opt/docker/dev/service_finder/backend/app/models/translation.py +from sqlalchemy import String, Text, Boolean, UniqueConstraint +from sqlalchemy.orm import Mapped, mapped_column +from app.db.base_class import Base + +class Translation(Base): + """ + Központi i18n adattábla. + Minden rendszerüzenet és frontend felirat forrása. + """ + __tablename__ = "translations" + __table_args__ = ( + UniqueConstraint("key", "lang_code", name="uq_translation_key_lang"), + ) + + id: Mapped[int] = mapped_column(primary_key=True, index=True) + + # A kulcs pontozott formátumú (pl: 'DASHBOARD.STATS.TITLE') + key: Mapped[str] = mapped_column(String(150), nullable=False, index=True) + + # ISO kód (pl: 'hu', 'en', 'de') + lang_code: Mapped[str] = mapped_column(String(5), nullable=False, index=True) + + # A tényleges lefordított szöveg + value: Mapped[str] = mapped_column(Text, nullable=False) + + # Élesítési állapot (Draft/Published) + is_published: Mapped[bool] = mapped_column(Boolean, default=False, index=True) \ No newline at end of file diff --git a/backend/app/services/translation_service.py b/backend/app/services/translation_service.py new file mode 100755 index 0000000..b4a370f --- /dev/null +++ b/backend/app/services/translation_service.py @@ -0,0 +1,114 @@ +# /opt/docker/dev/service_finder/backend/app/services/translation_service.py +import json +import os +import logging +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, update +from app.models.translation import Translation +from app.core.config import settings +from typing import Dict, Any, Optional + +logger = logging.getLogger(__name__) + +class TranslationService: + """ + Dinamikus fordítás-kezelő szerviz. + Támogatja a szerveroldali cache-elést és a frontend JSON exportot. + """ + # Memória-cache a szerveroldali hibaüzenetekhez és emailekhez + _published_cache: Dict[str, Dict[str, str]] = {} + + @classmethod + async def load_cache(cls, db: AsyncSession): + """ Betölti a publikált szövegeket a memóriába az adatbázisból. """ + stmt = select(Translation).where(Translation.is_published == True) + result = await db.execute(stmt) + translations = result.scalars().all() + + cls._published_cache = {} + for t in translations: + # JAVÍTVA: t.lang_code helyett t.lang + if t.lang not in cls._published_cache: + cls._published_cache[t.lang] = {} + cls._published_cache[t.lang][t.key] = t.value + + logger.info(f"🌍 i18n Motor: {len(translations)} szöveg aktiválva a memóriában.") + + @classmethod + def get_text(cls, key: str, lang: str = "hu", variables: Optional[Dict[str, Any]] = None) -> str: + """ + Szerveroldali lekérés Fallback (EN) logikával és változó behelyettesítéssel. + Példa: get_text("AUTH.WELCOME", "hu", {"name": "Péter"}) + """ + # 1. Kért nyelv lekérése + text = cls._published_cache.get(lang, {}).get(key) + + # 2. Fallback angolra, ha nincs meg a kért nyelven + if not text and lang != "en": + text = cls._published_cache.get("en", {}).get(key) + + # 3. Ha sehol nincs meg, adjuk vissza a kulcsot + if not text: + return f"[{key}]" + + # 4. Változók behelyettesítése (pl. {{name}}) + if variables: + for k, v in variables.items(): + text = text.replace(f"{{{{{k}}}}}", str(v)) + + return text + + @classmethod + async def publish_all(cls, db: AsyncSession): + """ Minden piszkozatot élesít, frissíti a memóriát és legenerálja a JSON-öket. """ + await db.execute( + update(Translation).where(Translation.is_published == False).values(is_published=True) + ) + await db.commit() + await cls.load_cache(db) + await cls.export_to_json(db) + return True + + @staticmethod + async def export_to_json(db: AsyncSession): + """ + Adatbázis -> Hierarchikus JSON struktúra generálása a Frontend számára. + 'AUTH.LOGIN.TITLE' -> { "AUTH": { "LOGIN": { "TITLE": "..." } } } + """ + stmt = select(Translation).where(Translation.is_published == True) + result = await db.execute(stmt) + translations = result.scalars().all() + + languages: Dict[str, Any] = {} + for t in translations: + # JAVÍTVA: t.lang_code helyett t.lang + if t.lang not in languages: + languages[t.lang] = {} + + # Kulcs felbontása szintekre hierarchikus struktúrához + parts = t.key.split('.') + current_level = languages[t.lang] + + for part in parts[:-1]: + if part not in current_level: + current_level[part] = {} + current_level = current_level[part] + + current_level[parts[-1]] = t.value + + # Fájlok fizikai mentése a static könyvtárba + locales_path = os.path.join(settings.STATIC_DIR, "locales") + os.makedirs(locales_path, exist_ok=True) + + for lang, content in languages.items(): + file_path = os.path.join(locales_path, f"{lang}.json") + try: + with open(file_path, "w", encoding="utf-8") as f: + json.dump(content, f, ensure_ascii=False, indent=2) + logger.info(f"✅ Nyelvi fájl (JSON) frissítve: {file_path}") + except Exception as e: + logger.error(f"❌ Hiba a fájl mentésekor ({lang}): {e}") + + return True + +translation_service = TranslationService() \ No newline at end of file diff --git a/backend/app/static/dashboard.html b/backend/app/static/dashboard.html new file mode 100755 index 0000000..94b9b18 --- /dev/null +++ b/backend/app/static/dashboard.html @@ -0,0 +1,59 @@ + + + + Service Finder - Dashboard + + + + +
+
+

GARÁZS

+ +
+
+
+
+ + + + diff --git a/backend/app/static/login.html b/backend/app/static/login.html new file mode 100755 index 0000000..2582db1 --- /dev/null +++ b/backend/app/static/login.html @@ -0,0 +1,53 @@ + + + + Service Finder - Belépés + + + + + + + + + \ No newline at end of file diff --git a/backend/app/static/register.html b/backend/app/static/register.html new file mode 100755 index 0000000..5efb1a1 --- /dev/null +++ b/backend/app/static/register.html @@ -0,0 +1,38 @@ + + + + Service Finder - Regisztráció + + + + +
+

REGISZTRÁCIÓ

+
+ + + + +
+ +

+
+ + + \ No newline at end of file diff --git a/backend/app/templates/emails/en/notification.html b/backend/app/templates/emails/en/notification.html new file mode 100755 index 0000000..e69de29 diff --git a/backend/app/templates/emails/en/password_reset.html b/backend/app/templates/emails/en/password_reset.html new file mode 100755 index 0000000..945c9b4 --- /dev/null +++ b/backend/app/templates/emails/en/password_reset.html @@ -0,0 +1 @@ +. \ No newline at end of file diff --git a/backend/app/templates/emails/en/registration.html b/backend/app/templates/emails/en/registration.html new file mode 100755 index 0000000..945c9b4 --- /dev/null +++ b/backend/app/templates/emails/en/registration.html @@ -0,0 +1 @@ +. \ No newline at end of file diff --git a/backend/app/templates/emails/hu/notification.html b/backend/app/templates/emails/hu/notification.html new file mode 100755 index 0000000..e69de29 diff --git a/backend/app/templates/emails/hu/password_reset.html b/backend/app/templates/emails/hu/password_reset.html new file mode 100755 index 0000000..ec7f640 --- /dev/null +++ b/backend/app/templates/emails/hu/password_reset.html @@ -0,0 +1,10 @@ + + + +

Jelszó visszaállítás

+

Szia {{ first_name }},

+

Kérted a jelszavad visszaállítását. Kattints az alábbi linkre az új jelszó megadásához:

+

Jelszó visszaállítása

+

A link 2 óráig érvényes.

+ + \ No newline at end of file diff --git a/backend/app/templates/emails/hu/registration.html b/backend/app/templates/emails/hu/registration.html new file mode 100755 index 0000000..06ec87d --- /dev/null +++ b/backend/app/templates/emails/hu/registration.html @@ -0,0 +1,16 @@ + + + +
+

Szia {{ first_name }}!

+

Örömmel üdvözlünk a Service Finder közösségében.

+

A regisztrációd befejezéséhez és a "Privát Széfed" aktiválásához kérjük, kattints az alábbi gombra:

+ +

Ez a link 48 óráig érvényes.

+
+

Ha nem te regisztráltál, kérjük hagyd figyelmen kívül ezt a levelet.

+
+ + \ No newline at end of file diff --git a/backend/app/test_outside/rdw_api_test.py b/backend/app/test_outside/rdw_api_test.py new file mode 100755 index 0000000..f777f06 --- /dev/null +++ b/backend/app/test_outside/rdw_api_test.py @@ -0,0 +1,28 @@ +import httpx +import asyncio +import json + +async def discover_rdw_datasets(): + # Ez a meta-adat API megmutatja az összes regisztrált járművekkel kapcsolatos táblát + discovery_url = "https://opendata.rdw.nl/api/views/metadata/v1" + + async with httpx.AsyncClient() as client: + response = await client.get(discovery_url) + if response.status_code == 200: + datasets = response.json() + print(f"Talált táblák száma: {len(datasets)}\n") + + # Kilistázzuk a legfontosabbakat + for ds in datasets[:20]: # Csak az első 20-at a példa kedvéért + name = ds.get('name', 'N/A') + id = ds.get('id', 'N/A') + print(f"Név: {name}") + print(f"Link: https://opendata.rdw.nl/resource/{id}.json") + print("-" * 30) + else: + print(f"Hiba a lekérdezés során: {response.status_code}") + +if __name__ == "__main__": + asyncio.run(discover_rdw_datasets()) + + # docker exec -it sf_api python /app/app/test_outside/rdw_api_test.py \ No newline at end of file diff --git a/backend/app/test_outside/rdw_zt646p_test.py b/backend/app/test_outside/rdw_zt646p_test.py new file mode 100755 index 0000000..1ce3f43 --- /dev/null +++ b/backend/app/test_outside/rdw_zt646p_test.py @@ -0,0 +1,27 @@ +import httpx +import asyncio + +async def get_full_vehicle_data(kenteken: str): + # A legfontosabb táblák listája + resources = { + "Alapadatok": "m9d7-ebf2", + "Üzemanyag": "826y-p86p", + "Műszaki": "8ys7-d773" + } + + kenteken = kenteken.upper().replace("-", "") + + async with httpx.AsyncClient() as client: + for name, res_id in resources.items(): + url = f"https://opendata.rdw.nl/resource/{res_id}.json?kenteken={kenteken}" + resp = await client.get(url) + + if resp.status_code == 200 and resp.json(): + print(f"--- {name} ({res_id}) ---") + print(json.dumps(resp.json()[0], indent=2)) + else: + print(f"--- {name} ({res_id}): Nincs adat vagy 404 ---") + +if __name__ == "__main__": + import json + asyncio.run(get_full_vehicle_data("ZT646P")) # Teszt rendszám \ No newline at end of file diff --git a/backend/app/test_outside/robot_dashboard.py b/backend/app/test_outside/robot_dashboard.py new file mode 100755 index 0000000..397fa42 --- /dev/null +++ b/backend/app/test_outside/robot_dashboard.py @@ -0,0 +1,55 @@ +# /app/app/test_outside/robot_dashboard.py +import asyncio +import sys +from sqlalchemy import text +from app.database import AsyncSessionLocal + +async def run_dashboard(): + print("\n" + "="*60) + print("🤖 ROBOT HADOSZTÁLY ÁLLAPOTJELENTÉS 🤖") + print("="*60) + + async with AsyncSessionLocal() as db: + # --- 1. DISCOVERY (Felfedezés) --- + print("\n📡 1. FÁZIS: Felfedezés (Discovery Engine)") + print("-" * 40) + res = await db.execute(text("SELECT status, count(*) FROM data.catalog_discovery GROUP BY status ORDER BY count DESC")) + rows = res.fetchall() + if not rows: print(" Nincs adat.") + for row in rows: print(f" - {row[0].upper().ljust(20)}: {row[1]} db") + + # --- 2. FELDOLGOZÁS (Hunter, Researcher, Alchemist) --- + print("\n⚙️ 2. FÁZIS: Feldolgozás és Tisztítás (Köztes tábla)") + print("-" * 40) + res = await db.execute(text("SELECT status, count(*) FROM data.vehicle_model_definitions GROUP BY status ORDER BY count DESC")) + rows = res.fetchall() + if not rows: print(" Nincs adat.") + for row in rows: print(f" - {row[0].upper().ljust(20)}: {row[1]} db") + + # --- 3. HIBÁK (Kritikus elakadások) --- + print("\n🚨 LEGGYAKORIBB HIBÁK (Top 3 felfüggesztett)") + print("-" * 40) + res = await db.execute(text(""" + SELECT substring(last_error from 1 for 70) as err, count(*) + FROM data.vehicle_model_definitions + WHERE status = 'suspended' AND last_error IS NOT NULL + GROUP BY err ORDER BY count DESC LIMIT 3 + """)) + errors = res.fetchall() + if errors: + for row in errors: print(f" - [{row[1]} db] {row[0]}...") + else: + print(" - Nincs felfüggesztett, hibás rekord! 🎉") + + # --- 4. ARANY REKORDOK (Végleges) --- + print("\n🏆 3. FÁZIS: Végleges Arany Katalógus") + print("-" * 40) + res = await db.execute(text("SELECT count(*) FROM data.vehicle_catalog")) + print(f" - Kész járművek száma : {res.scalar()} db") + + print("\n" + "="*60 + "\n") + +if __name__ == "__main__": + asyncio.run(run_dashboard()) + +# docker exec -it sf_api python /app/app/test_outside/robot_dashboard.py \ No newline at end of file diff --git a/backend/app/test_outside/rontgen_felkesz_adatok.py b/backend/app/test_outside/rontgen_felkesz_adatok.py new file mode 100755 index 0000000..31df7ea --- /dev/null +++ b/backend/app/test_outside/rontgen_felkesz_adatok.py @@ -0,0 +1,37 @@ +# /app/app/test_outside/rontgen_felkesz_adatok.py +import asyncio +from sqlalchemy import text +from app.database import AsyncSessionLocal + +async def show_halfway(): + async with AsyncSessionLocal() as db: + # Lekérdezzük a Hunter által már feldolgozott (ACTIVE) rekordokat + res = await db.execute(text(''' + SELECT make, marketing_name, engine_capacity, power_kw, fuel_type, priority_score + FROM data.vehicle_model_definitions + WHERE status = 'ACTIVE' + ORDER BY updated_at DESC + LIMIT 15 + ''')) + rows = res.fetchall() + + print('\n' + '🔍 FÉLKÉSZ ADATOK (A Hunter robot zsákmánya) 🔍'.center(60)) + print('=' * 60) + + if not rows: + print('Nincsenek aktív járművek a köztes táblában.') + return + + for r in rows: + make, model, ccm, kw, fuel, prio = r + ccm_txt = f"{ccm} ccm" if ccm else "?" + kw_txt = f"{kw} kW" if kw else "?" + + print(f"🚗 {make} {model} (Prio: {prio or 0})") + print(f" ⚙️ Motor RDW adat: {ccm_txt} | {kw_txt} | ⛽ {fuel or '?'}") + print('-' * 60) + +if __name__ == "__main__": + asyncio.run(show_halfway()) + +# docker exec -it sf_api python /app/app/test_outside/rontgen_felkesz_adatok.py diff --git a/backend/app/test_outside/rontgen_skript.py b/backend/app/test_outside/rontgen_skript.py new file mode 100755 index 0000000..8138740 --- /dev/null +++ b/backend/app/test_outside/rontgen_skript.py @@ -0,0 +1,30 @@ +# /app/app/test_outside/rontgen_skript.py +import asyncio +import json +from sqlalchemy import text +from app.database import AsyncSessionLocal + +async def show_gold(): + async with AsyncSessionLocal() as db: + res = await db.execute(text('SELECT make, model, power_kw, engine_capacity, fuel_type, factory_data FROM data.vehicle_catalog ORDER BY id DESC LIMIT 10')) + rows = res.fetchall() + + print('\n' + '🏆 AZ ARANY KATALÓGUS LEGÚJABB JÁRMŰVEI 🏆'.center(60)) + print('=' * 60) + + for r in rows: + make, model, kw, ccm, fuel, json_data = r + print(f'🚗 {make} {model}') + print(f' ⚙️ Motor: {ccm or "?"} ccm | {kw or "?"} kW') + print(f' ⛽ Üzemanyag: {fuel}') + + # Megnézzük, van-e az AI által talált extra adat (pl. motorkód vagy gumi méret) + if json_data and isinstance(json_data, dict): + engine_code = json_data.get('engine_code', 'Nincs adat') + print(f' 🔍 Motorkód (AI/RDW): {engine_code}') + print('-' * 60) + +if __name__ == "__main__": + asyncio.run(show_gold()) + + # docker exec -it sf_api python /app/app/test_outside/rontgen_skript.py \ No newline at end of file diff --git a/backend/app/test_outside/sql_listak_md b/backend/app/test_outside/sql_listak_md new file mode 100755 index 0000000..10da0d2 --- /dev/null +++ b/backend/app/test_outside/sql_listak_md @@ -0,0 +1,45 @@ +### 1. A teljes folyamat áttekintése: +SQL + +SELECT '1. Felfedezésre vár (Discovery)' as fazis, status, count(*) FROM data.catalog_discovery GROUP BY status +UNION ALL +SELECT '2. Feldolgozás alatt (Hunter/Alchemist)' as fazis, status, count(*) FROM data.vehicle_model_definitions GROUP BY status +ORDER BY fazis, count DESC; + +### 2. Hány "Arany" (végleges) autóm van már? +SQL + +SELECT make, count(*) as db +FROM data.vehicle_catalog +GROUP BY make +ORDER BY db DESC; + +### 3. Mik a hibák, amiken elakadnak a robotok? (Nagyon hasznos!) +SQL + +SELECT last_error, count(*) as elakadas_szama +FROM data.vehicle_model_definitions +WHERE status = 'suspended' +GROUP BY last_error +ORDER BY elakadas_szama DESC; + +**1. Módszer: SQL Lekérdezés (pgAdmin / DBeaver)** + +Ha grafikus felületen nézed az adatbázist, futtasd le ezt az SQL parancsot. Ez gyönyörűen, oszlopokba rendezve megmutatja a legfontosabb műszaki adatokat, és az AI által összerakott teljes JSON struktúrát is! +SQL + +SELECT + id, + make AS "Márka", + model AS "Modell", + vehicle_class AS "Kategória", + engine_capacity || ' ccm' AS "Hengerűrtartalom", + power_kw || ' kW' AS "Teljesítmény", + fuel_type AS "Üzemanyag", + factory_data AS "AI Nyers JSON" +FROM + data.vehicle_catalog +ORDER BY + id DESC; + + diff --git a/backend/app/tests_internal/README.md b/backend/app/tests_internal/README.md new file mode 100755 index 0000000..6c18ed2 --- /dev/null +++ b/backend/app/tests_internal/README.md @@ -0,0 +1,25 @@ +# 🛠️ Internal Diagnostic Tools + +Ez a mappa a rendszer stabilitását ellenőrző szkripteket tartalmazza. +Futtatásuk a konténeren belül javasolt. + +### 1. Schema Sync (`compare_schema.py`) +**Mikor használd:** Ha új oszlopot adtál a modellhez, vagy nem indul el a rendszer DB hiba miatt. +**Futtatás:** `docker compose exec api python -m app.tests_internal.compare_schema` +docker compose exec api python -m app.tests_internal.diagnostics.compare_schema + +### 2. API Health (`check_api.py`) +**Mikor használd:** Refaktorálás után. Ellenőrzi, hogy az összes API "kapu" nyitva van-e. +**Futtatás:** `docker compose exec api python -m app.tests_internal.check_api` +docker compose exec api python -m app.tests_internal.diagnostics.check_api + +### 3. Geo Search Test (`test_postgis.py`) +**Mikor használd:** Ha a szervizkereső nem ad vissza eredményt, vagy SQL hibát dob. +**Futtatás:** `docker compose exec api python -m app.tests_internal.test_postgis` + +### 3. Rendszerdiagnosztika (`diagnose_system.py`) +- **Cél:** Mély ellenőrzés: DB kapcsolat, i18n szótárak, Master Data mezők és konfigurációk. +- **Mikor használd:** Telepítés után, vagy ha a rendszer "furcsán" viselkedik (pl. angolul beszél magyar helyett). +- **Indítás:** + +docker compose exec api python -m app.tests_internal.diagnostics.diagnose_system \ No newline at end of file diff --git a/backend/app/tests_internal/__init__.py b/backend/app/tests_internal/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/backend/app/tests_internal/diagnostics/__init__.py b/backend/app/tests_internal/diagnostics/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/backend/app/tests_internal/diagnostics/check_api.py b/backend/app/tests_internal/diagnostics/check_api.py new file mode 100755 index 0000000..63905fc --- /dev/null +++ b/backend/app/tests_internal/diagnostics/check_api.py @@ -0,0 +1,53 @@ +# /app/tests_internal/diagnostics/check_api.py +import requests +import json + +# THOUGHT PROCESS: +# 1. Az API konténeren belül futva a localhost:8000 a célpont. +# 2. Csak olyan végpontokat tesztelünk, amik szerepelnek a v1/api.py-ben. +# 3. A 401/405 kódokat elfogadjuk 'OK'-nak, mert azt jelentik, hogy a szerver +# látja az útvonalat, csak hitelesítést vagy más HTTP metódust vár. +# 4. A 404 azt jelenti, hogy a router nincs jól regisztrálva. +# 5. A 500 azt jelenti, hogy a kód elszállt (pl. AttributeError a main.py-ban). + +base_url = 'http://localhost:8000' + +# A valós, api.py-ben definiált útvonalak: +tests = [ + ('Health Check', '/health', 'GET'), + ('Auth Login (Entry)', '/api/v1/auth/login', 'POST'), # Létezik + ('Catalog Makes', '/api/v1/catalog/makes', 'GET'), # Létezik + ('Service Hunt', '/api/v1/services/hunt', 'POST'), # Létezik + ('Admin Health', '/api/v1/admin/health-monitor', 'GET'), # Létezik + ('My Organizations', '/api/v1/organizations/my', 'GET') # Létezik +] + +print('\n--- 🧪 API VÉGPONT DIAGNOSZTIKA ---') +print(f"{'Végpont neve':20} | {'Útvonal':25} | {'Állapot'}") +print("-" * 65) + +for name, endpoint, method in tests: + try: + url = f"{base_url}{endpoint}" + # A POST hívásokhoz üres adatot küldünk, hogy ne 422-t kapjunk a hiányzó body miatt + resp = requests.request(method, url, timeout=5, json={}) + + # Logika: + # 200: Tökéletes + # 401: Él, de login kell (JÓ) + # 405: Él, de pl. GET helyett POST kell (JÓ - az útvonal létezik) + # 422: Él, de hiányoznak a küldött adatok (JÓ - a validáció működik) + + if resp.status_code in [200, 401, 405, 422]: + status_msg = f"✅ OK ({resp.status_code})" + elif resp.status_code == 404: + status_msg = f"❌ HIÁNYZIK (404)" + else: + status_msg = f"🔥 SZERVER HIBA ({resp.status_code})" + + print(f"{name:20} | {endpoint:25} | {status_msg}") + + except Exception as e: + print(f"{name:20} | {endpoint:25} | 🔌 ELÉRHETETLEN") + +print("\n💡 Megjegyzés: Ha a Health Check továbbra is 500, az a main.py-ban lévő elírás miatt van.") \ No newline at end of file diff --git a/backend/app/tests_internal/diagnostics/compare_schema.py b/backend/app/tests_internal/diagnostics/compare_schema.py new file mode 100755 index 0000000..43e8796 --- /dev/null +++ b/backend/app/tests_internal/diagnostics/compare_schema.py @@ -0,0 +1,66 @@ +# /opt/docker/dev/service_finder/backend/app/tests_internal/diagnostics/compare_schema.py +import asyncio +import sys +from sqlalchemy.ext.asyncio import create_async_engine +from sqlalchemy import inspect +from app.database import Base +from app.core.config import settings + +try: + import app.models +except ImportError as e: + print(f"❌ KRITIKUS IMPORT HIBA: {e}") + sys.exit(1) + +async def compare(): + """ Diagnosztika minden sémára: identity, data, system. """ + print(f"🔗 Kapcsolódás az adatbázishoz...") + engine = create_async_engine(str(settings.SQLALCHEMY_DATABASE_URI)) + + def get_diff(connection): + inspector = inspect(connection) + # Ezeket a sémákat ellenőrizzük + schemas = ["identity", "data", "system"] + all_db_schemas = inspector.get_schema_names() + + mismatches = 0 + for sc in schemas: + if sc not in all_db_schemas: + print(f"❌ HIBA: A(z) '{sc}' séma nem létezik!") + continue + + db_tables = inspector.get_table_names(schema=sc) + # Begyűjtjük a modelleket, amik ehhez a sémához tartoznak + model_tables = [t.name for t in Base.metadata.sorted_tables if t.schema == sc] + + print(f"\n--- 🔍 DIAGNOSZTIKA: '{sc}' séma ({len(db_tables)} tábla a DB-ben) ---") + + for mt in model_tables: + if mt not in db_tables: + print(f"❌ HIÁNYZÓ TÁBLA: {sc}.{mt}") + mismatches += 1 + else: + db_cols = {c['name']: c for c in inspector.get_columns(mt, schema=sc)} + # Kikeressük a modellt a metadata-ból + table_key = f"{sc}.{mt}" + model_cols = Base.metadata.tables[table_key].columns + + missing_cols = [m.name for m in model_cols if m.name not in db_cols] + if missing_cols: + print(f"⚠️ {mt:25} | HIÁNYZÓ OSZLOPOK: {missing_cols}") + mismatches += 1 + else: + print(f"✅ {mt:25} | Rendben.") + return mismatches + + try: + async with engine.connect() as conn: + err_count = await conn.run_sync(get_diff) + print(f"\n--- Összegzés: {err_count} eltérés található. ---\n") + except Exception as e: + print(f"❌ HIBA: {e}") + finally: + await engine.dispose() + +if __name__ == "__main__": + asyncio.run(compare()) \ No newline at end of file diff --git a/backend/app/tests_internal/diagnostics/diagnose_system.py b/backend/app/tests_internal/diagnostics/diagnose_system.py new file mode 100755 index 0000000..37a55f6 --- /dev/null +++ b/backend/app/tests_internal/diagnostics/diagnose_system.py @@ -0,0 +1,157 @@ +# /opt/docker/dev/service_finder/backend/app/tests_internal/diagnostics/diagnose_system.py +""" +🛰️ SENTINEL SYSTEM DIAGNOSTICS - MB2.0 (2026) +--------------------------------------------- +CÉL: A rendszer mélyszintű integritásának és működőképességének auditálása. + +FŐBB TESZTEK: +1. Adatbázis Kapcsolat: PostgreSQL aszinkron elérés ellenőrzése. +2. Séma Integritás: Kritikus Master Data táblák és mezők meglétének vizsgálata. +3. Rendszer Paraméterek: A Sentinel központi konfigurációs táblájának ellenőrzése. +4. i18n Motor: Nyelvi gyorsítótár (Cache) és fordítási mechanizmus tesztje. +5. Robot Pipeline: Staging (Hunter) és Gold (Catalog) rekordok számlálása. + +FUTTATÁS: +docker compose exec api python -m app.tests_internal.diagnostics.diagnose_system +""" + +import asyncio +import sys +import logging +from datetime import datetime +from sqlalchemy import text, select, func + +# 🛠️ KRITIKUS IMPORT KÖRNYEZET ELLENŐRZÉSE +try: + from app.core.config import settings + # Megjegyzés: A projekt struktúrájától függően AsyncSessionLocal az app.database-ben van + from app.database import AsyncSessionLocal + from app.services.translation_service import translation_service + from app.models.system import SystemParameter + from app.models.identity import User + from app.models.organization import Organization + from app.models.asset import AssetCatalog + from app.models.vehicle_definitions import VehicleModelDefinition +except ImportError as e: + print(f"\n❌ [KRITIKUS HIBA] Az importálás nem sikerült: {e}") + print("💡 Javaslat: Ellenőrizd a PYTHONPATH-t és a __init__.py fájlok meglétét!") + sys.exit(1) + +# SQL logolás némítása a tiszta kimenet érdekében +logging.getLogger('sqlalchemy.engine').setLevel(logging.WARNING) + +async def diagnose(): + start_time = datetime.now() + print("\n" + "═"*70) + print(f"🛰️ SENTINEL SYSTEM DIAGNOSTICS - MB2.0 | {start_time.strftime('%Y-%m-%d %H:%M:%S')}") + print("═"*70 + "\n") + + async with AsyncSessionLocal() as session: + + # --- 1. CSATLAKOZÁS ÉS ADATBÁZIS PING --- + print("1️⃣ Kapcsolódási teszt...") + try: + await session.execute(text("SELECT 1")) + print(" [✅ OK] PostgreSQL aszinkron kapcsolat aktív.") + except Exception as e: + print(f" [❌ HIBA] Nem sikerült kapcsolódni az adatbázishoz: {e}") + return + + # --- 2. SÉMA INTEGRITÁS (Master Data Audit) --- + print("\n2️⃣ Séma integritás ellenőrzése (Kritikus mezők)...") + # Tábla neve (sémával) | Elvárt oszlopok listája + tables_to_check = [ + ("identity.users", ["preferred_language", "scope_id", "is_active"]), + ("data.organizations", ["org_type", "folder_slug", "is_active"]), + ("data.assets", ["owner_org_id", "catalog_id", "vin"]), + # "asset_catalog" helyett "vehicle_catalog" + ("data.vehicle_catalog", ["make", "model", "factory_data"]), + ("data.vehicle_model_definitions", ["status", "raw_search_context"]) + ] + + for table, columns in tables_to_check: + try: + schema_name, table_name = table.split('.') + query = text(f""" + SELECT column_name FROM information_schema.columns + WHERE table_schema = '{schema_name}' AND table_name = '{table_name}'; + """) + res = await session.execute(query) + existing_cols = [row[0] for row in res.fetchall()] + + if not existing_cols: + print(f" [❌ HIBA] A tábla NEM létezik: {table}") + continue + + missing = [c for c in columns if c not in existing_cols] + if not missing: + print(f" [✅ OK] {table:35} (Minden mező rendben)") + else: + print(f" [⚠️ HIÁNY] {table:35} | Hiányzó mezők: {', '.join(missing)}") + except Exception as e: + print(f" [❌ HIBA] Hiba a(z) {table} ellenőrzésekor: {e}") + + # --- 3. RENDSZER PARAMÉTEREK (Sentinel Config) --- + print("\n3️⃣ System Parameters (Sentinel Config) ellenőrzése...") + try: + res = await session.execute(select(SystemParameter)) + params = res.scalars().all() + if params: + print(f" [✅ OK] Talált paraméterek: {len(params)} db") + # Kritikus kulcsok, amiknek illik lenniük + critical_keys = ["SECURITY_MAX_RECORDS_PER_HOUR", "VEHICLE_LIMIT"] + existing_keys = [p.key for p in params] + for ck in critical_keys: + status = "✔️" if ck in existing_keys else "❌ (Hiányzik)" + print(f" {status} {ck}") + else: + print(" [⚠️ FIGYELEM] A system_parameters tábla üres! Futtasd a seedert.") + except Exception as e: + print(f" [❌ HIBA] SystemParameter lekérdezési hiba: {e}") + + # --- 4. i18n ÉS CACHE MOTOR --- + print("\n4️⃣ Nyelvi motor és i18n Cache ellenőrzése...") + try: + # Gyorsítótár frissítése az adatbázisból + await translation_service.load_cache(session) + + test_key = "COMMON.SAVE" + test_val = translation_service.get_text(test_key, "hu") + + # Ha a visszakapott érték nem egyezik a kulccsal, akkor van fordítás + if test_val and test_val != f"[{test_key}]": + print(f" [✅ OK] Fordítás sikeres (HU): '{test_key}' -> '{test_val}'") + else: + print(f" [❌ HIBA] Fordítás nem működik. Nincs betöltött adat vagy hibás a cache.") + except Exception as e: + print(f" [❌ HIBA] Nyelvi motor hiba: {e}") + + # --- 5. ROBOT ELŐKÉSZÜLETEK (Pipeline MDM) --- + print("\n5️⃣ Robot Pipeline (MDM Staging) állapot...") + try: + # Hunter robot eredményei (nyers adatok) + res_hunter = await session.execute( + select(func.count(VehicleModelDefinition.id)).where(VehicleModelDefinition.status == 'unverified') + ) + unverified_count = res_hunter.scalar() or 0 + + # Catalog robot eredményei (tisztított adatok) + res_gold = await session.execute(select(func.count(AssetCatalog.id))) + gold_count = res_gold.scalar() or 0 + + print(f" [📊 STAT] Feldolgozatlan rekordok (Staging): {unverified_count} db") + print(f" [📊 STAT] Validált arany rekordok (Catalog): {gold_count} db") + except Exception as e: + print(f" [❌ HIBA] Robot-statisztika hiba: {e}") + + duration = (datetime.now() - start_time).total_seconds() + print("\n" + "═"*70) + print(f"🏁 DIAGNOSZTIKA BEFEJEZŐDÖTT | Időtartam: {duration:.2f} mp") + print("═"*70 + "\n") + +if __name__ == "__main__": + try: + asyncio.run(diagnose()) + except KeyboardInterrupt: + print("\n🛑 Diagnosztika megszakítva a felhasználó által.") + sys.exit(0) \ No newline at end of file diff --git a/backend/app/tests_internal/fixes/__init__.py b/backend/app/tests_internal/fixes/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/backend/app/tests_internal/fixes/final_admin_fix.py b/backend/app/tests_internal/fixes/final_admin_fix.py new file mode 100755 index 0000000..d372fff --- /dev/null +++ b/backend/app/tests_internal/fixes/final_admin_fix.py @@ -0,0 +1,82 @@ +# /opt/docker/dev/service_finder/backend/app/final_admin_fix.py +import asyncio +import uuid +from sqlalchemy import text, select +from app.database import AsyncSessionLocal +from app.models.identity import User, Person, UserRole +from app.core.security import get_password_hash + +async def run_fix(): + print("\n" + "═"*50) + print("🛠️ ADMIN RENDSZERJAVÍTÁS ÉS INICIALIZÁLÁS (MB2.0)") + print("═"*50) + + async with AsyncSessionLocal() as db: + # 1. LOGIKA: Séma ellenőrzése az 'identity' névtérben + # Az MB2.0-ban a felhasználók már nem a 'data', hanem az 'identity' sémában vannak. + check_query = text(""" + SELECT column_name FROM information_schema.columns + WHERE table_schema = 'identity' AND table_name = 'users' + """) + res = await db.execute(check_query) + cols = [r[0] for r in res.fetchall()] + + if not cols: + print("❌ HIBA: Az 'identity.users' tábla nem található. Futtasd az Alembic migrációt!") + return + + if "hashed_password" not in cols: + print("❌ HIBA: A 'hashed_password' oszlop hiányzik. Az adatbázis sémája elavult.") + return + + # 2. LOGIKA: Admin keresése + admin_email = "admin@profibot.hu" + stmt = select(User).where(User.email == admin_email) + existing_res = await db.execute(stmt) + existing_admin = existing_res.scalar_one_or_none() + + if existing_admin: + print(f"⚠️ Információ: A(z) {admin_email} felhasználó már létezik.") + # Opcionális: Jelszó kényszerített frissítése, ha elfelejtetted + # existing_admin.hashed_password = get_password_hash("Admin123!") + # await db.commit() + else: + try: + # 3. LOGIKA: Person és User létrehozása (MB2.0 Standard) + # Előbb létrehozzuk a fizikai személyt + new_person = Person( + id_uuid=uuid.uuid4(), + first_name="Rendszer", + last_name="Adminisztrátor", + is_active=True + ) + db.add(new_person) + await db.flush() # ID lekérése a mentés előtt + + # Létrehozzuk a felhasználói fiókot az Admin role-al + new_admin = User( + email=admin_email, + hashed_password=get_password_hash("Admin123!"), + person_id=new_person.id, + role=UserRole.superadmin, # MB2.0 enum érték + is_active=True, + is_deleted=False, + preferred_language="hu" + ) + db.add(new_admin) + + await db.commit() + print(f"✅ SIKER: Superadmin létrehozva!") + print(f" 📧 Email: {admin_email}") + print(f" 🔑 Jelszó: Admin123!") + + except Exception as e: + print(f"❌ HIBA a mentés során: {e}") + await db.rollback() + + print("\n" + "═"*50) + print("🏁 JAVÍTÁSI FOLYAMAT BEFEJEZŐDÖTT") + print("═"*50 + "\n") + +if __name__ == "__main__": + asyncio.run(run_fix()) \ No newline at end of file diff --git a/backend/app/tests_internal/seeds/__init__.py b/backend/app/tests_internal/seeds/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/backend/app/tests_internal/seeds/seed_catalog.py b/backend/app/tests_internal/seeds/seed_catalog.py new file mode 100755 index 0000000..a2e2855 --- /dev/null +++ b/backend/app/tests_internal/seeds/seed_catalog.py @@ -0,0 +1,98 @@ +# /opt/docker/dev/service_finder/backend/app/tests_internal/seeds/seed_catalog.py +""" +🌱 MB2.0 KATALÓGUS ÉS ROBOT SEEDER +---------------------------------- +CÉL: A járműkatalógus alapadatainak és a robotok munkalistájának feltöltése. + +FUNKCIÓK: +1. DiscoveryParameter: Azon városok rögzítése, ahol a Scout robot keresni fog. +2. CatalogDiscovery: Azon márkák rögzítése, amiket a Robot 0/1 fel fog dolgozni. +3. AssetCatalog: 'Arany' (már validált) technikai rekordok beszúrása. + +JAVÍTÁSOK: +- 'last_error' oszlop eltávolítva (mivel az adatbázisban nem létezik). +- 'attempts' mező kényszerített 0 értékkel (NOT NULL kényszer miatt). +""" + +import asyncio +import logging +from app.database import AsyncSessionLocal +from app.models.asset import AssetCatalog, CatalogDiscovery +from app.models.staged_data import DiscoveryParameter + +# Logolás beállítása +logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] Sentinel-Seed: %(message)s') +logger = logging.getLogger("Seed-Catalog") + +async def quick_seed(): + """ Katalógus és Discovery adatok inicializálása. """ + async with AsyncSessionLocal() as db: + logger.info("🚀 Katalógus alapozás indítása...") + + try: + # 1. Felderítendő Városok (DiscoveryParameter) + # A Scout robot ezekben a városokban kezdi meg a szervizek kutatását. + cities = [ + ("BUDAPEST", "HU"), + ("DEBRECEN", "HU"), + ("GYŐR", "HU"), + ("SZEGED", "HU") + ] + + for city_name, country in cities: + db.add(DiscoveryParameter( + city=city_name, + country_code=country, + is_active=True + )) + + # 2. Felderítendő Márkák és Típusok (CatalogDiscovery) + # Ezeket a rekordokat fogja a Robot 0 és Robot 1 feldolgozni a háttérben. + discovery_queue = [ + ("SUZUKI", "ALL"), + ("TOYOTA", "ALL"), + ("HONDA", "ALL"), + ("SKODA", "ALL"), + ("YAMAHA", "ALL") + ] + + for m, mod in discovery_queue: + # Az attempts=0 kötelező a DB kényszer miatt + db.add(CatalogDiscovery( + make=m, + model=mod, + status="pending", + attempts=0 + )) + + # 3. Arany rekordok (AssetCatalog / vehicle_catalog tábla) + # Példa adatok, amik már átmentek a validációs folyamaton. + gold_data = [ + AssetCatalog( + make="SUZUKI", + model="VITARA", + generation="LY (2015-)", + fuel_type="petrol", + factory_data={"segment": "SUV", "origin": "Hungary"} + ), + AssetCatalog( + make="SKODA", + model="OCTAVIA", + generation="IV (2020-)", + fuel_type="diesel", + factory_data={"segment": "Sedan/Combi"} + ) + ] + db.add_all(gold_data) + + # Mentés végrehajtása + await db.commit() + logger.info("✨ Katalógus és Discovery paraméterek sikeresen rögzítve!") + + except Exception as e: + await db.rollback() + logger.error(f"❌ HIBA a katalógus feltöltésekor: {e}") + raise e + +if __name__ == "__main__": + asyncio.run(quick_seed()) \ No newline at end of file diff --git a/backend/app/tests_internal/seeds/seed_data.py b/backend/app/tests_internal/seeds/seed_data.py new file mode 100755 index 0000000..6a783fa --- /dev/null +++ b/backend/app/tests_internal/seeds/seed_data.py @@ -0,0 +1,106 @@ +# /opt/docker/dev/service_finder/backend/app/seed_data.py +import asyncio +import uuid +from datetime import datetime, timedelta, timezone +from sqlalchemy import text, select +from app.database import AsyncSessionLocal +from app.models.identity import User, Person, UserRole +from app.models.social import ServiceProvider, Vote, ModerationStatus, Competition +from app.services.social_service import SocialService +from app.core.security import get_password_hash + +async def run_simulation(): + async with AsyncSessionLocal() as db: + print("--- 1. TAKARÍTÁS (MB2.0 Séma-tisztítás) ---") + # Szigorú sorrend a kényszerek miatt (Cascade) + await db.execute(text("TRUNCATE identity.users, identity.persons, data.service_providers, data.votes, data.competitions RESTART IDENTITY CASCADE")) + await db.commit() + + print("\n--- 2. SZEREPLŐK LÉTREHOZÁSA (Person + User) ---") + users_to_create = [ + ("admin@test.com", "Adminisztrátor", UserRole.superadmin), + ("good@test.com", "Rendes Srác", UserRole.user), + ("bad@test.com", "Spammer Aladár", UserRole.user), + ("voter@test.com", "Szavazó Gép", UserRole.user) + ] + + created_users = {} + for email, name, role in users_to_create: + p = Person(id_uuid=uuid.uuid4(), first_name=name.split()[0], last_name=name.split()[1], is_active=True) + db.add(p) + await db.flush() + + u = User( + email=email, + hashed_password=get_password_hash("test1234"), + person_id=p.id, + role=role, + is_active=True, + reputation_score=5 if "good" in email else (-8 if "bad" in email else 0) + ) + db.add(u) + await db.flush() + created_users[email] = u + + await db.commit() + + print("\n--- 3. VERSENY INDÍTÁSA ---") + race = Competition( + name="Téli Szervizvadászat", + start_date=datetime.now(timezone.utc) - timedelta(days=1), + end_date=datetime.now(timezone.utc) + timedelta(days=30), + is_active=True + ) + db.add(race) + await db.commit() + + # Szereplők kiemelése a szimulációhoz + good_user = created_users["good@test.com"] + bad_user = created_users["bad@test.com"] + voter = created_users["voter@test.com"] + + print("\n--- 4. SZCENÁRIÓ A: POZITÍV VALIDÁCIÓ ---") + # Rendes srác beküld egy szervizt + shop = ServiceProvider( + name="Profi Gumis", + address="Budapest, Váci út 10.", + added_by_user_id=good_user.id, + status=ModerationStatus.pending + ) + db.add(shop) + await db.flush() + + # Szavazatok szimulálása (SocialService használatával a pontszámítás miatt) + print(f"Szavazás a '{shop.name}'-re...") + # Szimulálunk 5 pozitív szavazatot különböző "virtuális" szavazóktól + for _ in range(5): + await SocialService.vote_for_provider(db, voter.id, shop.id, 1) + + await db.refresh(good_user) + print(f"Jó felhasználó hírneve: {good_user.reputation_score}") + + print("\n--- 5. SZCENÁRIÓ B: AUTO-BAN (SPAM SZŰRÉS) ---") + fake_shop = ServiceProvider( + name="KAMU SZERVIZ", + address="Nincs ilyen utca 0.", + added_by_user_id=bad_user.id, + status=ModerationStatus.pending + ) + db.add(fake_shop) + await db.flush() + + # Leszavazás (Kell -3 a bukáshoz) + print("Spam jelentése...") + await SocialService.vote_for_provider(db, voter.id, fake_shop.id, -1) + await SocialService.vote_for_provider(db, voter.id, fake_shop.id, -1) + await SocialService.vote_for_provider(db, voter.id, fake_shop.id, -1) + + await db.refresh(bad_user) + print(f"Rossz felhasználó hírneve: {bad_user.reputation_score}") + print(f"Fiók státusza: {'KITILTVA' if not bad_user.is_active else 'AKTÍV'}") + + if not bad_user.is_active: + print("✅ SIKER: A Sentinel automatikusan leállította a spammert!") + +if __name__ == "__main__": + asyncio.run(run_simulation()) \ No newline at end of file diff --git a/backend/app/tests_internal/seeds/seed_expertises.py b/backend/app/tests_internal/seeds/seed_expertises.py new file mode 100755 index 0000000..b618bc4 --- /dev/null +++ b/backend/app/tests_internal/seeds/seed_expertises.py @@ -0,0 +1,65 @@ +import asyncio +from app.database import AsyncSessionLocal +from app.models.service import ExpertiseTag +from sqlalchemy import text + +async def seed_expertises(): + tags = [ + # --- ALAPSZOLGÁLTATÁSOK (MECHANICS) --- + ('OIL_SERVICE', 'Időszakos szerviz / Olajcsere', 'MECHANICS'), + ('BRAKE_REPAIR', 'Fékrendszer javítás', 'MECHANICS'), + ('SUSPENSION', 'Futómű javítás és beállítás', 'MECHANICS'), + ('EXHAUST', 'Kipufogó szerviz', 'MECHANICS'), + ('CLUTCH', 'Kuplung és kettőstömegű csere', 'MECHANICS'), + + # --- MOTOR ÉS VÁLTÓ (ENGINE_DRIVETRAIN) --- + ('ENGINE_REBUILD', 'Motorfelújítás', 'ENGINE_DRIVETRAIN'), + ('TIMING_BELT', 'Vezérlés csere', 'ENGINE_DRIVETRAIN'), + ('AUTO_GEARBOX', 'Automata váltó javítás/olajcsere', 'ENGINE_DRIVETRAIN'), + ('TURBO_REPAIR', 'Turbófeltöltő felújítás', 'ENGINE_DRIVETRAIN'), + ('INJECTOR', 'Dízel injektor / Adagoló javítás', 'ENGINE_DRIVETRAIN'), + ('DPF_CLEAN', 'DPF / Részecskeszűrő tisztítás', 'ENGINE_DRIVETRAIN'), + + # --- ELEKTRONIKA (ELECTRICAL) --- + ('DIAGNOSTICS', 'Számítógépes diagnosztika', 'ELECTRICAL'), + ('AC_REPAIR', 'Klíma javítás és töltés', 'ELECTRICAL'), + ('BATTERY', 'Akkumulátor szerviz', 'ELECTRICAL'), + ('HYBRID_EV', 'Hibrid és Elektromos autó szerviz', 'ELECTRICAL'), + ('CHIP_TUNING', 'Szoftveres optimalizálás / Tuning', 'ELECTRICAL'), + ('ADAS', 'Vezetéstámogató rendszerek kalibrálása', 'ELECTRICAL'), + + # --- GUMI ÉS KERÉK (TYRES) --- + ('TYRE_CHANGE', 'Gumiszerelés és centírozás', 'TYRES'), + ('WHEEL_REPAIR', 'Alufelni javítás / Görgőzés', 'TYRES'), + + # --- KAROSSZÉRIA (BODY) --- + ('BODY_REPAIR', 'Karosszéria lakatolás', 'BODY'), + ('PAINTING', 'Autófényezés', 'BODY'), + ('GLASS_REPAIR', 'Szélvédő javítás és csere', 'BODY'), + ('PDR', 'Jégkár és horpadásjavítás (PDR)', 'BODY'), + + # --- SEGÉLY ÉS SZÁLLÍTÁS (EMERGENCY) --- + ('TOWING', 'Autómentés / Vontatás', 'EMERGENCY'), + ('ROADSIDE_ASSIST', 'Segélyszolgálat / Helyszíni javítás', 'EMERGENCY'), + ('LOCKSMITH', 'Autózár szerviz / Kulcsmásolás', 'EMERGENCY'), + + # --- EGYÉB JÁRMŰVEK (VEHICLE_TYPES) --- + ('MOTO_SERVICE', 'Motorkerékpár szerviz', 'VEHICLE_TYPES'), + ('TRUCK_SERVICE', 'Tehergépjármű szerviz', 'VEHICLE_TYPES'), + ('AGRI_SERVICE', 'Mezőgazdasági gép szerviz', 'VEHICLE_TYPES'), + ] + + async with AsyncSessionLocal() as db: + print("🌱 Szakmai címkék feltöltése...") + for key, name, cat in tags: + stmt = text(""" + INSERT INTO data.expertise_tags (key, name_hu, category, is_official) + VALUES (:k, :n, :c, true) + ON CONFLICT (key) DO UPDATE SET name_hu = EXCLUDED.name_hu, category = EXCLUDED.category + """) + await db.execute(stmt, {"k": key, "n": name, "c": cat}) + await db.commit() + print(f"✅ {len(tags)} címke rögzítve.") + +if __name__ == "__main__": + asyncio.run(seed_expertises()) \ No newline at end of file diff --git a/backend/app/tests_internal/seeds/seed_honda.py b/backend/app/tests_internal/seeds/seed_honda.py new file mode 100755 index 0000000..6dab898 --- /dev/null +++ b/backend/app/tests_internal/seeds/seed_honda.py @@ -0,0 +1,74 @@ +# /opt/docker/dev/service_finder/backend/app/seed_honda.py +import asyncio +import logging +from sqlalchemy import select +from app.database import AsyncSessionLocal +from app.models.asset import AssetCatalog +from app.models.staged_data import DiscoveryParameter + +# Logolás beállítása +logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] Sentinel-Seed: %(message)s') +logger = logging.getLogger("Honda-Seeder") + +async def seed_honda(): + """ + Honda specifikus alapozás az MB2.0 MDM (Master Data Management) szerint. + Létrehozza a katalógus-vázat és a robot-feladatokat. + """ + async with AsyncSessionLocal() as db: + logger.info("🚀 Honda márka-ökoszisztéma inicializálása...") + + # 1. LOGIKA: Robot Discovery feladatok rögzítése + # Ezzel mondjuk meg a Hunter robotnak, hogy keressen rá minden Honda variánsra + discovery_tasks = [ + DiscoveryParameter(make="HONDA", vehicle_class="car", city="BUDAPEST", keyword="repair", is_active=True), + DiscoveryParameter(make="HONDA", vehicle_class="motorcycle", city="BUDAPEST", keyword="service", is_active=True) + ] + + for task in discovery_tasks: + # Megnézzük, van-e már ilyen feladat + stmt = select(DiscoveryParameter).where( + DiscoveryParameter.make == task.make, + DiscoveryParameter.vehicle_class == task.vehicle_class + ) + exists = (await db.execute(stmt)).scalar_one_or_none() + if not exists: + db.add(task) + + # 2. LOGIKA: Népszerű modellek (Arany Rekordok) betöltése + # Ezek a "Starter" adatok, amik azonnal elérhetők a felhasználóknak + honda_models = [ + # Személyautók + {"model": "CIVIC", "gen": "X (2015-2021)", "class": "car"}, + {"model": "ACCORD", "gen": "X (2017-)", "class": "car"}, + {"model": "CR-V", "gen": "V (2016-)", "class": "car"}, + {"model": "JAZZ", "gen": "IV (2020-)", "class": "car"}, + # Motorkerékpárok + {"model": "CB500X", "gen": "PC64 (2019-)", "class": "motorcycle"}, + {"model": "AFRICA TWIN", "gen": "CRF1100L", "class": "motorcycle"}, + {"model": "NC750X", "gen": "RH09 (2021-)", "class": "motorcycle"} + ] + + for m in honda_models: + # Ellenőrizzük az AssetCatalog-ban (MDM tábla) + stmt = select(AssetCatalog).where( + AssetCatalog.make == "HONDA", + AssetCatalog.model == m["model"], + AssetCatalog.generation == m["gen"] + ) + exists = (await db.execute(stmt)).scalar_one_or_none() + + if not exists: + db.add(AssetCatalog( + make="HONDA", + model=m["model"], + generation=m["gen"], + vehicle_class=m["class"], + factory_data={"source": "manual_priority_seed"} # MDM metaadat + )) + + await db.commit() + logger.info("✅ Honda (Autó & Motor) katalógus váz sikeresen felépítve!") + +if __name__ == "__main__": + asyncio.run(seed_honda()) \ No newline at end of file diff --git a/backend/app/tests_internal/seeds/seed_system.py b/backend/app/tests_internal/seeds/seed_system.py new file mode 100755 index 0000000..89e3f82 --- /dev/null +++ b/backend/app/tests_internal/seeds/seed_system.py @@ -0,0 +1,79 @@ +# /app/tests_internal/seeds/seed_system.py +import asyncio +import logging +import uuid +from sqlalchemy import select +from app.database import AsyncSessionLocal +from app.models.identity import User, Person, UserRole +from app.models.system import SystemParameter +# JAVÍTOTT IMPORTOK: A grep alapján szétválasztva +from app.models.gamification import PointRule, LevelConfig, UserStats +from app.models.core_logic import SubscriptionTier +from app.core.security import get_password_hash +from app.core.config import settings + +logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] Sentinel-Seed: %(message)s') +logger = logging.getLogger("System-Seeder") + +async def seed_data(): + """ Rendszer alapadatok inicializálása a megfelelő modellekből. """ + async with AsyncSessionLocal() as db: + logger.info("🚀 Rendszer-alapozás indítása (MB2.0 Standard)...") + + admin_email = settings.INITIAL_ADMIN_EMAIL + admin_password = settings.INITIAL_ADMIN_PASSWORD + + if not admin_email or not admin_password: + logger.error("❌ HIBA: Admin hitelesítési adatok hiányoznak!") + return + + # 1. Superadmin és Person kapcsolat + stmt = select(User).where(User.email == admin_email) + admin_exists = (await db.execute(stmt)).scalar_one_or_none() + + if not admin_exists: + new_person = Person( + first_name="Rendszer", + last_name="Adminisztrátor", + id_uuid=uuid.uuid4(), + is_active=True + ) + db.add(new_person) + await db.flush() + + new_admin = User( + email=admin_email, + hashed_password=get_password_hash(admin_password), + role=UserRole.superadmin, + is_active=True, + person_id=new_person.id + ) + db.add(new_admin) + await db.flush() + + # Statisztikai rekord (Gamification) + db.add(UserStats(user_id=new_admin.id, total_xp=0, current_level=1)) + logger.info(f"✅ Superadmin létrehozva: {admin_email}") + + # 2. Rendszerparaméterek (JSONB értékekkel) + params = [ + ("SECURITY_MAX_RECORDS_PER_HOUR", {"limit": 50}, "Biztonsági limit"), + ("VEHICLE_LIMIT", {"default": 5}, "Alapértelmezett jármű limit") + ] + for key, val, desc in params: + stmt_p = select(SystemParameter).where(SystemParameter.key == key) + if not (await db.execute(stmt_p)).scalar_one_or_none(): + db.add(SystemParameter(key=key, value=val, description=desc)) + + # 3. Gamification Szabályok (gamification.py-ból) + rules = [("ASSET_REGISTER", 100), ("ASSET_REVIEW", 75)] + for key, pts in rules: + stmt_r = select(PointRule).where(PointRule.action_key == key) + if not (await db.execute(stmt_r)).scalar_one_or_none(): + db.add(PointRule(action_key=key, points=pts)) + + await db.commit() + logger.info("✨ Rendszer alapadatok rögzítve.") + +if __name__ == "__main__": + asyncio.run(seed_data()) \ No newline at end of file diff --git a/backend/app/tests_internal/seeds/seed_test_scenario.py b/backend/app/tests_internal/seeds/seed_test_scenario.py new file mode 100755 index 0000000..d4af932 --- /dev/null +++ b/backend/app/tests_internal/seeds/seed_test_scenario.py @@ -0,0 +1,120 @@ +# /opt/docker/dev/service_finder/backend/app/seed_test_scenario.py +import asyncio +import uuid +import logging +from datetime import datetime, timedelta, timezone +from sqlalchemy import select +from app.database import AsyncSessionLocal +from app.models.identity import User +from app.models.organization import Organization, OrganizationMember, OrgType +from app.models.asset import ( + Asset, AssetCatalog, AssetTelemetry, + AssetFinancials, AssetCost +) + +# Sentinel naplózás +logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] Sentinel-Scenario: %(message)s') +logger = logging.getLogger("Test-Scenario") + +async def seed_test_scenario(): + async with AsyncSessionLocal() as db: + logger.info("🚀 MB2.0 Teszt ökoszisztéma felépítése indul...") + + # 1. LOGIKA: Admin (Superuser) lekérése az identity sémából + res = await db.execute(select(User).where(User.is_active == True)) + admin = res.scalars().first() + + if not admin: + logger.error("❌ Hiba: Nincs aktív felhasználó a rendszerben. Futtasd a seed_system.py-t!") + return + + # 2. LOGIKA: Szervezeti struktúra felállítása + # Privát garázs + private_org = Organization( + name="Kincses Privát", + full_name="Kincses Magánflotta és Garázs", + org_type=OrgType.individual, + owner_id=admin.id, + folder_slug="kincses-privat-vault" + ) + # Üzleti flotta + company_org = Organization( + name="ProfiBot Fleet", + full_name="ProfiBot Software Solutions Kft.", + org_type=OrgType.business, + owner_id=admin.id, + folder_slug="profibot-fleet-vault" + ) + # Szolgáltatók (Szerviz és Üzemanyag) + service_org = Organization( + name="Mester Szerviz", + org_type=OrgType.service, + owner_id=admin.id, + is_active=True + ) + + db.add_all([private_org, company_org, service_org]) + await db.flush() + + # Tagsági viszonyok rögzítése + db.add(OrganizationMember(user_id=admin.id, organization_id=company_org.id, role="owner")) + + # 3. LOGIKA: Tesla Model 3 - Digitális Iker (Digital Twin) + # Előbb a katalógus (Gold Data) + catalog = AssetCatalog( + make="TESLA", model="MODEL 3", generation="Long Range (2021-)", + fuel_type="electric", + factory_data={ + "battery": "75 kWh", "power_kw": 366, + "tire_size": "235/45 R18", "ac_charge": "11kW" + } + ) + db.add(catalog) + await db.flush() + + # Majd a konkrét jármű (Asset) + vehicle = Asset( + vin=f"5YJ3E1EB8LF{uuid.uuid4().hex[:6].upper()}", + license_plate="TES-777-EV", + name="Céges Tesla", + year_of_manufacture=2021, + catalog_id=catalog.id, + owner_org_id=company_org.id, + status="active" + ) + db.add(vehicle) + await db.flush() + + # Telemetria és Pénzügyi alapok + db.add(AssetTelemetry(asset_id=vehicle.id, current_mileage=45200, vqi_score=100.0)) + db.add(AssetFinancials(asset_id=vehicle.id, acquisition_price=18500000, currency="HUF")) + + # 4. LOGIKA: A 9 költségtípus szimulálása + costs_data = [ + ("FUEL", 12500, "Supercharger töltés"), + ("MAINTENANCE", 85000, "Pollenszűrő és átvizsgálás"), + ("TIRES", 280000, "Téli gumi szett"), + ("INSURANCE", 32000, "Havi CASCO"), + ("TAX", 15000, "Cégautóadó (szimulált)"), + ("TOLL", 6500, "Éves matrica"), + ("CLEANING", 4500, "Külső-belső takarítás"), + ("PARKING", 1200, "Belvárosi zóna"), + ("OTHER", 2500, "Szélvédőmosó folyadék") + ] + + for c_type, amount, desc in costs_data: + db.add(AssetCost( + asset_id=vehicle.id, + organization_id=company_org.id, + cost_type=c_type, + amount=amount, + currency="HUF", + date=datetime.now(timezone.utc) - timedelta(days=2), + specifications={"description": desc} + )) + + await db.commit() + logger.info("✅ Siker! A teljes flotta-ökoszisztéma üzemkész.") + +if __name__ == "__main__": + asyncio.run(seed_test_scenario()) \ No newline at end of file diff --git a/backend/app/tests_internal/test_functional.py b/backend/app/tests_internal/test_functional.py new file mode 100755 index 0000000..7af81ef --- /dev/null +++ b/backend/app/tests_internal/test_functional.py @@ -0,0 +1,31 @@ +# /app/tests_internal/test_functional.py +""" +CÉL: Éles funkcionális teszt a bejelentkezési folyamathoz. +""" +import asyncio +from sqlalchemy import select +from app.database import AsyncSessionLocal +from app.models.identity import User +from app.services.auth_service import AuthService + +async def test_login_flow(): + print("\n--- 🔑 FUNKCIONÁLIS LOGIN TESZT ---") + async with AsyncSessionLocal() as db: + # 1. Keressünk egy teszt felhasználót + result = await db.execute(select(User).limit(1)) + user = result.scalar_one_or_none() + + if not user: + print("❌ HIBA: Nincs felhasználó az adatbázisban. Futtass egy seeder-t!") + return + + print(f"👤 Tesztelés felhasználóval: {user.email}") + + # 2. Próbáljunk meg egy 'hitelesítést' (jelszó ellenőrzés nélkül a DB szinten) + if user.is_active: + print(f"✅ SIKER: A(z) {user.email} fiók aktív és elérhető.") + else: + print(f"⚠️ FIGYELEM: A felhasználó létezik, de inaktív.") + +if __name__ == "__main__": + asyncio.run(test_login_flow()) \ No newline at end of file diff --git a/backend/app/tests_internal/test_gamification_flow.py b/backend/app/tests_internal/test_gamification_flow.py new file mode 100755 index 0000000..9cec5b9 --- /dev/null +++ b/backend/app/tests_internal/test_gamification_flow.py @@ -0,0 +1,91 @@ +# /opt/docker/dev/service_finder/backend/app/test_gamification_flow.py +import asyncio +import os +import sys +import logging +from sqlalchemy import select +from dotenv import load_dotenv + +# Környezeti változók betöltése +load_dotenv() + +# MB2.0 Importok +from app.database import AsyncSessionLocal +from app.models.identity import User +from app.models.system import UserStats, PointsLedger +from app.services.social_service import SocialService +from app.schemas.social import ServiceProviderCreate + +# Naplózás beállítása +logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] Sentinel-Test: %(message)s') +logger = logging.getLogger("Gamification-Test") + +async def run_test(): + logger.info("🚀 Gamifikációs integrációs folyamat tesztelése...") + + async with AsyncSessionLocal() as db: + try: + # 1. LOGIKA: Teszt felhasználó lekérése az identity sémából + result = await db.execute(select(User).limit(1)) + user = result.scalars().first() + + if not user: + logger.error("❌ Hiba: Nincs felhasználó az adatbázisban. Futtasd a seed_system.py-t!") + return + + logger.info(f"👤 Aktív teszt alany: {user.email}") + + # 2. LOGIKA: Új szolgáltató rögzítése (Trigger az XP szerzéshez) + # A SocialService.create_service_provider automatikusan hívja a GamificationService-t + unique_id = os.urandom(2).hex() + test_provider = ServiceProviderCreate( + name=f"Robot Szerviz {unique_id}", + address="Alchemist utca 12.", + category="service" + ) + + logger.info(f"🛠️ Esemény kiváltása: '{test_provider.name}' rögzítése...") + new_provider = await SocialService.create_service_provider(db, test_provider, user.id) + + # Commit kényszerítése, hogy a háttérfolyamatok rögzüljenek + await db.commit() + logger.info(f"✅ Szolgáltató elfogadva (ID: {new_provider.id})") + + # 3. LOGIKA: Eredmények ellenőrzése a Ledgerben (Főkönyv) + # Újra lekérjük a statisztikákat a commit után + stats_res = await db.execute(select(UserStats).where(UserStats.user_id == user.id)) + stats = stats_res.scalar_one_or_none() + + ledger_res = await db.execute( + select(PointsLedger) + .where(PointsLedger.user_id == user.id) + .order_by(PointsLedger.created_at.desc()) + .limit(1) + ) + last_entry = ledger_res.scalars().first() + + print("\n" + "═"*40) + print("📊 INTEGRÁCIÓS JELENTÉS:") + if stats: + print(f"🏆 Aktuális XP: {stats.total_xp}") + print(f"📈 Szint: {stats.current_level}") + else: + print("⚠️ UserStats rekord nem található!") + + if last_entry: + print(f"📝 Tranzakció oka: {last_entry.reason}") + print(f"💰 XP változás: +{last_entry.points_change}") + print("═"*40 + "\n") + + if stats and stats.total_xp > 0: + logger.info("✅ SIKER: A gamifikációs lánc éles és működik!") + else: + logger.warning("❌ HIBA: A pontszámítás nem történt meg.") + + except Exception as e: + logger.error(f"💥 Kritikus hiba a teszt közben: {e}") + import traceback + traceback.print_exc() + +if __name__ == "__main__": + asyncio.run(run_test()) \ No newline at end of file diff --git a/backend/app/tests_internal/test_postgis.py b/backend/app/tests_internal/test_postgis.py new file mode 100755 index 0000000..5be243a --- /dev/null +++ b/backend/app/tests_internal/test_postgis.py @@ -0,0 +1,33 @@ +# app/tests_internal/test_postgis.py +import asyncio +from sqlalchemy import text +from app.db.session import AsyncSessionLocal + +async def test_geo_logic(): + """ + THOUGHT PROCESS: + Ellenőrizni kell, hogy a PostgreSQL-ben a 'data.branches' tábla 'location' oszlopa + valóban GEOGRAPHY típusú-e, és az ST_Distance függvény működik-e. + Ha ez elbukik, a 'search.py' nem fog eredményt adni. + """ + print("🌍 PostGIS távolságszámítás tesztelése...") + async with AsyncSessionLocal() as session: + try: + # Egy teszt pont (Budapest központ) és egy körzet lekérdezése + query = text(""" + SELECT id, name, + ST_Distance(location, ST_SetSRID(ST_MakePoint(19.0402, 47.4979), 4326)::geography) / 1000 as distance_km + FROM data.branches + LIMIT 1 + """) + result = await db.execute(query) + row = result.fetchone() + if row: + print(f"✅ SIKER: Találtunk egy ágat ({row.name}) {row.distance_km:.2f} km távolságra.") + else: + print("⚠️ FIGYELEM: A lekérdezés lefutott, de nincsenek adatok a data.branches táblában.") + except Exception as e: + print(f"❌ HIBA: A PostGIS lekérdezés elbukott. Oka: {str(e)}") + +if __name__ == "__main__": + asyncio.run(test_geo_logic()) \ No newline at end of file diff --git a/backend/app/workers/README.md b/backend/app/workers/README.md new file mode 100755 index 0000000..b70853f --- /dev/null +++ b/backend/app/workers/README.md @@ -0,0 +1,221 @@ +# 🤖 Service Finder - Robot Hadsereg (Workers Ecosystem) +**Verzió:** MB 2.0 Standard +**Utolsó frissítés:** 2026. február + +Ez a könyvtár tartalmazza a rendszer háttérben futó aszinkron munkásait (workereit). A robotok három logikai "hadosztályra" vannak bontva, hogy a felelősségi körök (Adatgyűjtés, AI Elemzés, Validálás) szigorúan el legyenek választva. + +--- + +## 🏛️ Rendszer Hadosztály (System Division) +*Ezek a robotok a rendszer általános adatminőségéért és a felhasználói dokumentumokért felelnek.* + +### 1. `robot_1_ocr_processor.py` (OCR Dokumentum Elemző) +* **Miért készült?** A Prémium/VIP felhasználók által feltöltött számlákat és forgalmi engedélyeket dolgozza fel. +* **Hogyan működik?** Képeket optimalizál (max 1600px), elmenti őket a biztonságos NAS Vault-ba, majd az AI segítségével strukturált adatokat (Gold Data) von ki belőlük. +* **Docker parancs (Kézi indítás):** `docker compose exec api python -m app.workers.system.robot_1_ocr_processor` + +### 2. `system_robot_2_service_auditor.py` (A Bíró) +* **Miért készült?** Hogy levegye az adminisztrátorok válláról a szervizek élesítésének terhét, és karbantartsa az adatbázist. +* **Hogyan működik?** Két funkciója van. Egyrészt figyeli a `data.service_staging` táblát, és ha egy szerviz eléri a megadott bizalmi ponthatárt (Trust Score), automatikusan átemeli az éles profilok közé. Másrészt időszakosan inaktiválja a megszűnt szervizeket. +* **Docker parancs:** `docker compose exec api python -m app.workers.system.system_robot_2_service_auditor` + +--- + +## 🛠️ Szerviz Hadosztály (Service Division) +*Ezek a robotok a szervizpontok felkutatásáért, dúsításáért és szakmai validálásáért felelnek.* + +# 🤖 Service Robot 0: Continental Scout (A Google Rácskereső) + +## 🎯 A Modul Célja +Prémium, fizetős adatbázisokra támaszkodó felderítő. A `data.discovery_parameters` táblában megadott városokat (pl. "Debrecen") dolgozza fel. Egy bounding box-ot (befoglaló téglalapot) kér a Nominatim API-tól, majd azt kis cellákra bontva, mátrix-szerűen végigpásztázza a Google Places API-val. + +## 🗄️ Érintett Adatbázis Komponensek +- **Olvasás:** `data.discovery_parameters` (Miket kell pásztázni). +- **Írás:** `data.service_staging` (Várólista). Ha az ujjlenyomat már létezik, csak növeli a `trust_score`-t. + +## ⚠️ Biztonsági Figyelmeztetés +A Google Places API fizetős. A `maxResultCount` és a cellaméret közvetlenül szorozza a költségeket. Ezt a robotot szigorú napi limittel (QuotaManager vagy GCP Console szintű hard-limit) szabad csak futtatni, 30 napos frissítési ciklussal. A mentett adatok magasabb (30) induló bizalmi pontot kapnak, mint az OSM adatok. + +# 🤖 Service Robot 0: OSM Scout (A Térképész) + +## 🎯 A Modul Célja +Ingyenes, geolokáció-alapú szerviz-felderítő robot. Az OpenStreetMap (OSM) Overpass API-ját használja, hogy a megadott bounding box (pl. Magyarország) területén lévő autószerelők, gumisok, mosók és benzinkutak POI (Point of Interest) adatait begyűjtse. + +## 🗄️ Érintett Adatbázis Komponensek +- **Írás:** `data.service_staging` (Várólista). +- **Zárolás/Szűrés:** A `fingerprint` (név + város MD5 hash-e) alapján szűri a duplikációkat. + +## 🧠 Folyamat és Védelem +1. Külön lekérdezéseket indít a javítóműhelyekre és a kényelmi szolgáltatásokra. +2. Rate Limit védelem: Beépített exponenciális várakozás, ha az OSM szervere `429 Too Many Requests` hibát ad. +3. Heti egyszer fut le (86400 * 7 mp), mivel az OSM adatok lassan változnak. A nyers adatokat betölti `pending` státusszal a `ServiceStaging` táblába, alacsony (20) bizalmi pontszámmal. +* **Docker parancs:** `docker compose exec api python -m app.workers.service.service_robot_1_scout_osm` + +### 2. `service_robot_3_enricher.py` (Szakmai Címkéző) +* **Miért készült?** Hogy a nyers szövegekből (leírások, weboldalak) strukturált szakmai profilokat építsen. +* **Hogyan működik?** Keresi a projekt hivatalos `ExpertiseTags` kulcsszavait a lekapart szövegekben. Ha egyezést talál, rögzíti a szerviz profiljában, és jóváírja a Gamification felfedezési pontokat. +* **Docker parancs:** `docker compose exec api python -m app.workers.service.service_robot_3_enricher` + +# 🤖 Service Robot 4: Google Validator (A Mesterlövész) + +## 🎯 A Modul Célja és Masterbook 2 Illeszkedés +A Szerviz-ökoszisztéma utolsó minőségbiztosítója. Nem keres vaktában (nincs rácskeresés). Azoknak a szervizeknek, amiket a Robot-1 talált (OSM) és a Robot-3 bedúsított (Szakmák), ez a robot megkeresi a hajszálpontos Google Places ID-ját. Letölti a térképi GPS koordinátákat, a nyitvatartást, a telefonszámot és az értékeléseket. + +## 🗄️ Érintett Adatbázis Komponensek +- **Zárolás/Olvasás:** `data.service_profiles` (ahol `is_verified = False`). +- **Írás:** Frissíti a PostGIS `location` geometriát, a JSONB nyitvatartásokat, és a bizalmi pontszámot (`trust_score`). Ha hiteles, beállítja az `is_verified = True` értéket. +- **Atomi Zárolás:** `FOR UPDATE SKIP LOCKED` védi a race condition hibáktól. + +## 🧠 Geo-logika és API Kezelés +- **Google Places API (New):** Célzott `searchText` alapú keresést futtat a név és a település alapján (`maxResultCount=1`). +- **QuotaManager (Pénztárcavédelem):** Szigorúan számolja a hívásokat egy fizikai `.quota_google_places.json` fájlban, és megállítja a robotot, ha eléri a `.env`-ben definiált `GOOGLE_DAILY_LIMIT` határt. +- **Ghosting:** Ha a Google sem ismeri a szervizt, `ghost` státuszba helyezi (fantom szerviz, valószínűleg már bezárt).* **Docker parancs:** `docker compose exec api python -m app.workers.service.service_robot_4_validator_google` + +--- + +## 🚗 Jármű Hadosztály (Vehicle Division) +*Ezek a robotok a Master Data Management (MDM) járműkatalógusát építik fel nulláról.* + +# 🤖 Robot-0: Discovery Engine & Watchdog (A Felderítő) + +## 🎯 A Modul Célja és Masterbook 2 Illeszkedés +A Robot-0 a Service Finder flotta-nyilvántartó ökoszisztémájának "beszállítója" és "gondnoka". Nem végez AI műveleteket és nem gyűjt részletes technikai adatokat. Két fő feladata van, amelyek biztosítják a rendszer skálázhatóságát: +1. **Differential Sync (Különbözeti Szinkron):** Havonta egyszer letölti az RDW járműlistáját, kiszűri belőle a már kész (gold_enriched) járműveket, és csak az új típusokat helyezi el a `catalog_discovery` várólistán, prioritás (darabszám) szerint rendezve. +2. **Watchdog (Őrkutya):** Óránként végigfésüli az adatbázist, és megkeresi azokat a feladatokat, amelyekbe a többi robot (Hunter, Researcher, Alchemist) beletört a bicskája vagy lefagyott feldolgozás közben. Ezeket visszaállítja alapállapotba. + +## 🗄️ Érintett Adatbázis Komponensek +- **Írás:** `data.catalog_discovery` (új modellek felvitele és státusz-visszaállítás). +- **Olvasás:** `data.vehicle_model_definitions` (létezik-e már a `gold_enriched` rekord?). +- **Olvasás/Frissítés:** `data.asset_catalog` (manual bootstrap ellenőrzés). + +## 🧠 Geo-logika és API Kezelés +- **Külső API:** `opendata.rdw.nl` (Lapozással, 10.000-es csomagokban). +- **Hibatűrés:** Exponenciális újrapróbálkozás (Exponential Backoff) Rate Limit (`HTTP 429`) esetén. +- **Állapotmegőrzés:** A legutolsó sikeres letöltés dátumát a `/app/temp/.last_rdw_sync` fájlban tárolja a felesleges API hívások és a Docker restartból adódó végtelen ciklusok elkerülése végett. + +## ⚙️ Logikai Folyamat (Heartbeat Loop) +A program egy végtelen ciklusban fut az alábbiak szerint: +1. `run_watchdog()`: Felszabadítja az 1 óránál régebben "processing" vagy "research_in_progress" állapotban lévő rekordokat. +2. `should_run_rdw_sync()`: Megvizsgálja, eltelt-e 30 nap az utolsó letöltés óta. +3. **HA IGEN:** Elindítja a `seed_from_rdw()`-t. Az SQL szintű szűrés (`WHERE NOT EXISTS`) biztosítja, hogy a mesteradatok érintetlenek maradjanak. +4. **Alvás:** A robot 3600 másodpercre (1 óra) elalszik, majd kezdi elölről az Őrkutya futtatásával. + +## 🧪 Tesztelési Forgatókönyv a Debugger számára +- **API Teszt:** A konténer logjában meg kell jelennie a "Lapozás: 0 - 10000 tételek analízise" üzenetnek, API hiba (`429`) esetén pedig a késleltetett újrapróbálkozásnak. +- **Konzisztencia Teszt:** Ha a `vehicle_model_definitions` táblában van egy "VW GOLF" `gold_enriched` státusszal, a Robot-0 nem szúrhatja be újra a `catalog_discovery` táblába. + +### 2. `vehicle_robot_0_strategist.py` (A Stratéga) +* **Miért készült?** Hogy a rendszer a leggyakoribb autókkal (pl. Suzuki, Toyota) kezdje a munkát, ne a ritka egzotikumokkal. +* **Hogyan működik?** Elemzi az RDW piacon lévő darabszámokat, és frissíti a várólista `priority_score` mezőjét a valós elterjedtség alapján. +* **Docker parancs:** `docker compose exec api python -m app.workers.vehicle.vehicle_robot_0_strategist` + +### 🤖 Robot-0-GB: GB Discovery Engine (A Brit Felfedező) + +## 🎯 Cél +Az angol piac speciális betöltője. Mivel a DVLA API nem listázható típusok szerint (csak rendszám alapján), ez a robot egy nyílt adathalmazt (CSV) olvas be. A CSV-ből kinyeri az elsődleges rendszámokat (VRM), és egy dedikált `gb_catalog_discovery` várólistára teszi őket, de csak azokat, amelyek még nincsenek a mesterkatalógusunkban! + +## 🗄️ Adatbázis Érintettség +- **Írás:** `data.gb_catalog_discovery` (id, vrm, make, model, status) +- **Differential Sync:** Szűr a `data.vehicle_model_definitions` tábla `gold_enriched` státusza alapján (meglévő autókat nem tesz a listára). + +## ⚙️ Folyamat +Napi egyszer lefut, végignyálazza a helyi `/mnt/nas/app_data/uk_mot_data.csv` fájlt. Ha új modellt lát, beírja a rendszámát `pending` státusszal. + +#### 🤖 Robot-1: Catalog Hunter (A Vadász) + +## 🎯 A Modul Célja és Masterbook 2 Illeszkedés +A Robot-1 az ökoszisztéma első szintű technikai adatbányásza. Feladata, hogy a Robot-0 (Discovery) által kijelölt, `pending` státuszú típusokhoz a lehető legpontosabb műszaki adatokat (köbcenti, lóerő, üzemanyag, motor kód, méretek) gyűjtse be az RDW hivatalos adatbázisából. + +## 🗄️ Érintett Adatbázis Komponensek +- **Olvasás/Írás:** `data.catalog_discovery` (Feladatok átvétele `pending` -> `processing`, majd lezárása `processed` státuszba). +- **Írás:** `data.vehicle_model_definitions` (Technikai rekordok létrehozása). +- **Zárolási Stratégia:** Szigorú `FOR UPDATE SKIP LOCKED` használata. Bármennyi példány futhat párhuzamosan, nem fognak összeakadni. + +## 🧠 Geo-logika és API Kezelés +- **Külső API-k:** - Fő adatok: `m9d7-ebf2.json` + - Üzemanyag/Károsanyag: `8ys7-d773.json` + - Motorblokk: `jh96-v4pq.json` +- **Hibatűrés:** Exponenciális újrapróbálkozás (Exponential Backoff) beépítve a Rate Limit (`HTTP 429`) és a hálózati szakadások ellen. A robot nem omlik össze, hanem kivár és újra próbálkozik. + +## ⚙️ Logikai Folyamat +1. Keres egy `pending` feladatot a várólistán (prioritás szerint csökkenve) és azonnal `processing`-re állítja. +2. Lekéri az RDW-ből a típushoz tartozó összes specifikus rendszámot (max 500 db/típus). +3. A rendszámok alapján lekéri a motor- és üzemanyag-specifikációkat. +4. `INSERT ... ON CONFLICT DO NOTHING` SQL logikával beszúrja az új technikai variánsokat a mestertáblába. Ha a variáns már létezik, csendben továbblép. +5. A feladatot `processed` státuszba helyezi, majd folytatja a következóvel. +* **Docker parancs:** `docker compose exec api python -m app.workers.vehicle.vehicle_robot_1_catalog_hunter` + +### 🤖 Robot-1-GB: GB Hunter (A DVLA Mesterlövész) + +## 🎯 Cél +A `gb_catalog_discovery` táblában lévő `pending` rendszámokra küld lekérdezést a hivatalos brit kormányszerver felé (DVLA VES API). Az így kapott 100%-ig hiteles technikai adatokat betölti az európai mestertáblába (`vehicle_model_definitions`) `ACTIVE` státusszal, ahonnan a Robot-3 (Alkimista) befejezi a munkát. + +## 🗄️ Adatbázis Érintettség +- **Atomi zárolás:** `FOR UPDATE SKIP LOCKED` a `gb_catalog_discovery` táblán. +- **Írás:** `data.vehicle_model_definitions` (`INSERT ... ON CONFLICT DO NOTHING`). + +## 🧠 Biztonság és API +- **API:** `driver-vehicle-licensing.api.gov.uk/vehicle-enquiry/v1/vehicles` +- **Kvóta Védelem:** A `QuotaManager` szigorúan figyeli a `DVLA_DAILY_LIMIT` változót az `.env` fájlból, megelőzve az API tiltást vagy túlszámlázást. + +### 🤖 Robot-2: Vehicle Researcher (A Mesterlövész Adatgyűjtő) + +## 🎯 A Modul Célja és Masterbook 2 Illeszkedés +A Robot-2 az "űrkitöltő" mikroszolgáltatás. Azokra a járművekre specializálódik, amelyeknél az RDW (Robot-1) nem tudott elegendő műszaki adatot biztosítani. Ahelyett, hogy ömlesztett weblapokat olvasna be (ami túlterhelné az AI GPU-t), a Robot-2 célzott "Mesterlövész" kereséseket (Targeted Searches) hajt végre strukturált autós adatbázisokban, és egy zajmentes aktát készít az Alkimista (Robot-3) számára. + +## 🗄️ Érintett Adatbázis Komponensek +- **Olvasás/Írás:** `data.vehicle_model_definitions` +- **Állapotátmenetek:** `unverified` / `awaiting_research` -> `research_in_progress` -> `awaiting_ai_synthesis` (vagy `suspended_research` ha 5 próbálkozás után sincs adat). +- **Zárolási Stratégia:** `FOR UPDATE SKIP LOCKED`, prioritást adva a Toyota modelleknek és a kevesebbet próbált rekordoknak. + +## 🧠 Geo-logika és API Kezelés +- **Tier 1 (Ingyenes):** DuckDuckGo aszinkron burkolóval, `site:ultimatespecs.com` és `site:auto-data.net` operátorokkal. +- **Tier 2 (Fizetős/Kvótás):** UK DVLA API (Későbbi integrációhoz előkészítve). +- **Védelmi Rendszerek:** - `QuotaManager`: Szigorúan naplózza a limitált API hívásokat egy lokális fájlba (`.quota_dvla.json`), megakadályozva a túlköltekezést. + - **Truncation:** A kontextust maximum 2500 karakterre vágja, megelőzve az LLM Out-of-Memory (OOM) hibáit. + +## ⚙️ Logikai Folyamat +1. Zárolja a megfelelő rekordot. +2. Párhuzamosan (`asyncio.gather`) indít 3 keresést a neten (Műszaki adatok, Folyadékok, Típushibák). +3. A kapott "snippeteket" egy strukturált `[SOURCE: XYZ]` formátumú szöveggé fűzi össze. +4. Ha a szöveg elég hosszú (>150 karakter), átadja az AI-nak. Ha nem, növeli a próbálkozások számát. +* **Docker parancs:** `docker compose exec api python -m app.workers.vehicle.vehicle_robot_2_researcher` + +### 🤖 Robot-3: Alchemist Pro (A Szintetizáló) + +## 🎯 A Modul Célja és Masterbook 2 Illeszkedés +A Robot-3 a rendszer "Agya". Ő az egyetlen, aki drága AI (LLM / Ollama) erőforrásokat használ. Feladata, hogy a Robot-1 (RDW) és Robot-2 (Web) által begyűjtött, sokszor hiányos vagy zajos technikai adatokat egyetlen, tökéletesen tiszta "Arany" (`gold_enriched`) rekorddá olvassza össze a `vehicle_catalog` (Mesterkatalógus) számára. + +## 🗄️ Érintett Adatbázis Komponensek +- **Olvasás/Frissítés:** `data.vehicle_model_definitions` (VMD) tábla. +- **Írás (Insert):** `data.vehicle_catalog` (Az Aranytábla). +- **Zárolási Stratégia:** Szigorú `FOR UPDATE SKIP LOCKED`. A `awaiting_ai_synthesis` (Robot-2 által készített) és az `ACTIVE` (Robot-1 által készített) státuszokat veszi fel. + +## 🧠 Geo-logika és API Kezelés +- **AI Hívás:** `AIService.get_clean_vehicle_data` (Helyi Ollama vagy külső LLM). +- **Költségvetés Védelem:** Beépített `daily_ai_limit` figyeli, hogy ne lépjük túl a megengedett napi hívásszámot. Ha elfogy a keret, a robot alvó módba kapcsol a következő napig. +- **Sane-Check (Józan ész ellenőrzés):** Beépített fizikai korlátok (pl. max 18000 ccm, max 1500 kW, kivéve teherautók) védik az adatbázist az AI "hallucinációitól". + +## ⚙️ Logikai Folyamat +1. Atomi lakatolással lefoglal egy feladatot és `ai_synthesis_in_progress` státuszba teszi. +2. Átadja a nyers adatokat (RDW + Web Context) az AI-nak. +3. Lefuttatja a "Sane Check"-et. Ha az AI hibázott, visszadobja az aktát `unverified` státuszba (hogy a Robot-2 újra megpróbálja). +4. **Hibrid Merge:** Az RDW hatósági adatai mindig felülírják az AI becsléseit! +5. Létrehozza a `vehicle_catalog` bejegyzést (`ON CONFLICT DO NOTHING` védelemmel). +6. Lezárja a VMD rekordot `gold_enriched` státusszal. +* **Docker parancs:** `docker compose exec api python -m app.workers.vehicle.vehicle_robot_3_alchemist_pro` + +### 6. `vehicle_robot_4_vin_auditor.py` (Alvázszám Hitelesítő) +* **Miért készült?** Hogy a felhasználók által beküldött konkrét járműveket (Assets) pontosan a helyes katalógus-variánshoz kösse. +* **Hogyan működik?** Dekódolja a VIN (Alváz) számokat az AI segítségével. Ha a megfejtett teljesítmény (kW) eltér a jelenlegitől, új katalógus-variánst hoz létre, és oda köti a járművet. +* **Docker parancs:** `docker compose exec api python -m app.workers.vehicle.vehicle_robot_4_vin_auditor` + +--- + +## 🚀 Indítási Segédlet (Launch Control) + +A robotok önállóan is indíthatók a fenti `docker compose exec ...` parancsokkal hibakeresés céljából, de a végleges működéshez a `docker-compose.yml` fájlban önálló szervizként (container) kell definiálni őket. + +**Rendszer újraindítása és a robotok aktiválása a háttérben:** +```bash +docker compose up -d --build \ No newline at end of file diff --git a/backend/app/workers/ocr/robot_1_ocr_processor.py b/backend/app/workers/ocr/robot_1_ocr_processor.py new file mode 100755 index 0000000..ec2f3fb --- /dev/null +++ b/backend/app/workers/ocr/robot_1_ocr_processor.py @@ -0,0 +1,131 @@ +# /opt/docker/dev/service_finder/backend/app/workers/ocr_robot.py +import asyncio +import os +import logging +from PIL import Image +from sqlalchemy import select, update +from app.db.session import AsyncSessionLocal +from app.models.document import Document +from app.models.identity import User +from app.services.ai_service import AIService +from app.core.config import settings + +# Logolás beállítása +logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] %(name)s: %(message)s') +logger = logging.getLogger("Robot-OCR-V3") + +class OCRRobot: + """ + Robot 3: Dokumentum elemző és adatkinyerő. + Kizárólag a Premium és VIP előfizetők dokumentumait dolgozza fel automatikusan. + """ + + @staticmethod + def _sync_resize_and_save(source: str, target: str): + """ Kép optimalizálása (szinkron végrehajtás a Pillow miatt). """ + with Image.open(source) as img: + # Konvertálás RGB-be (PNG/RGBA -> JPEG támogatás miatt) + rgb_img = img.convert('RGB') + # Max szélesség 1600px az MB 2.0 Vault szabályai szerint + if rgb_img.width > 1600: + ratio = 1600 / float(rgb_img.width) + new_height = int(float(rgb_img.height) * float(ratio)) + rgb_img = rgb_img.resize((1600, new_height), Image.Resampling.LANCZOS) + + rgb_img.save(target, "JPEG", quality=85, optimize=True) + + @classmethod + async def process_queue(cls): + """ A várólista feldolgozása. """ + async with AsyncSessionLocal() as db: + # 1. LOGIKA: Feladatok lekérése (Pending + Premium jogosultság) + # A 'SKIP LOCKED' biztosítja, hogy több robot ne akadjon össze + stmt = select(Document, User).join(User, Document.parent_id == User.scope_id).where( + Document.status == "pending_ocr", + User.subscription_plan.in_(["PREMIUM_PLUS", "VIP_PLUS", "PREMIUM", "VIP"]) + ).limit(5) + + res = await db.execute(stmt) + tasks = res.all() + + if not tasks: + return + + for doc, user in tasks: + try: + logger.info(f"📸 OCR megkezdése: {doc.original_name} (Szervezet: {user.scope_id})") + + # Státusz zárolása + doc.status = "processing" + await db.commit() + + # 2. LOGIKA: AI OCR hívás az AIService-en keresztül + # Itt feltételezzük, hogy a Document modellben tároljuk a temp_path-t + if not doc.file_hash: # Biztonsági check + raise ValueError("Hiányzó fájl hivatkozás.") + + temp_path = f"/app/temp/uploads/{doc.file_hash}" + + if not os.path.exists(temp_path): + raise FileNotFoundError(f"A forrásfájl nem található: {temp_path}") + + with open(temp_path, "rb") as f: + image_bytes = f.read() + + # AI felismerés (pl. Llama-Vision vagy GPT-4o) + ocr_result = await AIService.get_clean_vehicle_data( + make="OCR_SCAN", + raw_model=doc.parent_type, + v_type="document", + sources={"image_data": "raw_scan"} + ) + + if ocr_result: + # 3. LOGIKA: Vault mentés (NAS izoláció) + target_dir = os.path.join(settings.NAS_STORAGE_PATH, user.folder_slug or "common", "vault") + os.makedirs(target_dir, exist_ok=True) + + final_filename = f"{doc.id}.jpg" + final_path = os.path.join(target_dir, final_filename) + + # Kép feldolgozása külön szálon, hogy ne blokkolja az Async-et + loop = asyncio.get_event_loop() + await loop.run_in_executor(None, cls._sync_resize_and_save, temp_path, final_path) + + # 4. LOGIKA: Adatbázis frissítés (Gold Data előkészítés) + doc.ocr_data = ocr_result + doc.status = "processed" + doc.file_size = os.path.getsize(final_path) + + # Ideiglenes fájl takarítása + os.remove(temp_path) + logger.info(f"✅ Dokumentum sikeresen archiválva: {final_filename}") + else: + doc.status = "failed" + doc.error_log = "AI returned empty result" + + await db.commit() + + except Exception as e: + logger.error(f"❌ OCR Kritikus Hiba ({doc.id}): {str(e)}") + await db.rollback() + # Hibás státusz mentése + async with AsyncSessionLocal() as error_db: + await error_db.execute( + update(Document).where(Document.id == doc.id).values( + status="failed", + error_log=str(e) + ) + ) + await error_db.commit() + + @classmethod + async def run(cls): + """ Folyamatos futtatás (Service mode). """ + logger.info("🤖 Robot 3 (OCR) ONLINE - Figyeli a prémium dokumentumokat") + while True: + await cls.process_queue() + await asyncio.sleep(15) # 15 másodpercenkénti ellenőrzés + +if __name__ == "__main__": + asyncio.run(OCRRobot.run()) \ No newline at end of file diff --git a/backend/app/workers/service/service_robot_0_hunter.py b/backend/app/workers/service/service_robot_0_hunter.py new file mode 100755 index 0000000..b6c7928 --- /dev/null +++ b/backend/app/workers/service/service_robot_0_hunter.py @@ -0,0 +1,173 @@ +# /opt/docker/dev/service_finder/backend/app/workers/service_hunter.py +import asyncio +import httpx +import logging +import os +import hashlib +from datetime import datetime, timezone +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, text, update +from app.db.session import AsyncSessionLocal +from app.models.staged_data import ServiceStaging, DiscoveryParameter + +# Naplózás beállítása a Sentinel monitorozáshoz +logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] %(name)s: %(message)s') +logger = logging.getLogger("Robot-Continental-Scout-v1.3") + +class ServiceHunter: + """ + Robot v1.3.1: Continental Scout (Grid Search Edition) + Felelőssége: Új szervizpontok felfedezése külső API-k alapján. + """ + PLACES_NEW_URL = "https://places.googleapis.com/v1/places:searchNearby" + GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY") + + @classmethod + def _generate_fingerprint(cls, name: str, city: str, address: str) -> str: + """ + MD5 Ujjlenyomat generálása. + Ez biztosítja, hogy ha ugyanazt a helyet több rács-cellából is megtaláljuk, + ne jöjjön létre duplikált rekord. + """ + raw = f"{str(name).lower()}|{str(city).lower()}|{str(address).lower()[:10]}" + return hashlib.md5(raw.encode()).hexdigest() + + @classmethod + async def _get_city_bounds(cls, city: str, country_code: str): + """ Nominatim API hívás a város befoglaló téglalapjának lekéréséhez. """ + url = "https://nominatim.openstreetmap.org/search" + params = {"city": city, "country": country_code, "format": "json"} + headers = {"User-Agent": "ServiceFinder-Scout-v1.3/2.0 (contact@servicefinder.com)"} + + async with httpx.AsyncClient(headers=headers, timeout=10) as client: + try: + resp = await client.get(url, params=params) + if resp.status_code == 200 and resp.json(): + bbox = resp.json()[0].get("boundingbox") # [min_lat, max_lat, min_lon, max_lon] + return [float(x) for x in bbox] + except Exception as e: + logger.error(f"⚠️ Városhatár lekérdezési hiba ({city}): {e}") + return None + + @classmethod + async def get_google_places(cls, lat: float, lon: float): + """ Google Places V1 (New) API hívás. """ + if not cls.GOOGLE_API_KEY: + logger.error("❌ Google API Key hiányzik!") + return [] + + headers = { + "Content-Type": "application/json", + "X-Goog-Api-Key": cls.GOOGLE_API_KEY, + "X-Goog-FieldMask": "places.displayName,places.id,places.internationalPhoneNumber,places.websiteUri,places.formattedAddress,places.location" + } + # MB 2.0 szűrők: Csak releváns típusok + payload = { + "includedTypes": ["car_repair", "motorcycle_repair", "car_wash", "tire_shop"], + "maxResultCount": 20, + "locationRestriction": { + "circle": { + "center": {"latitude": lat, "longitude": lon}, + "radius": 1200.0 # 1.2km sugarú körök a jó átfedéshez + } + } + } + + async with httpx.AsyncClient(timeout=15) as client: + try: + resp = await client.post(cls.PLACES_NEW_URL, json=payload, headers=headers) + if resp.status_code == 200: + return resp.json().get("places", []) + logger.warning(f"Google API hiba: {resp.status_code} - {resp.text}") + except Exception as e: + logger.error(f"Google API hívás hiba: {e}") + return [] + + @classmethod + async def _save_to_staging(cls, db: AsyncSession, task, p_data: dict): + """ Adatmentés a staging táblába deduplikációval. """ + name = p_data.get('displayName', {}).get('text') + addr = p_data.get('formattedAddress', '') + f_print = cls._generate_fingerprint(name, task.city, addr) + + # Ellenőrzés, hogy létezik-e már (Ujjlenyomat alapján) + stmt = select(ServiceStaging).where(ServiceStaging.fingerprint == f_print) + existing = (await db.execute(stmt)).scalar_one_or_none() + + if existing: + # Csak a bizalmi pontot és az utolsó észlelést frissítjük + existing.trust_score += 2 + existing.updated_at = datetime.now(timezone.utc) + return + + # Új rekord létrehozása + new_entry = ServiceStaging( + name=name, + source="google_scout_v1.3", + external_id=p_data.get('id'), + fingerprint=f_print, + city=task.city, + full_address=addr, + contact_phone=p_data.get('internationalPhoneNumber'), + website=p_data.get('websiteUri'), + raw_data=p_data, + status="pending", + trust_score=30 # Alapértelmezett bizalmi szint + ) + db.add(new_entry) + + @classmethod + async def run_grid_search(cls, db: AsyncSession, task: DiscoveryParameter): + """ A város koordináta-alapú bejárása. """ + bbox = await cls._get_city_bounds(task.city, task.country_code or 'HU') + if not bbox: + return + + # Lépésközök meghatározása (kb. 1km = 0.01 fok) + lat_step = 0.012 + lon_step = 0.018 + + curr_lat = bbox[0] + while curr_lat < bbox[1]: + curr_lon = bbox[2] + while curr_lon < bbox[3]: + logger.info(f"🛰️ Cella pásztázása: {curr_lat:.4f}, {curr_lon:.4f} ({task.city})") + + places = await cls.get_google_places(curr_lat, curr_lon) + for p in places: + await cls._save_to_staging(db, task, p) + + await db.commit() # Cellánként mentünk, hogy ne vesszen el a munka + curr_lon += lon_step + await asyncio.sleep(0.3) # Rate limit védelem + curr_lat += lat_step + + @classmethod + async def run(cls): + """ A robot fő hurokfolyamata. """ + logger.info("🤖 Continental Scout ONLINE - Grid Engine Indul...") + while True: + async with AsyncSessionLocal() as db: + try: + # Aktív keresési feladatok lekérése + stmt = select(DiscoveryParameter).where(DiscoveryParameter.is_active == True) + tasks = (await db.execute(stmt)).scalars().all() + + for task in tasks: + # Csak akkor futtatjuk, ha már régen volt (pl. 30 naponta) + if not task.last_run_at or (datetime.now(timezone.utc) - task.last_run_at).days >= 30: + logger.info(f"🔎 Felderítés indítása: {task.city}") + await cls.run_grid_search(db, task) + + task.last_run_at = datetime.now(timezone.utc) + await db.commit() + + except Exception as e: + logger.error(f"💥 Kritikus hiba a Scout robotban: {e}") + await db.rollback() + + # 6 óránként ellenőrizzük, van-e új feladat + await asyncio.sleep(21600) + +if __name__ == "__main__": + asyncio.run(ServiceHunter.run()) \ No newline at end of file diff --git a/backend/app/workers/service/service_robot_1_scout_osm.py b/backend/app/workers/service/service_robot_1_scout_osm.py new file mode 100755 index 0000000..b549a2b --- /dev/null +++ b/backend/app/workers/service/service_robot_1_scout_osm.py @@ -0,0 +1,136 @@ +# /opt/docker/dev/service_finder/backend/app/workers/service/service_robot_1_scout_osm.py +import asyncio +import hashlib +import logging +import httpx +from urllib.parse import quote +from sqlalchemy import select, text +from app.database import AsyncSessionLocal +from app.models.service import ServiceStaging # JAVÍTOTT IMPORT ÚTVONAL! +import re + +# Logolás MB 2.0 szabvány szerint +logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] %(name)s: %(message)s') +logger = logging.getLogger("Service-Robot-1-OSM") + +class OSMScout: + """ + Service Robot 1: OSM Scout + Feladata: Új szerviz jelöltek porszívózása az OpenStreetMap-ről. + """ + HUNGARY_BBOX = "45.7,16.1,48.6,22.9" + OVERPASS_URL = "http://overpass-api.de/api/interpreter?data=" + + @staticmethod + def normalize_name(text_val: str) -> str: + """ Alapvető tisztítás a pontosabb ujjlenyomathoz. """ + if not text_val: return "" + # Kisbetű, ékezetek maradnak, de a felesleges szóközök és írásjelek mennek + text_val = text_val.lower().strip() + text_val = re.sub(r'\s+', ' ', text_val) + return text_val + + @staticmethod + def generate_fingerprint(name: str, city: str) -> str: + """ Egyedi azonosító generálása a duplikációk elkerülésére. """ + n = OSMScout.normalize_name(name) + c = OSMScout.normalize_name(city) + raw = f"{n}|{c}" + return hashlib.md5(raw.encode()).hexdigest() + + async def fetch_osm_data(self, query_part: str): + """ Lekérdezés az Overpass API-tól. """ + query = f'[out:json][timeout:120];(node{query_part}({self.HUNGARY_BBOX});way{query_part}({self.HUNGARY_BBOX}););out center;' + async with httpx.AsyncClient(timeout=150.0) as client: + for attempt in range(3): + try: + resp = await client.get(self.OVERPASS_URL + quote(query)) + if resp.status_code == 200: + return resp.json().get('elements', []) + elif resp.status_code == 429: # Túl sok kérés az OSM felé + logger.warning(f"⚠️ OSM Rate Limit, várakozás...") + await asyncio.sleep(5 * (attempt + 1)) + else: + logger.warning(f"⚠️ OSM API válasz: {resp.status_code}") + except Exception as e: + if attempt == 2: + logger.error(f"❌ Overpass hiba végleges: {e}") + await asyncio.sleep(2) + return [] + + async def run_once(self): + """ Egy teljes kör lefutása. """ + logger.info("🛰️ OSM Scout porszívózás indítása...") + + # Keressük az összes autóval kapcsolatos shop-ot és amenitit + queries = ['["shop"~"car_repair|tyres|car_parts"]', '["amenity"~"car_wash|fuel"]'] + all_elements = [] + for q in queries: + elements = await self.fetch_osm_data(q) + all_elements.extend(elements) + logger.info(f"🔍 Lekérdezés kész: {q} -> {len(elements)} találat") + await asyncio.sleep(2) # Kíméljük az OSM szervereket + + async with AsyncSessionLocal() as db: + added = 0 + skipped = 0 + + for node in all_elements: + tags = node.get('tags', {}) + name = tags.get('name', tags.get('operator')) + if not name: continue + + city = tags.get('addr:city', 'Ismeretlen') + postcode = tags.get('addr:postcode', '') + f_print = self.generate_fingerprint(name, city) + + # Ellenőrizzük, hogy létezik-e már ez a szerviz a Staging táblában + stmt = select(ServiceStaging.id).where(ServiceStaging.fingerprint == f_print) + existing = (await db.execute(stmt)).scalar_one_or_none() + + if existing is None: + full_addr = f"{postcode} {city}, {tags.get('addr:street', '')} {tags.get('addr:housenumber', '')}".strip(" ,") + + # Bővített JSON a nyers adatokhoz, mert a modelled nem tartalmazza a source és trust oszlopokat + raw_payload = { + "osm_tags": tags, + "source": "osm_scout_v2", + "trust_score": 20 + } + + new_entry = ServiceStaging( + name=name, + postal_code=postcode, + city=city, + full_address=full_addr, + fingerprint=f_print, + status="pending", + raw_data=raw_payload + ) + db.add(new_entry) + added += 1 + else: + skipped += 1 + + try: + await db.commit() + logger.info(f"✅ Kör véget ért. Új szervizek: {added}, Ismert (kihagyva): {skipped}") + except Exception as e: + await db.rollback() + logger.error(f"❌ Adatbázis mentési hiba: {e}") + + async def loop(self): + """ Folyamatos működés (hetente egyszer frissít). """ + logger.info("🤖 OSM Scout ONLINE") + while True: + try: + await self.run_once() + except Exception as e: + logger.error(f"Kritikus hiba a főciklusban: {e}") + + logger.info("😴 Robot elalvás (7 nap)... OSM adatok ritkán változnak.") + await asyncio.sleep(86400 * 7) # 7 naponta egyszer nézzük át (felesleges naponta) + +if __name__ == "__main__": + scout = OSMScout() + asyncio.run(scout.loop()) \ No newline at end of file diff --git a/backend/app/workers/service/service_robot_2_researcher.py b/backend/app/workers/service/service_robot_2_researcher.py new file mode 100644 index 0000000..286551f --- /dev/null +++ b/backend/app/workers/service/service_robot_2_researcher.py @@ -0,0 +1,106 @@ +import asyncio +import logging +import warnings +from sqlalchemy import text, update +from app.database import AsyncSessionLocal +from app.models.service import ServiceStaging + +warnings.filterwarnings("ignore", category=RuntimeWarning, module='duckduckgo_search') +from duckduckgo_search import DDGS + +logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] Robot-2-Service-Researcher: %(message)s') +logger = logging.getLogger("Service-Robot-2-Researcher") + +class ServiceResearcher: + """ + Service Robot 2: Internetes Adatgyűjtő (Atomi Zárolással) + """ + def __init__(self): + self.search_timeout = 15.0 + + async def fetch_source(self, query: str) -> str: + """ Célzott DuckDuckGo keresés. """ + try: + def search(): + with DDGS() as ddgs: + results = ddgs.text(query, max_results=3) + return [f"- {r.get('body', '')}" for r in results] if results else [] + + results = await asyncio.wait_for(asyncio.to_thread(search), timeout=self.search_timeout) + if not results: return "" + return "\n".join(results) + except Exception as e: + logger.debug(f"Keresési hiba: {e}") + return "" + + async def process_service(self, db, service_id: int, name: str, city: str): + logger.info(f"🔎 Szerviz kutatása weben: {name} ({city})") + + # Keressük a szerviz nyomait a neten + query = f"{name} autó szerviz {city} szolgáltatások vélemények" + web_context = await self.fetch_source(query) + + try: + if len(web_context) > 50: + # Van adat, átadjuk a Robot-3-nak elemzésre! + await db.execute( + update(ServiceStaging) + .where(ServiceStaging.id == service_id) + .values( + raw_data=func.jsonb_set(ServiceStaging.raw_data, '{web_context}', f'"{web_context}"'), + status='enrich_ready' + ) + ) + logger.info(f"✅ Webtalálat rögzítve: {name}") + else: + # Nincs adat, "szellem" szerviz + await db.execute( + update(ServiceStaging) + .where(ServiceStaging.id == service_id) + .values(status='no_web_presence') + ) + logger.warning(f"⚠️ Nincs webes nyoma: {name}, jegelve.") + + await db.commit() + except Exception as e: + await db.rollback() + logger.error(f"🚨 Mentési hiba ({service_id}): {e}") + + @classmethod + async def run(cls): + self_instance = cls() + logger.info("🚀 Service Researcher ONLINE (Atomi Zárolás Patch)") + + while True: + try: + async with AsyncSessionLocal() as db: + # ATOMI ZÁROLÁS + query = text(""" + UPDATE data.service_staging + SET status = 'research_in_progress' + WHERE id = ( + SELECT id FROM data.service_staging + WHERE status = 'pending' + FOR UPDATE SKIP LOCKED + LIMIT 1 + ) + RETURNING id, name, city; + """) + result = await db.execute(query) + task = result.fetchone() + await db.commit() + + if task: + s_id, s_name, s_city = task + async with AsyncSessionLocal() as process_db: + await self_instance.process_service(process_db, s_id, s_name, s_city) + await asyncio.sleep(2) # Kíméljük a keresőt + else: + await asyncio.sleep(30) + + except Exception as e: + logger.error(f"💀 Kritikus hiba a főciklusban: {e}") + await asyncio.sleep(10) + +if __name__ == "__main__": + asyncio.run(ServiceResearcher.run()) \ No newline at end of file diff --git a/backend/app/workers/service/service_robot_3_enricher.py b/backend/app/workers/service/service_robot_3_enricher.py new file mode 100755 index 0000000..d24f602 --- /dev/null +++ b/backend/app/workers/service/service_robot_3_enricher.py @@ -0,0 +1,115 @@ +import asyncio +import logging +import json +from sqlalchemy import select, text, update, func +from app.database import AsyncSessionLocal # JAVÍTVA +from app.models.service import ServiceProfile, ExpertiseTag, ServiceExpertise, ServiceStaging + +# Logolás MB 2.0 szabvány +logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] %(name)s: %(message)s') +logger = logging.getLogger("Service-Robot-3-Enricher") + +class ServiceEnricher: + """ + Service Robot 3: Professional Classifier (Atomi Zárolással) + """ + + @staticmethod + async def match_expertise_to_service(db, service_profile_id: int, scraped_text: str): + """ Kulcsszó-alapú elemző motor az ExpertiseTag tábla alapján. """ + if not scraped_text: return + + tags_query = await db.execute(select(ExpertiseTag).where(ExpertiseTag.is_official == True)) + all_tags = tags_query.scalars().all() + + found_any = False + for tag in all_tags: + match_count = 0 + for kw in (tag.search_keywords or []): + if kw.lower() in scraped_text.lower(): + match_count += 1 + + if match_count > 0: + existing_check = await db.execute( + select(ServiceExpertise).where( + ServiceExpertise.service_id == service_profile_id, + ServiceExpertise.expertise_id == tag.id + ) + ) + + if not existing_check.scalar(): + new_link = ServiceExpertise( + service_id=service_profile_id, + expertise_id=tag.id, + confidence_level=min(match_count, 2) + ) + db.add(new_link) + found_any = True + logger.info(f"✅ {tag.key} szakma azonosítva a szerviznél.") + + if found_any: + await db.commit() + + @classmethod + async def run_worker(cls): + logger.info("🧠 Service Enricher ONLINE - Szakmai elemzés indítása (Atomi Zárolás)") + + while True: + try: + async with AsyncSessionLocal() as db: + # 1. Zárolunk egy "enrich_ready" szervizt a Staging táblából + query = text(""" + UPDATE data.service_staging + SET status = 'enriching' + WHERE id = ( + SELECT id FROM data.service_staging + WHERE status = 'enrich_ready' + FOR UPDATE SKIP LOCKED + LIMIT 1 + ) + RETURNING id, name, city, full_address, fingerprint, raw_data; + """) + result = await db.execute(query) + task = result.fetchone() + await db.commit() + + if task: + s_id, name, city, address, fprint, raw_data = task + web_context = raw_data.get('web_context', '') if isinstance(raw_data, dict) else '' + + async with AsyncSessionLocal() as process_db: + try: + # 2. Áttesszük a végleges ServiceProfile táblába (mert már van elég adatunk a webről) + profile_stmt = text(""" + INSERT INTO data.service_profiles + (fingerprint, status, trust_score, location, is_verified, bio) + VALUES (:fp, 'active', 40, ST_SetSRID(ST_MakePoint(19.04, 47.49), 4326), false, :bio) + ON CONFLICT (fingerprint) DO UPDATE SET bio = EXCLUDED.bio + RETURNING id; + """) # Megjegyzés: A GPS koordinátát (19.04, 47.49) majd a Validator (Robot-4) pontosítja! + + p_result = await process_db.execute(profile_stmt, {"fp": fprint, "bio": name + " - " + city}) + profile_id = p_result.scalar() + await process_db.commit() + + # 3. Futtatjuk a kulcsszó-elemzést + await cls.match_expertise_to_service(process_db, profile_id, web_context) + + # 4. Lezárjuk a Staging feladatot + await process_db.execute(text("UPDATE data.service_staging SET status = 'processed' WHERE id = :id"), {"id": s_id}) + await process_db.commit() + + except Exception as e: + await process_db.rollback() + logger.error(f"Hiba a dúsítás során ({s_id}): {e}") + await process_db.execute(text("UPDATE data.service_staging SET status = 'error' WHERE id = :id"), {"id": s_id}) + await process_db.commit() + else: + await asyncio.sleep(15) + + except Exception as e: + logger.error(f"💀 Kritikus hiba a főciklusban: {e}") + await asyncio.sleep(10) + +if __name__ == "__main__": + asyncio.run(ServiceEnricher.run_worker()) \ No newline at end of file diff --git a/backend/app/workers/service/service_robot_4_validator_google.py b/backend/app/workers/service/service_robot_4_validator_google.py new file mode 100644 index 0000000..38bb663 --- /dev/null +++ b/backend/app/workers/service/service_robot_4_validator_google.py @@ -0,0 +1,199 @@ +import asyncio +import httpx +import logging +import os +import sys +import json +from datetime import datetime +from sqlalchemy import text, update, func +from app.database import AsyncSessionLocal +from app.models.service import ServiceProfile + +logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] Robot-4-Validator: %(message)s', stream=sys.stdout) +logger = logging.getLogger("Service-Robot-4-Google-Validator") + +class QuotaManager: + """ Szigorú napi limit figyelő a Google API-hoz, hogy soha többé ne legyen 250$-os számla! """ + def __init__(self, service_name: str, daily_limit: int): + self.service_name = service_name + self.daily_limit = daily_limit + self.state_file = f"/app/temp/.quota_{service_name}.json" + self._ensure_file() + + def _ensure_file(self): + os.makedirs(os.path.dirname(self.state_file), exist_ok=True) + if not os.path.exists(self.state_file): + with open(self.state_file, 'w') as f: + json.dump({"date": datetime.now().strftime("%Y-%m-%d"), "count": 0}, f) + + def can_make_request(self) -> bool: + with open(self.state_file, 'r') as f: + data = json.load(f) + + today = datetime.now().strftime("%Y-%m-%d") + if data["date"] != today: + data = {"date": today, "count": 0} + + if data["count"] >= self.daily_limit: + return False + + data["count"] += 1 + with open(self.state_file, 'w') as f: + json.dump(data, f) + return True + +class GoogleValidator: + """ + Service Robot 4: Mesterlövész Validátor + Egyedi, célzott Google Text Search hívások a meglévő szervizek pontosítására. + """ + PLACES_TEXT_URL = "https://places.googleapis.com/v1/places:searchText" + + def __init__(self): + self.api_key = os.getenv("GOOGLE_API_KEY") + # Napi limit: pl. 100 lekérdezés = kb. $3/nap maximum! + self.daily_limit = int(os.getenv("GOOGLE_DAILY_LIMIT", "100")) + self.quota = QuotaManager("google_places", self.daily_limit) + self.headers = { + "Content-Type": "application/json", + "X-Goog-Api-Key": self.api_key, + # Csak a legszükségesebb mezőket kérjük, hogy olcsó maradjon az API hívás! + "X-Goog-FieldMask": "places.id,places.location,places.rating,places.userRatingCount,places.regularOpeningHours,places.internationalPhoneNumber,places.websiteUri" + } + + async def fetch_place_details(self, client: httpx.AsyncClient, name: str, bio_context: str): + if not self.api_key: + logger.error("❌ HIÁNYZIK A GOOGLE_API_KEY a .env fájlból!") + return None + + # A keresési kifejezés: pl. "Kovács Autószerviz Budapest" + query_text = f"{name} {bio_context}" + payload = {"textQuery": query_text, "maxResultCount": 1} + + for attempt in range(2): + try: + resp = await client.post(self.PLACES_TEXT_URL, json=payload, headers=self.headers) + if resp.status_code == 200: + places = resp.json().get("places", []) + return places[0] if places else "NOT_FOUND" + elif resp.status_code == 429: + await asyncio.sleep(2) + else: + logger.error(f"Google API hiba: {resp.status_code}") + return None + except Exception as e: + logger.debug(f"Hálózati hiba a Google felé: {e}") + await asyncio.sleep(1) + return None + + async def validate_service(self, db, profile_id: int, fingerprint: str, bio: str): + logger.info(f"📍 Validálás indul: {fingerprint}") + + if not self.quota.can_make_request(): + logger.warning("🛑 NAPI GOOGLE KVÓTA ELÉRVE! A Validátor holnapig alszik.") + return "QUOTA_EXCEEDED" + + name = fingerprint.split('|')[0] if '|' in fingerprint else fingerprint + + async with httpx.AsyncClient(timeout=10.0) as client: + place_data = await self.fetch_place_details(client, name, bio) + + try: + if place_data == "NOT_FOUND": + logger.warning(f"⚠️ A Google nem ismeri: {name}. Szellem szerviz?") + await db.execute( + update(ServiceProfile) + .where(ServiceProfile.id == profile_id) + .values(status='ghost', last_audit_at=func.now()) + ) + elif place_data: + # Kinyerjük a pontos GPS koordinátákat + loc = place_data.get("location", {}) + lat, lon = loc.get("latitude"), loc.get("longitude") + + # Összeállítjuk az adatokat + updates = { + "google_place_id": place_data.get("id"), + "rating": place_data.get("rating"), + "user_ratings_total": place_data.get("userRatingCount"), + "contact_phone": place_data.get("internationalPhoneNumber"), + "website": place_data.get("websiteUri"), + "opening_hours": place_data.get("regularOpeningHours", {}), + "is_verified": True, + "status": "active", + "trust_score": ServiceProfile.trust_score + 50, # A Google megerősítette! + "last_audit_at": func.now() + } + + # PostGIS Geometry frissítése, ha van GPS! + if lat and lon: + logger.info(f"🗺️ Pontos koordináta megvan: {lat}, {lon}") + updates["location"] = func.ST_SetSRID(func.ST_MakePoint(lon, lat), 4326) + + await db.execute( + update(ServiceProfile) + .where(ServiceProfile.id == profile_id) + .values(**updates) + ) + logger.info(f"✅ Szerviz hitelesítve és GPS pozicionálva: {name}") + else: + # API Hiba, később újra próbáljuk + return "ERROR" + + await db.commit() + return "DONE" + + except Exception as e: + await db.rollback() + logger.error(f"🚨 Adatbázis hiba a validálásnál: {e}") + return "ERROR" + + @classmethod + async def run(cls): + self_instance = cls() + logger.info("🎯 Service Validator (Robot-4) ONLINE - Várakozás dúsított szervizekre...") + + while True: + try: + async with AsyncSessionLocal() as db: + # ATOMI ZÁROLÁS: Keresünk egy aktív, de még nem validált szervizt + query = text(""" + UPDATE data.service_profiles + SET status = 'validation_in_progress' + WHERE id = ( + SELECT id FROM data.service_profiles + WHERE is_verified = false + AND status NOT IN ('validation_in_progress', 'ghost') + FOR UPDATE SKIP LOCKED + LIMIT 1 + ) + RETURNING id, fingerprint, bio; + """) + + result = await db.execute(query) + task = result.fetchone() + await db.commit() + + if task: + p_id, fprint, bio = task + async with AsyncSessionLocal() as process_db: + status = await self_instance.validate_service(process_db, p_id, fprint, bio) + + # Ha API hiba volt, visszaállítjuk az eredeti állapotot + if status == "ERROR": + await process_db.execute(text("UPDATE data.service_profiles SET status = 'active' WHERE id = :id"), {"id": p_id}) + await process_db.commit() + + if status == "QUOTA_EXCEEDED": + await asyncio.sleep(3600) # Elalszik 1 órára, ha kimerült a napi limit + else: + await asyncio.sleep(1) # Rate limit védelem + else: + await asyncio.sleep(30) # Nincs új szerviz + + except Exception as e: + logger.error(f"💀 Kritikus hiba a Validator főciklusban: {e}") + await asyncio.sleep(10) + +if __name__ == "__main__": + asyncio.run(GoogleValidator().run()) \ No newline at end of file diff --git a/backend/app/workers/system/system_robot_2_service_auditor.py b/backend/app/workers/system/system_robot_2_service_auditor.py new file mode 100755 index 0000000..bfd5f49 --- /dev/null +++ b/backend/app/workers/system/system_robot_2_service_auditor.py @@ -0,0 +1,107 @@ +# /app/app/workers/system/system_robot_2_service_auditor.py +import asyncio +import logging +from datetime import datetime, timezone +from sqlalchemy import select, and_, update +from app.database import AsyncSessionLocal +from app.models.organization import Organization, OrgType +from app.models.service import ServiceProfile +from app.models.staged_data import ServiceStaging + +# MB 2.0 Naplózás +logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s]: %(message)s') +logger = logging.getLogger("System-Robot-2-ServiceAuditor") + +class ServiceAuditor: + """ + System Robot 2: Service Auditor & Judge + Feladata: + 1. Meglévő szervizek auditálása (ne legyenek "halott" adatok). + 2. Staging adatok automatikus élesítése, ha a bizalmi szint eléri a küszöböt. + """ + + TRUST_THRESHOLD = 80 # Ezen pontszám felett automatikusan élesítünk + + @classmethod + async def promote_staging_data(cls): + """ + AZ AUTOMATA BÍRÓ: + Megnézi a Staging táblát, és ha valami elérte a ponthatárt, + automatikusan átemeli az éles profilok közé. + """ + async with AsyncSessionLocal() as db: + stmt = select(ServiceStaging).where( + and_( + ServiceStaging.status == "researched", + ServiceStaging.trust_score >= cls.TRUST_THRESHOLD + ) + ) + result = await db.execute(stmt) + to_promote = result.scalars().all() + + for stage in to_promote: + logger.info(f"⚖️ Automatikus élesítés (Admin nélkül): {stage.name} (Bizalom: {stage.trust_score})") + + # Itt jön az átemelő logika: + # 1. Organization létrehozása + # 2. ServiceProfile létrehozása + # 3. ExpertiseTags átmásolása + + stage.status = "promoted" + + await db.commit() + + @classmethod + async def audit_existing_services(cls): + """ Karbantartás: Megszűnt helyek inaktiválása. """ + async with AsyncSessionLocal() as db: + # Csak az aktív szervizeket nézzük + stmt = select(Organization).where( + and_( + Organization.org_type == OrgType.service, + Organization.is_active == True + ) + ) + result = await db.execute(stmt) + services = result.scalars().all() + + for service in services: + try: + # Itt futhat le egy külső csekk (pl. weboldal él-e még?) + is_still_open = True + + stmt_profile = select(ServiceProfile).where(ServiceProfile.organization_id == service.id) + profile_res = await db.execute(stmt_profile) + profile = profile_res.scalar_one_or_none() + + if not is_still_open: + service.is_active = False + if profile: + profile.status = 'closed' + logger.warning(f"⚠️ Szerviz inaktiválva: {service.name}") + else: + if profile: + profile.last_audit_at = datetime.now(timezone.utc) + + await asyncio.sleep(0.5) # Rate limit védelem + + except Exception as e: + logger.error(f"❌ Hiba audit közben ({service.name}): {e}") + + await db.commit() + + @classmethod + async def run(cls): + logger.info("⚖️ System Auditor ONLINE - Bírói és Karbantartó üzemmód") + while True: + # 1. Először élesítjük az új felfedezéseket + await cls.promote_staging_data() + + # 2. Utána karbantartjuk a meglévőket + await cls.audit_existing_services() + + # Naponta egyszer fut le a teljes kör + await asyncio.sleep(86400) + +if __name__ == "__main__": + asyncio.run(ServiceAuditor.run()) \ No newline at end of file diff --git a/backend/app/workers/vehicle/vehicle_robot_0_discovery_engine.py b/backend/app/workers/vehicle/vehicle_robot_0_discovery_engine.py new file mode 100755 index 0000000..eb64f76 --- /dev/null +++ b/backend/app/workers/vehicle/vehicle_robot_0_discovery_engine.py @@ -0,0 +1,201 @@ +import asyncio +import httpx +import logging +import os +import sys +from datetime import datetime, timedelta +from sqlalchemy import text, select +from app.database import AsyncSessionLocal +from app.models.asset import AssetCatalog + +# MB 2.0 Szigorú naplózás +logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] Robot-0-Discovery: %(message)s', stream=sys.stdout) +logger = logging.getLogger("Vehicle-Robot-0-Discovery") + +class DiscoveryEngine: + """ + THOUGHT PROCESS (IPARI ÜZEMMÓD 2.0): + 1. Őrkutya (Watchdog): Megkeresi és kiszabadítja a beragadt feladatokat óránként. + 2. Differential Sync (Különbözeti Szinkron): Csak a hiányzó vagy új modelleket rögzíti, a gold_enriched-eket kihagyja. + 3. Monthly Scheduler: Havonta egyszer tölti le a teljes RDW adatbázist lapozva. + """ + + RDW_TOKEN = os.getenv("RDW_APP_TOKEN") + HEADERS = {"X-App-Token": RDW_TOKEN} if RDW_TOKEN else {} + SYNC_STATE_FILE = "/app/temp/.last_rdw_sync" # Állapotfájl, hogy Docker újrainduláskor se kezdje elölről azonnal + + @staticmethod + async def run_watchdog(): + """ 1. FÁZIS: Az Őrkutya (Dead-Letter Queue Manager) """ + logger.info("🐕 Őrkutya: Beragadt feladatok keresése a rendszerben...") + try: + async with AsyncSessionLocal() as db: + # A) Hunter takarítás (visszaállítás pending-re, ha a Hunter lefagyott) + res1 = await db.execute(text("UPDATE data.catalog_discovery SET status = 'pending' WHERE status = 'processing' RETURNING id;")) + hunter_resets = len(res1.fetchall()) + if hunter_resets > 0: + logger.warning(f"🔄 {hunter_resets} db beragadt Hunter feladat (processing) visszaállítva 'pending'-re.") + + # B) AI Robotok takarítása (2 órás timeout) + query2 = text(""" + UPDATE data.vehicle_model_definitions + SET status = CASE + WHEN status = 'research_in_progress' THEN 'unverified' + WHEN status = 'ai_synthesis_in_progress' THEN 'awaiting_ai_synthesis' + END + WHERE status IN ('research_in_progress', 'ai_synthesis_in_progress') + AND updated_at < NOW() - INTERVAL '2 hours' + RETURNING id; + """) + res2 = await db.execute(query2) + ai_resets = len(res2.fetchall()) + if ai_resets > 0: + logger.warning(f"🔄 {ai_resets} db beragadt AI feladat visszaállítva.") + + await db.commit() + except Exception as e: + logger.error(f"❌ Őrkutya hiba: {e}") + + @staticmethod + async def seed_manual_bootstrap(): + """ 2. FÁZIS: Alapozó adatok rögzítése """ + initial_data = [ + {"make": "AUDI", "model": "A4", "generation": "B8 (2008-2015)", "vehicle_class": "car"}, + {"make": "BMW", "model": "3 SERIES", "generation": "F30 (2012-2019)", "vehicle_class": "car"} + ] + try: + async with AsyncSessionLocal() as db: + for item in initial_data: + stmt = select(AssetCatalog).where(AssetCatalog.make == item["make"], AssetCatalog.model == item["model"]) + if not (await db.execute(stmt)).scalar_one_or_none(): + db.add(AssetCatalog(**item)) + await db.commit() + except Exception as e: + logger.warning(f"Manual bootstrap hiba (Ignorálható, ha az adatbázis már tele van): {e}") + + @classmethod + async def fetch_with_retry(cls, client: httpx.AsyncClient, url: str, params: dict, retries: int = 3): + """ Hibatűrő HTTP kérés API leállások ellen. """ + for attempt in range(retries): + try: + resp = await client.get(url, params=params, headers=cls.HEADERS) + if resp.status_code == 200: + return resp + elif resp.status_code == 429: + await asyncio.sleep(2 ** attempt) + else: + return None + except httpx.RequestError: + if attempt == retries - 1: + return None + await asyncio.sleep(2 ** attempt) + return None + + @classmethod + async def seed_from_rdw(cls): + """ 3. FÁZIS: Távoli felfedezés - KÜLÖNBÖZETI SZINKRONIZÁCIÓ (Differential Sync) """ + logger.info("📥 RDW TÖMEGES LETÖLTÉS: Új modellek keresése (Differential Sync)...") + + limit = 10000 + offset = 0 + inserted_count = 0 + updated_count = 0 + + async with httpx.AsyncClient(timeout=60.0) as client: + while True: + params = { + "$select": "merk,handelsbenaming,voertuigsoort,count(*) as total", + "$group": "merk,handelsbenaming,voertuigsoort", + "$order": "total DESC", + "$limit": limit, + "$offset": offset + } + + resp = await cls.fetch_with_retry(client, "https://opendata.rdw.nl/resource/m9d7-ebf2.json", params) + if not resp: break + raw_data = resp.json() + if not raw_data: break + + logger.info(f"📊 Lapozás: {offset} - {offset + len(raw_data)} tételek analízise...") + + async with AsyncSessionLocal() as db: + for entry in raw_data: + make = str(entry.get("merk", "")).upper().strip() + model = str(entry.get("handelsbenaming", "")).upper().strip() + v_kind = entry.get("voertuigsoort", "") + total_count = int(entry.get("total", 0)) + + if not make or not model: continue + + if "Personenauto" in v_kind: v_class = 'car' + elif "Motorfiets" in v_kind: v_class = 'motorcycle' + else: v_class = 'truck' + + # A MÁGIA: Különbözeti Szinkronizáció SQL + query = text(""" + INSERT INTO data.catalog_discovery (make, model, vehicle_class, status, priority_score) + SELECT :make, :model, :v_class, 'pending', :priority + WHERE NOT EXISTS ( + SELECT 1 FROM data.vehicle_model_definitions + WHERE make = :make AND marketing_name = :model AND status = 'gold_enriched' + ) + ON CONFLICT (make, model) + DO UPDATE SET priority_score = EXCLUDED.priority_score + WHERE data.catalog_discovery.status != 'processed' + RETURNING xmax; + """) + + result = await db.execute(query, { + "make": make, "model": model, "v_class": v_class, "priority": total_count + }) + + row = result.fetchone() + if row: + if row[0] == 0: inserted_count += 1 # Új beszúrás + else: updated_count += 1 # Meglévő frissítése + + await db.commit() + offset += limit + await asyncio.sleep(1) + + logger.info(f"✅ RDW Szinkron kész! Új modellek a listán: {inserted_count} | Frissített prioritások: {updated_count}") + + # Sikeres futás regisztrálása a fájlrendszeren + os.makedirs(os.path.dirname(cls.SYNC_STATE_FILE), exist_ok=True) + with open(cls.SYNC_STATE_FILE, 'w') as f: + f.write(datetime.now().isoformat()) + + @classmethod + def should_run_rdw_sync(cls) -> bool: + """ Ellenőrzi, hogy eltelt-e 30 nap a legutóbbi sikeres RDW szinkronizáció óta. """ + if not os.path.exists(cls.SYNC_STATE_FILE): + return True + try: + with open(cls.SYNC_STATE_FILE, 'r') as f: + last_sync = datetime.fromisoformat(f.read().strip()) + return datetime.now() - last_sync > timedelta(days=30) + except Exception: + return True + + @classmethod + async def run(cls): + """ FŐ CIKLUS: Havi ütemező és Óránkénti Őrkutya """ + logger.info("🚀 ÉLES ÜZEM: Discovery Engine (Differential Sync) & Watchdog indítása...") + await cls.seed_manual_bootstrap() + + while True: + # 1. Óránkénti takarítás + await cls.run_watchdog() + + # 2. Havi szinkronizáció ellenőrzése + if cls.should_run_rdw_sync(): + await cls.seed_from_rdw() + else: + logger.info("🛌 Az RDW szinkronizáció már lefutott az elmúlt 30 napban. Ugrás...") + + # 3. Alvás 1 órát (Heartbeat) + logger.info("⏱️ A Discovery Engine most 1 órát pihen a következő Őrkutya futásig.") + await asyncio.sleep(3600) + +if __name__ == "__main__": + asyncio.run(DiscoveryEngine.run()) \ No newline at end of file diff --git a/backend/app/workers/vehicle/vehicle_robot_0_gb_discovery.py b/backend/app/workers/vehicle/vehicle_robot_0_gb_discovery.py new file mode 100644 index 0000000..f4eef5d --- /dev/null +++ b/backend/app/workers/vehicle/vehicle_robot_0_gb_discovery.py @@ -0,0 +1,81 @@ +# /app/app/workers/vehicle/vehicle_robot_0_gb_discovery.py +import asyncio +import logging +import csv +import os +import sys +from sqlalchemy import text +from app.database import AsyncSessionLocal + +logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] Robot-0-GB: %(message)s', stream=sys.stdout) +logger = logging.getLogger("Robot-0-GB-Discovery") + +class GBDiscoveryEngine: + """ + UK Open Data (CSV) beolvasó. + Célja a valós brit rendszámok kinyerése API hívások számára. + """ + CSV_FILE_PATH = "/mnt/nas/app_data/uk_mot_data.csv" # Ide kell majd betenned a letöltött CSV-t + + @classmethod + async def process_csv(cls): + if not os.path.exists(cls.CSV_FILE_PATH): + logger.warning(f"Nincs CSV fájl a {cls.CSV_FILE_PATH} útvonalon. Alvás...") + return + + logger.info("🇬🇧 GB Discovery: CSV feldolgozás indítása...") + inserted = 0 + + # Létrehozzuk a GB várólistát (ha még nem létezne) + async with AsyncSessionLocal() as db: + await db.execute(text(""" + CREATE TABLE IF NOT EXISTS data.gb_catalog_discovery ( + id SERIAL PRIMARY KEY, + vrm VARCHAR(20) UNIQUE NOT NULL, + make VARCHAR(100), + model VARCHAR(100), + status VARCHAR(20) DEFAULT 'pending' + ); + """)) + await db.commit() + + # CSV olvasás (Példa oszlopok: vrm, make, model) + with open(cls.CSV_FILE_PATH, mode='r', encoding='utf-8') as file: + reader = csv.DictReader(file) + for row in reader: + vrm = row.get("vrm", "").strip().replace(" ", "").upper() + make = row.get("make", "").strip().upper() + model = row.get("model", "").strip().upper() + + if not vrm or not make: continue + + # Szűrünk: Csak akkor tesszük be, ha ez az autó még nincs gold_enriched állapotban! + query = text(""" + INSERT INTO data.gb_catalog_discovery (vrm, make, model) + SELECT :vrm, :make, :model + WHERE NOT EXISTS ( + SELECT 1 FROM data.vehicle_model_definitions + WHERE make = :make AND marketing_name = :model AND status = 'gold_enriched' + ) + ON CONFLICT (vrm) DO NOTHING; + """) + res = await db.execute(query, {"vrm": vrm, "make": make, "model": model}) + if res.rowcount > 0: + inserted += 1 + + # Időnként commitolunk, hogy ne egye meg a RAM-ot + if inserted % 1000 == 0: + await db.commit() + logger.info(f"Edig betöltve: {inserted} új GB rendszám...") + + await db.commit() + logger.info(f"✅ GB CSV Feldolgozva. Új rendszámok a várólistán: {inserted}") + + @classmethod + async def run(cls): + while True: + await cls.process_csv() + await asyncio.sleep(86400) # Napi 1x fut le (24 óra) + +if __name__ == "__main__": + asyncio.run(GBDiscoveryEngine.run()) \ No newline at end of file diff --git a/backend/app/workers/vehicle/vehicle_robot_0_strategist.py b/backend/app/workers/vehicle/vehicle_robot_0_strategist.py new file mode 100755 index 0000000..ef9d8b4 --- /dev/null +++ b/backend/app/workers/vehicle/vehicle_robot_0_strategist.py @@ -0,0 +1,108 @@ +# /app/app/workers/vehicle/vehicle_robot_0_strategist.py +import asyncio +import httpx +import logging +import os +from sqlalchemy import text +from app.database import AsyncSessionLocal # MB 2.0 Standard import + +# Sentinel rendszerhez illesztett logolás +logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s]: %(message)s') +logger = logging.getLogger("Vehicle-Robot-0-Strategist") + +class Robot0Strategist: + """ + THOUGHT PROCESS: + 1. A robot célja a 'priority_score' meghatározása valós piaci adatok (RDW) alapján. + 2. Első lépésben ellenőrizzük a sémát (Self-healing), hogy létezik-e az oszlop. + 3. A kategóriákat (autó, motor, teher) szétválasztjuk, hogy célzott prioritásokat kapjunk. + 4. Az 'ON CONFLICT' logika garantálja, hogy ne rontsuk el a már feldolgozott (processed) sorokat. + 5. A prioritás alapja a darabszám: minél több van egy típusból, annál előrébb kerül a listán. + """ + RDW_API = "https://opendata.rdw.nl/resource/m9d7-ebf2.json" + RDW_TOKEN = os.getenv("RDW_APP_TOKEN") + HEADERS = {"X-App-Token": RDW_TOKEN} if RDW_TOKEN else {} + + # Holland típusok leképezése belső kategóriákra + CATEGORIES = [ + {"name": "car", "rdw_types": ["'Personenauto'"]}, + {"name": "motorcycle", "rdw_types": ["'Motorfiets'"]}, + {"name": "truck", "rdw_types": ["'Bedrijfsauto'", "'Vrachtwagen'", "'Opleggertrekker'"]}, + {"name": "other", "rdw_types": ["NOT IN ('Personenauto', 'Motorfiets', 'Bedrijfsauto', 'Vrachtwagen', 'Opleggertrekker')"]} + ] + + async def get_popular_makes(self, vehicle_class: str, rdw_types: list): + """ Piaci adatok lekérése darabszám szerinti sorrendben. """ + if "NOT IN" in rdw_types[0]: + type_filter = f"voertuigsoort {rdw_types[0]}" + else: + type_filter = " OR ".join([f"voertuigsoort = {t}" for t in rdw_types]) + + params = { + "$select": "merk, count(*) AS darabszam", + "$where": type_filter, + "$group": "merk", + "$order": "darabszam DESC", + "$limit": 500 + } + + async with httpx.AsyncClient(timeout=45.0) as client: + try: + resp = await client.get(self.RDW_API, params=params, headers=self.HEADERS) + if resp.status_code == 200: + return resp.json() + logger.error(f"⚠️ RDW API Hiba: {resp.status_code}") + return [] + except Exception as e: + logger.error(f"❌ Kapcsolati hiba az RDW felé: {e}") + return [] + + async def run(self): + logger.info("🚀 Robot 0 (Strategist) ONLINE - Piaci elemzés indítása...") + + # --- SÉMA ELLENŐRZÉS (Golyóálló megoldás) --- + async with AsyncSessionLocal() as db: + try: + await db.execute(text("ALTER TABLE data.catalog_discovery ADD COLUMN IF NOT EXISTS priority_score INTEGER DEFAULT 0;")) + await db.commit() + logger.info("✅ Adatbázis séma rendben (priority_score aktív).") + except Exception as e: + await db.rollback() + logger.error(f"⚠️ Séma hiba: {e}") + + for category in self.CATEGORIES: + v_class = category["name"] + logger.info(f"📊 {v_class.upper()} hadosztály prioritásainak számítása...") + + makes = await self.get_popular_makes(v_class, category["rdw_types"]) + if not makes: continue + + added_count = 0 + for item in makes: + make_name = str(item.get("merk", "")).upper().strip() + if not make_name: continue + + count = int(item.get("darabszam", 0)) + + async with AsyncSessionLocal() as db: + try: + # UPSERT: Beállítjuk a prioritást, de nem bántjuk a már kész rekordokat + query = text(""" + INSERT INTO data.catalog_discovery (make, model, vehicle_class, status, source, attempts, priority_score) + VALUES (:make, 'ALL_VARIANTS', :class, 'pending', 'STRATEGIST-V2', 0, :score) + ON CONFLICT (make, model, vehicle_class) + DO UPDATE SET priority_score = :score + WHERE data.catalog_discovery.status NOT IN ('processed', 'in_progress'); + """) + + await db.execute(query, {"make": make_name, "class": v_class, "score": count}) + await db.commit() + added_count += 1 + except Exception as e: + await db.rollback() + logger.warning(f"❌ Hiba a márka rögzítésekor ({make_name}): {e}") + + logger.info(f"✅ {v_class.upper()} kategória kész: {added_count} márka rangsorolva.") + +if __name__ == "__main__": + asyncio.run(Robot0Strategist().run()) \ No newline at end of file diff --git a/backend/app/workers/vehicle/vehicle_robot_1_catalog_hunter.py b/backend/app/workers/vehicle/vehicle_robot_1_catalog_hunter.py new file mode 100755 index 0000000..3d3d48f --- /dev/null +++ b/backend/app/workers/vehicle/vehicle_robot_1_catalog_hunter.py @@ -0,0 +1,207 @@ +import asyncio +import httpx +import logging +import os +import re +import sys +from sqlalchemy import text, select +from sqlalchemy.dialects.postgresql import insert +from app.database import AsyncSessionLocal +from app.models.vehicle_definitions import VehicleModelDefinition + +logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] Robot-1-Hunter: %(message)s', stream=sys.stdout) +logger = logging.getLogger("Robot-1") + +class CatalogHunter: + """ + Vehicle Robot 1.9.2: The Invincible Mega-Hunter (CONCURRENCY PATCH) + Szigorú sor-zárolás (SKIP LOCKED) és exponenciális API újrapróbálkozás. + """ + RDW_MAIN = "https://opendata.rdw.nl/resource/m9d7-ebf2.json" + RDW_FUEL = "https://opendata.rdw.nl/resource/8ys7-d773.json" + RDW_ENGINE = "https://opendata.rdw.nl/resource/jh96-v4pq.json" + + RDW_TOKEN = os.getenv("RDW_APP_TOKEN") + HEADERS = {"X-App-Token": RDW_TOKEN} if RDW_TOKEN else {} + BATCH_SIZE = 50 + + @classmethod + def normalize(cls, text_val: str) -> str: + if not text_val: return "" + return re.sub(r'[^a-zA-Z0-9]', '', text_val).lower() + + @classmethod + def parse_int(cls, value) -> int: + try: + if value is None or str(value).strip() == "": return 0 + return int(float(value)) + except (ValueError, TypeError): return 0 + + @classmethod + def parse_float(cls, value) -> float: + try: + if value is None or str(value).strip() == "": return 0.0 + return float(value) + except (ValueError, TypeError): return 0.0 + + @classmethod + async def fetch_with_retry(cls, client: httpx.AsyncClient, url: str, retries: int = 3): + """ Hibatűrő HTTP kérés API leállások és Rate Limitek ellen. """ + for attempt in range(retries): + try: + resp = await client.get(url, headers=cls.HEADERS) + if resp.status_code == 200: + return resp + elif resp.status_code == 429: # Rate limit + await asyncio.sleep(2 ** attempt) # 1, 2, 4 másodperc pihenő + else: + return resp # Egyéb hiba (pl 404), nem próbáljuk újra + except httpx.RequestError as e: + if attempt == retries - 1: + logger.debug(f"API Hiba végleges ({url}): {e}") + raise + await asyncio.sleep(2 ** attempt) + return None + + @classmethod + async def fetch_tech_details(cls, client, plate): + results = { + "power_kw": 0, "engine_code": None, "euro_class": None, + "fuel_desc": "Unknown", "co2": 0, "consumption": 0.0 + } + try: + f_resp = await cls.fetch_with_retry(client, f"{cls.RDW_FUEL}?kenteken={plate}") + if f_resp and f_resp.status_code == 200 and f_resp.json(): + f = f_resp.json()[0] + p1 = cls.parse_int(f.get("netto_maximum_vermogen") or f.get("nettomaximumvermogen")) + p2 = cls.parse_int(f.get("nominaal_continu_maximum_vermogen") or f.get("nominaalcontinuvermogen")) + results.update({ + "power_kw": max(p1, p2), + "fuel_desc": f.get("brandstof_omschrijving") or "Unknown", + "euro_class": f.get("euro_klasse") or f.get("uitlaatemissieniveau"), + "co2": cls.parse_int(f.get("co2_uitstoot_gecombineerd")), + "consumption": cls.parse_float(f.get("brandstofverbruik_gecombineerd")) + }) + + e_resp = await cls.fetch_with_retry(client, f"{cls.RDW_ENGINE}?kenteken={plate}") + if e_resp and e_resp.status_code == 200 and e_resp.json(): + results["engine_code"] = e_resp.json()[0].get("motorcode") + except Exception as e: + logger.debug(f"Hiba a technikai részleteknél ({plate}): {e}") + return results + + @classmethod + async def process_make_model(cls, db, task_id, make_name, model_name, v_class, priority): + clean_make = make_name.strip().upper() + clean_model = model_name.strip().upper() + logger.info(f"🎯 IPARI ADATBÁNYÁSZAT INDUL: {clean_make} {clean_model}") + + offset = 0 + async with httpx.AsyncClient(timeout=30.0) as client: + while True: + params = f"merk={clean_make}&handelsbenaming={clean_model}&$limit={cls.BATCH_SIZE}&$offset={offset}&$order=kenteken DESC" + try: + r = await cls.fetch_with_retry(client, f"{cls.RDW_MAIN}?{params}") + batch = r.json() if r and r.status_code == 200 else [] + except Exception: break + + if not batch: break + + for item in batch: + try: + plate = item.get("kenteken") + if not plate: continue + + variant = item.get("variant") or "UNKNOWN" + version = item.get("uitvoering") or "UNKNOWN" + ccm = cls.parse_int(item.get("cilinderinhoud")) + + norm_name = cls.normalize(clean_model.replace(clean_make, "").strip() or clean_model) + + tech = await cls.fetch_tech_details(client, plate) + + stmt = insert(VehicleModelDefinition).values( + make=clean_make, + marketing_name=clean_model, + normalized_name=norm_name, + variant_code=variant, + version_code=version, + type_approval_number=item.get("typegoedkeuringsnummer"), + technical_code=plate, + engine_capacity=ccm, + power_kw=tech["power_kw"], + fuel_type=tech["fuel_desc"], + engine_code=tech["engine_code"], + seats=cls.parse_int(item.get("aantal_zitplaatsen")), + doors=cls.parse_int(item.get("aantal_deuren")), + width=cls.parse_int(item.get("breedte")), + wheelbase=cls.parse_int(item.get("wielbasis")), + list_price=cls.parse_int(item.get("catalogusprijs")), + max_speed=cls.parse_int(item.get("maximale_constructiesnelheid")), + towing_weight_unbraked=cls.parse_int(item.get("maximum_massa_trekken_ongeremd")), + towing_weight_braked=cls.parse_int(item.get("maximum_trekken_massa_geremd")), + curb_weight=cls.parse_int(item.get("massa_ledig_voertuig")), + max_weight=cls.parse_int(item.get("technische_max_massa_voertuig") or item.get("toegestane_maximum_massa_voertuig")), + body_type=item.get("inrichting"), + co2_emissions_combined=tech["co2"], + fuel_consumption_combined=tech["consumption"], + euro_classification=tech["euro_class"], + cylinders=cls.parse_int(item.get("aantal_cilinders")), + vehicle_class=v_class, + priority_score=priority, + status="ACTIVE", + source="MEGA-HUNTER-v1.9.2" + ) + + do_nothing_stmt = stmt.on_conflict_do_nothing( + index_elements=['make', 'normalized_name', 'variant_code', 'version_code', 'fuel_type'] + ) + + await db.execute(do_nothing_stmt) + + except Exception as e: + logger.warning(f"⚠️ Hiba a sor feldolgozásakor ({plate}): {e}") + + try: + await db.commit() + except Exception as e: + await db.rollback() + logger.error(f"❌ Batch commit hiba (Ignorálva): {e}") + + offset += len(batch) + if offset >= 500: break + await asyncio.sleep(0.5) # Lassítjuk kicsit a terhelést + + # Discovery státusz frissítése + await db.execute(text("UPDATE data.catalog_discovery SET status = 'processed' WHERE id = :id"), {"id": task_id}) + await db.commit() + + @classmethod + async def run(cls): + logger.info("🤖 Invincible Mega-Hunter v1.9.2 ONLINE (CONCURRENCY PATCHED)") + while True: + async with AsyncSessionLocal() as db: + # ATOMI ZÁROLÁS (Race condition ellenszere) + # Keresünk egy pending feladatot, azonnal zároljuk és átállítjuk processingre! + query = text(""" + UPDATE data.catalog_discovery + SET status = 'processing' + WHERE id = ( + SELECT id FROM data.catalog_discovery + WHERE status = 'pending' + ORDER BY priority_score DESC + FOR UPDATE SKIP LOCKED + LIMIT 1 + ) + RETURNING id, make, model, vehicle_class, priority_score; + """) + task = (await db.execute(query)).fetchone() + await db.commit() + + if task: + await cls.process_make_model(db, task[0], task[1], task[2], task[3], task[4]) + else: + await asyncio.sleep(30) + +if __name__ == "__main__": + asyncio.run(CatalogHunter.run()) \ No newline at end of file diff --git a/backend/app/workers/vehicle/vehicle_robot_1_catalog_hunter.py.old.1.7 b/backend/app/workers/vehicle/vehicle_robot_1_catalog_hunter.py.old.1.7 new file mode 100755 index 0000000..3dbc011 --- /dev/null +++ b/backend/app/workers/vehicle/vehicle_robot_1_catalog_hunter.py.old.1.7 @@ -0,0 +1,228 @@ +import asyncio +import httpx +import logging +import os +import re +import sys +from sqlalchemy import text, select +from app.database import AsyncSessionLocal +from app.models.vehicle_definitions import VehicleModelDefinition + +# MB 2.0 Szigorú naplózás +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s [%(levelname)s] Robot-1-Hunter: %(message)s', + stream=sys.stdout +) +logger = logging.getLogger("Robot-1") + +class CatalogHunter: + """ + Vehicle Robot 1.7.3: Mega-Hunter (Industrial Master Version) + Teljes körű RDW adatbányászat Variant/Version szintű granuláltsággal. + """ + RDW_MAIN = "https://opendata.rdw.nl/resource/m9d7-ebf2.json" + RDW_FUEL = "https://opendata.rdw.nl/resource/8ys7-d773.json" + RDW_ENGINE = "https://opendata.rdw.nl/resource/jh96-v4pq.json" + + RDW_TOKEN = os.getenv("RDW_APP_TOKEN") + HEADERS = {"X-App-Token": RDW_TOKEN} if RDW_TOKEN else {} + BATCH_SIZE = 50 + + @classmethod + def normalize(cls, text_val: str) -> str: + if not text_val: return "" + return re.sub(r'[^a-zA-Z0-9]', '', text_val).lower() + + @classmethod + def parse_int(cls, value) -> int: + try: + if value is None or str(value).strip() == "": return 0 + return int(float(value)) + except (ValueError, TypeError): return 0 + + @classmethod + def parse_float(cls, value) -> float: + try: + if value is None or str(value).strip() == "": return 0.0 + return float(value) + except (ValueError, TypeError): return 0.0 + + @classmethod + async def fetch_tech_details(cls, client, plate): + """ Extra technikai adatok (kW, Euro, CO2, Motorkód) párhuzamos lekérése. """ + urls = { + "fuel": f"{cls.RDW_FUEL}?kenteken={plate}", + "engine": f"{cls.RDW_ENGINE}?kenteken={plate}" + } + results = { + "power_kw": 0, + "engine_code": None, + "euro_class": None, + "fuel_desc": "Unknown", + "co2": 0, + "consumption": 0.0 + } + try: + resps = await asyncio.gather(*[client.get(u, headers=cls.HEADERS) for u in urls.values()]) + + # Üzemanyag és emisszió (8ys7-d773) + if resps[0].status_code == 200 and resps[0].json(): + f = resps[0].json()[0] + p1 = cls.parse_int(f.get("netto_maximum_vermogen") or f.get("nettomaximumvermogen")) + p2 = cls.parse_int(f.get("nominaal_continu_maximum_vermogen") or f.get("nominaalcontinuvermogen")) + results.update({ + "power_kw": max(p1, p2), + "fuel_desc": f.get("brandstof_omschrijving") or "Unknown", + "euro_class": f.get("euro_klasse") or f.get("uitlaatemissieniveau"), + "co2": cls.parse_int(f.get("co2_uitstoot_gecombineerd")), + "consumption": cls.parse_float(f.get("brandstofverbruik_gecombineerd")) + }) + + # Motorkód (jh96-v4pq) + if resps[1].status_code == 200 and resps[1].json(): + results["engine_code"] = resps[1].json()[0].get("motorcode") + except Exception as e: + logger.error(f"❌ RDW-Extra hiba ({plate}): {e}") + return results + + @classmethod + async def process_make_model(cls, db, task_id, make_name, model_name, v_class, priority): + clean_make = make_name.strip().upper() + clean_model = model_name.strip().upper() + logger.info(f"🎯 MEGA-VADÁSZAT INDUL: {clean_make} {clean_model}") + + current_offset = 0 + async with httpx.AsyncClient(timeout=30.0) as client: + while True: + params = { + "merk": clean_make, + "handelsbenaming": clean_model, + "$limit": cls.BATCH_SIZE, + "$offset": current_offset, + "$order": "kenteken DESC" + } + try: + r = await client.get(cls.RDW_MAIN, params=params, headers=cls.HEADERS) + batch = r.json() if r.status_code == 200 else [] + except Exception: break + + if not batch: + await db.execute(text("UPDATE data.catalog_discovery SET status = 'processed' WHERE id = :id"), {"id": task_id}) + await db.commit() + logger.info(f"🏁 {clean_make} {clean_model} minden variánsa feldolgozva.") + return + + for item in batch: + try: + plate = item.get("kenteken") + if not plate: continue + + # Alapadatok azonosítása + variant = item.get("variant") + version = item.get("uitvoering") # Az Execution/Version kód + ccm = cls.parse_int(item.get("cilinderinhoud")) + raw_model = str(item.get("handelsbenaming", "Unknown")).upper() + model_name_clean = raw_model.replace(clean_make, "").strip() or raw_model + norm_name = cls.normalize(model_name_clean) + + # Extra technikai mélyfúrás (kW, Fuel, Engine) + tech = await cls.fetch_tech_details(client, plate) + + # Ellenőrzés: Létezik-e már ez a pontos technikai variáns? + stmt = select(VehicleModelDefinition).where( + VehicleModelDefinition.make == clean_make, + VehicleModelDefinition.normalized_name == norm_name, + VehicleModelDefinition.engine_capacity == ccm, + VehicleModelDefinition.variant_code == variant, + VehicleModelDefinition.version_code == version, + VehicleModelDefinition.fuel_type == tech["fuel_desc"] + ).limit(1) + + existing = (await db.execute(stmt)).scalar_one_or_none() + + if existing: + # Meglévő rekord frissítése a prioritással és hiányzó adatokkal + existing.priority_score = priority + if tech["power_kw"] > 0: existing.power_kw = tech["power_kw"] + if tech["engine_code"]: existing.engine_code = tech["engine_code"] + if tech["co2"] > 0: existing.co2_emissions_combined = tech["co2"] + else: + # ÚJ REKORD LÉTREHOZÁSA - MINDEN ADAT MEZŐVEL + db.add(VehicleModelDefinition( + make=clean_make, + marketing_name=model_name_clean, + normalized_name=norm_name, + variant_code=variant, + version_code=version, + type_approval_number=item.get("typegoedkeuringsnummer"), + technical_code=plate, # Kötelező mező! + engine_capacity=ccm, + power_kw=tech["power_kw"], + fuel_type=tech["fuel_desc"], + engine_code=tech["engine_code"], + # Fizikai méretek és súlyok (RDW Main-ből) + seats=cls.parse_int(item.get("aantal_zitplaatsen")), + doors=cls.parse_int(item.get("aantal_deuren")), + width=cls.parse_int(item.get("breedte")), + wheelbase=cls.parse_int(item.get("wielbasis")), + list_price=cls.parse_int(item.get("catalogusprijs")), + max_speed=cls.parse_int(item.get("maximale_constructiesnelheid")), + towing_weight_unbraked=cls.parse_int(item.get("maximum_massa_trekken_ongeremd")), + towing_weight_braked=cls.parse_int(item.get("maximum_trekken_massa_geremd")), + curb_weight=cls.parse_int(item.get("massa_ledig_voertuig")), + max_weight=cls.parse_int(item.get("technische_max_massa_voertuig") or item.get("toegestane_maximum_massa_voertuig")), + body_type=item.get("inrichting"), + # Emissziós és környezeti adatok (RDW Extra-ból) + co2_emissions_combined=tech["co2"], + fuel_consumption_combined=tech["consumption"], + euro_classification=tech["euro_class"], + cylinders=cls.parse_int(item.get("aantal_cilinders")), + # Meta adatok + vehicle_class=v_class, + priority_score=priority, + status="ACTIVE", + source="MEGA-HUNTER-v1.7.3" + )) + except Exception as e: + logger.warning(f"⚠️ Hiba a sor feldolgozásakor ({plate}): {e}") + + # Batch commit 50 soronként + await db.commit() + current_offset += len(batch) + + # Biztonsági korlát: egy típusból ne szedjünk le többet, mint ami a variációkhoz kell + if current_offset >= 300: break + await asyncio.sleep(0.1) + + @classmethod + async def run(cls): + logger.info("🤖 Mega-Hunter Robot v1.7.3 ONLINE") + while True: + try: + async with AsyncSessionLocal() as db: + # Legmagasabb prioritású modellek bekérése a Discovery listából + query = text(""" + SELECT id, make, model, vehicle_class, priority_score + FROM data.catalog_discovery + WHERE status IN ('pending', 'processing') + ORDER BY priority_score DESC + LIMIT 1 + """) + task = (await db.execute(query)).fetchone() + + if task: + # Állapot rögzítése a "dupla munka" ellen + await db.execute(text("UPDATE data.catalog_discovery SET status = 'processing' WHERE id = :id"), {"id": task[0]}) + await db.commit() + + await cls.process_make_model(db, task[0], task[1], task[2], task[3], task[4]) + else: + logger.info("😴 Nincs több feladat, pihenés 30 másodpercig...") + await asyncio.sleep(30) + except Exception as e: + logger.error(f"💀 Kritikus hiba a futtatás során: {e}") + await asyncio.sleep(10) + +if __name__ == "__main__": + asyncio.run(CatalogHunter.run()) \ No newline at end of file diff --git a/backend/app/workers/vehicle/vehicle_robot_1_catalog_hunter.py.old1.0 b/backend/app/workers/vehicle/vehicle_robot_1_catalog_hunter.py.old1.0 new file mode 100755 index 0000000..d369fc7 --- /dev/null +++ b/backend/app/workers/vehicle/vehicle_robot_1_catalog_hunter.py.old1.0 @@ -0,0 +1,173 @@ +# /app/app/workers/vehicle/vehicle_robot_1_catalog_hunter.py +import asyncio +import httpx +import logging +import os +import re +from sqlalchemy import text, select, update +from app.database import AsyncSessionLocal +from app.models.vehicle_definitions import VehicleModelDefinition + +# MB 2.0 Naplózás +logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] Robot-1-Hunter: %(message)s') +logger = logging.getLogger("Robot-1") + +class CatalogHunter: + RDW_MAIN = "https://opendata.rdw.nl/resource/m9d7-ebf2.json" + RDW_FUEL = "https://opendata.rdw.nl/resource/8ys7-d773.json" + RDW_ENGINE = "https://opendata.rdw.nl/resource/jh96-v4pq.json" + + RDW_TOKEN = os.getenv("RDW_APP_TOKEN") + HEADERS = {"X-App-Token": RDW_TOKEN} if RDW_TOKEN else {} + BATCH_SIZE = 50 + + @classmethod + def normalize(cls, text_val: str) -> str: + if not text_val: return "" + return re.sub(r'[^a-zA-Z0-9]', '', text_val).lower() + + @classmethod + def parse_int(cls, value) -> int: + try: + if value is None or str(value).strip() == "": return 0 + return int(float(value)) + except (ValueError, TypeError): return 0 + + @classmethod + async def fetch_extra_tech(cls, client, plate): + params = {"kenteken": plate} + results = {"power_kw": 0, "euro_klasse": None, "fuel_desc": "Unknown", "engine_code": None} + try: + resp_fuel, resp_eng = await asyncio.gather( + client.get(cls.RDW_FUEL, params=params, headers=cls.HEADERS), + client.get(cls.RDW_ENGINE, params=params, headers=cls.HEADERS) + ) + if resp_fuel.status_code == 200: + fuel_rows = resp_fuel.json() + max_p = 0 + f_types = [] + for row in fuel_rows: + p1 = cls.parse_int(row.get("netto_maximum_vermogen") or row.get("nettomaximumvermogen")) + p2 = cls.parse_int(row.get("nominaal_continu_maximum_vermogen") or row.get("nominaalcontinuvermogen")) + p = max(p1, p2) + if p > max_p: max_p = p + f = row.get("brandstof_omschrijving") + if f and f not in f_types: f_types.append(f) + if not results["euro_klasse"]: + results["euro_klasse"] = row.get("uitlaatemissieniveau") or row.get("euro_klasse") + results["power_kw"] = max_p + results["fuel_desc"] = ", ".join(f_types) if f_types else "Unknown" + if resp_eng.status_code == 200: + eng_rows = resp_eng.json() + if eng_rows: results["engine_code"] = eng_rows[0].get("motorcode") + except Exception as e: + logger.error(f"❌ RDW-Extra hiba ({plate}): {e}") + return results + + @classmethod + async def process_make_model(cls, db, task_id, make_name, model_name, v_class, priority): + clean_make = make_name.strip().upper() + clean_model = model_name.strip().upper() + logger.info(f"🎯 VADÁSZAT INDUL: {clean_make} {clean_model} (Prio: {priority})") + + current_offset = 0 + async with httpx.AsyncClient(timeout=30.0) as client: + while True: + params = { + "merk": clean_make, + "handelsbenaming": clean_model, + "$limit": cls.BATCH_SIZE, + "$offset": current_offset, + "$order": "kenteken DESC" + } + try: + r = await client.get(cls.RDW_MAIN, params=params, headers=cls.HEADERS) + batch = r.json() if r.status_code == 200 else [] + except Exception: break + + if not batch: + await db.execute(text("UPDATE data.catalog_discovery SET status = 'processed' WHERE id = :id"), {"id": task_id}) + await db.commit() + logger.info(f"🏁 {clean_make} {clean_model} feldolgozva.") + return + + for item in batch: + try: + plate = item.get("kenteken") + if not plate: continue + raw_model = str(item.get("handelsbenaming", "Unknown")).upper() + model_name_clean = raw_model.replace(clean_make, "").strip() or raw_model + norm_name = cls.normalize(model_name_clean) + ccm = cls.parse_int(item.get("cilinderinhoud")) + + tech = await cls.fetch_extra_tech(client, plate) + + # Ellenőrizzük, van-e már ilyen technikai variációnk + stmt = select(VehicleModelDefinition).where( + VehicleModelDefinition.make == clean_make, + VehicleModelDefinition.normalized_name == norm_name, + VehicleModelDefinition.engine_capacity == ccm, + VehicleModelDefinition.fuel_type == tech["fuel_desc"] + ).limit(1) + + existing = (await db.execute(stmt)).scalar_one_or_none() + + if existing: + # Csak frissítjük, ha találtunk pontosabb adatot + if tech["engine_code"]: existing.engine_code = tech["engine_code"] + if tech["power_kw"] > 0: existing.power_kw = tech["power_kw"] + existing.priority_score = priority # Prioritás frissítése + else: + # ÚJ REKORD LÉTREHOZÁSA + db.add(VehicleModelDefinition( + make=clean_make, + marketing_name=model_name_clean, + normalized_name=norm_name, + marketing_name_aliases=[raw_model], + technical_code=plate, + fuel_type=tech["fuel_desc"], + engine_capacity=ccm, + engine_code=tech["engine_code"], + power_kw=tech["power_kw"], + cylinders=cls.parse_int(item.get("aantal_cilinders")), + euro_classification=tech["euro_klasse"], + vehicle_class=v_class, + priority_score=priority, + status="ACTIVE", # <--- EZ KELL A RÖNTGENNEK! + source="PRECISION-HUNTER-v2.1" + )) + except Exception as e: + logger.warning(f"⚠️ Hiba a sor feldolgozásakor ({plate}): {e}") + + await db.commit() + current_offset += len(batch) + # Ha már van elég variációnk ebből a típusból, nem kell mind a 100.000 autót átnézni + if current_offset >= 500: break + await asyncio.sleep(0.1) + + @classmethod + async def run(cls): + logger.info("🤖 Vehicle Catalog Hunter ONLINE") + while True: + async with AsyncSessionLocal() as db: + # Lekérjük a prioritásos feladatokat + query = text(""" + SELECT id, make, model, vehicle_class, priority_score + FROM data.catalog_discovery + WHERE status IN ('pending', 'processing') + ORDER BY priority_score DESC + LIMIT 1 + """) + task = (await db.execute(query)).fetchone() + + if task: + # status 'processing'-re állítása, hogy más robot ne nyúljon hozzá + await db.execute(text("UPDATE data.catalog_discovery SET status = 'processing' WHERE id = :id"), {"id": task[0]}) + await db.commit() + + await cls.process_make_model(db, task[0], task[1], task[2], task[3], task[4]) + else: + await asyncio.sleep(30) + +if __name__ == "__main__": + asyncio.run(CatalogHunter.run()) \ No newline at end of file diff --git a/backend/app/workers/vehicle/vehicle_robot_1_gb_hunter.py b/backend/app/workers/vehicle/vehicle_robot_1_gb_hunter.py new file mode 100644 index 0000000..8db7024 --- /dev/null +++ b/backend/app/workers/vehicle/vehicle_robot_1_gb_hunter.py @@ -0,0 +1,192 @@ +import asyncio +import httpx +import logging +import os +import sys +import json +from datetime import datetime +from sqlalchemy import text, func +from app.database import AsyncSessionLocal +from app.models.vehicle_definitions import VehicleModelDefinition + +logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] Robot-1-GB: %(message)s', stream=sys.stdout) +logger = logging.getLogger("Robot-1-GB-Hunter") + +class QuotaManager: + """ Szigorú napi limit figyelő a DVLA API-hoz """ + def __init__(self, service_name: str, daily_limit: int): + self.service_name = service_name + self.daily_limit = daily_limit + self.state_file = f"/app/temp/.quota_{service_name}.json" + self._ensure_file() + + def _ensure_file(self): + os.makedirs(os.path.dirname(self.state_file), exist_ok=True) + if not os.path.exists(self.state_file): + with open(self.state_file, 'w') as f: + json.dump({"date": datetime.now().strftime("%Y-%m-%d"), "count": 0}, f) + + def can_make_request(self) -> bool: + with open(self.state_file, 'r') as f: + data = json.load(f) + + today = datetime.now().strftime("%Y-%m-%d") + if data["date"] != today: + data = {"date": today, "count": 0} + + if data["count"] >= self.daily_limit: + return False + + data["count"] += 1 + with open(self.state_file, 'w') as f: + json.dump(data, f) + return True + +class GBHunter: + """ + Vehicle Robot 1-GB: The DVLA Sniper + Kizárólag brit rendszámok (VRM) alapján kérdez le hiteles adatokat. + """ + DVLA_URL = "https://driver-vehicle-licensing.api.gov.uk/vehicle-enquiry/v1/vehicles" + + def __init__(self): + self.api_key = os.getenv("DVLA_API_KEY") + self.daily_limit = int(os.getenv("DVLA_DAILY_LIMIT", "1000")) + self.quota = QuotaManager("dvla", self.daily_limit) + self.headers = { + "x-api-key": self.api_key, + "Content-Type": "application/json" + } + + async def fetch_dvla_data(self, client: httpx.AsyncClient, vrm: str): + """ API hívás hibatűréssel (Max 3 próba) """ + if not self.api_key: + logger.error("❌ HIÁNYZIK A DVLA_API_KEY a .env fájlból!") + return None + + payload = {"registrationNumber": vrm} + for attempt in range(3): + try: + resp = await client.post(self.DVLA_URL, json=payload, headers=self.headers) + + if resp.status_code == 200: + return resp.json() + elif resp.status_code == 404: + logger.warning(f"⚠️ DVLA nem találta ezt a rendszámot: {vrm}") + return "NOT_FOUND" + elif resp.status_code == 429: # Rate limit / Túl gyors hívás + await asyncio.sleep(2 ** attempt) + elif resp.status_code == 403: + logger.error("❌ DVLA API hiba: 403 Forbidden (Hibás API kulcs!)") + return None + else: + logger.error(f"❌ DVLA API hiba: {resp.status_code}") + return None + except httpx.RequestError as e: + if attempt == 2: + logger.error(f"Kritikus hálózati hiba: {e}") + return None + await asyncio.sleep(2 ** attempt) + return None + + async def process_record(self, db, record_id: int, vrm: str, make_csv: str, model_csv: str): + logger.info(f"🇬🇧 GB Vadászat indul: {vrm} ({make_csv} {model_csv})") + + if not self.quota.can_make_request(): + logger.warning("🛑 NAPI DVLA KVÓTA ELÉRVE! A robot holnapig alvó módba lép.") + return "QUOTA_EXCEEDED" + + async with httpx.AsyncClient(timeout=15.0) as client: + data = await self.fetch_dvla_data(client, vrm) + + if data == "NOT_FOUND": + # Hibás volt a CSV rendszám, lezárjuk a feladatot + await db.execute(text("UPDATE data.gb_catalog_discovery SET status = 'invalid_vrm' WHERE id = :id"), {"id": record_id}) + await db.commit() + return "DONE" + + if not data: + # Hálózati hiba, visszateszük a sorba + await db.execute(text("UPDATE data.gb_catalog_discovery SET status = 'pending' WHERE id = :id"), {"id": record_id}) + await db.commit() + return "ERROR" + + # SIKERES LEKÉRDEZÉS - Adatok kinyerése + ccm = data.get("engineCapacity", 0) + fuel = data.get("fuelType", "Unknown") + year = data.get("yearOfManufacture", 0) + co2 = data.get("co2Emissions", 0) + approval = data.get("typeApproval", "") + dvla_make = data.get("make", make_csv) + + # Beszúrás a Mestertáblába (A hiányzó lóerőt majd az Alkimista megszerzi!) + query_vmd = text(""" + INSERT INTO data.vehicle_model_definitions + (make, marketing_name, vehicle_class, fuel_type, engine_capacity, co2_emissions_combined, year_from, type_approval_number, status, source) + VALUES (:make, :model, 'car', :fuel, :ccm, :co2, :year, :approval, 'ACTIVE', 'GB-DVLA-API') + ON CONFLICT (make, normalized_name, variant_code, version_code, fuel_type) DO NOTHING; + """) + + try: + await db.execute(query_vmd, { + "make": dvla_make.upper(), + "model": model_csv.upper(), + "fuel": fuel, + "ccm": ccm, + "co2": co2, + "year": year if year else None, + "approval": approval + }) + + # Pipáljuk a feladatot + await db.execute(text("UPDATE data.gb_catalog_discovery SET status = 'processed' WHERE id = :id"), {"id": record_id}) + await db.commit() + logger.info(f"✅ GB Rekord mentve a VMD táblába: {dvla_make} {model_csv} ({ccm}cc {fuel})") + return "DONE" + except Exception as e: + await db.rollback() + logger.error(f"🚨 Adatbázis hiba mentéskor: {e}") + await db.execute(text("UPDATE data.gb_catalog_discovery SET status = 'pending' WHERE id = :id"), {"id": record_id}) + await db.commit() + return "ERROR" + + @classmethod + async def run(cls): + self_instance = cls() + logger.info("🤖 Robot-1-GB (DVLA Sniper) ONLINE (Atomi Zárolás & Kvótamenedzser)") + + while True: + try: + async with AsyncSessionLocal() as db: + # ATOMI ZÁROLÁS + query = text(""" + UPDATE data.gb_catalog_discovery + SET status = 'processing' + WHERE id = ( + SELECT id FROM data.gb_catalog_discovery + WHERE status = 'pending' + FOR UPDATE SKIP LOCKED + LIMIT 1 + ) + RETURNING id, vrm, make, model; + """) + + result = await db.execute(query) + task = result.fetchone() + await db.commit() + + if task: + status = await self_instance.process_record(db, task[0], task[1], task[2], task[3]) + if status == "QUOTA_EXCEEDED": + await asyncio.sleep(3600) # Alsó mód, ha elfogyott a limit + else: + await asyncio.sleep(1.5) # Lassítás, hogy kíméljük az API-t + else: + await asyncio.sleep(60) # Nincs új brit rendszám + + except Exception as e: + logger.error(f"💀 Kritikus hiba a főciklusban: {e}") + await asyncio.sleep(10) + +if __name__ == "__main__": + asyncio.run(GBHunter().run()) \ No newline at end of file diff --git a/backend/app/workers/vehicle/vehicle_robot_2_researcher.py b/backend/app/workers/vehicle/vehicle_robot_2_researcher.py new file mode 100755 index 0000000..1a08453 --- /dev/null +++ b/backend/app/workers/vehicle/vehicle_robot_2_researcher.py @@ -0,0 +1,194 @@ +import asyncio +import logging +import warnings +import os +import json +from datetime import datetime +from sqlalchemy import text, update, func +from app.database import AsyncSessionLocal +from app.models.vehicle_definitions import VehicleModelDefinition + +warnings.filterwarnings("ignore", category=RuntimeWarning, module='duckduckgo_search') +from duckduckgo_search import DDGS + +# MB 2.0 Szabvány naplózás +logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] Robot-2-Researcher: %(message)s') +logger = logging.getLogger("Vehicle-Robot-2-Researcher") + +class QuotaManager: + """ Szigorú napi limit figyelő a fizetős/hatósági API-khoz """ + def __init__(self, service_name: str, daily_limit: int): + self.service_name = service_name + self.daily_limit = daily_limit + self.state_file = f"/app/temp/.quota_{service_name}.json" + self._ensure_file() + + def _ensure_file(self): + os.makedirs(os.path.dirname(self.state_file), exist_ok=True) + if not os.path.exists(self.state_file): + with open(self.state_file, 'w') as f: + json.dump({"date": datetime.now().strftime("%Y-%m-%d"), "count": 0}, f) + + def can_make_request(self) -> bool: + with open(self.state_file, 'r') as f: + data = json.load(f) + + today = datetime.now().strftime("%Y-%m-%d") + if data["date"] != today: + data = {"date": today, "count": 0} # Új nap, kvóta nullázása + + if data["count"] >= self.daily_limit: + return False + + # Növeljük a számlálót + data["count"] += 1 + with open(self.state_file, 'w') as f: + json.dump(data, f) + return True + +class VehicleResearcher: + """ + Vehicle Robot 2.5: Sniper Researcher (Mesterlövész Adatgyűjtő) + Célzott keresésekkel és strukturált aktakészítéssel dolgozik az AI kímélése érdekében. + """ + def __init__(self): + self.max_attempts = 5 + self.search_timeout = 15.0 + + # Kvóta menedzserek beállítása (.env-ből olvasva) + dvla_limit = int(os.getenv("DVLA_DAILY_LIMIT", "1000")) + self.dvla_quota = QuotaManager("dvla", dvla_limit) + self.dvla_token = os.getenv("DVLA_API_KEY") + + async def fetch_ddg_targeted(self, label: str, query: str) -> str: + """ Célzott keresés szálbiztosan a DuckDuckGo-n. """ + try: + def search(): + with DDGS() as ddgs: + # max_results=2: Nem kell sok zaj, csak a legrelevánsabb 2 találat + results = ddgs.text(query, max_results=2) + return [f"- {r.get('body', '')}" for r in results] if results else [] + + results = await asyncio.wait_for(asyncio.to_thread(search), timeout=self.search_timeout) + + if not results: + return f"[SOURCE: {label}]\nNincs érdemi találat.\n" + + content = f"[SOURCE: {label} | KERESÉS: {query}]\n" + content += "\n".join(results) + "\n" + return content + + except Exception as e: + logger.debug(f"Keresési hiba ({label}): {e}") + return f"[SOURCE: {label}]\nKERESÉSI HIBA.\n" + + async def research_vehicle(self, db, vehicle_id: int, make: str, model: str, engine: str, year: str, current_attempts: int): + """ Egy jármű átvilágítása és a strukturált 'Akta' elkészítése a GPU számára. """ + engine_safe = engine or "" + year_safe = str(year) if year else "" + + logger.info(f"🔎 Mesterlövész Kutatás: {make} {model} (Motor: {engine_safe})") + + # 1. TIER: Ingyenes, Célzott Keresések (A legmegbízhatóbb források) + queries = [ + ("ULTIMATE_SPECS", f"{make} {model} {engine_safe} {year_safe} site:ultimatespecs.com"), + ("AUTO_DATA", f"{make} {model} {engine_safe} {year_safe} site:auto-data.net"), + ("COMMON_ISSUES", f"{make} {model} {engine_safe} reliability common problems") + ] + + tasks = [self.fetch_ddg_targeted(label, q) for label, q in queries] + search_results = await asyncio.gather(*tasks) + + # 2. TIER: Fizetős / Kvótás API-k (Példa a DVLA helyére) + # Ha a jövőben bejön brit rendszám, itt hívjuk meg a DVLA-t: + # if has_uk_plate and self.dvla_quota.can_make_request(): + # uk_data = await self.fetch_dvla_data(plate) + # search_results.append(uk_data) + + # 3. ÖSSZESÍTÉS (Az Akta összeállítása) + # Maximalizáljuk a szöveg hosszát, hogy az AI GPU ne fulladjon le! + full_context = "\n".join(search_results) + if len(full_context) > 2500: + full_context = full_context[:2500] + "\n...[TRUNCATED TO SAVE GPU TOKENS]" + + try: + if len(full_context.strip()) > 150: # Csökkentettük az elvárást, mert a célzott keresés tömörebb + await db.execute( + update(VehicleModelDefinition) + .where(VehicleModelDefinition.id == vehicle_id) + .values( + raw_search_context=full_context, + status='awaiting_ai_synthesis', # Kész az Akta, mehet az Alkimistának! + last_research_at=func.now(), + attempts=current_attempts + 1 + ) + ) + logger.info(f"✅ Akta rögzítve ({len(full_context)} karakter): {make} {model}") + else: + new_status = 'suspended_research' if current_attempts + 1 >= self.max_attempts else 'unverified' + await db.execute( + update(VehicleModelDefinition) + .where(VehicleModelDefinition.id == vehicle_id) + .values( + status=new_status, + attempts=current_attempts + 1, + last_research_at=func.now() + ) + ) + if new_status == 'suspended_research': + logger.warning(f"🛑 Felfüggesztve (Nincs nyom a weben): {make} {model}") + else: + logger.warning(f"⚠️ Kevés adat: {make} {model}, visszatéve a sorba.") + + await db.commit() + except Exception as e: + await db.rollback() + logger.error(f"🚨 Adatbázis hiba az eredmény mentésénél ({vehicle_id}): {e}") + + @classmethod + async def run(cls): + self_instance = cls() + logger.info("🚀 Vehicle Researcher 2.5 ONLINE (Sniper & Quota Manager)") + + while True: + try: + async with AsyncSessionLocal() as db: + # ATOMI ZÁROLÁS + query = text(""" + UPDATE data.vehicle_model_definitions + SET status = 'research_in_progress' + WHERE id = ( + SELECT id FROM data.vehicle_model_definitions + WHERE status IN ('unverified', 'awaiting_research') + AND attempts < :max_attempts + ORDER BY + CASE WHEN make = 'TOYOTA' THEN 1 ELSE 2 END, + attempts ASC + FOR UPDATE SKIP LOCKED + LIMIT 1 + ) + RETURNING id, make, marketing_name, engine_code, year_from, attempts; + """) + + result = await db.execute(query, {"max_attempts": self_instance.max_attempts}) + task = result.fetchone() + await db.commit() + + if task: + v_id, v_make, v_model, v_engine, v_year, v_attempts = task + async with AsyncSessionLocal() as process_db: + await self_instance.research_vehicle(process_db, v_id, v_make, v_model, v_engine, v_year, v_attempts) + + await asyncio.sleep(2) # Rate limit védelem a DDG felé + else: + await asyncio.sleep(30) + + except Exception as e: + logger.error(f"💀 Kritikus hiba a főciklusban: {e}") + await asyncio.sleep(10) + +if __name__ == "__main__": + try: + asyncio.run(VehicleResearcher.run()) + except KeyboardInterrupt: + logger.info("🛑 Kutató robot leállítva.") \ No newline at end of file diff --git a/backend/app/workers/vehicle/vehicle_robot_2_researcher.py.old b/backend/app/workers/vehicle/vehicle_robot_2_researcher.py.old new file mode 100755 index 0000000..e95c143 --- /dev/null +++ b/backend/app/workers/vehicle/vehicle_robot_2_researcher.py.old @@ -0,0 +1,137 @@ +# /opt/docker/dev/service_finder/backend/app/workers/researcher_v2_1.py +import asyncio +import logging +import warnings +import os +from datetime import datetime, timezone +from typing import Optional, List +from sqlalchemy import select, update, and_, func, or_, case +from app.db.session import AsyncSessionLocal +from app.models.vehicle_definitions import VehicleModelDefinition + +# DuckDuckGo search API hiba-elnyomás és import +warnings.filterwarnings("ignore", category=RuntimeWarning, module='duckduckgo_search') +from duckduckgo_search import DDGS + +# Logolás beállítása +logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] %(name)s: %(message)s') +logger = logging.getLogger("Robot-Researcher-v2.1") + +class ResearcherBot: + """ + Robot 2.1: Az internet porszívója. + Technikai adatokat gyűjt (DuckDuckGo), hogy előkészítse az AI dúsítást. + Kihasználja a motorkódot és a gyártási évet a pontosabb találatokért. + """ + def __init__(self): + self.batch_size = 5 # Egyszerre 5 járművet vesz ki + self.max_parallel_queries = 3 # Párhuzamos keresések száma + + async def fetch_source(self, label: str, query: str) -> str: + """ Egyedi forrás lekérése szálbiztos módon. """ + try: + def search(): + with DDGS() as ddgs: + # Az első 3 találat body részét gyűjtjük be kontextusnak + results = ddgs.text(query, max_results=3) + return [f"[{r.get('title', 'No Title')}] {r.get('body', '')}" for r in results] if results else [] + + results = await asyncio.to_thread(search) + + if not results: + return f"=== SOURCE: {label} | STATUS: EMPTY ===\n\n" + + content = f"=== SOURCE: {label} | QUERY: {query} ===\n" + content += "\n---\n".join(results) + content += "\n=== END SOURCE ===\n\n" + return content + except Exception as e: + logger.error(f"❌ Keresési hiba ({label}): {str(e)}") + return f"=== SOURCE: {label} | ERROR: {str(e)} ===\n\n" + + async def research_vehicle(self, vehicle_id: int): + """ Egyetlen jármű teljes körű átvilágítása. """ + async with AsyncSessionLocal() as db: + res = await db.execute(select(VehicleModelDefinition).where(VehicleModelDefinition.id == vehicle_id)) + v = res.scalar_one_or_none() + if not v: return + + make = v.make + model = v.marketing_name + engine = v.engine_code or "" + year = f"{v.year_from}" if v.year_from else "" + + # Státusz zárolása + v.status = 'research_in_progress' + await db.commit() + + logger.info(f"🔎 Kutatás indul: {make} {model} (Motor: {engine}, Év: {year})") + + # Célzott keresési kulcsszavak (Multi-Channel stratégia) + queries = [ + ("TECH_SPECS", f"{make} {model} {engine} {year} technical specifications engine power kw torque"), + ("MAINTENANCE", f"{make} {model} {engine} oil capacity coolant transmission fluid type capacity"), + ("TIRES_PROD", f"{make} {model} {year} tire size load index production years status") + ] + + # Párhuzamos forrásgyűjtés + tasks = [self.fetch_source(label, q) for label, q in queries] + search_results = await asyncio.gather(*tasks) + full_context = "".join(search_results) + + async with AsyncSessionLocal() as db: + if len(full_context.strip()) > 200: # Ha van elegendő kontextus + await db.execute( + update(VehicleModelDefinition) + .where(VehicleModelDefinition.id == vehicle_id) + .values( + raw_search_context=full_context, + status='awaiting_ai_synthesis', # Átadás a Robot 2.2-nek + last_research_at=func.now(), + attempts=VehicleModelDefinition.attempts + 1 + ) + ) + logger.info(f"✅ Kontextus rögzítve: {make} {model}") + else: + # Sikertelen keresés, visszatesszük később + await db.execute( + update(VehicleModelDefinition) + .where(VehicleModelDefinition.id == vehicle_id) + .values( + status='unverified', + attempts=VehicleModelDefinition.attempts + 1, + last_research_at=func.now() + ) + ) + logger.warning(f"⚠️ Kevés adat: {make} {model} - Újrapróbálkozás később") + await db.commit() + + async def run(self): + logger.info("🚀 Robot 2.1 (Researcher) ONLINE - Cél: 407 Toyota feldolgozása") + while True: + async with AsyncSessionLocal() as db: + # Prioritás: unverified autók előre + priorities = case( + (VehicleModelDefinition.make == 'TOYOTA', 1), + else_=2 + ) + + stmt = select(VehicleModelDefinition.id).where( + or_(VehicleModelDefinition.status == 'unverified', + VehicleModelDefinition.status == 'awaiting_research') + ).order_by(priorities, VehicleModelDefinition.attempts.asc()).limit(self.batch_size) + + res = await db.execute(stmt) + ids = [r[0] for r in res.fetchall()] + + if not ids: + await asyncio.sleep(30) + continue + + # Szekvenciális feldolgozás a rate-limit miatt + for rid in ids: + await self.research_vehicle(rid) + await asyncio.sleep(5) # 5 másodperc szünet a keresések között + +if __name__ == "__main__": + asyncio.run(ResearcherBot().run()) \ No newline at end of file diff --git a/backend/app/workers/vehicle/vehicle_robot_3_alchemist_pro.py b/backend/app/workers/vehicle/vehicle_robot_3_alchemist_pro.py new file mode 100755 index 0000000..740db90 --- /dev/null +++ b/backend/app/workers/vehicle/vehicle_robot_3_alchemist_pro.py @@ -0,0 +1,208 @@ +import asyncio +import logging +import datetime +import random +import sys +import json +from sqlalchemy import text, func, update, case +from app.database import AsyncSessionLocal +from app.models.vehicle_definitions import VehicleModelDefinition +from app.models.asset import AssetCatalog +from app.services.ai_service import AIService + +logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] Vehicle-Alchemist-Pro: %(message)s', stream=sys.stdout) +logger = logging.getLogger("Vehicle-Robot-3-Alchemist-Pro") + +class TechEnricher: + """ + Vehicle Robot 3: Alchemist Pro (Atomi Zárolás Patch) + Tiszta GPU fókusz: Csak az AI elemzésre és adategyesítésre koncentrál. + Nincs felesleges webkeresés. Szigorú Sane-Check. + """ + def __init__(self): + self.max_attempts = 5 + self.daily_ai_limit = int(os.getenv("AI_DAILY_LIMIT", "10000")) + self.ai_calls_today = 0 + self.last_reset_date = datetime.date.today() + + def check_budget(self) -> bool: + if datetime.date.today() > self.last_reset_date: + self.ai_calls_today = 0 + self.last_reset_date = datetime.date.today() + return self.ai_calls_today < self.daily_ai_limit + + def is_data_sane(self, data: dict, base_info: dict) -> bool: + """ Szigorított AI Hallucináció szűrő """ + if not data: return False + + try: + ccm = int(data.get("ccm", 0) or 0) + kw = int(data.get("kw", 0) or 0) + v_class = base_info.get("v_type", "car") + + # 1. Alapvető fizikai korlátok + if ccm > 18000 or (kw > 1500 and v_class != "truck"): + return False + + # 2. Üres adatok kizárása (Kivéve elektromos autók, ahol ccm = 0) + fuel = data.get("fuel_type", base_info.get("rdw_fuel", "")).lower() + if kw == 0: + return False + if ccm == 0 and "electric" not in fuel and "elektric" not in fuel and v_class != "trailer": + return False + + return True + except Exception as e: + logger.debug(f"Sane check hiba: {e}") + return False + + async def process_single_record(self, db, record_id: int, base_info: dict, current_attempts: int): + try: + logger.info(f"🧠 AI dúsítás indul: {base_info['make']} {base_info['m_name']}") + + # 1. LÉPÉS: AI Hívás (Rábízzuk az adatokat a modellre) + ai_data = await AIService.get_clean_vehicle_data( + base_info['make'], + base_info['m_name'], + base_info + ) + + # 2. LÉPÉS: Validáció (Ha az AI rossz adatot ad, NEM megyünk ki a webre, hanem dobjuk az aktát!) + if not ai_data or not self.is_data_sane(ai_data, base_info): + raise ValueError("Az AI hiányos adatot adott vissza vagy hallucinált.") + + # 3. LÉPÉS: HIBRID MERGE (Az RDW adatok felülbírálják az AI-t a hatósági paramétereknél) + final_kw = base_info['rdw_kw'] if base_info['rdw_kw'] > 0 else (ai_data.get("kw") or 0) + final_ccm = base_info['rdw_ccm'] if base_info['rdw_ccm'] > 0 else (ai_data.get("ccm") or 0) + + # Üzemanyag tisztítása + fuel_rdw = base_info.get('rdw_fuel', '') + final_fuel = fuel_rdw if fuel_rdw and fuel_rdw != "Unknown" else ai_data.get("fuel_type", "petrol") + + final_engine = base_info['rdw_engine'] if base_info['rdw_engine'] else ai_data.get("engine_code", "Unknown") + final_euro = base_info['rdw_euro'] or ai_data.get("euro_classification") + final_cylinders = base_info['rdw_cylinders'] or ai_data.get("cylinders") + + # 4. LÉPÉS: Mentés az Arany Katalógusba + clean_model = str(ai_data.get("marketing_name", base_info['m_name']))[:50].upper() + + cat_stmt = text(""" + INSERT INTO data.vehicle_catalog + (master_definition_id, make, model, power_kw, engine_capacity, fuel_type, factory_data) + VALUES (:m_id, :make, :model, :kw, :ccm, :fuel, :factory) + ON CONFLICT (make, model, year_from, fuel_type) DO NOTHING + RETURNING id; + """) + + await db.execute(cat_stmt, { + "m_id": record_id, + "make": base_info['make'].upper(), + "model": clean_model, + "kw": final_kw, + "ccm": final_ccm, + "fuel": final_fuel, + "factory": json.dumps(ai_data) + }) + + # 5. LÉPÉS: Staging tábla (VMD) lezárása + await db.execute( + update(VehicleModelDefinition) + .where(VehicleModelDefinition.id == record_id) + .values( + status="gold_enriched", + engine_capacity=final_ccm, + power_kw=final_kw, + fuel_type=final_fuel, + engine_code=final_engine, + euro_classification=final_euro, + cylinders=final_cylinders, + specifications=ai_data, # Elmentjük az AI teljes outputját a mestertáblába is + updated_at=func.now() + ) + ) + await db.commit() + logger.info(f"✨ ARANY REKORD KÉSZ: {base_info['make'].upper()} {clean_model}") + self.ai_calls_today += 1 + + except Exception as e: + await db.rollback() + logger.warning(f"⚠️ Alkimista hiba ({base_info['make']} {base_info['m_name']}): {e}") + + # Visszaküldés a sorba vagy felfüggesztés + new_status = 'suspended' if current_attempts + 1 >= self.max_attempts else 'unverified' + + await db.execute( + update(VehicleModelDefinition) + .where(VehicleModelDefinition.id == record_id) + .values( + attempts=current_attempts + 1, + last_error=str(e)[:200], + status=new_status, + updated_at=func.now() + ) + ) + await db.commit() + if new_status == 'unverified': + logger.info("♻️ Akta visszaküldve a Robot-2-nek (Kutató).") + + async def run(self): + logger.info(f"🚀 Alchemist Pro HIBRID ONLINE (Atomi Zárolás Patch)") + while True: + if not self.check_budget(): + logger.warning("💸 Napi AI limit kimerítve! Pihenés...") + await asyncio.sleep(3600); continue + + try: + async with AsyncSessionLocal() as db: + # ATOMI ZÁROLÁS (A "Szent Grál" a race condition ellen) + # A Robot-1 (ACTIVE) és a Robot-2 (awaiting_ai_synthesis) aktáit is felveszi! + query = text(""" + UPDATE data.vehicle_model_definitions + SET status = 'ai_synthesis_in_progress' + WHERE id = ( + SELECT id FROM data.vehicle_model_definitions + WHERE status IN ('awaiting_ai_synthesis', 'ACTIVE') + AND attempts < :max_attempts + ORDER BY + CASE WHEN status = 'awaiting_ai_synthesis' THEN 1 ELSE 2 END, + priority_score DESC + FOR UPDATE SKIP LOCKED + LIMIT 1 + ) + RETURNING id, make, marketing_name, vehicle_class, power_kw, engine_capacity, + fuel_type, engine_code, euro_classification, cylinders, raw_search_context, attempts; + """) + + result = await db.execute(query, {"max_attempts": self.max_attempts}) + task = result.fetchone() + await db.commit() + + if task: + # Szétbontjuk a lekérdezett rekordot a base_info dict-be + r_id = task[0] + base_info = { + "make": task[1], "m_name": task[2], "v_type": task[3] or "car", + "rdw_kw": task[4] or 0, "rdw_ccm": task[5] or 0, + "rdw_fuel": task[6] or "petrol", "rdw_engine": task[7] or "", + "rdw_euro": task[8], "rdw_cylinders": task[9], + "web_context": task[10] or "" + } + attempts = task[11] + + # Külön adatbázis kapcsolat a feldolgozáshoz (hosszú AI hívás miatt) + async with AsyncSessionLocal() as process_db: + await self.process_single_record(process_db, r_id, base_info, attempts) + + # GPU hűtés / Ollama rate limit + await asyncio.sleep(random.uniform(1.5, 3.5)) + else: + logger.info("😴 Nincs feldolgozandó akta, az Alkimista pihen...") + await asyncio.sleep(15) + + except Exception as e: + logger.error(f"💀 Kritikus hiba a főciklusban: {e}") + await asyncio.sleep(10) + +if __name__ == "__main__": + import os # Import az AI limit környezeti változóhoz + asyncio.run(TechEnricher().run()) \ No newline at end of file diff --git a/backend/app/workers/vehicle/vehicle_robot_3_alchemist_pro_1.0.0.py b/backend/app/workers/vehicle/vehicle_robot_3_alchemist_pro_1.0.0.py new file mode 100755 index 0000000..fff04b9 --- /dev/null +++ b/backend/app/workers/vehicle/vehicle_robot_3_alchemist_pro_1.0.0.py @@ -0,0 +1,262 @@ +# /app/app/workers/vehicle/vehicle_robot_3_alchemist_pro.py +import asyncio +import logging +import datetime +import random +import sys +import warnings +from sqlalchemy import select, and_, update, func, case +from app.database import AsyncSessionLocal +from app.models.vehicle_definitions import VehicleModelDefinition +from app.models.asset import AssetCatalog +from app.services.ai_service import AIService + +# DuckDuckGo hiba-elnyomás +warnings.filterwarnings("ignore", category=RuntimeWarning, module='duckduckgo_search') +from duckduckgo_search import DDGS + +# MB 2.0 Szigorú naplózás +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s [%(levelname)s] Vehicle-Alchemist-Pro: %(message)s', + stream=sys.stdout +) +logger = logging.getLogger("Vehicle-Robot-3-Alchemist-Pro") + +class TechEnricher: + """ + Vehicle Robot 3: Industrial Alchemist (Pro Edition). + Felelős az MDM 'Arany' rekordjainak előállításáért hibrid (RDW + AI + Web) logikával. + """ + + def __init__(self): + self.max_attempts = 5 + self.batch_size = 10 + self.daily_ai_limit = 500 + self.ai_calls_today = 0 + self.last_reset_date = datetime.date.today() + self.search_timeout = 15.0 + + def check_budget(self) -> bool: + """ Napi AI keret ellenőrzése. """ + if datetime.date.today() > self.last_reset_date: + self.ai_calls_today = 0 + self.last_reset_date = datetime.date.today() + return self.ai_calls_today < self.daily_ai_limit + + def is_data_sane(self, data: dict, rdw_kw: int, rdw_ccm: int) -> bool: + """ + Hallucináció elleni védelem: technikai józansági vizsgálat. + ÚJ: Ha az RDW-től van biztos adatunk, akkor megengedőbbek vagyunk az AI-val, + mert a fő adatokat az RDW-ből vesszük. + """ + # Ha van hivatalos adat, akkor "Sane", a többit megoldjuk a hibrid logikával + if rdw_kw > 0 or rdw_ccm > 0: + return True + + try: + if not data: return False + ccm = int(data.get("ccm", 0) or 0) + kw = int(data.get("kw", 0) or 0) + + # Ne engedjünk be teljesen üres adatot, ha nincs RDW támasz sem + if ccm == 0 and kw == 0 and data.get("vehicle_type") != "trailer": + return False + + if ccm > 16000 or (kw > 1500 and data.get("vehicle_type") != "truck"): + return False + return True + except Exception as e: + logger.debug(f"Data Sane Error: {e}") + return False + + async def get_web_wisdom(self, make: str, model: str) -> str: + """ Adatgyűjtés a DuckDuckGo-ról szálbiztos és timeouttal védett módon. """ + query = f"{make} {model} technical specifications engine code fuel" + try: + def sync_search(): + with DDGS() as ddgs: + results = ddgs.text(query, max_results=3) + return "\n".join([r['body'] for r in results]) if results else "" + + return await asyncio.wait_for(asyncio.to_thread(sync_search), timeout=self.search_timeout) + except asyncio.TimeoutError: + logger.warning(f"⏱️ Web keresési időtúllépés ({make} {model})") + return "" + except Exception as e: + logger.warning(f"🌐 Keresési hiba ({make}): {e}") + return "" + + async def process_single_record(self, record_id: int): + """ Rekord dúsítás: Read -> AI Process -> Hybrid Gold Data Merge. """ + make, m_name, v_type = "", "", "car" + web_context = "" + # ÚJ: RDW adatok tárolója + rdw_kw, rdw_ccm, rdw_fuel, rdw_engine = 0, 0, "petrol", "" + + # 1. LÉPÉS: Olvasás és státuszváltás + try: + async with AsyncSessionLocal() as db: + res = await db.execute( + select(VehicleModelDefinition) + .where(VehicleModelDefinition.id == record_id) + .with_for_update(skip_locked=True) + ) + rec = res.scalar_one_or_none() + if not rec: + return + + make = rec.make + m_name = rec.marketing_name + v_type = rec.vehicle_class or "car" + web_context = rec.raw_search_context or "" + + # ÚJ: Kimentjük a Hunter által szerzett hivatalos RDW adatokat! + rdw_kw = rec.power_kw or 0 + rdw_ccm = rec.engine_capacity or 0 + rdw_fuel = rec.fuel_type or "petrol" + rdw_engine = rec.engine_code or "" + + rec.status = "ai_synthesis_in_progress" + await db.commit() + except Exception as e: + logger.error(f"🚨 Adatbázis hiba olvasáskor (ID: {record_id}): {e}") + return + + # 2. LÉPÉS: AI és Web munka + try: + logger.info(f"🧠 AI elemzés indul: {make} {m_name}") + + # Átadjuk az AI-nak az RDW adatokat is kontextusként, hogy "okosodjon" belőle + sources_dict = { + "web_context": web_context, + "vehicle_class": v_type, + "rdw_kw": rdw_kw, + "rdw_ccm": rdw_ccm + } + ai_data = await AIService.get_clean_vehicle_data(make, m_name, sources_dict) + + # Ha az AI gyenge adatot hoz vissza, és az RDW adatunk is hiányos, akkor webezünk + if (not ai_data or not ai_data.get("kw")) and rdw_kw == 0: + logger.info(f"🔍 Adathiány, extra webes mélyfúrás: {make} {m_name}") + extra_web_info = await self.get_web_wisdom(make, m_name) + sources_dict["web_context"] = extra_web_info + ai_data = await AIService.get_clean_vehicle_data(make, m_name, sources_dict) + + # ÚJ: Hibrid józansági vizsgálat + if not ai_data: ai_data = {} + if not self.is_data_sane(ai_data, rdw_kw, rdw_ccm): + raise ValueError("Az AI válasza hallucinált ÉS hivatalos RDW adatunk sincs.") + + self.ai_calls_today += 1 + + # ÚJ: HIBRID ADAT-ÖSSZEVONÁS (The Magic!) + # RDW (hivatalos) > AI (generált) + final_kw = rdw_kw if rdw_kw > 0 else (ai_data.get("kw") or 0) + final_ccm = rdw_ccm if rdw_ccm > 0 else (ai_data.get("ccm") or 0) + + # Üzemanyag tisztítás (az RDW néha hollandul írja, ezt az AI tisztázhatja, de ha nincs AI, marad az RDW) + final_fuel = rdw_fuel if (rdw_fuel and rdw_fuel != "Unknown") else ai_data.get("fuel_type", "petrol") + final_engine = rdw_engine if rdw_engine else ai_data.get("engine_code", "Nincs adat") + + # Befrissítjük a JSON payloadot is a biztos adatokkal + ai_data["kw"] = final_kw + ai_data["ccm"] = final_ccm + ai_data["engine_code"] = final_engine + + # 3. LÉPÉS: Arany rekord mentése + async with AsyncSessionLocal() as db: + clean_model = str(ai_data.get("marketing_name", m_name))[:50].upper() + + cat_stmt = select(AssetCatalog).where(and_( + AssetCatalog.make == make.upper(), + AssetCatalog.model == clean_model, + AssetCatalog.power_kw == final_kw # A pontos KW alapján egyedi + )).limit(1) + + existing_cat = (await db.execute(cat_stmt)).scalar_one_or_none() + + if not existing_cat: + db.add(AssetCatalog( + make=make.upper(), + model=clean_model, + power_kw=final_kw, + engine_capacity=final_ccm, + fuel_type=final_fuel, + vehicle_class=v_type, + factory_data=ai_data # Dúsított JSON + )) + logger.info(f"✨ ÚJ ARANY REKORD (HIBRID): {make.upper()} {clean_model} ({final_ccm}ccm, {final_kw}kW)") + + # Staging frissítése a biztos adatokkal + await db.execute( + update(VehicleModelDefinition) + .where(VehicleModelDefinition.id == record_id) + .values( + status="gold_enriched", + technical_code=ai_data.get("technical_code") or f"REF-{record_id}", + engine_capacity=final_ccm, + power_kw=final_kw, + updated_at=func.now() + ) + ) + await db.commit() + + except Exception as e: + # 4. LÉPÉS: Hibakezelés + logger.error(f"🚨 Hiba a(z) {record_id} rekordnál ({make} {m_name}): {e}") + try: + async with AsyncSessionLocal() as db: + await db.execute( + update(VehicleModelDefinition) + .where(VehicleModelDefinition.id == record_id) + .values( + attempts=VehicleModelDefinition.attempts + 1, + last_error=str(e)[:200], + status=case( + (VehicleModelDefinition.attempts >= self.max_attempts - 1, "suspended"), + else_="unverified" + ), + updated_at=func.now() + ) + ) + await db.commit() + except Exception as db_err: + logger.critical(f"💀 Végzetes adatbázis hiba a fallback mentésnél: {db_err}") + + async def run(self): + logger.info(f"🚀 Alchemist Pro HIBRID ONLINE (Napi limit: {self.daily_ai_limit})") + + while True: + try: + if not self.check_budget(): + logger.warning("💰 AI Keret kimerült. Alvás 1 órát.") + await asyncio.sleep(3600) + continue + + async with AsyncSessionLocal() as db: + stmt = select(VehicleModelDefinition.id).where(and_( + VehicleModelDefinition.status.in_(["unverified", "awaiting_ai_synthesis"]), + VehicleModelDefinition.attempts < self.max_attempts + )).limit(self.batch_size) + + res = await db.execute(stmt) + ids = [r[0] for r in res.fetchall()] + + if not ids: + await asyncio.sleep(60) + continue + + for rid in ids: + await self.process_single_record(rid) + await asyncio.sleep(random.uniform(5.0, 15.0)) # GPU kímélés + + except Exception as e: + logger.error(f"💀 Kritikus hiba a főciklusban: {e}") + await asyncio.sleep(10) + +if __name__ == "__main__": + try: + asyncio.run(TechEnricher().run()) + except KeyboardInterrupt: + logger.info("🛑 Alchemist Pro leállítva.") \ No newline at end of file diff --git a/backend/app/workers/vehicle/vehicle_robot_4_vin_auditor.py b/backend/app/workers/vehicle/vehicle_robot_4_vin_auditor.py new file mode 100755 index 0000000..03ef3a3 --- /dev/null +++ b/backend/app/workers/vehicle/vehicle_robot_4_vin_auditor.py @@ -0,0 +1,118 @@ +import asyncio +import logging +import sys +from sqlalchemy import select, and_, text, update +from sqlalchemy.orm import joinedload +from app.database import AsyncSessionLocal +from app.models.asset import Asset, AssetCatalog +from app.services.ai_service import AIService + +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s [%(levelname)s] Vehicle-VIN-Auditor: %(message)s', + stream=sys.stdout +) +logger = logging.getLogger("Vehicle-Robot-4-VINAuditor") + +class VINAuditor: + """ + Vehicle Robot 4: VIN Auditor (Atomi Zárolás Patch) + Egyedi járművek (Assets) alvázszám alapú hitelesítése. + """ + + @classmethod + async def audit_asset(cls, db, asset_id: int): + """ Egy konkrét eszköz hitelesítése alvázszám alapján. """ + # 1. Adatok begyűjtése + stmt = select(Asset).options(joinedload(Asset.catalog)).where(Asset.id == asset_id) + asset = (await db.execute(stmt)).scalar_one_or_none() + + if not asset or not asset.vin or not asset.catalog: + return + + make = asset.catalog.make + vin = asset.vin + current_kw = asset.catalog.power_kw + + # 2. AI FÁZIS + try: + logger.info(f"🛡️ VIN Ellenőrzés indítása: {vin}") + truth = await AIService.get_clean_vehicle_data(make, vin, {"source": "vin_audit", "vin": vin}) + + if truth and truth.get("kw"): + real_kw = int(truth["kw"]) + + # Ha jelentős (>=5 kW) eltérés van + if abs(real_kw - (current_kw or 0)) >= 5: + logger.warning(f"⚠️ Eltérés észlelve! VIN: {vin} | Valóság: {real_kw}kW != Katalógus: {current_kw}kW") + + new_v = AssetCatalog( + make=make.upper(), + model=truth.get("marketing_name", asset.catalog.model), + power_kw=real_kw, + source=f"VIN-AUDIT-{vin}" + ) + db.add(new_v) + await db.flush() + + await db.execute( + update(Asset) + .where(Asset.id == asset_id) + .values(catalog_id=new_v.id, is_verified=True, status="active") + ) + else: + await db.execute( + update(Asset) + .where(Asset.id == asset_id) + .values(is_verified=True, status="active") + ) + + await db.commit() + logger.info(f"✅ VIN Audit sikeresen lezárva: {vin}") + else: + logger.warning(f"⚠️ AI nem tudta azonosítani a VIN-t: {vin}") + # Visszaállítjuk, de megjelöljük, hogy már próbáltuk + await db.execute(update(Asset).where(Asset.id == asset_id).values(status="audit_failed")) + await db.commit() + + except Exception as e: + await db.rollback() + logger.error(f"🚨 Kritikus hiba az audit során: {e}") + + async def run(self): + logger.info("🛡️ Vehicle VIN Auditor ONLINE (Atomi Zárolás)") + while True: + try: + async with AsyncSessionLocal() as db: + # ATOMI ZÁROLÁS (Asset táblán) + query = text(""" + UPDATE data.assets + SET status = 'audit_in_progress' + WHERE id = ( + SELECT id FROM data.assets + WHERE is_verified = false + AND vin IS NOT NULL + AND status NOT IN ('audit_in_progress', 'audit_failed') + FOR UPDATE SKIP LOCKED + LIMIT 1 + ) + RETURNING id; + """) + + result = await db.execute(query) + task = result.fetchone() + await db.commit() + + if task: + async with AsyncSessionLocal() as process_db: + await self.audit_asset(process_db, task[0]) + await asyncio.sleep(2) + else: + await asyncio.sleep(60) + except Exception as e: + logger.error(f"🚨 Hiba a főciklusban: {e}") + await asyncio.sleep(30) + +if __name__ == "__main__": + auditor = VINAuditor() + asyncio.run(auditor.run()) \ No newline at end of file diff --git a/backend/discovery_bot.py.old b/backend/discovery_bot.py.old new file mode 100755 index 0000000..5d7b3ab --- /dev/null +++ b/backend/discovery_bot.py.old @@ -0,0 +1,111 @@ +# /opt/docker/dev/service_finder/backend/discovery_bot.py +import asyncio +import json +import httpx +import os +import hashlib +import logging +from urllib.parse import quote +from sqlalchemy import select +from app.database import AsyncSessionLocal +from app.models.staged_data import ServiceStaging + +# Logolás beállítása +logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s]: %(message)s') +logger = logging.getLogger("OSM-Discovery") + +# Konfiguráció +HUNGARY_BBOX = "45.7,16.1,48.6,22.9" +OVERPASS_URL = "http://overpass-api.de/api/interpreter?data=" + +class OSMDiscoveryBot: + @staticmethod + def generate_fingerprint(name: str, city: str) -> str: + """ + Ujjlenyomat generálása a deduplikációhoz. + Kicsit lazább, mint a Hunter-nél, mert az OSM címadatok néha hiányosak. + """ + raw = f"{str(name).lower()}|{str(city).lower()}" + return hashlib.md5(raw.encode()).hexdigest() + + @staticmethod + def get_service_type(tags: dict, name: str) -> str: + """ OSM tagek leképezése belső kategóriákra. """ + name = name.lower() + shop = tags.get('shop', '') + amenity = tags.get('amenity', '') + + if shop == 'tyres' or 'gumi' in name: return 'tire_shop' + if amenity == 'car_wash' or 'mosó' in name: return 'car_wash' + if any(x in name for x in ['villamos', 'autóvill', 'elektro']): return 'electrician' + if any(x in name for x in ['fényez', 'lakatos', 'karosszéria']): return 'body_shop' + return 'mechanic' + + async def fetch_osm_data(self, query_part: str): + """ Aszinkron adatgyűjtés az Overpass API-tól. """ + query = f'[out:json][timeout:120];(node{query_part}({HUNGARY_BBOX});way{query_part}({HUNGARY_BBOX}););out center;' + async with httpx.AsyncClient(timeout=150) as client: + try: + resp = await client.get(OVERPASS_URL + quote(query)) + if resp.status_code == 200: + return resp.json().get('elements', []) + return [] + except Exception as e: + logger.error(f"❌ Overpass hiba: {e}") + return [] + + async def sync(self): + logger.info("🛰️ OSM Országos szinkronizáció indítása...") + + # 1. Lekérdezések összeállítása + queries = [ + '["shop"~"car_repair|tyres"]', + '["amenity"="car_wash"]' + ] + + all_elements = [] + for q in queries: + elements = await self.fetch_osm_data(q) + all_elements.extend(elements) + + logger.info(f"📊 {len(all_elements)} potenciális szervizpont érkezett.") + + async with AsyncSessionLocal() as db: + added_count = 0 + for node in all_elements: + tags = node.get('tags', {}) + if not tags.get('name'): continue + + lat = node.get('lat', node.get('center', {}).get('lat')) + lon = node.get('lon', node.get('center', {}).get('lon')) + + name = tags.get('name', tags.get('operator', 'Ismeretlen szerviz')) + city = tags.get('addr:city', 'Ismeretlen') + street = tags.get('addr:street', '') + housenumber = tags.get('addr:housenumber', '') + + f_print = self.generate_fingerprint(name, city) + + # Deduplikáció ellenőrzése + stmt = select(ServiceStaging).where(ServiceStaging.fingerprint == f_print) + existing = (await db.execute(stmt)).scalar_one_or_none() + + if not existing: + db.add(ServiceStaging( + name=name, + source="osm_discovery_v2", + fingerprint=f_print, + city=city, + full_address=f"{city}, {street} {housenumber}".strip(", "), + status="pending", + trust_score=20, # Az OSM adatokat alacsonyabb bizalommal kezeljük, mint a Google-t + raw_data=tags + )) + added_count += 1 + + await db.commit() + logger.info(f"✅ Szinkron kész. {added_count} új elem került a Staging táblába.") + +if __name__ == "__main__": + bot = OSMDiscoveryBot() + asyncio.run(bot.sync()) \ No newline at end of file diff --git a/backend/full_discovery_bot.py b/backend/full_discovery_bot.py new file mode 100755 index 0000000..916ed26 --- /dev/null +++ b/backend/full_discovery_bot.py @@ -0,0 +1,67 @@ +import asyncio +from sqlalchemy import text +from app.db.session import engine + +# 200+ Márka és Típus adatok +DATA = { + "CAR": { + "Toyota": ["Corolla", "Yaris", "RAV4", "Hilux", "C-HR", "Land Cruiser", "Camry"], + "Volkswagen": ["Golf", "Passat", "Polo", "Tiguan", "T-Roc", "Arteon", "Caddy"], + "BMW": ["3 Series", "5 Series", "X5", "X3", "1 Series", "7 Series", "X1"], + "Mercedes-Benz": ["C-Class", "E-Class", "S-Class", "GLC", "GLE", "A-Class", "CLA"], + "Audi": ["A3", "A4", "A6", "Q3", "Q5", "Q7", "A5", "TT"], + "Ford": ["Focus", "Fiesta", "Kuga", "Puma", "Transit", "Ranger", "Mondeo", "Mustang"], + "Opel": ["Astra", "Corsa", "Insignia", "Mokka", "Grandland", "Crossland", "Vivaro"], + "Suzuki": ["Swift", "Vitara", "S-Cross", "Ignis", "Jimny", "Baleno"], + "Skoda": ["Octavia", "Fabia", "Superb", "Kodiaq", "Karoq", "Kamiq", "Scala"], + "Hyundai": ["i30", "Tucson", "i20", "Kona", "Santa Fe", "Ioniq 5", "Bayon"], + "Kia": ["Ceed", "Sportage", "Rio", "Niro", "Sorento", "Picanto", "Stonic"], + "Renault": ["Clio", "Megane", "Captur", "Kadjar", "Master", "Trafic", "Zoe", "Arkana"], + "Peugeot": ["208", "308", "2008", "3008", "5008", "508", "Rifter"], + "Volvo": ["XC60", "XC40", "XC90", "V60", "S60", "V90", "S90"], + "Mazda": ["CX-5", "Mazda3", "Mazda6", "CX-30", "MX-5", "CX-3"], + "Fiat": ["500", "Panda", "Tipo", "Ducato", "Doblo", "500X"], + "Dacia": ["Duster", "Sandero", "Logan", "Jogger", "Spring"], + "Nissan": ["Qashqai", "Juke", "X-Trail", "Leaf", "Micra", "Navara"], + "Tesla": ["Model 3", "Model Y", "Model S", "Model X"], + "Lexus": ["RX", "NX", "UX", "ES", "IS", "LS"] + }, + "MOTORCYCLE": { + "Honda": ["CB500", "CBR600", "Africa Twin", "NC750X", "Goldwing", "PCX", "SH125", "Forza 350"], + "Yamaha": ["MT-07", "MT-09", "R1", "R6", "Tracer 9", "Ténéré 700", "XMAX", "TMAX"], + "Kawasaki": ["Ninja 400", "Ninja 650", "Z900", "Z650", "Versys 650", "Vulcan S", "Z1000"], + "Suzuki": ["V-Strom 650", "GSX-R1000", "Hayabusa", "SV650", "Burgman", "GSX-S1000"], + "BMW Motorrad": ["R1250GS", "S1000RR", "F850GS", "R nineT", "G310GS", "K1600GT"], + "KTM": ["Duke 390", "Duke 790", "1290 Super Adventure", "300 EXC", "890 Adventure"], + "Ducati": ["Monster", "Multistrada", "Panigale V4", "Scrambler", "Diavel", "Streetfighter"], + "Harley-Davidson": ["Sportster", "Fat Boy", "Iron 883", "Pan America", "Road Glide"] + } + } + + async def run_discovery(): + async with engine.begin() as conn: + print("🚀 Jármű adatbázis mély-feltöltése indul...") + + for cat_name, brands in DATA.items(): + res = await conn.execute(text("SELECT id FROM data.vehicle_categories WHERE name = :n"), {"n": cat_name}) + cat_id = res.scalar() + + for brand_name, models in brands.items(): + # Márka beszúrása + await conn.execute(text( + "INSERT INTO data.vehicle_brands (category_id, name) VALUES (:c, :n) ON CONFLICT (category_id, name) DO NOTHING" + ), {"c": cat_id, "n": brand_name}) + + # Márka ID lekérése + res_b = await conn.execute(text("SELECT id FROM data.vehicle_brands WHERE name = :n AND category_id = :c"), {"n": brand_name, "c": cat_id}) + brand_id = res_b.scalar() + + for m_name in models: + await conn.execute(text( + "INSERT INTO data.vehicle_models (brand_id, name) VALUES (:b, :n) ON CONFLICT (brand_id, name) DO NOTHING" + ), {"b": brand_id, "n": m_name}) + + print("✅ Discovery Bot sikeresen betöltötte az adatokat!") + + if __name__ == "__main__": + asyncio.run(run_discovery()) \ No newline at end of file diff --git a/backend/migrations/README b/backend/migrations/README new file mode 100755 index 0000000..98e4f9c --- /dev/null +++ b/backend/migrations/README @@ -0,0 +1 @@ +Generic single-database configuration. \ No newline at end of file diff --git a/backend/migrations/env.py b/backend/migrations/env.py new file mode 100755 index 0000000..ad742f7 --- /dev/null +++ b/backend/migrations/env.py @@ -0,0 +1,123 @@ +# /opt/docker/dev/service_finder/backend/migrations/env.py +import asyncio +from logging.config import fileConfig +import os +import sys +from sqlalchemy import pool, text +from sqlalchemy.ext.asyncio import async_engine_from_config +from alembic import context + +# --- ÚTVONAL JAVÍTÁS --- +# Biztosítjuk, hogy a Docker konténeren belül az /app könyvtár legyen a gyökér +sys.path.insert(0, "/app") + +try: + from app.core.config import settings + from app.database import Base + # Fontos: Importáljuk a modelleket, hogy a Base.metadata feltöltődjön + import app.models as models +except ImportError as e: + print(f"❌ Kritikus hiba az importálásnál: {e}") + raise + +config = context.config +config.set_main_option("sqlalchemy.url", str(settings.SQLALCHEMY_DATABASE_URI)) + +if config.config_file_name is not None: + fileConfig(config.config_file_name) + +target_metadata = Base.metadata + +def include_object(object, name, type_, reflected, compare_to): + """ + 🔥 MB 2.0 BIZTONSÁGI SZŰRŐ ÉS WHITELIST 🔥 + Ez a rész felel azért, hogy ne töröljünk véletlenül semmit. + """ + # 1. PostGIS és Alembic belső táblák védelme + excluded_tables = [ + "spatial_ref_sys", "alembic_version", + "geography_columns", "geometry_columns", + "raster_columns", "raster_overviews" + ] + if type_ == "table" and name in excluded_tables: + return False + + # 2. 🔥 BIZTONSÁGI FÉK (Safety Guard) 🔥 + # Ha bent van a DB-ben (reflected), de nincs a kódban (compare_to is None) + # -> TILOS TÖRÖLNI! Megvédi a manuálisan létrehozott táblákat. + if reflected and compare_to is None: + return False + + # 3. Engedélyezett sémák listája (Whitelist) + allowed_schemas = ["identity", "data", "system", "public"] + + # 4. Séma szintű engedélyezés (pl. séma létrehozásához) + if type_ == "schema": + return name in allowed_schemas + + # 5. Objektum séma ellenőrzése + obj_schema = getattr(object, "schema", None) + if obj_schema is None and hasattr(object, "table"): + obj_schema = getattr(object.table, "schema", None) + + # Ha a séma benne van a whitelistben, engedélyezzük a módosítást + if obj_schema: + return obj_schema in allowed_schemas + + # 6. Fallback a public sémára (pl. globális típusok, Enum-ok számára) + # Csak akkor engedjük, ha explicit public, vagy ha nincs jelölve, de nem tiltott. + if obj_schema is None or obj_schema == "public": + return True + + # 7. 🔥 SZIGORÚ ZÁRÁS 🔥 + # Minden mást (pl. idegen sémák) kizárunk a migrációból. + return False + +def do_run_migrations(connection): + """ Migrációk futtatása közös konfigurációval. """ + context.configure( + connection=connection, + target_metadata=target_metadata, + include_schemas=True, # Lássa a több-sémás felépítést + include_object=include_object, # Alkalmazza a fenti biztonsági szűrőt + compare_type=True, # Érzékelje az oszloptípus változásait (pl. String -> Text) + compare_server_default=True, # Érzékelje az alapértelmezett érték változásait (Dinamikus confighoz kell!) + version_table_schema='public', # A verziótábla mindig maradjon a public-ban + upgrade_token="upgrade", + downgrade_token="downgrade" + ) + + with context.begin_transaction(): + context.run_migrations() + +async def run_migrations_online() -> None: + """ Online futtatási mód (ez fut a Dockerben). """ + connectable = async_engine_from_config( + config.get_section(config.config_ini_section, {}), + prefix="sqlalchemy.", + poolclass=pool.NullPool, + ) + async with connectable.connect() as connection: + await connection.run_sync(do_run_migrations) + await connectable.dispose() + +if context.is_offline_mode(): + # Offline mód kiegészítése a biztonsági paraméterekkel + context.configure( + url=config.get_main_option("sqlalchemy.url"), + target_metadata=target_metadata, + literal_binds=True, + include_schemas=True, + include_object=include_object, + compare_type=True, + compare_server_default=True + ) + with context.begin_transaction(): + context.run_migrations() +else: + # Online mód indítása + try: + loop = asyncio.get_event_loop() + except RuntimeError: + loop = asyncio.new_event_loop() + loop.run_until_complete(run_migrations_online()) \ No newline at end of file diff --git a/backend/migrations/script.py.mako b/backend/migrations/script.py.mako new file mode 100755 index 0000000..1101630 --- /dev/null +++ b/backend/migrations/script.py.mako @@ -0,0 +1,28 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision: str = ${repr(up_revision)} +down_revision: Union[str, Sequence[str], None] = ${repr(down_revision)} +branch_labels: Union[str, Sequence[str], None] = ${repr(branch_labels)} +depends_on: Union[str, Sequence[str], None] = ${repr(depends_on)} + + +def upgrade() -> None: + """Upgrade schema.""" + ${upgrades if upgrades else "pass"} + + +def downgrade() -> None: + """Downgrade schema.""" + ${downgrades if downgrades else "pass"} diff --git a/backend/migrations/versions/0473a3146058_fix_org_lifecycle_and_expertise_id.py b/backend/migrations/versions/0473a3146058_fix_org_lifecycle_and_expertise_id.py new file mode 100755 index 0000000..457bf45 --- /dev/null +++ b/backend/migrations/versions/0473a3146058_fix_org_lifecycle_and_expertise_id.py @@ -0,0 +1,39 @@ +"""fix_org_lifecycle_and_expertise_id +Revision ID: 0473a3146058 +Revises: 1d75b3806b43 +Create Date: 2026-02-28 00:15:15.823744 +""" +from typing import Sequence, Union +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision: str = '0473a3146058' +down_revision: Union[str, Sequence[str], None] = '1d75b3806b43' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + +def upgrade() -> None: + # --- 1. Organizations tábla bővítése (Életciklus adatok) --- + # Megjegyzés: A schema='data' kritikus, mert ott lakik a tábla! + op.add_column('organizations', sa.Column('legal_owner_id', sa.Integer(), nullable=True), schema='data') + op.add_column('organizations', sa.Column('first_registered_at', sa.DateTime(timezone=True), nullable=True), schema='data') + op.add_column('organizations', sa.Column('current_lifecycle_started_at', sa.DateTime(timezone=True), nullable=True), schema='data') + op.add_column('organizations', sa.Column('last_deactivated_at', sa.DateTime(timezone=True), nullable=True), schema='data') + op.add_column('organizations', sa.Column('lifecycle_index', sa.Integer(), server_default='0', nullable=False), schema='data') + + # --- 2. Service Expertises tábla bővítése (Hiányzó ID) --- + # Identity-t használunk, hogy automatikusan generáljon számokat a meglévő sorokhoz is + op.add_column('service_expertises', sa.Column('id', sa.Integer(), sa.Identity(always=False), nullable=False), schema='data') + + # Opcionális: Ha az ID-t elsődleges kulccsá akarod tenni + # op.create_primary_key('pk_service_expertises', 'service_expertises', ['id'], schema='data') + +def downgrade() -> None: + # Visszaállítási logika (fordított sorrendben) + op.drop_column('service_expertises', 'id', schema='data') + op.drop_column('organizations', 'lifecycle_index', schema='data') + op.drop_column('organizations', 'last_deactivated_at', schema='data') + op.drop_column('organizations', 'current_lifecycle_started_at', schema='data') + op.drop_column('organizations', 'first_registered_at', schema='data') + op.drop_column('organizations', 'legal_owner_id', schema='data') \ No newline at end of file diff --git a/backend/migrations/versions/062cfbbdd076_fix_persons_schema_and_final_integrity.py b/backend/migrations/versions/062cfbbdd076_fix_persons_schema_and_final_integrity.py new file mode 100755 index 0000000..6e5d068 --- /dev/null +++ b/backend/migrations/versions/062cfbbdd076_fix_persons_schema_and_final_integrity.py @@ -0,0 +1,536 @@ +"""Fix_Persons_Schema_and_Final_Integrity + +Revision ID: 062cfbbdd076 +Revises: f7505332b1c8 +Create Date: 2026-02-24 22:34:52.364686 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = '062cfbbdd076' +down_revision: Union[str, Sequence[str], None] = 'f7505332b1c8' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('asset_inspections', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('asset_id', sa.UUID(), nullable=False), + sa.Column('inspector_id', sa.Integer(), nullable=False), + sa.Column('timestamp', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.Column('checklist_results', postgresql.JSONB(astext_type=sa.Text()), nullable=False), + sa.Column('is_safe', sa.Boolean(), nullable=False), + sa.ForeignKeyConstraint(['asset_id'], ['data.assets.id'], ), + sa.ForeignKeyConstraint(['inspector_id'], ['identity.users.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_table('vehicle_logbook', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('asset_id', sa.UUID(), nullable=False), + sa.Column('driver_id', sa.Integer(), nullable=False), + sa.Column('trip_type', sa.String(length=30), nullable=False), + sa.Column('is_reimbursable', sa.Boolean(), nullable=False), + sa.Column('start_mileage', sa.Integer(), nullable=False), + sa.Column('end_mileage', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['asset_id'], ['data.assets.id'], ), + sa.ForeignKeyConstraint(['driver_id'], ['identity.users.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index(op.f('ix_data_vehicle_logbook_trip_type'), 'vehicle_logbook', ['trip_type'], unique=False, schema='data') + op.create_table('vehicle_ownership_history', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('asset_id', sa.UUID(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('acquired_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.Column('disposed_at', sa.DateTime(timezone=True), nullable=True), + sa.ForeignKeyConstraint(['asset_id'], ['data.assets.id'], ), + sa.ForeignKeyConstraint(['user_id'], ['identity.users.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + # op.drop_table('spatial_ref_sys', schema='public') + op.drop_constraint(op.f('addresses_postal_code_id_fkey'), 'addresses', type_='foreignkey') + op.create_foreign_key(None, 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_assignments_branch_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', type_='foreignkey') + op.create_foreign_key(None, 'asset_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_assignments', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('asset_assignments', 'released_at') + op.drop_column('asset_assignments', 'branch_id') + op.drop_column('asset_assignments', 'assigned_at') + op.add_column('asset_costs', sa.Column('cost_category', sa.String(length=50), nullable=False)) + op.add_column('asset_costs', sa.Column('amount_net', sa.Numeric(precision=18, scale=2), nullable=False)) + op.add_column('asset_costs', sa.Column('currency', sa.String(length=3), nullable=False)) + op.add_column('asset_costs', sa.Column('invoice_number', sa.String(length=100), nullable=True)) + op.drop_index(op.f('ix_data_asset_costs_registration_uuid'), table_name='asset_costs') + op.create_index(op.f('ix_data_asset_costs_cost_category'), 'asset_costs', ['cost_category'], unique=False, schema='data') + op.create_index(op.f('ix_data_asset_costs_invoice_number'), 'asset_costs', ['invoice_number'], unique=False, schema='data') + op.drop_constraint(op.f('asset_costs_driver_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_organization_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_asset_id_fkey'), 'asset_costs', type_='foreignkey') + op.create_foreign_key(None, 'asset_costs', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('asset_costs', 'driver_id') + op.drop_column('asset_costs', 'amount_eur') + op.drop_column('asset_costs', 'registration_uuid') + op.drop_column('asset_costs', 'exchange_rate_used') + op.drop_column('asset_costs', 'cost_type') + op.drop_column('asset_costs', 'mileage_at_cost') + op.drop_column('asset_costs', 'currency_local') + op.drop_column('asset_costs', 'amount_local') + op.drop_column('asset_costs', 'vat_rate') + op.drop_column('asset_costs', 'net_amount_local') + op.drop_index(op.f('ix_data_asset_events_registration_uuid'), table_name='asset_events') + op.drop_constraint(op.f('asset_events_asset_id_fkey'), 'asset_events', type_='foreignkey') + op.create_foreign_key(None, 'asset_events', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('asset_events', 'recorded_mileage') + op.drop_column('asset_events', 'data') + op.drop_column('asset_events', 'registration_uuid') + op.add_column('asset_financials', sa.Column('purchase_price_net', sa.Numeric(precision=18, scale=2), nullable=False)) + op.add_column('asset_financials', sa.Column('purchase_price_gross', sa.Numeric(precision=18, scale=2), nullable=False)) + op.add_column('asset_financials', sa.Column('vat_rate', sa.Numeric(precision=5, scale=2), nullable=False)) + op.add_column('asset_financials', sa.Column('activation_date', sa.DateTime(), nullable=True)) + op.add_column('asset_financials', sa.Column('accounting_details', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False)) + op.alter_column('asset_financials', 'financing_type', + existing_type=sa.VARCHAR(), + nullable=False) + op.drop_constraint(op.f('asset_financials_asset_id_fkey'), 'asset_financials', type_='foreignkey') + op.create_foreign_key(None, 'asset_financials', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('asset_financials', 'acquisition_date') + op.drop_column('asset_financials', 'residual_value_estimate') + op.drop_column('asset_financials', 'acquisition_price') + op.drop_constraint(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', type_='foreignkey') + op.drop_constraint(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', type_='foreignkey') + op.create_foreign_key(None, 'asset_reviews', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'asset_reviews', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('asset_reviews', 'criteria_scores') + op.drop_constraint(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', type_='foreignkey') + op.create_foreign_key(None, 'asset_telemetry', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('asset_telemetry', 'dbs_score') + op.drop_column('asset_telemetry', 'vqi_score') + op.drop_column('asset_telemetry', 'mileage_unit') + op.add_column('assets', sa.Column('first_registration_date', sa.DateTime(timezone=True), nullable=True)) + op.add_column('assets', sa.Column('current_mileage', sa.Integer(), nullable=False)) + op.add_column('assets', sa.Column('condition_score', sa.Integer(), nullable=False)) + op.add_column('assets', sa.Column('is_for_sale', sa.Boolean(), nullable=False)) + op.add_column('assets', sa.Column('price', sa.Numeric(precision=15, scale=2), nullable=True)) + op.add_column('assets', sa.Column('currency', sa.String(length=3), nullable=False)) + op.add_column('assets', sa.Column('individual_equipment', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False)) + op.drop_index(op.f('ix_data_assets_registration_uuid'), table_name='assets') + op.create_index(op.f('ix_data_assets_current_mileage'), 'assets', ['current_mileage'], unique=False, schema='data') + op.create_index(op.f('ix_data_assets_is_for_sale'), 'assets', ['is_for_sale'], unique=False, schema='data') + op.create_index(op.f('ix_data_assets_year_of_manufacture'), 'assets', ['year_of_manufacture'], unique=False, schema='data') + op.drop_constraint(op.f('assets_owner_org_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_operator_person_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_catalog_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_owner_person_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_operator_org_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_current_organization_id_fkey'), 'assets', type_='foreignkey') + op.create_foreign_key(None, 'assets', 'organizations', ['operator_org_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'assets', 'persons', ['owner_person_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'assets', 'organizations', ['owner_org_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'assets', 'persons', ['operator_person_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'assets', 'vehicle_catalog', ['catalog_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'assets', 'organizations', ['current_organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('assets', 'is_verified') + op.drop_column('assets', 'is_corporate') + op.drop_column('assets', 'catalog_match_score') + op.drop_column('assets', 'registration_uuid') + op.drop_column('assets', 'verification_notes') + op.drop_column('assets', 'verification_method') + op.alter_column('audit_logs', 'severity', + existing_type=postgresql.ENUM('info', 'warning', 'critical', 'emergency', name='log_severity'), + type_=postgresql.ENUM('info', 'warning', 'critical', 'emergency', name='log_severity', schema='data'), + existing_nullable=False) + op.drop_constraint(op.f('audit_logs_user_id_fkey'), 'audit_logs', type_='foreignkey') + op.create_foreign_key(None, 'audit_logs', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.drop_constraint(op.f('branches_address_id_fkey'), 'branches', type_='foreignkey') + op.drop_constraint(op.f('branches_organization_id_fkey'), 'branches', type_='foreignkey') + op.create_foreign_key(None, 'branches', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'branches', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('_make_model_class_uc'), 'catalog_discovery', type_='unique') + op.drop_index(op.f('ix_data_catalog_discovery_vehicle_class'), table_name='catalog_discovery') + op.create_unique_constraint('_make_model_uc', 'catalog_discovery', ['make', 'model'], schema='data') + op.drop_column('catalog_discovery', 'last_attempt') + op.drop_column('catalog_discovery', 'source') + op.drop_column('catalog_discovery', 'created_at') + op.drop_column('catalog_discovery', 'vehicle_class') + op.drop_column('catalog_discovery', 'priority_score') + op.drop_column('catalog_discovery', 'attempts') + op.drop_constraint(op.f('credit_logs_org_id_fkey'), 'credit_logs', type_='foreignkey') + op.create_foreign_key(None, 'credit_logs', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('exchange_rates_target_currency_key'), 'exchange_rates', type_='unique') + op.drop_column('exchange_rates', 'base_currency') + op.drop_column('exchange_rates', 'target_currency') + op.drop_constraint(op.f('feature_definitions_vehicle_type_id_fkey'), 'feature_definitions', type_='foreignkey') + op.create_foreign_key(None, 'feature_definitions', 'vehicle_types', ['vehicle_type_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', type_='foreignkey') + op.create_foreign_key(None, 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('model_feature_maps_model_definition_id_fkey'), 'model_feature_maps', type_='foreignkey') + op.drop_constraint(op.f('model_feature_maps_feature_id_fkey'), 'model_feature_maps', type_='foreignkey') + op.create_foreign_key(None, 'model_feature_maps', 'feature_definitions', ['feature_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'model_feature_maps', 'vehicle_model_definitions', ['model_definition_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('org_sales_assignments_agent_user_id_fkey'), 'org_sales_assignments', type_='foreignkey') + op.drop_constraint(op.f('org_sales_assignments_organization_id_fkey'), 'org_sales_assignments', type_='foreignkey') + op.create_foreign_key(None, 'org_sales_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_sales_assignments', 'users', ['agent_user_id'], ['id'], source_schema='data', referent_schema='identity') + op.drop_constraint(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.drop_constraint(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.create_foreign_key(None, 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_subscriptions', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('organization_financials_organization_id_fkey'), 'organization_financials', type_='foreignkey') + op.create_foreign_key(None, 'organization_financials', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('organization_members', 'role', + existing_type=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole'), + type_=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole', schema='data'), + existing_nullable=False) + op.drop_constraint(op.f('organization_members_person_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_organization_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_user_id_fkey'), 'organization_members', type_='foreignkey') + op.create_foreign_key(None, 'organization_members', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'organization_members', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organization_members', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='identity') + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data'), + existing_nullable=False) + op.drop_constraint(op.f('organizations_address_id_fkey'), 'organizations', type_='foreignkey') + op.drop_constraint(op.f('organizations_owner_id_fkey'), 'organizations', type_='foreignkey') + op.create_foreign_key(None, 'organizations', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organizations', 'users', ['owner_id'], ['id'], source_schema='data', referent_schema='identity') + op.drop_constraint(op.f('points_ledger_user_id_fkey'), 'points_ledger', type_='foreignkey') + op.create_foreign_key(None, 'points_ledger', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.drop_constraint(op.f('ratings_author_id_fkey'), 'ratings', type_='foreignkey') + op.drop_constraint(op.f('ratings_target_branch_id_fkey'), 'ratings', type_='foreignkey') + op.drop_constraint(op.f('ratings_target_user_id_fkey'), 'ratings', type_='foreignkey') + op.drop_constraint(op.f('ratings_target_organization_id_fkey'), 'ratings', type_='foreignkey') + op.create_foreign_key(None, 'ratings', 'users', ['author_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'ratings', 'users', ['target_user_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'ratings', 'branches', ['target_branch_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'ratings', 'organizations', ['target_organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_expertises_expertise_id_fkey'), 'service_expertises', type_='foreignkey') + op.drop_constraint(op.f('service_expertises_service_id_fkey'), 'service_expertises', type_='foreignkey') + op.create_foreign_key(None, 'service_expertises', 'service_profiles', ['service_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'service_expertises', 'expertise_tags', ['expertise_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_index(op.f('idx_service_profiles_location'), table_name='service_profiles', postgresql_using='gist') + op.drop_constraint(op.f('service_profiles_organization_id_fkey'), 'service_profiles', type_='foreignkey') + op.drop_constraint(op.f('service_profiles_parent_id_fkey'), 'service_profiles', type_='foreignkey') + op.create_foreign_key(None, 'service_profiles', 'service_profiles', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'service_profiles', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_specialties_parent_id_fkey'), 'service_specialties', type_='foreignkey') + op.create_foreign_key(None, 'service_specialties', 'service_specialties', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_badges_user_id_fkey'), 'user_badges', type_='foreignkey') + op.drop_constraint(op.f('user_badges_badge_id_fkey'), 'user_badges', type_='foreignkey') + op.create_foreign_key(None, 'user_badges', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'user_badges', 'badges', ['badge_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_stats_user_id_fkey'), 'user_stats', type_='foreignkey') + op.create_foreign_key(None, 'user_stats', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.drop_index(op.f('ix_data_vehicle_catalog_engine_variant'), table_name='vehicle_catalog') + op.drop_constraint(op.f('uix_vehicle_catalog_full'), 'vehicle_catalog', type_='unique') + op.create_unique_constraint('uix_vehicle_catalog_full', 'vehicle_catalog', ['make', 'model', 'year_from', 'fuel_type'], schema='data') + op.drop_constraint(op.f('vehicle_catalog_master_definition_id_fkey'), 'vehicle_catalog', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_catalog', 'vehicle_model_definitions', ['master_definition_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('vehicle_catalog', 'axle_count') + op.drop_column('vehicle_catalog', 'engine_variant') + op.drop_column('vehicle_catalog', 'vehicle_class') + op.drop_column('vehicle_catalog', 'euro_class') + op.drop_column('vehicle_catalog', 'engine_code') + op.drop_column('vehicle_catalog', 'body_type') + op.drop_column('vehicle_catalog', 'max_weight_kg') + #op.add_column('vehicle_model_definitions', sa.Column('body_type', sa.String(length=100), nullable=True)) + #op.add_column('vehicle_model_definitions', sa.Column('torque_nm', sa.Integer(), nullable=True)) + #op.add_column('vehicle_model_definitions', sa.Column('cylinder_layout', sa.String(length=50), nullable=True)) + #op.add_column('vehicle_model_definitions', sa.Column('transmission_type', sa.String(length=50), nullable=True)) + #op.add_column('vehicle_model_definitions', sa.Column('drive_type', sa.String(length=50), nullable=True)) + #op.add_column('vehicle_model_definitions', sa.Column('source', sa.String(length=100), nullable=True)) + op.alter_column('vehicle_model_definitions', 'make', + existing_type=sa.VARCHAR(length=50), + type_=sa.String(length=100), + existing_nullable=False) + op.alter_column('vehicle_model_definitions', 'technical_code', + existing_type=sa.VARCHAR(length=50), + type_=sa.String(length=100), + existing_nullable=False) + op.alter_column('vehicle_model_definitions', 'marketing_name', + existing_type=sa.VARCHAR(length=100), + type_=sa.String(length=150), + existing_nullable=True) + op.alter_column('vehicle_model_definitions', 'engine_capacity', + existing_type=sa.INTEGER(), + nullable=False) + op.alter_column('vehicle_model_definitions', 'power_kw', + existing_type=sa.INTEGER(), + nullable=False) + op.create_index(op.f('ix_data_vehicle_model_definitions_engine_capacity'), 'vehicle_model_definitions', ['engine_capacity'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_fuel_type'), 'vehicle_model_definitions', ['fuel_type'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_power_kw'), 'vehicle_model_definitions', ['power_kw'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_vehicle_class'), 'vehicle_model_definitions', ['vehicle_class'], unique=False, schema='data') + op.drop_constraint(op.f('vehicle_model_definitions_vehicle_type_id_fkey'), 'vehicle_model_definitions', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_model_definitions', 'vehicle_types', ['vehicle_type_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('persons_address_id_fkey'), 'persons', schema='identity', type_='foreignkey') + op.create_foreign_key(None, 'persons', 'addresses', ['address_id'], ['id'], source_schema='identity', referent_schema='data') + op.alter_column('pending_actions', 'status', + existing_type=sa.VARCHAR(length=20), + type_=sa.Enum('pending', 'approved', 'rejected', 'expired', name='actionstatus', schema='system'), + existing_nullable=False, + existing_server_default=sa.text("'pending'::character varying"), + schema='system') + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.alter_column('pending_actions', 'status', + existing_type=sa.Enum('pending', 'approved', 'rejected', 'expired', name='actionstatus', schema='system'), + type_=sa.VARCHAR(length=20), + existing_nullable=False, + existing_server_default=sa.text("'pending'::character varying"), + schema='system') + op.drop_constraint(None, 'persons', schema='identity', type_='foreignkey') + op.create_foreign_key(op.f('persons_address_id_fkey'), 'persons', 'addresses', ['address_id'], ['id'], source_schema='identity') + op.drop_constraint(None, 'vehicle_model_definitions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_model_definitions_vehicle_type_id_fkey'), 'vehicle_model_definitions', 'vehicle_types', ['vehicle_type_id'], ['id']) + op.drop_index(op.f('ix_data_vehicle_model_definitions_vehicle_class'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_power_kw'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_fuel_type'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_engine_capacity'), table_name='vehicle_model_definitions', schema='data') + op.alter_column('vehicle_model_definitions', 'power_kw', + existing_type=sa.INTEGER(), + nullable=True) + op.alter_column('vehicle_model_definitions', 'engine_capacity', + existing_type=sa.INTEGER(), + nullable=True) + op.alter_column('vehicle_model_definitions', 'marketing_name', + existing_type=sa.String(length=150), + type_=sa.VARCHAR(length=100), + existing_nullable=True) + op.alter_column('vehicle_model_definitions', 'technical_code', + existing_type=sa.String(length=100), + type_=sa.VARCHAR(length=50), + existing_nullable=False) + op.alter_column('vehicle_model_definitions', 'make', + existing_type=sa.String(length=100), + type_=sa.VARCHAR(length=50), + existing_nullable=False) + op.drop_column('vehicle_model_definitions', 'source') + op.drop_column('vehicle_model_definitions', 'drive_type') + op.drop_column('vehicle_model_definitions', 'transmission_type') + op.drop_column('vehicle_model_definitions', 'cylinder_layout') + op.drop_column('vehicle_model_definitions', 'torque_nm') + op.drop_column('vehicle_model_definitions', 'body_type') + op.add_column('vehicle_catalog', sa.Column('max_weight_kg', sa.INTEGER(), autoincrement=False, nullable=True)) + op.add_column('vehicle_catalog', sa.Column('body_type', sa.VARCHAR(length=100), autoincrement=False, nullable=True)) + op.add_column('vehicle_catalog', sa.Column('engine_code', sa.VARCHAR(), autoincrement=False, nullable=True)) + op.add_column('vehicle_catalog', sa.Column('euro_class', sa.VARCHAR(length=20), autoincrement=False, nullable=True)) + op.add_column('vehicle_catalog', sa.Column('vehicle_class', sa.VARCHAR(), autoincrement=False, nullable=True)) + op.add_column('vehicle_catalog', sa.Column('engine_variant', sa.VARCHAR(), autoincrement=False, nullable=True)) + op.add_column('vehicle_catalog', sa.Column('axle_count', sa.INTEGER(), autoincrement=False, nullable=True)) + op.drop_constraint(None, 'vehicle_catalog', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_catalog_master_definition_id_fkey'), 'vehicle_catalog', 'vehicle_model_definitions', ['master_definition_id'], ['id']) + op.drop_constraint('uix_vehicle_catalog_full', 'vehicle_catalog', schema='data', type_='unique') + op.create_unique_constraint(op.f('uix_vehicle_catalog_full'), 'vehicle_catalog', ['make', 'model', 'year_from', 'engine_variant', 'fuel_type'], postgresql_nulls_not_distinct=False) + op.create_index(op.f('ix_data_vehicle_catalog_engine_variant'), 'vehicle_catalog', ['engine_variant'], unique=False) + op.drop_constraint(None, 'user_stats', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_stats_user_id_fkey'), 'user_stats', 'users', ['user_id'], ['id'], referent_schema='identity') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_badges_badge_id_fkey'), 'user_badges', 'badges', ['badge_id'], ['id']) + op.create_foreign_key(op.f('user_badges_user_id_fkey'), 'user_badges', 'users', ['user_id'], ['id'], referent_schema='identity') + op.drop_constraint(None, 'service_specialties', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_specialties_parent_id_fkey'), 'service_specialties', 'service_specialties', ['parent_id'], ['id']) + op.drop_constraint(None, 'service_profiles', schema='data', type_='foreignkey') + op.drop_constraint(None, 'service_profiles', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_profiles_parent_id_fkey'), 'service_profiles', 'service_profiles', ['parent_id'], ['id']) + op.create_foreign_key(op.f('service_profiles_organization_id_fkey'), 'service_profiles', 'organizations', ['organization_id'], ['id']) + op.create_index(op.f('idx_service_profiles_location'), 'service_profiles', ['location'], unique=False, postgresql_using='gist') + op.drop_constraint(None, 'service_expertises', schema='data', type_='foreignkey') + op.drop_constraint(None, 'service_expertises', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_expertises_service_id_fkey'), 'service_expertises', 'service_profiles', ['service_id'], ['id']) + op.create_foreign_key(op.f('service_expertises_expertise_id_fkey'), 'service_expertises', 'expertise_tags', ['expertise_id'], ['id']) + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('ratings_target_organization_id_fkey'), 'ratings', 'organizations', ['target_organization_id'], ['id']) + op.create_foreign_key(op.f('ratings_target_user_id_fkey'), 'ratings', 'users', ['target_user_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('ratings_target_branch_id_fkey'), 'ratings', 'branches', ['target_branch_id'], ['id']) + op.create_foreign_key(op.f('ratings_author_id_fkey'), 'ratings', 'users', ['author_id'], ['id'], referent_schema='identity') + op.drop_constraint(None, 'points_ledger', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('points_ledger_user_id_fkey'), 'points_ledger', 'users', ['user_id'], ['id'], referent_schema='identity') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organizations_owner_id_fkey'), 'organizations', 'users', ['owner_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('organizations_address_id_fkey'), 'organizations', 'addresses', ['address_id'], ['id']) + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + existing_nullable=False) + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_members_user_id_fkey'), 'organization_members', 'users', ['user_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('organization_members_organization_id_fkey'), 'organization_members', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('organization_members_person_id_fkey'), 'organization_members', 'persons', ['person_id'], ['id'], referent_schema='identity') + op.alter_column('organization_members', 'role', + existing_type=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole', schema='data'), + type_=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole'), + existing_nullable=False) + op.drop_constraint(None, 'organization_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_financials_organization_id_fkey'), 'organization_financials', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', 'organizations', ['org_id'], ['id']) + op.create_foreign_key(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id']) + op.drop_constraint(None, 'org_sales_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_sales_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_sales_assignments_organization_id_fkey'), 'org_sales_assignments', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('org_sales_assignments_agent_user_id_fkey'), 'org_sales_assignments', 'users', ['agent_user_id'], ['id'], referent_schema='identity') + op.drop_constraint(None, 'model_feature_maps', schema='data', type_='foreignkey') + op.drop_constraint(None, 'model_feature_maps', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('model_feature_maps_feature_id_fkey'), 'model_feature_maps', 'feature_definitions', ['feature_id'], ['id']) + op.create_foreign_key(op.f('model_feature_maps_model_definition_id_fkey'), 'model_feature_maps', 'vehicle_model_definitions', ['model_definition_id'], ['id']) + op.drop_constraint(None, 'geo_streets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_constraint(None, 'feature_definitions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('feature_definitions_vehicle_type_id_fkey'), 'feature_definitions', 'vehicle_types', ['vehicle_type_id'], ['id']) + op.add_column('exchange_rates', sa.Column('target_currency', sa.VARCHAR(length=3), autoincrement=False, nullable=True)) + op.add_column('exchange_rates', sa.Column('base_currency', sa.VARCHAR(length=3), autoincrement=False, nullable=False)) + op.create_unique_constraint(op.f('exchange_rates_target_currency_key'), 'exchange_rates', ['target_currency'], postgresql_nulls_not_distinct=False) + op.drop_constraint(None, 'credit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('credit_logs_org_id_fkey'), 'credit_logs', 'organizations', ['org_id'], ['id']) + op.add_column('catalog_discovery', sa.Column('attempts', sa.INTEGER(), autoincrement=False, nullable=False)) + op.add_column('catalog_discovery', sa.Column('priority_score', sa.INTEGER(), server_default=sa.text('0'), autoincrement=False, nullable=True)) + op.add_column('catalog_discovery', sa.Column('vehicle_class', sa.VARCHAR(length=50), autoincrement=False, nullable=True)) + op.add_column('catalog_discovery', sa.Column('created_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=False)) + op.add_column('catalog_discovery', sa.Column('source', sa.VARCHAR(length=50), autoincrement=False, nullable=True)) + op.add_column('catalog_discovery', sa.Column('last_attempt', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True)) + op.drop_constraint('_make_model_uc', 'catalog_discovery', schema='data', type_='unique') + op.create_index(op.f('ix_data_catalog_discovery_vehicle_class'), 'catalog_discovery', ['vehicle_class'], unique=False) + op.create_unique_constraint(op.f('_make_model_class_uc'), 'catalog_discovery', ['make', 'model', 'vehicle_class'], postgresql_nulls_not_distinct=False) + op.drop_constraint(None, 'branches', schema='data', type_='foreignkey') + op.drop_constraint(None, 'branches', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('branches_organization_id_fkey'), 'branches', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('branches_address_id_fkey'), 'branches', 'addresses', ['address_id'], ['id']) + op.drop_constraint(None, 'audit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('audit_logs_user_id_fkey'), 'audit_logs', 'users', ['user_id'], ['id'], referent_schema='identity') + op.alter_column('audit_logs', 'severity', + existing_type=postgresql.ENUM('info', 'warning', 'critical', 'emergency', name='log_severity', schema='data'), + type_=postgresql.ENUM('info', 'warning', 'critical', 'emergency', name='log_severity'), + existing_nullable=False) + op.add_column('assets', sa.Column('verification_method', sa.VARCHAR(length=20), autoincrement=False, nullable=True)) + op.add_column('assets', sa.Column('verification_notes', sa.TEXT(), autoincrement=False, nullable=True)) + op.add_column('assets', sa.Column('registration_uuid', sa.UUID(), autoincrement=False, nullable=False)) + op.add_column('assets', sa.Column('catalog_match_score', sa.NUMERIC(precision=5, scale=2), autoincrement=False, nullable=True)) + op.add_column('assets', sa.Column('is_corporate', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=False)) + op.add_column('assets', sa.Column('is_verified', sa.BOOLEAN(), autoincrement=False, nullable=False)) + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('assets_current_organization_id_fkey'), 'assets', 'organizations', ['current_organization_id'], ['id']) + op.create_foreign_key(op.f('assets_operator_org_id_fkey'), 'assets', 'organizations', ['operator_org_id'], ['id']) + op.create_foreign_key(op.f('assets_owner_person_id_fkey'), 'assets', 'persons', ['owner_person_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('assets_catalog_id_fkey'), 'assets', 'vehicle_catalog', ['catalog_id'], ['id']) + op.create_foreign_key(op.f('assets_operator_person_id_fkey'), 'assets', 'persons', ['operator_person_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('assets_owner_org_id_fkey'), 'assets', 'organizations', ['owner_org_id'], ['id']) + op.drop_index(op.f('ix_data_assets_year_of_manufacture'), table_name='assets', schema='data') + op.drop_index(op.f('ix_data_assets_is_for_sale'), table_name='assets', schema='data') + op.drop_index(op.f('ix_data_assets_current_mileage'), table_name='assets', schema='data') + op.create_index(op.f('ix_data_assets_registration_uuid'), 'assets', ['registration_uuid'], unique=False) + op.drop_column('assets', 'individual_equipment') + op.drop_column('assets', 'currency') + op.drop_column('assets', 'price') + op.drop_column('assets', 'is_for_sale') + op.drop_column('assets', 'condition_score') + op.drop_column('assets', 'current_mileage') + op.drop_column('assets', 'first_registration_date') + op.add_column('asset_telemetry', sa.Column('mileage_unit', sa.VARCHAR(length=10), autoincrement=False, nullable=False)) + op.add_column('asset_telemetry', sa.Column('vqi_score', sa.NUMERIC(precision=5, scale=2), autoincrement=False, nullable=False)) + op.add_column('asset_telemetry', sa.Column('dbs_score', sa.NUMERIC(precision=5, scale=2), autoincrement=False, nullable=False)) + op.drop_constraint(None, 'asset_telemetry', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', 'assets', ['asset_id'], ['id']) + op.add_column('asset_reviews', sa.Column('criteria_scores', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), autoincrement=False, nullable=False)) + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', 'users', ['user_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', 'assets', ['asset_id'], ['id']) + op.add_column('asset_financials', sa.Column('acquisition_price', sa.NUMERIC(precision=18, scale=2), autoincrement=False, nullable=True)) + op.add_column('asset_financials', sa.Column('residual_value_estimate', sa.NUMERIC(precision=18, scale=2), autoincrement=False, nullable=True)) + op.add_column('asset_financials', sa.Column('acquisition_date', postgresql.TIMESTAMP(), autoincrement=False, nullable=True)) + op.drop_constraint(None, 'asset_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_financials_asset_id_fkey'), 'asset_financials', 'assets', ['asset_id'], ['id']) + op.alter_column('asset_financials', 'financing_type', + existing_type=sa.VARCHAR(), + nullable=True) + op.drop_column('asset_financials', 'accounting_details') + op.drop_column('asset_financials', 'activation_date') + op.drop_column('asset_financials', 'vat_rate') + op.drop_column('asset_financials', 'purchase_price_gross') + op.drop_column('asset_financials', 'purchase_price_net') + op.add_column('asset_events', sa.Column('registration_uuid', sa.UUID(), autoincrement=False, nullable=True)) + op.add_column('asset_events', sa.Column('data', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), autoincrement=False, nullable=False)) + op.add_column('asset_events', sa.Column('recorded_mileage', sa.INTEGER(), autoincrement=False, nullable=True)) + op.drop_constraint(None, 'asset_events', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_events_asset_id_fkey'), 'asset_events', 'assets', ['asset_id'], ['id']) + op.create_index(op.f('ix_data_asset_events_registration_uuid'), 'asset_events', ['registration_uuid'], unique=False) + op.add_column('asset_costs', sa.Column('net_amount_local', sa.NUMERIC(precision=18, scale=2), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('vat_rate', sa.NUMERIC(precision=5, scale=2), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('amount_local', sa.NUMERIC(precision=18, scale=2), autoincrement=False, nullable=False)) + op.add_column('asset_costs', sa.Column('currency_local', sa.VARCHAR(length=3), autoincrement=False, nullable=False)) + op.add_column('asset_costs', sa.Column('mileage_at_cost', sa.INTEGER(), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('cost_type', sa.VARCHAR(length=50), autoincrement=False, nullable=False)) + op.add_column('asset_costs', sa.Column('exchange_rate_used', sa.NUMERIC(precision=18, scale=6), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('registration_uuid', sa.UUID(), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('amount_eur', sa.NUMERIC(precision=18, scale=2), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('driver_id', sa.INTEGER(), autoincrement=False, nullable=True)) + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_costs_asset_id_fkey'), 'asset_costs', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_organization_id_fkey'), 'asset_costs', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_driver_id_fkey'), 'asset_costs', 'users', ['driver_id'], ['id'], referent_schema='identity') + op.drop_index(op.f('ix_data_asset_costs_invoice_number'), table_name='asset_costs', schema='data') + op.drop_index(op.f('ix_data_asset_costs_cost_category'), table_name='asset_costs', schema='data') + op.create_index(op.f('ix_data_asset_costs_registration_uuid'), 'asset_costs', ['registration_uuid'], unique=False) + op.drop_column('asset_costs', 'invoice_number') + op.drop_column('asset_costs', 'currency') + op.drop_column('asset_costs', 'amount_net') + op.drop_column('asset_costs', 'cost_category') + op.add_column('asset_assignments', sa.Column('assigned_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=False)) + op.add_column('asset_assignments', sa.Column('branch_id', sa.UUID(), autoincrement=False, nullable=True)) + op.add_column('asset_assignments', sa.Column('released_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True)) + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_branch_id_fkey'), 'asset_assignments', 'branches', ['branch_id'], ['id']) + op.drop_constraint(None, 'addresses', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('addresses_postal_code_id_fkey'), 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id']) + #op.create_table('spatial_ref_sys', + #sa.Column('srid', sa.INTEGER(), autoincrement=False, nullable=False), + #sa.Column('auth_name', sa.VARCHAR(length=256), autoincrement=False, nullable=True), + #sa.Column('auth_srid', sa.INTEGER(), autoincrement=False, nullable=True), + #sa.Column('srtext', sa.VARCHAR(length=2048), autoincrement=False, nullable=True), + #sa.Column('proj4text', sa.VARCHAR(length=2048), autoincrement=False, nullable=True), + #sa.CheckConstraint('srid > 0 AND srid <= 998999', name=op.f('spatial_ref_sys_srid_check')), + #sa.PrimaryKeyConstraint('srid', name=op.f('spatial_ref_sys_pkey')), + #schema='public' + #) + op.drop_table('vehicle_ownership_history', schema='data') + op.drop_index(op.f('ix_data_vehicle_logbook_trip_type'), table_name='vehicle_logbook', schema='data') + op.drop_table('vehicle_logbook', schema='data') + op.drop_table('asset_inspections', schema='data') + # ### end Alembic commands ### diff --git a/backend/migrations/versions/1d75b3806b43_fix_organization_lifecycle_columns.py b/backend/migrations/versions/1d75b3806b43_fix_organization_lifecycle_columns.py new file mode 100755 index 0000000..c4ac2f7 --- /dev/null +++ b/backend/migrations/versions/1d75b3806b43_fix_organization_lifecycle_columns.py @@ -0,0 +1,28 @@ +"""fix_organization_lifecycle_columns + +Revision ID: 1d75b3806b43 +Revises: 2f72e7ae52bb +Create Date: 2026-02-28 00:12:42.714132 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = '1d75b3806b43' +down_revision: Union[str, Sequence[str], None] = '2f72e7ae52bb' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + pass + + +def downgrade() -> None: + """Downgrade schema.""" + pass diff --git a/backend/migrations/versions/2f72e7ae52bb_fix_system_param_types.py b/backend/migrations/versions/2f72e7ae52bb_fix_system_param_types.py new file mode 100755 index 0000000..6ebc8b7 --- /dev/null +++ b/backend/migrations/versions/2f72e7ae52bb_fix_system_param_types.py @@ -0,0 +1,28 @@ +"""fix_system_param_types + +Revision ID: 2f72e7ae52bb +Revises: 5bd7f1cb0dc9 +Create Date: 2026-02-28 00:01:56.691221 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = '2f72e7ae52bb' +down_revision: Union[str, Sequence[str], None] = '5bd7f1cb0dc9' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + pass + + +def downgrade() -> None: + """Downgrade schema.""" + pass diff --git a/backend/migrations/versions/429ffa7dd5e1_add_org_lifecycle_and_twin_logic.py b/backend/migrations/versions/429ffa7dd5e1_add_org_lifecycle_and_twin_logic.py new file mode 100755 index 0000000..8bd0c6d --- /dev/null +++ b/backend/migrations/versions/429ffa7dd5e1_add_org_lifecycle_and_twin_logic.py @@ -0,0 +1,538 @@ +"""add_org_lifecycle_and_twin_logic + +Revision ID: 429ffa7dd5e1 +Revises: 7e5a1b721dfb +Create Date: 2026-02-27 04:53:44.271337 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = '429ffa7dd5e1' +down_revision: Union[str, Sequence[str], None] = '7e5a1b721dfb' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(op.f('addresses_postal_code_id_fkey'), 'addresses', type_='foreignkey') + op.create_foreign_key(None, 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_assignments_branch_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', type_='foreignkey') + op.create_foreign_key(None, 'asset_assignments', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('asset_assignments', 'assigned_at') + op.drop_column('asset_assignments', 'released_at') + op.drop_column('asset_assignments', 'branch_id') + op.drop_index(op.f('ix_data_asset_costs_registration_uuid'), table_name='asset_costs') + op.create_index(op.f('ix_data_asset_costs_cost_category'), 'asset_costs', ['cost_category'], unique=False, schema='data') + op.create_index(op.f('ix_data_asset_costs_invoice_number'), 'asset_costs', ['invoice_number'], unique=False, schema='data') + op.drop_constraint(op.f('asset_costs_driver_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_organization_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_asset_id_fkey'), 'asset_costs', type_='foreignkey') + op.create_foreign_key(None, 'asset_costs', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('asset_costs', 'amount_local') + op.drop_column('asset_costs', 'mileage_at_cost') + op.drop_column('asset_costs', 'net_amount_local') + op.drop_column('asset_costs', 'exchange_rate_used') + op.drop_column('asset_costs', 'driver_id') + op.drop_column('asset_costs', 'vat_rate') + op.drop_column('asset_costs', 'amount_eur') + op.drop_column('asset_costs', 'cost_type') + op.drop_column('asset_costs', 'registration_uuid') + op.drop_column('asset_costs', 'currency_local') + op.drop_index(op.f('ix_data_asset_events_registration_uuid'), table_name='asset_events') + op.drop_constraint(op.f('asset_events_asset_id_fkey'), 'asset_events', type_='foreignkey') + op.create_foreign_key(None, 'asset_events', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('asset_events', 'recorded_mileage') + op.drop_column('asset_events', 'data') + op.drop_column('asset_events', 'registration_uuid') + op.alter_column('asset_financials', 'financing_type', + existing_type=sa.VARCHAR(), + nullable=False) + op.drop_constraint(op.f('asset_financials_asset_id_fkey'), 'asset_financials', type_='foreignkey') + op.create_foreign_key(None, 'asset_financials', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('asset_financials', 'acquisition_date') + op.drop_column('asset_financials', 'acquisition_price') + op.drop_column('asset_financials', 'residual_value_estimate') + op.drop_index(op.f('ix_data_asset_inspections_asset_id'), table_name='asset_inspections') + op.drop_index(op.f('ix_data_asset_inspections_inspector_id'), table_name='asset_inspections') + op.drop_constraint(op.f('fk_asset_inspections_inspector'), 'asset_inspections', type_='foreignkey') + op.drop_constraint(op.f('fk_asset_inspections_asset'), 'asset_inspections', type_='foreignkey') + op.create_foreign_key(None, 'asset_inspections', 'users', ['inspector_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'asset_inspections', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', type_='foreignkey') + op.drop_constraint(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', type_='foreignkey') + op.create_foreign_key(None, 'asset_reviews', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'asset_reviews', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('asset_reviews', 'criteria_scores') + op.drop_constraint(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', type_='foreignkey') + op.create_foreign_key(None, 'asset_telemetry', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('asset_telemetry', 'vqi_score') + op.drop_column('asset_telemetry', 'mileage_unit') + op.drop_column('asset_telemetry', 'dbs_score') + op.drop_index(op.f('ix_data_assets_registration_uuid'), table_name='assets') + op.create_index(op.f('ix_data_assets_current_mileage'), 'assets', ['current_mileage'], unique=False, schema='data') + op.create_index(op.f('ix_data_assets_is_for_sale'), 'assets', ['is_for_sale'], unique=False, schema='data') + op.create_index(op.f('ix_data_assets_year_of_manufacture'), 'assets', ['year_of_manufacture'], unique=False, schema='data') + op.drop_constraint(op.f('assets_operator_org_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_operator_person_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_catalog_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_owner_person_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_owner_org_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_current_organization_id_fkey'), 'assets', type_='foreignkey') + op.create_foreign_key(None, 'assets', 'organizations', ['current_organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'assets', 'persons', ['operator_person_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'assets', 'organizations', ['owner_org_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'assets', 'organizations', ['operator_org_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'assets', 'vehicle_catalog', ['catalog_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'assets', 'persons', ['owner_person_id'], ['id'], source_schema='data', referent_schema='identity') + op.drop_column('assets', 'catalog_match_score') + op.drop_column('assets', 'is_verified') + op.drop_column('assets', 'is_corporate') + op.drop_column('assets', 'verification_notes') + op.drop_column('assets', 'verification_method') + op.drop_column('assets', 'registration_uuid') + op.alter_column('audit_logs', 'severity', + existing_type=postgresql.ENUM('info', 'warning', 'critical', 'emergency', name='log_severity'), + type_=postgresql.ENUM('info', 'warning', 'critical', 'emergency', name='log_severity', schema='data'), + existing_nullable=False) + op.drop_constraint(op.f('audit_logs_user_id_fkey'), 'audit_logs', type_='foreignkey') + op.create_foreign_key(None, 'audit_logs', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.drop_constraint(op.f('branches_address_id_fkey'), 'branches', type_='foreignkey') + op.drop_constraint(op.f('branches_organization_id_fkey'), 'branches', type_='foreignkey') + op.create_foreign_key(None, 'branches', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'branches', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + # op.add_column('catalog_discovery', sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False)) + op.drop_constraint(op.f('_make_model_class_uc'), 'catalog_discovery', type_='unique') + op.drop_index(op.f('ix_data_catalog_discovery_vehicle_class'), table_name='catalog_discovery') + op.create_unique_constraint('_make_model_uc', 'catalog_discovery', ['make', 'model'], schema='data') + op.drop_column('catalog_discovery', 'created_at') + op.drop_column('catalog_discovery', 'priority_score') + op.drop_column('catalog_discovery', 'vehicle_class') + op.drop_column('catalog_discovery', 'last_attempt') + op.drop_column('catalog_discovery', 'source') + op.drop_constraint(op.f('credit_logs_org_id_fkey'), 'credit_logs', type_='foreignkey') + op.create_foreign_key(None, 'credit_logs', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('exchange_rates_target_currency_key'), 'exchange_rates', type_='unique') + op.drop_column('exchange_rates', 'target_currency') + op.drop_column('exchange_rates', 'base_currency') + op.drop_constraint(op.f('feature_definitions_vehicle_type_id_fkey'), 'feature_definitions', type_='foreignkey') + op.create_foreign_key(None, 'feature_definitions', 'vehicle_types', ['vehicle_type_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', type_='foreignkey') + op.create_foreign_key(None, 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('model_feature_maps_model_definition_id_fkey'), 'model_feature_maps', type_='foreignkey') + op.drop_constraint(op.f('model_feature_maps_feature_id_fkey'), 'model_feature_maps', type_='foreignkey') + op.create_foreign_key(None, 'model_feature_maps', 'feature_definitions', ['feature_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'model_feature_maps', 'vehicle_model_definitions', ['model_definition_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('org_sales_assignments_organization_id_fkey'), 'org_sales_assignments', type_='foreignkey') + op.drop_constraint(op.f('org_sales_assignments_agent_user_id_fkey'), 'org_sales_assignments', type_='foreignkey') + op.create_foreign_key(None, 'org_sales_assignments', 'users', ['agent_user_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'org_sales_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.drop_constraint(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.create_foreign_key(None, 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_subscriptions', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('organization_financials_organization_id_fkey'), 'organization_financials', type_='foreignkey') + op.create_foreign_key(None, 'organization_financials', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('organization_members', 'role', + existing_type=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole'), + type_=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole', schema='data'), + existing_nullable=False) + op.drop_constraint(op.f('organization_members_person_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_user_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_organization_id_fkey'), 'organization_members', type_='foreignkey') + op.create_foreign_key(None, 'organization_members', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'organization_members', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'organization_members', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.add_column('organizations', sa.Column('legal_owner_id', sa.BigInteger(), nullable=True)) + op.add_column('organizations', sa.Column('first_registered_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False)) + op.add_column('organizations', sa.Column('current_lifecycle_started_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False)) + op.add_column('organizations', sa.Column('last_deactivated_at', sa.DateTime(timezone=True), nullable=True)) + op.add_column('organizations', sa.Column('lifecycle_index', sa.Integer(), server_default=sa.text('1'), nullable=False)) + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data'), + existing_nullable=False) + op.create_index(op.f('ix_data_organizations_legal_owner_id'), 'organizations', ['legal_owner_id'], unique=False, schema='data') + op.drop_constraint(op.f('organizations_address_id_fkey'), 'organizations', type_='foreignkey') + op.drop_constraint(op.f('organizations_owner_id_fkey'), 'organizations', type_='foreignkey') + op.create_foreign_key(None, 'organizations', 'persons', ['legal_owner_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'organizations', 'users', ['owner_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'organizations', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('points_ledger_user_id_fkey'), 'points_ledger', type_='foreignkey') + op.create_foreign_key(None, 'points_ledger', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.drop_constraint(op.f('ratings_target_branch_id_fkey'), 'ratings', type_='foreignkey') + op.drop_constraint(op.f('ratings_author_id_fkey'), 'ratings', type_='foreignkey') + op.drop_constraint(op.f('ratings_target_organization_id_fkey'), 'ratings', type_='foreignkey') + op.drop_constraint(op.f('ratings_target_user_id_fkey'), 'ratings', type_='foreignkey') + op.create_foreign_key(None, 'ratings', 'branches', ['target_branch_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'ratings', 'organizations', ['target_organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'ratings', 'users', ['target_user_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'ratings', 'users', ['author_id'], ['id'], source_schema='data', referent_schema='identity') + op.drop_constraint(op.f('service_expertises_service_id_fkey'), 'service_expertises', type_='foreignkey') + op.drop_constraint(op.f('service_expertises_expertise_id_fkey'), 'service_expertises', type_='foreignkey') + op.create_foreign_key(None, 'service_expertises', 'service_profiles', ['service_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'service_expertises', 'expertise_tags', ['expertise_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_index(op.f('idx_service_profiles_location'), table_name='service_profiles', postgresql_using='gist') + op.drop_constraint(op.f('service_profiles_parent_id_fkey'), 'service_profiles', type_='foreignkey') + op.drop_constraint(op.f('service_profiles_organization_id_fkey'), 'service_profiles', type_='foreignkey') + op.create_foreign_key(None, 'service_profiles', 'service_profiles', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'service_profiles', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data', ondelete='SET NULL') + op.drop_constraint(op.f('service_specialties_parent_id_fkey'), 'service_specialties', type_='foreignkey') + op.create_foreign_key(None, 'service_specialties', 'service_specialties', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_badges_user_id_fkey'), 'user_badges', type_='foreignkey') + op.drop_constraint(op.f('user_badges_badge_id_fkey'), 'user_badges', type_='foreignkey') + op.create_foreign_key(None, 'user_badges', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'user_badges', 'badges', ['badge_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_stats_user_id_fkey'), 'user_stats', type_='foreignkey') + op.create_foreign_key(None, 'user_stats', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.drop_index(op.f('ix_data_vehicle_catalog_engine_variant'), table_name='vehicle_catalog') + op.drop_constraint(op.f('uix_vehicle_catalog_full'), 'vehicle_catalog', type_='unique') + op.create_unique_constraint('uix_vehicle_catalog_full', 'vehicle_catalog', ['make', 'model', 'year_from', 'fuel_type'], schema='data') + op.drop_constraint(op.f('vehicle_catalog_master_definition_id_fkey'), 'vehicle_catalog', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_catalog', 'vehicle_model_definitions', ['master_definition_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('vehicle_catalog', 'body_type') + op.drop_column('vehicle_catalog', 'max_weight_kg') + op.drop_column('vehicle_catalog', 'vehicle_class') + op.drop_column('vehicle_catalog', 'engine_code') + op.drop_column('vehicle_catalog', 'engine_variant') + op.drop_column('vehicle_catalog', 'euro_class') + op.drop_column('vehicle_catalog', 'axle_count') + op.create_index(op.f('ix_data_vehicle_logbook_trip_type'), 'vehicle_logbook', ['trip_type'], unique=False, schema='data') + op.drop_constraint(op.f('vehicle_logbook_asset_id_fkey'), 'vehicle_logbook', type_='foreignkey') + op.drop_constraint(op.f('vehicle_logbook_driver_id_fkey'), 'vehicle_logbook', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_logbook', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'vehicle_logbook', 'users', ['driver_id'], ['id'], source_schema='data', referent_schema='identity') + op.drop_column('vehicle_logbook', 'created_at') + op.alter_column('vehicle_model_definitions', 'make', + existing_type=sa.VARCHAR(length=50), + type_=sa.String(length=100), + existing_nullable=False) + op.alter_column('vehicle_model_definitions', 'marketing_name', + existing_type=sa.VARCHAR(length=100), + type_=sa.String(length=255), + existing_nullable=False) + op.alter_column('vehicle_model_definitions', 'updated_at', + existing_type=postgresql.TIMESTAMP(timezone=True), + nullable=False, + existing_server_default=sa.text('now()')) + op.alter_column('vehicle_model_definitions', 'marketing_name_aliases', + existing_type=postgresql.JSONB(astext_type=sa.Text()), + nullable=False, + existing_server_default=sa.text("'[]'::jsonb")) + op.alter_column('vehicle_model_definitions', 'technical_code', + existing_type=sa.VARCHAR(length=50), + type_=sa.String(length=100), + existing_nullable=False) + op.alter_column('vehicle_model_definitions', 'body_type', + existing_type=sa.VARCHAR(length=50), + type_=sa.String(length=100), + existing_nullable=True) + op.alter_column('vehicle_model_definitions', 'engine_capacity', + existing_type=sa.INTEGER(), + nullable=False) + op.alter_column('vehicle_model_definitions', 'power_kw', + existing_type=sa.INTEGER(), + nullable=False) + op.alter_column('vehicle_model_definitions', 'status', + existing_type=sa.VARCHAR(length=30), + type_=sa.String(length=50), + existing_nullable=False, + existing_server_default=sa.text("'active'::character varying")) + op.alter_column('vehicle_model_definitions', 'source', + existing_type=sa.VARCHAR(length=50), + type_=sa.String(length=100), + existing_nullable=True) + op.drop_index(op.f('idx_vmd_engine_code'), table_name='vehicle_model_definitions') + op.drop_index(op.f('idx_vmd_lookup'), table_name='vehicle_model_definitions') + op.drop_index(op.f('idx_vmd_normalized_name'), table_name='vehicle_model_definitions') + op.drop_index(op.f('ix_vehicle_model_marketing_name'), table_name='vehicle_model_definitions') + op.drop_constraint(op.f('uix_make_tech_type'), 'vehicle_model_definitions', type_='unique') + op.create_index('idx_vmd_engine_bridge', 'vehicle_model_definitions', ['make', 'engine_code'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_engine_capacity'), 'vehicle_model_definitions', ['engine_capacity'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_engine_code'), 'vehicle_model_definitions', ['engine_code'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_fuel_type'), 'vehicle_model_definitions', ['fuel_type'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_id'), 'vehicle_model_definitions', ['id'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_normalized_name'), 'vehicle_model_definitions', ['normalized_name'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_power_kw'), 'vehicle_model_definitions', ['power_kw'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_variant_code'), 'vehicle_model_definitions', ['variant_code'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_vehicle_class'), 'vehicle_model_definitions', ['vehicle_class'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_version_code'), 'vehicle_model_definitions', ['version_code'], unique=False, schema='data') + op.drop_constraint(op.f('vehicle_model_definitions_vehicle_type_id_fkey'), 'vehicle_model_definitions', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_model_definitions', 'vehicle_types', ['vehicle_type_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('vehicle_ownership_history_user_id_fkey'), 'vehicle_ownership_history', type_='foreignkey') + op.drop_constraint(op.f('vehicle_ownership_history_asset_id_fkey'), 'vehicle_ownership_history', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_ownership_history', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'vehicle_ownership_history', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('persons_address_id_fkey'), 'persons', schema='identity', type_='foreignkey') + op.create_foreign_key(None, 'persons', 'addresses', ['address_id'], ['id'], source_schema='identity', referent_schema='data') + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'persons', schema='identity', type_='foreignkey') + op.create_foreign_key(op.f('persons_address_id_fkey'), 'persons', 'addresses', ['address_id'], ['id'], source_schema='identity') + op.drop_constraint(None, 'vehicle_ownership_history', schema='data', type_='foreignkey') + op.drop_constraint(None, 'vehicle_ownership_history', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_ownership_history_asset_id_fkey'), 'vehicle_ownership_history', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('vehicle_ownership_history_user_id_fkey'), 'vehicle_ownership_history', 'users', ['user_id'], ['id'], referent_schema='identity') + op.drop_constraint(None, 'vehicle_model_definitions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_model_definitions_vehicle_type_id_fkey'), 'vehicle_model_definitions', 'vehicle_types', ['vehicle_type_id'], ['id']) + op.drop_index(op.f('ix_data_vehicle_model_definitions_version_code'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_vehicle_class'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_variant_code'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_power_kw'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_normalized_name'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_id'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_fuel_type'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_engine_code'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_engine_capacity'), table_name='vehicle_model_definitions', schema='data') + op.drop_index('idx_vmd_engine_bridge', table_name='vehicle_model_definitions', schema='data') + op.create_unique_constraint(op.f('uix_make_tech_type'), 'vehicle_model_definitions', ['make', 'technical_code', 'vehicle_type_id'], postgresql_nulls_not_distinct=False) + op.create_index(op.f('ix_vehicle_model_marketing_name'), 'vehicle_model_definitions', ['marketing_name'], unique=False) + op.create_index(op.f('idx_vmd_normalized_name'), 'vehicle_model_definitions', ['normalized_name'], unique=False) + op.create_index(op.f('idx_vmd_lookup'), 'vehicle_model_definitions', ['make', 'technical_code'], unique=False) + op.create_index(op.f('idx_vmd_engine_code'), 'vehicle_model_definitions', ['engine_code'], unique=False) + op.alter_column('vehicle_model_definitions', 'source', + existing_type=sa.String(length=100), + type_=sa.VARCHAR(length=50), + existing_nullable=True) + op.alter_column('vehicle_model_definitions', 'status', + existing_type=sa.String(length=50), + type_=sa.VARCHAR(length=30), + existing_nullable=False, + existing_server_default=sa.text("'active'::character varying")) + op.alter_column('vehicle_model_definitions', 'power_kw', + existing_type=sa.INTEGER(), + nullable=True) + op.alter_column('vehicle_model_definitions', 'engine_capacity', + existing_type=sa.INTEGER(), + nullable=True) + op.alter_column('vehicle_model_definitions', 'body_type', + existing_type=sa.String(length=100), + type_=sa.VARCHAR(length=50), + existing_nullable=True) + op.alter_column('vehicle_model_definitions', 'technical_code', + existing_type=sa.String(length=100), + type_=sa.VARCHAR(length=50), + existing_nullable=False) + op.alter_column('vehicle_model_definitions', 'marketing_name_aliases', + existing_type=postgresql.JSONB(astext_type=sa.Text()), + nullable=True, + existing_server_default=sa.text("'[]'::jsonb")) + op.alter_column('vehicle_model_definitions', 'updated_at', + existing_type=postgresql.TIMESTAMP(timezone=True), + nullable=True, + existing_server_default=sa.text('now()')) + op.alter_column('vehicle_model_definitions', 'marketing_name', + existing_type=sa.String(length=255), + type_=sa.VARCHAR(length=100), + existing_nullable=False) + op.alter_column('vehicle_model_definitions', 'make', + existing_type=sa.String(length=100), + type_=sa.VARCHAR(length=50), + existing_nullable=False) + op.add_column('vehicle_logbook', sa.Column('created_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=True)) + op.drop_constraint(None, 'vehicle_logbook', schema='data', type_='foreignkey') + op.drop_constraint(None, 'vehicle_logbook', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_logbook_driver_id_fkey'), 'vehicle_logbook', 'users', ['driver_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('vehicle_logbook_asset_id_fkey'), 'vehicle_logbook', 'assets', ['asset_id'], ['id']) + op.drop_index(op.f('ix_data_vehicle_logbook_trip_type'), table_name='vehicle_logbook', schema='data') + op.add_column('vehicle_catalog', sa.Column('axle_count', sa.INTEGER(), autoincrement=False, nullable=True)) + op.add_column('vehicle_catalog', sa.Column('euro_class', sa.VARCHAR(length=20), autoincrement=False, nullable=True)) + op.add_column('vehicle_catalog', sa.Column('engine_variant', sa.VARCHAR(), autoincrement=False, nullable=True)) + op.add_column('vehicle_catalog', sa.Column('engine_code', sa.VARCHAR(), autoincrement=False, nullable=True)) + op.add_column('vehicle_catalog', sa.Column('vehicle_class', sa.VARCHAR(), autoincrement=False, nullable=True)) + op.add_column('vehicle_catalog', sa.Column('max_weight_kg', sa.INTEGER(), autoincrement=False, nullable=True)) + op.add_column('vehicle_catalog', sa.Column('body_type', sa.VARCHAR(length=100), autoincrement=False, nullable=True)) + op.drop_constraint(None, 'vehicle_catalog', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_catalog_master_definition_id_fkey'), 'vehicle_catalog', 'vehicle_model_definitions', ['master_definition_id'], ['id']) + op.drop_constraint('uix_vehicle_catalog_full', 'vehicle_catalog', schema='data', type_='unique') + op.create_unique_constraint(op.f('uix_vehicle_catalog_full'), 'vehicle_catalog', ['make', 'model', 'year_from', 'engine_variant', 'fuel_type'], postgresql_nulls_not_distinct=False) + op.create_index(op.f('ix_data_vehicle_catalog_engine_variant'), 'vehicle_catalog', ['engine_variant'], unique=False) + op.drop_constraint(None, 'user_stats', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_stats_user_id_fkey'), 'user_stats', 'users', ['user_id'], ['id'], referent_schema='identity') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_badges_badge_id_fkey'), 'user_badges', 'badges', ['badge_id'], ['id']) + op.create_foreign_key(op.f('user_badges_user_id_fkey'), 'user_badges', 'users', ['user_id'], ['id'], referent_schema='identity') + op.drop_constraint(None, 'service_specialties', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_specialties_parent_id_fkey'), 'service_specialties', 'service_specialties', ['parent_id'], ['id']) + op.drop_constraint(None, 'service_profiles', schema='data', type_='foreignkey') + op.drop_constraint(None, 'service_profiles', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_profiles_organization_id_fkey'), 'service_profiles', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('service_profiles_parent_id_fkey'), 'service_profiles', 'service_profiles', ['parent_id'], ['id']) + op.create_index(op.f('idx_service_profiles_location'), 'service_profiles', ['location'], unique=False, postgresql_using='gist') + op.drop_constraint(None, 'service_expertises', schema='data', type_='foreignkey') + op.drop_constraint(None, 'service_expertises', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_expertises_expertise_id_fkey'), 'service_expertises', 'expertise_tags', ['expertise_id'], ['id']) + op.create_foreign_key(op.f('service_expertises_service_id_fkey'), 'service_expertises', 'service_profiles', ['service_id'], ['id']) + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('ratings_target_user_id_fkey'), 'ratings', 'users', ['target_user_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('ratings_target_organization_id_fkey'), 'ratings', 'organizations', ['target_organization_id'], ['id']) + op.create_foreign_key(op.f('ratings_author_id_fkey'), 'ratings', 'users', ['author_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('ratings_target_branch_id_fkey'), 'ratings', 'branches', ['target_branch_id'], ['id']) + op.drop_constraint(None, 'points_ledger', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('points_ledger_user_id_fkey'), 'points_ledger', 'users', ['user_id'], ['id'], referent_schema='identity') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organizations_owner_id_fkey'), 'organizations', 'users', ['owner_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('organizations_address_id_fkey'), 'organizations', 'addresses', ['address_id'], ['id']) + op.drop_index(op.f('ix_data_organizations_legal_owner_id'), table_name='organizations', schema='data') + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + existing_nullable=False) + op.drop_column('organizations', 'lifecycle_index') + op.drop_column('organizations', 'last_deactivated_at') + op.drop_column('organizations', 'current_lifecycle_started_at') + op.drop_column('organizations', 'first_registered_at') + op.drop_column('organizations', 'legal_owner_id') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_members_organization_id_fkey'), 'organization_members', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('organization_members_user_id_fkey'), 'organization_members', 'users', ['user_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('organization_members_person_id_fkey'), 'organization_members', 'persons', ['person_id'], ['id'], referent_schema='identity') + op.alter_column('organization_members', 'role', + existing_type=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole', schema='data'), + type_=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole'), + existing_nullable=False) + op.drop_constraint(None, 'organization_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_financials_organization_id_fkey'), 'organization_financials', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id']) + op.create_foreign_key(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'org_sales_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_sales_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_sales_assignments_agent_user_id_fkey'), 'org_sales_assignments', 'users', ['agent_user_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('org_sales_assignments_organization_id_fkey'), 'org_sales_assignments', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'model_feature_maps', schema='data', type_='foreignkey') + op.drop_constraint(None, 'model_feature_maps', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('model_feature_maps_feature_id_fkey'), 'model_feature_maps', 'feature_definitions', ['feature_id'], ['id']) + op.create_foreign_key(op.f('model_feature_maps_model_definition_id_fkey'), 'model_feature_maps', 'vehicle_model_definitions', ['model_definition_id'], ['id']) + op.drop_constraint(None, 'geo_streets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_constraint(None, 'feature_definitions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('feature_definitions_vehicle_type_id_fkey'), 'feature_definitions', 'vehicle_types', ['vehicle_type_id'], ['id']) + op.add_column('exchange_rates', sa.Column('base_currency', sa.VARCHAR(length=3), autoincrement=False, nullable=False)) + op.add_column('exchange_rates', sa.Column('target_currency', sa.VARCHAR(length=3), autoincrement=False, nullable=True)) + op.create_unique_constraint(op.f('exchange_rates_target_currency_key'), 'exchange_rates', ['target_currency'], postgresql_nulls_not_distinct=False) + op.drop_constraint(None, 'credit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('credit_logs_org_id_fkey'), 'credit_logs', 'organizations', ['org_id'], ['id']) + op.add_column('catalog_discovery', sa.Column('source', sa.VARCHAR(length=50), autoincrement=False, nullable=True)) + op.add_column('catalog_discovery', sa.Column('last_attempt', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True)) + op.add_column('catalog_discovery', sa.Column('vehicle_class', sa.VARCHAR(length=50), autoincrement=False, nullable=True)) + op.add_column('catalog_discovery', sa.Column('priority_score', sa.INTEGER(), server_default=sa.text('0'), autoincrement=False, nullable=True)) + op.add_column('catalog_discovery', sa.Column('created_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=False)) + op.drop_constraint('_make_model_uc', 'catalog_discovery', schema='data', type_='unique') + op.create_index(op.f('ix_data_catalog_discovery_vehicle_class'), 'catalog_discovery', ['vehicle_class'], unique=False) + op.create_unique_constraint(op.f('_make_model_class_uc'), 'catalog_discovery', ['make', 'model', 'vehicle_class'], postgresql_nulls_not_distinct=False) + op.drop_column('catalog_discovery', 'updated_at') + op.drop_constraint(None, 'branches', schema='data', type_='foreignkey') + op.drop_constraint(None, 'branches', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('branches_organization_id_fkey'), 'branches', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('branches_address_id_fkey'), 'branches', 'addresses', ['address_id'], ['id']) + op.drop_constraint(None, 'audit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('audit_logs_user_id_fkey'), 'audit_logs', 'users', ['user_id'], ['id'], referent_schema='identity') + op.alter_column('audit_logs', 'severity', + existing_type=postgresql.ENUM('info', 'warning', 'critical', 'emergency', name='log_severity', schema='data'), + type_=postgresql.ENUM('info', 'warning', 'critical', 'emergency', name='log_severity'), + existing_nullable=False) + op.add_column('assets', sa.Column('registration_uuid', sa.UUID(), autoincrement=False, nullable=False)) + op.add_column('assets', sa.Column('verification_method', sa.VARCHAR(length=20), autoincrement=False, nullable=True)) + op.add_column('assets', sa.Column('verification_notes', sa.TEXT(), autoincrement=False, nullable=True)) + op.add_column('assets', sa.Column('is_corporate', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=False)) + op.add_column('assets', sa.Column('is_verified', sa.BOOLEAN(), autoincrement=False, nullable=False)) + op.add_column('assets', sa.Column('catalog_match_score', sa.NUMERIC(precision=5, scale=2), autoincrement=False, nullable=True)) + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('assets_current_organization_id_fkey'), 'assets', 'organizations', ['current_organization_id'], ['id']) + op.create_foreign_key(op.f('assets_owner_org_id_fkey'), 'assets', 'organizations', ['owner_org_id'], ['id']) + op.create_foreign_key(op.f('assets_owner_person_id_fkey'), 'assets', 'persons', ['owner_person_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('assets_catalog_id_fkey'), 'assets', 'vehicle_catalog', ['catalog_id'], ['id']) + op.create_foreign_key(op.f('assets_operator_person_id_fkey'), 'assets', 'persons', ['operator_person_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('assets_operator_org_id_fkey'), 'assets', 'organizations', ['operator_org_id'], ['id']) + op.drop_index(op.f('ix_data_assets_year_of_manufacture'), table_name='assets', schema='data') + op.drop_index(op.f('ix_data_assets_is_for_sale'), table_name='assets', schema='data') + op.drop_index(op.f('ix_data_assets_current_mileage'), table_name='assets', schema='data') + op.create_index(op.f('ix_data_assets_registration_uuid'), 'assets', ['registration_uuid'], unique=False) + op.add_column('asset_telemetry', sa.Column('dbs_score', sa.NUMERIC(precision=5, scale=2), autoincrement=False, nullable=False)) + op.add_column('asset_telemetry', sa.Column('mileage_unit', sa.VARCHAR(length=10), autoincrement=False, nullable=False)) + op.add_column('asset_telemetry', sa.Column('vqi_score', sa.NUMERIC(precision=5, scale=2), autoincrement=False, nullable=False)) + op.drop_constraint(None, 'asset_telemetry', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', 'assets', ['asset_id'], ['id']) + op.add_column('asset_reviews', sa.Column('criteria_scores', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), autoincrement=False, nullable=False)) + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', 'users', ['user_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_inspections', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_inspections', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('fk_asset_inspections_asset'), 'asset_inspections', 'assets', ['asset_id'], ['id'], ondelete='CASCADE') + op.create_foreign_key(op.f('fk_asset_inspections_inspector'), 'asset_inspections', 'users', ['inspector_id'], ['id'], referent_schema='identity') + op.create_index(op.f('ix_data_asset_inspections_inspector_id'), 'asset_inspections', ['inspector_id'], unique=False) + op.create_index(op.f('ix_data_asset_inspections_asset_id'), 'asset_inspections', ['asset_id'], unique=False) + op.add_column('asset_financials', sa.Column('residual_value_estimate', sa.NUMERIC(precision=18, scale=2), autoincrement=False, nullable=True)) + op.add_column('asset_financials', sa.Column('acquisition_price', sa.NUMERIC(precision=18, scale=2), autoincrement=False, nullable=True)) + op.add_column('asset_financials', sa.Column('acquisition_date', postgresql.TIMESTAMP(), autoincrement=False, nullable=True)) + op.drop_constraint(None, 'asset_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_financials_asset_id_fkey'), 'asset_financials', 'assets', ['asset_id'], ['id']) + op.alter_column('asset_financials', 'financing_type', + existing_type=sa.VARCHAR(), + nullable=True) + op.add_column('asset_events', sa.Column('registration_uuid', sa.UUID(), autoincrement=False, nullable=True)) + op.add_column('asset_events', sa.Column('data', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), autoincrement=False, nullable=False)) + op.add_column('asset_events', sa.Column('recorded_mileage', sa.INTEGER(), autoincrement=False, nullable=True)) + op.drop_constraint(None, 'asset_events', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_events_asset_id_fkey'), 'asset_events', 'assets', ['asset_id'], ['id']) + op.create_index(op.f('ix_data_asset_events_registration_uuid'), 'asset_events', ['registration_uuid'], unique=False) + op.add_column('asset_costs', sa.Column('currency_local', sa.VARCHAR(length=3), autoincrement=False, nullable=False)) + op.add_column('asset_costs', sa.Column('registration_uuid', sa.UUID(), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('cost_type', sa.VARCHAR(length=50), autoincrement=False, nullable=False)) + op.add_column('asset_costs', sa.Column('amount_eur', sa.NUMERIC(precision=18, scale=2), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('vat_rate', sa.NUMERIC(precision=5, scale=2), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('driver_id', sa.INTEGER(), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('exchange_rate_used', sa.NUMERIC(precision=18, scale=6), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('net_amount_local', sa.NUMERIC(precision=18, scale=2), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('mileage_at_cost', sa.INTEGER(), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('amount_local', sa.NUMERIC(precision=18, scale=2), autoincrement=False, nullable=False)) + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_costs_asset_id_fkey'), 'asset_costs', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_organization_id_fkey'), 'asset_costs', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_driver_id_fkey'), 'asset_costs', 'users', ['driver_id'], ['id'], referent_schema='identity') + op.drop_index(op.f('ix_data_asset_costs_invoice_number'), table_name='asset_costs', schema='data') + op.drop_index(op.f('ix_data_asset_costs_cost_category'), table_name='asset_costs', schema='data') + op.create_index(op.f('ix_data_asset_costs_registration_uuid'), 'asset_costs', ['registration_uuid'], unique=False) + op.add_column('asset_assignments', sa.Column('branch_id', sa.UUID(), autoincrement=False, nullable=True)) + op.add_column('asset_assignments', sa.Column('released_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True)) + op.add_column('asset_assignments', sa.Column('assigned_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=False)) + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_branch_id_fkey'), 'asset_assignments', 'branches', ['branch_id'], ['id']) + op.drop_constraint(None, 'addresses', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('addresses_postal_code_id_fkey'), 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id']) + # ### end Alembic commands ### diff --git a/backend/migrations/versions/4d69a44da00a_precision_schema_v1_0_9_final.py b/backend/migrations/versions/4d69a44da00a_precision_schema_v1_0_9_final.py new file mode 100755 index 0000000..fe36bb1 --- /dev/null +++ b/backend/migrations/versions/4d69a44da00a_precision_schema_v1_0_9_final.py @@ -0,0 +1,561 @@ +"""Precision_Schema_v1_0_9_Final + +Revision ID: 4d69a44da00a +Revises: 062cfbbdd076 +Create Date: 2026-02-25 08:41:01.664164 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = '4d69a44da00a' +down_revision: Union[str, Sequence[str], None] = '062cfbbdd076' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('asset_inspections', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('asset_id', sa.UUID(), nullable=False), + sa.Column('inspector_id', sa.Integer(), nullable=False), + sa.Column('timestamp', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.Column('checklist_results', postgresql.JSONB(astext_type=sa.Text()), nullable=False), + sa.Column('is_safe', sa.Boolean(), nullable=False), + sa.ForeignKeyConstraint(['asset_id'], ['data.assets.id'], ), + sa.ForeignKeyConstraint(['inspector_id'], ['identity.users.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_table('vehicle_logbook', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('asset_id', sa.UUID(), nullable=False), + sa.Column('driver_id', sa.Integer(), nullable=False), + sa.Column('trip_type', sa.String(length=30), nullable=False), + sa.Column('is_reimbursable', sa.Boolean(), nullable=False), + sa.Column('start_mileage', sa.Integer(), nullable=False), + sa.Column('end_mileage', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['asset_id'], ['data.assets.id'], ), + sa.ForeignKeyConstraint(['driver_id'], ['identity.users.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index(op.f('ix_data_vehicle_logbook_trip_type'), 'vehicle_logbook', ['trip_type'], unique=False, schema='data') + op.create_table('vehicle_ownership_history', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('asset_id', sa.UUID(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('acquired_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.Column('disposed_at', sa.DateTime(timezone=True), nullable=True), + sa.ForeignKeyConstraint(['asset_id'], ['data.assets.id'], ), + sa.ForeignKeyConstraint(['user_id'], ['identity.users.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.drop_constraint(op.f('addresses_postal_code_id_fkey'), 'addresses', type_='foreignkey') + op.create_foreign_key(None, 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_assignments_branch_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', type_='foreignkey') + op.create_foreign_key(None, 'asset_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_assignments', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('asset_assignments', 'assigned_at') + op.drop_column('asset_assignments', 'released_at') + op.drop_column('asset_assignments', 'branch_id') + op.add_column('asset_costs', sa.Column('cost_category', sa.String(length=50), nullable=False)) + op.add_column('asset_costs', sa.Column('amount_net', sa.Numeric(precision=18, scale=2), nullable=False)) + op.add_column('asset_costs', sa.Column('currency', sa.String(length=3), nullable=False)) + op.add_column('asset_costs', sa.Column('invoice_number', sa.String(length=100), nullable=True)) + op.drop_index(op.f('ix_data_asset_costs_registration_uuid'), table_name='asset_costs') + op.create_index(op.f('ix_data_asset_costs_cost_category'), 'asset_costs', ['cost_category'], unique=False, schema='data') + op.create_index(op.f('ix_data_asset_costs_invoice_number'), 'asset_costs', ['invoice_number'], unique=False, schema='data') + op.drop_constraint(op.f('asset_costs_driver_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_asset_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_organization_id_fkey'), 'asset_costs', type_='foreignkey') + op.create_foreign_key(None, 'asset_costs', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('asset_costs', 'driver_id') + op.drop_column('asset_costs', 'cost_type') + op.drop_column('asset_costs', 'currency_local') + op.drop_column('asset_costs', 'amount_local') + op.drop_column('asset_costs', 'amount_eur') + op.drop_column('asset_costs', 'vat_rate') + op.drop_column('asset_costs', 'registration_uuid') + op.drop_column('asset_costs', 'exchange_rate_used') + op.drop_column('asset_costs', 'net_amount_local') + op.drop_column('asset_costs', 'mileage_at_cost') + op.drop_index(op.f('ix_data_asset_events_registration_uuid'), table_name='asset_events') + op.drop_constraint(op.f('asset_events_asset_id_fkey'), 'asset_events', type_='foreignkey') + op.create_foreign_key(None, 'asset_events', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('asset_events', 'registration_uuid') + op.drop_column('asset_events', 'recorded_mileage') + op.drop_column('asset_events', 'data') + op.add_column('asset_financials', sa.Column('purchase_price_net', sa.Numeric(precision=18, scale=2), nullable=False)) + op.add_column('asset_financials', sa.Column('purchase_price_gross', sa.Numeric(precision=18, scale=2), nullable=False)) + op.add_column('asset_financials', sa.Column('vat_rate', sa.Numeric(precision=5, scale=2), nullable=False)) + op.add_column('asset_financials', sa.Column('activation_date', sa.DateTime(), nullable=True)) + op.add_column('asset_financials', sa.Column('accounting_details', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False)) + op.alter_column('asset_financials', 'financing_type', + existing_type=sa.VARCHAR(), + nullable=False) + op.drop_constraint(op.f('asset_financials_asset_id_fkey'), 'asset_financials', type_='foreignkey') + op.create_foreign_key(None, 'asset_financials', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('asset_financials', 'residual_value_estimate') + op.drop_column('asset_financials', 'acquisition_price') + op.drop_column('asset_financials', 'acquisition_date') + op.drop_constraint(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', type_='foreignkey') + op.drop_constraint(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', type_='foreignkey') + op.create_foreign_key(None, 'asset_reviews', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'asset_reviews', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('asset_reviews', 'criteria_scores') + op.drop_constraint(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', type_='foreignkey') + op.create_foreign_key(None, 'asset_telemetry', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('asset_telemetry', 'dbs_score') + op.drop_column('asset_telemetry', 'vqi_score') + op.drop_column('asset_telemetry', 'mileage_unit') + op.add_column('assets', sa.Column('first_registration_date', sa.DateTime(timezone=True), nullable=True)) + op.add_column('assets', sa.Column('current_mileage', sa.Integer(), nullable=False)) + op.add_column('assets', sa.Column('condition_score', sa.Integer(), nullable=False)) + op.add_column('assets', sa.Column('is_for_sale', sa.Boolean(), nullable=False)) + op.add_column('assets', sa.Column('price', sa.Numeric(precision=15, scale=2), nullable=True)) + op.add_column('assets', sa.Column('currency', sa.String(length=3), nullable=False)) + op.add_column('assets', sa.Column('individual_equipment', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False)) + op.drop_index(op.f('ix_data_assets_registration_uuid'), table_name='assets') + op.create_index(op.f('ix_data_assets_current_mileage'), 'assets', ['current_mileage'], unique=False, schema='data') + op.create_index(op.f('ix_data_assets_is_for_sale'), 'assets', ['is_for_sale'], unique=False, schema='data') + op.create_index(op.f('ix_data_assets_year_of_manufacture'), 'assets', ['year_of_manufacture'], unique=False, schema='data') + op.drop_constraint(op.f('assets_operator_org_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_owner_person_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_owner_org_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_operator_person_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_catalog_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_current_organization_id_fkey'), 'assets', type_='foreignkey') + op.create_foreign_key(None, 'assets', 'vehicle_catalog', ['catalog_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'assets', 'organizations', ['owner_org_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'assets', 'persons', ['owner_person_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'assets', 'organizations', ['current_organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'assets', 'persons', ['operator_person_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'assets', 'organizations', ['operator_org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('assets', 'is_corporate') + op.drop_column('assets', 'is_verified') + op.drop_column('assets', 'catalog_match_score') + op.drop_column('assets', 'verification_method') + op.drop_column('assets', 'verification_notes') + op.drop_column('assets', 'registration_uuid') + op.alter_column('audit_logs', 'severity', + existing_type=postgresql.ENUM('info', 'warning', 'critical', 'emergency', name='log_severity'), + type_=postgresql.ENUM('info', 'warning', 'critical', 'emergency', name='log_severity', schema='data'), + existing_nullable=False) + op.drop_constraint(op.f('audit_logs_user_id_fkey'), 'audit_logs', type_='foreignkey') + op.create_foreign_key(None, 'audit_logs', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.drop_constraint(op.f('branches_address_id_fkey'), 'branches', type_='foreignkey') + op.drop_constraint(op.f('branches_organization_id_fkey'), 'branches', type_='foreignkey') + op.create_foreign_key(None, 'branches', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'branches', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('_make_model_class_uc'), 'catalog_discovery', type_='unique') + op.drop_index(op.f('ix_data_catalog_discovery_vehicle_class'), table_name='catalog_discovery') + op.create_unique_constraint('_make_model_uc', 'catalog_discovery', ['make', 'model'], schema='data') + op.drop_column('catalog_discovery', 'source') + op.drop_column('catalog_discovery', 'vehicle_class') + op.drop_column('catalog_discovery', 'last_attempt') + op.drop_column('catalog_discovery', 'priority_score') + op.drop_column('catalog_discovery', 'attempts') + op.drop_column('catalog_discovery', 'created_at') + op.drop_constraint(op.f('credit_logs_org_id_fkey'), 'credit_logs', type_='foreignkey') + op.create_foreign_key(None, 'credit_logs', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('exchange_rates_target_currency_key'), 'exchange_rates', type_='unique') + op.drop_column('exchange_rates', 'base_currency') + op.drop_column('exchange_rates', 'target_currency') + op.drop_constraint(op.f('feature_definitions_vehicle_type_id_fkey'), 'feature_definitions', type_='foreignkey') + op.create_foreign_key(None, 'feature_definitions', 'vehicle_types', ['vehicle_type_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', type_='foreignkey') + op.create_foreign_key(None, 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('model_feature_maps_feature_id_fkey'), 'model_feature_maps', type_='foreignkey') + op.drop_constraint(op.f('model_feature_maps_model_definition_id_fkey'), 'model_feature_maps', type_='foreignkey') + op.create_foreign_key(None, 'model_feature_maps', 'feature_definitions', ['feature_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'model_feature_maps', 'vehicle_model_definitions', ['model_definition_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('org_sales_assignments_agent_user_id_fkey'), 'org_sales_assignments', type_='foreignkey') + op.drop_constraint(op.f('org_sales_assignments_organization_id_fkey'), 'org_sales_assignments', type_='foreignkey') + op.create_foreign_key(None, 'org_sales_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_sales_assignments', 'users', ['agent_user_id'], ['id'], source_schema='data', referent_schema='identity') + op.drop_constraint(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.drop_constraint(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.create_foreign_key(None, 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_subscriptions', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('organization_financials_organization_id_fkey'), 'organization_financials', type_='foreignkey') + op.create_foreign_key(None, 'organization_financials', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('organization_members', 'role', + existing_type=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole'), + type_=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole', schema='data'), + existing_nullable=False) + op.drop_constraint(op.f('organization_members_user_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_organization_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_person_id_fkey'), 'organization_members', type_='foreignkey') + op.create_foreign_key(None, 'organization_members', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'organization_members', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'organization_members', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data'), + existing_nullable=False) + op.drop_constraint(op.f('organizations_owner_id_fkey'), 'organizations', type_='foreignkey') + op.drop_constraint(op.f('organizations_address_id_fkey'), 'organizations', type_='foreignkey') + op.create_foreign_key(None, 'organizations', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organizations', 'users', ['owner_id'], ['id'], source_schema='data', referent_schema='identity') + op.drop_constraint(op.f('points_ledger_user_id_fkey'), 'points_ledger', type_='foreignkey') + op.create_foreign_key(None, 'points_ledger', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.drop_constraint(op.f('ratings_target_user_id_fkey'), 'ratings', type_='foreignkey') + op.drop_constraint(op.f('ratings_author_id_fkey'), 'ratings', type_='foreignkey') + op.drop_constraint(op.f('ratings_target_organization_id_fkey'), 'ratings', type_='foreignkey') + op.drop_constraint(op.f('ratings_target_branch_id_fkey'), 'ratings', type_='foreignkey') + op.create_foreign_key(None, 'ratings', 'users', ['target_user_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'ratings', 'branches', ['target_branch_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'ratings', 'users', ['author_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'ratings', 'organizations', ['target_organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_expertises_service_id_fkey'), 'service_expertises', type_='foreignkey') + op.drop_constraint(op.f('service_expertises_expertise_id_fkey'), 'service_expertises', type_='foreignkey') + op.create_foreign_key(None, 'service_expertises', 'service_profiles', ['service_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'service_expertises', 'expertise_tags', ['expertise_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_index(op.f('idx_service_profiles_location'), table_name='service_profiles', postgresql_using='gist') + op.drop_constraint(op.f('service_profiles_parent_id_fkey'), 'service_profiles', type_='foreignkey') + op.drop_constraint(op.f('service_profiles_organization_id_fkey'), 'service_profiles', type_='foreignkey') + op.create_foreign_key(None, 'service_profiles', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'service_profiles', 'service_profiles', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_specialties_parent_id_fkey'), 'service_specialties', type_='foreignkey') + op.create_foreign_key(None, 'service_specialties', 'service_specialties', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_badges_user_id_fkey'), 'user_badges', type_='foreignkey') + op.drop_constraint(op.f('user_badges_badge_id_fkey'), 'user_badges', type_='foreignkey') + op.create_foreign_key(None, 'user_badges', 'badges', ['badge_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'user_badges', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.drop_constraint(op.f('user_stats_user_id_fkey'), 'user_stats', type_='foreignkey') + op.create_foreign_key(None, 'user_stats', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.drop_index(op.f('ix_data_vehicle_catalog_engine_variant'), table_name='vehicle_catalog') + op.drop_constraint(op.f('uix_vehicle_catalog_full'), 'vehicle_catalog', type_='unique') + op.create_unique_constraint('uix_vehicle_catalog_full', 'vehicle_catalog', ['make', 'model', 'year_from', 'fuel_type'], schema='data') + op.drop_constraint(op.f('vehicle_catalog_master_definition_id_fkey'), 'vehicle_catalog', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_catalog', 'vehicle_model_definitions', ['master_definition_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('vehicle_catalog', 'euro_class') + op.drop_column('vehicle_catalog', 'vehicle_class') + op.drop_column('vehicle_catalog', 'body_type') + op.drop_column('vehicle_catalog', 'max_weight_kg') + op.drop_column('vehicle_catalog', 'axle_count') + op.drop_column('vehicle_catalog', 'engine_variant') + op.drop_column('vehicle_catalog', 'engine_code') + op.add_column('vehicle_model_definitions', sa.Column('normalized_name', sa.String(length=255), nullable=True), schema='data') + op.add_column('vehicle_model_definitions', sa.Column('marketing_name_aliases', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'[]'::jsonb"), nullable=False)) + op.add_column('vehicle_model_definitions', sa.Column('variant_code', sa.String(length=100), nullable=True)) + op.add_column('vehicle_model_definitions', sa.Column('version_code', sa.String(length=100), nullable=True)) + op.add_column('vehicle_model_definitions', sa.Column('cylinders', sa.Integer(), nullable=True)) + op.add_column('vehicle_model_definitions', sa.Column('curb_weight', sa.Integer(), nullable=True)) + op.add_column('vehicle_model_definitions', sa.Column('max_weight', sa.Integer(), nullable=True)) + op.add_column('vehicle_model_definitions', sa.Column('euro_classification', sa.String(length=20), nullable=True)) + op.add_column('vehicle_model_definitions', sa.Column('doors', sa.Integer(), nullable=True)) + op.alter_column('vehicle_model_definitions', 'make', + existing_type=sa.VARCHAR(length=50), + type_=sa.String(length=100), + existing_nullable=False) + op.alter_column('vehicle_model_definitions', 'marketing_name', + existing_type=sa.VARCHAR(length=100), + type_=sa.String(length=255), + nullable=False) + op.alter_column('vehicle_model_definitions', 'technical_code', + existing_type=sa.VARCHAR(length=50), + type_=sa.String(length=100), + existing_nullable=False) + op.alter_column('vehicle_model_definitions', 'body_type', + existing_type=sa.VARCHAR(length=50), + type_=sa.String(length=100), + existing_nullable=True) + op.alter_column('vehicle_model_definitions', 'engine_capacity', + existing_type=sa.INTEGER(), + nullable=False) + op.alter_column('vehicle_model_definitions', 'power_kw', + existing_type=sa.INTEGER(), + nullable=False) + op.alter_column('vehicle_model_definitions', 'status', + existing_type=sa.VARCHAR(length=30), + type_=sa.String(length=50), + existing_nullable=False, + existing_server_default=sa.text("'active'::character varying")) + op.alter_column('vehicle_model_definitions', 'source', + existing_type=sa.VARCHAR(length=50), + type_=sa.String(length=100), + existing_nullable=True) + op.drop_index(op.f('idx_vmd_lookup'), table_name='vehicle_model_definitions') + op.drop_index(op.f('ix_vehicle_model_marketing_name'), table_name='vehicle_model_definitions') + op.drop_constraint(op.f('uix_make_tech_type'), 'vehicle_model_definitions', type_='unique') + op.create_index('idx_vmd_lookup_fast', 'vehicle_model_definitions', ['make', 'normalized_name'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_engine_capacity'), 'vehicle_model_definitions', ['engine_capacity'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_fuel_type'), 'vehicle_model_definitions', ['fuel_type'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_normalized_name'), 'vehicle_model_definitions', ['normalized_name'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_power_kw'), 'vehicle_model_definitions', ['power_kw'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_variant_code'), 'vehicle_model_definitions', ['variant_code'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_vehicle_class'), 'vehicle_model_definitions', ['vehicle_class'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_version_code'), 'vehicle_model_definitions', ['version_code'], unique=False, schema='data') + op.create_unique_constraint('uix_vmd_precision', 'vehicle_model_definitions', ['make', 'normalized_name', 'variant_code', 'version_code', 'fuel_type'], schema='data') + op.drop_constraint(op.f('vehicle_model_definitions_vehicle_type_id_fkey'), 'vehicle_model_definitions', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_model_definitions', 'vehicle_types', ['vehicle_type_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('persons_address_id_fkey'), 'persons', schema='identity', type_='foreignkey') + op.create_foreign_key(None, 'persons', 'addresses', ['address_id'], ['id'], source_schema='identity', referent_schema='data') + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'persons', schema='identity', type_='foreignkey') + op.create_foreign_key(op.f('persons_address_id_fkey'), 'persons', 'addresses', ['address_id'], ['id'], source_schema='identity') + op.drop_constraint(None, 'vehicle_model_definitions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_model_definitions_vehicle_type_id_fkey'), 'vehicle_model_definitions', 'vehicle_types', ['vehicle_type_id'], ['id']) + op.drop_constraint('uix_vmd_precision', 'vehicle_model_definitions', schema='data', type_='unique') + op.drop_index(op.f('ix_data_vehicle_model_definitions_version_code'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_vehicle_class'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_variant_code'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_power_kw'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_normalized_name'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_fuel_type'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_engine_capacity'), table_name='vehicle_model_definitions', schema='data') + op.drop_index('idx_vmd_lookup_fast', table_name='vehicle_model_definitions', schema='data') + op.create_unique_constraint(op.f('uix_make_tech_type'), 'vehicle_model_definitions', ['make', 'technical_code', 'vehicle_type_id'], postgresql_nulls_not_distinct=False) + op.create_index(op.f('ix_vehicle_model_marketing_name'), 'vehicle_model_definitions', ['marketing_name'], unique=False) + op.create_index(op.f('idx_vmd_lookup'), 'vehicle_model_definitions', ['make', 'technical_code'], unique=False) + op.alter_column('vehicle_model_definitions', 'source', + existing_type=sa.String(length=100), + type_=sa.VARCHAR(length=50), + existing_nullable=True) + op.alter_column('vehicle_model_definitions', 'status', + existing_type=sa.String(length=50), + type_=sa.VARCHAR(length=30), + existing_nullable=False, + existing_server_default=sa.text("'active'::character varying")) + op.alter_column('vehicle_model_definitions', 'power_kw', + existing_type=sa.INTEGER(), + nullable=True) + op.alter_column('vehicle_model_definitions', 'engine_capacity', + existing_type=sa.INTEGER(), + nullable=True) + op.alter_column('vehicle_model_definitions', 'body_type', + existing_type=sa.String(length=100), + type_=sa.VARCHAR(length=50), + existing_nullable=True) + op.alter_column('vehicle_model_definitions', 'technical_code', + existing_type=sa.String(length=100), + type_=sa.VARCHAR(length=50), + existing_nullable=False) + op.alter_column('vehicle_model_definitions', 'marketing_name', + existing_type=sa.String(length=255), + type_=sa.VARCHAR(length=100), + nullable=True) + op.alter_column('vehicle_model_definitions', 'make', + existing_type=sa.String(length=100), + type_=sa.VARCHAR(length=50), + existing_nullable=False) + op.drop_column('vehicle_model_definitions', 'doors') + op.drop_column('vehicle_model_definitions', 'euro_classification') + op.drop_column('vehicle_model_definitions', 'max_weight') + op.drop_column('vehicle_model_definitions', 'curb_weight') + op.drop_column('vehicle_model_definitions', 'cylinders') + op.drop_column('vehicle_model_definitions', 'version_code') + op.drop_column('vehicle_model_definitions', 'variant_code') + op.drop_column('vehicle_model_definitions', 'marketing_name_aliases') + op.drop_column('vehicle_model_definitions', 'normalized_name') + op.add_column('vehicle_catalog', sa.Column('engine_code', sa.VARCHAR(), autoincrement=False, nullable=True)) + op.add_column('vehicle_catalog', sa.Column('engine_variant', sa.VARCHAR(), autoincrement=False, nullable=True)) + op.add_column('vehicle_catalog', sa.Column('axle_count', sa.INTEGER(), autoincrement=False, nullable=True)) + op.add_column('vehicle_catalog', sa.Column('max_weight_kg', sa.INTEGER(), autoincrement=False, nullable=True)) + op.add_column('vehicle_catalog', sa.Column('body_type', sa.VARCHAR(length=100), autoincrement=False, nullable=True)) + op.add_column('vehicle_catalog', sa.Column('vehicle_class', sa.VARCHAR(), autoincrement=False, nullable=True)) + op.add_column('vehicle_catalog', sa.Column('euro_class', sa.VARCHAR(length=20), autoincrement=False, nullable=True)) + op.drop_constraint(None, 'vehicle_catalog', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_catalog_master_definition_id_fkey'), 'vehicle_catalog', 'vehicle_model_definitions', ['master_definition_id'], ['id']) + op.drop_constraint('uix_vehicle_catalog_full', 'vehicle_catalog', schema='data', type_='unique') + op.create_unique_constraint(op.f('uix_vehicle_catalog_full'), 'vehicle_catalog', ['make', 'model', 'year_from', 'engine_variant', 'fuel_type'], postgresql_nulls_not_distinct=False) + op.create_index(op.f('ix_data_vehicle_catalog_engine_variant'), 'vehicle_catalog', ['engine_variant'], unique=False) + op.drop_constraint(None, 'user_stats', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_stats_user_id_fkey'), 'user_stats', 'users', ['user_id'], ['id'], referent_schema='identity') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_badges_badge_id_fkey'), 'user_badges', 'badges', ['badge_id'], ['id']) + op.create_foreign_key(op.f('user_badges_user_id_fkey'), 'user_badges', 'users', ['user_id'], ['id'], referent_schema='identity') + op.drop_constraint(None, 'service_specialties', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_specialties_parent_id_fkey'), 'service_specialties', 'service_specialties', ['parent_id'], ['id']) + op.drop_constraint(None, 'service_profiles', schema='data', type_='foreignkey') + op.drop_constraint(None, 'service_profiles', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_profiles_organization_id_fkey'), 'service_profiles', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('service_profiles_parent_id_fkey'), 'service_profiles', 'service_profiles', ['parent_id'], ['id']) + op.create_index(op.f('idx_service_profiles_location'), 'service_profiles', ['location'], unique=False, postgresql_using='gist') + op.drop_constraint(None, 'service_expertises', schema='data', type_='foreignkey') + op.drop_constraint(None, 'service_expertises', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_expertises_expertise_id_fkey'), 'service_expertises', 'expertise_tags', ['expertise_id'], ['id']) + op.create_foreign_key(op.f('service_expertises_service_id_fkey'), 'service_expertises', 'service_profiles', ['service_id'], ['id']) + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('ratings_target_branch_id_fkey'), 'ratings', 'branches', ['target_branch_id'], ['id']) + op.create_foreign_key(op.f('ratings_target_organization_id_fkey'), 'ratings', 'organizations', ['target_organization_id'], ['id']) + op.create_foreign_key(op.f('ratings_author_id_fkey'), 'ratings', 'users', ['author_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('ratings_target_user_id_fkey'), 'ratings', 'users', ['target_user_id'], ['id'], referent_schema='identity') + op.drop_constraint(None, 'points_ledger', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('points_ledger_user_id_fkey'), 'points_ledger', 'users', ['user_id'], ['id'], referent_schema='identity') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organizations_address_id_fkey'), 'organizations', 'addresses', ['address_id'], ['id']) + op.create_foreign_key(op.f('organizations_owner_id_fkey'), 'organizations', 'users', ['owner_id'], ['id'], referent_schema='identity') + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + existing_nullable=False) + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_members_person_id_fkey'), 'organization_members', 'persons', ['person_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('organization_members_organization_id_fkey'), 'organization_members', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('organization_members_user_id_fkey'), 'organization_members', 'users', ['user_id'], ['id'], referent_schema='identity') + op.alter_column('organization_members', 'role', + existing_type=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole', schema='data'), + type_=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole'), + existing_nullable=False) + op.drop_constraint(None, 'organization_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_financials_organization_id_fkey'), 'organization_financials', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', 'organizations', ['org_id'], ['id']) + op.create_foreign_key(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id']) + op.drop_constraint(None, 'org_sales_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_sales_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_sales_assignments_organization_id_fkey'), 'org_sales_assignments', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('org_sales_assignments_agent_user_id_fkey'), 'org_sales_assignments', 'users', ['agent_user_id'], ['id'], referent_schema='identity') + op.drop_constraint(None, 'model_feature_maps', schema='data', type_='foreignkey') + op.drop_constraint(None, 'model_feature_maps', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('model_feature_maps_model_definition_id_fkey'), 'model_feature_maps', 'vehicle_model_definitions', ['model_definition_id'], ['id']) + op.create_foreign_key(op.f('model_feature_maps_feature_id_fkey'), 'model_feature_maps', 'feature_definitions', ['feature_id'], ['id']) + op.drop_constraint(None, 'geo_streets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_constraint(None, 'feature_definitions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('feature_definitions_vehicle_type_id_fkey'), 'feature_definitions', 'vehicle_types', ['vehicle_type_id'], ['id']) + op.add_column('exchange_rates', sa.Column('target_currency', sa.VARCHAR(length=3), autoincrement=False, nullable=True)) + op.add_column('exchange_rates', sa.Column('base_currency', sa.VARCHAR(length=3), autoincrement=False, nullable=False)) + op.create_unique_constraint(op.f('exchange_rates_target_currency_key'), 'exchange_rates', ['target_currency'], postgresql_nulls_not_distinct=False) + op.drop_constraint(None, 'credit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('credit_logs_org_id_fkey'), 'credit_logs', 'organizations', ['org_id'], ['id']) + op.add_column('catalog_discovery', sa.Column('created_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=False)) + op.add_column('catalog_discovery', sa.Column('attempts', sa.INTEGER(), autoincrement=False, nullable=False)) + op.add_column('catalog_discovery', sa.Column('priority_score', sa.INTEGER(), server_default=sa.text('0'), autoincrement=False, nullable=True)) + op.add_column('catalog_discovery', sa.Column('last_attempt', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True)) + op.add_column('catalog_discovery', sa.Column('vehicle_class', sa.VARCHAR(length=50), autoincrement=False, nullable=True)) + op.add_column('catalog_discovery', sa.Column('source', sa.VARCHAR(length=50), autoincrement=False, nullable=True)) + op.drop_constraint('_make_model_uc', 'catalog_discovery', schema='data', type_='unique') + op.create_index(op.f('ix_data_catalog_discovery_vehicle_class'), 'catalog_discovery', ['vehicle_class'], unique=False) + op.create_unique_constraint(op.f('_make_model_class_uc'), 'catalog_discovery', ['make', 'model', 'vehicle_class'], postgresql_nulls_not_distinct=False) + op.drop_constraint(None, 'branches', schema='data', type_='foreignkey') + op.drop_constraint(None, 'branches', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('branches_organization_id_fkey'), 'branches', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('branches_address_id_fkey'), 'branches', 'addresses', ['address_id'], ['id']) + op.drop_constraint(None, 'audit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('audit_logs_user_id_fkey'), 'audit_logs', 'users', ['user_id'], ['id'], referent_schema='identity') + op.alter_column('audit_logs', 'severity', + existing_type=postgresql.ENUM('info', 'warning', 'critical', 'emergency', name='log_severity', schema='data'), + type_=postgresql.ENUM('info', 'warning', 'critical', 'emergency', name='log_severity'), + existing_nullable=False) + op.add_column('assets', sa.Column('registration_uuid', sa.UUID(), autoincrement=False, nullable=False)) + op.add_column('assets', sa.Column('verification_notes', sa.TEXT(), autoincrement=False, nullable=True)) + op.add_column('assets', sa.Column('verification_method', sa.VARCHAR(length=20), autoincrement=False, nullable=True)) + op.add_column('assets', sa.Column('catalog_match_score', sa.NUMERIC(precision=5, scale=2), autoincrement=False, nullable=True)) + op.add_column('assets', sa.Column('is_verified', sa.BOOLEAN(), autoincrement=False, nullable=False)) + op.add_column('assets', sa.Column('is_corporate', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=False)) + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('assets_current_organization_id_fkey'), 'assets', 'organizations', ['current_organization_id'], ['id']) + op.create_foreign_key(op.f('assets_catalog_id_fkey'), 'assets', 'vehicle_catalog', ['catalog_id'], ['id']) + op.create_foreign_key(op.f('assets_operator_person_id_fkey'), 'assets', 'persons', ['operator_person_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('assets_owner_org_id_fkey'), 'assets', 'organizations', ['owner_org_id'], ['id']) + op.create_foreign_key(op.f('assets_owner_person_id_fkey'), 'assets', 'persons', ['owner_person_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('assets_operator_org_id_fkey'), 'assets', 'organizations', ['operator_org_id'], ['id']) + op.drop_index(op.f('ix_data_assets_year_of_manufacture'), table_name='assets', schema='data') + op.drop_index(op.f('ix_data_assets_is_for_sale'), table_name='assets', schema='data') + op.drop_index(op.f('ix_data_assets_current_mileage'), table_name='assets', schema='data') + op.create_index(op.f('ix_data_assets_registration_uuid'), 'assets', ['registration_uuid'], unique=False) + op.drop_column('assets', 'individual_equipment') + op.drop_column('assets', 'currency') + op.drop_column('assets', 'price') + op.drop_column('assets', 'is_for_sale') + op.drop_column('assets', 'condition_score') + op.drop_column('assets', 'current_mileage') + op.drop_column('assets', 'first_registration_date') + op.add_column('asset_telemetry', sa.Column('mileage_unit', sa.VARCHAR(length=10), autoincrement=False, nullable=False)) + op.add_column('asset_telemetry', sa.Column('vqi_score', sa.NUMERIC(precision=5, scale=2), autoincrement=False, nullable=False)) + op.add_column('asset_telemetry', sa.Column('dbs_score', sa.NUMERIC(precision=5, scale=2), autoincrement=False, nullable=False)) + op.drop_constraint(None, 'asset_telemetry', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', 'assets', ['asset_id'], ['id']) + op.add_column('asset_reviews', sa.Column('criteria_scores', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), autoincrement=False, nullable=False)) + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', 'users', ['user_id'], ['id'], referent_schema='identity') + op.add_column('asset_financials', sa.Column('acquisition_date', postgresql.TIMESTAMP(), autoincrement=False, nullable=True)) + op.add_column('asset_financials', sa.Column('acquisition_price', sa.NUMERIC(precision=18, scale=2), autoincrement=False, nullable=True)) + op.add_column('asset_financials', sa.Column('residual_value_estimate', sa.NUMERIC(precision=18, scale=2), autoincrement=False, nullable=True)) + op.drop_constraint(None, 'asset_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_financials_asset_id_fkey'), 'asset_financials', 'assets', ['asset_id'], ['id']) + op.alter_column('asset_financials', 'financing_type', + existing_type=sa.VARCHAR(), + nullable=True) + op.drop_column('asset_financials', 'accounting_details') + op.drop_column('asset_financials', 'activation_date') + op.drop_column('asset_financials', 'vat_rate') + op.drop_column('asset_financials', 'purchase_price_gross') + op.drop_column('asset_financials', 'purchase_price_net') + op.add_column('asset_events', sa.Column('data', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), autoincrement=False, nullable=False)) + op.add_column('asset_events', sa.Column('recorded_mileage', sa.INTEGER(), autoincrement=False, nullable=True)) + op.add_column('asset_events', sa.Column('registration_uuid', sa.UUID(), autoincrement=False, nullable=True)) + op.drop_constraint(None, 'asset_events', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_events_asset_id_fkey'), 'asset_events', 'assets', ['asset_id'], ['id']) + op.create_index(op.f('ix_data_asset_events_registration_uuid'), 'asset_events', ['registration_uuid'], unique=False) + op.add_column('asset_costs', sa.Column('mileage_at_cost', sa.INTEGER(), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('net_amount_local', sa.NUMERIC(precision=18, scale=2), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('exchange_rate_used', sa.NUMERIC(precision=18, scale=6), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('registration_uuid', sa.UUID(), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('vat_rate', sa.NUMERIC(precision=5, scale=2), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('amount_eur', sa.NUMERIC(precision=18, scale=2), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('amount_local', sa.NUMERIC(precision=18, scale=2), autoincrement=False, nullable=False)) + op.add_column('asset_costs', sa.Column('currency_local', sa.VARCHAR(length=3), autoincrement=False, nullable=False)) + op.add_column('asset_costs', sa.Column('cost_type', sa.VARCHAR(length=50), autoincrement=False, nullable=False)) + op.add_column('asset_costs', sa.Column('driver_id', sa.INTEGER(), autoincrement=False, nullable=True)) + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_costs_organization_id_fkey'), 'asset_costs', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_asset_id_fkey'), 'asset_costs', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_driver_id_fkey'), 'asset_costs', 'users', ['driver_id'], ['id'], referent_schema='identity') + op.drop_index(op.f('ix_data_asset_costs_invoice_number'), table_name='asset_costs', schema='data') + op.drop_index(op.f('ix_data_asset_costs_cost_category'), table_name='asset_costs', schema='data') + op.create_index(op.f('ix_data_asset_costs_registration_uuid'), 'asset_costs', ['registration_uuid'], unique=False) + op.drop_column('asset_costs', 'invoice_number') + op.drop_column('asset_costs', 'currency') + op.drop_column('asset_costs', 'amount_net') + op.drop_column('asset_costs', 'cost_category') + op.add_column('asset_assignments', sa.Column('branch_id', sa.UUID(), autoincrement=False, nullable=True)) + op.add_column('asset_assignments', sa.Column('released_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True)) + op.add_column('asset_assignments', sa.Column('assigned_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=False)) + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_branch_id_fkey'), 'asset_assignments', 'branches', ['branch_id'], ['id']) + op.drop_constraint(None, 'addresses', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('addresses_postal_code_id_fkey'), 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_table('vehicle_ownership_history', schema='data') + op.drop_index(op.f('ix_data_vehicle_logbook_trip_type'), table_name='vehicle_logbook', schema='data') + op.drop_table('vehicle_logbook', schema='data') + op.drop_table('asset_inspections', schema='data') + # ### end Alembic commands ### diff --git a/backend/migrations/versions/5bd7f1cb0dc9_sentinel_v2_core_update.py b/backend/migrations/versions/5bd7f1cb0dc9_sentinel_v2_core_update.py new file mode 100755 index 0000000..28dc915 --- /dev/null +++ b/backend/migrations/versions/5bd7f1cb0dc9_sentinel_v2_core_update.py @@ -0,0 +1,28 @@ +"""sentinel_v2_core_update + +Revision ID: 5bd7f1cb0dc9 +Revises: e5ad17906e7f +Create Date: 2026-02-27 23:48:28.770182 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = '5bd7f1cb0dc9' +down_revision: Union[str, Sequence[str], None] = 'e5ad17906e7f' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + pass + + +def downgrade() -> None: + """Downgrade schema.""" + pass diff --git a/backend/migrations/versions/78f5b29d0714_mb2_genesis_final.py b/backend/migrations/versions/78f5b29d0714_mb2_genesis_final.py new file mode 100755 index 0000000..207b2b2 --- /dev/null +++ b/backend/migrations/versions/78f5b29d0714_mb2_genesis_final.py @@ -0,0 +1,919 @@ +"""MB2_Genesis_Final + +Revision ID: 78f5b29d0714 +Revises: +Create Date: 2026-02-23 23:33:45.271156 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +import geoalchemy2 +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = '78f5b29d0714' +down_revision: Union[str, Sequence[str], None] = None +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.execute('CREATE EXTENSION IF NOT EXISTS postgis') + op.execute('CREATE SCHEMA IF NOT EXISTS identity') + op.execute('CREATE SCHEMA IF NOT EXISTS data') + op.execute('CREATE SCHEMA IF NOT EXISTS system') + op.execute('CREATE EXTENSION IF NOT EXISTS postgis') + op.create_table('badges', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(), nullable=False), + sa.Column('description', sa.String(), nullable=False), + sa.Column('icon_url', sa.String(), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('name'), + schema='data' + ) + op.create_index(op.f('ix_data_badges_id'), 'badges', ['id'], unique=False, schema='data') + op.create_table('catalog_discovery', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('make', sa.String(length=100), nullable=False), + sa.Column('model', sa.String(length=100), nullable=False), + sa.Column('vehicle_class', sa.String(length=50), nullable=True), + sa.Column('source', sa.String(length=50), nullable=True), + sa.Column('status', sa.String(length=20), server_default=sa.text("'pending'"), nullable=False), + sa.Column('attempts', sa.Integer(), nullable=False), + sa.Column('last_attempt', sa.DateTime(timezone=True), nullable=True), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('make', 'model', 'vehicle_class', name='_make_model_class_uc'), + schema='data' + ) + op.create_index(op.f('ix_data_catalog_discovery_id'), 'catalog_discovery', ['id'], unique=False, schema='data') + op.create_index(op.f('ix_data_catalog_discovery_make'), 'catalog_discovery', ['make'], unique=False, schema='data') + op.create_index(op.f('ix_data_catalog_discovery_model'), 'catalog_discovery', ['model'], unique=False, schema='data') + op.create_index(op.f('ix_data_catalog_discovery_status'), 'catalog_discovery', ['status'], unique=False, schema='data') + op.create_index(op.f('ix_data_catalog_discovery_vehicle_class'), 'catalog_discovery', ['vehicle_class'], unique=False, schema='data') + op.create_table('discovery_parameters', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('city', sa.String(length=100), nullable=False), + sa.Column('keyword', sa.String(length=100), nullable=False), + sa.Column('is_active', sa.Boolean(), nullable=False), + sa.Column('last_run_at', sa.DateTime(timezone=True), nullable=True), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_table('exchange_rates', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('base_currency', sa.String(length=3), nullable=False), + sa.Column('target_currency', sa.String(length=3), nullable=True), + sa.Column('rate', sa.Numeric(precision=18, scale=6), nullable=False), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('target_currency'), + schema='data' + ) + op.create_table('expertise_tags', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('key', sa.String(length=50), nullable=False), + sa.Column('name_hu', sa.String(length=100), nullable=True), + sa.Column('category', sa.String(length=30), nullable=True), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index(op.f('ix_data_expertise_tags_key'), 'expertise_tags', ['key'], unique=True, schema='data') + op.create_table('geo_postal_codes', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('country_code', sa.String(length=5), nullable=False), + sa.Column('zip_code', sa.String(length=10), nullable=False), + sa.Column('city', sa.String(length=100), nullable=False), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index(op.f('ix_data_geo_postal_codes_city'), 'geo_postal_codes', ['city'], unique=False, schema='data') + op.create_index(op.f('ix_data_geo_postal_codes_zip_code'), 'geo_postal_codes', ['zip_code'], unique=False, schema='data') + op.create_table('geo_street_types', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(length=50), nullable=False), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('name'), + schema='data' + ) + op.create_table('level_configs', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('level_number', sa.Integer(), nullable=False), + sa.Column('min_points', sa.Integer(), nullable=False), + sa.Column('rank_name', sa.String(), nullable=False), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('level_number'), + schema='data' + ) + op.create_index(op.f('ix_data_level_configs_id'), 'level_configs', ['id'], unique=False, schema='data') + op.create_table('point_rules', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('action_key', sa.String(), nullable=False), + sa.Column('points', sa.Integer(), nullable=False), + sa.Column('description', sa.String(), nullable=True), + sa.Column('is_active', sa.Boolean(), nullable=False), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index(op.f('ix_data_point_rules_action_key'), 'point_rules', ['action_key'], unique=True, schema='data') + op.create_index(op.f('ix_data_point_rules_id'), 'point_rules', ['id'], unique=False, schema='data') + op.create_table('service_specialties', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('parent_id', sa.Integer(), nullable=True), + sa.Column('name', sa.String(), nullable=False), + sa.Column('slug', sa.String(), nullable=False), + sa.ForeignKeyConstraint(['parent_id'], ['data.service_specialties.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index(op.f('ix_data_service_specialties_slug'), 'service_specialties', ['slug'], unique=True, schema='data') + op.create_table('service_staging', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(), nullable=False), + sa.Column('postal_code', sa.String(length=10), nullable=True), + sa.Column('city', sa.String(length=100), nullable=True), + sa.Column('full_address', sa.String(), nullable=True), + sa.Column('fingerprint', sa.String(length=255), nullable=False), + sa.Column('raw_data', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False), + sa.Column('status', sa.String(length=20), server_default=sa.text("'pending'"), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index('idx_staging_fingerprint', 'service_staging', ['fingerprint'], unique=True, schema='data') + op.create_index(op.f('ix_data_service_staging_city'), 'service_staging', ['city'], unique=False, schema='data') + op.create_index(op.f('ix_data_service_staging_id'), 'service_staging', ['id'], unique=False, schema='data') + op.create_index(op.f('ix_data_service_staging_name'), 'service_staging', ['name'], unique=False, schema='data') + op.create_index(op.f('ix_data_service_staging_postal_code'), 'service_staging', ['postal_code'], unique=False, schema='data') + op.create_index(op.f('ix_data_service_staging_status'), 'service_staging', ['status'], unique=False, schema='data') + op.create_table('subscription_tiers', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(), nullable=False), + sa.Column('rules', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False), + sa.Column('is_custom', sa.Boolean(), nullable=False), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index(op.f('ix_data_subscription_tiers_name'), 'subscription_tiers', ['name'], unique=True, schema='data') + op.create_table('translations', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('key', sa.String(length=255), nullable=False), + sa.Column('lang', sa.String(length=5), nullable=False), + sa.Column('value', sa.Text(), nullable=False), + sa.Column('is_published', sa.Boolean(), server_default=sa.text('true'), nullable=False), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index(op.f('ix_data_translations_id'), 'translations', ['id'], unique=False, schema='data') + op.create_index(op.f('ix_data_translations_key'), 'translations', ['key'], unique=False, schema='data') + op.create_index(op.f('ix_data_translations_lang'), 'translations', ['lang'], unique=False, schema='data') + op.create_table('vehicle_types', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('code', sa.String(length=30), nullable=False), + sa.Column('name', sa.String(length=50), nullable=False), + sa.Column('icon', sa.String(length=50), nullable=True), + sa.Column('units', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text('\'{"power": "kW", "weight": "kg"}\'::jsonb'), nullable=False), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index(op.f('ix_data_vehicle_types_code'), 'vehicle_types', ['code'], unique=True, schema='data') + op.create_table('addresses', + sa.Column('id', sa.UUID(), nullable=False), + sa.Column('postal_code_id', sa.Integer(), nullable=True), + sa.Column('street_name', sa.String(length=200), nullable=False), + sa.Column('street_type', sa.String(length=50), nullable=False), + sa.Column('house_number', sa.String(length=50), nullable=False), + sa.Column('stairwell', sa.String(length=20), nullable=True), + sa.Column('floor', sa.String(length=20), nullable=True), + sa.Column('door', sa.String(length=20), nullable=True), + sa.Column('parcel_id', sa.String(length=50), nullable=True), + sa.Column('full_address_text', sa.Text(), nullable=True), + sa.Column('latitude', sa.Float(), nullable=True), + sa.Column('longitude', sa.Float(), nullable=True), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.ForeignKeyConstraint(['postal_code_id'], ['data.geo_postal_codes.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_table('feature_definitions', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('vehicle_type_id', sa.Integer(), nullable=False), + sa.Column('code', sa.String(length=50), nullable=False), + sa.Column('name', sa.String(length=100), nullable=False), + sa.Column('category', sa.String(length=50), nullable=False), + sa.ForeignKeyConstraint(['vehicle_type_id'], ['data.vehicle_types.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index(op.f('ix_data_feature_definitions_category'), 'feature_definitions', ['category'], unique=False, schema='data') + op.create_index(op.f('ix_data_feature_definitions_code'), 'feature_definitions', ['code'], unique=False, schema='data') + op.create_table('geo_streets', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('postal_code_id', sa.Integer(), nullable=True), + sa.Column('name', sa.String(length=200), nullable=False), + sa.ForeignKeyConstraint(['postal_code_id'], ['data.geo_postal_codes.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index(op.f('ix_data_geo_streets_name'), 'geo_streets', ['name'], unique=False, schema='data') + op.create_table('vehicle_model_definitions', + sa.Column('raw_search_context', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False), + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('make', sa.String(length=50), nullable=False), + sa.Column('technical_code', sa.String(length=50), nullable=False), + sa.Column('marketing_name', sa.String(length=100), nullable=True), + sa.Column('vehicle_type_id', sa.Integer(), nullable=True), + sa.Column('year_from', sa.Integer(), nullable=True), + sa.Column('year_to', sa.Integer(), nullable=True), + sa.Column('status', sa.String(length=30), server_default=sa.text("'active'"), nullable=False), + sa.Column('is_manual', sa.Boolean(), nullable=False), + sa.Column('attempts', sa.Integer(), nullable=False), + sa.Column('research_metadata', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False), + sa.Column('specifications', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.ForeignKeyConstraint(['vehicle_type_id'], ['data.vehicle_types.id'], ), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('make', 'technical_code', 'vehicle_type_id', name='uix_make_tech_type'), + schema='data' + ) + op.create_index('idx_vmd_lookup', 'vehicle_model_definitions', ['make', 'technical_code'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_make'), 'vehicle_model_definitions', ['make'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_marketing_name'), 'vehicle_model_definitions', ['marketing_name'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_status'), 'vehicle_model_definitions', ['status'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_technical_code'), 'vehicle_model_definitions', ['technical_code'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_year_from'), 'vehicle_model_definitions', ['year_from'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_year_to'), 'vehicle_model_definitions', ['year_to'], unique=False, schema='data') + op.create_table('model_feature_maps', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('model_definition_id', sa.Integer(), nullable=False), + sa.Column('feature_id', sa.Integer(), nullable=False), + sa.Column('is_standard', sa.Boolean(), nullable=False), + sa.ForeignKeyConstraint(['feature_id'], ['data.feature_definitions.id'], ), + sa.ForeignKeyConstraint(['model_definition_id'], ['data.vehicle_model_definitions.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_table('vehicle_catalog', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('master_definition_id', sa.Integer(), nullable=True), + sa.Column('make', sa.String(), nullable=False), + sa.Column('model', sa.String(), nullable=False), + sa.Column('generation', sa.String(), nullable=True), + sa.Column('engine_variant', sa.String(), nullable=True), + sa.Column('year_from', sa.Integer(), nullable=True), + sa.Column('year_to', sa.Integer(), nullable=True), + sa.Column('vehicle_class', sa.String(), nullable=True), + sa.Column('fuel_type', sa.String(), nullable=True), + sa.Column('power_kw', sa.Integer(), nullable=True), + sa.Column('engine_capacity', sa.Integer(), nullable=True), + sa.Column('max_weight_kg', sa.Integer(), nullable=True), + sa.Column('axle_count', sa.Integer(), nullable=True), + sa.Column('euro_class', sa.String(length=20), nullable=True), + sa.Column('body_type', sa.String(length=100), nullable=True), + sa.Column('engine_code', sa.String(), nullable=True), + sa.Column('factory_data', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False), + sa.ForeignKeyConstraint(['master_definition_id'], ['data.vehicle_model_definitions.id'], ), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('make', 'model', 'year_from', 'engine_variant', 'fuel_type', name='uix_vehicle_catalog_full'), + schema='data' + ) + op.create_index(op.f('ix_data_vehicle_catalog_engine_capacity'), 'vehicle_catalog', ['engine_capacity'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_catalog_engine_variant'), 'vehicle_catalog', ['engine_variant'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_catalog_fuel_type'), 'vehicle_catalog', ['fuel_type'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_catalog_generation'), 'vehicle_catalog', ['generation'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_catalog_id'), 'vehicle_catalog', ['id'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_catalog_make'), 'vehicle_catalog', ['make'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_catalog_model'), 'vehicle_catalog', ['model'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_catalog_power_kw'), 'vehicle_catalog', ['power_kw'], unique=False, schema='data') + op.create_table('persons', + sa.Column('id', sa.BigInteger(), nullable=False), + sa.Column('id_uuid', sa.UUID(), nullable=False), + sa.Column('address_id', sa.UUID(), nullable=True), + sa.Column('identity_hash', sa.String(length=64), nullable=True), + sa.Column('last_name', sa.String(), nullable=False), + sa.Column('first_name', sa.String(), nullable=False), + sa.Column('phone', sa.String(), nullable=True), + sa.Column('mothers_last_name', sa.String(), nullable=True), + sa.Column('mothers_first_name', sa.String(), nullable=True), + sa.Column('birth_place', sa.String(), nullable=True), + sa.Column('birth_date', sa.DateTime(), nullable=True), + sa.Column('identity_docs', sa.JSON(), server_default=sa.text("'{}'::jsonb"), nullable=False), + sa.Column('ice_contact', sa.JSON(), server_default=sa.text("'{}'::jsonb"), nullable=False), + sa.Column('lifetime_xp', sa.BigInteger(), server_default=sa.text('0'), nullable=False), + sa.Column('penalty_points', sa.Integer(), server_default=sa.text('0'), nullable=False), + sa.Column('social_reputation', sa.Numeric(precision=3, scale=2), server_default=sa.text('1.00'), nullable=False), + sa.Column('is_sales_agent', sa.Boolean(), server_default=sa.text('false'), nullable=False), + sa.Column('is_active', sa.Boolean(), nullable=False), + sa.Column('is_ghost', sa.Boolean(), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.Column('updated_at', sa.DateTime(timezone=True), nullable=True), + sa.ForeignKeyConstraint(['address_id'], ['data.addresses.id'], ), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('id_uuid'), + schema='identity' + ) + op.create_index(op.f('ix_identity_persons_id'), 'persons', ['id'], unique=False, schema='identity') + op.create_index(op.f('ix_identity_persons_identity_hash'), 'persons', ['identity_hash'], unique=True, schema='identity') + op.create_table('users', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('email', sa.String(), nullable=False), + sa.Column('hashed_password', sa.String(), nullable=True), + sa.Column('role', postgresql.ENUM('superadmin', 'admin', 'region_admin', 'country_admin', 'moderator', 'sales_agent', 'user', 'service_owner', 'fleet_manager', 'driver', name='userrole', schema='identity'), nullable=False), + sa.Column('person_id', sa.BigInteger(), nullable=True), + sa.Column('subscription_plan', sa.String(length=30), server_default=sa.text("'FREE'"), nullable=False), + sa.Column('subscription_expires_at', sa.DateTime(timezone=True), nullable=True), + sa.Column('is_vip', sa.Boolean(), server_default=sa.text('false'), nullable=False), + sa.Column('referral_code', sa.String(length=20), nullable=True), + sa.Column('referred_by_id', sa.Integer(), nullable=True), + sa.Column('current_sales_agent_id', sa.Integer(), nullable=True), + sa.Column('is_active', sa.Boolean(), nullable=False), + sa.Column('is_deleted', sa.Boolean(), nullable=False), + sa.Column('folder_slug', sa.String(length=12), nullable=True), + sa.Column('preferred_language', sa.String(length=5), server_default='hu', nullable=False), + sa.Column('region_code', sa.String(length=5), server_default='HU', nullable=False), + sa.Column('preferred_currency', sa.String(length=3), server_default='HUF', nullable=False), + sa.Column('scope_level', sa.String(length=30), server_default='individual', nullable=False), + sa.Column('scope_id', sa.String(length=50), nullable=True), + sa.Column('custom_permissions', sa.JSON(), server_default=sa.text("'{}'::jsonb"), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.ForeignKeyConstraint(['current_sales_agent_id'], ['identity.users.id'], ), + sa.ForeignKeyConstraint(['person_id'], ['identity.persons.id'], ), + sa.ForeignKeyConstraint(['referred_by_id'], ['identity.users.id'], ), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('referral_code'), + schema='identity' + ) + op.create_index(op.f('ix_identity_users_email'), 'users', ['email'], unique=True, schema='identity') + op.create_index(op.f('ix_identity_users_folder_slug'), 'users', ['folder_slug'], unique=True, schema='identity') + op.create_index(op.f('ix_identity_users_id'), 'users', ['id'], unique=False, schema='identity') + op.create_table('audit_logs', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=True), + sa.Column('severity', postgresql.ENUM('info', 'warning', 'critical', 'emergency', name='log_severity', schema='data'), nullable=False), + sa.Column('action', sa.String(length=100), nullable=False), + sa.Column('target_type', sa.String(length=50), nullable=True), + sa.Column('target_id', sa.String(length=50), nullable=True), + sa.Column('old_data', sa.JSON(), nullable=True), + sa.Column('new_data', sa.JSON(), nullable=True), + sa.Column('ip_address', sa.String(length=45), nullable=True), + sa.Column('user_agent', sa.Text(), nullable=True), + sa.Column('timestamp', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.ForeignKeyConstraint(['user_id'], ['identity.users.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index(op.f('ix_data_audit_logs_action'), 'audit_logs', ['action'], unique=False, schema='data') + op.create_index(op.f('ix_data_audit_logs_id'), 'audit_logs', ['id'], unique=False, schema='data') + op.create_index(op.f('ix_data_audit_logs_ip_address'), 'audit_logs', ['ip_address'], unique=False, schema='data') + op.create_index(op.f('ix_data_audit_logs_target_id'), 'audit_logs', ['target_id'], unique=False, schema='data') + op.create_index(op.f('ix_data_audit_logs_target_type'), 'audit_logs', ['target_type'], unique=False, schema='data') + op.create_index(op.f('ix_data_audit_logs_timestamp'), 'audit_logs', ['timestamp'], unique=False, schema='data') + op.create_table('organizations', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('address_id', sa.UUID(), nullable=True), + sa.Column('is_anonymized', sa.Boolean(), server_default=sa.text('false'), nullable=False), + sa.Column('anonymized_at', sa.DateTime(timezone=True), nullable=True), + sa.Column('full_name', sa.String(), nullable=False), + sa.Column('name', sa.String(), nullable=False), + sa.Column('display_name', sa.String(length=50), nullable=True), + sa.Column('folder_slug', sa.String(length=12), nullable=False), + sa.Column('default_currency', sa.String(length=3), nullable=False), + sa.Column('country_code', sa.String(length=2), nullable=False), + sa.Column('language', sa.String(length=5), nullable=False), + sa.Column('address_zip', sa.String(length=10), nullable=True), + sa.Column('address_city', sa.String(length=100), nullable=True), + sa.Column('address_street_name', sa.String(length=150), nullable=True), + sa.Column('address_street_type', sa.String(length=50), nullable=True), + sa.Column('address_house_number', sa.String(length=20), nullable=True), + sa.Column('address_hrsz', sa.String(length=50), nullable=True), + sa.Column('tax_number', sa.String(length=20), nullable=True), + sa.Column('reg_number', sa.String(length=50), nullable=True), + sa.Column('org_type', postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data'), nullable=False), + sa.Column('status', sa.String(length=30), nullable=False), + sa.Column('is_deleted', sa.Boolean(), nullable=False), + sa.Column('subscription_plan', sa.String(length=30), server_default=sa.text("'FREE'"), nullable=False), + sa.Column('base_asset_limit', sa.Integer(), server_default=sa.text('1'), nullable=False), + sa.Column('purchased_extra_slots', sa.Integer(), server_default=sa.text('0'), nullable=False), + sa.Column('notification_settings', sa.JSON(), server_default=sa.text('\'{"notify_owner": true, "alert_days_before": [30, 15, 7, 1]}\'::jsonb'), nullable=False), + sa.Column('external_integration_config', sa.JSON(), server_default=sa.text("'{}'::jsonb"), nullable=False), + sa.Column('owner_id', sa.Integer(), nullable=True), + sa.Column('is_active', sa.Boolean(), nullable=False), + sa.Column('is_verified', sa.Boolean(), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.Column('updated_at', sa.DateTime(timezone=True), nullable=True), + sa.Column('is_ownership_transferable', sa.Boolean(), server_default=sa.text('true'), nullable=False), + sa.ForeignKeyConstraint(['address_id'], ['data.addresses.id'], ), + sa.ForeignKeyConstraint(['owner_id'], ['identity.users.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index(op.f('ix_data_organizations_folder_slug'), 'organizations', ['folder_slug'], unique=True, schema='data') + op.create_index(op.f('ix_data_organizations_id'), 'organizations', ['id'], unique=False, schema='data') + op.create_index(op.f('ix_data_organizations_subscription_plan'), 'organizations', ['subscription_plan'], unique=False, schema='data') + op.create_index(op.f('ix_data_organizations_tax_number'), 'organizations', ['tax_number'], unique=True, schema='data') + op.create_table('points_ledger', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('points', sa.Integer(), nullable=False), + sa.Column('penalty_change', sa.Integer(), server_default=sa.text('0'), nullable=False), + sa.Column('reason', sa.String(), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.ForeignKeyConstraint(['user_id'], ['identity.users.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index(op.f('ix_data_points_ledger_id'), 'points_ledger', ['id'], unique=False, schema='data') + op.create_table('user_badges', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('badge_id', sa.Integer(), nullable=False), + sa.Column('earned_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.ForeignKeyConstraint(['badge_id'], ['data.badges.id'], ), + sa.ForeignKeyConstraint(['user_id'], ['identity.users.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index(op.f('ix_data_user_badges_id'), 'user_badges', ['id'], unique=False, schema='data') + op.create_table('user_stats', + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('total_xp', sa.Integer(), nullable=False), + sa.Column('social_points', sa.Integer(), nullable=False), + sa.Column('current_level', sa.Integer(), nullable=False), + sa.Column('penalty_points', sa.Integer(), server_default=sa.text('0'), nullable=False), + sa.Column('restriction_level', sa.Integer(), server_default=sa.text('0'), nullable=False), + sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.ForeignKeyConstraint(['user_id'], ['identity.users.id'], ), + sa.PrimaryKeyConstraint('user_id'), + schema='data' + ) + op.create_table('social_accounts', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('provider', sa.String(length=50), nullable=False), + sa.Column('social_id', sa.String(length=255), nullable=False), + sa.Column('email', sa.String(length=255), nullable=False), + sa.Column('extra_data', sa.JSON(), server_default=sa.text("'{}'::jsonb"), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.ForeignKeyConstraint(['user_id'], ['identity.users.id'], ondelete='CASCADE'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('provider', 'social_id', name='uix_social_provider_id'), + schema='identity' + ) + op.create_index(op.f('ix_identity_social_accounts_id'), 'social_accounts', ['id'], unique=False, schema='identity') + op.create_index(op.f('ix_identity_social_accounts_social_id'), 'social_accounts', ['social_id'], unique=False, schema='identity') + op.create_table('verification_tokens', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('token', sa.UUID(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('token_type', sa.String(length=20), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.Column('expires_at', sa.DateTime(timezone=True), nullable=False), + sa.Column('is_used', sa.Boolean(), nullable=False), + sa.ForeignKeyConstraint(['user_id'], ['identity.users.id'], ondelete='CASCADE'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('token'), + schema='identity' + ) + op.create_index(op.f('ix_identity_verification_tokens_id'), 'verification_tokens', ['id'], unique=False, schema='identity') + op.create_table('wallets', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('earned_credits', sa.Numeric(precision=18, scale=4), server_default=sa.text('0'), nullable=False), + sa.Column('purchased_credits', sa.Numeric(precision=18, scale=4), server_default=sa.text('0'), nullable=False), + sa.Column('service_coins', sa.Numeric(precision=18, scale=4), server_default=sa.text('0'), nullable=False), + sa.Column('currency', sa.String(length=3), nullable=False), + sa.ForeignKeyConstraint(['user_id'], ['identity.users.id'], ), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user_id'), + schema='identity' + ) + op.create_index(op.f('ix_identity_wallets_id'), 'wallets', ['id'], unique=False, schema='identity') + op.create_table('assets', + sa.Column('id', sa.UUID(), nullable=False), + sa.Column('vin', sa.String(length=17), nullable=False), + sa.Column('license_plate', sa.String(length=20), nullable=True), + sa.Column('name', sa.String(), nullable=True), + sa.Column('year_of_manufacture', sa.Integer(), nullable=True), + sa.Column('current_organization_id', sa.Integer(), nullable=True), + sa.Column('catalog_id', sa.Integer(), nullable=True), + sa.Column('is_verified', sa.Boolean(), nullable=False), + sa.Column('verification_method', sa.String(length=20), nullable=True), + sa.Column('verification_notes', sa.Text(), nullable=True), + sa.Column('catalog_match_score', sa.Numeric(precision=5, scale=2), nullable=True), + sa.Column('status', sa.String(length=20), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.Column('updated_at', sa.DateTime(timezone=True), nullable=True), + sa.Column('registration_uuid', sa.UUID(), nullable=False), + sa.Column('is_corporate', sa.Boolean(), server_default=sa.text('false'), nullable=False), + sa.Column('owner_person_id', sa.BigInteger(), nullable=True), + sa.Column('owner_org_id', sa.Integer(), nullable=True), + sa.Column('operator_person_id', sa.BigInteger(), nullable=True), + sa.Column('operator_org_id', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['catalog_id'], ['data.vehicle_catalog.id'], ), + sa.ForeignKeyConstraint(['current_organization_id'], ['data.organizations.id'], ), + sa.ForeignKeyConstraint(['operator_org_id'], ['data.organizations.id'], ), + sa.ForeignKeyConstraint(['operator_person_id'], ['identity.persons.id'], ), + sa.ForeignKeyConstraint(['owner_org_id'], ['data.organizations.id'], ), + sa.ForeignKeyConstraint(['owner_person_id'], ['identity.persons.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index(op.f('ix_data_assets_license_plate'), 'assets', ['license_plate'], unique=False, schema='data') + op.create_index(op.f('ix_data_assets_registration_uuid'), 'assets', ['registration_uuid'], unique=False, schema='data') + op.create_index(op.f('ix_data_assets_vin'), 'assets', ['vin'], unique=True, schema='data') + op.create_table('branches', + sa.Column('id', sa.UUID(), nullable=False), + sa.Column('organization_id', sa.Integer(), nullable=False), + sa.Column('address_id', sa.UUID(), nullable=True), + sa.Column('name', sa.String(length=100), nullable=False), + sa.Column('is_main', sa.Boolean(), nullable=False), + sa.Column('postal_code', sa.String(length=10), nullable=True), + sa.Column('city', sa.String(length=100), nullable=True), + sa.Column('street_name', sa.String(length=150), nullable=True), + sa.Column('street_type', sa.String(length=50), nullable=True), + sa.Column('house_number', sa.String(length=20), nullable=True), + sa.Column('stairwell', sa.String(length=20), nullable=True), + sa.Column('floor', sa.String(length=20), nullable=True), + sa.Column('door', sa.String(length=20), nullable=True), + sa.Column('hrsz', sa.String(length=50), nullable=True), + sa.Column('opening_hours', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False), + sa.Column('branch_rating', sa.Float(), nullable=False), + sa.Column('status', sa.String(length=30), nullable=False), + sa.Column('is_deleted', sa.Boolean(), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.ForeignKeyConstraint(['address_id'], ['data.addresses.id'], ), + sa.ForeignKeyConstraint(['organization_id'], ['data.organizations.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index(op.f('ix_data_branches_city'), 'branches', ['city'], unique=False, schema='data') + op.create_index(op.f('ix_data_branches_postal_code'), 'branches', ['postal_code'], unique=False, schema='data') + op.create_table('credit_logs', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('org_id', sa.Integer(), nullable=False), + sa.Column('amount', sa.Numeric(precision=10, scale=2), nullable=False), + sa.Column('description', sa.String(), nullable=True), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.ForeignKeyConstraint(['org_id'], ['data.organizations.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_table('org_sales_assignments', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('organization_id', sa.Integer(), nullable=True), + sa.Column('agent_user_id', sa.Integer(), nullable=True), + sa.Column('assigned_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.Column('is_active', sa.Boolean(), nullable=False), + sa.ForeignKeyConstraint(['agent_user_id'], ['identity.users.id'], ), + sa.ForeignKeyConstraint(['organization_id'], ['data.organizations.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_table('org_subscriptions', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('org_id', sa.Integer(), nullable=False), + sa.Column('tier_id', sa.Integer(), nullable=False), + sa.Column('valid_from', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.Column('valid_until', sa.DateTime(timezone=True), nullable=True), + sa.Column('is_active', sa.Boolean(), nullable=False), + sa.ForeignKeyConstraint(['org_id'], ['data.organizations.id'], ), + sa.ForeignKeyConstraint(['tier_id'], ['data.subscription_tiers.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_table('organization_financials', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('organization_id', sa.Integer(), nullable=False), + sa.Column('year', sa.Integer(), nullable=False), + sa.Column('turnover', sa.Numeric(precision=18, scale=2), nullable=True), + sa.Column('profit', sa.Numeric(precision=18, scale=2), nullable=True), + sa.Column('employee_count', sa.Integer(), nullable=True), + sa.Column('source', sa.String(length=50), nullable=True), + sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.ForeignKeyConstraint(['organization_id'], ['data.organizations.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index(op.f('ix_data_organization_financials_id'), 'organization_financials', ['id'], unique=False, schema='data') + op.create_table('organization_members', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('organization_id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=True), + sa.Column('person_id', sa.BigInteger(), nullable=True), + sa.Column('role', postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole', schema='data'), nullable=False), + sa.Column('permissions', sa.JSON(), server_default=sa.text("'{}'::jsonb"), nullable=False), + sa.Column('is_permanent', sa.Boolean(), nullable=False), + sa.Column('is_verified', sa.Boolean(), nullable=False), + sa.ForeignKeyConstraint(['organization_id'], ['data.organizations.id'], ), + sa.ForeignKeyConstraint(['person_id'], ['identity.persons.id'], ), + sa.ForeignKeyConstraint(['user_id'], ['identity.users.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index(op.f('ix_data_organization_members_id'), 'organization_members', ['id'], unique=False, schema='data') + op.create_table('service_profiles', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('organization_id', sa.Integer(), nullable=True), + sa.Column('parent_id', sa.Integer(), nullable=True), + sa.Column('fingerprint', sa.String(length=255), nullable=False), + sa.Column('location', geoalchemy2.types.Geometry(geometry_type='POINT', srid=4326, dimension=2, from_text='ST_GeomFromEWKT', name='geometry', nullable=False), nullable=False), + sa.Column('status', sa.String(length=20), server_default=sa.text("'ghost'"), nullable=False), + sa.Column('last_audit_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.Column('google_place_id', sa.String(length=100), nullable=True), + sa.Column('rating', sa.Float(), nullable=True), + sa.Column('user_ratings_total', sa.Integer(), nullable=True), + sa.Column('vibe_analysis', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False), + sa.Column('social_links', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False), + sa.Column('specialization_tags', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False), + sa.Column('trust_score', sa.Integer(), nullable=False), + sa.Column('is_verified', sa.Boolean(), nullable=False), + sa.Column('verification_log', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False), + sa.Column('opening_hours', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False), + sa.Column('contact_phone', sa.String(), nullable=True), + sa.Column('contact_email', sa.String(), nullable=True), + sa.Column('website', sa.String(), nullable=True), + sa.Column('bio', sa.Text(), nullable=True), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.Column('updated_at', sa.DateTime(timezone=True), nullable=True), + sa.ForeignKeyConstraint(['organization_id'], ['data.organizations.id'], ), + sa.ForeignKeyConstraint(['parent_id'], ['data.service_profiles.id'], ), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('google_place_id'), + sa.UniqueConstraint('organization_id'), + schema='data' + ) + op.create_index('idx_service_fingerprint', 'service_profiles', ['fingerprint'], unique=True, schema='data') + # op.create_index('idx_service_profiles_location', 'service_profiles', ['location'], unique=False, schema='data', postgresql_using='gist') + op.create_index(op.f('ix_data_service_profiles_fingerprint'), 'service_profiles', ['fingerprint'], unique=False, schema='data') + op.create_index(op.f('ix_data_service_profiles_id'), 'service_profiles', ['id'], unique=False, schema='data') + op.create_index(op.f('ix_data_service_profiles_location'), 'service_profiles', ['location'], unique=False, schema='data') + op.create_index(op.f('ix_data_service_profiles_status'), 'service_profiles', ['status'], unique=False, schema='data') + op.create_table('asset_assignments', + sa.Column('id', sa.UUID(), nullable=False), + sa.Column('asset_id', sa.UUID(), nullable=False), + sa.Column('organization_id', sa.Integer(), nullable=False), + sa.Column('branch_id', sa.UUID(), nullable=True), + sa.Column('assigned_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.Column('released_at', sa.DateTime(timezone=True), nullable=True), + sa.Column('status', sa.String(length=30), nullable=False), + sa.ForeignKeyConstraint(['asset_id'], ['data.assets.id'], ), + sa.ForeignKeyConstraint(['branch_id'], ['data.branches.id'], ), + sa.ForeignKeyConstraint(['organization_id'], ['data.organizations.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_table('asset_costs', + sa.Column('id', sa.UUID(), nullable=False), + sa.Column('asset_id', sa.UUID(), nullable=False), + sa.Column('organization_id', sa.Integer(), nullable=False), + sa.Column('driver_id', sa.Integer(), nullable=True), + sa.Column('cost_type', sa.String(length=50), nullable=False), + sa.Column('amount_local', sa.Numeric(precision=18, scale=2), nullable=False), + sa.Column('currency_local', sa.String(length=3), nullable=False), + sa.Column('amount_eur', sa.Numeric(precision=18, scale=2), nullable=True), + sa.Column('net_amount_local', sa.Numeric(precision=18, scale=2), nullable=True), + sa.Column('vat_rate', sa.Numeric(precision=5, scale=2), nullable=True), + sa.Column('exchange_rate_used', sa.Numeric(precision=18, scale=6), nullable=True), + sa.Column('date', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.Column('mileage_at_cost', sa.Integer(), nullable=True), + sa.Column('data', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False), + sa.Column('registration_uuid', sa.UUID(), nullable=True), + sa.ForeignKeyConstraint(['asset_id'], ['data.assets.id'], ), + sa.ForeignKeyConstraint(['driver_id'], ['identity.users.id'], ), + sa.ForeignKeyConstraint(['organization_id'], ['data.organizations.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index(op.f('ix_data_asset_costs_registration_uuid'), 'asset_costs', ['registration_uuid'], unique=False, schema='data') + op.create_table('asset_events', + sa.Column('id', sa.UUID(), nullable=False), + sa.Column('asset_id', sa.UUID(), nullable=False), + sa.Column('event_type', sa.String(length=50), nullable=False), + sa.Column('recorded_mileage', sa.Integer(), nullable=True), + sa.Column('data', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False), + sa.Column('registration_uuid', sa.UUID(), nullable=True), + sa.ForeignKeyConstraint(['asset_id'], ['data.assets.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index(op.f('ix_data_asset_events_registration_uuid'), 'asset_events', ['registration_uuid'], unique=False, schema='data') + op.create_table('asset_financials', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('asset_id', sa.UUID(), nullable=False), + sa.Column('acquisition_price', sa.Numeric(precision=18, scale=2), nullable=True), + sa.Column('acquisition_date', sa.DateTime(), nullable=True), + sa.Column('financing_type', sa.String(), nullable=True), + sa.Column('residual_value_estimate', sa.Numeric(precision=18, scale=2), nullable=True), + sa.ForeignKeyConstraint(['asset_id'], ['data.assets.id'], ), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('asset_id'), + schema='data' + ) + op.create_table('asset_reviews', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('asset_id', sa.UUID(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('overall_rating', sa.Integer(), nullable=True), + sa.Column('criteria_scores', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False), + sa.Column('comment', sa.Text(), nullable=True), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.ForeignKeyConstraint(['asset_id'], ['data.assets.id'], ), + sa.ForeignKeyConstraint(['user_id'], ['identity.users.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_table('asset_telemetry', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('asset_id', sa.UUID(), nullable=False), + sa.Column('current_mileage', sa.Integer(), nullable=False), + sa.Column('mileage_unit', sa.String(length=10), nullable=False), + sa.Column('vqi_score', sa.Numeric(precision=5, scale=2), nullable=False), + sa.Column('dbs_score', sa.Numeric(precision=5, scale=2), nullable=False), + sa.ForeignKeyConstraint(['asset_id'], ['data.assets.id'], ), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('asset_id'), + schema='data' + ) + op.create_table('ratings', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('author_id', sa.Integer(), nullable=False), + sa.Column('target_organization_id', sa.Integer(), nullable=True), + sa.Column('target_user_id', sa.Integer(), nullable=True), + sa.Column('target_branch_id', sa.UUID(), nullable=True), + sa.Column('score', sa.Numeric(precision=3, scale=2), nullable=False), + sa.Column('comment', sa.Text(), nullable=True), + sa.Column('images', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'[]'::jsonb"), nullable=False), + sa.Column('is_verified', sa.Boolean(), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.ForeignKeyConstraint(['author_id'], ['identity.users.id'], ), + sa.ForeignKeyConstraint(['target_branch_id'], ['data.branches.id'], ), + sa.ForeignKeyConstraint(['target_organization_id'], ['data.organizations.id'], ), + sa.ForeignKeyConstraint(['target_user_id'], ['identity.users.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index('idx_rating_branch', 'ratings', ['target_branch_id'], unique=False, schema='data') + op.create_index('idx_rating_org', 'ratings', ['target_organization_id'], unique=False, schema='data') + op.create_index('idx_rating_user', 'ratings', ['target_user_id'], unique=False, schema='data') + op.create_table('service_expertises', + sa.Column('service_id', sa.Integer(), nullable=False), + sa.Column('expertise_id', sa.Integer(), nullable=False), + sa.Column('validation_level', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['expertise_id'], ['data.expertise_tags.id'], ), + sa.ForeignKeyConstraint(['service_id'], ['data.service_profiles.id'], ), + sa.PrimaryKeyConstraint('service_id', 'expertise_id'), + schema='data' + ) + op.create_table('vehicle_ownerships', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('vehicle_id', sa.UUID(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('start_date', sa.Date(), server_default=sa.text('CURRENT_DATE'), nullable=False), + sa.Column('end_date', sa.Date(), nullable=True), + sa.Column('notes', sa.Text(), nullable=True), + sa.ForeignKeyConstraint(['user_id'], ['identity.users.id'], ), + sa.ForeignKeyConstraint(['vehicle_id'], ['data.assets.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index(op.f('ix_data_vehicle_ownerships_id'), 'vehicle_ownerships', ['id'], unique=False, schema='data') + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_index(op.f('ix_data_vehicle_ownerships_id'), table_name='vehicle_ownerships', schema='data') + op.drop_table('vehicle_ownerships', schema='data') + op.drop_table('service_expertises', schema='data') + op.drop_index('idx_rating_user', table_name='ratings', schema='data') + op.drop_index('idx_rating_org', table_name='ratings', schema='data') + op.drop_index('idx_rating_branch', table_name='ratings', schema='data') + op.drop_table('ratings', schema='data') + op.drop_table('asset_telemetry', schema='data') + op.drop_table('asset_reviews', schema='data') + op.drop_table('asset_financials', schema='data') + op.drop_index(op.f('ix_data_asset_events_registration_uuid'), table_name='asset_events', schema='data') + op.drop_table('asset_events', schema='data') + op.drop_index(op.f('ix_data_asset_costs_registration_uuid'), table_name='asset_costs', schema='data') + op.drop_table('asset_costs', schema='data') + op.drop_table('asset_assignments', schema='data') + op.drop_index(op.f('ix_data_service_profiles_status'), table_name='service_profiles', schema='data') + op.drop_index(op.f('ix_data_service_profiles_location'), table_name='service_profiles', schema='data') + op.drop_index(op.f('ix_data_service_profiles_id'), table_name='service_profiles', schema='data') + op.drop_index(op.f('ix_data_service_profiles_fingerprint'), table_name='service_profiles', schema='data') + op.drop_index('idx_service_profiles_location', table_name='service_profiles', schema='data', postgresql_using='gist') + op.drop_index('idx_service_fingerprint', table_name='service_profiles', schema='data') + op.drop_table('service_profiles', schema='data') + op.drop_index(op.f('ix_data_organization_members_id'), table_name='organization_members', schema='data') + op.drop_table('organization_members', schema='data') + op.drop_index(op.f('ix_data_organization_financials_id'), table_name='organization_financials', schema='data') + op.drop_table('organization_financials', schema='data') + op.drop_table('org_subscriptions', schema='data') + op.drop_table('org_sales_assignments', schema='data') + op.drop_table('credit_logs', schema='data') + op.drop_index(op.f('ix_data_branches_postal_code'), table_name='branches', schema='data') + op.drop_index(op.f('ix_data_branches_city'), table_name='branches', schema='data') + op.drop_table('branches', schema='data') + op.drop_index(op.f('ix_data_assets_vin'), table_name='assets', schema='data') + op.drop_index(op.f('ix_data_assets_registration_uuid'), table_name='assets', schema='data') + op.drop_index(op.f('ix_data_assets_license_plate'), table_name='assets', schema='data') + op.drop_table('assets', schema='data') + op.drop_index(op.f('ix_identity_wallets_id'), table_name='wallets', schema='identity') + op.drop_table('wallets', schema='identity') + op.drop_index(op.f('ix_identity_verification_tokens_id'), table_name='verification_tokens', schema='identity') + op.drop_table('verification_tokens', schema='identity') + op.drop_index(op.f('ix_identity_social_accounts_social_id'), table_name='social_accounts', schema='identity') + op.drop_index(op.f('ix_identity_social_accounts_id'), table_name='social_accounts', schema='identity') + op.drop_table('social_accounts', schema='identity') + op.drop_table('user_stats', schema='data') + op.drop_index(op.f('ix_data_user_badges_id'), table_name='user_badges', schema='data') + op.drop_table('user_badges', schema='data') + op.drop_index(op.f('ix_data_points_ledger_id'), table_name='points_ledger', schema='data') + op.drop_table('points_ledger', schema='data') + op.drop_index(op.f('ix_data_organizations_tax_number'), table_name='organizations', schema='data') + op.drop_index(op.f('ix_data_organizations_subscription_plan'), table_name='organizations', schema='data') + op.drop_index(op.f('ix_data_organizations_id'), table_name='organizations', schema='data') + op.drop_index(op.f('ix_data_organizations_folder_slug'), table_name='organizations', schema='data') + op.drop_table('organizations', schema='data') + op.drop_index(op.f('ix_data_audit_logs_timestamp'), table_name='audit_logs', schema='data') + op.drop_index(op.f('ix_data_audit_logs_target_type'), table_name='audit_logs', schema='data') + op.drop_index(op.f('ix_data_audit_logs_target_id'), table_name='audit_logs', schema='data') + op.drop_index(op.f('ix_data_audit_logs_ip_address'), table_name='audit_logs', schema='data') + op.drop_index(op.f('ix_data_audit_logs_id'), table_name='audit_logs', schema='data') + op.drop_index(op.f('ix_data_audit_logs_action'), table_name='audit_logs', schema='data') + op.drop_table('audit_logs', schema='data') + op.drop_index(op.f('ix_identity_users_id'), table_name='users', schema='identity') + op.drop_index(op.f('ix_identity_users_folder_slug'), table_name='users', schema='identity') + op.drop_index(op.f('ix_identity_users_email'), table_name='users', schema='identity') + op.drop_table('users', schema='identity') + op.drop_index(op.f('ix_identity_persons_identity_hash'), table_name='persons', schema='identity') + op.drop_index(op.f('ix_identity_persons_id'), table_name='persons', schema='identity') + op.drop_table('persons', schema='identity') + op.drop_index(op.f('ix_data_vehicle_catalog_power_kw'), table_name='vehicle_catalog', schema='data') + op.drop_index(op.f('ix_data_vehicle_catalog_model'), table_name='vehicle_catalog', schema='data') + op.drop_index(op.f('ix_data_vehicle_catalog_make'), table_name='vehicle_catalog', schema='data') + op.drop_index(op.f('ix_data_vehicle_catalog_id'), table_name='vehicle_catalog', schema='data') + op.drop_index(op.f('ix_data_vehicle_catalog_generation'), table_name='vehicle_catalog', schema='data') + op.drop_index(op.f('ix_data_vehicle_catalog_fuel_type'), table_name='vehicle_catalog', schema='data') + op.drop_index(op.f('ix_data_vehicle_catalog_engine_variant'), table_name='vehicle_catalog', schema='data') + op.drop_index(op.f('ix_data_vehicle_catalog_engine_capacity'), table_name='vehicle_catalog', schema='data') + op.drop_table('vehicle_catalog', schema='data') + op.drop_table('model_feature_maps', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_year_to'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_year_from'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_technical_code'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_status'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_marketing_name'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_make'), table_name='vehicle_model_definitions', schema='data') + op.drop_index('idx_vmd_lookup', table_name='vehicle_model_definitions', schema='data') + op.drop_table('vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_geo_streets_name'), table_name='geo_streets', schema='data') + op.drop_table('geo_streets', schema='data') + op.drop_index(op.f('ix_data_feature_definitions_code'), table_name='feature_definitions', schema='data') + op.drop_index(op.f('ix_data_feature_definitions_category'), table_name='feature_definitions', schema='data') + op.drop_table('feature_definitions', schema='data') + op.drop_table('addresses', schema='data') + op.drop_index(op.f('ix_data_vehicle_types_code'), table_name='vehicle_types', schema='data') + op.drop_table('vehicle_types', schema='data') + op.drop_index(op.f('ix_data_translations_lang'), table_name='translations', schema='data') + op.drop_index(op.f('ix_data_translations_key'), table_name='translations', schema='data') + op.drop_index(op.f('ix_data_translations_id'), table_name='translations', schema='data') + op.drop_table('translations', schema='data') + op.drop_index(op.f('ix_data_subscription_tiers_name'), table_name='subscription_tiers', schema='data') + op.drop_table('subscription_tiers', schema='data') + op.drop_index(op.f('ix_data_service_staging_status'), table_name='service_staging', schema='data') + op.drop_index(op.f('ix_data_service_staging_postal_code'), table_name='service_staging', schema='data') + op.drop_index(op.f('ix_data_service_staging_name'), table_name='service_staging', schema='data') + op.drop_index(op.f('ix_data_service_staging_id'), table_name='service_staging', schema='data') + op.drop_index(op.f('ix_data_service_staging_city'), table_name='service_staging', schema='data') + op.drop_index('idx_staging_fingerprint', table_name='service_staging', schema='data') + op.drop_table('service_staging', schema='data') + op.drop_index(op.f('ix_data_service_specialties_slug'), table_name='service_specialties', schema='data') + op.drop_table('service_specialties', schema='data') + op.drop_index(op.f('ix_data_point_rules_id'), table_name='point_rules', schema='data') + op.drop_index(op.f('ix_data_point_rules_action_key'), table_name='point_rules', schema='data') + op.drop_table('point_rules', schema='data') + op.drop_index(op.f('ix_data_level_configs_id'), table_name='level_configs', schema='data') + op.drop_table('level_configs', schema='data') + op.drop_table('geo_street_types', schema='data') + op.drop_index(op.f('ix_data_geo_postal_codes_zip_code'), table_name='geo_postal_codes', schema='data') + op.drop_index(op.f('ix_data_geo_postal_codes_city'), table_name='geo_postal_codes', schema='data') + op.drop_table('geo_postal_codes', schema='data') + op.drop_index(op.f('ix_data_expertise_tags_key'), table_name='expertise_tags', schema='data') + op.drop_table('expertise_tags', schema='data') + op.drop_table('exchange_rates', schema='data') + op.drop_table('discovery_parameters', schema='data') + op.drop_index(op.f('ix_data_catalog_discovery_vehicle_class'), table_name='catalog_discovery', schema='data') + op.drop_index(op.f('ix_data_catalog_discovery_status'), table_name='catalog_discovery', schema='data') + op.drop_index(op.f('ix_data_catalog_discovery_model'), table_name='catalog_discovery', schema='data') + op.drop_index(op.f('ix_data_catalog_discovery_make'), table_name='catalog_discovery', schema='data') + op.drop_index(op.f('ix_data_catalog_discovery_id'), table_name='catalog_discovery', schema='data') + op.drop_table('catalog_discovery', schema='data') + op.drop_index(op.f('ix_data_badges_id'), table_name='badges', schema='data') + op.drop_table('badges', schema='data') + # ### end Alembic commands ### diff --git a/backend/migrations/versions/7e5a1b721dfb_upgrade_robot_v1_1_0_final.py b/backend/migrations/versions/7e5a1b721dfb_upgrade_robot_v1_1_0_final.py new file mode 100755 index 0000000..ef79319 --- /dev/null +++ b/backend/migrations/versions/7e5a1b721dfb_upgrade_robot_v1_1_0_final.py @@ -0,0 +1,586 @@ +"""Upgrade_Robot_v1_1_0_Final + +Revision ID: 7e5a1b721dfb +Revises: 4d69a44da00a +Create Date: 2026-02-25 20:23:16.666560 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql +# --- JAVÍTÁS 1: Inspector importálása a táblák ellenőrzéséhez --- +from sqlalchemy.engine.reflection import Inspector + +# revision identifiers, used by Alembic. +revision: str = '7e5a1b721dfb' +down_revision: Union[str, Sequence[str], None] = '4d69a44da00a' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # --- JAVÍTÁS 2: Adatbázis állapot lekérése --- + conn = op.get_bind() + inspector = Inspector.from_engine(conn) + existing_tables = inspector.get_table_names(schema='data') + + # ### commands auto generated by Alembic - please adjust! ### + + # --- JAVÍTÁS 3: Tábla létrehozások "if" feltételbe csomagolása --- + if 'asset_inspections' not in existing_tables: + op.create_table('asset_inspections', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('asset_id', sa.UUID(), nullable=False), + sa.Column('inspector_id', sa.Integer(), nullable=False), + sa.Column('timestamp', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.Column('checklist_results', postgresql.JSONB(astext_type=sa.Text()), nullable=False), + sa.Column('is_safe', sa.Boolean(), nullable=False), + sa.ForeignKeyConstraint(['asset_id'], ['data.assets.id'], ), + sa.ForeignKeyConstraint(['inspector_id'], ['identity.users.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + + if 'vehicle_logbook' not in existing_tables: + op.create_table('vehicle_logbook', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('asset_id', sa.UUID(), nullable=False), + sa.Column('driver_id', sa.Integer(), nullable=False), + sa.Column('trip_type', sa.String(length=30), nullable=False), + sa.Column('is_reimbursable', sa.Boolean(), nullable=False), + sa.Column('start_mileage', sa.Integer(), nullable=False), + sa.Column('end_mileage', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['asset_id'], ['data.assets.id'], ), + sa.ForeignKeyConstraint(['driver_id'], ['identity.users.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index(op.f('ix_data_vehicle_logbook_trip_type'), 'vehicle_logbook', ['trip_type'], unique=False, schema='data') + + if 'vehicle_ownership_history' not in existing_tables: + op.create_table('vehicle_ownership_history', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('asset_id', sa.UUID(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('acquired_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.Column('disposed_at', sa.DateTime(timezone=True), nullable=True), + sa.ForeignKeyConstraint(['asset_id'], ['data.assets.id'], ), + sa.ForeignKeyConstraint(['user_id'], ['identity.users.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + # --- JAVÍTÁS VÉGE (A többi rész érintetlenül hagyva) --- + + op.drop_constraint(op.f('addresses_postal_code_id_fkey'), 'addresses', type_='foreignkey') + op.create_foreign_key(None, 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_branch_id_fkey'), 'asset_assignments', type_='foreignkey') + op.create_foreign_key(None, 'asset_assignments', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('asset_assignments', 'assigned_at') + op.drop_column('asset_assignments', 'released_at') + op.drop_column('asset_assignments', 'branch_id') + op.add_column('asset_costs', sa.Column('cost_category', sa.String(length=50), nullable=False)) + op.add_column('asset_costs', sa.Column('amount_net', sa.Numeric(precision=18, scale=2), nullable=False)) + op.add_column('asset_costs', sa.Column('currency', sa.String(length=3), nullable=False)) + op.add_column('asset_costs', sa.Column('invoice_number', sa.String(length=100), nullable=True)) + op.drop_index(op.f('ix_data_asset_costs_registration_uuid'), table_name='asset_costs') + op.create_index(op.f('ix_data_asset_costs_cost_category'), 'asset_costs', ['cost_category'], unique=False, schema='data') + op.create_index(op.f('ix_data_asset_costs_invoice_number'), 'asset_costs', ['invoice_number'], unique=False, schema='data') + op.drop_constraint(op.f('asset_costs_driver_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_asset_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_organization_id_fkey'), 'asset_costs', type_='foreignkey') + op.create_foreign_key(None, 'asset_costs', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('asset_costs', 'cost_type') + op.drop_column('asset_costs', 'driver_id') + op.drop_column('asset_costs', 'registration_uuid') + op.drop_column('asset_costs', 'net_amount_local') + op.drop_column('asset_costs', 'amount_local') + op.drop_column('asset_costs', 'currency_local') + op.drop_column('asset_costs', 'exchange_rate_used') + op.drop_column('asset_costs', 'vat_rate') + op.drop_column('asset_costs', 'mileage_at_cost') + op.drop_column('asset_costs', 'amount_eur') + op.drop_index(op.f('ix_data_asset_events_registration_uuid'), table_name='asset_events') + op.drop_constraint(op.f('asset_events_asset_id_fkey'), 'asset_events', type_='foreignkey') + op.create_foreign_key(None, 'asset_events', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('asset_events', 'data') + op.drop_column('asset_events', 'recorded_mileage') + op.drop_column('asset_events', 'registration_uuid') + op.add_column('asset_financials', sa.Column('purchase_price_net', sa.Numeric(precision=18, scale=2), nullable=False)) + op.add_column('asset_financials', sa.Column('purchase_price_gross', sa.Numeric(precision=18, scale=2), nullable=False)) + op.add_column('asset_financials', sa.Column('vat_rate', sa.Numeric(precision=5, scale=2), nullable=False)) + op.add_column('asset_financials', sa.Column('activation_date', sa.DateTime(), nullable=True)) + op.add_column('asset_financials', sa.Column('accounting_details', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False)) + op.alter_column('asset_financials', 'financing_type', + existing_type=sa.VARCHAR(), + nullable=False) + op.drop_constraint(op.f('asset_financials_asset_id_fkey'), 'asset_financials', type_='foreignkey') + op.create_foreign_key(None, 'asset_financials', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('asset_financials', 'acquisition_price') + op.drop_column('asset_financials', 'residual_value_estimate') + op.drop_column('asset_financials', 'acquisition_date') + op.drop_constraint(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', type_='foreignkey') + op.drop_constraint(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', type_='foreignkey') + op.create_foreign_key(None, 'asset_reviews', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'asset_reviews', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('asset_reviews', 'criteria_scores') + op.drop_constraint(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', type_='foreignkey') + op.create_foreign_key(None, 'asset_telemetry', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('asset_telemetry', 'vqi_score') + op.drop_column('asset_telemetry', 'dbs_score') + op.drop_column('asset_telemetry', 'mileage_unit') + op.add_column('assets', sa.Column('first_registration_date', sa.DateTime(timezone=True), nullable=True)) + op.add_column('assets', sa.Column('current_mileage', sa.Integer(), nullable=False)) + op.add_column('assets', sa.Column('condition_score', sa.Integer(), nullable=False)) + op.add_column('assets', sa.Column('is_for_sale', sa.Boolean(), nullable=False)) + op.add_column('assets', sa.Column('price', sa.Numeric(precision=15, scale=2), nullable=True)) + op.add_column('assets', sa.Column('currency', sa.String(length=3), nullable=False)) + op.add_column('assets', sa.Column('individual_equipment', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=False)) + op.drop_index(op.f('ix_data_assets_registration_uuid'), table_name='assets') + op.create_index(op.f('ix_data_assets_current_mileage'), 'assets', ['current_mileage'], unique=False, schema='data') + op.create_index(op.f('ix_data_assets_is_for_sale'), 'assets', ['is_for_sale'], unique=False, schema='data') + op.create_index(op.f('ix_data_assets_year_of_manufacture'), 'assets', ['year_of_manufacture'], unique=False, schema='data') + op.drop_constraint(op.f('assets_owner_org_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_catalog_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_current_organization_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_owner_person_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_operator_org_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_operator_person_id_fkey'), 'assets', type_='foreignkey') + op.create_foreign_key(None, 'assets', 'organizations', ['owner_org_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'assets', 'organizations', ['current_organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'assets', 'vehicle_catalog', ['catalog_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'assets', 'persons', ['operator_person_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'assets', 'persons', ['owner_person_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'assets', 'organizations', ['operator_org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('assets', 'is_verified') + op.drop_column('assets', 'registration_uuid') + op.drop_column('assets', 'verification_notes') + op.drop_column('assets', 'verification_method') + op.drop_column('assets', 'catalog_match_score') + op.drop_column('assets', 'is_corporate') + op.alter_column('audit_logs', 'severity', + existing_type=postgresql.ENUM('info', 'warning', 'critical', 'emergency', name='log_severity'), + type_=postgresql.ENUM('info', 'warning', 'critical', 'emergency', name='log_severity', schema='data'), + existing_nullable=False) + op.drop_constraint(op.f('audit_logs_user_id_fkey'), 'audit_logs', type_='foreignkey') + op.create_foreign_key(None, 'audit_logs', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.drop_constraint(op.f('branches_address_id_fkey'), 'branches', type_='foreignkey') + op.drop_constraint(op.f('branches_organization_id_fkey'), 'branches', type_='foreignkey') + op.create_foreign_key(None, 'branches', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'branches', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('_make_model_class_uc'), 'catalog_discovery', type_='unique') + op.drop_index(op.f('ix_data_catalog_discovery_vehicle_class'), table_name='catalog_discovery') + op.create_unique_constraint('_make_model_uc', 'catalog_discovery', ['make', 'model'], schema='data') + op.drop_column('catalog_discovery', 'last_attempt') + op.drop_column('catalog_discovery', 'vehicle_class') + op.drop_column('catalog_discovery', 'created_at') + op.drop_column('catalog_discovery', 'priority_score') + op.drop_column('catalog_discovery', 'source') + op.drop_column('catalog_discovery', 'attempts') + op.drop_constraint(op.f('credit_logs_org_id_fkey'), 'credit_logs', type_='foreignkey') + op.create_foreign_key(None, 'credit_logs', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('exchange_rates_target_currency_key'), 'exchange_rates', type_='unique') + op.drop_column('exchange_rates', 'target_currency') + op.drop_column('exchange_rates', 'base_currency') + op.drop_constraint(op.f('feature_definitions_vehicle_type_id_fkey'), 'feature_definitions', type_='foreignkey') + op.create_foreign_key(None, 'feature_definitions', 'vehicle_types', ['vehicle_type_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', type_='foreignkey') + op.create_foreign_key(None, 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('model_feature_maps_feature_id_fkey'), 'model_feature_maps', type_='foreignkey') + op.drop_constraint(op.f('model_feature_maps_model_definition_id_fkey'), 'model_feature_maps', type_='foreignkey') + op.create_foreign_key(None, 'model_feature_maps', 'feature_definitions', ['feature_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'model_feature_maps', 'vehicle_model_definitions', ['model_definition_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('org_sales_assignments_agent_user_id_fkey'), 'org_sales_assignments', type_='foreignkey') + op.drop_constraint(op.f('org_sales_assignments_organization_id_fkey'), 'org_sales_assignments', type_='foreignkey') + op.create_foreign_key(None, 'org_sales_assignments', 'users', ['agent_user_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'org_sales_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.drop_constraint(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.create_foreign_key(None, 'org_subscriptions', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('organization_financials_organization_id_fkey'), 'organization_financials', type_='foreignkey') + op.create_foreign_key(None, 'organization_financials', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('organization_members', 'role', + existing_type=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole'), + type_=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole', schema='data'), + existing_nullable=False) + op.drop_constraint(op.f('organization_members_person_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_user_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_organization_id_fkey'), 'organization_members', type_='foreignkey') + op.create_foreign_key(None, 'organization_members', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'organization_members', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organization_members', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='identity') + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data'), + existing_nullable=False) + op.drop_constraint(op.f('organizations_owner_id_fkey'), 'organizations', type_='foreignkey') + op.drop_constraint(op.f('organizations_address_id_fkey'), 'organizations', type_='foreignkey') + op.create_foreign_key(None, 'organizations', 'users', ['owner_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'organizations', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('points_ledger_user_id_fkey'), 'points_ledger', type_='foreignkey') + op.create_foreign_key(None, 'points_ledger', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.drop_constraint(op.f('ratings_target_user_id_fkey'), 'ratings', type_='foreignkey') + op.drop_constraint(op.f('ratings_target_organization_id_fkey'), 'ratings', type_='foreignkey') + op.drop_constraint(op.f('ratings_author_id_fkey'), 'ratings', type_='foreignkey') + op.drop_constraint(op.f('ratings_target_branch_id_fkey'), 'ratings', type_='foreignkey') + op.create_foreign_key(None, 'ratings', 'users', ['target_user_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'ratings', 'organizations', ['target_organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'ratings', 'users', ['author_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'ratings', 'branches', ['target_branch_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_expertises_expertise_id_fkey'), 'service_expertises', type_='foreignkey') + op.drop_constraint(op.f('service_expertises_service_id_fkey'), 'service_expertises', type_='foreignkey') + op.create_foreign_key(None, 'service_expertises', 'expertise_tags', ['expertise_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'service_expertises', 'service_profiles', ['service_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_index(op.f('idx_service_profiles_location'), table_name='service_profiles', postgresql_using='gist') + op.drop_constraint(op.f('service_profiles_organization_id_fkey'), 'service_profiles', type_='foreignkey') + op.drop_constraint(op.f('service_profiles_parent_id_fkey'), 'service_profiles', type_='foreignkey') + op.create_foreign_key(None, 'service_profiles', 'service_profiles', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'service_profiles', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_specialties_parent_id_fkey'), 'service_specialties', type_='foreignkey') + op.create_foreign_key(None, 'service_specialties', 'service_specialties', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_badges_badge_id_fkey'), 'user_badges', type_='foreignkey') + op.drop_constraint(op.f('user_badges_user_id_fkey'), 'user_badges', type_='foreignkey') + op.create_foreign_key(None, 'user_badges', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'user_badges', 'badges', ['badge_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_stats_user_id_fkey'), 'user_stats', type_='foreignkey') + op.create_foreign_key(None, 'user_stats', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.drop_index(op.f('ix_data_vehicle_catalog_engine_variant'), table_name='vehicle_catalog') + op.drop_constraint(op.f('uix_vehicle_catalog_full'), 'vehicle_catalog', type_='unique') + op.create_unique_constraint('uix_vehicle_catalog_full', 'vehicle_catalog', ['make', 'model', 'year_from', 'fuel_type'], schema='data') + op.drop_constraint(op.f('vehicle_catalog_master_definition_id_fkey'), 'vehicle_catalog', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_catalog', 'vehicle_model_definitions', ['master_definition_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('vehicle_catalog', 'vehicle_class') + op.drop_column('vehicle_catalog', 'axle_count') + op.drop_column('vehicle_catalog', 'engine_code') + op.drop_column('vehicle_catalog', 'euro_class') + op.drop_column('vehicle_catalog', 'body_type') + op.drop_column('vehicle_catalog', 'max_weight_kg') + op.drop_column('vehicle_catalog', 'engine_variant') + op.alter_column('vehicle_model_definitions', 'make', + existing_type=sa.VARCHAR(length=50), + type_=sa.String(length=100), + existing_nullable=False) + op.alter_column('vehicle_model_definitions', 'marketing_name', + existing_type=sa.VARCHAR(length=100), + type_=sa.String(length=255), + existing_nullable=False) + op.alter_column('vehicle_model_definitions', 'marketing_name_aliases', + existing_type=postgresql.JSONB(astext_type=sa.Text()), + nullable=False, + existing_server_default=sa.text("'[]'::jsonb")) + op.alter_column('vehicle_model_definitions', 'technical_code', + existing_type=sa.VARCHAR(length=50), + type_=sa.String(length=100), + existing_nullable=False) + op.alter_column('vehicle_model_definitions', 'body_type', + existing_type=sa.VARCHAR(length=50), + type_=sa.String(length=100), + existing_nullable=True) + op.alter_column('vehicle_model_definitions', 'engine_capacity', + existing_type=sa.INTEGER(), + nullable=False) + op.alter_column('vehicle_model_definitions', 'power_kw', + existing_type=sa.INTEGER(), + nullable=False) + op.alter_column('vehicle_model_definitions', 'status', + existing_type=sa.VARCHAR(length=30), + type_=sa.String(length=50), + existing_nullable=False, + existing_server_default=sa.text("'active'::character varying")) + op.alter_column('vehicle_model_definitions', 'source', + existing_type=sa.VARCHAR(length=50), + type_=sa.String(length=100), + existing_nullable=True) + op.drop_index(op.f('idx_vmd_engine_code'), table_name='vehicle_model_definitions') + op.drop_index(op.f('idx_vmd_lookup'), table_name='vehicle_model_definitions') + op.drop_index(op.f('idx_vmd_normalized_name'), table_name='vehicle_model_definitions') + op.drop_index(op.f('ix_vehicle_model_marketing_name'), table_name='vehicle_model_definitions') + op.drop_constraint(op.f('uix_make_tech_type'), 'vehicle_model_definitions', type_='unique') + op.create_index('idx_vmd_engine_bridge', 'vehicle_model_definitions', ['make', 'engine_code'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_engine_capacity'), 'vehicle_model_definitions', ['engine_capacity'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_engine_code'), 'vehicle_model_definitions', ['engine_code'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_fuel_type'), 'vehicle_model_definitions', ['fuel_type'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_normalized_name'), 'vehicle_model_definitions', ['normalized_name'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_power_kw'), 'vehicle_model_definitions', ['power_kw'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_variant_code'), 'vehicle_model_definitions', ['variant_code'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_vehicle_class'), 'vehicle_model_definitions', ['vehicle_class'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_model_definitions_version_code'), 'vehicle_model_definitions', ['version_code'], unique=False, schema='data') + op.drop_constraint(op.f('vehicle_model_definitions_vehicle_type_id_fkey'), 'vehicle_model_definitions', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_model_definitions', 'vehicle_types', ['vehicle_type_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('persons_address_id_fkey'), 'persons', schema='identity', type_='foreignkey') + op.create_foreign_key(None, 'persons', 'addresses', ['address_id'], ['id'], source_schema='identity', referent_schema='data') + + # --- JAVÍTÁS 4: Alchemist robot oszlopainak biztonságos hozzáadása --- + vmd_cols = [c['name'] for c in inspector.get_columns('vehicle_model_definitions', schema='data')] + if 'attempts' not in vmd_cols: + op.add_column('vehicle_model_definitions', sa.Column('attempts', sa.Integer(), server_default=sa.text('0'), nullable=False), schema='data') + if 'last_error' not in vmd_cols: + op.add_column('vehicle_model_definitions', sa.Column('last_error', sa.Text(), nullable=True), schema='data') + if 'updated_at' not in vmd_cols: + op.add_column('vehicle_model_definitions', sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), schema='data') + # --- JAVÍTÁS VÉGE --- + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'persons', schema='identity', type_='foreignkey') + op.create_foreign_key(op.f('persons_address_id_fkey'), 'persons', 'addresses', ['address_id'], ['id'], source_schema='identity') + op.drop_constraint(None, 'vehicle_model_definitions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_model_definitions_vehicle_type_id_fkey'), 'vehicle_model_definitions', 'vehicle_types', ['vehicle_type_id'], ['id']) + op.drop_index(op.f('ix_data_vehicle_model_definitions_version_code'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_vehicle_class'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_variant_code'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_power_kw'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_normalized_name'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_fuel_type'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_engine_code'), table_name='vehicle_model_definitions', schema='data') + op.drop_index(op.f('ix_data_vehicle_model_definitions_engine_capacity'), table_name='vehicle_model_definitions', schema='data') + op.drop_index('idx_vmd_engine_bridge', table_name='vehicle_model_definitions', schema='data') + op.create_unique_constraint(op.f('uix_make_tech_type'), 'vehicle_model_definitions', ['make', 'technical_code', 'vehicle_type_id'], postgresql_nulls_not_distinct=False) + op.create_index(op.f('ix_vehicle_model_marketing_name'), 'vehicle_model_definitions', ['marketing_name'], unique=False) + op.create_index(op.f('idx_vmd_normalized_name'), 'vehicle_model_definitions', ['normalized_name'], unique=False) + op.create_index(op.f('idx_vmd_lookup'), 'vehicle_model_definitions', ['make', 'technical_code'], unique=False) + op.create_index(op.f('idx_vmd_engine_code'), 'vehicle_model_definitions', ['engine_code'], unique=False) + op.alter_column('vehicle_model_definitions', 'source', + existing_type=sa.String(length=100), + type_=sa.VARCHAR(length=50), + existing_nullable=True) + op.alter_column('vehicle_model_definitions', 'status', + existing_type=sa.String(length=50), + type_=sa.VARCHAR(length=30), + existing_nullable=False, + existing_server_default=sa.text("'active'::character varying")) + op.alter_column('vehicle_model_definitions', 'power_kw', + existing_type=sa.INTEGER(), + nullable=True) + op.alter_column('vehicle_model_definitions', 'engine_capacity', + existing_type=sa.INTEGER(), + nullable=True) + op.alter_column('vehicle_model_definitions', 'body_type', + existing_type=sa.String(length=100), + type_=sa.VARCHAR(length=50), + existing_nullable=True) + op.alter_column('vehicle_model_definitions', 'technical_code', + existing_type=sa.String(length=100), + type_=sa.VARCHAR(length=50), + existing_nullable=False) + op.alter_column('vehicle_model_definitions', 'marketing_name_aliases', + existing_type=postgresql.JSONB(astext_type=sa.Text()), + nullable=True, + existing_server_default=sa.text("'[]'::jsonb")) + op.alter_column('vehicle_model_definitions', 'marketing_name', + existing_type=sa.String(length=255), + type_=sa.VARCHAR(length=100), + existing_nullable=False) + op.alter_column('vehicle_model_definitions', 'make', + existing_type=sa.String(length=100), + type_=sa.VARCHAR(length=50), + existing_nullable=False) + op.add_column('vehicle_catalog', sa.Column('engine_variant', sa.VARCHAR(), autoincrement=False, nullable=True)) + op.add_column('vehicle_catalog', sa.Column('max_weight_kg', sa.INTEGER(), autoincrement=False, nullable=True)) + op.add_column('vehicle_catalog', sa.Column('body_type', sa.VARCHAR(length=100), autoincrement=False, nullable=True)) + op.add_column('vehicle_catalog', sa.Column('euro_class', sa.VARCHAR(length=20), autoincrement=False, nullable=True)) + op.add_column('vehicle_catalog', sa.Column('engine_code', sa.VARCHAR(), autoincrement=False, nullable=True)) + op.add_column('vehicle_catalog', sa.Column('axle_count', sa.INTEGER(), autoincrement=False, nullable=True)) + op.add_column('vehicle_catalog', sa.Column('vehicle_class', sa.VARCHAR(), autoincrement=False, nullable=True)) + op.drop_constraint(None, 'vehicle_catalog', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_catalog_master_definition_id_fkey'), 'vehicle_catalog', 'vehicle_model_definitions', ['master_definition_id'], ['id']) + op.drop_constraint('uix_vehicle_catalog_full', 'vehicle_catalog', schema='data', type_='unique') + op.create_unique_constraint(op.f('uix_vehicle_catalog_full'), 'vehicle_catalog', ['make', 'model', 'year_from', 'engine_variant', 'fuel_type'], postgresql_nulls_not_distinct=False) + op.create_index(op.f('ix_data_vehicle_catalog_engine_variant'), 'vehicle_catalog', ['engine_variant'], unique=False) + op.drop_constraint(None, 'user_stats', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_stats_user_id_fkey'), 'user_stats', 'users', ['user_id'], ['id'], referent_schema='identity') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_badges_user_id_fkey'), 'user_badges', 'users', ['user_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('user_badges_badge_id_fkey'), 'user_badges', 'badges', ['badge_id'], ['id']) + op.drop_constraint(None, 'service_specialties', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_specialties_parent_id_fkey'), 'service_specialties', 'service_specialties', ['parent_id'], ['id']) + op.drop_constraint(None, 'service_profiles', schema='data', type_='foreignkey') + op.drop_constraint(None, 'service_profiles', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_profiles_parent_id_fkey'), 'service_profiles', 'service_profiles', ['parent_id'], ['id']) + op.create_foreign_key(op.f('service_profiles_organization_id_fkey'), 'service_profiles', 'organizations', ['organization_id'], ['id']) + op.create_index(op.f('idx_service_profiles_location'), 'service_profiles', ['location'], unique=False, postgresql_using='gist') + op.drop_constraint(None, 'service_expertises', schema='data', type_='foreignkey') + op.drop_constraint(None, 'service_expertises', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_expertises_service_id_fkey'), 'service_expertises', 'service_profiles', ['service_id'], ['id']) + op.create_foreign_key(op.f('service_expertises_expertise_id_fkey'), 'service_expertises', 'expertise_tags', ['expertise_id'], ['id']) + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('ratings_target_branch_id_fkey'), 'ratings', 'branches', ['target_branch_id'], ['id']) + op.create_foreign_key(op.f('ratings_author_id_fkey'), 'ratings', 'users', ['author_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('ratings_target_organization_id_fkey'), 'ratings', 'organizations', ['target_organization_id'], ['id']) + op.create_foreign_key(op.f('ratings_target_user_id_fkey'), 'ratings', 'users', ['target_user_id'], ['id'], referent_schema='identity') + op.drop_constraint(None, 'points_ledger', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('points_ledger_user_id_fkey'), 'points_ledger', 'users', ['user_id'], ['id'], referent_schema='identity') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organizations_address_id_fkey'), 'organizations', 'addresses', ['address_id'], ['id']) + op.create_foreign_key(op.f('organizations_owner_id_fkey'), 'organizations', 'users', ['owner_id'], ['id'], referent_schema='identity') + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + existing_nullable=False) + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_members_organization_id_fkey'), 'organization_members', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('organization_members_user_id_fkey'), 'organization_members', 'users', ['user_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('organization_members_person_id_fkey'), 'organization_members', 'persons', ['person_id'], ['id'], referent_schema='identity') + op.alter_column('organization_members', 'role', + existing_type=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole', schema='data'), + type_=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole'), + existing_nullable=False) + op.drop_constraint(None, 'organization_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_financials_organization_id_fkey'), 'organization_financials', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id']) + op.create_foreign_key(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'org_sales_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_sales_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_sales_assignments_organization_id_fkey'), 'org_sales_assignments', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('org_sales_assignments_agent_user_id_fkey'), 'org_sales_assignments', 'users', ['agent_user_id'], ['id'], referent_schema='identity') + op.drop_constraint(None, 'model_feature_maps', schema='data', type_='foreignkey') + op.drop_constraint(None, 'model_feature_maps', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('model_feature_maps_model_definition_id_fkey'), 'model_feature_maps', 'vehicle_model_definitions', ['model_definition_id'], ['id']) + op.create_foreign_key(op.f('model_feature_maps_feature_id_fkey'), 'model_feature_maps', 'feature_definitions', ['feature_id'], ['id']) + op.drop_constraint(None, 'geo_streets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_constraint(None, 'feature_definitions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('feature_definitions_vehicle_type_id_fkey'), 'feature_definitions', 'vehicle_types', ['vehicle_type_id'], ['id']) + op.add_column('exchange_rates', sa.Column('base_currency', sa.VARCHAR(length=3), autoincrement=False, nullable=False)) + op.add_column('exchange_rates', sa.Column('target_currency', sa.VARCHAR(length=3), autoincrement=False, nullable=True)) + op.create_unique_constraint(op.f('exchange_rates_target_currency_key'), 'exchange_rates', ['target_currency'], postgresql_nulls_not_distinct=False) + op.drop_constraint(None, 'credit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('credit_logs_org_id_fkey'), 'credit_logs', 'organizations', ['org_id'], ['id']) + op.add_column('catalog_discovery', sa.Column('attempts', sa.INTEGER(), autoincrement=False, nullable=False)) + op.add_column('catalog_discovery', sa.Column('source', sa.VARCHAR(length=50), autoincrement=False, nullable=True)) + op.add_column('catalog_discovery', sa.Column('priority_score', sa.INTEGER(), server_default=sa.text('0'), autoincrement=False, nullable=True)) + op.add_column('catalog_discovery', sa.Column('created_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=False)) + op.add_column('catalog_discovery', sa.Column('vehicle_class', sa.VARCHAR(length=50), autoincrement=False, nullable=True)) + op.add_column('catalog_discovery', sa.Column('last_attempt', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True)) + op.drop_constraint('_make_model_uc', 'catalog_discovery', schema='data', type_='unique') + op.create_index(op.f('ix_data_catalog_discovery_vehicle_class'), 'catalog_discovery', ['vehicle_class'], unique=False) + op.create_unique_constraint(op.f('_make_model_class_uc'), 'catalog_discovery', ['make', 'model', 'vehicle_class'], postgresql_nulls_not_distinct=False) + op.drop_constraint(None, 'branches', schema='data', type_='foreignkey') + op.drop_constraint(None, 'branches', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('branches_organization_id_fkey'), 'branches', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('branches_address_id_fkey'), 'branches', 'addresses', ['address_id'], ['id']) + op.drop_constraint(None, 'audit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('audit_logs_user_id_fkey'), 'audit_logs', 'users', ['user_id'], ['id'], referent_schema='identity') + op.alter_column('audit_logs', 'severity', + existing_type=postgresql.ENUM('info', 'warning', 'critical', 'emergency', name='log_severity', schema='data'), + type_=postgresql.ENUM('info', 'warning', 'critical', 'emergency', name='log_severity'), + existing_nullable=False) + op.add_column('assets', sa.Column('is_corporate', sa.BOOLEAN(), server_default=sa.text('false'), autoincrement=False, nullable=False)) + op.add_column('assets', sa.Column('catalog_match_score', sa.NUMERIC(precision=5, scale=2), autoincrement=False, nullable=True)) + op.add_column('assets', sa.Column('verification_method', sa.VARCHAR(length=20), autoincrement=False, nullable=True)) + op.add_column('assets', sa.Column('verification_notes', sa.TEXT(), autoincrement=False, nullable=True)) + op.add_column('assets', sa.Column('registration_uuid', sa.UUID(), autoincrement=False, nullable=False)) + op.add_column('assets', sa.Column('is_verified', sa.BOOLEAN(), autoincrement=False, nullable=False)) + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('assets_operator_person_id_fkey'), 'assets', 'persons', ['operator_person_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('assets_operator_org_id_fkey'), 'assets', 'organizations', ['operator_org_id'], ['id']) + op.create_foreign_key(op.f('assets_owner_person_id_fkey'), 'assets', 'persons', ['owner_person_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('assets_current_organization_id_fkey'), 'assets', 'organizations', ['current_organization_id'], ['id']) + op.create_foreign_key(op.f('assets_catalog_id_fkey'), 'assets', 'vehicle_catalog', ['catalog_id'], ['id']) + op.create_foreign_key(op.f('assets_owner_org_id_fkey'), 'assets', 'organizations', ['owner_org_id'], ['id']) + op.drop_index(op.f('ix_data_assets_year_of_manufacture'), table_name='assets', schema='data') + op.drop_index(op.f('ix_data_assets_is_for_sale'), table_name='assets', schema='data') + op.drop_index(op.f('ix_data_assets_current_mileage'), table_name='assets', schema='data') + op.create_index(op.f('ix_data_assets_registration_uuid'), 'assets', ['registration_uuid'], unique=False) + op.drop_column('assets', 'individual_equipment') + op.drop_column('assets', 'currency') + op.drop_column('assets', 'price') + op.drop_column('assets', 'is_for_sale') + op.drop_column('assets', 'condition_score') + op.drop_column('assets', 'current_mileage') + op.drop_column('assets', 'first_registration_date') + op.add_column('asset_telemetry', sa.Column('mileage_unit', sa.VARCHAR(length=10), autoincrement=False, nullable=False)) + op.add_column('asset_telemetry', sa.Column('dbs_score', sa.NUMERIC(precision=5, scale=2), autoincrement=False, nullable=False)) + op.add_column('asset_telemetry', sa.Column('vqi_score', sa.NUMERIC(precision=5, scale=2), autoincrement=False, nullable=False)) + op.drop_constraint(None, 'asset_telemetry', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', 'assets', ['asset_id'], ['id']) + op.add_column('asset_reviews', sa.Column('criteria_scores', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), autoincrement=False, nullable=False)) + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', 'users', ['user_id'], ['id'], referent_schema='identity') + op.add_column('asset_financials', sa.Column('acquisition_date', postgresql.TIMESTAMP(), autoincrement=False, nullable=True)) + op.add_column('asset_financials', sa.Column('residual_value_estimate', sa.NUMERIC(precision=18, scale=2), autoincrement=False, nullable=True)) + op.add_column('asset_financials', sa.Column('acquisition_price', sa.NUMERIC(precision=18, scale=2), autoincrement=False, nullable=True)) + op.drop_constraint(None, 'asset_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_financials_asset_id_fkey'), 'asset_financials', 'assets', ['asset_id'], ['id']) + op.alter_column('asset_financials', 'financing_type', + existing_type=sa.VARCHAR(), + nullable=True) + op.drop_column('asset_financials', 'accounting_details') + op.drop_column('asset_financials', 'activation_date') + op.drop_column('asset_financials', 'vat_rate') + op.drop_column('asset_financials', 'purchase_price_gross') + op.drop_column('asset_financials', 'purchase_price_net') + op.add_column('asset_events', sa.Column('registration_uuid', sa.UUID(), autoincrement=False, nullable=True)) + op.add_column('asset_events', sa.Column('recorded_mileage', sa.INTEGER(), autoincrement=False, nullable=True)) + op.add_column('asset_events', sa.Column('data', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), autoincrement=False, nullable=False)) + op.drop_constraint(None, 'asset_events', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_events_asset_id_fkey'), 'asset_events', 'assets', ['asset_id'], ['id']) + op.create_index(op.f('ix_data_asset_events_registration_uuid'), 'asset_events', ['registration_uuid'], unique=False) + op.add_column('asset_costs', sa.Column('amount_eur', sa.NUMERIC(precision=18, scale=2), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('mileage_at_cost', sa.INTEGER(), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('vat_rate', sa.NUMERIC(precision=5, scale=2), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('exchange_rate_used', sa.NUMERIC(precision=18, scale=6), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('currency_local', sa.VARCHAR(length=3), autoincrement=False, nullable=False)) + op.add_column('asset_costs', sa.Column('amount_local', sa.NUMERIC(precision=18, scale=2), autoincrement=False, nullable=False)) + op.add_column('asset_costs', sa.Column('net_amount_local', sa.NUMERIC(precision=18, scale=2), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('registration_uuid', sa.UUID(), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('driver_id', sa.INTEGER(), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('cost_type', sa.VARCHAR(length=50), autoincrement=False, nullable=False)) + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_costs_organization_id_fkey'), 'asset_costs', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_asset_id_fkey'), 'asset_costs', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_driver_id_fkey'), 'asset_costs', 'users', ['driver_id'], ['id'], referent_schema='identity') + op.drop_index(op.f('ix_data_asset_costs_invoice_number'), table_name='asset_costs', schema='data') + op.drop_index(op.f('ix_data_asset_costs_cost_category'), table_name='asset_costs', schema='data') + op.create_index(op.f('ix_data_asset_costs_registration_uuid'), 'asset_costs', ['registration_uuid'], unique=False) + op.drop_column('asset_costs', 'invoice_number') + op.drop_column('asset_costs', 'currency') + op.drop_column('asset_costs', 'amount_net') + op.drop_column('asset_costs', 'cost_category') + op.add_column('asset_assignments', sa.Column('branch_id', sa.UUID(), autoincrement=False, nullable=True)) + op.add_column('asset_assignments', sa.Column('released_at', postgresql.TIMESTAMP(timezone=True), autoincrement=False, nullable=True)) + op.add_column('asset_assignments', sa.Column('assigned_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=False)) + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_assignments_branch_id_fkey'), 'asset_assignments', 'branches', ['branch_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'addresses', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('addresses_postal_code_id_fkey'), 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_table('vehicle_ownership_history', schema='data') + op.drop_index(op.f('ix_data_vehicle_logbook_trip_type'), table_name='vehicle_logbook', schema='data') + op.drop_table('vehicle_logbook', schema='data') + op.drop_table('asset_inspections', schema='data') + + # --- JAVÍTÁS 5: Robot oszlopok törlése a downgrade végén --- + op.drop_column('vehicle_model_definitions', 'attempts', schema='data') + op.drop_column('vehicle_model_definitions', 'last_error', schema='data') + op.drop_column('vehicle_model_definitions', 'updated_at', schema='data') + # ### end Alembic commands ### \ No newline at end of file diff --git a/backend/migrations/versions/92fe3b877b24_add_rdw_mega_columns.py b/backend/migrations/versions/92fe3b877b24_add_rdw_mega_columns.py new file mode 100755 index 0000000..fe6e986 --- /dev/null +++ b/backend/migrations/versions/92fe3b877b24_add_rdw_mega_columns.py @@ -0,0 +1,28 @@ +"""add_rdw_mega_columns + +Revision ID: 92fe3b877b24 +Revises: 0473a3146058 +Create Date: 2026-03-01 03:07:11.918540 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = '92fe3b877b24' +down_revision: Union[str, Sequence[str], None] = '0473a3146058' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + pass + + +def downgrade() -> None: + """Downgrade schema.""" + pass diff --git a/backend/migrations/versions/e5ad17906e7f_gamification_schema_fix_v4.py b/backend/migrations/versions/e5ad17906e7f_gamification_schema_fix_v4.py new file mode 100755 index 0000000..a13ec0a --- /dev/null +++ b/backend/migrations/versions/e5ad17906e7f_gamification_schema_fix_v4.py @@ -0,0 +1,57 @@ +"""gamification_schema_fix_v4 + +Revision ID: e5ad17906e7f +Revises: 429ffa7dd5e1 +Create Date: 2026-02-27 06:17:18.106421 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = 'e5ad17906e7f' +down_revision: Union[str, Sequence[str], None] = '429ffa7dd5e1' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """ExpertiseTag és ServiceExpertise bővítése - Kézi kényszerítés.""" + + # 1. ExpertiseTag bővítése (data séma) + op.add_column('expertise_tags', sa.Column('name_en', sa.String(length=100), nullable=True), schema='data') + op.add_column('expertise_tags', sa.Column('is_official', sa.Boolean(), server_default=sa.text('true'), nullable=False), schema='data') + op.add_column('expertise_tags', sa.Column('suggested_by_id', sa.BigInteger(), nullable=True), schema='data') + op.add_column('expertise_tags', sa.Column('discovery_points', sa.Integer(), server_default=sa.text('10'), nullable=False), schema='data') + op.add_column('expertise_tags', sa.Column('search_keywords', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'[]'::jsonb"), nullable=False), schema='data') + op.add_column('expertise_tags', sa.Column('usage_count', sa.Integer(), server_default=sa.text('0'), nullable=False), schema='data') + op.add_column('expertise_tags', sa.Column('icon', sa.String(length=50), nullable=True), schema='data') + op.add_column('expertise_tags', sa.Column('description', sa.Text(), nullable=True), schema='data') + op.add_column('expertise_tags', sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), schema='data') + op.add_column('expertise_tags', sa.Column('updated_at', sa.DateTime(timezone=True), nullable=True), schema='data') + + # Foreign Key az identity sémába + op.create_foreign_key('fk_expertise_tags_suggested_by', 'expertise_tags', 'persons', ['suggested_by_id'], ['id'], source_schema='data', referent_schema='identity') + + # 2. ServiceExpertise bővítése (ha a tábla már létezik, csak az új mezők kellenek) + # Ha az 'id' mező hiányzik, ezt is hozzáadjuk (sorrend miatt fontos lehet) + try: + op.add_column('service_expertises', sa.Column('confidence_level', sa.Integer(), server_default=sa.text('0'), nullable=False), schema='data') + op.add_column('service_expertises', sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), schema='data') + except Exception: + pass # Ha már ott lennének, ne álljon meg a folyamat + +def downgrade() -> None: + """Visszaállítás.""" + op.drop_constraint('fk_expertise_tags_suggested_by', 'expertise_tags', schema='data', type_='foreignkey') + columns_to_drop = [ + 'name_en', 'is_official', 'suggested_by_id', 'discovery_points', + 'search_keywords', 'usage_count', 'icon', 'description', + 'created_at', 'updated_at' + ] + for col in columns_to_drop: + op.drop_column('expertise_tags', col, schema='data') + pass diff --git a/backend/migrations/versions/f7505332b1c8_add_missing_system_and_catalog_tables.py b/backend/migrations/versions/f7505332b1c8_add_missing_system_and_catalog_tables.py new file mode 100755 index 0000000..971dc51 --- /dev/null +++ b/backend/migrations/versions/f7505332b1c8_add_missing_system_and_catalog_tables.py @@ -0,0 +1,302 @@ +"""Add_missing_system_and_catalog_tables + +Revision ID: f7505332b1c8 +Revises: 78f5b29d0714 +Create Date: 2026-02-24 00:44:31.612591 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = 'f7505332b1c8' +down_revision: Union[str, Sequence[str], None] = '78f5b29d0714' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('pending_actions', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('requester_id', sa.Integer(), nullable=False), + sa.Column('approver_id', sa.Integer(), nullable=True), + sa.Column('status', sa.Enum('pending', 'approved', 'rejected', 'expired', name='actionstatus', schema='system'), nullable=False), + sa.Column('action_type', sa.String(length=50), nullable=False), + sa.Column('payload', postgresql.JSONB(astext_type=sa.Text()), nullable=False), + sa.Column('reason', sa.String(length=255), nullable=True), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.Column('expires_at', sa.DateTime(timezone=True), server_default=sa.text("now() + interval '24 hours'"), nullable=False), + sa.Column('processed_at', sa.DateTime(timezone=True), nullable=True), + sa.ForeignKeyConstraint(['approver_id'], ['identity.users.id'], ), + sa.ForeignKeyConstraint(['requester_id'], ['identity.users.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='system' + ) + op.create_index(op.f('ix_system_pending_actions_id'), 'pending_actions', ['id'], unique=False, schema='system') + # op.drop_table('spatial_ref_sys', schema='public') + op.drop_constraint(op.f('addresses_postal_code_id_fkey'), 'addresses', type_='foreignkey') + op.create_foreign_key(None, 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_branch_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', type_='foreignkey') + op.create_foreign_key(None, 'asset_assignments', 'branches', ['branch_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_assignments', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_costs_asset_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_organization_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_driver_id_fkey'), 'asset_costs', type_='foreignkey') + op.create_foreign_key(None, 'asset_costs', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'users', ['driver_id'], ['id'], source_schema='data', referent_schema='identity') + op.drop_constraint(op.f('asset_events_asset_id_fkey'), 'asset_events', type_='foreignkey') + op.create_foreign_key(None, 'asset_events', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_financials_asset_id_fkey'), 'asset_financials', type_='foreignkey') + op.create_foreign_key(None, 'asset_financials', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', type_='foreignkey') + op.drop_constraint(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', type_='foreignkey') + op.create_foreign_key(None, 'asset_reviews', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'asset_reviews', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', type_='foreignkey') + op.create_foreign_key(None, 'asset_telemetry', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('assets_catalog_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_operator_person_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_owner_org_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_current_organization_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_owner_person_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_operator_org_id_fkey'), 'assets', type_='foreignkey') + op.create_foreign_key(None, 'assets', 'organizations', ['current_organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'assets', 'persons', ['owner_person_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'assets', 'persons', ['operator_person_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'assets', 'organizations', ['owner_org_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'assets', 'vehicle_catalog', ['catalog_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'assets', 'organizations', ['operator_org_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('audit_logs', 'severity', + existing_type=postgresql.ENUM('info', 'warning', 'critical', 'emergency', name='log_severity'), + type_=postgresql.ENUM('info', 'warning', 'critical', 'emergency', name='log_severity', schema='data'), + existing_nullable=False) + op.drop_constraint(op.f('audit_logs_user_id_fkey'), 'audit_logs', type_='foreignkey') + op.create_foreign_key(None, 'audit_logs', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.drop_constraint(op.f('branches_address_id_fkey'), 'branches', type_='foreignkey') + op.drop_constraint(op.f('branches_organization_id_fkey'), 'branches', type_='foreignkey') + op.create_foreign_key(None, 'branches', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'branches', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('credit_logs_org_id_fkey'), 'credit_logs', type_='foreignkey') + op.create_foreign_key(None, 'credit_logs', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('feature_definitions_vehicle_type_id_fkey'), 'feature_definitions', type_='foreignkey') + op.create_foreign_key(None, 'feature_definitions', 'vehicle_types', ['vehicle_type_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', type_='foreignkey') + op.create_foreign_key(None, 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('model_feature_maps_model_definition_id_fkey'), 'model_feature_maps', type_='foreignkey') + op.drop_constraint(op.f('model_feature_maps_feature_id_fkey'), 'model_feature_maps', type_='foreignkey') + op.create_foreign_key(None, 'model_feature_maps', 'feature_definitions', ['feature_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'model_feature_maps', 'vehicle_model_definitions', ['model_definition_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('org_sales_assignments_agent_user_id_fkey'), 'org_sales_assignments', type_='foreignkey') + op.drop_constraint(op.f('org_sales_assignments_organization_id_fkey'), 'org_sales_assignments', type_='foreignkey') + op.create_foreign_key(None, 'org_sales_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_sales_assignments', 'users', ['agent_user_id'], ['id'], source_schema='data', referent_schema='identity') + op.drop_constraint(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.drop_constraint(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.create_foreign_key(None, 'org_subscriptions', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('organization_financials_organization_id_fkey'), 'organization_financials', type_='foreignkey') + op.create_foreign_key(None, 'organization_financials', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('organization_members', 'role', + existing_type=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole'), + type_=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole', schema='data'), + existing_nullable=False) + op.drop_constraint(op.f('organization_members_person_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_user_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_organization_id_fkey'), 'organization_members', type_='foreignkey') + op.create_foreign_key(None, 'organization_members', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'organization_members', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organization_members', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='identity') + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data'), + existing_nullable=False) + op.drop_constraint(op.f('organizations_address_id_fkey'), 'organizations', type_='foreignkey') + op.drop_constraint(op.f('organizations_owner_id_fkey'), 'organizations', type_='foreignkey') + op.create_foreign_key(None, 'organizations', 'users', ['owner_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'organizations', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('points_ledger_user_id_fkey'), 'points_ledger', type_='foreignkey') + op.create_foreign_key(None, 'points_ledger', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.drop_constraint(op.f('ratings_target_branch_id_fkey'), 'ratings', type_='foreignkey') + op.drop_constraint(op.f('ratings_author_id_fkey'), 'ratings', type_='foreignkey') + op.drop_constraint(op.f('ratings_target_organization_id_fkey'), 'ratings', type_='foreignkey') + op.drop_constraint(op.f('ratings_target_user_id_fkey'), 'ratings', type_='foreignkey') + op.create_foreign_key(None, 'ratings', 'users', ['author_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'ratings', 'users', ['target_user_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'ratings', 'organizations', ['target_organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'ratings', 'branches', ['target_branch_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_expertises_expertise_id_fkey'), 'service_expertises', type_='foreignkey') + op.drop_constraint(op.f('service_expertises_service_id_fkey'), 'service_expertises', type_='foreignkey') + op.create_foreign_key(None, 'service_expertises', 'expertise_tags', ['expertise_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'service_expertises', 'service_profiles', ['service_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_index(op.f('idx_service_profiles_location'), table_name='service_profiles', postgresql_using='gist') + op.drop_constraint(op.f('service_profiles_parent_id_fkey'), 'service_profiles', type_='foreignkey') + op.drop_constraint(op.f('service_profiles_organization_id_fkey'), 'service_profiles', type_='foreignkey') + op.create_foreign_key(None, 'service_profiles', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'service_profiles', 'service_profiles', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_specialties_parent_id_fkey'), 'service_specialties', type_='foreignkey') + op.create_foreign_key(None, 'service_specialties', 'service_specialties', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_badges_badge_id_fkey'), 'user_badges', type_='foreignkey') + op.drop_constraint(op.f('user_badges_user_id_fkey'), 'user_badges', type_='foreignkey') + op.create_foreign_key(None, 'user_badges', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.create_foreign_key(None, 'user_badges', 'badges', ['badge_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_stats_user_id_fkey'), 'user_stats', type_='foreignkey') + op.create_foreign_key(None, 'user_stats', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.drop_constraint(op.f('vehicle_catalog_master_definition_id_fkey'), 'vehicle_catalog', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_catalog', 'vehicle_model_definitions', ['master_definition_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('vehicle_model_definitions_vehicle_type_id_fkey'), 'vehicle_model_definitions', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_model_definitions', 'vehicle_types', ['vehicle_type_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.drop_constraint(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'vehicle_ownerships', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='identity') + op.drop_constraint(op.f('persons_address_id_fkey'), 'persons', schema='identity', type_='foreignkey') + op.create_foreign_key(None, 'persons', 'addresses', ['address_id'], ['id'], source_schema='identity', referent_schema='data') + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'persons', schema='identity', type_='foreignkey') + op.create_foreign_key(op.f('persons_address_id_fkey'), 'persons', 'addresses', ['address_id'], ['id'], source_schema='identity') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', 'users', ['user_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id']) + op.drop_constraint(None, 'vehicle_model_definitions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_model_definitions_vehicle_type_id_fkey'), 'vehicle_model_definitions', 'vehicle_types', ['vehicle_type_id'], ['id']) + op.drop_constraint(None, 'vehicle_catalog', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_catalog_master_definition_id_fkey'), 'vehicle_catalog', 'vehicle_model_definitions', ['master_definition_id'], ['id']) + op.drop_constraint(None, 'user_stats', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_stats_user_id_fkey'), 'user_stats', 'users', ['user_id'], ['id'], referent_schema='identity') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_badges_user_id_fkey'), 'user_badges', 'users', ['user_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('user_badges_badge_id_fkey'), 'user_badges', 'badges', ['badge_id'], ['id']) + op.drop_constraint(None, 'service_specialties', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_specialties_parent_id_fkey'), 'service_specialties', 'service_specialties', ['parent_id'], ['id']) + op.drop_constraint(None, 'service_profiles', schema='data', type_='foreignkey') + op.drop_constraint(None, 'service_profiles', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_profiles_organization_id_fkey'), 'service_profiles', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('service_profiles_parent_id_fkey'), 'service_profiles', 'service_profiles', ['parent_id'], ['id']) + op.create_index(op.f('idx_service_profiles_location'), 'service_profiles', ['location'], unique=False, postgresql_using='gist') + op.drop_constraint(None, 'service_expertises', schema='data', type_='foreignkey') + op.drop_constraint(None, 'service_expertises', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_expertises_service_id_fkey'), 'service_expertises', 'service_profiles', ['service_id'], ['id']) + op.create_foreign_key(op.f('service_expertises_expertise_id_fkey'), 'service_expertises', 'expertise_tags', ['expertise_id'], ['id']) + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('ratings_target_user_id_fkey'), 'ratings', 'users', ['target_user_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('ratings_target_organization_id_fkey'), 'ratings', 'organizations', ['target_organization_id'], ['id']) + op.create_foreign_key(op.f('ratings_author_id_fkey'), 'ratings', 'users', ['author_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('ratings_target_branch_id_fkey'), 'ratings', 'branches', ['target_branch_id'], ['id']) + op.drop_constraint(None, 'points_ledger', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('points_ledger_user_id_fkey'), 'points_ledger', 'users', ['user_id'], ['id'], referent_schema='identity') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organizations_owner_id_fkey'), 'organizations', 'users', ['owner_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('organizations_address_id_fkey'), 'organizations', 'addresses', ['address_id'], ['id']) + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + existing_nullable=False) + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_members_organization_id_fkey'), 'organization_members', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('organization_members_user_id_fkey'), 'organization_members', 'users', ['user_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('organization_members_person_id_fkey'), 'organization_members', 'persons', ['person_id'], ['id'], referent_schema='identity') + op.alter_column('organization_members', 'role', + existing_type=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole', schema='data'), + type_=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole'), + existing_nullable=False) + op.drop_constraint(None, 'organization_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_financials_organization_id_fkey'), 'organization_financials', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id']) + op.create_foreign_key(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'org_sales_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_sales_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_sales_assignments_organization_id_fkey'), 'org_sales_assignments', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('org_sales_assignments_agent_user_id_fkey'), 'org_sales_assignments', 'users', ['agent_user_id'], ['id'], referent_schema='identity') + op.drop_constraint(None, 'model_feature_maps', schema='data', type_='foreignkey') + op.drop_constraint(None, 'model_feature_maps', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('model_feature_maps_feature_id_fkey'), 'model_feature_maps', 'feature_definitions', ['feature_id'], ['id']) + op.create_foreign_key(op.f('model_feature_maps_model_definition_id_fkey'), 'model_feature_maps', 'vehicle_model_definitions', ['model_definition_id'], ['id']) + op.drop_constraint(None, 'geo_streets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_constraint(None, 'feature_definitions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('feature_definitions_vehicle_type_id_fkey'), 'feature_definitions', 'vehicle_types', ['vehicle_type_id'], ['id']) + op.drop_constraint(None, 'credit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('credit_logs_org_id_fkey'), 'credit_logs', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'branches', schema='data', type_='foreignkey') + op.drop_constraint(None, 'branches', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('branches_organization_id_fkey'), 'branches', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('branches_address_id_fkey'), 'branches', 'addresses', ['address_id'], ['id']) + op.drop_constraint(None, 'audit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('audit_logs_user_id_fkey'), 'audit_logs', 'users', ['user_id'], ['id'], referent_schema='identity') + op.alter_column('audit_logs', 'severity', + existing_type=postgresql.ENUM('info', 'warning', 'critical', 'emergency', name='log_severity', schema='data'), + type_=postgresql.ENUM('info', 'warning', 'critical', 'emergency', name='log_severity'), + existing_nullable=False) + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('assets_operator_org_id_fkey'), 'assets', 'organizations', ['operator_org_id'], ['id']) + op.create_foreign_key(op.f('assets_owner_person_id_fkey'), 'assets', 'persons', ['owner_person_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('assets_current_organization_id_fkey'), 'assets', 'organizations', ['current_organization_id'], ['id']) + op.create_foreign_key(op.f('assets_owner_org_id_fkey'), 'assets', 'organizations', ['owner_org_id'], ['id']) + op.create_foreign_key(op.f('assets_operator_person_id_fkey'), 'assets', 'persons', ['operator_person_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('assets_catalog_id_fkey'), 'assets', 'vehicle_catalog', ['catalog_id'], ['id']) + op.drop_constraint(None, 'asset_telemetry', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', 'users', ['user_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_financials_asset_id_fkey'), 'asset_financials', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_events', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_events_asset_id_fkey'), 'asset_events', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_costs_driver_id_fkey'), 'asset_costs', 'users', ['driver_id'], ['id'], referent_schema='identity') + op.create_foreign_key(op.f('asset_costs_organization_id_fkey'), 'asset_costs', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_asset_id_fkey'), 'asset_costs', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_branch_id_fkey'), 'asset_assignments', 'branches', ['branch_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'addresses', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('addresses_postal_code_id_fkey'), 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id']) + # op.create_table('spatial_ref_sys', + #sa.Column('srid', sa.INTEGER(), autoincrement=False, nullable=False), + #sa.Column('auth_name', sa.VARCHAR(length=256), autoincrement=False, nullable=True), + #sa.Column('auth_srid', sa.INTEGER(), autoincrement=False, nullable=True), + #sa.Column('srtext', sa.VARCHAR(length=2048), autoincrement=False, nullable=True), + #sa.Column('proj4text', sa.VARCHAR(length=2048), autoincrement=False, nullable=True), + #sa.CheckConstraint('srid > 0 AND srid <= 998999', name=op.f('spatial_ref_sys_srid_check')), + #sa.PrimaryKeyConstraint('srid', name=op.f('spatial_ref_sys_pkey')), + #schema='public' + #) + op.drop_index(op.f('ix_system_pending_actions_id'), table_name='pending_actions', schema='system') + op.drop_table('pending_actions', schema='system') + # ### end Alembic commands ### diff --git a/backend/migrations/versions/full_schema_backup.sql b/backend/migrations/versions/full_schema_backup.sql new file mode 100755 index 0000000..e69de29 diff --git a/backend/migrations/versions_backup/0fa011f29e35_enforce_system_parameters_primary_key.py b/backend/migrations/versions_backup/0fa011f29e35_enforce_system_parameters_primary_key.py new file mode 100755 index 0000000..653b687 --- /dev/null +++ b/backend/migrations/versions_backup/0fa011f29e35_enforce_system_parameters_primary_key.py @@ -0,0 +1,186 @@ +"""enforce_system_parameters_primary_key + +Revision ID: 0fa011f29e35 +Revises: f2d8996357ac +Create Date: 2026-02-11 19:38:43.872957 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = '0fa011f29e35' +down_revision: Union[str, Sequence[str], None] = 'f2d8996357ac' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(op.f('addresses_postal_code_id_fkey'), 'addresses', type_='foreignkey') + op.create_foreign_key(None, 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', type_='foreignkey') + op.create_foreign_key(None, 'asset_assignments', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_costs_organization_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_driver_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_asset_id_fkey'), 'asset_costs', type_='foreignkey') + op.create_foreign_key(None, 'asset_costs', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'users', ['driver_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_events_asset_id_fkey'), 'asset_events', type_='foreignkey') + op.create_foreign_key(None, 'asset_events', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_financials_asset_id_fkey'), 'asset_financials', type_='foreignkey') + op.create_foreign_key(None, 'asset_financials', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', type_='foreignkey') + op.drop_constraint(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', type_='foreignkey') + op.create_foreign_key(None, 'asset_reviews', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_reviews', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', type_='foreignkey') + op.create_foreign_key(None, 'asset_telemetry', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('assets_catalog_id_fkey'), 'assets', type_='foreignkey') + op.create_foreign_key(None, 'assets', 'vehicle_catalog', ['catalog_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('audit_logs_user_id_fkey'), 'audit_logs', type_='foreignkey') + op.create_foreign_key(None, 'audit_logs', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('credit_logs_org_id_fkey'), 'credit_logs', type_='foreignkey') + op.create_foreign_key(None, 'credit_logs', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('documents_uploaded_by_fkey'), 'documents', type_='foreignkey') + op.create_foreign_key(None, 'documents', 'users', ['uploaded_by'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', type_='foreignkey') + op.create_foreign_key(None, 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.drop_constraint(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.create_foreign_key(None, 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_subscriptions', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('organization_members_organization_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_user_id_fkey'), 'organization_members', type_='foreignkey') + op.create_foreign_key(None, 'organization_members', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organization_members', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + existing_nullable=True) + op.drop_constraint(op.f('organizations_address_id_fkey'), 'organizations', type_='foreignkey') + op.drop_constraint(op.f('organizations_owner_id_fkey'), 'organizations', type_='foreignkey') + op.create_foreign_key(None, 'organizations', 'users', ['owner_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organizations', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('pending_actions_requester_id_fkey'), 'pending_actions', type_='foreignkey') + op.drop_constraint(op.f('pending_actions_approver_id_fkey'), 'pending_actions', type_='foreignkey') + op.create_foreign_key(None, 'pending_actions', 'users', ['requester_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'pending_actions', 'users', ['approver_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('persons_address_id_fkey'), 'persons', type_='foreignkey') + op.create_foreign_key(None, 'persons', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('points_ledger_user_id_fkey'), 'points_ledger', type_='foreignkey') + op.create_foreign_key(None, 'points_ledger', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('ratings_author_id_fkey'), 'ratings', type_='foreignkey') + op.create_foreign_key(None, 'ratings', 'users', ['author_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_specialties_parent_id_fkey'), 'service_specialties', type_='foreignkey') + op.create_foreign_key(None, 'service_specialties', 'service_specialties', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('social_accounts_user_id_fkey'), 'social_accounts', type_='foreignkey') + op.create_foreign_key(None, 'social_accounts', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('user_badges_user_id_fkey'), 'user_badges', type_='foreignkey') + op.drop_constraint(op.f('user_badges_badge_id_fkey'), 'user_badges', type_='foreignkey') + op.create_foreign_key(None, 'user_badges', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'user_badges', 'badges', ['badge_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_stats_user_id_fkey'), 'user_stats', type_='foreignkey') + op.create_foreign_key(None, 'user_stats', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('users_person_id_fkey'), 'users', type_='foreignkey') + op.create_foreign_key(None, 'users', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.drop_constraint(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_ownerships', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', type_='foreignkey') + op.create_foreign_key(None, 'verification_tokens', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('wallets_user_id_fkey'), 'wallets', type_='foreignkey') + op.create_foreign_key(None, 'wallets', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'wallets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('wallets_user_id_fkey'), 'wallets', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'verification_tokens', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id']) + op.drop_constraint(None, 'users', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('users_person_id_fkey'), 'users', 'persons', ['person_id'], ['id']) + op.drop_constraint(None, 'user_stats', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_stats_user_id_fkey'), 'user_stats', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_badges_badge_id_fkey'), 'user_badges', 'badges', ['badge_id'], ['id']) + op.create_foreign_key(op.f('user_badges_user_id_fkey'), 'user_badges', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'social_accounts', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('social_accounts_user_id_fkey'), 'social_accounts', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'service_specialties', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_specialties_parent_id_fkey'), 'service_specialties', 'service_specialties', ['parent_id'], ['id']) + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('ratings_author_id_fkey'), 'ratings', 'users', ['author_id'], ['id']) + op.drop_constraint(None, 'points_ledger', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('points_ledger_user_id_fkey'), 'points_ledger', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'persons', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('persons_address_id_fkey'), 'persons', 'addresses', ['address_id'], ['id']) + op.drop_constraint(None, 'pending_actions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'pending_actions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('pending_actions_approver_id_fkey'), 'pending_actions', 'users', ['approver_id'], ['id']) + op.create_foreign_key(op.f('pending_actions_requester_id_fkey'), 'pending_actions', 'users', ['requester_id'], ['id']) + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organizations_owner_id_fkey'), 'organizations', 'users', ['owner_id'], ['id']) + op.create_foreign_key(op.f('organizations_address_id_fkey'), 'organizations', 'addresses', ['address_id'], ['id']) + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + existing_nullable=True) + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_members_user_id_fkey'), 'organization_members', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('organization_members_organization_id_fkey'), 'organization_members', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id']) + op.create_foreign_key(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'geo_streets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_constraint(None, 'documents', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('documents_uploaded_by_fkey'), 'documents', 'users', ['uploaded_by'], ['id']) + op.drop_constraint(None, 'credit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('credit_logs_org_id_fkey'), 'credit_logs', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'audit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('audit_logs_user_id_fkey'), 'audit_logs', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('assets_catalog_id_fkey'), 'assets', 'vehicle_catalog', ['catalog_id'], ['id']) + op.drop_constraint(None, 'asset_telemetry', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'asset_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_financials_asset_id_fkey'), 'asset_financials', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_events', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_events_asset_id_fkey'), 'asset_events', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_costs_asset_id_fkey'), 'asset_costs', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_driver_id_fkey'), 'asset_costs', 'users', ['driver_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_organization_id_fkey'), 'asset_costs', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'addresses', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('addresses_postal_code_id_fkey'), 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id']) + # ### end Alembic commands ### diff --git a/backend/migrations/versions_backup/12607787ed0b_security_hardening_v2_slugs_and_tokens.py b/backend/migrations/versions_backup/12607787ed0b_security_hardening_v2_slugs_and_tokens.py new file mode 100755 index 0000000..3a1f1fc --- /dev/null +++ b/backend/migrations/versions_backup/12607787ed0b_security_hardening_v2_slugs_and_tokens.py @@ -0,0 +1,212 @@ +"""security_hardening_v2_slugs_and_tokens + +Revision ID: 12607787ed0b +Revises: 8370c73114b6 +Create Date: 2026-02-11 00:05:08.320219 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = '12607787ed0b' +down_revision: Union[str, Sequence[str], None] = '8370c73114b6' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(op.f('addresses_postal_code_id_fkey'), 'addresses', type_='foreignkey') + op.create_foreign_key(None, 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', type_='foreignkey') + op.create_foreign_key(None, 'asset_assignments', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_costs_driver_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_asset_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_organization_id_fkey'), 'asset_costs', type_='foreignkey') + op.create_foreign_key(None, 'asset_costs', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'users', ['driver_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_events_asset_id_fkey'), 'asset_events', type_='foreignkey') + op.create_foreign_key(None, 'asset_events', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_financials_asset_id_fkey'), 'asset_financials', type_='foreignkey') + op.create_foreign_key(None, 'asset_financials', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', type_='foreignkey') + op.drop_constraint(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', type_='foreignkey') + op.create_foreign_key(None, 'asset_reviews', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_reviews', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', type_='foreignkey') + op.create_foreign_key(None, 'asset_telemetry', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('assets_catalog_id_fkey'), 'assets', type_='foreignkey') + op.create_foreign_key(None, 'assets', 'vehicle_catalog', ['catalog_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('audit_logs_user_id_fkey'), 'audit_logs', type_='foreignkey') + op.create_foreign_key(None, 'audit_logs', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('credit_logs_org_id_fkey'), 'credit_logs', type_='foreignkey') + op.create_foreign_key(None, 'credit_logs', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('documents_uploaded_by_fkey'), 'documents', type_='foreignkey') + op.create_foreign_key(None, 'documents', 'users', ['uploaded_by'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', type_='foreignkey') + op.create_foreign_key(None, 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.drop_constraint(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.create_foreign_key(None, 'org_subscriptions', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('organization_members_organization_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_user_id_fkey'), 'organization_members', type_='foreignkey') + op.create_foreign_key(None, 'organization_members', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organization_members', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.add_column('organizations', sa.Column('folder_slug', sa.String(length=12), nullable=True)) + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + existing_nullable=True) + op.create_index(op.f('ix_data_organizations_folder_slug'), 'organizations', ['folder_slug'], unique=True, schema='data') + op.drop_constraint(op.f('organizations_owner_id_fkey'), 'organizations', type_='foreignkey') + op.drop_constraint(op.f('organizations_address_id_fkey'), 'organizations', type_='foreignkey') + op.create_foreign_key(None, 'organizations', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organizations', 'users', ['owner_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('pending_actions_approver_id_fkey'), 'pending_actions', type_='foreignkey') + op.drop_constraint(op.f('pending_actions_requester_id_fkey'), 'pending_actions', type_='foreignkey') + op.create_foreign_key(None, 'pending_actions', 'users', ['requester_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'pending_actions', 'users', ['approver_id'], ['id'], source_schema='data', referent_schema='data') + op.add_column('persons', sa.Column('mothers_last_name', sa.String(), nullable=True)) + op.add_column('persons', sa.Column('mothers_first_name', sa.String(), nullable=True)) + op.add_column('persons', sa.Column('birth_place', sa.String(), nullable=True)) + op.add_column('persons', sa.Column('birth_date', sa.DateTime(), nullable=True)) + op.add_column('persons', sa.Column('ice_contact', sa.JSON(), server_default=sa.text("'{}'::jsonb"), nullable=True)) + op.drop_constraint(op.f('persons_address_id_fkey'), 'persons', type_='foreignkey') + op.create_foreign_key(None, 'persons', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('points_ledger_user_id_fkey'), 'points_ledger', type_='foreignkey') + op.create_foreign_key(None, 'points_ledger', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('ratings_author_id_fkey'), 'ratings', type_='foreignkey') + op.create_foreign_key(None, 'ratings', 'users', ['author_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_specialties_parent_id_fkey'), 'service_specialties', type_='foreignkey') + op.create_foreign_key(None, 'service_specialties', 'service_specialties', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('social_accounts_user_id_fkey'), 'social_accounts', type_='foreignkey') + op.create_foreign_key(None, 'social_accounts', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('user_badges_badge_id_fkey'), 'user_badges', type_='foreignkey') + op.drop_constraint(op.f('user_badges_user_id_fkey'), 'user_badges', type_='foreignkey') + op.create_foreign_key(None, 'user_badges', 'badges', ['badge_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'user_badges', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_stats_user_id_fkey'), 'user_stats', type_='foreignkey') + op.create_foreign_key(None, 'user_stats', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.add_column('users', sa.Column('folder_slug', sa.String(length=12), nullable=True)) + op.add_column('users', sa.Column('refresh_token_hash', sa.String(length=255), nullable=True)) + op.add_column('users', sa.Column('two_factor_secret', sa.String(length=100), nullable=True)) + op.add_column('users', sa.Column('two_factor_enabled', sa.Boolean(), nullable=True)) + op.add_column('users', sa.Column('preferred_currency', sa.String(length=3), server_default='HUF', nullable=True)) + op.create_index(op.f('ix_data_users_folder_slug'), 'users', ['folder_slug'], unique=True, schema='data') + op.drop_constraint(op.f('users_person_id_fkey'), 'users', type_='foreignkey') + op.create_foreign_key(None, 'users', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.drop_constraint(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'vehicle_ownerships', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', type_='foreignkey') + op.create_foreign_key(None, 'verification_tokens', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('wallets_user_id_fkey'), 'wallets', type_='foreignkey') + op.create_foreign_key(None, 'wallets', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'wallets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('wallets_user_id_fkey'), 'wallets', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'verification_tokens', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id']) + op.drop_constraint(None, 'users', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('users_person_id_fkey'), 'users', 'persons', ['person_id'], ['id']) + op.drop_index(op.f('ix_data_users_folder_slug'), table_name='users', schema='data') + op.drop_column('users', 'preferred_currency') + op.drop_column('users', 'two_factor_enabled') + op.drop_column('users', 'two_factor_secret') + op.drop_column('users', 'refresh_token_hash') + op.drop_column('users', 'folder_slug') + op.drop_constraint(None, 'user_stats', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_stats_user_id_fkey'), 'user_stats', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_badges_user_id_fkey'), 'user_badges', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('user_badges_badge_id_fkey'), 'user_badges', 'badges', ['badge_id'], ['id']) + op.drop_constraint(None, 'social_accounts', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('social_accounts_user_id_fkey'), 'social_accounts', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'service_specialties', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_specialties_parent_id_fkey'), 'service_specialties', 'service_specialties', ['parent_id'], ['id']) + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('ratings_author_id_fkey'), 'ratings', 'users', ['author_id'], ['id']) + op.drop_constraint(None, 'points_ledger', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('points_ledger_user_id_fkey'), 'points_ledger', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'persons', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('persons_address_id_fkey'), 'persons', 'addresses', ['address_id'], ['id']) + op.drop_column('persons', 'ice_contact') + op.drop_column('persons', 'birth_date') + op.drop_column('persons', 'birth_place') + op.drop_column('persons', 'mothers_first_name') + op.drop_column('persons', 'mothers_last_name') + op.drop_constraint(None, 'pending_actions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'pending_actions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('pending_actions_requester_id_fkey'), 'pending_actions', 'users', ['requester_id'], ['id']) + op.create_foreign_key(op.f('pending_actions_approver_id_fkey'), 'pending_actions', 'users', ['approver_id'], ['id']) + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organizations_address_id_fkey'), 'organizations', 'addresses', ['address_id'], ['id']) + op.create_foreign_key(op.f('organizations_owner_id_fkey'), 'organizations', 'users', ['owner_id'], ['id']) + op.drop_index(op.f('ix_data_organizations_folder_slug'), table_name='organizations', schema='data') + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + existing_nullable=True) + op.drop_column('organizations', 'folder_slug') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_members_user_id_fkey'), 'organization_members', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('organization_members_organization_id_fkey'), 'organization_members', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id']) + op.create_foreign_key(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'geo_streets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_constraint(None, 'documents', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('documents_uploaded_by_fkey'), 'documents', 'users', ['uploaded_by'], ['id']) + op.drop_constraint(None, 'credit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('credit_logs_org_id_fkey'), 'credit_logs', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'audit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('audit_logs_user_id_fkey'), 'audit_logs', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('assets_catalog_id_fkey'), 'assets', 'vehicle_catalog', ['catalog_id'], ['id']) + op.drop_constraint(None, 'asset_telemetry', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_financials_asset_id_fkey'), 'asset_financials', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_events', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_events_asset_id_fkey'), 'asset_events', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_costs_organization_id_fkey'), 'asset_costs', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_asset_id_fkey'), 'asset_costs', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_driver_id_fkey'), 'asset_costs', 'users', ['driver_id'], ['id']) + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'addresses', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('addresses_postal_code_id_fkey'), 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id']) + # ### end Alembic commands ### diff --git a/backend/migrations/versions_backup/134d92edd430_create_translation_and_security_tables.py b/backend/migrations/versions_backup/134d92edd430_create_translation_and_security_tables.py new file mode 100755 index 0000000..a8ff5a1 --- /dev/null +++ b/backend/migrations/versions_backup/134d92edd430_create_translation_and_security_tables.py @@ -0,0 +1,210 @@ +"""create_translation_and_security_tables + +Revision ID: 134d92edd430 +Revises: bc5669f12ffd +Create Date: 2026-02-10 20:04:23.924164 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = '134d92edd430' +down_revision: Union[str, Sequence[str], None] = 'bc5669f12ffd' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('translations', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('key', sa.String(length=100), nullable=False), + sa.Column('lang_code', sa.String(length=5), nullable=False), + sa.Column('value', sa.Text(), nullable=False), + sa.Column('is_published', sa.Boolean(), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('key', 'lang_code', name='uq_translation_key_lang'), + schema='data' + ) + op.create_index(op.f('ix_data_translations_id'), 'translations', ['id'], unique=False, schema='data') + op.create_index(op.f('ix_data_translations_key'), 'translations', ['key'], unique=False, schema='data') + op.create_index(op.f('ix_data_translations_lang_code'), 'translations', ['lang_code'], unique=False, schema='data') + op.create_table('pending_actions', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('requester_id', sa.Integer(), nullable=False), + sa.Column('approver_id', sa.Integer(), nullable=True), + sa.Column('status', sa.Enum('pending', 'approved', 'rejected', 'expired', name='actionstatus'), nullable=False), + sa.Column('action_type', sa.String(length=50), nullable=False), + sa.Column('payload', sa.JSON(), nullable=False), + sa.Column('reason', sa.String(length=255), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), + sa.Column('expires_at', sa.DateTime(timezone=True), nullable=True), + sa.Column('processed_at', sa.DateTime(timezone=True), nullable=True), + sa.ForeignKeyConstraint(['approver_id'], ['data.users.id'], ), + sa.ForeignKeyConstraint(['requester_id'], ['data.users.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index(op.f('ix_data_pending_actions_id'), 'pending_actions', ['id'], unique=False, schema='data') + op.drop_constraint(op.f('addresses_postal_code_id_fkey'), 'addresses', type_='foreignkey') + op.create_foreign_key(None, 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', type_='foreignkey') + op.create_foreign_key(None, 'asset_assignments', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_costs_organization_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_driver_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_asset_id_fkey'), 'asset_costs', type_='foreignkey') + op.create_foreign_key(None, 'asset_costs', 'users', ['driver_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_events_asset_id_fkey'), 'asset_events', type_='foreignkey') + op.create_foreign_key(None, 'asset_events', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_financials_asset_id_fkey'), 'asset_financials', type_='foreignkey') + op.create_foreign_key(None, 'asset_financials', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', type_='foreignkey') + op.drop_constraint(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', type_='foreignkey') + op.create_foreign_key(None, 'asset_reviews', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_reviews', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', type_='foreignkey') + op.create_foreign_key(None, 'asset_telemetry', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('assets_catalog_id_fkey'), 'assets', type_='foreignkey') + op.create_foreign_key(None, 'assets', 'vehicle_catalog', ['catalog_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('audit_logs_user_id_fkey'), 'audit_logs', type_='foreignkey') + op.create_foreign_key(None, 'audit_logs', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('credit_logs_org_id_fkey'), 'credit_logs', type_='foreignkey') + op.create_foreign_key(None, 'credit_logs', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('documents_uploaded_by_fkey'), 'documents', type_='foreignkey') + op.create_foreign_key(None, 'documents', 'users', ['uploaded_by'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', type_='foreignkey') + op.create_foreign_key(None, 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.drop_constraint(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.create_foreign_key(None, 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_subscriptions', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('organization_members_user_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_organization_id_fkey'), 'organization_members', type_='foreignkey') + op.create_foreign_key(None, 'organization_members', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organization_members', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + existing_nullable=True) + op.drop_constraint(op.f('organizations_owner_id_fkey'), 'organizations', type_='foreignkey') + op.drop_constraint(op.f('organizations_address_id_fkey'), 'organizations', type_='foreignkey') + op.create_foreign_key(None, 'organizations', 'users', ['owner_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organizations', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('persons_address_id_fkey'), 'persons', type_='foreignkey') + op.create_foreign_key(None, 'persons', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('points_ledger_user_id_fkey'), 'points_ledger', type_='foreignkey') + op.create_foreign_key(None, 'points_ledger', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('ratings_author_id_fkey'), 'ratings', type_='foreignkey') + op.create_foreign_key(None, 'ratings', 'users', ['author_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_specialties_parent_id_fkey'), 'service_specialties', type_='foreignkey') + op.create_foreign_key(None, 'service_specialties', 'service_specialties', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_badges_user_id_fkey'), 'user_badges', type_='foreignkey') + op.drop_constraint(op.f('user_badges_badge_id_fkey'), 'user_badges', type_='foreignkey') + op.create_foreign_key(None, 'user_badges', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'user_badges', 'badges', ['badge_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_stats_user_id_fkey'), 'user_stats', type_='foreignkey') + op.create_foreign_key(None, 'user_stats', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('users_person_id_fkey'), 'users', type_='foreignkey') + op.create_foreign_key(None, 'users', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.drop_constraint(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_ownerships', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', type_='foreignkey') + op.create_foreign_key(None, 'verification_tokens', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('wallets_user_id_fkey'), 'wallets', type_='foreignkey') + op.create_foreign_key(None, 'wallets', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'wallets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('wallets_user_id_fkey'), 'wallets', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'verification_tokens', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id']) + op.drop_constraint(None, 'users', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('users_person_id_fkey'), 'users', 'persons', ['person_id'], ['id']) + op.drop_constraint(None, 'user_stats', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_stats_user_id_fkey'), 'user_stats', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_badges_badge_id_fkey'), 'user_badges', 'badges', ['badge_id'], ['id']) + op.create_foreign_key(op.f('user_badges_user_id_fkey'), 'user_badges', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'service_specialties', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_specialties_parent_id_fkey'), 'service_specialties', 'service_specialties', ['parent_id'], ['id']) + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('ratings_author_id_fkey'), 'ratings', 'users', ['author_id'], ['id']) + op.drop_constraint(None, 'points_ledger', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('points_ledger_user_id_fkey'), 'points_ledger', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'persons', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('persons_address_id_fkey'), 'persons', 'addresses', ['address_id'], ['id']) + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organizations_address_id_fkey'), 'organizations', 'addresses', ['address_id'], ['id']) + op.create_foreign_key(op.f('organizations_owner_id_fkey'), 'organizations', 'users', ['owner_id'], ['id']) + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + existing_nullable=True) + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_members_organization_id_fkey'), 'organization_members', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('organization_members_user_id_fkey'), 'organization_members', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id']) + op.create_foreign_key(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'geo_streets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_constraint(None, 'documents', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('documents_uploaded_by_fkey'), 'documents', 'users', ['uploaded_by'], ['id']) + op.drop_constraint(None, 'credit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('credit_logs_org_id_fkey'), 'credit_logs', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'audit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('audit_logs_user_id_fkey'), 'audit_logs', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('assets_catalog_id_fkey'), 'assets', 'vehicle_catalog', ['catalog_id'], ['id']) + op.drop_constraint(None, 'asset_telemetry', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_financials_asset_id_fkey'), 'asset_financials', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_events', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_events_asset_id_fkey'), 'asset_events', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_costs_asset_id_fkey'), 'asset_costs', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_driver_id_fkey'), 'asset_costs', 'users', ['driver_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_organization_id_fkey'), 'asset_costs', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'addresses', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('addresses_postal_code_id_fkey'), 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_index(op.f('ix_data_pending_actions_id'), table_name='pending_actions', schema='data') + op.drop_table('pending_actions', schema='data') + op.drop_index(op.f('ix_data_translations_lang_code'), table_name='translations', schema='data') + op.drop_index(op.f('ix_data_translations_key'), table_name='translations', schema='data') + op.drop_index(op.f('ix_data_translations_id'), table_name='translations', schema='data') + op.drop_table('translations', schema='data') + # ### end Alembic commands ### diff --git a/backend/migrations/versions_backup/143763d5d6fe_fix_member_is_verified.py b/backend/migrations/versions_backup/143763d5d6fe_fix_member_is_verified.py new file mode 100755 index 0000000..09fd3a8 --- /dev/null +++ b/backend/migrations/versions_backup/143763d5d6fe_fix_member_is_verified.py @@ -0,0 +1,218 @@ +"""fix_member_is_verified + +Revision ID: 143763d5d6fe +Revises: 492849ee0b3a +Create Date: 2026-02-12 22:55:59.491182 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = '143763d5d6fe' +down_revision: Union[str, Sequence[str], None] = '492849ee0b3a' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(op.f('addresses_postal_code_id_fkey'), 'addresses', type_='foreignkey') + op.create_foreign_key(None, 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', type_='foreignkey') + op.create_foreign_key(None, 'asset_assignments', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_costs_asset_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_driver_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_organization_id_fkey'), 'asset_costs', type_='foreignkey') + op.create_foreign_key(None, 'asset_costs', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'users', ['driver_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_events_asset_id_fkey'), 'asset_events', type_='foreignkey') + op.create_foreign_key(None, 'asset_events', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_financials_asset_id_fkey'), 'asset_financials', type_='foreignkey') + op.create_foreign_key(None, 'asset_financials', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', type_='foreignkey') + op.drop_constraint(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', type_='foreignkey') + op.create_foreign_key(None, 'asset_reviews', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_reviews', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', type_='foreignkey') + op.create_foreign_key(None, 'asset_telemetry', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('assets_catalog_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_current_organization_id_fkey'), 'assets', type_='foreignkey') + op.create_foreign_key(None, 'assets', 'vehicle_catalog', ['catalog_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'assets', 'organizations', ['current_organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('audit_logs_user_id_fkey'), 'audit_logs', type_='foreignkey') + op.create_foreign_key(None, 'audit_logs', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('credit_logs_org_id_fkey'), 'credit_logs', type_='foreignkey') + op.create_foreign_key(None, 'credit_logs', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('documents_uploaded_by_fkey'), 'documents', type_='foreignkey') + op.create_foreign_key(None, 'documents', 'users', ['uploaded_by'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', type_='foreignkey') + op.create_foreign_key(None, 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.drop_constraint(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.create_foreign_key(None, 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_subscriptions', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('organization_financials_organization_id_fkey'), 'organization_financials', type_='foreignkey') + op.create_foreign_key(None, 'organization_financials', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('organization_members', 'role', + existing_type=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole'), + type_=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole', schema='data', inherit_schema=True), + existing_nullable=True) + op.drop_constraint(op.f('organization_members_person_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_user_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_organization_id_fkey'), 'organization_members', type_='foreignkey') + op.create_foreign_key(None, 'organization_members', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organization_members', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organization_members', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + existing_nullable=True) + op.drop_constraint(op.f('organizations_address_id_fkey'), 'organizations', type_='foreignkey') + op.drop_constraint(op.f('organizations_owner_id_fkey'), 'organizations', type_='foreignkey') + op.create_foreign_key(None, 'organizations', 'users', ['owner_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organizations', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('pending_actions_requester_id_fkey'), 'pending_actions', type_='foreignkey') + op.drop_constraint(op.f('pending_actions_approver_id_fkey'), 'pending_actions', type_='foreignkey') + op.create_foreign_key(None, 'pending_actions', 'users', ['requester_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'pending_actions', 'users', ['approver_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('persons_address_id_fkey'), 'persons', type_='foreignkey') + op.create_foreign_key(None, 'persons', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('points_ledger_user_id_fkey'), 'points_ledger', type_='foreignkey') + op.create_foreign_key(None, 'points_ledger', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('ratings_author_id_fkey'), 'ratings', type_='foreignkey') + op.create_foreign_key(None, 'ratings', 'users', ['author_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_expertises_expertise_id_fkey'), 'service_expertises', type_='foreignkey') + op.drop_constraint(op.f('service_expertises_service_id_fkey'), 'service_expertises', type_='foreignkey') + op.create_foreign_key(None, 'service_expertises', 'expertise_tags', ['expertise_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'service_expertises', 'service_profiles', ['service_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_profiles_organization_id_fkey'), 'service_profiles', type_='foreignkey') + op.create_foreign_key(None, 'service_profiles', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_specialties_parent_id_fkey'), 'service_specialties', type_='foreignkey') + op.create_foreign_key(None, 'service_specialties', 'service_specialties', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('social_accounts_user_id_fkey'), 'social_accounts', type_='foreignkey') + op.create_foreign_key(None, 'social_accounts', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('user_badges_user_id_fkey'), 'user_badges', type_='foreignkey') + op.drop_constraint(op.f('user_badges_badge_id_fkey'), 'user_badges', type_='foreignkey') + op.create_foreign_key(None, 'user_badges', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'user_badges', 'badges', ['badge_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_stats_user_id_fkey'), 'user_stats', type_='foreignkey') + op.create_foreign_key(None, 'user_stats', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('users_person_id_fkey'), 'users', type_='foreignkey') + op.create_foreign_key(None, 'users', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.drop_constraint(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_ownerships', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', type_='foreignkey') + op.create_foreign_key(None, 'verification_tokens', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('wallets_user_id_fkey'), 'wallets', type_='foreignkey') + op.create_foreign_key(None, 'wallets', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'wallets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('wallets_user_id_fkey'), 'wallets', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'verification_tokens', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id']) + op.drop_constraint(None, 'users', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('users_person_id_fkey'), 'users', 'persons', ['person_id'], ['id']) + op.drop_constraint(None, 'user_stats', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_stats_user_id_fkey'), 'user_stats', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_badges_badge_id_fkey'), 'user_badges', 'badges', ['badge_id'], ['id']) + op.create_foreign_key(op.f('user_badges_user_id_fkey'), 'user_badges', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'social_accounts', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('social_accounts_user_id_fkey'), 'social_accounts', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'service_specialties', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_specialties_parent_id_fkey'), 'service_specialties', 'service_specialties', ['parent_id'], ['id']) + op.drop_constraint(None, 'service_profiles', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_profiles_organization_id_fkey'), 'service_profiles', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'service_expertises', schema='data', type_='foreignkey') + op.drop_constraint(None, 'service_expertises', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_expertises_service_id_fkey'), 'service_expertises', 'service_profiles', ['service_id'], ['id']) + op.create_foreign_key(op.f('service_expertises_expertise_id_fkey'), 'service_expertises', 'expertise_tags', ['expertise_id'], ['id']) + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('ratings_author_id_fkey'), 'ratings', 'users', ['author_id'], ['id']) + op.drop_constraint(None, 'points_ledger', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('points_ledger_user_id_fkey'), 'points_ledger', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'persons', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('persons_address_id_fkey'), 'persons', 'addresses', ['address_id'], ['id']) + op.drop_constraint(None, 'pending_actions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'pending_actions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('pending_actions_approver_id_fkey'), 'pending_actions', 'users', ['approver_id'], ['id']) + op.create_foreign_key(op.f('pending_actions_requester_id_fkey'), 'pending_actions', 'users', ['requester_id'], ['id']) + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organizations_owner_id_fkey'), 'organizations', 'users', ['owner_id'], ['id']) + op.create_foreign_key(op.f('organizations_address_id_fkey'), 'organizations', 'addresses', ['address_id'], ['id']) + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + existing_nullable=True) + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_members_organization_id_fkey'), 'organization_members', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('organization_members_user_id_fkey'), 'organization_members', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('organization_members_person_id_fkey'), 'organization_members', 'persons', ['person_id'], ['id']) + op.alter_column('organization_members', 'role', + existing_type=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole', schema='data', inherit_schema=True), + type_=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole'), + existing_nullable=True) + op.drop_constraint(None, 'organization_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_financials_organization_id_fkey'), 'organization_financials', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id']) + op.create_foreign_key(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'geo_streets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_constraint(None, 'documents', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('documents_uploaded_by_fkey'), 'documents', 'users', ['uploaded_by'], ['id']) + op.drop_constraint(None, 'credit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('credit_logs_org_id_fkey'), 'credit_logs', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'audit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('audit_logs_user_id_fkey'), 'audit_logs', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('assets_current_organization_id_fkey'), 'assets', 'organizations', ['current_organization_id'], ['id']) + op.create_foreign_key(op.f('assets_catalog_id_fkey'), 'assets', 'vehicle_catalog', ['catalog_id'], ['id']) + op.drop_constraint(None, 'asset_telemetry', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_financials_asset_id_fkey'), 'asset_financials', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_events', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_events_asset_id_fkey'), 'asset_events', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_costs_organization_id_fkey'), 'asset_costs', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_driver_id_fkey'), 'asset_costs', 'users', ['driver_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_asset_id_fkey'), 'asset_costs', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'addresses', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('addresses_postal_code_id_fkey'), 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id']) + # ### end Alembic commands ### diff --git a/backend/migrations/versions_backup/25afe6f4f063_identity_and_hybrid_org_update.py b/backend/migrations/versions_backup/25afe6f4f063_identity_and_hybrid_org_update.py new file mode 100755 index 0000000..6cefbf0 --- /dev/null +++ b/backend/migrations/versions_backup/25afe6f4f063_identity_and_hybrid_org_update.py @@ -0,0 +1,206 @@ +"""identity_and_hybrid_org_update + +Revision ID: 25afe6f4f063 +Revises: 398e76c2fa36 +Create Date: 2026-02-12 22:38:04.309546 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = '25afe6f4f063' +down_revision: Union[str, Sequence[str], None] = '398e76c2fa36' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + + # --- MANUÁLIS JAVÍTÁS: Enum típus létrehozása a sémában --- + org_user_role = postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole', schema='data') + org_user_role.create(op.get_bind(), checkfirst=True) + + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('organization_financials', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('organization_id', sa.Integer(), nullable=False), + sa.Column('year', sa.Integer(), nullable=False), + sa.Column('turnover', sa.Numeric(precision=18, scale=2), nullable=True), + sa.Column('profit', sa.Numeric(precision=18, scale=2), nullable=True), + sa.Column('employee_count', sa.Integer(), nullable=True), + sa.Column('source', sa.String(length=50), nullable=True), + sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), + sa.ForeignKeyConstraint(['organization_id'], ['data.organizations.id'], ), + sa.PrimaryKeyConstraint('id'), + schema='data' + ) + op.create_index(op.f('ix_data_organization_financials_id'), 'organization_financials', ['id'], unique=False, schema='data') + op.add_column('addresses', sa.Column('latitude', sa.Float(), nullable=True)) + op.add_column('addresses', sa.Column('longitude', sa.Float(), nullable=True)) + op.drop_constraint('addresses_postal_code_id_fkey', 'addresses', type_='foreignkey') + op.create_foreign_key(None, 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + + # Asset Assignments fix + op.drop_constraint('asset_assignments_asset_id_fkey', 'asset_assignments', type_='foreignkey') + op.drop_constraint('asset_assignments_organization_id_fkey', 'asset_assignments', type_='foreignkey') + op.create_foreign_key(None, 'asset_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_assignments', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + + # Asset Costs fix + op.drop_constraint('asset_costs_driver_id_fkey', 'asset_costs', type_='foreignkey') + op.drop_constraint('asset_costs_organization_id_fkey', 'asset_costs', type_='foreignkey') + op.drop_constraint('asset_costs_asset_id_fkey', 'asset_costs', type_='foreignkey') + op.create_foreign_key(None, 'asset_costs', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'users', ['driver_id'], ['id'], source_schema='data', referent_schema='data') + + # Egyéb Asset és Audit kapcsolatok + op.drop_constraint('asset_events_asset_id_fkey', 'asset_events', type_='foreignkey') + op.create_foreign_key(None, 'asset_events', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint('asset_financials_asset_id_fkey', 'asset_financials', type_='foreignkey') + op.create_foreign_key(None, 'asset_financials', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint('asset_reviews_user_id_fkey', 'asset_reviews', type_='foreignkey') + op.drop_constraint('asset_reviews_asset_id_fkey', 'asset_reviews', type_='foreignkey') + op.create_foreign_key(None, 'asset_reviews', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_reviews', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint('asset_telemetry_asset_id_fkey', 'asset_telemetry', type_='foreignkey') + op.create_foreign_key(None, 'asset_telemetry', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint('assets_catalog_id_fkey', 'assets', type_='foreignkey') + op.drop_constraint('assets_current_organization_id_fkey', 'assets', type_='foreignkey') + op.create_foreign_key(None, 'assets', 'vehicle_catalog', ['catalog_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'assets', 'organizations', ['current_organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint('audit_logs_user_id_fkey', 'audit_logs', type_='foreignkey') + op.create_foreign_key(None, 'audit_logs', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint('credit_logs_org_id_fkey', 'credit_logs', type_='foreignkey') + op.create_foreign_key(None, 'credit_logs', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint('documents_uploaded_by_fkey', 'documents', type_='foreignkey') + op.create_foreign_key(None, 'documents', 'users', ['uploaded_by'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint('geo_streets_postal_code_id_fkey', 'geo_streets', type_='foreignkey') + op.create_foreign_key(None, 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint('org_subscriptions_tier_id_fkey', 'org_subscriptions', type_='foreignkey') + op.drop_constraint('org_subscriptions_org_id_fkey', 'org_subscriptions', type_='foreignkey') + op.create_foreign_key(None, 'org_subscriptions', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id'], source_schema='data', referent_schema='data') + + # Organization Members kiegészítése + op.add_column('organization_members', sa.Column('person_id', sa.BigInteger(), nullable=True)) + op.add_column('organization_members', sa.Column('is_permanent', sa.Boolean(), nullable=True)) + op.alter_column('organization_members', 'user_id', existing_type=sa.INTEGER(), nullable=True) + + # ENUM casting fix (kisbetű nagybetűvé alakítás) + op.alter_column('organization_members', 'role', + existing_type=sa.VARCHAR(), + type_=org_user_role, + existing_nullable=True, + postgresql_using='UPPER(role)::data.orguserrole') + + op.drop_constraint('organization_members_organization_id_fkey', 'organization_members', type_='foreignkey') + op.drop_constraint('organization_members_user_id_fkey', 'organization_members', type_='foreignkey') + op.create_foreign_key(None, 'organization_members', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organization_members', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organization_members', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + + # Organization Schema fix + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + existing_nullable=True) + op.drop_constraint('organizations_owner_id_fkey', 'organizations', type_='foreignkey') + op.drop_constraint('organizations_address_id_fkey', 'organizations', type_='foreignkey') + op.create_foreign_key(None, 'organizations', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organizations', 'users', ['owner_id'], ['id'], source_schema='data', referent_schema='data') + + # Felesleges oszlopok törlése + op.drop_column('organizations', 'address_floor') + op.drop_column('organizations', 'verification_expires_at') + op.drop_column('organizations', 'is_transferable') + op.drop_column('organizations', 'address_door') + op.drop_column('organizations', 'address_stairwell') + + # Pending actions + op.drop_constraint('pending_actions_requester_id_fkey', 'pending_actions', type_='foreignkey') + op.drop_constraint('pending_actions_approver_id_fkey', 'pending_actions', type_='foreignkey') + op.create_foreign_key(None, 'pending_actions', 'users', ['approver_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'pending_actions', 'users', ['requester_id'], ['id'], source_schema='data', referent_schema='data') + + # Person és egyéb kapcsolatok + op.add_column('persons', sa.Column('is_ghost', sa.Boolean(), nullable=False, server_default='true')) + op.drop_constraint('persons_address_id_fkey', 'persons', type_='foreignkey') + op.create_foreign_key(None, 'persons', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint('points_ledger_user_id_fkey', 'points_ledger', type_='foreignkey') + op.create_foreign_key(None, 'points_ledger', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint('ratings_author_id_fkey', 'ratings', type_='foreignkey') + op.create_foreign_key(None, 'ratings', 'users', ['author_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint('service_expertises_expertise_id_fkey', 'service_expertises', type_='foreignkey') + op.drop_constraint('service_expertises_service_id_fkey', 'service_expertises', type_='foreignkey') + op.create_foreign_key(None, 'service_expertises', 'expertise_tags', ['expertise_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'service_expertises', 'service_profiles', ['service_id'], ['id'], source_schema='data', referent_schema='data') + + # Service Profile Enrichment + op.add_column('service_profiles', sa.Column('google_place_id', sa.String(length=100), nullable=True)) + op.add_column('service_profiles', sa.Column('rating', sa.Float(), nullable=True)) + op.add_column('service_profiles', sa.Column('user_ratings_total', sa.Integer(), nullable=True)) + op.add_column('service_profiles', sa.Column('specialization_tags', postgresql.JSONB(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), nullable=True)) + op.create_unique_constraint(None, 'service_profiles', ['google_place_id'], schema='data') + op.drop_constraint('service_profiles_organization_id_fkey', 'service_profiles', type_='foreignkey') + op.create_foreign_key(None, 'service_profiles', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint('service_specialties_parent_id_fkey', 'service_specialties', type_='foreignkey') + op.create_foreign_key(None, 'service_specialties', 'service_specialties', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + + # Social Accounts + op.drop_constraint('social_accounts_user_id_fkey', 'social_accounts', type_='foreignkey') + op.create_foreign_key(None, 'social_accounts', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + + # User / Wallet / Tokens + op.drop_constraint('user_badges_badge_id_fkey', 'user_badges', type_='foreignkey') + op.drop_constraint('user_badges_user_id_fkey', 'user_badges', type_='foreignkey') + op.create_foreign_key(None, 'user_badges', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'user_badges', 'badges', ['badge_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint('user_stats_user_id_fkey', 'user_stats', type_='foreignkey') + op.create_foreign_key(None, 'user_stats', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint('users_person_id_fkey', 'users', type_='foreignkey') + op.create_foreign_key(None, 'users', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint('vehicle_ownerships_user_id_fkey', 'vehicle_ownerships', type_='foreignkey') + op.drop_constraint('vehicle_ownerships_vehicle_id_fkey', 'vehicle_ownerships', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'vehicle_ownerships', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint('verification_tokens_user_id_fkey', 'verification_tokens', type_='foreignkey') + op.create_foreign_key(None, 'verification_tokens', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint('wallets_user_id_fkey', 'wallets', type_='foreignkey') + op.create_foreign_key(None, 'wallets', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + + +def downgrade() -> None: + """Downgrade schema.""" + org_user_role = postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole', schema='data') + + # Alap adatok visszagörgetése + op.drop_table('organization_financials', schema='data') + op.drop_index(op.f('ix_data_organization_financials_id'), table_name='organization_financials', schema='data') + op.drop_column('addresses', 'longitude') + op.drop_column('addresses', 'latitude') + + # Role visszaállítása (Stringre) + op.alter_column('organization_members', 'role', + existing_type=org_user_role, + type_=sa.VARCHAR(), + existing_nullable=True) + + op.drop_column('organization_members', 'is_permanent') + op.drop_column('organization_members', 'person_id') + op.drop_column('persons', 'is_ghost') + + # Service Profile takarítás + op.drop_constraint(None, 'service_profiles', schema='data', type_='unique') + op.drop_column('service_profiles', 'specialization_tags') + op.drop_column('service_profiles', 'user_ratings_total') + op.drop_column('service_profiles', 'rating') + op.drop_column('service_profiles', 'google_place_id') + + # Enum törlése legutoljára + org_user_role.drop(op.get_bind(), checkfirst=True) \ No newline at end of file diff --git a/backend/migrations/versions_backup/2cfe9285eb9d_fix_identity_scope_and_finalize_asset_.py b/backend/migrations/versions_backup/2cfe9285eb9d_fix_identity_scope_and_finalize_asset_.py new file mode 100755 index 0000000..49204fa --- /dev/null +++ b/backend/migrations/versions_backup/2cfe9285eb9d_fix_identity_scope_and_finalize_asset_.py @@ -0,0 +1,222 @@ +"""fix_identity_scope_and_finalize_asset_costs + +Revision ID: 2cfe9285eb9d +Revises: 0adbe75a0b3f +Create Date: 2026-02-10 09:47:16.879385 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = '2cfe9285eb9d' +down_revision: Union[str, Sequence[str], None] = '0adbe75a0b3f' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(op.f('addresses_postal_code_id_fkey'), 'addresses', type_='foreignkey') + op.create_foreign_key(None, 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', type_='foreignkey') + op.create_foreign_key(None, 'asset_assignments', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.add_column('asset_costs', sa.Column('amount_local', sa.Numeric(precision=18, scale=2), nullable=False)) + op.add_column('asset_costs', sa.Column('currency_local', sa.String(length=3), nullable=False)) + op.add_column('asset_costs', sa.Column('amount_eur', sa.Numeric(precision=18, scale=2), nullable=True)) + op.add_column('asset_costs', sa.Column('net_amount_local', sa.Numeric(precision=18, scale=2), nullable=True)) + op.add_column('asset_costs', sa.Column('exchange_rate_used', sa.Numeric(precision=18, scale=6), nullable=True)) + op.drop_constraint(op.f('asset_costs_asset_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_organization_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_driver_id_fkey'), 'asset_costs', type_='foreignkey') + op.create_foreign_key(None, 'asset_costs', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'users', ['driver_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('asset_costs', 'currency') + op.drop_column('asset_costs', 'amount') + op.drop_column('asset_costs', 'exchange_rate_at_cost') + op.drop_column('asset_costs', 'net_amount') + op.drop_constraint(op.f('asset_events_asset_id_fkey'), 'asset_events', type_='foreignkey') + op.create_foreign_key(None, 'asset_events', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_financials_asset_id_fkey'), 'asset_financials', type_='foreignkey') + op.create_foreign_key(None, 'asset_financials', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', type_='foreignkey') + op.drop_constraint(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', type_='foreignkey') + op.create_foreign_key(None, 'asset_reviews', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_reviews', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', type_='foreignkey') + op.create_foreign_key(None, 'asset_telemetry', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('assets_catalog_id_fkey'), 'assets', type_='foreignkey') + op.create_foreign_key(None, 'assets', 'vehicle_catalog', ['catalog_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('audit_logs_user_id_fkey'), 'audit_logs', type_='foreignkey') + op.create_foreign_key(None, 'audit_logs', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('credit_logs_org_id_fkey'), 'credit_logs', type_='foreignkey') + op.create_foreign_key(None, 'credit_logs', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('documents_uploaded_by_fkey'), 'documents', type_='foreignkey') + op.create_foreign_key(None, 'documents', 'users', ['uploaded_by'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('exchange_rates', 'rate', + existing_type=sa.NUMERIC(precision=18, scale=6), + nullable=False) + op.create_unique_constraint(None, 'exchange_rates', ['target_currency'], schema='data') + op.drop_constraint(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', type_='foreignkey') + op.create_foreign_key(None, 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.drop_constraint(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.create_foreign_key(None, 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_subscriptions', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('organization_members_organization_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_user_id_fkey'), 'organization_members', type_='foreignkey') + op.create_foreign_key(None, 'organization_members', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organization_members', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + existing_nullable=True) + op.drop_constraint(op.f('organizations_address_id_fkey'), 'organizations', type_='foreignkey') + op.drop_constraint(op.f('organizations_owner_id_fkey'), 'organizations', type_='foreignkey') + op.create_foreign_key(None, 'organizations', 'users', ['owner_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organizations', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('persons_address_id_fkey'), 'persons', type_='foreignkey') + op.create_foreign_key(None, 'persons', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('points_ledger_user_id_fkey'), 'points_ledger', type_='foreignkey') + op.create_foreign_key(None, 'points_ledger', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('ratings_author_id_fkey'), 'ratings', type_='foreignkey') + op.create_foreign_key(None, 'ratings', 'users', ['author_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_specialties_parent_id_fkey'), 'service_specialties', type_='foreignkey') + op.create_foreign_key(None, 'service_specialties', 'service_specialties', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('system_parameters', 'key', + existing_type=sa.VARCHAR(length=50), + nullable=False) + op.alter_column('system_parameters', 'value', + existing_type=postgresql.JSON(astext_type=sa.Text()), + nullable=False) + op.drop_constraint(op.f('user_badges_badge_id_fkey'), 'user_badges', type_='foreignkey') + op.drop_constraint(op.f('user_badges_user_id_fkey'), 'user_badges', type_='foreignkey') + op.create_foreign_key(None, 'user_badges', 'badges', ['badge_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'user_badges', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_stats_user_id_fkey'), 'user_stats', type_='foreignkey') + op.create_foreign_key(None, 'user_stats', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('users', 'custom_permissions', + existing_type=postgresql.JSONB(astext_type=sa.Text()), + type_=sa.JSON(), + existing_nullable=True, + existing_server_default=sa.text("'{}'::jsonb")) + op.drop_constraint(op.f('users_person_id_fkey'), 'users', type_='foreignkey') + op.create_foreign_key(None, 'users', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.drop_constraint(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_ownerships', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', type_='foreignkey') + op.create_foreign_key(None, 'verification_tokens', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('wallets_user_id_fkey'), 'wallets', type_='foreignkey') + op.create_foreign_key(None, 'wallets', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'wallets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('wallets_user_id_fkey'), 'wallets', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'verification_tokens', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id']) + op.create_foreign_key(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'users', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('users_person_id_fkey'), 'users', 'persons', ['person_id'], ['id']) + op.alter_column('users', 'custom_permissions', + existing_type=sa.JSON(), + type_=postgresql.JSONB(astext_type=sa.Text()), + existing_nullable=True, + existing_server_default=sa.text("'{}'::jsonb")) + op.drop_constraint(None, 'user_stats', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_stats_user_id_fkey'), 'user_stats', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_badges_user_id_fkey'), 'user_badges', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('user_badges_badge_id_fkey'), 'user_badges', 'badges', ['badge_id'], ['id']) + op.alter_column('system_parameters', 'value', + existing_type=postgresql.JSON(astext_type=sa.Text()), + nullable=True) + op.alter_column('system_parameters', 'key', + existing_type=sa.VARCHAR(length=50), + nullable=True) + op.drop_constraint(None, 'service_specialties', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_specialties_parent_id_fkey'), 'service_specialties', 'service_specialties', ['parent_id'], ['id']) + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('ratings_author_id_fkey'), 'ratings', 'users', ['author_id'], ['id']) + op.drop_constraint(None, 'points_ledger', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('points_ledger_user_id_fkey'), 'points_ledger', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'persons', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('persons_address_id_fkey'), 'persons', 'addresses', ['address_id'], ['id']) + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organizations_owner_id_fkey'), 'organizations', 'users', ['owner_id'], ['id']) + op.create_foreign_key(op.f('organizations_address_id_fkey'), 'organizations', 'addresses', ['address_id'], ['id']) + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + existing_nullable=True) + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_members_user_id_fkey'), 'organization_members', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('organization_members_organization_id_fkey'), 'organization_members', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id']) + op.create_foreign_key(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'geo_streets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_constraint(None, 'exchange_rates', schema='data', type_='unique') + op.alter_column('exchange_rates', 'rate', + existing_type=sa.NUMERIC(precision=18, scale=6), + nullable=True) + op.drop_constraint(None, 'documents', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('documents_uploaded_by_fkey'), 'documents', 'users', ['uploaded_by'], ['id']) + op.drop_constraint(None, 'credit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('credit_logs_org_id_fkey'), 'credit_logs', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'audit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('audit_logs_user_id_fkey'), 'audit_logs', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('assets_catalog_id_fkey'), 'assets', 'vehicle_catalog', ['catalog_id'], ['id']) + op.drop_constraint(None, 'asset_telemetry', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'asset_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_financials_asset_id_fkey'), 'asset_financials', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_events', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_events_asset_id_fkey'), 'asset_events', 'assets', ['asset_id'], ['id']) + op.add_column('asset_costs', sa.Column('net_amount', sa.NUMERIC(precision=18, scale=2), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('exchange_rate_at_cost', sa.NUMERIC(precision=18, scale=6), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('amount', sa.NUMERIC(precision=18, scale=2), autoincrement=False, nullable=False)) + op.add_column('asset_costs', sa.Column('currency', sa.VARCHAR(length=3), autoincrement=False, nullable=True)) + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_costs_driver_id_fkey'), 'asset_costs', 'users', ['driver_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_organization_id_fkey'), 'asset_costs', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_asset_id_fkey'), 'asset_costs', 'assets', ['asset_id'], ['id']) + op.drop_column('asset_costs', 'exchange_rate_used') + op.drop_column('asset_costs', 'net_amount_local') + op.drop_column('asset_costs', 'amount_eur') + op.drop_column('asset_costs', 'currency_local') + op.drop_column('asset_costs', 'amount_local') + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'addresses', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('addresses_postal_code_id_fkey'), 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id']) + # ### end Alembic commands ### diff --git a/backend/migrations/versions_backup/398e76c2fa36_audit_and_moderation_fields.py b/backend/migrations/versions_backup/398e76c2fa36_audit_and_moderation_fields.py new file mode 100755 index 0000000..274ca84 --- /dev/null +++ b/backend/migrations/versions_backup/398e76c2fa36_audit_and_moderation_fields.py @@ -0,0 +1,296 @@ +"""audit_and_moderation_fields + +Revision ID: 398e76c2fa36 +Revises: 9b20430f0ebb +Create Date: 2026-02-12 19:48:09.530752 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = '398e76c2fa36' +down_revision: Union[str, Sequence[str], None] = '9b20430f0ebb' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(op.f('addresses_postal_code_id_fkey'), 'addresses', type_='foreignkey') + op.create_foreign_key(None, 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', type_='foreignkey') + op.create_foreign_key(None, 'asset_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_assignments', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.add_column('asset_costs', sa.Column('net_amount_local', sa.Numeric(precision=18, scale=2), nullable=True)) + op.add_column('asset_costs', sa.Column('vat_rate', sa.Numeric(precision=5, scale=2), nullable=True)) + op.add_column('asset_costs', sa.Column('exchange_rate_used', sa.Numeric(precision=18, scale=6), nullable=True)) + op.alter_column('asset_costs', 'data', + existing_type=postgresql.JSON(astext_type=sa.Text()), + type_=postgresql.JSONB(astext_type=sa.Text()), + existing_nullable=True, + existing_server_default=sa.text("'{}'::jsonb")) + op.drop_constraint(op.f('asset_costs_organization_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_driver_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_asset_id_fkey'), 'asset_costs', type_='foreignkey') + op.create_foreign_key(None, 'asset_costs', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'users', ['driver_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('asset_events', 'data', + existing_type=postgresql.JSON(astext_type=sa.Text()), + type_=postgresql.JSONB(astext_type=sa.Text()), + existing_nullable=True, + existing_server_default=sa.text("'{}'::jsonb")) + op.drop_constraint(op.f('asset_events_asset_id_fkey'), 'asset_events', type_='foreignkey') + op.create_foreign_key(None, 'asset_events', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_financials_asset_id_fkey'), 'asset_financials', type_='foreignkey') + op.create_foreign_key(None, 'asset_financials', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('asset_reviews', 'criteria_scores', + existing_type=postgresql.JSON(astext_type=sa.Text()), + type_=postgresql.JSONB(astext_type=sa.Text()), + existing_nullable=True, + existing_server_default=sa.text("'{}'::jsonb")) + op.drop_constraint(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', type_='foreignkey') + op.drop_constraint(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', type_='foreignkey') + op.create_foreign_key(None, 'asset_reviews', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_reviews', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', type_='foreignkey') + op.create_foreign_key(None, 'asset_telemetry', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.add_column('assets', sa.Column('verification_notes', sa.Text(), nullable=True)) + op.add_column('assets', sa.Column('catalog_match_score', sa.Numeric(precision=5, scale=2), nullable=True)) + op.drop_constraint(op.f('assets_current_organization_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_catalog_id_fkey'), 'assets', type_='foreignkey') + op.create_foreign_key(None, 'assets', 'organizations', ['current_organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'assets', 'vehicle_catalog', ['catalog_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('audit_logs_user_id_fkey'), 'audit_logs', type_='foreignkey') + op.create_foreign_key(None, 'audit_logs', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('credit_logs_org_id_fkey'), 'credit_logs', type_='foreignkey') + op.create_foreign_key(None, 'credit_logs', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('documents_uploaded_by_fkey'), 'documents', type_='foreignkey') + op.create_foreign_key(None, 'documents', 'users', ['uploaded_by'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('exchange_rates', 'updated_at') + op.alter_column('expertise_tags', 'key', + existing_type=sa.VARCHAR(length=50), + nullable=True) + op.drop_constraint(op.f('expertise_tags_key_key'), 'expertise_tags', type_='unique') + op.create_index(op.f('ix_data_expertise_tags_key'), 'expertise_tags', ['key'], unique=True, schema='data') + op.drop_constraint(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', type_='foreignkey') + op.create_foreign_key(None, 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.drop_constraint(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.create_foreign_key(None, 'org_subscriptions', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('organization_members_organization_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_user_id_fkey'), 'organization_members', type_='foreignkey') + op.create_foreign_key(None, 'organization_members', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organization_members', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + existing_nullable=True) + op.drop_constraint(op.f('organizations_owner_id_fkey'), 'organizations', type_='foreignkey') + op.drop_constraint(op.f('organizations_address_id_fkey'), 'organizations', type_='foreignkey') + op.create_foreign_key(None, 'organizations', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organizations', 'users', ['owner_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('pending_actions_approver_id_fkey'), 'pending_actions', type_='foreignkey') + op.drop_constraint(op.f('pending_actions_requester_id_fkey'), 'pending_actions', type_='foreignkey') + op.create_foreign_key(None, 'pending_actions', 'users', ['approver_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'pending_actions', 'users', ['requester_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('persons_address_id_fkey'), 'persons', type_='foreignkey') + op.create_foreign_key(None, 'persons', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('points_ledger_user_id_fkey'), 'points_ledger', type_='foreignkey') + op.create_foreign_key(None, 'points_ledger', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('ratings_author_id_fkey'), 'ratings', type_='foreignkey') + op.create_foreign_key(None, 'ratings', 'users', ['author_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_expertises_expertise_id_fkey'), 'service_expertises', type_='foreignkey') + op.drop_constraint(op.f('service_expertises_service_id_fkey'), 'service_expertises', type_='foreignkey') + op.create_foreign_key(None, 'service_expertises', 'service_profiles', ['service_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'service_expertises', 'expertise_tags', ['expertise_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('service_profiles', 'verification_log', + existing_type=postgresql.JSONB(astext_type=sa.Text()), + type_=sa.JSON(), + existing_nullable=True, + existing_server_default=sa.text("'{}'::jsonb")) + op.alter_column('service_profiles', 'opening_hours', + existing_type=postgresql.JSONB(astext_type=sa.Text()), + type_=sa.JSON(), + existing_nullable=True, + existing_server_default=sa.text("'{}'::jsonb")) + op.create_index(op.f('ix_data_service_profiles_id'), 'service_profiles', ['id'], unique=False, schema='data') + op.create_index(op.f('ix_data_service_profiles_location'), 'service_profiles', ['location'], unique=False, schema='data') + op.create_index(op.f('ix_data_service_profiles_status'), 'service_profiles', ['status'], unique=False, schema='data') + op.drop_constraint(op.f('service_profiles_organization_id_fkey'), 'service_profiles', type_='foreignkey') + op.create_foreign_key(None, 'service_profiles', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_specialties_parent_id_fkey'), 'service_specialties', type_='foreignkey') + op.create_foreign_key(None, 'service_specialties', 'service_specialties', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('social_accounts_user_id_fkey'), 'social_accounts', type_='foreignkey') + op.create_foreign_key(None, 'social_accounts', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('user_badges_badge_id_fkey'), 'user_badges', type_='foreignkey') + op.drop_constraint(op.f('user_badges_user_id_fkey'), 'user_badges', type_='foreignkey') + op.create_foreign_key(None, 'user_badges', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'user_badges', 'badges', ['badge_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_stats_user_id_fkey'), 'user_stats', type_='foreignkey') + op.create_foreign_key(None, 'user_stats', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('users_person_id_fkey'), 'users', type_='foreignkey') + op.create_foreign_key(None, 'users', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('vehicle_catalog', 'factory_data', + existing_type=postgresql.JSON(astext_type=sa.Text()), + type_=postgresql.JSONB(astext_type=sa.Text()), + existing_nullable=True, + existing_server_default=sa.text("'{}'::jsonb")) + op.create_index(op.f('ix_data_vehicle_catalog_engine_variant'), 'vehicle_catalog', ['engine_variant'], unique=False, schema='data') + op.create_index(op.f('ix_data_vehicle_catalog_fuel_type'), 'vehicle_catalog', ['fuel_type'], unique=False, schema='data') + op.create_unique_constraint('uix_vehicle_catalog_full', 'vehicle_catalog', ['make', 'model', 'year_from', 'engine_variant', 'fuel_type'], schema='data') + op.drop_constraint(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.drop_constraint(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_ownerships', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', type_='foreignkey') + op.create_foreign_key(None, 'verification_tokens', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('wallets_user_id_fkey'), 'wallets', type_='foreignkey') + op.create_foreign_key(None, 'wallets', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'wallets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('wallets_user_id_fkey'), 'wallets', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'verification_tokens', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id']) + op.create_foreign_key(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', 'users', ['user_id'], ['id']) + op.drop_constraint('uix_vehicle_catalog_full', 'vehicle_catalog', schema='data', type_='unique') + op.drop_index(op.f('ix_data_vehicle_catalog_fuel_type'), table_name='vehicle_catalog', schema='data') + op.drop_index(op.f('ix_data_vehicle_catalog_engine_variant'), table_name='vehicle_catalog', schema='data') + op.alter_column('vehicle_catalog', 'factory_data', + existing_type=postgresql.JSONB(astext_type=sa.Text()), + type_=postgresql.JSON(astext_type=sa.Text()), + existing_nullable=True, + existing_server_default=sa.text("'{}'::jsonb")) + op.drop_constraint(None, 'users', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('users_person_id_fkey'), 'users', 'persons', ['person_id'], ['id']) + op.drop_constraint(None, 'user_stats', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_stats_user_id_fkey'), 'user_stats', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_badges_user_id_fkey'), 'user_badges', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('user_badges_badge_id_fkey'), 'user_badges', 'badges', ['badge_id'], ['id']) + op.drop_constraint(None, 'social_accounts', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('social_accounts_user_id_fkey'), 'social_accounts', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'service_specialties', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_specialties_parent_id_fkey'), 'service_specialties', 'service_specialties', ['parent_id'], ['id']) + op.drop_constraint(None, 'service_profiles', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_profiles_organization_id_fkey'), 'service_profiles', 'organizations', ['organization_id'], ['id']) + op.drop_index(op.f('ix_data_service_profiles_status'), table_name='service_profiles', schema='data') + op.drop_index(op.f('ix_data_service_profiles_location'), table_name='service_profiles', schema='data') + op.drop_index(op.f('ix_data_service_profiles_id'), table_name='service_profiles', schema='data') + op.alter_column('service_profiles', 'opening_hours', + existing_type=sa.JSON(), + type_=postgresql.JSONB(astext_type=sa.Text()), + existing_nullable=True, + existing_server_default=sa.text("'{}'::jsonb")) + op.alter_column('service_profiles', 'verification_log', + existing_type=sa.JSON(), + type_=postgresql.JSONB(astext_type=sa.Text()), + existing_nullable=True, + existing_server_default=sa.text("'{}'::jsonb")) + op.drop_constraint(None, 'service_expertises', schema='data', type_='foreignkey') + op.drop_constraint(None, 'service_expertises', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_expertises_service_id_fkey'), 'service_expertises', 'service_profiles', ['service_id'], ['id']) + op.create_foreign_key(op.f('service_expertises_expertise_id_fkey'), 'service_expertises', 'expertise_tags', ['expertise_id'], ['id']) + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('ratings_author_id_fkey'), 'ratings', 'users', ['author_id'], ['id']) + op.drop_constraint(None, 'points_ledger', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('points_ledger_user_id_fkey'), 'points_ledger', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'persons', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('persons_address_id_fkey'), 'persons', 'addresses', ['address_id'], ['id']) + op.drop_constraint(None, 'pending_actions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'pending_actions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('pending_actions_requester_id_fkey'), 'pending_actions', 'users', ['requester_id'], ['id']) + op.create_foreign_key(op.f('pending_actions_approver_id_fkey'), 'pending_actions', 'users', ['approver_id'], ['id']) + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organizations_address_id_fkey'), 'organizations', 'addresses', ['address_id'], ['id']) + op.create_foreign_key(op.f('organizations_owner_id_fkey'), 'organizations', 'users', ['owner_id'], ['id']) + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + existing_nullable=True) + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_members_user_id_fkey'), 'organization_members', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('organization_members_organization_id_fkey'), 'organization_members', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id']) + op.create_foreign_key(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'geo_streets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_index(op.f('ix_data_expertise_tags_key'), table_name='expertise_tags', schema='data') + op.create_unique_constraint(op.f('expertise_tags_key_key'), 'expertise_tags', ['key'], postgresql_nulls_not_distinct=False) + op.alter_column('expertise_tags', 'key', + existing_type=sa.VARCHAR(length=50), + nullable=False) + op.add_column('exchange_rates', sa.Column('updated_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=True)) + op.drop_constraint(None, 'documents', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('documents_uploaded_by_fkey'), 'documents', 'users', ['uploaded_by'], ['id']) + op.drop_constraint(None, 'credit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('credit_logs_org_id_fkey'), 'credit_logs', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'audit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('audit_logs_user_id_fkey'), 'audit_logs', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('assets_catalog_id_fkey'), 'assets', 'vehicle_catalog', ['catalog_id'], ['id']) + op.create_foreign_key(op.f('assets_current_organization_id_fkey'), 'assets', 'organizations', ['current_organization_id'], ['id']) + op.drop_column('assets', 'catalog_match_score') + op.drop_column('assets', 'verification_notes') + op.drop_constraint(None, 'asset_telemetry', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', 'users', ['user_id'], ['id']) + op.alter_column('asset_reviews', 'criteria_scores', + existing_type=postgresql.JSONB(astext_type=sa.Text()), + type_=postgresql.JSON(astext_type=sa.Text()), + existing_nullable=True, + existing_server_default=sa.text("'{}'::jsonb")) + op.drop_constraint(None, 'asset_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_financials_asset_id_fkey'), 'asset_financials', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_events', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_events_asset_id_fkey'), 'asset_events', 'assets', ['asset_id'], ['id']) + op.alter_column('asset_events', 'data', + existing_type=postgresql.JSONB(astext_type=sa.Text()), + type_=postgresql.JSON(astext_type=sa.Text()), + existing_nullable=True, + existing_server_default=sa.text("'{}'::jsonb")) + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_costs_asset_id_fkey'), 'asset_costs', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_driver_id_fkey'), 'asset_costs', 'users', ['driver_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_organization_id_fkey'), 'asset_costs', 'organizations', ['organization_id'], ['id']) + op.alter_column('asset_costs', 'data', + existing_type=postgresql.JSONB(astext_type=sa.Text()), + type_=postgresql.JSON(astext_type=sa.Text()), + existing_nullable=True, + existing_server_default=sa.text("'{}'::jsonb")) + op.drop_column('asset_costs', 'exchange_rate_used') + op.drop_column('asset_costs', 'vat_rate') + op.drop_column('asset_costs', 'net_amount_local') + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'addresses', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('addresses_postal_code_id_fkey'), 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id']) + # ### end Alembic commands ### diff --git a/backend/migrations/versions_backup/492849ee0b3a_add_is_verified_to_members.py b/backend/migrations/versions_backup/492849ee0b3a_add_is_verified_to_members.py new file mode 100755 index 0000000..e96d6cc --- /dev/null +++ b/backend/migrations/versions_backup/492849ee0b3a_add_is_verified_to_members.py @@ -0,0 +1,220 @@ +"""add_is_verified_to_members + +Revision ID: 492849ee0b3a +Revises: 25afe6f4f063 +Create Date: 2026-02-12 22:54:06.389304 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = '492849ee0b3a' +down_revision: Union[str, Sequence[str], None] = '25afe6f4f063' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(op.f('addresses_postal_code_id_fkey'), 'addresses', type_='foreignkey') + op.create_foreign_key(None, 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', type_='foreignkey') + op.create_foreign_key(None, 'asset_assignments', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_costs_driver_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_asset_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_organization_id_fkey'), 'asset_costs', type_='foreignkey') + op.create_foreign_key(None, 'asset_costs', 'users', ['driver_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_events_asset_id_fkey'), 'asset_events', type_='foreignkey') + op.create_foreign_key(None, 'asset_events', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_financials_asset_id_fkey'), 'asset_financials', type_='foreignkey') + op.create_foreign_key(None, 'asset_financials', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', type_='foreignkey') + op.drop_constraint(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', type_='foreignkey') + op.create_foreign_key(None, 'asset_reviews', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_reviews', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', type_='foreignkey') + op.create_foreign_key(None, 'asset_telemetry', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('assets_current_organization_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_catalog_id_fkey'), 'assets', type_='foreignkey') + op.create_foreign_key(None, 'assets', 'vehicle_catalog', ['catalog_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'assets', 'organizations', ['current_organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('audit_logs_user_id_fkey'), 'audit_logs', type_='foreignkey') + op.create_foreign_key(None, 'audit_logs', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('credit_logs_org_id_fkey'), 'credit_logs', type_='foreignkey') + op.create_foreign_key(None, 'credit_logs', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('documents_uploaded_by_fkey'), 'documents', type_='foreignkey') + op.create_foreign_key(None, 'documents', 'users', ['uploaded_by'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', type_='foreignkey') + op.create_foreign_key(None, 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.drop_constraint(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.create_foreign_key(None, 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_subscriptions', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('organization_financials_organization_id_fkey'), 'organization_financials', type_='foreignkey') + op.create_foreign_key(None, 'organization_financials', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.add_column('organization_members', sa.Column('is_verified', sa.Boolean(), nullable=True)) + op.alter_column('organization_members', 'role', + existing_type=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole'), + type_=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole', schema='data', inherit_schema=True), + existing_nullable=True) + op.drop_constraint(op.f('organization_members_organization_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_user_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_person_id_fkey'), 'organization_members', type_='foreignkey') + op.create_foreign_key(None, 'organization_members', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organization_members', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organization_members', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + existing_nullable=True) + op.drop_constraint(op.f('organizations_owner_id_fkey'), 'organizations', type_='foreignkey') + op.drop_constraint(op.f('organizations_address_id_fkey'), 'organizations', type_='foreignkey') + op.create_foreign_key(None, 'organizations', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organizations', 'users', ['owner_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('pending_actions_approver_id_fkey'), 'pending_actions', type_='foreignkey') + op.drop_constraint(op.f('pending_actions_requester_id_fkey'), 'pending_actions', type_='foreignkey') + op.create_foreign_key(None, 'pending_actions', 'users', ['requester_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'pending_actions', 'users', ['approver_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('persons_address_id_fkey'), 'persons', type_='foreignkey') + op.create_foreign_key(None, 'persons', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('points_ledger_user_id_fkey'), 'points_ledger', type_='foreignkey') + op.create_foreign_key(None, 'points_ledger', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('ratings_author_id_fkey'), 'ratings', type_='foreignkey') + op.create_foreign_key(None, 'ratings', 'users', ['author_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_expertises_expertise_id_fkey'), 'service_expertises', type_='foreignkey') + op.drop_constraint(op.f('service_expertises_service_id_fkey'), 'service_expertises', type_='foreignkey') + op.create_foreign_key(None, 'service_expertises', 'service_profiles', ['service_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'service_expertises', 'expertise_tags', ['expertise_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_profiles_organization_id_fkey'), 'service_profiles', type_='foreignkey') + op.create_foreign_key(None, 'service_profiles', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_specialties_parent_id_fkey'), 'service_specialties', type_='foreignkey') + op.create_foreign_key(None, 'service_specialties', 'service_specialties', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('social_accounts_user_id_fkey'), 'social_accounts', type_='foreignkey') + op.create_foreign_key(None, 'social_accounts', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('user_badges_user_id_fkey'), 'user_badges', type_='foreignkey') + op.drop_constraint(op.f('user_badges_badge_id_fkey'), 'user_badges', type_='foreignkey') + op.create_foreign_key(None, 'user_badges', 'badges', ['badge_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'user_badges', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_stats_user_id_fkey'), 'user_stats', type_='foreignkey') + op.create_foreign_key(None, 'user_stats', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('users_person_id_fkey'), 'users', type_='foreignkey') + op.create_foreign_key(None, 'users', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.drop_constraint(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_ownerships', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', type_='foreignkey') + op.create_foreign_key(None, 'verification_tokens', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('wallets_user_id_fkey'), 'wallets', type_='foreignkey') + op.create_foreign_key(None, 'wallets', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'wallets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('wallets_user_id_fkey'), 'wallets', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'verification_tokens', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id']) + op.create_foreign_key(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'users', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('users_person_id_fkey'), 'users', 'persons', ['person_id'], ['id']) + op.drop_constraint(None, 'user_stats', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_stats_user_id_fkey'), 'user_stats', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_badges_badge_id_fkey'), 'user_badges', 'badges', ['badge_id'], ['id']) + op.create_foreign_key(op.f('user_badges_user_id_fkey'), 'user_badges', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'social_accounts', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('social_accounts_user_id_fkey'), 'social_accounts', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'service_specialties', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_specialties_parent_id_fkey'), 'service_specialties', 'service_specialties', ['parent_id'], ['id']) + op.drop_constraint(None, 'service_profiles', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_profiles_organization_id_fkey'), 'service_profiles', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'service_expertises', schema='data', type_='foreignkey') + op.drop_constraint(None, 'service_expertises', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_expertises_service_id_fkey'), 'service_expertises', 'service_profiles', ['service_id'], ['id']) + op.create_foreign_key(op.f('service_expertises_expertise_id_fkey'), 'service_expertises', 'expertise_tags', ['expertise_id'], ['id']) + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('ratings_author_id_fkey'), 'ratings', 'users', ['author_id'], ['id']) + op.drop_constraint(None, 'points_ledger', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('points_ledger_user_id_fkey'), 'points_ledger', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'persons', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('persons_address_id_fkey'), 'persons', 'addresses', ['address_id'], ['id']) + op.drop_constraint(None, 'pending_actions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'pending_actions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('pending_actions_requester_id_fkey'), 'pending_actions', 'users', ['requester_id'], ['id']) + op.create_foreign_key(op.f('pending_actions_approver_id_fkey'), 'pending_actions', 'users', ['approver_id'], ['id']) + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organizations_address_id_fkey'), 'organizations', 'addresses', ['address_id'], ['id']) + op.create_foreign_key(op.f('organizations_owner_id_fkey'), 'organizations', 'users', ['owner_id'], ['id']) + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + existing_nullable=True) + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_members_person_id_fkey'), 'organization_members', 'persons', ['person_id'], ['id']) + op.create_foreign_key(op.f('organization_members_user_id_fkey'), 'organization_members', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('organization_members_organization_id_fkey'), 'organization_members', 'organizations', ['organization_id'], ['id']) + op.alter_column('organization_members', 'role', + existing_type=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole', schema='data', inherit_schema=True), + type_=postgresql.ENUM('OWNER', 'ADMIN', 'FLEET_MANAGER', 'DRIVER', 'MECHANIC', 'RECEPTIONIST', name='orguserrole'), + existing_nullable=True) + op.drop_column('organization_members', 'is_verified') + op.drop_constraint(None, 'organization_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_financials_organization_id_fkey'), 'organization_financials', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id']) + op.create_foreign_key(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'geo_streets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_constraint(None, 'documents', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('documents_uploaded_by_fkey'), 'documents', 'users', ['uploaded_by'], ['id']) + op.drop_constraint(None, 'credit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('credit_logs_org_id_fkey'), 'credit_logs', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'audit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('audit_logs_user_id_fkey'), 'audit_logs', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('assets_catalog_id_fkey'), 'assets', 'vehicle_catalog', ['catalog_id'], ['id']) + op.create_foreign_key(op.f('assets_current_organization_id_fkey'), 'assets', 'organizations', ['current_organization_id'], ['id']) + op.drop_constraint(None, 'asset_telemetry', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'asset_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_financials_asset_id_fkey'), 'asset_financials', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_events', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_events_asset_id_fkey'), 'asset_events', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_costs_organization_id_fkey'), 'asset_costs', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_asset_id_fkey'), 'asset_costs', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_driver_id_fkey'), 'asset_costs', 'users', ['driver_id'], ['id']) + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'addresses', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('addresses_postal_code_id_fkey'), 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id']) + # ### end Alembic commands ### diff --git a/backend/migrations/versions_backup/6197bfddfb4f_add_lang_and_region_to_user.py b/backend/migrations/versions_backup/6197bfddfb4f_add_lang_and_region_to_user.py new file mode 100755 index 0000000..7d0c857 --- /dev/null +++ b/backend/migrations/versions_backup/6197bfddfb4f_add_lang_and_region_to_user.py @@ -0,0 +1,186 @@ +"""add_lang_and_region_to_user + +Revision ID: 6197bfddfb4f +Revises: 134d92edd430 +Create Date: 2026-02-10 20:46:57.170479 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = '6197bfddfb4f' +down_revision: Union[str, Sequence[str], None] = '134d92edd430' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(op.f('addresses_postal_code_id_fkey'), 'addresses', type_='foreignkey') + op.create_foreign_key(None, 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', type_='foreignkey') + op.create_foreign_key(None, 'asset_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_assignments', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_costs_asset_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_organization_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_driver_id_fkey'), 'asset_costs', type_='foreignkey') + op.create_foreign_key(None, 'asset_costs', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'users', ['driver_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_events_asset_id_fkey'), 'asset_events', type_='foreignkey') + op.create_foreign_key(None, 'asset_events', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_financials_asset_id_fkey'), 'asset_financials', type_='foreignkey') + op.create_foreign_key(None, 'asset_financials', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', type_='foreignkey') + op.drop_constraint(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', type_='foreignkey') + op.create_foreign_key(None, 'asset_reviews', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_reviews', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', type_='foreignkey') + op.create_foreign_key(None, 'asset_telemetry', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('assets_catalog_id_fkey'), 'assets', type_='foreignkey') + op.create_foreign_key(None, 'assets', 'vehicle_catalog', ['catalog_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('audit_logs_user_id_fkey'), 'audit_logs', type_='foreignkey') + op.create_foreign_key(None, 'audit_logs', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('credit_logs_org_id_fkey'), 'credit_logs', type_='foreignkey') + op.create_foreign_key(None, 'credit_logs', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('documents_uploaded_by_fkey'), 'documents', type_='foreignkey') + op.create_foreign_key(None, 'documents', 'users', ['uploaded_by'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', type_='foreignkey') + op.create_foreign_key(None, 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.drop_constraint(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.create_foreign_key(None, 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_subscriptions', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('organization_members_user_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_organization_id_fkey'), 'organization_members', type_='foreignkey') + op.create_foreign_key(None, 'organization_members', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organization_members', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + existing_nullable=True) + op.drop_constraint(op.f('organizations_address_id_fkey'), 'organizations', type_='foreignkey') + op.drop_constraint(op.f('organizations_owner_id_fkey'), 'organizations', type_='foreignkey') + op.create_foreign_key(None, 'organizations', 'users', ['owner_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organizations', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('pending_actions_approver_id_fkey'), 'pending_actions', type_='foreignkey') + op.drop_constraint(op.f('pending_actions_requester_id_fkey'), 'pending_actions', type_='foreignkey') + op.create_foreign_key(None, 'pending_actions', 'users', ['requester_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'pending_actions', 'users', ['approver_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('persons_address_id_fkey'), 'persons', type_='foreignkey') + op.create_foreign_key(None, 'persons', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('points_ledger_user_id_fkey'), 'points_ledger', type_='foreignkey') + op.create_foreign_key(None, 'points_ledger', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('ratings_author_id_fkey'), 'ratings', type_='foreignkey') + op.create_foreign_key(None, 'ratings', 'users', ['author_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_specialties_parent_id_fkey'), 'service_specialties', type_='foreignkey') + op.create_foreign_key(None, 'service_specialties', 'service_specialties', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_badges_badge_id_fkey'), 'user_badges', type_='foreignkey') + op.drop_constraint(op.f('user_badges_user_id_fkey'), 'user_badges', type_='foreignkey') + op.create_foreign_key(None, 'user_badges', 'badges', ['badge_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'user_badges', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_stats_user_id_fkey'), 'user_stats', type_='foreignkey') + op.create_foreign_key(None, 'user_stats', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.add_column('users', sa.Column('preferred_language', sa.String(length=5), server_default='hu', nullable=True)) + op.add_column('users', sa.Column('region_code', sa.String(length=5), server_default='HU', nullable=True)) + op.drop_constraint(op.f('users_person_id_fkey'), 'users', type_='foreignkey') + op.create_foreign_key(None, 'users', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.drop_constraint(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'vehicle_ownerships', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', type_='foreignkey') + op.create_foreign_key(None, 'verification_tokens', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('wallets_user_id_fkey'), 'wallets', type_='foreignkey') + op.create_foreign_key(None, 'wallets', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'wallets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('wallets_user_id_fkey'), 'wallets', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'verification_tokens', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id']) + op.drop_constraint(None, 'users', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('users_person_id_fkey'), 'users', 'persons', ['person_id'], ['id']) + op.drop_column('users', 'region_code') + op.drop_column('users', 'preferred_language') + op.drop_constraint(None, 'user_stats', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_stats_user_id_fkey'), 'user_stats', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_badges_user_id_fkey'), 'user_badges', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('user_badges_badge_id_fkey'), 'user_badges', 'badges', ['badge_id'], ['id']) + op.drop_constraint(None, 'service_specialties', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_specialties_parent_id_fkey'), 'service_specialties', 'service_specialties', ['parent_id'], ['id']) + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('ratings_author_id_fkey'), 'ratings', 'users', ['author_id'], ['id']) + op.drop_constraint(None, 'points_ledger', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('points_ledger_user_id_fkey'), 'points_ledger', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'persons', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('persons_address_id_fkey'), 'persons', 'addresses', ['address_id'], ['id']) + op.drop_constraint(None, 'pending_actions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'pending_actions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('pending_actions_requester_id_fkey'), 'pending_actions', 'users', ['requester_id'], ['id']) + op.create_foreign_key(op.f('pending_actions_approver_id_fkey'), 'pending_actions', 'users', ['approver_id'], ['id']) + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organizations_owner_id_fkey'), 'organizations', 'users', ['owner_id'], ['id']) + op.create_foreign_key(op.f('organizations_address_id_fkey'), 'organizations', 'addresses', ['address_id'], ['id']) + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + existing_nullable=True) + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_members_organization_id_fkey'), 'organization_members', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('organization_members_user_id_fkey'), 'organization_members', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id']) + op.create_foreign_key(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'geo_streets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_constraint(None, 'documents', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('documents_uploaded_by_fkey'), 'documents', 'users', ['uploaded_by'], ['id']) + op.drop_constraint(None, 'credit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('credit_logs_org_id_fkey'), 'credit_logs', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'audit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('audit_logs_user_id_fkey'), 'audit_logs', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('assets_catalog_id_fkey'), 'assets', 'vehicle_catalog', ['catalog_id'], ['id']) + op.drop_constraint(None, 'asset_telemetry', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_financials_asset_id_fkey'), 'asset_financials', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_events', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_events_asset_id_fkey'), 'asset_events', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_costs_driver_id_fkey'), 'asset_costs', 'users', ['driver_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_organization_id_fkey'), 'asset_costs', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_asset_id_fkey'), 'asset_costs', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'addresses', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('addresses_postal_code_id_fkey'), 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id']) + # ### end Alembic commands ### diff --git a/backend/migrations/versions_backup/8370c73114b6_add_audit_log.py b/backend/migrations/versions_backup/8370c73114b6_add_audit_log.py new file mode 100755 index 0000000..c0d47e2 --- /dev/null +++ b/backend/migrations/versions_backup/8370c73114b6_add_audit_log.py @@ -0,0 +1,186 @@ +"""add_audit_log + +Revision ID: 8370c73114b6 +Revises: b14d05fd8ac8 +Create Date: 2026-02-10 22:28:41.024971 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = '8370c73114b6' +down_revision: Union[str, Sequence[str], None] = 'b14d05fd8ac8' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(op.f('addresses_postal_code_id_fkey'), 'addresses', type_='foreignkey') + op.create_foreign_key(None, 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', type_='foreignkey') + op.create_foreign_key(None, 'asset_assignments', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_costs_organization_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_asset_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_driver_id_fkey'), 'asset_costs', type_='foreignkey') + op.create_foreign_key(None, 'asset_costs', 'users', ['driver_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_events_asset_id_fkey'), 'asset_events', type_='foreignkey') + op.create_foreign_key(None, 'asset_events', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_financials_asset_id_fkey'), 'asset_financials', type_='foreignkey') + op.create_foreign_key(None, 'asset_financials', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', type_='foreignkey') + op.drop_constraint(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', type_='foreignkey') + op.create_foreign_key(None, 'asset_reviews', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_reviews', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', type_='foreignkey') + op.create_foreign_key(None, 'asset_telemetry', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('assets_catalog_id_fkey'), 'assets', type_='foreignkey') + op.create_foreign_key(None, 'assets', 'vehicle_catalog', ['catalog_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('audit_logs_user_id_fkey'), 'audit_logs', type_='foreignkey') + op.create_foreign_key(None, 'audit_logs', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('credit_logs_org_id_fkey'), 'credit_logs', type_='foreignkey') + op.create_foreign_key(None, 'credit_logs', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('documents_uploaded_by_fkey'), 'documents', type_='foreignkey') + op.create_foreign_key(None, 'documents', 'users', ['uploaded_by'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', type_='foreignkey') + op.create_foreign_key(None, 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.drop_constraint(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.create_foreign_key(None, 'org_subscriptions', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('organization_members_user_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_organization_id_fkey'), 'organization_members', type_='foreignkey') + op.create_foreign_key(None, 'organization_members', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organization_members', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + existing_nullable=True) + op.drop_constraint(op.f('organizations_owner_id_fkey'), 'organizations', type_='foreignkey') + op.drop_constraint(op.f('organizations_address_id_fkey'), 'organizations', type_='foreignkey') + op.create_foreign_key(None, 'organizations', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organizations', 'users', ['owner_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('pending_actions_approver_id_fkey'), 'pending_actions', type_='foreignkey') + op.drop_constraint(op.f('pending_actions_requester_id_fkey'), 'pending_actions', type_='foreignkey') + op.create_foreign_key(None, 'pending_actions', 'users', ['approver_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'pending_actions', 'users', ['requester_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('persons_address_id_fkey'), 'persons', type_='foreignkey') + op.create_foreign_key(None, 'persons', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('points_ledger_user_id_fkey'), 'points_ledger', type_='foreignkey') + op.create_foreign_key(None, 'points_ledger', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('ratings_author_id_fkey'), 'ratings', type_='foreignkey') + op.create_foreign_key(None, 'ratings', 'users', ['author_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_specialties_parent_id_fkey'), 'service_specialties', type_='foreignkey') + op.create_foreign_key(None, 'service_specialties', 'service_specialties', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('social_accounts_user_id_fkey'), 'social_accounts', type_='foreignkey') + op.create_foreign_key(None, 'social_accounts', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('user_badges_badge_id_fkey'), 'user_badges', type_='foreignkey') + op.drop_constraint(op.f('user_badges_user_id_fkey'), 'user_badges', type_='foreignkey') + op.create_foreign_key(None, 'user_badges', 'badges', ['badge_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'user_badges', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_stats_user_id_fkey'), 'user_stats', type_='foreignkey') + op.create_foreign_key(None, 'user_stats', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('users_person_id_fkey'), 'users', type_='foreignkey') + op.create_foreign_key(None, 'users', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.drop_constraint(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_ownerships', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', type_='foreignkey') + op.create_foreign_key(None, 'verification_tokens', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('wallets_user_id_fkey'), 'wallets', type_='foreignkey') + op.create_foreign_key(None, 'wallets', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'wallets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('wallets_user_id_fkey'), 'wallets', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'verification_tokens', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id']) + op.drop_constraint(None, 'users', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('users_person_id_fkey'), 'users', 'persons', ['person_id'], ['id']) + op.drop_constraint(None, 'user_stats', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_stats_user_id_fkey'), 'user_stats', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_badges_user_id_fkey'), 'user_badges', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('user_badges_badge_id_fkey'), 'user_badges', 'badges', ['badge_id'], ['id']) + op.drop_constraint(None, 'social_accounts', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('social_accounts_user_id_fkey'), 'social_accounts', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'service_specialties', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_specialties_parent_id_fkey'), 'service_specialties', 'service_specialties', ['parent_id'], ['id']) + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('ratings_author_id_fkey'), 'ratings', 'users', ['author_id'], ['id']) + op.drop_constraint(None, 'points_ledger', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('points_ledger_user_id_fkey'), 'points_ledger', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'persons', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('persons_address_id_fkey'), 'persons', 'addresses', ['address_id'], ['id']) + op.drop_constraint(None, 'pending_actions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'pending_actions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('pending_actions_requester_id_fkey'), 'pending_actions', 'users', ['requester_id'], ['id']) + op.create_foreign_key(op.f('pending_actions_approver_id_fkey'), 'pending_actions', 'users', ['approver_id'], ['id']) + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organizations_address_id_fkey'), 'organizations', 'addresses', ['address_id'], ['id']) + op.create_foreign_key(op.f('organizations_owner_id_fkey'), 'organizations', 'users', ['owner_id'], ['id']) + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + existing_nullable=True) + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_members_organization_id_fkey'), 'organization_members', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('organization_members_user_id_fkey'), 'organization_members', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id']) + op.create_foreign_key(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'geo_streets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_constraint(None, 'documents', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('documents_uploaded_by_fkey'), 'documents', 'users', ['uploaded_by'], ['id']) + op.drop_constraint(None, 'credit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('credit_logs_org_id_fkey'), 'credit_logs', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'audit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('audit_logs_user_id_fkey'), 'audit_logs', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('assets_catalog_id_fkey'), 'assets', 'vehicle_catalog', ['catalog_id'], ['id']) + op.drop_constraint(None, 'asset_telemetry', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'asset_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_financials_asset_id_fkey'), 'asset_financials', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_events', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_events_asset_id_fkey'), 'asset_events', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_costs_driver_id_fkey'), 'asset_costs', 'users', ['driver_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_asset_id_fkey'), 'asset_costs', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_organization_id_fkey'), 'asset_costs', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'addresses', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('addresses_postal_code_id_fkey'), 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id']) + # ### end Alembic commands ### diff --git a/backend/migrations/versions_backup/85b2a560e599_asset_system_v2_and_catalog.py b/backend/migrations/versions_backup/85b2a560e599_asset_system_v2_and_catalog.py new file mode 100755 index 0000000..bc594ad --- /dev/null +++ b/backend/migrations/versions_backup/85b2a560e599_asset_system_v2_and_catalog.py @@ -0,0 +1,204 @@ +"""asset_system_v2_and_catalog + +Revision ID: 85b2a560e599 +Revises: b69f11d8b825 +Create Date: 2026-02-11 20:25:48.630868 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = '85b2a560e599' +down_revision: Union[str, Sequence[str], None] = 'b69f11d8b825' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(op.f('addresses_postal_code_id_fkey'), 'addresses', type_='foreignkey') + op.create_foreign_key(None, 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', type_='foreignkey') + op.create_foreign_key(None, 'asset_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_assignments', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_costs_asset_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_organization_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_driver_id_fkey'), 'asset_costs', type_='foreignkey') + op.create_foreign_key(None, 'asset_costs', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'users', ['driver_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('asset_costs', 'vat_rate') + op.drop_column('asset_costs', 'net_amount_local') + op.drop_column('asset_costs', 'exchange_rate_used') + op.drop_constraint(op.f('asset_events_asset_id_fkey'), 'asset_events', type_='foreignkey') + op.create_foreign_key(None, 'asset_events', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_financials_asset_id_fkey'), 'asset_financials', type_='foreignkey') + op.create_foreign_key(None, 'asset_financials', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', type_='foreignkey') + op.drop_constraint(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', type_='foreignkey') + op.create_foreign_key(None, 'asset_reviews', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_reviews', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', type_='foreignkey') + op.create_foreign_key(None, 'asset_telemetry', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.add_column('assets', sa.Column('current_organization_id', sa.Integer(), nullable=True)) + op.add_column('assets', sa.Column('verification_method', sa.String(length=20), nullable=True)) + op.drop_constraint(op.f('assets_catalog_id_fkey'), 'assets', type_='foreignkey') + op.create_foreign_key(None, 'assets', 'organizations', ['current_organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'assets', 'vehicle_catalog', ['catalog_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('audit_logs_user_id_fkey'), 'audit_logs', type_='foreignkey') + op.create_foreign_key(None, 'audit_logs', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('credit_logs_org_id_fkey'), 'credit_logs', type_='foreignkey') + op.create_foreign_key(None, 'credit_logs', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('documents_uploaded_by_fkey'), 'documents', type_='foreignkey') + op.create_foreign_key(None, 'documents', 'users', ['uploaded_by'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('exchange_rates', 'rate_date') + op.drop_constraint(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', type_='foreignkey') + op.create_foreign_key(None, 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.drop_constraint(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.create_foreign_key(None, 'org_subscriptions', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('organization_members_user_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_organization_id_fkey'), 'organization_members', type_='foreignkey') + op.create_foreign_key(None, 'organization_members', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organization_members', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + existing_nullable=True) + op.drop_constraint(op.f('organizations_address_id_fkey'), 'organizations', type_='foreignkey') + op.drop_constraint(op.f('organizations_owner_id_fkey'), 'organizations', type_='foreignkey') + op.create_foreign_key(None, 'organizations', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organizations', 'users', ['owner_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('pending_actions_approver_id_fkey'), 'pending_actions', type_='foreignkey') + op.drop_constraint(op.f('pending_actions_requester_id_fkey'), 'pending_actions', type_='foreignkey') + op.create_foreign_key(None, 'pending_actions', 'users', ['approver_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'pending_actions', 'users', ['requester_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('persons_address_id_fkey'), 'persons', type_='foreignkey') + op.create_foreign_key(None, 'persons', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('points_ledger_user_id_fkey'), 'points_ledger', type_='foreignkey') + op.create_foreign_key(None, 'points_ledger', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('ratings_author_id_fkey'), 'ratings', type_='foreignkey') + op.create_foreign_key(None, 'ratings', 'users', ['author_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_specialties_parent_id_fkey'), 'service_specialties', type_='foreignkey') + op.create_foreign_key(None, 'service_specialties', 'service_specialties', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('social_accounts_user_id_fkey'), 'social_accounts', type_='foreignkey') + op.create_foreign_key(None, 'social_accounts', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('user_badges_user_id_fkey'), 'user_badges', type_='foreignkey') + op.drop_constraint(op.f('user_badges_badge_id_fkey'), 'user_badges', type_='foreignkey') + op.create_foreign_key(None, 'user_badges', 'badges', ['badge_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'user_badges', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_stats_user_id_fkey'), 'user_stats', type_='foreignkey') + op.create_foreign_key(None, 'user_stats', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('users_person_id_fkey'), 'users', type_='foreignkey') + op.create_foreign_key(None, 'users', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='data') + op.add_column('vehicle_catalog', sa.Column('engine_variant', sa.String(), nullable=True)) + op.create_index(op.f('ix_data_vehicle_catalog_generation'), 'vehicle_catalog', ['generation'], unique=False, schema='data') + op.drop_constraint(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.drop_constraint(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_ownerships', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', type_='foreignkey') + op.create_foreign_key(None, 'verification_tokens', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('wallets_user_id_fkey'), 'wallets', type_='foreignkey') + op.create_foreign_key(None, 'wallets', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'wallets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('wallets_user_id_fkey'), 'wallets', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'verification_tokens', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id']) + op.create_foreign_key(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', 'users', ['user_id'], ['id']) + op.drop_index(op.f('ix_data_vehicle_catalog_generation'), table_name='vehicle_catalog', schema='data') + op.drop_column('vehicle_catalog', 'engine_variant') + op.drop_constraint(None, 'users', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('users_person_id_fkey'), 'users', 'persons', ['person_id'], ['id']) + op.drop_constraint(None, 'user_stats', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_stats_user_id_fkey'), 'user_stats', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_badges_badge_id_fkey'), 'user_badges', 'badges', ['badge_id'], ['id']) + op.create_foreign_key(op.f('user_badges_user_id_fkey'), 'user_badges', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'social_accounts', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('social_accounts_user_id_fkey'), 'social_accounts', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'service_specialties', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_specialties_parent_id_fkey'), 'service_specialties', 'service_specialties', ['parent_id'], ['id']) + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('ratings_author_id_fkey'), 'ratings', 'users', ['author_id'], ['id']) + op.drop_constraint(None, 'points_ledger', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('points_ledger_user_id_fkey'), 'points_ledger', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'persons', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('persons_address_id_fkey'), 'persons', 'addresses', ['address_id'], ['id']) + op.drop_constraint(None, 'pending_actions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'pending_actions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('pending_actions_requester_id_fkey'), 'pending_actions', 'users', ['requester_id'], ['id']) + op.create_foreign_key(op.f('pending_actions_approver_id_fkey'), 'pending_actions', 'users', ['approver_id'], ['id']) + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organizations_owner_id_fkey'), 'organizations', 'users', ['owner_id'], ['id']) + op.create_foreign_key(op.f('organizations_address_id_fkey'), 'organizations', 'addresses', ['address_id'], ['id']) + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + existing_nullable=True) + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_members_organization_id_fkey'), 'organization_members', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('organization_members_user_id_fkey'), 'organization_members', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', 'organizations', ['org_id'], ['id']) + op.create_foreign_key(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id']) + op.drop_constraint(None, 'geo_streets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.add_column('exchange_rates', sa.Column('rate_date', postgresql.TIMESTAMP(), autoincrement=False, nullable=True)) + op.drop_constraint(None, 'documents', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('documents_uploaded_by_fkey'), 'documents', 'users', ['uploaded_by'], ['id']) + op.drop_constraint(None, 'credit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('credit_logs_org_id_fkey'), 'credit_logs', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'audit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('audit_logs_user_id_fkey'), 'audit_logs', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('assets_catalog_id_fkey'), 'assets', 'vehicle_catalog', ['catalog_id'], ['id']) + op.drop_column('assets', 'verification_method') + op.drop_column('assets', 'current_organization_id') + op.drop_constraint(None, 'asset_telemetry', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'asset_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_financials_asset_id_fkey'), 'asset_financials', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_events', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_events_asset_id_fkey'), 'asset_events', 'assets', ['asset_id'], ['id']) + op.add_column('asset_costs', sa.Column('exchange_rate_used', sa.NUMERIC(precision=18, scale=6), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('net_amount_local', sa.NUMERIC(precision=18, scale=2), autoincrement=False, nullable=True)) + op.add_column('asset_costs', sa.Column('vat_rate', sa.NUMERIC(precision=5, scale=2), autoincrement=False, nullable=True)) + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_costs_driver_id_fkey'), 'asset_costs', 'users', ['driver_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_organization_id_fkey'), 'asset_costs', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_asset_id_fkey'), 'asset_costs', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'addresses', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('addresses_postal_code_id_fkey'), 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id']) + # ### end Alembic commands ### diff --git a/backend/migrations/versions_backup/8e06c5386cba_finalize_gamification_v1_5_clean.py b/backend/migrations/versions_backup/8e06c5386cba_finalize_gamification_v1_5_clean.py new file mode 100755 index 0000000..d0a495d --- /dev/null +++ b/backend/migrations/versions_backup/8e06c5386cba_finalize_gamification_v1_5_clean.py @@ -0,0 +1,200 @@ +"""finalize_gamification_v1.5_clean + +Revision ID: 8e06c5386cba +Revises: 2cfe9285eb9d +Create Date: 2026-02-10 16:18:15.900078 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = '8e06c5386cba' +down_revision: Union[str, Sequence[str], None] = '2cfe9285eb9d' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(op.f('addresses_postal_code_id_fkey'), 'addresses', type_='foreignkey') + op.create_foreign_key(None, 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', type_='foreignkey') + op.create_foreign_key(None, 'asset_assignments', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_costs_driver_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_organization_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_asset_id_fkey'), 'asset_costs', type_='foreignkey') + op.create_foreign_key(None, 'asset_costs', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'users', ['driver_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_events_asset_id_fkey'), 'asset_events', type_='foreignkey') + op.create_foreign_key(None, 'asset_events', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_financials_asset_id_fkey'), 'asset_financials', type_='foreignkey') + op.create_foreign_key(None, 'asset_financials', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', type_='foreignkey') + op.drop_constraint(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', type_='foreignkey') + op.create_foreign_key(None, 'asset_reviews', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_reviews', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', type_='foreignkey') + op.create_foreign_key(None, 'asset_telemetry', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('assets_catalog_id_fkey'), 'assets', type_='foreignkey') + op.create_foreign_key(None, 'assets', 'vehicle_catalog', ['catalog_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('audit_logs_user_id_fkey'), 'audit_logs', type_='foreignkey') + op.create_foreign_key(None, 'audit_logs', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('credit_logs_org_id_fkey'), 'credit_logs', type_='foreignkey') + op.create_foreign_key(None, 'credit_logs', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('documents_uploaded_by_fkey'), 'documents', type_='foreignkey') + op.create_foreign_key(None, 'documents', 'users', ['uploaded_by'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', type_='foreignkey') + op.create_foreign_key(None, 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.drop_constraint(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.create_foreign_key(None, 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_subscriptions', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('organization_members_user_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_organization_id_fkey'), 'organization_members', type_='foreignkey') + op.create_foreign_key(None, 'organization_members', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organization_members', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + existing_nullable=True) + op.drop_constraint(op.f('organizations_owner_id_fkey'), 'organizations', type_='foreignkey') + op.drop_constraint(op.f('organizations_address_id_fkey'), 'organizations', type_='foreignkey') + op.create_foreign_key(None, 'organizations', 'users', ['owner_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organizations', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('persons_address_id_fkey'), 'persons', type_='foreignkey') + op.create_foreign_key(None, 'persons', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('persons', 'medical_emergency') + op.drop_column('persons', 'birth_date') + op.drop_column('persons', 'ice_contact') + op.drop_column('persons', 'birth_place') + op.drop_column('persons', 'mothers_first_name') + op.drop_column('persons', 'mothers_last_name') + op.add_column('points_ledger', sa.Column('penalty_change', sa.Integer(), server_default=sa.text('0'), nullable=False)) + op.drop_constraint(op.f('points_ledger_user_id_fkey'), 'points_ledger', type_='foreignkey') + op.create_foreign_key(None, 'points_ledger', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('ratings_author_id_fkey'), 'ratings', type_='foreignkey') + op.create_foreign_key(None, 'ratings', 'users', ['author_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_specialties_parent_id_fkey'), 'service_specialties', type_='foreignkey') + op.create_foreign_key(None, 'service_specialties', 'service_specialties', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_badges_badge_id_fkey'), 'user_badges', type_='foreignkey') + op.drop_constraint(op.f('user_badges_user_id_fkey'), 'user_badges', type_='foreignkey') + op.create_foreign_key(None, 'user_badges', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'user_badges', 'badges', ['badge_id'], ['id'], source_schema='data', referent_schema='data') + op.add_column('user_stats', sa.Column('penalty_points', sa.Integer(), server_default=sa.text('0'), nullable=False)) + op.add_column('user_stats', sa.Column('restriction_level', sa.Integer(), server_default=sa.text('0'), nullable=False)) + op.drop_constraint(op.f('user_stats_user_id_fkey'), 'user_stats', type_='foreignkey') + op.create_foreign_key(None, 'user_stats', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('users_person_id_fkey'), 'users', type_='foreignkey') + op.create_foreign_key(None, 'users', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('users', 'region_code') + op.drop_column('users', 'preferred_language') + op.drop_column('users', 'preferred_currency') + op.drop_column('users', 'timezone') + op.drop_constraint(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.drop_constraint(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'vehicle_ownerships', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', type_='foreignkey') + op.create_foreign_key(None, 'verification_tokens', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('wallets_user_id_fkey'), 'wallets', type_='foreignkey') + op.create_foreign_key(None, 'wallets', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'wallets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('wallets_user_id_fkey'), 'wallets', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'verification_tokens', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id']) + op.add_column('users', sa.Column('timezone', sa.VARCHAR(length=50), autoincrement=False, nullable=True)) + op.add_column('users', sa.Column('preferred_currency', sa.VARCHAR(length=3), autoincrement=False, nullable=True)) + op.add_column('users', sa.Column('preferred_language', sa.VARCHAR(length=5), autoincrement=False, nullable=True)) + op.add_column('users', sa.Column('region_code', sa.VARCHAR(), autoincrement=False, nullable=True)) + op.drop_constraint(None, 'users', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('users_person_id_fkey'), 'users', 'persons', ['person_id'], ['id']) + op.drop_constraint(None, 'user_stats', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_stats_user_id_fkey'), 'user_stats', 'users', ['user_id'], ['id']) + op.drop_column('user_stats', 'restriction_level') + op.drop_column('user_stats', 'penalty_points') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_badges_user_id_fkey'), 'user_badges', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('user_badges_badge_id_fkey'), 'user_badges', 'badges', ['badge_id'], ['id']) + op.drop_constraint(None, 'service_specialties', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_specialties_parent_id_fkey'), 'service_specialties', 'service_specialties', ['parent_id'], ['id']) + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('ratings_author_id_fkey'), 'ratings', 'users', ['author_id'], ['id']) + op.drop_constraint(None, 'points_ledger', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('points_ledger_user_id_fkey'), 'points_ledger', 'users', ['user_id'], ['id']) + op.drop_column('points_ledger', 'penalty_change') + op.add_column('persons', sa.Column('mothers_last_name', sa.VARCHAR(), autoincrement=False, nullable=True)) + op.add_column('persons', sa.Column('mothers_first_name', sa.VARCHAR(), autoincrement=False, nullable=True)) + op.add_column('persons', sa.Column('birth_place', sa.VARCHAR(), autoincrement=False, nullable=True)) + op.add_column('persons', sa.Column('ice_contact', postgresql.JSON(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), autoincrement=False, nullable=True)) + op.add_column('persons', sa.Column('birth_date', postgresql.TIMESTAMP(), autoincrement=False, nullable=True)) + op.add_column('persons', sa.Column('medical_emergency', postgresql.JSON(astext_type=sa.Text()), server_default=sa.text("'{}'::jsonb"), autoincrement=False, nullable=True)) + op.drop_constraint(None, 'persons', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('persons_address_id_fkey'), 'persons', 'addresses', ['address_id'], ['id']) + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organizations_address_id_fkey'), 'organizations', 'addresses', ['address_id'], ['id']) + op.create_foreign_key(op.f('organizations_owner_id_fkey'), 'organizations', 'users', ['owner_id'], ['id']) + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + existing_nullable=True) + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_members_organization_id_fkey'), 'organization_members', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('organization_members_user_id_fkey'), 'organization_members', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', 'organizations', ['org_id'], ['id']) + op.create_foreign_key(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id']) + op.drop_constraint(None, 'geo_streets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_constraint(None, 'documents', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('documents_uploaded_by_fkey'), 'documents', 'users', ['uploaded_by'], ['id']) + op.drop_constraint(None, 'credit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('credit_logs_org_id_fkey'), 'credit_logs', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'audit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('audit_logs_user_id_fkey'), 'audit_logs', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('assets_catalog_id_fkey'), 'assets', 'vehicle_catalog', ['catalog_id'], ['id']) + op.drop_constraint(None, 'asset_telemetry', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_financials_asset_id_fkey'), 'asset_financials', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_events', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_events_asset_id_fkey'), 'asset_events', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_costs_asset_id_fkey'), 'asset_costs', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_organization_id_fkey'), 'asset_costs', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_driver_id_fkey'), 'asset_costs', 'users', ['driver_id'], ['id']) + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'addresses', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('addresses_postal_code_id_fkey'), 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id']) + # ### end Alembic commands ### diff --git a/backend/migrations/versions_backup/9b20430f0ebb_add_service_specialization_and_postgis.py b/backend/migrations/versions_backup/9b20430f0ebb_add_service_specialization_and_postgis.py new file mode 100755 index 0000000..9c52bee --- /dev/null +++ b/backend/migrations/versions_backup/9b20430f0ebb_add_service_specialization_and_postgis.py @@ -0,0 +1,190 @@ +"""add_service_specialization_and_postgis + +Revision ID: 9b20430f0ebb +Revises: 85b2a560e599 +Create Date: 2026-02-11 22:13:22.128599 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = '9b20430f0ebb' +down_revision: Union[str, Sequence[str], None] = '85b2a560e599' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(op.f('addresses_postal_code_id_fkey'), 'addresses', type_='foreignkey') + op.create_foreign_key(None, 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', type_='foreignkey') + op.create_foreign_key(None, 'asset_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_assignments', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_costs_organization_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_asset_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_driver_id_fkey'), 'asset_costs', type_='foreignkey') + op.create_foreign_key(None, 'asset_costs', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'users', ['driver_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_events_asset_id_fkey'), 'asset_events', type_='foreignkey') + op.create_foreign_key(None, 'asset_events', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_financials_asset_id_fkey'), 'asset_financials', type_='foreignkey') + op.create_foreign_key(None, 'asset_financials', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', type_='foreignkey') + op.drop_constraint(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', type_='foreignkey') + op.create_foreign_key(None, 'asset_reviews', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_reviews', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', type_='foreignkey') + op.create_foreign_key(None, 'asset_telemetry', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('assets_current_organization_id_fkey'), 'assets', type_='foreignkey') + op.drop_constraint(op.f('assets_catalog_id_fkey'), 'assets', type_='foreignkey') + op.create_foreign_key(None, 'assets', 'organizations', ['current_organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'assets', 'vehicle_catalog', ['catalog_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('audit_logs_user_id_fkey'), 'audit_logs', type_='foreignkey') + op.create_foreign_key(None, 'audit_logs', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('credit_logs_org_id_fkey'), 'credit_logs', type_='foreignkey') + op.create_foreign_key(None, 'credit_logs', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('documents_uploaded_by_fkey'), 'documents', type_='foreignkey') + op.create_foreign_key(None, 'documents', 'users', ['uploaded_by'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', type_='foreignkey') + op.create_foreign_key(None, 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.drop_constraint(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.create_foreign_key(None, 'org_subscriptions', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('organization_members_user_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_organization_id_fkey'), 'organization_members', type_='foreignkey') + op.create_foreign_key(None, 'organization_members', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organization_members', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + existing_nullable=True) + op.drop_constraint(op.f('organizations_address_id_fkey'), 'organizations', type_='foreignkey') + op.drop_constraint(op.f('organizations_owner_id_fkey'), 'organizations', type_='foreignkey') + op.create_foreign_key(None, 'organizations', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organizations', 'users', ['owner_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('pending_actions_approver_id_fkey'), 'pending_actions', type_='foreignkey') + op.drop_constraint(op.f('pending_actions_requester_id_fkey'), 'pending_actions', type_='foreignkey') + op.create_foreign_key(None, 'pending_actions', 'users', ['approver_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'pending_actions', 'users', ['requester_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('persons_address_id_fkey'), 'persons', type_='foreignkey') + op.create_foreign_key(None, 'persons', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('points_ledger_user_id_fkey'), 'points_ledger', type_='foreignkey') + op.create_foreign_key(None, 'points_ledger', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('ratings_author_id_fkey'), 'ratings', type_='foreignkey') + op.create_foreign_key(None, 'ratings', 'users', ['author_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_specialties_parent_id_fkey'), 'service_specialties', type_='foreignkey') + op.create_foreign_key(None, 'service_specialties', 'service_specialties', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('social_accounts_user_id_fkey'), 'social_accounts', type_='foreignkey') + op.create_foreign_key(None, 'social_accounts', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('user_badges_user_id_fkey'), 'user_badges', type_='foreignkey') + op.drop_constraint(op.f('user_badges_badge_id_fkey'), 'user_badges', type_='foreignkey') + op.create_foreign_key(None, 'user_badges', 'badges', ['badge_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'user_badges', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_stats_user_id_fkey'), 'user_stats', type_='foreignkey') + op.create_foreign_key(None, 'user_stats', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('users_person_id_fkey'), 'users', type_='foreignkey') + op.create_foreign_key(None, 'users', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.drop_constraint(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_ownerships', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', type_='foreignkey') + op.create_foreign_key(None, 'verification_tokens', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('wallets_user_id_fkey'), 'wallets', type_='foreignkey') + op.create_foreign_key(None, 'wallets', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'wallets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('wallets_user_id_fkey'), 'wallets', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'verification_tokens', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id']) + op.create_foreign_key(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'users', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('users_person_id_fkey'), 'users', 'persons', ['person_id'], ['id']) + op.drop_constraint(None, 'user_stats', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_stats_user_id_fkey'), 'user_stats', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_badges_badge_id_fkey'), 'user_badges', 'badges', ['badge_id'], ['id']) + op.create_foreign_key(op.f('user_badges_user_id_fkey'), 'user_badges', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'social_accounts', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('social_accounts_user_id_fkey'), 'social_accounts', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'service_specialties', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_specialties_parent_id_fkey'), 'service_specialties', 'service_specialties', ['parent_id'], ['id']) + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('ratings_author_id_fkey'), 'ratings', 'users', ['author_id'], ['id']) + op.drop_constraint(None, 'points_ledger', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('points_ledger_user_id_fkey'), 'points_ledger', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'persons', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('persons_address_id_fkey'), 'persons', 'addresses', ['address_id'], ['id']) + op.drop_constraint(None, 'pending_actions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'pending_actions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('pending_actions_requester_id_fkey'), 'pending_actions', 'users', ['requester_id'], ['id']) + op.create_foreign_key(op.f('pending_actions_approver_id_fkey'), 'pending_actions', 'users', ['approver_id'], ['id']) + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organizations_owner_id_fkey'), 'organizations', 'users', ['owner_id'], ['id']) + op.create_foreign_key(op.f('organizations_address_id_fkey'), 'organizations', 'addresses', ['address_id'], ['id']) + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + existing_nullable=True) + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_members_organization_id_fkey'), 'organization_members', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('organization_members_user_id_fkey'), 'organization_members', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', 'organizations', ['org_id'], ['id']) + op.create_foreign_key(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id']) + op.drop_constraint(None, 'geo_streets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_constraint(None, 'documents', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('documents_uploaded_by_fkey'), 'documents', 'users', ['uploaded_by'], ['id']) + op.drop_constraint(None, 'credit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('credit_logs_org_id_fkey'), 'credit_logs', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'audit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('audit_logs_user_id_fkey'), 'audit_logs', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('assets_catalog_id_fkey'), 'assets', 'vehicle_catalog', ['catalog_id'], ['id']) + op.create_foreign_key(op.f('assets_current_organization_id_fkey'), 'assets', 'organizations', ['current_organization_id'], ['id']) + op.drop_constraint(None, 'asset_telemetry', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'asset_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_financials_asset_id_fkey'), 'asset_financials', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_events', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_events_asset_id_fkey'), 'asset_events', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_costs_driver_id_fkey'), 'asset_costs', 'users', ['driver_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_asset_id_fkey'), 'asset_costs', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_organization_id_fkey'), 'asset_costs', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'addresses', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('addresses_postal_code_id_fkey'), 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id']) + # ### end Alembic commands ### diff --git a/backend/migrations/versions_backup/b14d05fd8ac8_add_social_accounts.py b/backend/migrations/versions_backup/b14d05fd8ac8_add_social_accounts.py new file mode 100755 index 0000000..c8a55c5 --- /dev/null +++ b/backend/migrations/versions_backup/b14d05fd8ac8_add_social_accounts.py @@ -0,0 +1,200 @@ +"""add_social_accounts + +Revision ID: b14d05fd8ac8 +Revises: 6197bfddfb4f +Create Date: 2026-02-10 21:22:09.390136 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = 'b14d05fd8ac8' +down_revision: Union[str, Sequence[str], None] = '6197bfddfb4f' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('social_accounts', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('provider', sa.String(length=50), nullable=False), + sa.Column('social_id', sa.String(length=255), nullable=False), + sa.Column('email', sa.String(length=255), nullable=False), + sa.Column('extra_data', sa.JSON(), server_default=sa.text("'{}'::jsonb"), nullable=True), + sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True), + sa.ForeignKeyConstraint(['user_id'], ['data.users.id'], ondelete='CASCADE'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('provider', 'social_id', name='uix_social_provider_id'), + schema='data' + ) + op.create_index(op.f('ix_data_social_accounts_id'), 'social_accounts', ['id'], unique=False, schema='data') + op.create_index(op.f('ix_data_social_accounts_social_id'), 'social_accounts', ['social_id'], unique=False, schema='data') + op.drop_constraint(op.f('addresses_postal_code_id_fkey'), 'addresses', type_='foreignkey') + op.create_foreign_key(None, 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', type_='foreignkey') + op.create_foreign_key(None, 'asset_assignments', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_costs_asset_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_organization_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_driver_id_fkey'), 'asset_costs', type_='foreignkey') + op.create_foreign_key(None, 'asset_costs', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'users', ['driver_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_events_asset_id_fkey'), 'asset_events', type_='foreignkey') + op.create_foreign_key(None, 'asset_events', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_financials_asset_id_fkey'), 'asset_financials', type_='foreignkey') + op.create_foreign_key(None, 'asset_financials', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', type_='foreignkey') + op.drop_constraint(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', type_='foreignkey') + op.create_foreign_key(None, 'asset_reviews', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_reviews', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', type_='foreignkey') + op.create_foreign_key(None, 'asset_telemetry', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('assets_catalog_id_fkey'), 'assets', type_='foreignkey') + op.create_foreign_key(None, 'assets', 'vehicle_catalog', ['catalog_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('audit_logs_user_id_fkey'), 'audit_logs', type_='foreignkey') + op.create_foreign_key(None, 'audit_logs', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('credit_logs_org_id_fkey'), 'credit_logs', type_='foreignkey') + op.create_foreign_key(None, 'credit_logs', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('documents_uploaded_by_fkey'), 'documents', type_='foreignkey') + op.create_foreign_key(None, 'documents', 'users', ['uploaded_by'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', type_='foreignkey') + op.create_foreign_key(None, 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.drop_constraint(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.create_foreign_key(None, 'org_subscriptions', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('organization_members_user_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_organization_id_fkey'), 'organization_members', type_='foreignkey') + op.create_foreign_key(None, 'organization_members', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organization_members', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + existing_nullable=True) + op.drop_constraint(op.f('organizations_owner_id_fkey'), 'organizations', type_='foreignkey') + op.drop_constraint(op.f('organizations_address_id_fkey'), 'organizations', type_='foreignkey') + op.create_foreign_key(None, 'organizations', 'users', ['owner_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organizations', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('pending_actions_requester_id_fkey'), 'pending_actions', type_='foreignkey') + op.drop_constraint(op.f('pending_actions_approver_id_fkey'), 'pending_actions', type_='foreignkey') + op.create_foreign_key(None, 'pending_actions', 'users', ['approver_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'pending_actions', 'users', ['requester_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('persons_address_id_fkey'), 'persons', type_='foreignkey') + op.create_foreign_key(None, 'persons', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('points_ledger_user_id_fkey'), 'points_ledger', type_='foreignkey') + op.create_foreign_key(None, 'points_ledger', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('ratings_author_id_fkey'), 'ratings', type_='foreignkey') + op.create_foreign_key(None, 'ratings', 'users', ['author_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_specialties_parent_id_fkey'), 'service_specialties', type_='foreignkey') + op.create_foreign_key(None, 'service_specialties', 'service_specialties', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_badges_user_id_fkey'), 'user_badges', type_='foreignkey') + op.drop_constraint(op.f('user_badges_badge_id_fkey'), 'user_badges', type_='foreignkey') + op.create_foreign_key(None, 'user_badges', 'badges', ['badge_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'user_badges', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_stats_user_id_fkey'), 'user_stats', type_='foreignkey') + op.create_foreign_key(None, 'user_stats', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('users_person_id_fkey'), 'users', type_='foreignkey') + op.create_foreign_key(None, 'users', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.drop_constraint(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_ownerships', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', type_='foreignkey') + op.create_foreign_key(None, 'verification_tokens', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('wallets_user_id_fkey'), 'wallets', type_='foreignkey') + op.create_foreign_key(None, 'wallets', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'wallets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('wallets_user_id_fkey'), 'wallets', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'verification_tokens', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id']) + op.drop_constraint(None, 'users', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('users_person_id_fkey'), 'users', 'persons', ['person_id'], ['id']) + op.drop_constraint(None, 'user_stats', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_stats_user_id_fkey'), 'user_stats', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_badges_badge_id_fkey'), 'user_badges', 'badges', ['badge_id'], ['id']) + op.create_foreign_key(op.f('user_badges_user_id_fkey'), 'user_badges', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'service_specialties', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_specialties_parent_id_fkey'), 'service_specialties', 'service_specialties', ['parent_id'], ['id']) + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('ratings_author_id_fkey'), 'ratings', 'users', ['author_id'], ['id']) + op.drop_constraint(None, 'points_ledger', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('points_ledger_user_id_fkey'), 'points_ledger', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'persons', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('persons_address_id_fkey'), 'persons', 'addresses', ['address_id'], ['id']) + op.drop_constraint(None, 'pending_actions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'pending_actions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('pending_actions_approver_id_fkey'), 'pending_actions', 'users', ['approver_id'], ['id']) + op.create_foreign_key(op.f('pending_actions_requester_id_fkey'), 'pending_actions', 'users', ['requester_id'], ['id']) + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organizations_address_id_fkey'), 'organizations', 'addresses', ['address_id'], ['id']) + op.create_foreign_key(op.f('organizations_owner_id_fkey'), 'organizations', 'users', ['owner_id'], ['id']) + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + existing_nullable=True) + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_members_organization_id_fkey'), 'organization_members', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('organization_members_user_id_fkey'), 'organization_members', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id']) + op.create_foreign_key(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'geo_streets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_constraint(None, 'documents', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('documents_uploaded_by_fkey'), 'documents', 'users', ['uploaded_by'], ['id']) + op.drop_constraint(None, 'credit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('credit_logs_org_id_fkey'), 'credit_logs', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'audit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('audit_logs_user_id_fkey'), 'audit_logs', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('assets_catalog_id_fkey'), 'assets', 'vehicle_catalog', ['catalog_id'], ['id']) + op.drop_constraint(None, 'asset_telemetry', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'asset_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_financials_asset_id_fkey'), 'asset_financials', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_events', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_events_asset_id_fkey'), 'asset_events', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_costs_driver_id_fkey'), 'asset_costs', 'users', ['driver_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_organization_id_fkey'), 'asset_costs', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_asset_id_fkey'), 'asset_costs', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'addresses', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('addresses_postal_code_id_fkey'), 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_index(op.f('ix_data_social_accounts_social_id'), table_name='social_accounts', schema='data') + op.drop_index(op.f('ix_data_social_accounts_id'), table_name='social_accounts', schema='data') + op.drop_table('social_accounts', schema='data') + # ### end Alembic commands ### diff --git a/backend/migrations/versions_backup/b69f11d8b825_add_current_org_to_asset_and_fix_slugs.py b/backend/migrations/versions_backup/b69f11d8b825_add_current_org_to_asset_and_fix_slugs.py new file mode 100755 index 0000000..0bc7a07 --- /dev/null +++ b/backend/migrations/versions_backup/b69f11d8b825_add_current_org_to_asset_and_fix_slugs.py @@ -0,0 +1,186 @@ +"""add_current_org_to_asset_and_fix_slugs + +Revision ID: b69f11d8b825 +Revises: 0fa011f29e35 +Create Date: 2026-02-11 20:09:39.864915 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = 'b69f11d8b825' +down_revision: Union[str, Sequence[str], None] = '0fa011f29e35' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(op.f('addresses_postal_code_id_fkey'), 'addresses', type_='foreignkey') + op.create_foreign_key(None, 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', type_='foreignkey') + op.create_foreign_key(None, 'asset_assignments', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_costs_asset_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_driver_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_organization_id_fkey'), 'asset_costs', type_='foreignkey') + op.create_foreign_key(None, 'asset_costs', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'users', ['driver_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_events_asset_id_fkey'), 'asset_events', type_='foreignkey') + op.create_foreign_key(None, 'asset_events', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_financials_asset_id_fkey'), 'asset_financials', type_='foreignkey') + op.create_foreign_key(None, 'asset_financials', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', type_='foreignkey') + op.drop_constraint(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', type_='foreignkey') + op.create_foreign_key(None, 'asset_reviews', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_reviews', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', type_='foreignkey') + op.create_foreign_key(None, 'asset_telemetry', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('assets_catalog_id_fkey'), 'assets', type_='foreignkey') + op.create_foreign_key(None, 'assets', 'vehicle_catalog', ['catalog_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('audit_logs_user_id_fkey'), 'audit_logs', type_='foreignkey') + op.create_foreign_key(None, 'audit_logs', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('credit_logs_org_id_fkey'), 'credit_logs', type_='foreignkey') + op.create_foreign_key(None, 'credit_logs', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('documents_uploaded_by_fkey'), 'documents', type_='foreignkey') + op.create_foreign_key(None, 'documents', 'users', ['uploaded_by'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', type_='foreignkey') + op.create_foreign_key(None, 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.drop_constraint(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.create_foreign_key(None, 'org_subscriptions', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('organization_members_user_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_organization_id_fkey'), 'organization_members', type_='foreignkey') + op.create_foreign_key(None, 'organization_members', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organization_members', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + existing_nullable=True) + op.drop_constraint(op.f('organizations_owner_id_fkey'), 'organizations', type_='foreignkey') + op.drop_constraint(op.f('organizations_address_id_fkey'), 'organizations', type_='foreignkey') + op.create_foreign_key(None, 'organizations', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organizations', 'users', ['owner_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('pending_actions_approver_id_fkey'), 'pending_actions', type_='foreignkey') + op.drop_constraint(op.f('pending_actions_requester_id_fkey'), 'pending_actions', type_='foreignkey') + op.create_foreign_key(None, 'pending_actions', 'users', ['requester_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'pending_actions', 'users', ['approver_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('persons_address_id_fkey'), 'persons', type_='foreignkey') + op.create_foreign_key(None, 'persons', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('points_ledger_user_id_fkey'), 'points_ledger', type_='foreignkey') + op.create_foreign_key(None, 'points_ledger', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('ratings_author_id_fkey'), 'ratings', type_='foreignkey') + op.create_foreign_key(None, 'ratings', 'users', ['author_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_specialties_parent_id_fkey'), 'service_specialties', type_='foreignkey') + op.create_foreign_key(None, 'service_specialties', 'service_specialties', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('social_accounts_user_id_fkey'), 'social_accounts', type_='foreignkey') + op.create_foreign_key(None, 'social_accounts', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('user_badges_badge_id_fkey'), 'user_badges', type_='foreignkey') + op.drop_constraint(op.f('user_badges_user_id_fkey'), 'user_badges', type_='foreignkey') + op.create_foreign_key(None, 'user_badges', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'user_badges', 'badges', ['badge_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_stats_user_id_fkey'), 'user_stats', type_='foreignkey') + op.create_foreign_key(None, 'user_stats', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('users_person_id_fkey'), 'users', type_='foreignkey') + op.create_foreign_key(None, 'users', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.drop_constraint(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'vehicle_ownerships', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', type_='foreignkey') + op.create_foreign_key(None, 'verification_tokens', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('wallets_user_id_fkey'), 'wallets', type_='foreignkey') + op.create_foreign_key(None, 'wallets', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'wallets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('wallets_user_id_fkey'), 'wallets', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'verification_tokens', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id']) + op.drop_constraint(None, 'users', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('users_person_id_fkey'), 'users', 'persons', ['person_id'], ['id']) + op.drop_constraint(None, 'user_stats', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_stats_user_id_fkey'), 'user_stats', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_badges_user_id_fkey'), 'user_badges', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('user_badges_badge_id_fkey'), 'user_badges', 'badges', ['badge_id'], ['id']) + op.drop_constraint(None, 'social_accounts', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('social_accounts_user_id_fkey'), 'social_accounts', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'service_specialties', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_specialties_parent_id_fkey'), 'service_specialties', 'service_specialties', ['parent_id'], ['id']) + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('ratings_author_id_fkey'), 'ratings', 'users', ['author_id'], ['id']) + op.drop_constraint(None, 'points_ledger', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('points_ledger_user_id_fkey'), 'points_ledger', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'persons', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('persons_address_id_fkey'), 'persons', 'addresses', ['address_id'], ['id']) + op.drop_constraint(None, 'pending_actions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'pending_actions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('pending_actions_requester_id_fkey'), 'pending_actions', 'users', ['requester_id'], ['id']) + op.create_foreign_key(op.f('pending_actions_approver_id_fkey'), 'pending_actions', 'users', ['approver_id'], ['id']) + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organizations_address_id_fkey'), 'organizations', 'addresses', ['address_id'], ['id']) + op.create_foreign_key(op.f('organizations_owner_id_fkey'), 'organizations', 'users', ['owner_id'], ['id']) + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + existing_nullable=True) + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_members_organization_id_fkey'), 'organization_members', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('organization_members_user_id_fkey'), 'organization_members', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id']) + op.create_foreign_key(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'geo_streets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_constraint(None, 'documents', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('documents_uploaded_by_fkey'), 'documents', 'users', ['uploaded_by'], ['id']) + op.drop_constraint(None, 'credit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('credit_logs_org_id_fkey'), 'credit_logs', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'audit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('audit_logs_user_id_fkey'), 'audit_logs', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('assets_catalog_id_fkey'), 'assets', 'vehicle_catalog', ['catalog_id'], ['id']) + op.drop_constraint(None, 'asset_telemetry', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_financials_asset_id_fkey'), 'asset_financials', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_events', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_events_asset_id_fkey'), 'asset_events', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_costs_organization_id_fkey'), 'asset_costs', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_driver_id_fkey'), 'asset_costs', 'users', ['driver_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_asset_id_fkey'), 'asset_costs', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'addresses', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('addresses_postal_code_id_fkey'), 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id']) + # ### end Alembic commands ### diff --git a/backend/migrations/versions_backup/bc5669f12ffd_add_pending_actions_for_dual_control.py b/backend/migrations/versions_backup/bc5669f12ffd_add_pending_actions_for_dual_control.py new file mode 100755 index 0000000..0328b64 --- /dev/null +++ b/backend/migrations/versions_backup/bc5669f12ffd_add_pending_actions_for_dual_control.py @@ -0,0 +1,174 @@ +"""add_pending_actions_for_dual_control + +Revision ID: bc5669f12ffd +Revises: ffffad1dbe37 +Create Date: 2026-02-10 17:43:45.357771 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = 'bc5669f12ffd' +down_revision: Union[str, Sequence[str], None] = 'ffffad1dbe37' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(op.f('addresses_postal_code_id_fkey'), 'addresses', type_='foreignkey') + op.create_foreign_key(None, 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', type_='foreignkey') + op.create_foreign_key(None, 'asset_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_assignments', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_costs_organization_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_driver_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_asset_id_fkey'), 'asset_costs', type_='foreignkey') + op.create_foreign_key(None, 'asset_costs', 'users', ['driver_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_events_asset_id_fkey'), 'asset_events', type_='foreignkey') + op.create_foreign_key(None, 'asset_events', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_financials_asset_id_fkey'), 'asset_financials', type_='foreignkey') + op.create_foreign_key(None, 'asset_financials', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', type_='foreignkey') + op.drop_constraint(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', type_='foreignkey') + op.create_foreign_key(None, 'asset_reviews', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_reviews', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', type_='foreignkey') + op.create_foreign_key(None, 'asset_telemetry', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('assets_catalog_id_fkey'), 'assets', type_='foreignkey') + op.create_foreign_key(None, 'assets', 'vehicle_catalog', ['catalog_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('audit_logs_user_id_fkey'), 'audit_logs', type_='foreignkey') + op.create_foreign_key(None, 'audit_logs', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('credit_logs_org_id_fkey'), 'credit_logs', type_='foreignkey') + op.create_foreign_key(None, 'credit_logs', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('documents_uploaded_by_fkey'), 'documents', type_='foreignkey') + op.create_foreign_key(None, 'documents', 'users', ['uploaded_by'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', type_='foreignkey') + op.create_foreign_key(None, 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.drop_constraint(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.create_foreign_key(None, 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_subscriptions', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('organization_members_user_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_organization_id_fkey'), 'organization_members', type_='foreignkey') + op.create_foreign_key(None, 'organization_members', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organization_members', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + existing_nullable=True) + op.drop_constraint(op.f('organizations_address_id_fkey'), 'organizations', type_='foreignkey') + op.drop_constraint(op.f('organizations_owner_id_fkey'), 'organizations', type_='foreignkey') + op.create_foreign_key(None, 'organizations', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organizations', 'users', ['owner_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('persons_address_id_fkey'), 'persons', type_='foreignkey') + op.create_foreign_key(None, 'persons', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('points_ledger_user_id_fkey'), 'points_ledger', type_='foreignkey') + op.create_foreign_key(None, 'points_ledger', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('ratings_author_id_fkey'), 'ratings', type_='foreignkey') + op.create_foreign_key(None, 'ratings', 'users', ['author_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_specialties_parent_id_fkey'), 'service_specialties', type_='foreignkey') + op.create_foreign_key(None, 'service_specialties', 'service_specialties', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_badges_badge_id_fkey'), 'user_badges', type_='foreignkey') + op.drop_constraint(op.f('user_badges_user_id_fkey'), 'user_badges', type_='foreignkey') + op.create_foreign_key(None, 'user_badges', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'user_badges', 'badges', ['badge_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_stats_user_id_fkey'), 'user_stats', type_='foreignkey') + op.create_foreign_key(None, 'user_stats', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('users_person_id_fkey'), 'users', type_='foreignkey') + op.create_foreign_key(None, 'users', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.drop_constraint(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_ownerships', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', type_='foreignkey') + op.create_foreign_key(None, 'verification_tokens', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('wallets_user_id_fkey'), 'wallets', type_='foreignkey') + op.create_foreign_key(None, 'wallets', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'wallets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('wallets_user_id_fkey'), 'wallets', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'verification_tokens', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id']) + op.drop_constraint(None, 'users', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('users_person_id_fkey'), 'users', 'persons', ['person_id'], ['id']) + op.drop_constraint(None, 'user_stats', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_stats_user_id_fkey'), 'user_stats', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_badges_user_id_fkey'), 'user_badges', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('user_badges_badge_id_fkey'), 'user_badges', 'badges', ['badge_id'], ['id']) + op.drop_constraint(None, 'service_specialties', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_specialties_parent_id_fkey'), 'service_specialties', 'service_specialties', ['parent_id'], ['id']) + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('ratings_author_id_fkey'), 'ratings', 'users', ['author_id'], ['id']) + op.drop_constraint(None, 'points_ledger', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('points_ledger_user_id_fkey'), 'points_ledger', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'persons', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('persons_address_id_fkey'), 'persons', 'addresses', ['address_id'], ['id']) + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organizations_owner_id_fkey'), 'organizations', 'users', ['owner_id'], ['id']) + op.create_foreign_key(op.f('organizations_address_id_fkey'), 'organizations', 'addresses', ['address_id'], ['id']) + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + existing_nullable=True) + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_members_organization_id_fkey'), 'organization_members', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('organization_members_user_id_fkey'), 'organization_members', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id']) + op.create_foreign_key(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'geo_streets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_constraint(None, 'documents', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('documents_uploaded_by_fkey'), 'documents', 'users', ['uploaded_by'], ['id']) + op.drop_constraint(None, 'credit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('credit_logs_org_id_fkey'), 'credit_logs', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'audit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('audit_logs_user_id_fkey'), 'audit_logs', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('assets_catalog_id_fkey'), 'assets', 'vehicle_catalog', ['catalog_id'], ['id']) + op.drop_constraint(None, 'asset_telemetry', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_financials_asset_id_fkey'), 'asset_financials', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_events', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_events_asset_id_fkey'), 'asset_events', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_costs_asset_id_fkey'), 'asset_costs', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_driver_id_fkey'), 'asset_costs', 'users', ['driver_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_organization_id_fkey'), 'asset_costs', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'addresses', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('addresses_postal_code_id_fkey'), 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id']) + # ### end Alembic commands ### diff --git a/backend/migrations/versions_backup/f2d8996357ac_create_system_parameters_table.py b/backend/migrations/versions_backup/f2d8996357ac_create_system_parameters_table.py new file mode 100755 index 0000000..b728815 --- /dev/null +++ b/backend/migrations/versions_backup/f2d8996357ac_create_system_parameters_table.py @@ -0,0 +1,194 @@ +"""create_system_parameters_table + +Revision ID: f2d8996357ac +Revises: 12607787ed0b +Create Date: 2026-02-11 00:36:20.741116 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = 'f2d8996357ac' +down_revision: Union[str, Sequence[str], None] = '12607787ed0b' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(op.f('addresses_postal_code_id_fkey'), 'addresses', type_='foreignkey') + op.create_foreign_key(None, 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', type_='foreignkey') + op.create_foreign_key(None, 'asset_assignments', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_costs_driver_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_organization_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_asset_id_fkey'), 'asset_costs', type_='foreignkey') + op.create_foreign_key(None, 'asset_costs', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'users', ['driver_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_events_asset_id_fkey'), 'asset_events', type_='foreignkey') + op.create_foreign_key(None, 'asset_events', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_financials_asset_id_fkey'), 'asset_financials', type_='foreignkey') + op.create_foreign_key(None, 'asset_financials', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', type_='foreignkey') + op.drop_constraint(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', type_='foreignkey') + op.create_foreign_key(None, 'asset_reviews', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_reviews', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', type_='foreignkey') + op.create_foreign_key(None, 'asset_telemetry', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('assets_catalog_id_fkey'), 'assets', type_='foreignkey') + op.create_foreign_key(None, 'assets', 'vehicle_catalog', ['catalog_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('audit_logs_user_id_fkey'), 'audit_logs', type_='foreignkey') + op.create_foreign_key(None, 'audit_logs', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('credit_logs_org_id_fkey'), 'credit_logs', type_='foreignkey') + op.create_foreign_key(None, 'credit_logs', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('documents_uploaded_by_fkey'), 'documents', type_='foreignkey') + op.create_foreign_key(None, 'documents', 'users', ['uploaded_by'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', type_='foreignkey') + op.create_foreign_key(None, 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.drop_constraint(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.create_foreign_key(None, 'org_subscriptions', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('organization_members_user_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_organization_id_fkey'), 'organization_members', type_='foreignkey') + op.create_foreign_key(None, 'organization_members', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organization_members', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + existing_nullable=True) + op.drop_constraint(op.f('organizations_address_id_fkey'), 'organizations', type_='foreignkey') + op.drop_constraint(op.f('organizations_owner_id_fkey'), 'organizations', type_='foreignkey') + op.create_foreign_key(None, 'organizations', 'users', ['owner_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organizations', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('pending_actions_approver_id_fkey'), 'pending_actions', type_='foreignkey') + op.drop_constraint(op.f('pending_actions_requester_id_fkey'), 'pending_actions', type_='foreignkey') + op.create_foreign_key(None, 'pending_actions', 'users', ['approver_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'pending_actions', 'users', ['requester_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('persons_address_id_fkey'), 'persons', type_='foreignkey') + op.create_foreign_key(None, 'persons', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('points_ledger_user_id_fkey'), 'points_ledger', type_='foreignkey') + op.create_foreign_key(None, 'points_ledger', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('ratings_author_id_fkey'), 'ratings', type_='foreignkey') + op.create_foreign_key(None, 'ratings', 'users', ['author_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_specialties_parent_id_fkey'), 'service_specialties', type_='foreignkey') + op.create_foreign_key(None, 'service_specialties', 'service_specialties', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('social_accounts_user_id_fkey'), 'social_accounts', type_='foreignkey') + op.create_foreign_key(None, 'social_accounts', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_index(op.f('ix_data_system_parameters_id'), table_name='system_parameters') + op.drop_index(op.f('ix_data_system_parameters_key'), table_name='system_parameters') + op.create_index(op.f('ix_data_system_parameters_key'), 'system_parameters', ['key'], unique=False, schema='data') + op.drop_column('system_parameters', 'id') + op.drop_constraint(op.f('user_badges_badge_id_fkey'), 'user_badges', type_='foreignkey') + op.drop_constraint(op.f('user_badges_user_id_fkey'), 'user_badges', type_='foreignkey') + op.create_foreign_key(None, 'user_badges', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'user_badges', 'badges', ['badge_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_stats_user_id_fkey'), 'user_stats', type_='foreignkey') + op.create_foreign_key(None, 'user_stats', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('users_person_id_fkey'), 'users', type_='foreignkey') + op.create_foreign_key(None, 'users', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.drop_constraint(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'vehicle_ownerships', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', type_='foreignkey') + op.create_foreign_key(None, 'verification_tokens', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('wallets_user_id_fkey'), 'wallets', type_='foreignkey') + op.create_foreign_key(None, 'wallets', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'wallets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('wallets_user_id_fkey'), 'wallets', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'verification_tokens', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id']) + op.drop_constraint(None, 'users', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('users_person_id_fkey'), 'users', 'persons', ['person_id'], ['id']) + op.drop_constraint(None, 'user_stats', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_stats_user_id_fkey'), 'user_stats', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_badges_user_id_fkey'), 'user_badges', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('user_badges_badge_id_fkey'), 'user_badges', 'badges', ['badge_id'], ['id']) + op.add_column('system_parameters', sa.Column('id', sa.INTEGER(), autoincrement=True, nullable=False)) + op.drop_index(op.f('ix_data_system_parameters_key'), table_name='system_parameters', schema='data') + op.create_index(op.f('ix_data_system_parameters_key'), 'system_parameters', ['key'], unique=True) + op.create_index(op.f('ix_data_system_parameters_id'), 'system_parameters', ['id'], unique=False) + op.drop_constraint(None, 'social_accounts', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('social_accounts_user_id_fkey'), 'social_accounts', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'service_specialties', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_specialties_parent_id_fkey'), 'service_specialties', 'service_specialties', ['parent_id'], ['id']) + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('ratings_author_id_fkey'), 'ratings', 'users', ['author_id'], ['id']) + op.drop_constraint(None, 'points_ledger', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('points_ledger_user_id_fkey'), 'points_ledger', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'persons', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('persons_address_id_fkey'), 'persons', 'addresses', ['address_id'], ['id']) + op.drop_constraint(None, 'pending_actions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'pending_actions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('pending_actions_requester_id_fkey'), 'pending_actions', 'users', ['requester_id'], ['id']) + op.create_foreign_key(op.f('pending_actions_approver_id_fkey'), 'pending_actions', 'users', ['approver_id'], ['id']) + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organizations_owner_id_fkey'), 'organizations', 'users', ['owner_id'], ['id']) + op.create_foreign_key(op.f('organizations_address_id_fkey'), 'organizations', 'addresses', ['address_id'], ['id']) + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + existing_nullable=True) + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_members_organization_id_fkey'), 'organization_members', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('organization_members_user_id_fkey'), 'organization_members', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', 'organizations', ['org_id'], ['id']) + op.create_foreign_key(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id']) + op.drop_constraint(None, 'geo_streets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_constraint(None, 'documents', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('documents_uploaded_by_fkey'), 'documents', 'users', ['uploaded_by'], ['id']) + op.drop_constraint(None, 'credit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('credit_logs_org_id_fkey'), 'credit_logs', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'audit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('audit_logs_user_id_fkey'), 'audit_logs', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('assets_catalog_id_fkey'), 'assets', 'vehicle_catalog', ['catalog_id'], ['id']) + op.drop_constraint(None, 'asset_telemetry', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_financials_asset_id_fkey'), 'asset_financials', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_events', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_events_asset_id_fkey'), 'asset_events', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_costs_asset_id_fkey'), 'asset_costs', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_organization_id_fkey'), 'asset_costs', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_driver_id_fkey'), 'asset_costs', 'users', ['driver_id'], ['id']) + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', 'organizations', ['organization_id'], ['id']) + op.drop_constraint(None, 'addresses', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('addresses_postal_code_id_fkey'), 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id']) + # ### end Alembic commands ### diff --git a/backend/migrations/versions_backup/ffffad1dbe37_upgrade_audit_log_for_security.py b/backend/migrations/versions_backup/ffffad1dbe37_upgrade_audit_log_for_security.py new file mode 100755 index 0000000..5c97066 --- /dev/null +++ b/backend/migrations/versions_backup/ffffad1dbe37_upgrade_audit_log_for_security.py @@ -0,0 +1,192 @@ +"""upgrade_audit_log_for_security + +Revision ID: ffffad1dbe37 +Revises: 8e06c5386cba +Create Date: 2026-02-10 17:33:17.436161 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = 'ffffad1dbe37' +down_revision: Union[str, Sequence[str], None] = '8e06c5386cba' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(op.f('addresses_postal_code_id_fkey'), 'addresses', type_='foreignkey') + op.create_foreign_key(None, 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', type_='foreignkey') + op.drop_constraint(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', type_='foreignkey') + op.create_foreign_key(None, 'asset_assignments', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_assignments', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_costs_driver_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_asset_id_fkey'), 'asset_costs', type_='foreignkey') + op.drop_constraint(op.f('asset_costs_organization_id_fkey'), 'asset_costs', type_='foreignkey') + op.create_foreign_key(None, 'asset_costs', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'users', ['driver_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_costs', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_events_asset_id_fkey'), 'asset_events', type_='foreignkey') + op.create_foreign_key(None, 'asset_events', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_financials_asset_id_fkey'), 'asset_financials', type_='foreignkey') + op.create_foreign_key(None, 'asset_financials', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', type_='foreignkey') + op.drop_constraint(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', type_='foreignkey') + op.create_foreign_key(None, 'asset_reviews', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'asset_reviews', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', type_='foreignkey') + op.create_foreign_key(None, 'asset_telemetry', 'assets', ['asset_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('assets_catalog_id_fkey'), 'assets', type_='foreignkey') + op.create_foreign_key(None, 'assets', 'vehicle_catalog', ['catalog_id'], ['id'], source_schema='data', referent_schema='data') + op.add_column('audit_logs', sa.Column('severity', sa.Enum('info', 'warning', 'critical', 'emergency', name='logseverity'), nullable=False)) + op.add_column('audit_logs', sa.Column('old_data', sa.JSON(), nullable=True)) + op.add_column('audit_logs', sa.Column('new_data', sa.JSON(), nullable=True)) + op.add_column('audit_logs', sa.Column('ip_address', sa.String(length=45), nullable=True)) + op.add_column('audit_logs', sa.Column('user_agent', sa.Text(), nullable=True)) + op.create_index(op.f('ix_data_audit_logs_action'), 'audit_logs', ['action'], unique=False, schema='data') + op.create_index(op.f('ix_data_audit_logs_ip_address'), 'audit_logs', ['ip_address'], unique=False, schema='data') + op.create_index(op.f('ix_data_audit_logs_timestamp'), 'audit_logs', ['timestamp'], unique=False, schema='data') + op.drop_constraint(op.f('audit_logs_user_id_fkey'), 'audit_logs', type_='foreignkey') + op.create_foreign_key(None, 'audit_logs', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_column('audit_logs', 'changes') + op.drop_constraint(op.f('credit_logs_org_id_fkey'), 'credit_logs', type_='foreignkey') + op.create_foreign_key(None, 'credit_logs', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('documents_uploaded_by_fkey'), 'documents', type_='foreignkey') + op.create_foreign_key(None, 'documents', 'users', ['uploaded_by'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', type_='foreignkey') + op.create_foreign_key(None, 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.drop_constraint(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', type_='foreignkey') + op.create_foreign_key(None, 'org_subscriptions', 'organizations', ['org_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('organization_members_user_id_fkey'), 'organization_members', type_='foreignkey') + op.drop_constraint(op.f('organization_members_organization_id_fkey'), 'organization_members', type_='foreignkey') + op.create_foreign_key(None, 'organization_members', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organization_members', 'organizations', ['organization_id'], ['id'], source_schema='data', referent_schema='data') + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + existing_nullable=True) + op.drop_constraint(op.f('organizations_address_id_fkey'), 'organizations', type_='foreignkey') + op.drop_constraint(op.f('organizations_owner_id_fkey'), 'organizations', type_='foreignkey') + op.create_foreign_key(None, 'organizations', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'organizations', 'users', ['owner_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('persons_address_id_fkey'), 'persons', type_='foreignkey') + op.create_foreign_key(None, 'persons', 'addresses', ['address_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('points_ledger_user_id_fkey'), 'points_ledger', type_='foreignkey') + op.create_foreign_key(None, 'points_ledger', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('ratings_author_id_fkey'), 'ratings', type_='foreignkey') + op.create_foreign_key(None, 'ratings', 'users', ['author_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('service_specialties_parent_id_fkey'), 'service_specialties', type_='foreignkey') + op.create_foreign_key(None, 'service_specialties', 'service_specialties', ['parent_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_badges_user_id_fkey'), 'user_badges', type_='foreignkey') + op.drop_constraint(op.f('user_badges_badge_id_fkey'), 'user_badges', type_='foreignkey') + op.create_foreign_key(None, 'user_badges', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'user_badges', 'badges', ['badge_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('user_stats_user_id_fkey'), 'user_stats', type_='foreignkey') + op.create_foreign_key(None, 'user_stats', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('users_person_id_fkey'), 'users', type_='foreignkey') + op.create_foreign_key(None, 'users', 'persons', ['person_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.drop_constraint(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', type_='foreignkey') + op.create_foreign_key(None, 'vehicle_ownerships', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + op.create_foreign_key(None, 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id'], source_schema='data', referent_schema='data') + op.drop_constraint(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', type_='foreignkey') + op.create_foreign_key(None, 'verification_tokens', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data', ondelete='CASCADE') + op.drop_constraint(op.f('wallets_user_id_fkey'), 'wallets', type_='foreignkey') + op.create_foreign_key(None, 'wallets', 'users', ['user_id'], ['id'], source_schema='data', referent_schema='data') + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'wallets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('wallets_user_id_fkey'), 'wallets', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'verification_tokens', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('verification_tokens_user_id_fkey'), 'verification_tokens', 'users', ['user_id'], ['id'], ondelete='CASCADE') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.drop_constraint(None, 'vehicle_ownerships', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('vehicle_ownerships_user_id_fkey'), 'vehicle_ownerships', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('vehicle_ownerships_vehicle_id_fkey'), 'vehicle_ownerships', 'assets', ['vehicle_id'], ['id']) + op.drop_constraint(None, 'users', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('users_person_id_fkey'), 'users', 'persons', ['person_id'], ['id']) + op.drop_constraint(None, 'user_stats', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_stats_user_id_fkey'), 'user_stats', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.drop_constraint(None, 'user_badges', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('user_badges_badge_id_fkey'), 'user_badges', 'badges', ['badge_id'], ['id']) + op.create_foreign_key(op.f('user_badges_user_id_fkey'), 'user_badges', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'service_specialties', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('service_specialties_parent_id_fkey'), 'service_specialties', 'service_specialties', ['parent_id'], ['id']) + op.drop_constraint(None, 'ratings', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('ratings_author_id_fkey'), 'ratings', 'users', ['author_id'], ['id']) + op.drop_constraint(None, 'points_ledger', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('points_ledger_user_id_fkey'), 'points_ledger', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'persons', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('persons_address_id_fkey'), 'persons', 'addresses', ['address_id'], ['id']) + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organizations', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organizations_owner_id_fkey'), 'organizations', 'users', ['owner_id'], ['id']) + op.create_foreign_key(op.f('organizations_address_id_fkey'), 'organizations', 'addresses', ['address_id'], ['id']) + op.alter_column('organizations', 'org_type', + existing_type=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype', schema='data', inherit_schema=True), + type_=postgresql.ENUM('individual', 'service', 'service_provider', 'fleet_owner', 'club', 'business', name='orgtype'), + existing_nullable=True) + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.drop_constraint(None, 'organization_members', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('organization_members_organization_id_fkey'), 'organization_members', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('organization_members_user_id_fkey'), 'organization_members', 'users', ['user_id'], ['id']) + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.drop_constraint(None, 'org_subscriptions', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('org_subscriptions_tier_id_fkey'), 'org_subscriptions', 'subscription_tiers', ['tier_id'], ['id']) + op.create_foreign_key(op.f('org_subscriptions_org_id_fkey'), 'org_subscriptions', 'organizations', ['org_id'], ['id']) + op.drop_constraint(None, 'geo_streets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('geo_streets_postal_code_id_fkey'), 'geo_streets', 'geo_postal_codes', ['postal_code_id'], ['id']) + op.drop_constraint(None, 'documents', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('documents_uploaded_by_fkey'), 'documents', 'users', ['uploaded_by'], ['id']) + op.drop_constraint(None, 'credit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('credit_logs_org_id_fkey'), 'credit_logs', 'organizations', ['org_id'], ['id']) + op.add_column('audit_logs', sa.Column('changes', postgresql.JSON(astext_type=sa.Text()), autoincrement=False, nullable=True)) + op.drop_constraint(None, 'audit_logs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('audit_logs_user_id_fkey'), 'audit_logs', 'users', ['user_id'], ['id']) + op.drop_index(op.f('ix_data_audit_logs_timestamp'), table_name='audit_logs', schema='data') + op.drop_index(op.f('ix_data_audit_logs_ip_address'), table_name='audit_logs', schema='data') + op.drop_index(op.f('ix_data_audit_logs_action'), table_name='audit_logs', schema='data') + op.drop_column('audit_logs', 'user_agent') + op.drop_column('audit_logs', 'ip_address') + op.drop_column('audit_logs', 'new_data') + op.drop_column('audit_logs', 'old_data') + op.drop_column('audit_logs', 'severity') + op.drop_constraint(None, 'assets', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('assets_catalog_id_fkey'), 'assets', 'vehicle_catalog', ['catalog_id'], ['id']) + op.drop_constraint(None, 'asset_telemetry', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_telemetry_asset_id_fkey'), 'asset_telemetry', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_reviews', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_reviews_user_id_fkey'), 'asset_reviews', 'users', ['user_id'], ['id']) + op.create_foreign_key(op.f('asset_reviews_asset_id_fkey'), 'asset_reviews', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_financials', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_financials_asset_id_fkey'), 'asset_financials', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_events', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_events_asset_id_fkey'), 'asset_events', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_costs', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_costs_organization_id_fkey'), 'asset_costs', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_asset_id_fkey'), 'asset_costs', 'assets', ['asset_id'], ['id']) + op.create_foreign_key(op.f('asset_costs_driver_id_fkey'), 'asset_costs', 'users', ['driver_id'], ['id']) + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.drop_constraint(None, 'asset_assignments', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('asset_assignments_organization_id_fkey'), 'asset_assignments', 'organizations', ['organization_id'], ['id']) + op.create_foreign_key(op.f('asset_assignments_asset_id_fkey'), 'asset_assignments', 'assets', ['asset_id'], ['id']) + op.drop_constraint(None, 'addresses', schema='data', type_='foreignkey') + op.create_foreign_key(op.f('addresses_postal_code_id_fkey'), 'addresses', 'geo_postal_codes', ['postal_code_id'], ['id']) + # ### end Alembic commands ### diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100755 index 0000000..0953b86 --- /dev/null +++ b/backend/requirements.txt @@ -0,0 +1,33 @@ +fastapi +uvicorn[standard] +sqlalchemy +asyncpg +python-dotenv +python-multipart +python-jose[cryptography] +bcrypt +passlib[bcrypt] +pydantic +pydantic-settings +minio +redis +email-validator +alembic +psycopg[binary] +httpx +pydantic[email] +sendgrid==6.* +Pillow +Authlib +itsdangerous +fastapi-limiter==0.1.5 +pyotp +cryptography +GeoAlchemy2>=0.14.0 +google-generativeai +google-genai +rapidfuzz +duckduckgo-search>=6.0.0 +Shapely>=2.0.0 +opencv-python-headless==4.9.0.80 +numpy<2.0.0 \ No newline at end of file diff --git a/backend/scrapers/vehicle_master_data.py b/backend/scrapers/vehicle_master_data.py new file mode 100755 index 0000000..23c00ae --- /dev/null +++ b/backend/scrapers/vehicle_master_data.py @@ -0,0 +1,89 @@ +import asyncio +import os +from sqlalchemy.ext.asyncio import create_async_engine +from sqlalchemy import text +from dotenv import load_dotenv + +load_dotenv(os.path.join(os.path.dirname(__file__), '../../.env')) + +DATABASE_URL = os.getenv("DATABASE_URL") + +# Kezdő adatkészlet +INITIAL_DATA = { + "BMW": ["3 Series", "5 Series", "X5", "R 1250 GS (Motor)"], + "Toyota": ["Corolla", "Yaris", "RAV4", "Hilux"], + "Volkswagen": ["Golf", "Passat", "Tiguan", "Polo"], + "Honda": ["Civic", "CR-V", "CB500X (Motor)", "Africa Twin (Motor)"], + "Audi": ["A3", "A4", "A6", "Q5"], + "Mercedes-Benz": ["C-Class", "E-Class", "S-Class", "G-Class"], + "Suzuki": ["Swift", "Vitara", "S-Cross", "DL 650 V-Strom (Motor)"] +} + +async def seed_vehicles(): + # Ha a DATABASE_URL környezeti változóból jön, azt használjuk + engine = create_async_engine(DATABASE_URL) + + try: + async with engine.begin() as conn: + print("--- 🛠️ Struktúra ellenőrzése és építése... ---") + + # 1. SÉMA ÉS TÁBLÁK LÉTREHOZÁSA (Ez a hiányzó láncszem!) + await conn.execute(text("CREATE SCHEMA IF NOT EXISTS ref;")) + + await conn.execute(text(""" + CREATE TABLE IF NOT EXISTS ref.vehicle_makes ( + id SERIAL PRIMARY KEY, + name VARCHAR(100) UNIQUE NOT NULL + ); + """)) + + await conn.execute(text(""" + CREATE TABLE IF NOT EXISTS ref.vehicle_models ( + id SERIAL PRIMARY KEY, + make_id INTEGER REFERENCES ref.vehicle_makes(id) ON DELETE CASCADE, + model_name VARCHAR(100) NOT NULL, + category VARCHAR(50), + technical_data JSONB, + UNIQUE(make_id, model_name) + ); + """)) + print("--- ✅ Táblák sikeresen létrehozva/ellenőrizve ---") + + # 2. ADATOK FELTÖLTÉSE + print(f"--- 📥 Adatok betöltése... ---") + for make, models in INITIAL_DATA.items(): + await conn.execute( + text("INSERT INTO ref.vehicle_makes (name) VALUES (:name) ON CONFLICT (name) DO NOTHING"), + {"name": make} + ) + + result = await conn.execute( + text("SELECT id FROM ref.vehicle_makes WHERE name = :name"), + {"name": make} + ) + make_id = result.scalar() + + for model in models: + category = "Motor" if "(Motor)" in model else "Autó" + clean_model = model.replace(" (Motor)", "") + + await conn.execute( + text(""" + INSERT INTO ref.vehicle_models (make_id, model_name, category) + VALUES (:make_id, :name, :cat) + ON CONFLICT DO NOTHING + """), + {"make_id": make_id, "name": clean_model, "cat": category} + ) + print(f" -> Mentve: {make} {clean_model}") + + print("\n--- 🏁 SIKER! Minden adat a helyén van. ---") + + except Exception as e: + print(f"\n❌ KRITIKUS HIBA: {e}") + + finally: + await engine.dispose() + +if __name__ == "__main__": + asyncio.run(seed_vehicles()) diff --git a/backend/seed_data.py b/backend/seed_data.py new file mode 100755 index 0000000..484a01d --- /dev/null +++ b/backend/seed_data.py @@ -0,0 +1,49 @@ +import asyncio +from sqlalchemy import text +from app.db.session import engine + +# 200+ Autó márka és Motor márkák discovery listája +DATA = { + "CAR": [ + "Toyota", "Volkswagen", "Ford", "BMW", "Mercedes-Benz", "Audi", "Honda", "Hyundai", "Kia", "Mazda", + "Nissan", "Opel", "Peugeot", "Renault", "Skoda", "Suzuki", "Volvo", "Fiat", "Dacia", "Citroen", + "Tesla", "Lexus", "Alfa Romeo", "Jaguar", "Land Rover", "Mitsubishi", "Subaru", "Seat", "Cupra", + "Jeep", "Chevrolet", "Cadillac", "Buick", "GMC", "Dodge", "Ram", "Chrysler", "Acura", "Infiniti", + "Lincoln", "Porsche", "Mini", "Smart", "Bentley", "Rolls-Royce", "Lamborghini", "Ferrari", "Maserati", + "Aston Martin", "Bugatti", "Lotus", "McLaren", "Polestar", "Genesis", "BYD", "Geely", "Chery", "MG", + "Lada", "Iveco", "Isuzu", "SsangYong", "Rover", "Saab", "Lancia", "Pontiac", "Saturn", "Hummer", "Oldsmobile" + ], + "MOTORCYCLE": [ + "Honda", "Yamaha", "Kawasaki", "Suzuki", "BMW Motorrad", "Harley-Davidson", "Ducati", "KTM", "Triumph", + "Royal Enfield", "Indian", "Aprilia", "Moto Guzzi", "Vespa", "Piaggio", "MV Agusta", "Norton", "Husqvarna", + "Benelli", "Bimota", "Beta", "Gas Gas", "Sherco", "CF Moto", "Hyosung", "Keeway", "SYM", "Kymco", "Bajaj", "Zero" + ], + "TRUCK": ["Scania", "Volvo Trucks", "MAN", "DAF", "Iveco", "Mercedes-Benz Trucks", "Renault Trucks", "MACK", "Peterbilt", "Kenworth"], + "VAN": ["Ford Commercial", "Volkswagen Commercial", "Iveco Daily", "Mercedes-Benz Vans", "Fiat Professional"] +} + +async def seed(): + async with engine.begin() as conn: + print("🔍 Adatok szinkronizálása...") + + # 1. Kategóriák + for cat in DATA.keys(): + await conn.execute(text("INSERT INTO data.vehicle_categories (name) VALUES (:n) ON CONFLICT (name) DO NOTHING"), {"n": cat}) + + res = await conn.execute(text("SELECT id, name FROM data.vehicle_categories")) + cat_map = {row.name: row.id for row in res} + + # 2. Márkák feltöltése + count = 0 + for cat_name, brands in DATA.items(): + cat_id = cat_map[cat_name] + for brand in brands: + await conn.execute(text( + "INSERT INTO data.vehicle_brands (category_id, name) VALUES (:c, :n) ON CONFLICT DO NOTHING" + ), {"c": cat_id, "n": brand}) + count += 1 + + print(f"✅ SIKER: {count} márka rögzítve az adatbázisban!") + +if __name__ == "__main__": + asyncio.run(seed()) diff --git a/backend/seed_discovery.py b/backend/seed_discovery.py new file mode 100755 index 0000000..018eb28 --- /dev/null +++ b/backend/seed_discovery.py @@ -0,0 +1,32 @@ +import asyncio +import httpx +from sqlalchemy import text +from app.db.session import SessionLocal + +async def seed(): + print("🚀 RDW Márka-felfedezés indul...") + url = "https://opendata.rdw.nl/resource/m9d7-ebf2.json?$select=distinct%20merk&$limit=50000" + + async with httpx.AsyncClient() as client: + resp = await client.get(url, timeout=60) + if resp.status_code != 200: + print(f"❌ Hiba: {resp.status_code}") + return + + makes = resp.json() + print(f"📦 {len(makes)} márkát találtam. Mentés...") + + async with SessionLocal() as db: + for item in makes: + m = item['merk'].upper() + # ON CONFLICT: Ha már benne van (pl. n8n betette), ne legyen hiba + await db.execute(text(""" + INSERT INTO data.catalog_discovery (make, model, source, status) + VALUES (:m, 'ALL', 'global_seed', 'pending') + ON CONFLICT DO NOTHING + """), {"m": m}) + await db.commit() + print("✅ Kész! A discovery tábla felöltve az összes EU-s márkával.") + +if __name__ == "__main__": + asyncio.run(seed()) \ No newline at end of file diff --git a/backend/seed_models.py b/backend/seed_models.py new file mode 100755 index 0000000..26f3e4b --- /dev/null +++ b/backend/seed_models.py @@ -0,0 +1,35 @@ +import asyncio +from sqlalchemy import text +from app.db.session import engine + +# Discovery adatok a 200 márkához (példa bővíthető) +MODELS_DISCOVERY = { + "Toyota": ["Corolla", "Yaris", "Hilux", "RAV4", "C-HR", "Avensis", "Land Cruiser"], + "Volkswagen": ["Golf", "Passat", "Polo", "Tiguan", "Touran", "Transporter", "Caddy"], + "BMW": ["3 Series", "5 Series", "X5", "X3", "1 Series", "7 Series"], + "Honda": ["Civic", "CR-V", "Jazz", "Accord", "CB 500", "Africa Twin"], # Autó és motor is! + "Yamaha": ["MT-07", "R1", "Tracer 900", "Ténéré 700", "XMAX"], + "Scania": ["R-series", "S-series", "G-series", "P-series"] +} + +async def discovery_bot(): + async with engine.begin() as conn: + print("🤖 Jármű típus felderítő bot indul...") + + # Lekérjük az összes márkát + res = await conn.execute(text("SELECT id, name FROM data.vehicle_brands")) + brands = res.fetchall() + + count = 0 + for b_id, b_name in brands: + if b_name in MODELS_DISCOVERY: + for model in MODELS_DISCOVERY[b_name]: + await conn.execute(text( + "INSERT INTO data.vehicle_models (brand_id, name) VALUES (:b, :n) ON CONFLICT DO NOTHING" + ), {"b": b_id, "n": model}) + count += 1 + + print(f"✅ Bot végzett: {count} új típus rögzítve!") + +if __name__ == "__main__": + asyncio.run(discovery_bot()) \ No newline at end of file diff --git a/backend/seed_passenger_cars.py b/backend/seed_passenger_cars.py new file mode 100755 index 0000000..37152a2 --- /dev/null +++ b/backend/seed_passenger_cars.py @@ -0,0 +1,82 @@ +import psycopg2 +from psycopg2.extras import RealDictCursor +import os +from dotenv import load_dotenv + +load_dotenv() + +def get_connection(): + db_host = os.getenv("POSTGRES_HOST", "localhost") + if db_host == "postgres-db": + db_host = "localhost" + + return psycopg2.connect( + dbname=os.getenv("POSTGRES_DB", "service_finder"), + user=os.getenv("POSTGRES_USER", "kincses"), + password=os.getenv("POSTGRES_PASSWORD", "PASSWORD"), + host=db_host, + port=os.getenv("POSTGRES_PORT", "5432") + ) + +def seed_system(): + conn = None + try: + conn = get_connection() + cur = conn.cursor(cursor_factory=RealDictCursor) + print("🚀 Kapcsolat aktív. Adatok szinkronizálása...") + + # 1. MÁRKÁK SZINKRONIZÁLÁSA + brands = [ + {'name': 'Volkswagen', 'slug': 'volkswagen', 'origin': 'Germany'}, + {'name': 'Audi', 'slug': 'audi', 'origin': 'Germany'}, + {'name': 'BMW', 'slug': 'bmw', 'origin': 'Germany'}, + {'name': 'Skoda', 'slug': 'skoda', 'origin': 'Czech Republic'}, + {'name': 'Toyota', 'slug': 'toyota', 'origin': 'Japan'} + ] + + for b in brands: + # Megnézzük, létezik-e már + cur.execute("SELECT id FROM data.vehicle_brands WHERE name = %s", (b['name'],)) + row = cur.fetchone() + + if row: + # Frissítés (Update), ha már létezik + cur.execute(""" + UPDATE data.vehicle_brands + SET slug = COALESCE(slug, %s), + country_of_origin = %s + WHERE id = %s + """, (b['slug'], b['origin'], row['id'])) + else: + # Beszúrás (Insert), ha új + cur.execute(""" + INSERT INTO data.vehicle_brands (name, slug, country_of_origin) + VALUES (%s, %s, %s) + """, (b['name'], b['slug'], b['origin'])) + + # 2. MOTOROK SZINKRONIZÁLÁSA + engines = [ + ('CAGA', 'diesel', 105, 15000), + ('DADA', 'petrol', 110, 30000), + ('B47D20', 'diesel', 140, 25000) + ] + + for code, fuel, kw, interval in engines: + cur.execute("SELECT id FROM data.engine_specs WHERE engine_code = %s", (code,)) + if not cur.fetchone(): + cur.execute(""" + INSERT INTO data.engine_specs (engine_code, fuel_type, power_kw, default_service_interval_km) + VALUES (%s, %s, %s, %s) + """, (code, fuel, kw, interval)) + + conn.commit() + print("✅ Szinkronizálás sikeres! Az adatbázis naprakész.") + + except Exception as e: + print(f"❌ Hiba: {e}") + if conn: conn.rollback() + finally: + if conn: conn.close() + +if __name__ == "__main__": + seed_system() \ No newline at end of file diff --git a/backend/seed_vehicles.py b/backend/seed_vehicles.py new file mode 100755 index 0000000..3bcfaeb --- /dev/null +++ b/backend/seed_vehicles.py @@ -0,0 +1,49 @@ +import asyncio +from sqlalchemy import text +from app.db.session import engine + +# 200+ Autó márka és Motor márkák discovery listája +DATA = { + "CAR": [ + "Toyota", "Volkswagen", "Ford", "BMW", "Mercedes-Benz", "Audi", "Honda", "Hyundai", "Kia", "Mazda", + "Nissan", "Opel", "Peugeot", "Renault", "Skoda", "Suzuki", "Volvo", "Fiat", "Dacia", "Citroen", + "Tesla", "Lexus", "Alfa Romeo", "Jaguar", "Land Rover", "Mitsubishi", "Subaru", "Seat", "Cupra", + "Jeep", "Chevrolet", "Cadillac", "Buick", "GMC", "Dodge", "Ram", "Chrysler", "Acura", "Infiniti", + "Lincoln", "Porsche", "Mini", "Smart", "Bentley", "Rolls-Royce", "Lamborghini", "Ferrari", "Maserati", + "Aston Martin", "Bugatti", "Lotus", "McLaren", "Polestar", "Genesis", "BYD", "Geely", "Chery", "MG", + "Lada", "Iveco", "Isuzu", "SsangYong", "Rover", "Saab", "Lancia", "Pontiac", "Saturn", "Hummer", "Oldsmobile" + ], + "MOTORCYCLE": [ + "Honda", "Yamaha", "Kawasaki", "Suzuki", "BMW Motorrad", "Harley-Davidson", "Ducati", "KTM", "Triumph", + "Royal Enfield", "Indian", "Aprilia", "Moto Guzzi", "Vespa", "Piaggio", "MV Agusta", "Norton", "Husqvarna", + "Benelli", "Bimota", "Beta", "Gas Gas", "Sherco", "CF Moto", "Hyosung", "Keeway", "SYM", "Kymco", "Bajaj", "Zero" + ], + "TRUCK": ["Scania", "Volvo Trucks", "MAN", "DAF", "Iveco", "Mercedes-Benz Trucks", "Renault Trucks", "MACK", "Peterbilt", "Kenworth"], + "VAN": ["Ford Commercial", "Volkswagen Commercial", "Iveco Daily", "Mercedes-Benz Vans", "Fiat Professional"] +} + +async def seed(): + async with engine.begin() as conn: + print("🔍 Adatok szinkronizálása...") + + # 1. Kategóriák + for cat in DATA.keys(): + await conn.execute(text("INSERT INTO data.vehicle_categories (name) VALUES (:n) ON CONFLICT (name) DO NOTHING"), {"n": cat}) + + res = await conn.execute(text("SELECT id, name FROM data.vehicle_categories")) + cat_map = {row.name: row.id for row in res} + + # 2. Márkák feltöltése + count = 0 + for cat_name, brands in DATA.items(): + cat_id = cat_map[cat_name] + for brand in brands: + await conn.execute(text( + "INSERT INTO data.vehicle_brands (category_id, name) VALUES (:c, :n) ON CONFLICT DO NOTHING" + ), {"c": cat_id, "n": brand}) + count += 1 + + print(f"✅ SIKER: {count} márka rögzítve az adatbázisban!") + +if __name__ == "__main__": + asyncio.run(seed()) \ No newline at end of file diff --git a/backend/static/locales/en.json b/backend/static/locales/en.json new file mode 100755 index 0000000..ebb70b5 --- /dev/null +++ b/backend/static/locales/en.json @@ -0,0 +1,23 @@ +{ + "AUTH": { + "LOGIN": { + "SUCCESS": "Login successful. Welcome back!" + }, + "ERROR": { + "EMAIL_EXISTS": "This email is already registered." + } + }, + "SENTINEL": { + "LOCK": { + "MSG": "Account locked for security reasons." + } + }, + "EMAIL": { + "REG": { + "SUBJECT": "Confirm your registration" + }, + "PWD_RESET": { + "SUBJECT": "Password Reset Request" + } + } +} \ No newline at end of file diff --git a/backend/static/locales/hu.json b/backend/static/locales/hu.json new file mode 100755 index 0000000..4f623ec --- /dev/null +++ b/backend/static/locales/hu.json @@ -0,0 +1,31 @@ +{ + "AUTH": { + "LOGIN": { + "SUCCESS": "Sikeres bejelentkezés. Üdvözlünk ismét!" + }, + "ERROR": { + "EMAIL_EXISTS": "Ez az e-mail cím már foglalt.", + "UNAUTHORIZED": "Nincs jogosultságod a művelethez." + } + }, + "SENTINEL": { + "LOCK": { + "MSG": "A fiók biztonsági okokból zárolva lett." + }, + "APPROVAL": { + "REQUIRED": "A művelet végrehajtásához egy másik admin jóváhagyása szükséges." + } + }, + "EMAIL": { + "REG": { + "SUBJECT": "Regisztráció megerősítése - Service Finder", + "GREETING": "Szia {{first_name}}! Kattints a linkre a flottád aktiválásához: {{link}}" + }, + "PWD_RESET": { + "SUBJECT": "Jelszó visszaállítás" + } + }, + "COMMON": { + "SAVE_SUCCESS": "Sikeres mentés!" + } +} \ No newline at end of file diff --git a/backend/test_robot.py b/backend/test_robot.py new file mode 100755 index 0000000..9ac6768 --- /dev/null +++ b/backend/test_robot.py @@ -0,0 +1,20 @@ +import asyncio +from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession +from sqlalchemy.orm import sessionmaker +from app.services.harvester_robot import VehicleHarvester +from app.core.config import settings + +# Adatbázis kapcsolat felépítése a pontos névvel +engine = create_async_engine(str(settings.DATABASE_URL)) +AsyncSessionLocal = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) + +async def run_test(): + async with AsyncSessionLocal() as db: + harvester = VehicleHarvester() + print("🚀 Robot indítása...") + # Megpróbáljuk betölteni a katalógust + await harvester.harvest_all(db) + print("✅ Teszt lefutott.") + +if __name__ == "__main__": + asyncio.run(run_test()) \ No newline at end of file diff --git a/backup_manager.sh b/backup_manager.sh new file mode 100755 index 0000000..9040bad --- /dev/null +++ b/backup_manager.sh @@ -0,0 +1,52 @@ +#!/bin/bash +# 🛡️ SENTINEL INFRA - TARGETED BACKUP SYSTEM v2.3 + +# --- ⚙️ BEÁLLÍTÁSOK (A te környezeti változóid alapján) --- +DB_CONTAINER_NAME="3aa4b73d81e8_shared-postgres" +DB_USER="kincses" # <--- Beállítva a te POSTGRES_USER értékedre + +PROJECT_ROOT="/opt/docker/dev/service_finder" +NAS_ROOT="/mnt/nas/app_data/backups" +TIMESTAMP=$(date +"%Y%m%d_%H%M%S") +DOM=$(date +%d) +DOW=$(date +%u) + +mkdir -p $NAS_ROOT/daily $NAS_ROOT/weekly $NAS_ROOT/monthly + +echo "--- 📦 Célzott mentés indítása: $TIMESTAMP ---" + +# 1. ADATBÁZIS MENTÉS (Streaming - kincses felhasználóval) +DB_BACKUP="db_dump_$TIMESTAMP.sql.gz" +echo "🐘 Adatbázis dump készítése ($DB_USER felhasználóval)..." +docker exec $DB_CONTAINER_NAME pg_dumpall -U $DB_USER | gzip > /tmp/$DB_BACKUP + +# Ellenőrzés: ha 20 bájt, akkor még mindig hiba van +SIZE=$(stat -c%s "/tmp/$DB_BACKUP") +if [ $SIZE -lt 100 ]; then + echo "❌ HIBA: A mentés sikertelen (méret: $SIZE bytes). Ellenőrizd a logokat!" +else + echo "✅ DB mentés sikeres ($SIZE bytes)." +fi + +# 2. KIJELÖLT MAPPÁK MENTÉSE +FILE_BACKUP="project_files_$TIMESTAMP.tar.gz" +echo "📁 Fájlok tömörítése..." +tar -czf /tmp/$FILE_BACKUP -C $PROJECT_ROOT \ + backend docs frontend logs docker-compose.yml .env 2>/dev/null + +# 3. MÁSOLÁS A NAS-RA (Hibakezeléssel) +echo "🚚 Másolás a NAS-ra..." +for f in $DB_BACKUP $FILE_BACKUP; do + if [ -f "/tmp/$f" ]; then + cp "/tmp/$f" "$NAS_ROOT/daily/$f" && rm "/tmp/$f" + + # GFS Rotáció + if [ "$DOM" == "01" ]; then cp "$NAS_ROOT/daily/$f" "$NAS_ROOT/monthly/"; fi + if [ "$DOW" == "7" ]; then cp "$NAS_ROOT/daily/$f" "$NAS_ROOT/weekly/"; fi + fi +done + +# 4. TAKARÍTÁS (Régi szemetek törlése) +find $NAS_ROOT/daily -type f -mtime +7 -delete 2>/dev/null + +echo "✅ Mentési folyamat sikeresen lezárva." \ No newline at end of file diff --git a/backup_manager.sh.old b/backup_manager.sh.old new file mode 100755 index 0000000..29dc429 --- /dev/null +++ b/backup_manager.sh.old @@ -0,0 +1,52 @@ +#!/bin/bash +# 🛡️ DOCKER INFRA - GFS BACKUP SYSTEM (Ubuntu 24.04 Optimized) + +# ÚJ ELÉRÉSI UTALOK +PROJECT_ROOT="/opt/docker" +NAS_ROOT="/mnt/nas/app_data/backups" +TIMESTAMP=$(date +"%Y%m%d_%H%M%S") +DOM=$(date +%d) +DOW=$(date +%u) + +# Szükséges mappák biztosítása a NAS-on +mkdir -p $NAS_ROOT/daily $NAS_ROOT/weekly $NAS_ROOT/monthly + +echo "--- 📦 Mentés indítása: $TIMESTAMP ---" + +# 1. ADATBÁZIS MENTÉS (Konzisztens SQL Dump) +# A shared-postgres konténerből kimentjük az összes adatbázist +docker exec shared-postgres pg_dumpall -c -U postgres > $PROJECT_ROOT/full_db_dump.sql + +# 2. TÖMÖRÍTÉS ÉS KONFIGURÁCIÓK MENTÉSE +# Kizárjuk a nyers adatbázis fájlokat és a felesleges node mappákat +BACKUP_FILE="infra_full_$TIMESTAMP.tar.gz" + +tar -czf /tmp/$BACKUP_FILE -C $PROJECT_ROOT \ + --exclude='infra/postgres/data' \ + --exclude='node_modules' \ + --exclude='*.log' \ + . + +# 3. GFS ROTÁCIÓS MÁSOLÁS +if [ "$DOM" == "01" ]; then + echo "Havi mentés rögzítése..." + cp /tmp/$BACKUP_FILE $NAS_ROOT/monthly/ +fi + +if [ "$DOW" == "7" ]; then + echo "Heti mentés rögzítése..." + cp /tmp/$BACKUP_FILE $NAS_ROOT/weekly/ +fi + +# Napi mentés +mv /tmp/$BACKUP_FILE $NAS_ROOT/daily/ + +# 4. AUTOMATIKUS TAKARÍTÁS (30 napos heti, 1 éves havi mentés megőrzése) +find $NAS_ROOT/daily -type f -mtime +7 -delete +find $NAS_ROOT/weekly -type f -mtime +30 -delete +find $NAS_ROOT/monthly -type f -mtime +365 -delete + +# 5. IDEIGLENES SQL DUMP TÖRLÉSE +rm $PROJECT_ROOT/full_db_dump.sql + +echo "✅ Mentés sikeresen lezárva: $NAS_ROOT/daily/$BACKUP_FILE" \ No newline at end of file diff --git a/code-server-config/.bash_history b/code-server-config/.bash_history new file mode 100755 index 0000000..666ed01 --- /dev/null +++ b/code-server-config/.bash_history @@ -0,0 +1,95 @@ +sudo docker compose up -d +python3 /opt/service_finder/backend/scrapers/vehicle_master_data.py +pip install httpx beautifulsoup4 sqlalchemy asyncpg python-dotenv +ping service_finder_api -c 4 +docker ps +cd .. +docker ps +ls +cd project +ls +cat requirements.txt +docker network inspect service_finder_net +cd .. +docker network inspect service_finder_net +ping service_finder_api -c 4 +ls +cd projekt +ping service_finder_api -c 4 +API_IP=$(sudo docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' service_finder_api) +curl http://$API_IP:8000/vehicles +API_IP=$(sudo docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' service_finder_api) +sudo apt update +sudo apt install -y python3-pip +~pip3 install httpx beautifulsoup4 sqlalchemy asyncpg python-dotenv +pip3 install httpx beautifulsoup4 sqlalchemy asyncpg python-dotenv +python3 /opt/service_finder/backend/scrapers/vehicle_master_data.py +python3 backend/scrapers/vehicle_master_data.py +pip3 install httpx beautifulsoup4 sqlalchemy asyncpg python-dotenv +python3 backend/scrapers/vehicle_master_data.py +pip3 install httpx beautifulsoup4 sqlalchemy asyncpg python-dotenv --break-system-packages +python3 backend/scrapers/vehicle_master_data.py +ls +cd backend +ls +cd scrapers +ls +rm -f vehicle_master_data.py +sudo rm -f vehicle_master_data.py +ls +nano vehicle_master_data.py +sudo chown -R $USER:$USER . +cd .. +sudo chown -R $USER:$USER . +cat < backend/scrapers/vehicle_master_data.py +import asyncio +import os +from sqlalchemy.ext.asyncio import create_async_engine +from sqlalchemy import text +from dotenv import load_dotenv + +# .env betöltése +load_dotenv(os.path.join(os.path.dirname(__file__), '../../.env')) + +DATABASE_URL = os.getenv("DATABASE_URL") +if not DATABASE_URL: + print("HIBA: Nem találom a DATABASE_URL-t a .env fájlban!") + exit(1) + +# Adatkészlet +INITIAL_DATA = { + "BMW": ["3 Series", "5 Series", "X5", "R 1250 GS (Motor)"], + "Toyota": ["Corolla", "Yaris", "RAV4", "Hilux"], + "Volkswagen": ["Golf", "Passat", "Tiguan", "Polo"], + "Honda": ["Civic", "CR-V", "CB500X (Motor)", "Africa Twin (Motor)"], + "Audi": ["A3", "A4", "A6", "Q5"], + "Mercedes-Benz": ["C-Class", "E-Class", "S-Class", "G-Class"], + "Suzuki": ["Swift", "Vitara", "S-Cross", "DL 650 V-Strom (Motor)"] +} + +async def seed_vehicles(): + engine = create_async_engine(DATABASE_URL) + try: + async with engine.begin() as conn: + print(f"--- Csatlakozás az adatbázishoz... ---") + for make, models in INITIAL_DATA.items(): + await conn.execute(text("INSERT INTO ref.vehicle_makes (name) VALUES (:name) ON CONFLICT (name) DO NOTHING"), {"name": make}) + + result = await conn.execute(text("SELECT id FROM ref.vehicle_makes WHERE name = :name"), {"name": make}) + make_id = result.scalar() + + for model in models: + category = "Motor" if "(Motor)" in model else "Autó" + clean_model = model.replace(" (Motor)", "") + await conn.execute(text("INSERT INTO ref.vehicle_models (make_id, model_name, category) VALUES (:make_id, :name, :cat) ON CONFLICT DO NOTHING"), {"make_id": make_id, "name": clean_model, "cat": category}) + print(f"✅ Mentve: {make} -> {clean_model} ({category})") + print("\n--- SIKER! Az adatbázis feltöltése befejeződött. ---") + except Exception as e: + print(f"\n❌ HIBA TÖRTÉNT: {e}") + finally: + await engine.dispose() + +if __name__ == "__main__": + asyncio.run(seed_vehicles()) +EOF + diff --git a/code-server-config/.bashrc b/code-server-config/.bashrc new file mode 100755 index 0000000..f6939ee --- /dev/null +++ b/code-server-config/.bashrc @@ -0,0 +1,99 @@ +# ~/.bashrc: executed by bash(1) for non-login shells. +# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) +# for examples + +# If not running interactively, don't do anything +[ -z "$PS1" ] && return + +# don't put duplicate lines in the history. See bash(1) for more options +# ... or force ignoredups and ignorespace +HISTCONTROL=ignoredups:ignorespace + +# append to the history file, don't overwrite it +shopt -s histappend + +# for setting history length see HISTSIZE and HISTFILESIZE in bash(1) +HISTSIZE=1000 +HISTFILESIZE=2000 + +# check the window size after each command and, if necessary, +# update the values of LINES and COLUMNS. +shopt -s checkwinsize + +# make less more friendly for non-text input files, see lesspipe(1) +[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)" + +# set variable identifying the chroot you work in (used in the prompt below) +if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then + debian_chroot=$(cat /etc/debian_chroot) +fi + +# set a fancy prompt (non-color, unless we know we "want" color) +case "$TERM" in + xterm-color) color_prompt=yes;; +esac + +# uncomment for a colored prompt, if the terminal has the capability; turned +# off by default to not distract the user: the focus in a terminal window +# should be on the output of commands, not on the prompt +#force_color_prompt=yes + +if [ -n "$force_color_prompt" ]; then + if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then + # We have color support; assume it's compliant with Ecma-48 + # (ISO/IEC-6429). (Lack of such support is extremely rare, and such + # a case would tend to support setf rather than setaf.) + color_prompt=yes + else + color_prompt= + fi +fi + +if [ "$color_prompt" = yes ]; then + PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' +else + PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' +fi +unset color_prompt force_color_prompt + +# If this is an xterm set the title to user@host:dir +case "$TERM" in +xterm*|rxvt*) + PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1" + ;; +*) + ;; +esac + +# enable color support of ls and also add handy aliases +if [ -x /usr/bin/dircolors ]; then + test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" + alias ls='ls --color=auto' + #alias dir='dir --color=auto' + #alias vdir='vdir --color=auto' + + alias grep='grep --color=auto' + alias fgrep='fgrep --color=auto' + alias egrep='egrep --color=auto' +fi + +# some more ls aliases +alias ll='ls -alF' +alias la='ls -A' +alias l='ls -CF' + +# Alias definitions. +# You may want to put all your additions into a separate file like +# ~/.bash_aliases, instead of adding them here directly. +# See /usr/share/doc/bash-doc/examples in the bash-doc package. + +if [ -f ~/.bash_aliases ]; then + . ~/.bash_aliases +fi + +# enable programmable completion features (you don't need to enable +# this, if it's already enabled in /etc/bash.bashrc and /etc/profile +# sources /etc/bash.bashrc). +#if [ -f /etc/bash_completion ] && ! shopt -oq posix; then +# . /etc/bash_completion +#fi diff --git a/code-server-config/.cache/Microsoft/DeveloperTools/deviceid b/code-server-config/.cache/Microsoft/DeveloperTools/deviceid new file mode 100755 index 0000000..d27c133 --- /dev/null +++ b/code-server-config/.cache/Microsoft/DeveloperTools/deviceid @@ -0,0 +1 @@ +b5dbfcec-d709-4c74-ab40-0013b288137b \ No newline at end of file diff --git a/code-server-config/.cache/pip/http-v2/0/4/8/4/7/0484760df79b094114efd54bf890371889276bd276c1334d1207ab57 b/code-server-config/.cache/pip/http-v2/0/4/8/4/7/0484760df79b094114efd54bf890371889276bd276c1334d1207ab57 new file mode 100755 index 0000000..c32acbf Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/0/4/8/4/7/0484760df79b094114efd54bf890371889276bd276c1334d1207ab57 differ diff --git a/code-server-config/.cache/pip/http-v2/0/4/8/4/7/0484760df79b094114efd54bf890371889276bd276c1334d1207ab57.body b/code-server-config/.cache/pip/http-v2/0/4/8/4/7/0484760df79b094114efd54bf890371889276bd276c1334d1207ab57.body new file mode 100755 index 0000000..470e77a Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/0/4/8/4/7/0484760df79b094114efd54bf890371889276bd276c1334d1207ab57.body differ diff --git a/code-server-config/.cache/pip/http-v2/0/5/a/7/4/05a74540eb65ad078e4e70140f951919d2248dc11cb1db5ccba5484a b/code-server-config/.cache/pip/http-v2/0/5/a/7/4/05a74540eb65ad078e4e70140f951919d2248dc11cb1db5ccba5484a new file mode 100755 index 0000000..baf18b6 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/0/5/a/7/4/05a74540eb65ad078e4e70140f951919d2248dc11cb1db5ccba5484a differ diff --git a/code-server-config/.cache/pip/http-v2/0/5/a/7/4/05a74540eb65ad078e4e70140f951919d2248dc11cb1db5ccba5484a.body b/code-server-config/.cache/pip/http-v2/0/5/a/7/4/05a74540eb65ad078e4e70140f951919d2248dc11cb1db5ccba5484a.body new file mode 100755 index 0000000..b09cb50 --- /dev/null +++ b/code-server-config/.cache/pip/http-v2/0/5/a/7/4/05a74540eb65ad078e4e70140f951919d2248dc11cb1db5ccba5484a.body @@ -0,0 +1,72 @@ +Metadata-Version: 2.4 +Name: typing_extensions +Version: 4.15.0 +Summary: Backported and Experimental Type Hints for Python 3.9+ +Keywords: annotations,backport,checker,checking,function,hinting,hints,type,typechecking,typehinting,typehints,typing +Author-email: "Guido van Rossum, Jukka Lehtosalo, Łukasz Langa, Michael Lee" +Requires-Python: >=3.9 +Description-Content-Type: text/markdown +License-Expression: PSF-2.0 +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console +Classifier: Intended Audience :: Developers +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 +Classifier: Topic :: Software Development +License-File: LICENSE +Project-URL: Bug Tracker, https://github.com/python/typing_extensions/issues +Project-URL: Changes, https://github.com/python/typing_extensions/blob/main/CHANGELOG.md +Project-URL: Documentation, https://typing-extensions.readthedocs.io/ +Project-URL: Home, https://github.com/python/typing_extensions +Project-URL: Q & A, https://github.com/python/typing/discussions +Project-URL: Repository, https://github.com/python/typing_extensions + +# Typing Extensions + +[![Chat at https://gitter.im/python/typing](https://badges.gitter.im/python/typing.svg)](https://gitter.im/python/typing) + +[Documentation](https://typing-extensions.readthedocs.io/en/latest/#) – +[PyPI](https://pypi.org/project/typing-extensions/) + +## Overview + +The `typing_extensions` module serves two related purposes: + +- Enable use of new type system features on older Python versions. For example, + `typing.TypeGuard` is new in Python 3.10, but `typing_extensions` allows + users on previous Python versions to use it too. +- Enable experimentation with new type system PEPs before they are accepted and + added to the `typing` module. + +`typing_extensions` is treated specially by static type checkers such as +mypy and pyright. Objects defined in `typing_extensions` are treated the same +way as equivalent forms in `typing`. + +`typing_extensions` uses +[Semantic Versioning](https://semver.org/). The +major version will be incremented only for backwards-incompatible changes. +Therefore, it's safe to depend +on `typing_extensions` like this: `typing_extensions ~=x.y`, +where `x.y` is the first version that includes all features you need. +[This](https://packaging.python.org/en/latest/specifications/version-specifiers/#compatible-release) +is equivalent to `typing_extensions >=x.y, <(x+1)`. Do not depend on `~= x.y.z` +unless you really know what you're doing; that defeats the purpose of +semantic versioning. + +## Included items + +See [the documentation](https://typing-extensions.readthedocs.io/en/latest/#) for a +complete listing of module contents. + +## Contributing + +See [CONTRIBUTING.md](https://github.com/python/typing_extensions/blob/main/CONTRIBUTING.md) +for how to contribute to `typing_extensions`. + diff --git a/code-server-config/.cache/pip/http-v2/0/a/e/8/4/0ae84cda1068eb8069d0d031ff1b592b6ce0646c279bf59396ff2d05 b/code-server-config/.cache/pip/http-v2/0/a/e/8/4/0ae84cda1068eb8069d0d031ff1b592b6ce0646c279bf59396ff2d05 new file mode 100755 index 0000000..93d0bde Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/0/a/e/8/4/0ae84cda1068eb8069d0d031ff1b592b6ce0646c279bf59396ff2d05 differ diff --git a/code-server-config/.cache/pip/http-v2/0/a/e/8/4/0ae84cda1068eb8069d0d031ff1b592b6ce0646c279bf59396ff2d05.body b/code-server-config/.cache/pip/http-v2/0/a/e/8/4/0ae84cda1068eb8069d0d031ff1b592b6ce0646c279bf59396ff2d05.body new file mode 100755 index 0000000..2f74555 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/0/a/e/8/4/0ae84cda1068eb8069d0d031ff1b592b6ce0646c279bf59396ff2d05.body differ diff --git a/code-server-config/.cache/pip/http-v2/1/2/9/c/8/129c8212d0fe217a753409b4b46ca21c6dd736c8b4e08c093d03ecf3 b/code-server-config/.cache/pip/http-v2/1/2/9/c/8/129c8212d0fe217a753409b4b46ca21c6dd736c8b4e08c093d03ecf3 new file mode 100755 index 0000000..929ed30 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/1/2/9/c/8/129c8212d0fe217a753409b4b46ca21c6dd736c8b4e08c093d03ecf3 differ diff --git a/code-server-config/.cache/pip/http-v2/1/2/9/c/8/129c8212d0fe217a753409b4b46ca21c6dd736c8b4e08c093d03ecf3.body b/code-server-config/.cache/pip/http-v2/1/2/9/c/8/129c8212d0fe217a753409b4b46ca21c6dd736c8b4e08c093d03ecf3.body new file mode 100755 index 0000000..48c7f5e Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/1/2/9/c/8/129c8212d0fe217a753409b4b46ca21c6dd736c8b4e08c093d03ecf3.body differ diff --git a/code-server-config/.cache/pip/http-v2/1/4/a/a/f/14aaf7643dce3f389cfaa2f24beba9e2d02071e4624c02c288b2a440 b/code-server-config/.cache/pip/http-v2/1/4/a/a/f/14aaf7643dce3f389cfaa2f24beba9e2d02071e4624c02c288b2a440 new file mode 100755 index 0000000..bc08150 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/1/4/a/a/f/14aaf7643dce3f389cfaa2f24beba9e2d02071e4624c02c288b2a440 differ diff --git a/code-server-config/.cache/pip/http-v2/1/4/a/a/f/14aaf7643dce3f389cfaa2f24beba9e2d02071e4624c02c288b2a440.body b/code-server-config/.cache/pip/http-v2/1/4/a/a/f/14aaf7643dce3f389cfaa2f24beba9e2d02071e4624c02c288b2a440.body new file mode 100755 index 0000000..0a9780e Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/1/4/a/a/f/14aaf7643dce3f389cfaa2f24beba9e2d02071e4624c02c288b2a440.body differ diff --git a/code-server-config/.cache/pip/http-v2/1/6/0/d/3/160d3e8f69a7eca4743b16bea3eecb80155f94e8435ce6481997004c b/code-server-config/.cache/pip/http-v2/1/6/0/d/3/160d3e8f69a7eca4743b16bea3eecb80155f94e8435ce6481997004c new file mode 100755 index 0000000..f606b67 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/1/6/0/d/3/160d3e8f69a7eca4743b16bea3eecb80155f94e8435ce6481997004c differ diff --git a/code-server-config/.cache/pip/http-v2/1/6/0/d/3/160d3e8f69a7eca4743b16bea3eecb80155f94e8435ce6481997004c.body b/code-server-config/.cache/pip/http-v2/1/6/0/d/3/160d3e8f69a7eca4743b16bea3eecb80155f94e8435ce6481997004c.body new file mode 100755 index 0000000..74013b8 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/1/6/0/d/3/160d3e8f69a7eca4743b16bea3eecb80155f94e8435ce6481997004c.body differ diff --git a/code-server-config/.cache/pip/http-v2/1/9/9/d/1/199d128a8b0a6a727869cf288f0802d0ddfe7785a99b6957366e40a4 b/code-server-config/.cache/pip/http-v2/1/9/9/d/1/199d128a8b0a6a727869cf288f0802d0ddfe7785a99b6957366e40a4 new file mode 100755 index 0000000..8b431c1 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/1/9/9/d/1/199d128a8b0a6a727869cf288f0802d0ddfe7785a99b6957366e40a4 differ diff --git a/code-server-config/.cache/pip/http-v2/1/9/9/d/1/199d128a8b0a6a727869cf288f0802d0ddfe7785a99b6957366e40a4.body b/code-server-config/.cache/pip/http-v2/1/9/9/d/1/199d128a8b0a6a727869cf288f0802d0ddfe7785a99b6957366e40a4.body new file mode 100755 index 0000000..98c8ca4 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/1/9/9/d/1/199d128a8b0a6a727869cf288f0802d0ddfe7785a99b6957366e40a4.body differ diff --git a/code-server-config/.cache/pip/http-v2/1/c/b/6/2/1cb62cfa729fe0a5b07499a3ba93e1da9751c5f79bd2e594bcf319a9 b/code-server-config/.cache/pip/http-v2/1/c/b/6/2/1cb62cfa729fe0a5b07499a3ba93e1da9751c5f79bd2e594bcf319a9 new file mode 100755 index 0000000..36f2cd8 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/1/c/b/6/2/1cb62cfa729fe0a5b07499a3ba93e1da9751c5f79bd2e594bcf319a9 differ diff --git a/code-server-config/.cache/pip/http-v2/1/c/b/6/2/1cb62cfa729fe0a5b07499a3ba93e1da9751c5f79bd2e594bcf319a9.body b/code-server-config/.cache/pip/http-v2/1/c/b/6/2/1cb62cfa729fe0a5b07499a3ba93e1da9751c5f79bd2e594bcf319a9.body new file mode 100755 index 0000000..6ed6e06 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/1/c/b/6/2/1cb62cfa729fe0a5b07499a3ba93e1da9751c5f79bd2e594bcf319a9.body differ diff --git a/code-server-config/.cache/pip/http-v2/2/8/8/5/1/28851bfda9e7b366cbac79b783dc038d1fee039b3e50c3151b437013 b/code-server-config/.cache/pip/http-v2/2/8/8/5/1/28851bfda9e7b366cbac79b783dc038d1fee039b3e50c3151b437013 new file mode 100755 index 0000000..15d3007 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/2/8/8/5/1/28851bfda9e7b366cbac79b783dc038d1fee039b3e50c3151b437013 differ diff --git a/code-server-config/.cache/pip/http-v2/2/8/8/5/1/28851bfda9e7b366cbac79b783dc038d1fee039b3e50c3151b437013.body b/code-server-config/.cache/pip/http-v2/2/8/8/5/1/28851bfda9e7b366cbac79b783dc038d1fee039b3e50c3151b437013.body new file mode 100755 index 0000000..3287809 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/2/8/8/5/1/28851bfda9e7b366cbac79b783dc038d1fee039b3e50c3151b437013.body differ diff --git a/code-server-config/.cache/pip/http-v2/2/c/5/0/9/2c5093416a6abc33fb0ff1433322d374c320a79a2ce63946a0a9ddf3 b/code-server-config/.cache/pip/http-v2/2/c/5/0/9/2c5093416a6abc33fb0ff1433322d374c320a79a2ce63946a0a9ddf3 new file mode 100755 index 0000000..be03b13 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/2/c/5/0/9/2c5093416a6abc33fb0ff1433322d374c320a79a2ce63946a0a9ddf3 differ diff --git a/code-server-config/.cache/pip/http-v2/2/c/5/0/9/2c5093416a6abc33fb0ff1433322d374c320a79a2ce63946a0a9ddf3.body b/code-server-config/.cache/pip/http-v2/2/c/5/0/9/2c5093416a6abc33fb0ff1433322d374c320a79a2ce63946a0a9ddf3.body new file mode 100755 index 0000000..28f2c10 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/2/c/5/0/9/2c5093416a6abc33fb0ff1433322d374c320a79a2ce63946a0a9ddf3.body differ diff --git a/code-server-config/.cache/pip/http-v2/3/0/e/f/1/30ef132248ab98ab0a92d2d15ee6957bdad5542ffbb630d3a32f7721 b/code-server-config/.cache/pip/http-v2/3/0/e/f/1/30ef132248ab98ab0a92d2d15ee6957bdad5542ffbb630d3a32f7721 new file mode 100755 index 0000000..3bb56a9 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/3/0/e/f/1/30ef132248ab98ab0a92d2d15ee6957bdad5542ffbb630d3a32f7721 differ diff --git a/code-server-config/.cache/pip/http-v2/3/0/e/f/1/30ef132248ab98ab0a92d2d15ee6957bdad5542ffbb630d3a32f7721.body b/code-server-config/.cache/pip/http-v2/3/0/e/f/1/30ef132248ab98ab0a92d2d15ee6957bdad5542ffbb630d3a32f7721.body new file mode 100755 index 0000000..f12b3ce Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/3/0/e/f/1/30ef132248ab98ab0a92d2d15ee6957bdad5542ffbb630d3a32f7721.body differ diff --git a/code-server-config/.cache/pip/http-v2/3/d/b/a/4/3dba48e33e4deae5b8e0b5d8173f7d8b9ede86f6e2f3b423cb213061 b/code-server-config/.cache/pip/http-v2/3/d/b/a/4/3dba48e33e4deae5b8e0b5d8173f7d8b9ede86f6e2f3b423cb213061 new file mode 100755 index 0000000..8fe5a5b Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/3/d/b/a/4/3dba48e33e4deae5b8e0b5d8173f7d8b9ede86f6e2f3b423cb213061 differ diff --git a/code-server-config/.cache/pip/http-v2/3/d/b/a/4/3dba48e33e4deae5b8e0b5d8173f7d8b9ede86f6e2f3b423cb213061.body b/code-server-config/.cache/pip/http-v2/3/d/b/a/4/3dba48e33e4deae5b8e0b5d8173f7d8b9ede86f6e2f3b423cb213061.body new file mode 100755 index 0000000..3364ae3 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/3/d/b/a/4/3dba48e33e4deae5b8e0b5d8173f7d8b9ede86f6e2f3b423cb213061.body differ diff --git a/code-server-config/.cache/pip/http-v2/4/b/e/0/7/4be07d3ac353e38d2c9e3a257cad36ee2a758fc88b4cd5f0d479a5a9 b/code-server-config/.cache/pip/http-v2/4/b/e/0/7/4be07d3ac353e38d2c9e3a257cad36ee2a758fc88b4cd5f0d479a5a9 new file mode 100755 index 0000000..8ce1072 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/4/b/e/0/7/4be07d3ac353e38d2c9e3a257cad36ee2a758fc88b4cd5f0d479a5a9 differ diff --git a/code-server-config/.cache/pip/http-v2/4/b/e/0/7/4be07d3ac353e38d2c9e3a257cad36ee2a758fc88b4cd5f0d479a5a9.body b/code-server-config/.cache/pip/http-v2/4/b/e/0/7/4be07d3ac353e38d2c9e3a257cad36ee2a758fc88b4cd5f0d479a5a9.body new file mode 100755 index 0000000..4d8f88b Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/4/b/e/0/7/4be07d3ac353e38d2c9e3a257cad36ee2a758fc88b4cd5f0d479a5a9.body differ diff --git a/code-server-config/.cache/pip/http-v2/5/5/2/5/6/55256db6e6c4a92962a75c471feaebd79e275a5b686bc92196b908dd b/code-server-config/.cache/pip/http-v2/5/5/2/5/6/55256db6e6c4a92962a75c471feaebd79e275a5b686bc92196b908dd new file mode 100755 index 0000000..3dc7ded Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/5/5/2/5/6/55256db6e6c4a92962a75c471feaebd79e275a5b686bc92196b908dd differ diff --git a/code-server-config/.cache/pip/http-v2/5/5/2/5/6/55256db6e6c4a92962a75c471feaebd79e275a5b686bc92196b908dd.body b/code-server-config/.cache/pip/http-v2/5/5/2/5/6/55256db6e6c4a92962a75c471feaebd79e275a5b686bc92196b908dd.body new file mode 100755 index 0000000..5e275a7 --- /dev/null +++ b/code-server-config/.cache/pip/http-v2/5/5/2/5/6/55256db6e6c4a92962a75c471feaebd79e275a5b686bc92196b908dd.body @@ -0,0 +1,243 @@ +Metadata-Version: 2.4 +Name: SQLAlchemy +Version: 2.0.45 +Summary: Database Abstraction Library +Home-page: https://www.sqlalchemy.org +Author: Mike Bayer +Author-email: mike_mp@zzzcomputing.com +License: MIT +Project-URL: Documentation, https://docs.sqlalchemy.org +Project-URL: Issue Tracker, https://github.com/sqlalchemy/sqlalchemy/ +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Database :: Front-Ends +Requires-Python: >=3.7 +Description-Content-Type: text/x-rst +License-File: LICENSE +Requires-Dist: importlib-metadata; python_version < "3.8" +Requires-Dist: greenlet>=1; platform_machine == "aarch64" or (platform_machine == "ppc64le" or (platform_machine == "x86_64" or (platform_machine == "amd64" or (platform_machine == "AMD64" or (platform_machine == "win32" or platform_machine == "WIN32"))))) +Requires-Dist: typing-extensions>=4.6.0 +Provides-Extra: asyncio +Requires-Dist: greenlet>=1; extra == "asyncio" +Provides-Extra: mypy +Requires-Dist: mypy>=0.910; extra == "mypy" +Provides-Extra: mssql +Requires-Dist: pyodbc; extra == "mssql" +Provides-Extra: mssql-pymssql +Requires-Dist: pymssql; extra == "mssql-pymssql" +Provides-Extra: mssql-pyodbc +Requires-Dist: pyodbc; extra == "mssql-pyodbc" +Provides-Extra: mysql +Requires-Dist: mysqlclient>=1.4.0; extra == "mysql" +Provides-Extra: mysql-connector +Requires-Dist: mysql-connector-python; extra == "mysql-connector" +Provides-Extra: mariadb-connector +Requires-Dist: mariadb!=1.1.10,!=1.1.2,!=1.1.5,>=1.0.1; extra == "mariadb-connector" +Provides-Extra: oracle +Requires-Dist: cx_oracle>=8; extra == "oracle" +Provides-Extra: oracle-oracledb +Requires-Dist: oracledb>=1.0.1; extra == "oracle-oracledb" +Provides-Extra: postgresql +Requires-Dist: psycopg2>=2.7; extra == "postgresql" +Provides-Extra: postgresql-pg8000 +Requires-Dist: pg8000>=1.29.1; extra == "postgresql-pg8000" +Provides-Extra: postgresql-asyncpg +Requires-Dist: greenlet>=1; extra == "postgresql-asyncpg" +Requires-Dist: asyncpg; extra == "postgresql-asyncpg" +Provides-Extra: postgresql-psycopg2binary +Requires-Dist: psycopg2-binary; extra == "postgresql-psycopg2binary" +Provides-Extra: postgresql-psycopg2cffi +Requires-Dist: psycopg2cffi; extra == "postgresql-psycopg2cffi" +Provides-Extra: postgresql-psycopg +Requires-Dist: psycopg>=3.0.7; extra == "postgresql-psycopg" +Provides-Extra: postgresql-psycopgbinary +Requires-Dist: psycopg[binary]>=3.0.7; extra == "postgresql-psycopgbinary" +Provides-Extra: pymysql +Requires-Dist: pymysql; extra == "pymysql" +Provides-Extra: aiomysql +Requires-Dist: greenlet>=1; extra == "aiomysql" +Requires-Dist: aiomysql>=0.2.0; extra == "aiomysql" +Provides-Extra: aioodbc +Requires-Dist: greenlet>=1; extra == "aioodbc" +Requires-Dist: aioodbc; extra == "aioodbc" +Provides-Extra: asyncmy +Requires-Dist: greenlet>=1; extra == "asyncmy" +Requires-Dist: asyncmy!=0.2.4,!=0.2.6,>=0.2.3; extra == "asyncmy" +Provides-Extra: aiosqlite +Requires-Dist: greenlet>=1; extra == "aiosqlite" +Requires-Dist: aiosqlite; extra == "aiosqlite" +Requires-Dist: typing_extensions!=3.10.0.1; extra == "aiosqlite" +Provides-Extra: sqlcipher +Requires-Dist: sqlcipher3_binary; extra == "sqlcipher" +Dynamic: license-file + +SQLAlchemy +========== + +|PyPI| |Python| |Downloads| + +.. |PyPI| image:: https://img.shields.io/pypi/v/sqlalchemy + :target: https://pypi.org/project/sqlalchemy + :alt: PyPI + +.. |Python| image:: https://img.shields.io/pypi/pyversions/sqlalchemy + :target: https://pypi.org/project/sqlalchemy + :alt: PyPI - Python Version + +.. |Downloads| image:: https://static.pepy.tech/badge/sqlalchemy/month + :target: https://pepy.tech/project/sqlalchemy + :alt: PyPI - Downloads + + +The Python SQL Toolkit and Object Relational Mapper + +Introduction +------------- + +SQLAlchemy is the Python SQL toolkit and Object Relational Mapper +that gives application developers the full power and +flexibility of SQL. SQLAlchemy provides a full suite +of well known enterprise-level persistence patterns, +designed for efficient and high-performing database +access, adapted into a simple and Pythonic domain +language. + +Major SQLAlchemy features include: + +* An industrial strength ORM, built + from the core on the identity map, unit of work, + and data mapper patterns. These patterns + allow transparent persistence of objects + using a declarative configuration system. + Domain models + can be constructed and manipulated naturally, + and changes are synchronized with the + current transaction automatically. +* A relationally-oriented query system, exposing + the full range of SQL's capabilities + explicitly, including joins, subqueries, + correlation, and most everything else, + in terms of the object model. + Writing queries with the ORM uses the same + techniques of relational composition you use + when writing SQL. While you can drop into + literal SQL at any time, it's virtually never + needed. +* A comprehensive and flexible system + of eager loading for related collections and objects. + Collections are cached within a session, + and can be loaded on individual access, all + at once using joins, or by query per collection + across the full result set. +* A Core SQL construction system and DBAPI + interaction layer. The SQLAlchemy Core is + separate from the ORM and is a full database + abstraction layer in its own right, and includes + an extensible Python-based SQL expression + language, schema metadata, connection pooling, + type coercion, and custom types. +* All primary and foreign key constraints are + assumed to be composite and natural. Surrogate + integer primary keys are of course still the + norm, but SQLAlchemy never assumes or hardcodes + to this model. +* Database introspection and generation. Database + schemas can be "reflected" in one step into + Python structures representing database metadata; + those same structures can then generate + CREATE statements right back out - all within + the Core, independent of the ORM. + +SQLAlchemy's philosophy: + +* SQL databases behave less and less like object + collections the more size and performance start to + matter; object collections behave less and less like + tables and rows the more abstraction starts to matter. + SQLAlchemy aims to accommodate both of these + principles. +* An ORM doesn't need to hide the "R". A relational + database provides rich, set-based functionality + that should be fully exposed. SQLAlchemy's + ORM provides an open-ended set of patterns + that allow a developer to construct a custom + mediation layer between a domain model and + a relational schema, turning the so-called + "object relational impedance" issue into + a distant memory. +* The developer, in all cases, makes all decisions + regarding the design, structure, and naming conventions + of both the object model as well as the relational + schema. SQLAlchemy only provides the means + to automate the execution of these decisions. +* With SQLAlchemy, there's no such thing as + "the ORM generated a bad query" - you + retain full control over the structure of + queries, including how joins are organized, + how subqueries and correlation is used, what + columns are requested. Everything SQLAlchemy + does is ultimately the result of a developer-initiated + decision. +* Don't use an ORM if the problem doesn't need one. + SQLAlchemy consists of a Core and separate ORM + component. The Core offers a full SQL expression + language that allows Pythonic construction + of SQL constructs that render directly to SQL + strings for a target database, returning + result sets that are essentially enhanced DBAPI + cursors. +* Transactions should be the norm. With SQLAlchemy's + ORM, nothing goes to permanent storage until + commit() is called. SQLAlchemy encourages applications + to create a consistent means of delineating + the start and end of a series of operations. +* Never render a literal value in a SQL statement. + Bound parameters are used to the greatest degree + possible, allowing query optimizers to cache + query plans effectively and making SQL injection + attacks a non-issue. + +Documentation +------------- + +Latest documentation is at: + +https://www.sqlalchemy.org/docs/ + +Installation / Requirements +--------------------------- + +Full documentation for installation is at +`Installation `_. + +Getting Help / Development / Bug reporting +------------------------------------------ + +Please refer to the `SQLAlchemy Community Guide `_. + +Code of Conduct +--------------- + +Above all, SQLAlchemy places great emphasis on polite, thoughtful, and +constructive communication between users and developers. +Please see our current Code of Conduct at +`Code of Conduct `_. + +License +------- + +SQLAlchemy is distributed under the `MIT license +`_. + diff --git a/code-server-config/.cache/pip/http-v2/6/8/0/d/4/680d4dd80dc6a3d2df9b9478dfcc8e81e0e4f130e154a3268b98b877 b/code-server-config/.cache/pip/http-v2/6/8/0/d/4/680d4dd80dc6a3d2df9b9478dfcc8e81e0e4f130e154a3268b98b877 new file mode 100755 index 0000000..f39f9f0 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/6/8/0/d/4/680d4dd80dc6a3d2df9b9478dfcc8e81e0e4f130e154a3268b98b877 differ diff --git a/code-server-config/.cache/pip/http-v2/6/8/0/d/4/680d4dd80dc6a3d2df9b9478dfcc8e81e0e4f130e154a3268b98b877.body b/code-server-config/.cache/pip/http-v2/6/8/0/d/4/680d4dd80dc6a3d2df9b9478dfcc8e81e0e4f130e154a3268b98b877.body new file mode 100755 index 0000000..bdc3f61 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/6/8/0/d/4/680d4dd80dc6a3d2df9b9478dfcc8e81e0e4f130e154a3268b98b877.body differ diff --git a/code-server-config/.cache/pip/http-v2/6/d/d/7/f/6dd7f72563c9dcb2a786e420e686844bbc8f61eb5d9fae5d3bcb6458 b/code-server-config/.cache/pip/http-v2/6/d/d/7/f/6dd7f72563c9dcb2a786e420e686844bbc8f61eb5d9fae5d3bcb6458 new file mode 100755 index 0000000..67b1d8d Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/6/d/d/7/f/6dd7f72563c9dcb2a786e420e686844bbc8f61eb5d9fae5d3bcb6458 differ diff --git a/code-server-config/.cache/pip/http-v2/6/d/d/7/f/6dd7f72563c9dcb2a786e420e686844bbc8f61eb5d9fae5d3bcb6458.body b/code-server-config/.cache/pip/http-v2/6/d/d/7/f/6dd7f72563c9dcb2a786e420e686844bbc8f61eb5d9fae5d3bcb6458.body new file mode 100755 index 0000000..dbeb198 --- /dev/null +++ b/code-server-config/.cache/pip/http-v2/6/d/d/7/f/6dd7f72563c9dcb2a786e420e686844bbc8f61eb5d9fae5d3bcb6458.body @@ -0,0 +1,96 @@ +Metadata-Version: 2.4 +Name: anyio +Version: 4.12.1 +Summary: High-level concurrency and networking framework on top of asyncio or Trio +Author-email: Alex Grönholm +License-Expression: MIT +Project-URL: Documentation, https://anyio.readthedocs.io/en/latest/ +Project-URL: Changelog, https://anyio.readthedocs.io/en/stable/versionhistory.html +Project-URL: Source code, https://github.com/agronholm/anyio +Project-URL: Issue tracker, https://github.com/agronholm/anyio/issues +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Framework :: AnyIO +Classifier: Typing :: Typed +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 +Requires-Python: >=3.9 +Description-Content-Type: text/x-rst +License-File: LICENSE +Requires-Dist: exceptiongroup>=1.0.2; python_version < "3.11" +Requires-Dist: idna>=2.8 +Requires-Dist: typing_extensions>=4.5; python_version < "3.13" +Provides-Extra: trio +Requires-Dist: trio>=0.32.0; python_version >= "3.10" and extra == "trio" +Requires-Dist: trio>=0.31.0; python_version < "3.10" and extra == "trio" +Dynamic: license-file + +.. image:: https://github.com/agronholm/anyio/actions/workflows/test.yml/badge.svg + :target: https://github.com/agronholm/anyio/actions/workflows/test.yml + :alt: Build Status +.. image:: https://coveralls.io/repos/github/agronholm/anyio/badge.svg?branch=master + :target: https://coveralls.io/github/agronholm/anyio?branch=master + :alt: Code Coverage +.. image:: https://readthedocs.org/projects/anyio/badge/?version=latest + :target: https://anyio.readthedocs.io/en/latest/?badge=latest + :alt: Documentation +.. image:: https://badges.gitter.im/gitterHQ/gitter.svg + :target: https://gitter.im/python-trio/AnyIO + :alt: Gitter chat + +AnyIO is an asynchronous networking and concurrency library that works on top of either asyncio_ or +Trio_. It implements Trio-like `structured concurrency`_ (SC) on top of asyncio and works in harmony +with the native SC of Trio itself. + +Applications and libraries written against AnyIO's API will run unmodified on either asyncio_ or +Trio_. AnyIO can also be adopted into a library or application incrementally – bit by bit, no full +refactoring necessary. It will blend in with the native libraries of your chosen backend. + +To find out why you might want to use AnyIO's APIs instead of asyncio's, you can read about it +`here `_. + +Documentation +------------- + +View full documentation at: https://anyio.readthedocs.io/ + +Features +-------- + +AnyIO offers the following functionality: + +* Task groups (nurseries_ in trio terminology) +* High-level networking (TCP, UDP and UNIX sockets) + + * `Happy eyeballs`_ algorithm for TCP connections (more robust than that of asyncio on Python + 3.8) + * async/await style UDP sockets (unlike asyncio where you still have to use Transports and + Protocols) + +* A versatile API for byte streams and object streams +* Inter-task synchronization and communication (locks, conditions, events, semaphores, object + streams) +* Worker threads +* Subprocesses +* Subinterpreter support for code parallelization (on Python 3.13 and later) +* Asynchronous file I/O (using worker threads) +* Signal handling +* Asynchronous version of the functools_ module + +AnyIO also comes with its own pytest_ plugin which also supports asynchronous fixtures. +It even works with the popular Hypothesis_ library. + +.. _asyncio: https://docs.python.org/3/library/asyncio.html +.. _Trio: https://github.com/python-trio/trio +.. _structured concurrency: https://en.wikipedia.org/wiki/Structured_concurrency +.. _nurseries: https://trio.readthedocs.io/en/stable/reference-core.html#nurseries-and-spawning +.. _Happy eyeballs: https://en.wikipedia.org/wiki/Happy_Eyeballs +.. _pytest: https://docs.pytest.org/en/latest/ +.. _functools: https://docs.python.org/3/library/functools.html +.. _Hypothesis: https://hypothesis.works/ diff --git a/code-server-config/.cache/pip/http-v2/6/f/7/1/9/6f7191662785a6314e6bade3b897cbef6bec19bb8e1ed58745e9e726 b/code-server-config/.cache/pip/http-v2/6/f/7/1/9/6f7191662785a6314e6bade3b897cbef6bec19bb8e1ed58745e9e726 new file mode 100755 index 0000000..2b34989 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/6/f/7/1/9/6f7191662785a6314e6bade3b897cbef6bec19bb8e1ed58745e9e726 differ diff --git a/code-server-config/.cache/pip/http-v2/6/f/7/1/9/6f7191662785a6314e6bade3b897cbef6bec19bb8e1ed58745e9e726.body b/code-server-config/.cache/pip/http-v2/6/f/7/1/9/6f7191662785a6314e6bade3b897cbef6bec19bb8e1ed58745e9e726.body new file mode 100755 index 0000000..d1bc526 --- /dev/null +++ b/code-server-config/.cache/pip/http-v2/6/f/7/1/9/6f7191662785a6314e6bade3b897cbef6bec19bb8e1ed58745e9e726.body @@ -0,0 +1,78 @@ +Metadata-Version: 2.4 +Name: certifi +Version: 2026.1.4 +Summary: Python package for providing Mozilla's CA Bundle. +Home-page: https://github.com/certifi/python-certifi +Author: Kenneth Reitz +Author-email: me@kennethreitz.com +License: MPL-2.0 +Project-URL: Source, https://github.com/certifi/python-certifi +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0) +Classifier: Natural Language :: English +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 +Requires-Python: >=3.7 +License-File: LICENSE +Dynamic: author +Dynamic: author-email +Dynamic: classifier +Dynamic: description +Dynamic: home-page +Dynamic: license +Dynamic: license-file +Dynamic: project-url +Dynamic: requires-python +Dynamic: summary + +Certifi: Python SSL Certificates +================================ + +Certifi provides Mozilla's carefully curated collection of Root Certificates for +validating the trustworthiness of SSL certificates while verifying the identity +of TLS hosts. It has been extracted from the `Requests`_ project. + +Installation +------------ + +``certifi`` is available on PyPI. Simply install it with ``pip``:: + + $ pip install certifi + +Usage +----- + +To reference the installed certificate authority (CA) bundle, you can use the +built-in function:: + + >>> import certifi + + >>> certifi.where() + '/usr/local/lib/python3.7/site-packages/certifi/cacert.pem' + +Or from the command line:: + + $ python -m certifi + /usr/local/lib/python3.7/site-packages/certifi/cacert.pem + +Enjoy! + +.. _`Requests`: https://requests.readthedocs.io/en/master/ + +Addition/Removal of Certificates +-------------------------------- + +Certifi does not support any addition/removal or other modification of the +CA trust store content. This project is intended to provide a reliable and +highly portable root of trust to python deployments. Look to upstream projects +for methods to use alternate trust. diff --git a/code-server-config/.cache/pip/http-v2/7/5/2/4/8/75248c373d50f62ae989db97e5f74613b5b513b024376712f93d486a b/code-server-config/.cache/pip/http-v2/7/5/2/4/8/75248c373d50f62ae989db97e5f74613b5b513b024376712f93d486a new file mode 100755 index 0000000..fdd35cb Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/7/5/2/4/8/75248c373d50f62ae989db97e5f74613b5b513b024376712f93d486a differ diff --git a/code-server-config/.cache/pip/http-v2/7/5/2/4/8/75248c373d50f62ae989db97e5f74613b5b513b024376712f93d486a.body b/code-server-config/.cache/pip/http-v2/7/5/2/4/8/75248c373d50f62ae989db97e5f74613b5b513b024376712f93d486a.body new file mode 100755 index 0000000..c4c3373 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/7/5/2/4/8/75248c373d50f62ae989db97e5f74613b5b513b024376712f93d486a.body differ diff --git a/code-server-config/.cache/pip/http-v2/7/b/f/d/a/7bfda9f6c7fc68d2025bf39812313b43025996be0f6256ea8fc36f0c b/code-server-config/.cache/pip/http-v2/7/b/f/d/a/7bfda9f6c7fc68d2025bf39812313b43025996be0f6256ea8fc36f0c new file mode 100755 index 0000000..04409a0 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/7/b/f/d/a/7bfda9f6c7fc68d2025bf39812313b43025996be0f6256ea8fc36f0c differ diff --git a/code-server-config/.cache/pip/http-v2/7/b/f/d/a/7bfda9f6c7fc68d2025bf39812313b43025996be0f6256ea8fc36f0c.body b/code-server-config/.cache/pip/http-v2/7/b/f/d/a/7bfda9f6c7fc68d2025bf39812313b43025996be0f6256ea8fc36f0c.body new file mode 100755 index 0000000..d928a48 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/7/b/f/d/a/7bfda9f6c7fc68d2025bf39812313b43025996be0f6256ea8fc36f0c.body differ diff --git a/code-server-config/.cache/pip/http-v2/8/0/e/9/4/80e9405db26f4e2bbc6e0b3184aa09055d40bf4a94f7b4a8c5bc70b2 b/code-server-config/.cache/pip/http-v2/8/0/e/9/4/80e9405db26f4e2bbc6e0b3184aa09055d40bf4a94f7b4a8c5bc70b2 new file mode 100755 index 0000000..073f55d Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/8/0/e/9/4/80e9405db26f4e2bbc6e0b3184aa09055d40bf4a94f7b4a8c5bc70b2 differ diff --git a/code-server-config/.cache/pip/http-v2/8/0/e/9/4/80e9405db26f4e2bbc6e0b3184aa09055d40bf4a94f7b4a8c5bc70b2.body b/code-server-config/.cache/pip/http-v2/8/0/e/9/4/80e9405db26f4e2bbc6e0b3184aa09055d40bf4a94f7b4a8c5bc70b2.body new file mode 100755 index 0000000..e461253 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/8/0/e/9/4/80e9405db26f4e2bbc6e0b3184aa09055d40bf4a94f7b4a8c5bc70b2.body differ diff --git a/code-server-config/.cache/pip/http-v2/8/8/f/7/d/88f7d71f2d1361f8fb38230bb8ae05bdb624c08a2414e1c535731370 b/code-server-config/.cache/pip/http-v2/8/8/f/7/d/88f7d71f2d1361f8fb38230bb8ae05bdb624c08a2414e1c535731370 new file mode 100755 index 0000000..fa359f4 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/8/8/f/7/d/88f7d71f2d1361f8fb38230bb8ae05bdb624c08a2414e1c535731370 differ diff --git a/code-server-config/.cache/pip/http-v2/8/8/f/7/d/88f7d71f2d1361f8fb38230bb8ae05bdb624c08a2414e1c535731370.body b/code-server-config/.cache/pip/http-v2/8/8/f/7/d/88f7d71f2d1361f8fb38230bb8ae05bdb624c08a2414e1c535731370.body new file mode 100755 index 0000000..db6c8e4 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/8/8/f/7/d/88f7d71f2d1361f8fb38230bb8ae05bdb624c08a2414e1c535731370.body differ diff --git a/code-server-config/.cache/pip/http-v2/8/b/2/4/2/8b24226e2da88df4abeee0d8ca6bce79b19ca2bcd5f94b543939c66c b/code-server-config/.cache/pip/http-v2/8/b/2/4/2/8b24226e2da88df4abeee0d8ca6bce79b19ca2bcd5f94b543939c66c new file mode 100755 index 0000000..b4fe76e Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/8/b/2/4/2/8b24226e2da88df4abeee0d8ca6bce79b19ca2bcd5f94b543939c66c differ diff --git a/code-server-config/.cache/pip/http-v2/8/b/2/4/2/8b24226e2da88df4abeee0d8ca6bce79b19ca2bcd5f94b543939c66c.body b/code-server-config/.cache/pip/http-v2/8/b/2/4/2/8b24226e2da88df4abeee0d8ca6bce79b19ca2bcd5f94b543939c66c.body new file mode 100755 index 0000000..61a925a Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/8/b/2/4/2/8b24226e2da88df4abeee0d8ca6bce79b19ca2bcd5f94b543939c66c.body differ diff --git a/code-server-config/.cache/pip/http-v2/8/e/c/f/f/8ecffcc7a3e38674c0b5a8addfcc2c1a5184431d21c3b57c81cc4a6d b/code-server-config/.cache/pip/http-v2/8/e/c/f/f/8ecffcc7a3e38674c0b5a8addfcc2c1a5184431d21c3b57c81cc4a6d new file mode 100755 index 0000000..e035425 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/8/e/c/f/f/8ecffcc7a3e38674c0b5a8addfcc2c1a5184431d21c3b57c81cc4a6d differ diff --git a/code-server-config/.cache/pip/http-v2/8/e/c/f/f/8ecffcc7a3e38674c0b5a8addfcc2c1a5184431d21c3b57c81cc4a6d.body b/code-server-config/.cache/pip/http-v2/8/e/c/f/f/8ecffcc7a3e38674c0b5a8addfcc2c1a5184431d21c3b57c81cc4a6d.body new file mode 100755 index 0000000..8a2f639 --- /dev/null +++ b/code-server-config/.cache/pip/http-v2/8/e/c/f/f/8ecffcc7a3e38674c0b5a8addfcc2c1a5184431d21c3b57c81cc4a6d.body @@ -0,0 +1,202 @@ +Metadata-Version: 2.4 +Name: h11 +Version: 0.16.0 +Summary: A pure-Python, bring-your-own-I/O implementation of HTTP/1.1 +Home-page: https://github.com/python-hyper/h11 +Author: Nathaniel J. Smith +Author-email: njs@pobox.com +License: MIT +Classifier: Development Status :: 3 - Alpha +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Topic :: Internet :: WWW/HTTP +Classifier: Topic :: System :: Networking +Requires-Python: >=3.8 +License-File: LICENSE.txt +Dynamic: author +Dynamic: author-email +Dynamic: classifier +Dynamic: description +Dynamic: home-page +Dynamic: license +Dynamic: license-file +Dynamic: requires-python +Dynamic: summary + +h11 +=== + +.. image:: https://travis-ci.org/python-hyper/h11.svg?branch=master + :target: https://travis-ci.org/python-hyper/h11 + :alt: Automated test status + +.. image:: https://codecov.io/gh/python-hyper/h11/branch/master/graph/badge.svg + :target: https://codecov.io/gh/python-hyper/h11 + :alt: Test coverage + +.. image:: https://readthedocs.org/projects/h11/badge/?version=latest + :target: http://h11.readthedocs.io/en/latest/?badge=latest + :alt: Documentation Status + +This is a little HTTP/1.1 library written from scratch in Python, +heavily inspired by `hyper-h2 `_. + +It's a "bring-your-own-I/O" library; h11 contains no IO code +whatsoever. This means you can hook h11 up to your favorite network +API, and that could be anything you want: synchronous, threaded, +asynchronous, or your own implementation of `RFC 6214 +`_ -- h11 won't judge you. +(Compare this to the current state of the art, where every time a `new +network API `_ comes along then someone +gets to start over reimplementing the entire HTTP protocol from +scratch.) Cory Benfield made an `excellent blog post describing the +benefits of this approach +`_, or if you like video +then here's his `PyCon 2016 talk on the same theme +`_. + +This also means that h11 is not immediately useful out of the box: +it's a toolkit for building programs that speak HTTP, not something +that could directly replace ``requests`` or ``twisted.web`` or +whatever. But h11 makes it much easier to implement something like +``requests`` or ``twisted.web``. + +At a high level, working with h11 goes like this: + +1) First, create an ``h11.Connection`` object to track the state of a + single HTTP/1.1 connection. + +2) When you read data off the network, pass it to + ``conn.receive_data(...)``; you'll get back a list of objects + representing high-level HTTP "events". + +3) When you want to send a high-level HTTP event, create the + corresponding "event" object and pass it to ``conn.send(...)``; + this will give you back some bytes that you can then push out + through the network. + +For example, a client might instantiate and then send a +``h11.Request`` object, then zero or more ``h11.Data`` objects for the +request body (e.g., if this is a POST), and then a +``h11.EndOfMessage`` to indicate the end of the message. Then the +server would then send back a ``h11.Response``, some ``h11.Data``, and +its own ``h11.EndOfMessage``. If either side violates the protocol, +you'll get a ``h11.ProtocolError`` exception. + +h11 is suitable for implementing both servers and clients, and has a +pleasantly symmetric API: the events you send as a client are exactly +the ones that you receive as a server and vice-versa. + +`Here's an example of a tiny HTTP client +`_ + +It also has `a fine manual `_. + +FAQ +--- + +*Whyyyyy?* + +I wanted to play with HTTP in `Curio +`__ and `Trio +`__, which at the time didn't have any +HTTP libraries. So I thought, no big deal, Python has, like, a dozen +different implementations of HTTP, surely I can find one that's +reusable. I didn't find one, but I did find Cory's call-to-arms +blog-post. So I figured, well, fine, if I have to implement HTTP from +scratch, at least I can make sure no-one *else* has to ever again. + +*Should I use it?* + +Maybe. You should be aware that it's a very young project. But, it's +feature complete and has an exhaustive test-suite and complete docs, +so the next step is for people to try using it and see how it goes +:-). If you do then please let us know -- if nothing else we'll want +to talk to you before making any incompatible changes! + +*What are the features/limitations?* + +Roughly speaking, it's trying to be a robust, complete, and non-hacky +implementation of the first "chapter" of the HTTP/1.1 spec: `RFC 7230: +HTTP/1.1 Message Syntax and Routing +`_. That is, it mostly focuses on +implementing HTTP at the level of taking bytes on and off the wire, +and the headers related to that, and tries to be anal about spec +conformance. It doesn't know about higher-level concerns like URL +routing, conditional GETs, cross-origin cookie policies, or content +negotiation. But it does know how to take care of framing, +cross-version differences in keep-alive handling, and the "obsolete +line folding" rule, so you can focus your energies on the hard / +interesting parts for your application, and it tries to support the +full specification in the sense that any useful HTTP/1.1 conformant +application should be able to use h11. + +It's pure Python, and has no dependencies outside of the standard +library. + +It has a test suite with 100.0% coverage for both statements and +branches. + +Currently it supports Python 3 (testing on 3.8-3.12) and PyPy 3. +The last Python 2-compatible version was h11 0.11.x. +(Originally it had a Cython wrapper for `http-parser +`_ and a beautiful nested state +machine implemented with ``yield from`` to postprocess the output. But +I had to take these out -- the new *parser* needs fewer lines-of-code +than the old *parser wrapper*, is written in pure Python, uses no +exotic language syntax, and has more features. It's sad, really; that +old state machine was really slick. I just need a few sentences here +to mourn that.) + +I don't know how fast it is. I haven't benchmarked or profiled it yet, +so it's probably got a few pointless hot spots, and I've been trying +to err on the side of simplicity and robustness instead of +micro-optimization. But at the architectural level I tried hard to +avoid fundamentally bad decisions, e.g., I believe that all the +parsing algorithms remain linear-time even in the face of pathological +input like slowloris, and there are no byte-by-byte loops. (I also +believe that it maintains bounded memory usage in the face of +arbitrary/pathological input.) + +The whole library is ~800 lines-of-code. You can read and understand +the whole thing in less than an hour. Most of the energy invested in +this so far has been spent on trying to keep things simple by +minimizing special-cases and ad hoc state manipulation; even though it +is now quite small and simple, I'm still annoyed that I haven't +figured out how to make it even smaller and simpler. (Unfortunately, +HTTP does not lend itself to simplicity.) + +The API is ~feature complete and I don't expect the general outlines +to change much, but you can't judge an API's ergonomics until you +actually document and use it, so I'd expect some changes in the +details. + +*How do I try it?* + +.. code-block:: sh + + $ pip install h11 + $ git clone git@github.com:python-hyper/h11 + $ cd h11/examples + $ python basic-client.py + +and go from there. + +*License?* + +MIT + +*Code of conduct?* + +Contributors are requested to follow our `code of conduct +`_ in +all project spaces. diff --git a/code-server-config/.cache/pip/http-v2/8/f/0/a/d/8f0ad583652318494c12da41e4d30ff6225ec73d448a0754a0a7e898 b/code-server-config/.cache/pip/http-v2/8/f/0/a/d/8f0ad583652318494c12da41e4d30ff6225ec73d448a0754a0a7e898 new file mode 100755 index 0000000..4734feb Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/8/f/0/a/d/8f0ad583652318494c12da41e4d30ff6225ec73d448a0754a0a7e898 differ diff --git a/code-server-config/.cache/pip/http-v2/8/f/0/a/d/8f0ad583652318494c12da41e4d30ff6225ec73d448a0754a0a7e898.body b/code-server-config/.cache/pip/http-v2/8/f/0/a/d/8f0ad583652318494c12da41e4d30ff6225ec73d448a0754a0a7e898.body new file mode 100755 index 0000000..8466935 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/8/f/0/a/d/8f0ad583652318494c12da41e4d30ff6225ec73d448a0754a0a7e898.body differ diff --git a/code-server-config/.cache/pip/http-v2/9/1/1/8/d/9118d2865fad57ca510f5444caa60cda483fe032c97b2b94ff631e21 b/code-server-config/.cache/pip/http-v2/9/1/1/8/d/9118d2865fad57ca510f5444caa60cda483fe032c97b2b94ff631e21 new file mode 100755 index 0000000..2f71a4b Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/9/1/1/8/d/9118d2865fad57ca510f5444caa60cda483fe032c97b2b94ff631e21 differ diff --git a/code-server-config/.cache/pip/http-v2/9/1/1/8/d/9118d2865fad57ca510f5444caa60cda483fe032c97b2b94ff631e21.body b/code-server-config/.cache/pip/http-v2/9/1/1/8/d/9118d2865fad57ca510f5444caa60cda483fe032c97b2b94ff631e21.body new file mode 100755 index 0000000..c39c13b Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/9/1/1/8/d/9118d2865fad57ca510f5444caa60cda483fe032c97b2b94ff631e21.body differ diff --git a/code-server-config/.cache/pip/http-v2/9/1/a/c/4/91ac4141ee513b48d6e2106b8504eedf08543a9ac70e664c84a86c9b b/code-server-config/.cache/pip/http-v2/9/1/a/c/4/91ac4141ee513b48d6e2106b8504eedf08543a9ac70e664c84a86c9b new file mode 100755 index 0000000..d1ba7db Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/9/1/a/c/4/91ac4141ee513b48d6e2106b8504eedf08543a9ac70e664c84a86c9b differ diff --git a/code-server-config/.cache/pip/http-v2/9/1/a/c/4/91ac4141ee513b48d6e2106b8504eedf08543a9ac70e664c84a86c9b.body b/code-server-config/.cache/pip/http-v2/9/1/a/c/4/91ac4141ee513b48d6e2106b8504eedf08543a9ac70e664c84a86c9b.body new file mode 100755 index 0000000..7748a04 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/9/1/a/c/4/91ac4141ee513b48d6e2106b8504eedf08543a9ac70e664c84a86c9b.body differ diff --git a/code-server-config/.cache/pip/http-v2/9/3/6/e/f/936ef88052230050c9d8c803e64ef58ee62e7c4e4f61da74ba2ef008 b/code-server-config/.cache/pip/http-v2/9/3/6/e/f/936ef88052230050c9d8c803e64ef58ee62e7c4e4f61da74ba2ef008 new file mode 100755 index 0000000..3f621b4 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/9/3/6/e/f/936ef88052230050c9d8c803e64ef58ee62e7c4e4f61da74ba2ef008 differ diff --git a/code-server-config/.cache/pip/http-v2/9/3/6/e/f/936ef88052230050c9d8c803e64ef58ee62e7c4e4f61da74ba2ef008.body b/code-server-config/.cache/pip/http-v2/9/3/6/e/f/936ef88052230050c9d8c803e64ef58ee62e7c4e4f61da74ba2ef008.body new file mode 100755 index 0000000..8056834 --- /dev/null +++ b/code-server-config/.cache/pip/http-v2/9/3/6/e/f/936ef88052230050c9d8c803e64ef58ee62e7c4e4f61da74ba2ef008.body @@ -0,0 +1,625 @@ +Metadata-Version: 2.4 +Name: httpcore +Version: 1.0.9 +Summary: A minimal low-level HTTP client. +Project-URL: Documentation, https://www.encode.io/httpcore +Project-URL: Homepage, https://www.encode.io/httpcore/ +Project-URL: Source, https://github.com/encode/httpcore +Author-email: Tom Christie +License-Expression: BSD-3-Clause +License-File: LICENSE.md +Classifier: Development Status :: 3 - Alpha +Classifier: Environment :: Web Environment +Classifier: Framework :: AsyncIO +Classifier: Framework :: Trio +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Topic :: Internet :: WWW/HTTP +Requires-Python: >=3.8 +Requires-Dist: certifi +Requires-Dist: h11>=0.16 +Provides-Extra: asyncio +Requires-Dist: anyio<5.0,>=4.0; extra == 'asyncio' +Provides-Extra: http2 +Requires-Dist: h2<5,>=3; extra == 'http2' +Provides-Extra: socks +Requires-Dist: socksio==1.*; extra == 'socks' +Provides-Extra: trio +Requires-Dist: trio<1.0,>=0.22.0; extra == 'trio' +Description-Content-Type: text/markdown + +# HTTP Core + +[![Test Suite](https://github.com/encode/httpcore/workflows/Test%20Suite/badge.svg)](https://github.com/encode/httpcore/actions) +[![Package version](https://badge.fury.io/py/httpcore.svg)](https://pypi.org/project/httpcore/) + +> *Do one thing, and do it well.* + +The HTTP Core package provides a minimal low-level HTTP client, which does +one thing only. Sending HTTP requests. + +It does not provide any high level model abstractions over the API, +does not handle redirects, multipart uploads, building authentication headers, +transparent HTTP caching, URL parsing, session cookie handling, +content or charset decoding, handling JSON, environment based configuration +defaults, or any of that Jazz. + +Some things HTTP Core does do: + +* Sending HTTP requests. +* Thread-safe / task-safe connection pooling. +* HTTP(S) proxy & SOCKS proxy support. +* Supports HTTP/1.1 and HTTP/2. +* Provides both sync and async interfaces. +* Async backend support for `asyncio` and `trio`. + +## Requirements + +Python 3.8+ + +## Installation + +For HTTP/1.1 only support, install with: + +```shell +$ pip install httpcore +``` + +There are also a number of optional extras available... + +```shell +$ pip install httpcore['asyncio,trio,http2,socks'] +``` + +## Sending requests + +Send an HTTP request: + +```python +import httpcore + +response = httpcore.request("GET", "https://www.example.com/") + +print(response) +# +print(response.status) +# 200 +print(response.headers) +# [(b'Accept-Ranges', b'bytes'), (b'Age', b'557328'), (b'Cache-Control', b'max-age=604800'), ...] +print(response.content) +# b'\n\n\nExample Domain\n\n\n ...' +``` + +The top-level `httpcore.request()` function is provided for convenience. In practice whenever you're working with `httpcore` you'll want to use the connection pooling functionality that it provides. + +```python +import httpcore + +http = httpcore.ConnectionPool() +response = http.request("GET", "https://www.example.com/") +``` + +Once you're ready to get going, [head over to the documentation](https://www.encode.io/httpcore/). + +## Motivation + +You *probably* don't want to be using HTTP Core directly. It might make sense if +you're writing something like a proxy service in Python, and you just want +something at the lowest possible level, but more typically you'll want to use +a higher level client library, such as `httpx`. + +The motivation for `httpcore` is: + +* To provide a reusable low-level client library, that other packages can then build on top of. +* To provide a *really clear interface split* between the networking code and client logic, + so that each is easier to understand and reason about in isolation. + +## Dependencies + +The `httpcore` package has the following dependencies... + +* `h11` +* `certifi` + +And the following optional extras... + +* `anyio` - Required by `pip install httpcore['asyncio']`. +* `trio` - Required by `pip install httpcore['trio']`. +* `h2` - Required by `pip install httpcore['http2']`. +* `socksio` - Required by `pip install httpcore['socks']`. + +## Versioning + +We use [SEMVER for our versioning policy](https://semver.org/). + +For changes between package versions please see our [project changelog](CHANGELOG.md). + +We recommend pinning your requirements either the most current major version, or a more specific version range: + +```python +pip install 'httpcore==1.*' +``` +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). + +## Version 1.0.9 (April 24th, 2025) + +- Resolve https://github.com/advisories/GHSA-vqfr-h8mv-ghfj with h11 dependency update. (#1008) + +## Version 1.0.8 (April 11th, 2025) + +- Fix `AttributeError` when importing on Python 3.14. (#1005) + +## Version 1.0.7 (November 15th, 2024) + +- Support `proxy=…` configuration on `ConnectionPool()`. (#974) + +## Version 1.0.6 (October 1st, 2024) + +- Relax `trio` dependency pinning. (#956) +- Handle `trio` raising `NotImplementedError` on unsupported platforms. (#955) +- Handle mapping `ssl.SSLError` to `httpcore.ConnectError`. (#918) + +## 1.0.5 (March 27th, 2024) + +- Handle `EndOfStream` exception for anyio backend. (#899) +- Allow trio `0.25.*` series in package dependancies. (#903) + +## 1.0.4 (February 21st, 2024) + +- Add `target` request extension. (#888) +- Fix support for connection `Upgrade` and `CONNECT` when some data in the stream has been read. (#882) + +## 1.0.3 (February 13th, 2024) + +- Fix support for async cancellations. (#880) +- Fix trace extension when used with socks proxy. (#849) +- Fix SSL context for connections using the "wss" scheme (#869) + +## 1.0.2 (November 10th, 2023) + +- Fix `float("inf")` timeouts in `Event.wait` function. (#846) + +## 1.0.1 (November 3rd, 2023) + +- Fix pool timeout to account for the total time spent retrying. (#823) +- Raise a neater RuntimeError when the correct async deps are not installed. (#826) +- Add support for synchronous TLS-in-TLS streams. (#840) + +## 1.0.0 (October 6th, 2023) + +From version 1.0 our async support is now optional, as the package has minimal dependencies by default. + +For async support use either `pip install 'httpcore[asyncio]'` or `pip install 'httpcore[trio]'`. + +The project versioning policy is now explicitly governed by SEMVER. See https://semver.org/. + +- Async support becomes fully optional. (#809) +- Add support for Python 3.12. (#807) + +## 0.18.0 (September 8th, 2023) + +- Add support for HTTPS proxies. (#745, #786) +- Drop Python 3.7 support. (#727) +- Handle `sni_hostname` extension with SOCKS proxy. (#774) +- Handle HTTP/1.1 half-closed connections gracefully. (#641) +- Change the type of `Extensions` from `Mapping[Str, Any]` to `MutableMapping[Str, Any]`. (#762) + +## 0.17.3 (July 5th, 2023) + +- Support async cancellations, ensuring that the connection pool is left in a clean state when cancellations occur. (#726) +- The networking backend interface has [been added to the public API](https://www.encode.io/httpcore/network-backends). Some classes which were previously private implementation detail are now part of the top-level public API. (#699) +- Graceful handling of HTTP/2 GoAway frames, with requests being transparently retried on a new connection. (#730) +- Add exceptions when a synchronous `trace callback` is passed to an asynchronous request or an asynchronous `trace callback` is passed to a synchronous request. (#717) +- Drop Python 3.7 support. (#727) + +## 0.17.2 (May 23th, 2023) + +- Add `socket_options` argument to `ConnectionPool` and `HTTProxy` classes. (#668) +- Improve logging with per-module logger names. (#690) +- Add `sni_hostname` request extension. (#696) +- Resolve race condition during import of `anyio` package. (#692) +- Enable TCP_NODELAY for all synchronous sockets. (#651) + +## 0.17.1 (May 17th, 2023) + +- If 'retries' is set, then allow retries if an SSL handshake error occurs. (#669) +- Improve correctness of tracebacks on network exceptions, by raising properly chained exceptions. (#678) +- Prevent connection-hanging behaviour when HTTP/2 connections are closed by a server-sent 'GoAway' frame. (#679) +- Fix edge-case exception when removing requests from the connection pool. (#680) +- Fix pool timeout edge-case. (#688) + +## 0.17.0 (March 16th, 2023) + +- Add DEBUG level logging. (#648) +- Respect HTTP/2 max concurrent streams when settings updates are sent by server. (#652) +- Increase the allowable HTTP header size to 100kB. (#647) +- Add `retries` option to SOCKS proxy classes. (#643) + +## 0.16.3 (December 20th, 2022) + +- Allow `ws` and `wss` schemes. Allows us to properly support websocket upgrade connections. (#625) +- Forwarding HTTP proxies use a connection-per-remote-host. Required by some proxy implementations. (#637) +- Don't raise `RuntimeError` when closing a connection pool with active connections. Removes some error cases when cancellations are used. (#631) +- Lazy import `anyio`, so that it's no longer a hard dependancy, and isn't imported if unused. (#639) + +## 0.16.2 (November 25th, 2022) + +- Revert 'Fix async cancellation behaviour', which introduced race conditions. (#627) +- Raise `RuntimeError` if attempting to us UNIX domain sockets on Windows. (#619) + +## 0.16.1 (November 17th, 2022) + +- Fix HTTP/1.1 interim informational responses, such as "100 Continue". (#605) + +## 0.16.0 (October 11th, 2022) + +- Support HTTP/1.1 informational responses. (#581) +- Fix async cancellation behaviour. (#580) +- Support `h11` 0.14. (#579) + +## 0.15.0 (May 17th, 2022) + +- Drop Python 3.6 support (#535) +- Ensure HTTP proxy CONNECT requests include `timeout` configuration. (#506) +- Switch to explicit `typing.Optional` for type hints. (#513) +- For `trio` map OSError exceptions to `ConnectError`. (#543) + +## 0.14.7 (February 4th, 2022) + +- Requests which raise a PoolTimeout need to be removed from the pool queue. (#502) +- Fix AttributeError that happened when Socks5Connection were terminated. (#501) + +## 0.14.6 (February 1st, 2022) + +- Fix SOCKS support for `http://` URLs. (#492) +- Resolve race condition around exceptions during streaming a response. (#491) + +## 0.14.5 (January 18th, 2022) + +- SOCKS proxy support. (#478) +- Add proxy_auth argument to HTTPProxy. (#481) +- Improve error message on 'RemoteProtocolError' exception when server disconnects without sending a response. (#479) + +## 0.14.4 (January 5th, 2022) + +- Support HTTP/2 on HTTPS tunnelling proxies. (#468) +- Fix proxy headers missing on HTTP forwarding. (#456) +- Only instantiate SSL context if required. (#457) +- More robust HTTP/2 handling. (#253, #439, #440, #441) + +## 0.14.3 (November 17th, 2021) + +- Fix race condition when removing closed connections from the pool. (#437) + +## 0.14.2 (November 16th, 2021) + +- Failed connections no longer remain in the pool. (Pull #433) + +## 0.14.1 (November 12th, 2021) + +- `max_connections` becomes optional. (Pull #429) +- `certifi` is now included in the install dependancies. (Pull #428) +- `h2` is now strictly optional. (Pull #428) + +## 0.14.0 (November 11th, 2021) + +The 0.14 release is a complete reworking of `httpcore`, comprehensively addressing some underlying issues in the connection pooling, as well as substantially redesigning the API to be more user friendly. + +Some of the lower-level API design also makes the components more easily testable in isolation, and the package now has 100% test coverage. + +See [discussion #419](https://github.com/encode/httpcore/discussions/419) for a little more background. + +There's some other neat bits in there too, such as the "trace" extension, which gives a hook into inspecting the internal events that occur during the request/response cycle. This extension is needed for the HTTPX cli, in order to... + +* Log the point at which the connection is established, and the IP/port on which it is made. +* Determine if the outgoing request should log as HTTP/1.1 or HTTP/2, rather than having to assume it's HTTP/2 if the --http2 flag was passed. (Which may not actually be true.) +* Log SSL version info / certificate info. + +Note that `curio` support is not currently available in 0.14.0. If you're using `httpcore` with `curio` please get in touch, so we can assess if we ought to prioritize it as a feature or not. + +## 0.13.7 (September 13th, 2021) + +- Fix broken error messaging when URL scheme is missing, or a non HTTP(S) scheme is used. (Pull #403) + +## 0.13.6 (June 15th, 2021) + +### Fixed + +- Close sockets when read or write timeouts occur. (Pull #365) + +## 0.13.5 (June 14th, 2021) + +### Fixed + +- Resolved niggles with AnyIO EOF behaviours. (Pull #358, #362) + +## 0.13.4 (June 9th, 2021) + +### Added + +- Improved error messaging when URL scheme is missing, or a non HTTP(S) scheme is used. (Pull #354) + +### Fixed + +- Switched to `anyio` as the default backend implementation when running with `asyncio`. Resolves some awkward [TLS timeout issues](https://github.com/encode/httpx/discussions/1511). + +## 0.13.3 (May 6th, 2021) + +### Added + +- Support HTTP/2 prior knowledge, using `httpcore.SyncConnectionPool(http1=False)`. (Pull #333) + +### Fixed + +- Handle cases where environment does not provide `select.poll` support. (Pull #331) + +## 0.13.2 (April 29th, 2021) + +### Added + +- Improve error message for specific case of `RemoteProtocolError` where server disconnects without sending a response. (Pull #313) + +## 0.13.1 (April 28th, 2021) + +### Fixed + +- More resiliant testing for closed connections. (Pull #311) +- Don't raise exceptions on ungraceful connection closes. (Pull #310) + +## 0.13.0 (April 21st, 2021) + +The 0.13 release updates the core API in order to match the HTTPX Transport API, +introduced in HTTPX 0.18 onwards. + +An example of making requests with the new interface is: + +```python +with httpcore.SyncConnectionPool() as http: + status_code, headers, stream, extensions = http.handle_request( + method=b'GET', + url=(b'https', b'example.org', 443, b'/'), + headers=[(b'host', b'example.org'), (b'user-agent', b'httpcore')] + stream=httpcore.ByteStream(b''), + extensions={} + ) + body = stream.read() + print(status_code, body) +``` + +### Changed + +- The `.request()` method is now `handle_request()`. (Pull #296) +- The `.arequest()` method is now `.handle_async_request()`. (Pull #296) +- The `headers` argument is no longer optional. (Pull #296) +- The `stream` argument is no longer optional. (Pull #296) +- The `ext` argument is now named `extensions`, and is no longer optional. (Pull #296) +- The `"reason"` extension keyword is now named `"reason_phrase"`. (Pull #296) +- The `"reason_phrase"` and `"http_version"` extensions now use byte strings for their values. (Pull #296) +- The `httpcore.PlainByteStream()` class becomes `httpcore.ByteStream()`. (Pull #296) + +### Added + +- Streams now support a `.read()` interface. (Pull #296) + +### Fixed + +- Task cancellation no longer leaks connections from the connection pool. (Pull #305) + +## 0.12.3 (December 7th, 2020) + +### Fixed + +- Abort SSL connections on close rather than waiting for remote EOF when using `asyncio`. (Pull #167) +- Fix exception raised in case of connect timeouts when using the `anyio` backend. (Pull #236) +- Fix `Host` header precedence for `:authority` in HTTP/2. (Pull #241, #243) +- Handle extra edge case when detecting for socket readability when using `asyncio`. (Pull #242, #244) +- Fix `asyncio` SSL warning when using proxy tunneling. (Pull #249) + +## 0.12.2 (November 20th, 2020) + +### Fixed + +- Properly wrap connect errors on the asyncio backend. (Pull #235) +- Fix `ImportError` occurring on Python 3.9 when using the HTTP/1.1 sync client in a multithreaded context. (Pull #237) + +## 0.12.1 (November 7th, 2020) + +### Added + +- Add connect retries. (Pull #221) + +### Fixed + +- Tweak detection of dropped connections, resolving an issue with open files limits on Linux. (Pull #185) +- Avoid leaking connections when establishing an HTTP tunnel to a proxy has failed. (Pull #223) +- Properly wrap OS errors when using `trio`. (Pull #225) + +## 0.12.0 (October 6th, 2020) + +### Changed + +- HTTP header casing is now preserved, rather than always sent in lowercase. (#216 and python-hyper/h11#104) + +### Added + +- Add Python 3.9 to officially supported versions. + +### Fixed + +- Gracefully handle a stdlib asyncio bug when a connection is closed while it is in a paused-for-reading state. (#201) + +## 0.11.1 (September 28nd, 2020) + +### Fixed + +- Add await to async semaphore release() coroutine (#197) +- Drop incorrect curio classifier (#192) + +## 0.11.0 (September 22nd, 2020) + +The Transport API with 0.11.0 has a couple of significant changes. + +Firstly we've moved changed the request interface in order to allow extensions, which will later enable us to support features +such as trailing headers, HTTP/2 server push, and CONNECT/Upgrade connections. + +The interface changes from: + +```python +def request(method, url, headers, stream, timeout): + return (http_version, status_code, reason, headers, stream) +``` + +To instead including an optional dictionary of extensions on the request and response: + +```python +def request(method, url, headers, stream, ext): + return (status_code, headers, stream, ext) +``` + +Having an open-ended extensions point will allow us to add later support for various optional features, that wouldn't otherwise be supported without these API changes. + +In particular: + +* Trailing headers support. +* HTTP/2 Server Push +* sendfile. +* Exposing raw connection on CONNECT, Upgrade, HTTP/2 bi-di streaming. +* Exposing debug information out of the API, including template name, template context. + +Currently extensions are limited to: + +* request: `timeout` - Optional. Timeout dictionary. +* response: `http_version` - Optional. Include the HTTP version used on the response. +* response: `reason` - Optional. Include the reason phrase used on the response. Only valid with HTTP/1.*. + +See https://github.com/encode/httpx/issues/1274#issuecomment-694884553 for the history behind this. + +Secondly, the async version of `request` is now namespaced as `arequest`. + +This allows concrete transports to support both sync and async implementations on the same class. + +### Added + +- Add curio support. (Pull #168) +- Add anyio support, with `backend="anyio"`. (Pull #169) + +### Changed + +- Update the Transport API to use 'ext' for optional extensions. (Pull #190) +- Update the Transport API to use `.request` and `.arequest` so implementations can support both sync and async. (Pull #189) + +## 0.10.2 (August 20th, 2020) + +### Added + +- Added Unix Domain Socket support. (Pull #139) + +### Fixed + +- Always include the port on proxy CONNECT requests. (Pull #154) +- Fix `max_keepalive_connections` configuration. (Pull #153) +- Fixes behaviour in HTTP/1.1 where server disconnects can be used to signal the end of the response body. (Pull #164) + +## 0.10.1 (August 7th, 2020) + +- Include `max_keepalive_connections` on `AsyncHTTPProxy`/`SyncHTTPProxy` classes. + +## 0.10.0 (August 7th, 2020) + +The most notable change in the 0.10.0 release is that HTTP/2 support is now fully optional. + +Use either `pip install httpcore` for HTTP/1.1 support only, or `pip install httpcore[http2]` for HTTP/1.1 and HTTP/2 support. + +### Added + +- HTTP/2 support becomes optional. (Pull #121, #130) +- Add `local_address=...` support. (Pull #100, #134) +- Add `PlainByteStream`, `IteratorByteStream`, `AsyncIteratorByteStream`. The `AsyncByteSteam` and `SyncByteStream` classes are now pure interface classes. (#133) +- Add `LocalProtocolError`, `RemoteProtocolError` exceptions. (Pull #129) +- Add `UnsupportedProtocol` exception. (Pull #128) +- Add `.get_connection_info()` method. (Pull #102, #137) +- Add better TRACE logs. (Pull #101) + +### Changed + +- `max_keepalive` is deprecated in favour of `max_keepalive_connections`. (Pull #140) + +### Fixed + +- Improve handling of server disconnects. (Pull #112) + +## 0.9.1 (May 27th, 2020) + +### Fixed + +- Proper host resolution for sync case, including IPv6 support. (Pull #97) +- Close outstanding connections when connection pool is closed. (Pull #98) + +## 0.9.0 (May 21th, 2020) + +### Changed + +- URL port becomes an `Optional[int]` instead of `int`. (Pull #92) + +### Fixed + +- Honor HTTP/2 max concurrent streams settings. (Pull #89, #90) +- Remove incorrect debug log. (Pull #83) + +## 0.8.4 (May 11th, 2020) + +### Added + +- Logging via HTTPCORE_LOG_LEVEL and HTTPX_LOG_LEVEL environment variables +and TRACE level logging. (Pull #79) + +### Fixed + +- Reuse of connections on HTTP/2 in close concurrency situations. (Pull #81) + +## 0.8.3 (May 6rd, 2020) + +### Fixed + +- Include `Host` and `Accept` headers on proxy "CONNECT" requests. +- De-duplicate any headers also contained in proxy_headers. +- HTTP/2 flag not being passed down to proxy connections. + +## 0.8.2 (May 3rd, 2020) + +### Fixed + +- Fix connections using proxy forwarding requests not being added to the +connection pool properly. (Pull #70) + +## 0.8.1 (April 30th, 2020) + +### Changed + +- Allow inherintance of both `httpcore.AsyncByteStream`, `httpcore.SyncByteStream` without type conflicts. + +## 0.8.0 (April 30th, 2020) + +### Fixed + +- Fixed tunnel proxy support. + +### Added + +- New `TimeoutException` base class. + +## 0.7.0 (March 5th, 2020) + +- First integration with HTTPX. diff --git a/code-server-config/.cache/pip/http-v2/a/0/3/e/7/a03e77d6fd1aff6b4ee6b34a140bd46cfb7fa1873254b62a2d30e9d7 b/code-server-config/.cache/pip/http-v2/a/0/3/e/7/a03e77d6fd1aff6b4ee6b34a140bd46cfb7fa1873254b62a2d30e9d7 new file mode 100755 index 0000000..78849c2 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/a/0/3/e/7/a03e77d6fd1aff6b4ee6b34a140bd46cfb7fa1873254b62a2d30e9d7 differ diff --git a/code-server-config/.cache/pip/http-v2/a/0/3/e/7/a03e77d6fd1aff6b4ee6b34a140bd46cfb7fa1873254b62a2d30e9d7.body b/code-server-config/.cache/pip/http-v2/a/0/3/e/7/a03e77d6fd1aff6b4ee6b34a140bd46cfb7fa1873254b62a2d30e9d7.body new file mode 100755 index 0000000..b0d2b19 --- /dev/null +++ b/code-server-config/.cache/pip/http-v2/a/0/3/e/7/a03e77d6fd1aff6b4ee6b34a140bd46cfb7fa1873254b62a2d30e9d7.body @@ -0,0 +1,203 @@ +Metadata-Version: 2.3 +Name: httpx +Version: 0.28.1 +Summary: The next generation HTTP client. +Project-URL: Changelog, https://github.com/encode/httpx/blob/master/CHANGELOG.md +Project-URL: Documentation, https://www.python-httpx.org +Project-URL: Homepage, https://github.com/encode/httpx +Project-URL: Source, https://github.com/encode/httpx +Author-email: Tom Christie +License: BSD-3-Clause +Classifier: Development Status :: 4 - Beta +Classifier: Environment :: Web Environment +Classifier: Framework :: AsyncIO +Classifier: Framework :: Trio +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Topic :: Internet :: WWW/HTTP +Requires-Python: >=3.8 +Requires-Dist: anyio +Requires-Dist: certifi +Requires-Dist: httpcore==1.* +Requires-Dist: idna +Provides-Extra: brotli +Requires-Dist: brotli; (platform_python_implementation == 'CPython') and extra == 'brotli' +Requires-Dist: brotlicffi; (platform_python_implementation != 'CPython') and extra == 'brotli' +Provides-Extra: cli +Requires-Dist: click==8.*; extra == 'cli' +Requires-Dist: pygments==2.*; extra == 'cli' +Requires-Dist: rich<14,>=10; extra == 'cli' +Provides-Extra: http2 +Requires-Dist: h2<5,>=3; extra == 'http2' +Provides-Extra: socks +Requires-Dist: socksio==1.*; extra == 'socks' +Provides-Extra: zstd +Requires-Dist: zstandard>=0.18.0; extra == 'zstd' +Description-Content-Type: text/markdown + +

+ HTTPX +

+ +

HTTPX - A next-generation HTTP client for Python.

+ +

+ + Test Suite + + + Package version + +

+ +HTTPX is a fully featured HTTP client library for Python 3. It includes **an integrated command line client**, has support for both **HTTP/1.1 and HTTP/2**, and provides both **sync and async APIs**. + +--- + +Install HTTPX using pip: + +```shell +$ pip install httpx +``` + +Now, let's get started: + +```pycon +>>> import httpx +>>> r = httpx.get('https://www.example.org/') +>>> r + +>>> r.status_code +200 +>>> r.headers['content-type'] +'text/html; charset=UTF-8' +>>> r.text +'\n\n\nExample Domain...' +``` + +Or, using the command-line client. + +```shell +$ pip install 'httpx[cli]' # The command line client is an optional dependency. +``` + +Which now allows us to use HTTPX directly from the command-line... + +

+ httpx --help +

+ +Sending a request... + +

+ httpx http://httpbin.org/json +

+ +## Features + +HTTPX builds on the well-established usability of `requests`, and gives you: + +* A broadly [requests-compatible API](https://www.python-httpx.org/compatibility/). +* An integrated command-line client. +* HTTP/1.1 [and HTTP/2 support](https://www.python-httpx.org/http2/). +* Standard synchronous interface, but with [async support if you need it](https://www.python-httpx.org/async/). +* Ability to make requests directly to [WSGI applications](https://www.python-httpx.org/advanced/transports/#wsgi-transport) or [ASGI applications](https://www.python-httpx.org/advanced/transports/#asgi-transport). +* Strict timeouts everywhere. +* Fully type annotated. +* 100% test coverage. + +Plus all the standard features of `requests`... + +* International Domains and URLs +* Keep-Alive & Connection Pooling +* Sessions with Cookie Persistence +* Browser-style SSL Verification +* Basic/Digest Authentication +* Elegant Key/Value Cookies +* Automatic Decompression +* Automatic Content Decoding +* Unicode Response Bodies +* Multipart File Uploads +* HTTP(S) Proxy Support +* Connection Timeouts +* Streaming Downloads +* .netrc Support +* Chunked Requests + +## Installation + +Install with pip: + +```shell +$ pip install httpx +``` + +Or, to include the optional HTTP/2 support, use: + +```shell +$ pip install httpx[http2] +``` + +HTTPX requires Python 3.8+. + +## Documentation + +Project documentation is available at [https://www.python-httpx.org/](https://www.python-httpx.org/). + +For a run-through of all the basics, head over to the [QuickStart](https://www.python-httpx.org/quickstart/). + +For more advanced topics, see the [Advanced Usage](https://www.python-httpx.org/advanced/) section, the [async support](https://www.python-httpx.org/async/) section, or the [HTTP/2](https://www.python-httpx.org/http2/) section. + +The [Developer Interface](https://www.python-httpx.org/api/) provides a comprehensive API reference. + +To find out about tools that integrate with HTTPX, see [Third Party Packages](https://www.python-httpx.org/third_party_packages/). + +## Contribute + +If you want to contribute with HTTPX check out the [Contributing Guide](https://www.python-httpx.org/contributing/) to learn how to start. + +## Dependencies + +The HTTPX project relies on these excellent libraries: + +* `httpcore` - The underlying transport implementation for `httpx`. + * `h11` - HTTP/1.1 support. +* `certifi` - SSL certificates. +* `idna` - Internationalized domain name support. +* `sniffio` - Async library autodetection. + +As well as these optional installs: + +* `h2` - HTTP/2 support. *(Optional, with `httpx[http2]`)* +* `socksio` - SOCKS proxy support. *(Optional, with `httpx[socks]`)* +* `rich` - Rich terminal support. *(Optional, with `httpx[cli]`)* +* `click` - Command line client support. *(Optional, with `httpx[cli]`)* +* `brotli` or `brotlicffi` - Decoding for "brotli" compressed responses. *(Optional, with `httpx[brotli]`)* +* `zstandard` - Decoding for "zstd" compressed responses. *(Optional, with `httpx[zstd]`)* + +A huge amount of credit is due to `requests` for the API layout that +much of this work follows, as well as to `urllib3` for plenty of design +inspiration around the lower-level networking details. + +--- + +

HTTPX is BSD licensed code.
Designed & crafted with care.

— 🦋 —

+ +## Release Information + +### Fixed + +* Reintroduced supposedly-private `URLTypes` shortcut. (#2673) + + +--- + +[Full changelog](https://github.com/encode/httpx/blob/master/CHANGELOG.md) diff --git a/code-server-config/.cache/pip/http-v2/a/b/0/c/9/ab0c951c13ffa0438821f87295bc6ff5ca5c6104a972107beff7ec14 b/code-server-config/.cache/pip/http-v2/a/b/0/c/9/ab0c951c13ffa0438821f87295bc6ff5ca5c6104a972107beff7ec14 new file mode 100755 index 0000000..fed1fc3 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/a/b/0/c/9/ab0c951c13ffa0438821f87295bc6ff5ca5c6104a972107beff7ec14 differ diff --git a/code-server-config/.cache/pip/http-v2/a/b/0/c/9/ab0c951c13ffa0438821f87295bc6ff5ca5c6104a972107beff7ec14.body b/code-server-config/.cache/pip/http-v2/a/b/0/c/9/ab0c951c13ffa0438821f87295bc6ff5ca5c6104a972107beff7ec14.body new file mode 100755 index 0000000..ee29876 --- /dev/null +++ b/code-server-config/.cache/pip/http-v2/a/b/0/c/9/ab0c951c13ffa0438821f87295bc6ff5ca5c6104a972107beff7ec14.body @@ -0,0 +1,749 @@ +Metadata-Version: 2.4 +Name: python-dotenv +Version: 1.2.1 +Summary: Read key-value pairs from a .env file and set them as environment variables +Author-email: Saurabh Kumar +License-Expression: BSD-3-Clause +Project-URL: Source, https://github.com/theskumar/python-dotenv +Keywords: environment variables,deployments,settings,env,dotenv,configurations,python +Classifier: Development Status :: 5 - Production/Stable +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: System Administrators +Classifier: Operating System :: OS Independent +Classifier: Topic :: System :: Systems Administration +Classifier: Topic :: Utilities +Classifier: Environment :: Web Environment +Requires-Python: >=3.9 +Description-Content-Type: text/markdown +License-File: LICENSE +Provides-Extra: cli +Requires-Dist: click>=5.0; extra == "cli" +Dynamic: license-file + +# python-dotenv + +[![Build Status][build_status_badge]][build_status_link] +[![PyPI version][pypi_badge]][pypi_link] + +python-dotenv reads key-value pairs from a `.env` file and can set them as environment +variables. It helps in the development of applications following the +[12-factor](https://12factor.net/) principles. + +- [Getting Started](#getting-started) +- [Other Use Cases](#other-use-cases) + * [Load configuration without altering the environment](#load-configuration-without-altering-the-environment) + * [Parse configuration as a stream](#parse-configuration-as-a-stream) + * [Load .env files in IPython](#load-env-files-in-ipython) +- [Command-line Interface](#command-line-interface) +- [File format](#file-format) + * [Multiline values](#multiline-values) + * [Variable expansion](#variable-expansion) +- [Related Projects](#related-projects) +- [Acknowledgements](#acknowledgements) + +## Getting Started + +```shell +pip install python-dotenv +``` + +If your application takes its configuration from environment variables, like a 12-factor +application, launching it in development is not very practical because you have to set +those environment variables yourself. + +To help you with that, you can add python-dotenv to your application to make it load the +configuration from a `.env` file when it is present (e.g. in development) while remaining +configurable via the environment: + +```python +from dotenv import load_dotenv + +load_dotenv() # reads variables from a .env file and sets them in os.environ + +# Code of your application, which uses environment variables (e.g. from `os.environ` or +# `os.getenv`) as if they came from the actual environment. +``` + +By default, `load_dotenv()` will: + +- Look for a `.env` file in the same directory as the Python script (or higher up the directory tree). +- Read each key-value pair and add it to `os.environ`. +- **Not override** an environment variable that is already set, unless you explicitly pass `override=True`. + +To configure the development environment, add a `.env` in the root directory of your +project: + +``` +. +├── .env +└── foo.py +``` + +The syntax of `.env` files supported by python-dotenv is similar to that of Bash: + +```bash +# Development settings +DOMAIN=example.org +ADMIN_EMAIL=admin@${DOMAIN} +ROOT_URL=${DOMAIN}/app +``` + +If you use variables in values, ensure they are surrounded with `{` and `}`, like +`${DOMAIN}`, as bare variables such as `$DOMAIN` are not expanded. + +You will probably want to add `.env` to your `.gitignore`, especially if it contains +secrets like a password. + +See the section "File format" below for more information about what you can write in a +`.env` file. + +## Other Use Cases + +### Load configuration without altering the environment + +The function `dotenv_values` works more or less the same way as `load_dotenv`, except it +doesn't touch the environment, it just returns a `dict` with the values parsed from the +`.env` file. + +```python +from dotenv import dotenv_values + +config = dotenv_values(".env") # config = {"USER": "foo", "EMAIL": "foo@example.org"} +``` + +This notably enables advanced configuration management: + +```python +import os +from dotenv import dotenv_values + +config = { + **dotenv_values(".env.shared"), # load shared development variables + **dotenv_values(".env.secret"), # load sensitive variables + **os.environ, # override loaded values with environment variables +} +``` + +### Parse configuration as a stream + +`load_dotenv` and `dotenv_values` accept [streams][python_streams] via their `stream` +argument. It is thus possible to load the variables from sources other than the +filesystem (e.g. the network). + +```python +from io import StringIO + +from dotenv import load_dotenv + +config = StringIO("USER=foo\nEMAIL=foo@example.org") +load_dotenv(stream=config) +``` + +### Load .env files in IPython + +You can use dotenv in IPython. By default, it will use `find_dotenv` to search for a +`.env` file: + +```python +%load_ext dotenv +%dotenv +``` + +You can also specify a path: + +```python +%dotenv relative/or/absolute/path/to/.env +``` + +Optional flags: + +- `-o` to override existing variables. +- `-v` for increased verbosity. + +### Disable load_dotenv + +Set `PYTHON_DOTENV_DISABLED=1` to disable `load_dotenv()` from loading .env files or streams. Useful when you can't modify third-party package calls or in production. + +## Command-line Interface + +A CLI interface `dotenv` is also included, which helps you manipulate the `.env` file +without manually opening it. + +```shell +$ pip install "python-dotenv[cli]" +$ dotenv set USER foo +$ dotenv set EMAIL foo@example.org +$ dotenv list +USER=foo +EMAIL=foo@example.org +$ dotenv list --format=json +{ + "USER": "foo", + "EMAIL": "foo@example.org" +} +$ dotenv run -- python foo.py +``` + +Run `dotenv --help` for more information about the options and subcommands. + +## File format + +The format is not formally specified and still improves over time. That being said, +`.env` files should mostly look like Bash files. + +Keys can be unquoted or single-quoted. Values can be unquoted, single- or double-quoted. +Spaces before and after keys, equal signs, and values are ignored. Values can be followed +by a comment. Lines can start with the `export` directive, which does not affect their +interpretation. + +Allowed escape sequences: + +- in single-quoted values: `\\`, `\'` +- in double-quoted values: `\\`, `\'`, `\"`, `\a`, `\b`, `\f`, `\n`, `\r`, `\t`, `\v` + +### Multiline values + +It is possible for single- or double-quoted values to span multiple lines. The following +examples are equivalent: + +```bash +FOO="first line +second line" +``` + +```bash +FOO="first line\nsecond line" +``` + +### Variable without a value + +A variable can have no value: + +```bash +FOO +``` + +It results in `dotenv_values` associating that variable name with the value `None` (e.g. +`{"FOO": None}`. `load_dotenv`, on the other hand, simply ignores such variables. + +This shouldn't be confused with `FOO=`, in which case the variable is associated with the +empty string. + +### Variable expansion + +python-dotenv can interpolate variables using POSIX variable expansion. + +With `load_dotenv(override=True)` or `dotenv_values()`, the value of a variable is the +first of the values defined in the following list: + +- Value of that variable in the `.env` file. +- Value of that variable in the environment. +- Default value, if provided. +- Empty string. + +With `load_dotenv(override=False)`, the value of a variable is the first of the values +defined in the following list: + +- Value of that variable in the environment. +- Value of that variable in the `.env` file. +- Default value, if provided. +- Empty string. + +## Related Projects + +- [Honcho](https://github.com/nickstenning/honcho) - For managing + Procfile-based applications. +- [django-dotenv](https://github.com/jpadilla/django-dotenv) +- [django-environ](https://github.com/joke2k/django-environ) +- [django-environ-2](https://github.com/sergeyklay/django-environ-2) +- [django-configuration](https://github.com/jezdez/django-configurations) +- [dump-env](https://github.com/sobolevn/dump-env) +- [environs](https://github.com/sloria/environs) +- [dynaconf](https://github.com/rochacbruno/dynaconf) +- [parse_it](https://github.com/naorlivne/parse_it) +- [python-decouple](https://github.com/HBNetwork/python-decouple) + +## Acknowledgements + +This project is currently maintained by [Saurabh Kumar](https://saurabh-kumar.com) and +[Bertrand Bonnefoy-Claudet](https://github.com/bbc2) and would not have been possible +without the support of these [awesome +people](https://github.com/theskumar/python-dotenv/graphs/contributors). + +[build_status_badge]: https://github.com/theskumar/python-dotenv/actions/workflows/test.yml/badge.svg +[build_status_link]: https://github.com/theskumar/python-dotenv/actions/workflows/test.yml +[pypi_badge]: https://badge.fury.io/py/python-dotenv.svg +[pypi_link]: https://badge.fury.io/py/python-dotenv +[python_streams]: https://docs.python.org/3/library/io.html + +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this +project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [1.2.1] - 2025-10-26 + +- Move more config to `pyproject.toml`, removed `setup.cfg` +- Add support for reading `.env` from FIFOs (Unix) by [@sidharth-sudhir] in [#586] + +## [1.2.0] - 2025-10-26 + +- Upgrade build system to use PEP 517 & PEP 518 to use `build` and `pyproject.toml` by [@EpicWink] in [#583] +- Add support for Python 3.14 by [@23f3001135] in [#579](https://github.com/theskumar/python-dotenv/pull/563) +- Add support for disabling of `load_dotenv()` using `PYTHON_DOTENV_DISABLED` env var. by [@matthewfranglen] in [#569] + +## [1.1.1] - 2025-06-24 + +### Fixed + +* CLI: Ensure `find_dotenv` work reliably on python 3.13 by [@theskumar] in [#563](https://github.com/theskumar/python-dotenv/pull/563) +* CLI: revert the use of execvpe on Windows by [@wrongontheinternet] in [#566](https://github.com/theskumar/python-dotenv/pull/566) + + +## [1.1.0] - 2025-03-25 + +**Feature** + +- Add support for python 3.13 +- Enhance `dotenv run`, switch to `execvpe` for better resource management and signal handling ([#523]) by [@eekstunt] + +**Fixed** + +- `find_dotenv` and `load_dotenv` now correctly looks up at the current directory when running in debugger or pdb ([#553] by [@randomseed42]) + +**Misc** + +- Drop support for Python 3.8 + +## [1.0.1] - 2024-01-23 + +**Fixed** + +* Gracefully handle code which has been imported from a zipfile ([#456] by [@samwyma]) +* Allow modules using `load_dotenv` to be reloaded when launched in a separate thread ([#497] by [@freddyaboulton]) +* Fix file not closed after deletion, handle error in the rewrite function ([#469] by [@Qwerty-133]) + +**Misc** +* Use pathlib.Path in tests ([#466] by [@eumiro]) +* Fix year in release date in changelog.md ([#454] by [@jankislinger]) +* Use https in README links ([#474] by [@Nicals]) + +## [1.0.0] - 2023-02-24 + +**Fixed** + +* Drop support for python 3.7, add python 3.12-dev (#449 by [@theskumar]) +* Handle situations where the cwd does not exist. (#446 by [@jctanner]) + +## [0.21.1] - 2023-01-21 + +**Added** + +* Use Python 3.11 non-beta in CI (#438 by [@bbc2]) +* Modernize variables code (#434 by [@Nougat-Waffle]) +* Modernize main.py and parser.py code (#435 by [@Nougat-Waffle]) +* Improve conciseness of cli.py and __init__.py (#439 by [@Nougat-Waffle]) +* Improve error message for `get` and `list` commands when env file can't be opened (#441 by [@bbc2]) +* Updated License to align with BSD OSI template (#433 by [@lsmith77]) + + +**Fixed** + +* Fix Out-of-scope error when "dest" variable is undefined (#413 by [@theGOTOguy]) +* Fix IPython test warning about deprecated `magic` (#440 by [@bbc2]) +* Fix type hint for dotenv_path var, add StrPath alias (#432 by [@eaf]) + +## [0.21.0] - 2022-09-03 + +**Added** + +* CLI: add support for invocations via 'python -m'. (#395 by [@theskumar]) +* `load_dotenv` function now returns `False`. (#388 by [@larsks]) +* CLI: add --format= option to list command. (#407 by [@sammck]) + +**Fixed** + +* Drop Python 3.5 and 3.6 and upgrade GA (#393 by [@eggplants]) +* Use `open` instead of `io.open`. (#389 by [@rabinadk1]) +* Improve documentation for variables without a value (#390 by [@bbc2]) +* Add `parse_it` to Related Projects (#410 by [@naorlivne]) +* Update README.md (#415 by [@harveer07]) +* Improve documentation with direct use of MkDocs (#398 by [@bbc2]) + +## [0.20.0] - 2022-03-24 + +**Added** + +- Add `encoding` (`Optional[str]`) parameter to `get_key`, `set_key` and `unset_key`. + (#379 by [@bbc2]) + +**Fixed** + +- Use dict to specify the `entry_points` parameter of `setuptools.setup` (#376 by + [@mgorny]). +- Don't build universal wheels (#387 by [@bbc2]). + +## [0.19.2] - 2021-11-11 + +**Fixed** + +- In `set_key`, add missing newline character before new entry if necessary. (#361 by + [@bbc2]) + +## [0.19.1] - 2021-08-09 + +**Added** + +- Add support for Python 3.10. (#359 by [@theskumar]) + +## [0.19.0] - 2021-07-24 + +**Changed** + +- Require Python 3.5 or a later version. Python 2 and 3.4 are no longer supported. (#341 + by [@bbc2]). + +**Added** + +- The `dotenv_path` argument of `set_key` and `unset_key` now has a type of `Union[str, + os.PathLike]` instead of just `os.PathLike` (#347 by [@bbc2]). +- The `stream` argument of `load_dotenv` and `dotenv_values` can now be a text stream + (`IO[str]`), which includes values like `io.StringIO("foo")` and `open("file.env", + "r")` (#348 by [@bbc2]). + +## [0.18.0] - 2021-06-20 + +**Changed** + +- Raise `ValueError` if `quote_mode` isn't one of `always`, `auto` or `never` in + `set_key` (#330 by [@bbc2]). +- When writing a value to a .env file with `set_key` or `dotenv set ` (#330 + by [@bbc2]): + - Use single quotes instead of double quotes. + - Don't strip surrounding quotes. + - In `auto` mode, don't add quotes if the value is only made of alphanumeric characters + (as determined by `string.isalnum`). + +## [0.17.1] - 2021-04-29 + +**Fixed** + +- Fixed tests for build environments relying on `PYTHONPATH` (#318 by [@befeleme]). + +## [0.17.0] - 2021-04-02 + +**Changed** + +- Make `dotenv get ` only show the value, not `key=value` (#313 by [@bbc2]). + +**Added** + +- Add `--override`/`--no-override` option to `dotenv run` (#312 by [@zueve] and [@bbc2]). + +## [0.16.0] - 2021-03-27 + +**Changed** + +- The default value of the `encoding` parameter for `load_dotenv` and `dotenv_values` is + now `"utf-8"` instead of `None` (#306 by [@bbc2]). +- Fix resolution order in variable expansion with `override=False` (#287 by [@bbc2]). + +## [0.15.0] - 2020-10-28 + +**Added** + +- Add `--export` option to `set` to make it prepend the binding with `export` (#270 by + [@jadutter]). + +**Changed** + +- Make `set` command create the `.env` file in the current directory if no `.env` file was + found (#270 by [@jadutter]). + +**Fixed** + +- Fix potentially empty expanded value for duplicate key (#260 by [@bbc2]). +- Fix import error on Python 3.5.0 and 3.5.1 (#267 by [@gongqingkui]). +- Fix parsing of unquoted values containing several adjacent space or tab characters + (#277 by [@bbc2], review by [@x-yuri]). + +## [0.14.0] - 2020-07-03 + +**Changed** + +- Privilege definition in file over the environment in variable expansion (#256 by + [@elbehery95]). + +**Fixed** + +- Improve error message for when file isn't found (#245 by [@snobu]). +- Use HTTPS URL in package meta data (#251 by [@ekohl]). + +## [0.13.0] - 2020-04-16 + +**Added** + +- Add support for a Bash-like default value in variable expansion (#248 by [@bbc2]). + +## [0.12.0] - 2020-02-28 + +**Changed** + +- Use current working directory to find `.env` when bundled by PyInstaller (#213 by + [@gergelyk]). + +**Fixed** + +- Fix escaping of quoted values written by `set_key` (#236 by [@bbc2]). +- Fix `dotenv run` crashing on environment variables without values (#237 by [@yannham]). +- Remove warning when last line is empty (#238 by [@bbc2]). + +## [0.11.0] - 2020-02-07 + +**Added** + +- Add `interpolate` argument to `load_dotenv` and `dotenv_values` to disable interpolation + (#232 by [@ulyssessouza]). + +**Changed** + +- Use logging instead of warnings (#231 by [@bbc2]). + +**Fixed** + +- Fix installation in non-UTF-8 environments (#225 by [@altendky]). +- Fix PyPI classifiers (#228 by [@bbc2]). + +## [0.10.5] - 2020-01-19 + +**Fixed** + +- Fix handling of malformed lines and lines without a value (#222 by [@bbc2]): + - Don't print warning when key has no value. + - Reject more malformed lines (e.g. "A: B", "a='b',c"). +- Fix handling of lines with just a comment (#224 by [@bbc2]). + +## [0.10.4] - 2020-01-17 + +**Added** + +- Make typing optional (#179 by [@techalchemy]). +- Print a warning on malformed line (#211 by [@bbc2]). +- Support keys without a value (#220 by [@ulyssessouza]). + +## 0.10.3 + +- Improve interactive mode detection ([@andrewsmith])([#183]). +- Refactor parser to fix parsing inconsistencies ([@bbc2])([#170]). + - Interpret escapes as control characters only in double-quoted strings. + - Interpret `#` as start of comment only if preceded by whitespace. + +## 0.10.2 + +- Add type hints and expose them to users ([@qnighy])([#172]) +- `load_dotenv` and `dotenv_values` now accept an `encoding` parameter, defaults to `None` + ([@theskumar])([@earlbread])([#161]) +- Fix `str`/`unicode` inconsistency in Python 2: values are always `str` now. ([@bbc2])([#121]) +- Fix Unicode error in Python 2, introduced in 0.10.0. ([@bbc2])([#176]) + +## 0.10.1 +- Fix parsing of variable without a value ([@asyncee])([@bbc2])([#158]) + +## 0.10.0 + +- Add support for UTF-8 in unquoted values ([@bbc2])([#148]) +- Add support for trailing comments ([@bbc2])([#148]) +- Add backslashes support in values ([@bbc2])([#148]) +- Add support for newlines in values ([@bbc2])([#148]) +- Force environment variables to str with Python2 on Windows ([@greyli]) +- Drop Python 3.3 support ([@greyli]) +- Fix stderr/-out/-in redirection ([@venthur]) + + +## 0.9.0 + +- Add `--version` parameter to cli ([@venthur]) +- Enable loading from current directory ([@cjauvin]) +- Add 'dotenv run' command for calling arbitrary shell script with .env ([@venthur]) + +## 0.8.1 + +- Add tests for docs ([@Flimm]) +- Make 'cli' support optional. Use `pip install python-dotenv[cli]`. ([@theskumar]) + +## 0.8.0 + +- `set_key` and `unset_key` only modified the affected file instead of + parsing and re-writing file, this causes comments and other file + entact as it is. +- Add support for `export` prefix in the line. +- Internal refractoring ([@theskumar]) +- Allow `load_dotenv` and `dotenv_values` to work with `StringIO())` ([@alanjds])([@theskumar])([#78]) + +## 0.7.1 + +- Remove hard dependency on iPython ([@theskumar]) + +## 0.7.0 + +- Add support to override system environment variable via .env. + ([@milonimrod](https://github.com/milonimrod)) + ([\#63](https://github.com/theskumar/python-dotenv/issues/63)) +- Disable ".env not found" warning by default + ([@maxkoryukov](https://github.com/maxkoryukov)) + ([\#57](https://github.com/theskumar/python-dotenv/issues/57)) + +## 0.6.5 + +- Add support for special characters `\`. + ([@pjona](https://github.com/pjona)) + ([\#60](https://github.com/theskumar/python-dotenv/issues/60)) + +## 0.6.4 + +- Fix issue with single quotes ([@Flimm]) + ([\#52](https://github.com/theskumar/python-dotenv/issues/52)) + +## 0.6.3 + +- Handle unicode exception in setup.py + ([\#46](https://github.com/theskumar/python-dotenv/issues/46)) + +## 0.6.2 + +- Fix dotenv list command ([@ticosax](https://github.com/ticosax)) +- Add iPython Support + ([@tillahoffmann](https://github.com/tillahoffmann)) + +## 0.6.0 + +- Drop support for Python 2.6 +- Handle escaped characters and newlines in quoted values. (Thanks + [@iameugenejo](https://github.com/iameugenejo)) +- Remove any spaces around unquoted key/value. (Thanks + [@paulochf](https://github.com/paulochf)) +- Added POSIX variable expansion. (Thanks + [@hugochinchilla](https://github.com/hugochinchilla)) + +## 0.5.1 + +- Fix `find_dotenv` - it now start search from the file where this + function is called from. + +## 0.5.0 + +- Add `find_dotenv` method that will try to find a `.env` file. + (Thanks [@isms](https://github.com/isms)) + +## 0.4.0 + +- cli: Added `-q/--quote` option to control the behaviour of quotes + around values in `.env`. (Thanks + [@hugochinchilla](https://github.com/hugochinchilla)). +- Improved test coverage. + + +[#78]: https://github.com/theskumar/python-dotenv/issues/78 +[#121]: https://github.com/theskumar/python-dotenv/issues/121 +[#148]: https://github.com/theskumar/python-dotenv/issues/148 +[#158]: https://github.com/theskumar/python-dotenv/issues/158 +[#170]: https://github.com/theskumar/python-dotenv/issues/170 +[#172]: https://github.com/theskumar/python-dotenv/issues/172 +[#176]: https://github.com/theskumar/python-dotenv/issues/176 +[#183]: https://github.com/theskumar/python-dotenv/issues/183 +[#359]: https://github.com/theskumar/python-dotenv/issues/359 +[#469]: https://github.com/theskumar/python-dotenv/issues/469 +[#456]: https://github.com/theskumar/python-dotenv/issues/456 +[#466]: https://github.com/theskumar/python-dotenv/issues/466 +[#454]: https://github.com/theskumar/python-dotenv/issues/454 +[#474]: https://github.com/theskumar/python-dotenv/issues/474 +[#523]: https://github.com/theskumar/python-dotenv/issues/523 +[#553]: https://github.com/theskumar/python-dotenv/issues/553 +[#569]: https://github.com/theskumar/python-dotenv/issues/569 +[#583]: https://github.com/theskumar/python-dotenv/issues/583 +[#586]: https://github.com/theskumar/python-dotenv/issues/586 + + +[@23f3001135]: https://github.com/23f3001135 +[@EpicWink]: https://github.com/EpicWink +[@Flimm]: https://github.com/Flimm +[@Nicals]: https://github.com/Nicals +[@Nougat-Waffle]: https://github.com/Nougat-Waffle +[@Qwerty-133]: https://github.com/Qwerty-133 +[@alanjds]: https://github.com/alanjds +[@altendky]: https://github.com/altendky +[@andrewsmith]: https://github.com/andrewsmith +[@asyncee]: https://github.com/asyncee +[@bbc2]: https://github.com/bbc2 +[@befeleme]: https://github.com/befeleme +[@cjauvin]: https://github.com/cjauvin +[@eaf]: https://github.com/eaf +[@earlbread]: https://github.com/earlbread +[@eekstunt]: https://github.com/eekstunt +[@eggplants]: https://github.com/@eggplants +[@ekohl]: https://github.com/ekohl +[@elbehery95]: https://github.com/elbehery95 +[@eumiro]: https://github.com/eumiro +[@freddyaboulton]: https://github.com/freddyaboulton +[@gergelyk]: https://github.com/gergelyk +[@gongqingkui]: https://github.com/gongqingkui +[@greyli]: https://github.com/greyli +[@harveer07]: https://github.com/@harveer07 +[@jadutter]: https://github.com/jadutter +[@jankislinger]: https://github.com/jankislinger +[@jctanner]: https://github.com/jctanner +[@larsks]: https://github.com/@larsks +[@lsmith77]: https://github.com/lsmith77 +[@matthewfranglen]: https://github.com/matthewfranglen +[@mgorny]: https://github.com/mgorny +[@naorlivne]: https://github.com/@naorlivne +[@qnighy]: https://github.com/qnighy +[@rabinadk1]: https://github.com/@rabinadk1 +[@randomseed42]: https://github.com/zueve +[@sammck]: https://github.com/@sammck +[@samwyma]: https://github.com/samwyma +[@sidharth-sudhir]: https://github.com/sidharth-sudhir +[@snobu]: https://github.com/snobu +[@techalchemy]: https://github.com/techalchemy +[@theGOTOguy]: https://github.com/theGOTOguy +[@theskumar]: https://github.com/theskumar +[@ulyssessouza]: https://github.com/ulyssessouza +[@venthur]: https://github.com/venthur +[@wrongontheinternet]: https://github.com/wrongontheinternet +[@x-yuri]: https://github.com/x-yuri +[@yannham]: https://github.com/yannham +[@zueve]: https://github.com/zueve + +[Unreleased]: https://github.com/theskumar/python-dotenv/compare/v1.2.0...HEAD +[1.2.0]: https://github.com/theskumar/python-dotenv/compare/v1.1.1...v1.2.0 +[1.1.1]: https://github.com/theskumar/python-dotenv/compare/v1.1.0...v1.1.1 +[1.1.0]: https://github.com/theskumar/python-dotenv/compare/v1.0.1...v1.1.0 +[1.0.1]: https://github.com/theskumar/python-dotenv/compare/v1.0.0...v1.0.1 +[1.0.0]: https://github.com/theskumar/python-dotenv/compare/v0.21.0...v1.0.0 +[0.21.1]: https://github.com/theskumar/python-dotenv/compare/v0.21.0...v0.21.1 +[0.21.0]: https://github.com/theskumar/python-dotenv/compare/v0.20.0...v0.21.0 +[0.20.0]: https://github.com/theskumar/python-dotenv/compare/v0.19.2...v0.20.0 +[0.19.2]: https://github.com/theskumar/python-dotenv/compare/v0.19.1...v0.19.2 +[0.19.1]: https://github.com/theskumar/python-dotenv/compare/v0.19.0...v0.19.1 +[0.19.0]: https://github.com/theskumar/python-dotenv/compare/v0.18.0...v0.19.0 +[0.18.0]: https://github.com/theskumar/python-dotenv/compare/v0.17.1...v0.18.0 +[0.17.1]: https://github.com/theskumar/python-dotenv/compare/v0.17.0...v0.17.1 +[0.17.0]: https://github.com/theskumar/python-dotenv/compare/v0.16.0...v0.17.0 +[0.16.0]: https://github.com/theskumar/python-dotenv/compare/v0.15.0...v0.16.0 +[0.15.0]: https://github.com/theskumar/python-dotenv/compare/v0.14.0...v0.15.0 +[0.14.0]: https://github.com/theskumar/python-dotenv/compare/v0.13.0...v0.14.0 +[0.13.0]: https://github.com/theskumar/python-dotenv/compare/v0.12.0...v0.13.0 +[0.12.0]: https://github.com/theskumar/python-dotenv/compare/v0.11.0...v0.12.0 +[0.11.0]: https://github.com/theskumar/python-dotenv/compare/v0.10.5...v0.11.0 +[0.10.5]: https://github.com/theskumar/python-dotenv/compare/v0.10.4...v0.10.5 +[0.10.4]: https://github.com/theskumar/python-dotenv/compare/v0.10.3...v0.10.4 diff --git a/code-server-config/.cache/pip/http-v2/a/b/d/d/d/abdddc46265b81c7d6dc73a20f1ad8ef043a66e9e79abdc1379bf71e b/code-server-config/.cache/pip/http-v2/a/b/d/d/d/abdddc46265b81c7d6dc73a20f1ad8ef043a66e9e79abdc1379bf71e new file mode 100755 index 0000000..6519b65 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/a/b/d/d/d/abdddc46265b81c7d6dc73a20f1ad8ef043a66e9e79abdc1379bf71e differ diff --git a/code-server-config/.cache/pip/http-v2/a/b/d/d/d/abdddc46265b81c7d6dc73a20f1ad8ef043a66e9e79abdc1379bf71e.body b/code-server-config/.cache/pip/http-v2/a/b/d/d/d/abdddc46265b81c7d6dc73a20f1ad8ef043a66e9e79abdc1379bf71e.body new file mode 100755 index 0000000..bcd4691 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/a/b/d/d/d/abdddc46265b81c7d6dc73a20f1ad8ef043a66e9e79abdc1379bf71e.body differ diff --git a/code-server-config/.cache/pip/http-v2/a/e/5/f/a/ae5faffb20c18d03a8d32e103e2a7344328d8d276566417eca03d0d7 b/code-server-config/.cache/pip/http-v2/a/e/5/f/a/ae5faffb20c18d03a8d32e103e2a7344328d8d276566417eca03d0d7 new file mode 100755 index 0000000..68a9f50 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/a/e/5/f/a/ae5faffb20c18d03a8d32e103e2a7344328d8d276566417eca03d0d7 differ diff --git a/code-server-config/.cache/pip/http-v2/a/e/5/f/a/ae5faffb20c18d03a8d32e103e2a7344328d8d276566417eca03d0d7.body b/code-server-config/.cache/pip/http-v2/a/e/5/f/a/ae5faffb20c18d03a8d32e103e2a7344328d8d276566417eca03d0d7.body new file mode 100755 index 0000000..744af97 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/a/e/5/f/a/ae5faffb20c18d03a8d32e103e2a7344328d8d276566417eca03d0d7.body differ diff --git a/code-server-config/.cache/pip/http-v2/b/8/0/2/b/b802bf744f29add6cd6c7e4d8b0a9da659981b9f2631696f1ff03c30 b/code-server-config/.cache/pip/http-v2/b/8/0/2/b/b802bf744f29add6cd6c7e4d8b0a9da659981b9f2631696f1ff03c30 new file mode 100755 index 0000000..f379e3c Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/b/8/0/2/b/b802bf744f29add6cd6c7e4d8b0a9da659981b9f2631696f1ff03c30 differ diff --git a/code-server-config/.cache/pip/http-v2/b/8/0/2/b/b802bf744f29add6cd6c7e4d8b0a9da659981b9f2631696f1ff03c30.body b/code-server-config/.cache/pip/http-v2/b/8/0/2/b/b802bf744f29add6cd6c7e4d8b0a9da659981b9f2631696f1ff03c30.body new file mode 100755 index 0000000..7fd97b7 --- /dev/null +++ b/code-server-config/.cache/pip/http-v2/b/8/0/2/b/b802bf744f29add6cd6c7e4d8b0a9da659981b9f2631696f1ff03c30.body @@ -0,0 +1,123 @@ +Metadata-Version: 2.4 +Name: beautifulsoup4 +Version: 4.14.3 +Summary: Screen-scraping library +Project-URL: Download, https://www.crummy.com/software/BeautifulSoup/bs4/download/ +Project-URL: Homepage, https://www.crummy.com/software/BeautifulSoup/bs4/ +Author-email: Leonard Richardson +License: MIT License +License-File: AUTHORS +License-File: LICENSE +Keywords: HTML,XML,parse,soup +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup :: HTML +Classifier: Topic :: Text Processing :: Markup :: SGML +Classifier: Topic :: Text Processing :: Markup :: XML +Requires-Python: >=3.7.0 +Requires-Dist: soupsieve>=1.6.1 +Requires-Dist: typing-extensions>=4.0.0 +Provides-Extra: cchardet +Requires-Dist: cchardet; extra == 'cchardet' +Provides-Extra: chardet +Requires-Dist: chardet; extra == 'chardet' +Provides-Extra: charset-normalizer +Requires-Dist: charset-normalizer; extra == 'charset-normalizer' +Provides-Extra: html5lib +Requires-Dist: html5lib; extra == 'html5lib' +Provides-Extra: lxml +Requires-Dist: lxml; extra == 'lxml' +Description-Content-Type: text/markdown + +Beautiful Soup is a library that makes it easy to scrape information +from web pages. It sits atop an HTML or XML parser, providing Pythonic +idioms for iterating, searching, and modifying the parse tree. + +# Quick start + +``` +>>> from bs4 import BeautifulSoup +>>> soup = BeautifulSoup("

SomebadHTML") +>>> print(soup.prettify()) + + +

+ Some + + bad + + HTML + + +

+ + +>>> soup.find(string="bad") +'bad' +>>> soup.i +HTML +# +>>> soup = BeautifulSoup("SomebadXML", "xml") +# +>>> print(soup.prettify()) + + + Some + + bad + + XML + + +``` + +To go beyond the basics, [comprehensive documentation is available](https://www.crummy.com/software/BeautifulSoup/bs4/doc/). + +# Links + +* [Homepage](https://www.crummy.com/software/BeautifulSoup/bs4/) +* [Documentation](https://www.crummy.com/software/BeautifulSoup/bs4/doc/) +* [Discussion group](https://groups.google.com/group/beautifulsoup/) +* [Development](https://code.launchpad.net/beautifulsoup/) +* [Bug tracker](https://bugs.launchpad.net/beautifulsoup/) +* [Complete changelog](https://git.launchpad.net/beautifulsoup/tree/CHANGELOG) + +# Note on Python 2 sunsetting + +Beautiful Soup's support for Python 2 was discontinued on December 31, +2020: one year after the sunset date for Python 2 itself. From this +point onward, new Beautiful Soup development will exclusively target +Python 3. The final release of Beautiful Soup 4 to support Python 2 +was 4.9.3. + +# Supporting the project + +If you use Beautiful Soup as part of your professional work, please consider a +[Tidelift subscription](https://tidelift.com/subscription/pkg/pypi-beautifulsoup4?utm_source=pypi-beautifulsoup4&utm_medium=referral&utm_campaign=readme). +This will support many of the free software projects your organization +depends on, not just Beautiful Soup. + +If you use Beautiful Soup for personal projects, the best way to say +thank you is to read +[Tool Safety](https://www.crummy.com/software/BeautifulSoup/zine/), a zine I +wrote about what Beautiful Soup has taught me about software +development. + +# Building the documentation + +The bs4/doc/ directory contains full documentation in Sphinx +format. Run `make html` in that directory to create HTML +documentation. + +# Running the unit tests + +Beautiful Soup supports unit test discovery using Pytest: + +``` +$ pytest +``` + diff --git a/code-server-config/.cache/pip/http-v2/d/6/b/5/a/d6b5a680d6bd64b15d21710b790a7149c0cb6150e5b7d7a0964e2d8b b/code-server-config/.cache/pip/http-v2/d/6/b/5/a/d6b5a680d6bd64b15d21710b790a7149c0cb6150e5b7d7a0964e2d8b new file mode 100755 index 0000000..68cbc43 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/d/6/b/5/a/d6b5a680d6bd64b15d21710b790a7149c0cb6150e5b7d7a0964e2d8b differ diff --git a/code-server-config/.cache/pip/http-v2/d/6/b/5/a/d6b5a680d6bd64b15d21710b790a7149c0cb6150e5b7d7a0964e2d8b.body b/code-server-config/.cache/pip/http-v2/d/6/b/5/a/d6b5a680d6bd64b15d21710b790a7149c0cb6150e5b7d7a0964e2d8b.body new file mode 100755 index 0000000..550a670 --- /dev/null +++ b/code-server-config/.cache/pip/http-v2/d/6/b/5/a/d6b5a680d6bd64b15d21710b790a7149c0cb6150e5b7d7a0964e2d8b.body @@ -0,0 +1,117 @@ +Metadata-Version: 2.4 +Name: greenlet +Version: 3.3.0 +Summary: Lightweight in-process concurrent programming +Home-page: https://greenlet.readthedocs.io/ +Author: Alexey Borzenkov +Author-email: snaury@gmail.com +Maintainer: Jason Madden +Maintainer-email: jason@seecoresoftware.com +License: MIT AND Python-2.0 +Project-URL: Bug Tracker, https://github.com/python-greenlet/greenlet/issues +Project-URL: Source Code, https://github.com/python-greenlet/greenlet/ +Project-URL: Documentation, https://greenlet.readthedocs.io/ +Project-URL: Changes, https://greenlet.readthedocs.io/en/latest/changes.html +Keywords: greenlet coroutine concurrency threads cooperative +Platform: any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Natural Language :: English +Classifier: Programming Language :: C +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 +Classifier: Operating System :: OS Independent +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Python: >=3.10 +Description-Content-Type: text/x-rst +License-File: LICENSE +License-File: LICENSE.PSF +Provides-Extra: docs +Requires-Dist: Sphinx; extra == "docs" +Requires-Dist: furo; extra == "docs" +Provides-Extra: test +Requires-Dist: objgraph; extra == "test" +Requires-Dist: psutil; extra == "test" +Requires-Dist: setuptools; extra == "test" +Dynamic: author +Dynamic: author-email +Dynamic: classifier +Dynamic: description +Dynamic: description-content-type +Dynamic: home-page +Dynamic: keywords +Dynamic: license +Dynamic: license-file +Dynamic: maintainer +Dynamic: maintainer-email +Dynamic: platform +Dynamic: project-url +Dynamic: provides-extra +Dynamic: requires-python +Dynamic: summary + +.. This file is included into docs/history.rst + + +Greenlets are lightweight coroutines for in-process concurrent +programming. + +The "greenlet" package is a spin-off of `Stackless`_, a version of +CPython that supports micro-threads called "tasklets". Tasklets run +pseudo-concurrently (typically in a single or a few OS-level threads) +and are synchronized with data exchanges on "channels". + +A "greenlet", on the other hand, is a still more primitive notion of +micro-thread with no implicit scheduling; coroutines, in other words. +This is useful when you want to control exactly when your code runs. +You can build custom scheduled micro-threads on top of greenlet; +however, it seems that greenlets are useful on their own as a way to +make advanced control flow structures. For example, we can recreate +generators; the difference with Python's own generators is that our +generators can call nested functions and the nested functions can +yield values too. (Additionally, you don't need a "yield" keyword. See +the example in `test_generator.py +`_). + +Greenlets are provided as a C extension module for the regular unmodified +interpreter. + +.. _`Stackless`: http://www.stackless.com + + +Who is using Greenlet? +====================== + +There are several libraries that use Greenlet as a more flexible +alternative to Python's built in coroutine support: + + - `Concurrence`_ + - `Eventlet`_ + - `Gevent`_ + +.. _Concurrence: http://opensource.hyves.org/concurrence/ +.. _Eventlet: http://eventlet.net/ +.. _Gevent: http://www.gevent.org/ + +Getting Greenlet +================ + +The easiest way to get Greenlet is to install it with pip:: + + pip install greenlet + + +Source code archives and binary distributions are available on the +python package index at https://pypi.org/project/greenlet + +The source code repository is hosted on github: +https://github.com/python-greenlet/greenlet + +Documentation is available on readthedocs.org: +https://greenlet.readthedocs.io diff --git a/code-server-config/.cache/pip/http-v2/d/b/4/f/1/db4f1a46f0bc9bac065fd35cdbe1c65d030e9fd9ca59d06fa230106f b/code-server-config/.cache/pip/http-v2/d/b/4/f/1/db4f1a46f0bc9bac065fd35cdbe1c65d030e9fd9ca59d06fa230106f new file mode 100755 index 0000000..f17a5db Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/d/b/4/f/1/db4f1a46f0bc9bac065fd35cdbe1c65d030e9fd9ca59d06fa230106f differ diff --git a/code-server-config/.cache/pip/http-v2/d/b/4/f/1/db4f1a46f0bc9bac065fd35cdbe1c65d030e9fd9ca59d06fa230106f.body b/code-server-config/.cache/pip/http-v2/d/b/4/f/1/db4f1a46f0bc9bac065fd35cdbe1c65d030e9fd9ca59d06fa230106f.body new file mode 100755 index 0000000..7a4a4b7 --- /dev/null +++ b/code-server-config/.cache/pip/http-v2/d/b/4/f/1/db4f1a46f0bc9bac065fd35cdbe1c65d030e9fd9ca59d06fa230106f.body @@ -0,0 +1,209 @@ +Metadata-Version: 2.4 +Name: idna +Version: 3.11 +Summary: Internationalized Domain Names in Applications (IDNA) +Author-email: Kim Davies +Requires-Python: >=3.8 +Description-Content-Type: text/x-rst +License-Expression: BSD-3-Clause +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: System Administrators +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Internet :: Name Service (DNS) +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Utilities +License-File: LICENSE.md +Requires-Dist: ruff >= 0.6.2 ; extra == "all" +Requires-Dist: mypy >= 1.11.2 ; extra == "all" +Requires-Dist: pytest >= 8.3.2 ; extra == "all" +Requires-Dist: flake8 >= 7.1.1 ; extra == "all" +Project-URL: Changelog, https://github.com/kjd/idna/blob/master/HISTORY.rst +Project-URL: Issue tracker, https://github.com/kjd/idna/issues +Project-URL: Source, https://github.com/kjd/idna +Provides-Extra: all + +Internationalized Domain Names in Applications (IDNA) +===================================================== + +Support for `Internationalized Domain Names in +Applications (IDNA) `_ +and `Unicode IDNA Compatibility Processing +`_. + +The latest versions of these standards supplied here provide +more comprehensive language coverage and reduce the potential of +allowing domains with known security vulnerabilities. This library +is a suitable replacement for the “encodings.idna” +module that comes with the Python standard library, but which +only supports an older superseded IDNA specification from 2003. + +Basic functions are simply executed: + +.. code-block:: pycon + + >>> import idna + >>> idna.encode('ドメイン.テスト') + b'xn--eckwd4c7c.xn--zckzah' + >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) + ドメイン.テスト + + +Installation +------------ + +This package is available for installation from PyPI via the +typical mechanisms, such as: + +.. code-block:: bash + + $ python3 -m pip install idna + + +Usage +----- + +For typical usage, the ``encode`` and ``decode`` functions will take a +domain name argument and perform a conversion to ASCII compatible encoding +(known as A-labels), or to Unicode strings (known as U-labels) +respectively. + +.. code-block:: pycon + + >>> import idna + >>> idna.encode('ドメイン.テスト') + b'xn--eckwd4c7c.xn--zckzah' + >>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) + ドメイン.テスト + +Conversions can be applied at a per-label basis using the ``ulabel`` or +``alabel`` functions if necessary: + +.. code-block:: pycon + + >>> idna.alabel('测试') + b'xn--0zwm56d' + + +Compatibility Mapping (UTS #46) ++++++++++++++++++++++++++++++++ + +This library provides support for `Unicode IDNA Compatibility +Processing `_ which normalizes input from +different potential ways a user may input a domain prior to performing the IDNA +conversion operations. This functionality, known as a +`mapping `_, is considered by the +specification to be a local user-interface issue distinct from IDNA +conversion functionality. + +For example, “Königsgäßchen” is not a permissible label as *LATIN +CAPITAL LETTER K* is not allowed (nor are capital letters in general). +UTS 46 will convert this into lower case prior to applying the IDNA +conversion. + +.. code-block:: pycon + + >>> import idna + >>> idna.encode('Königsgäßchen') + ... + idna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed + >>> idna.encode('Königsgäßchen', uts46=True) + b'xn--knigsgchen-b4a3dun' + >>> print(idna.decode('xn--knigsgchen-b4a3dun')) + königsgäßchen + + +Exceptions +---------- + +All errors raised during the conversion following the specification +should raise an exception derived from the ``idna.IDNAError`` base +class. + +More specific exceptions that may be generated as ``idna.IDNABidiError`` +when the error reflects an illegal combination of left-to-right and +right-to-left characters in a label; ``idna.InvalidCodepoint`` when +a specific codepoint is an illegal character in an IDN label (i.e. +INVALID); and ``idna.InvalidCodepointContext`` when the codepoint is +illegal based on its position in the string (i.e. it is CONTEXTO or CONTEXTJ +but the contextual requirements are not satisfied.) + +Building and Diagnostics +------------------------ + +The IDNA and UTS 46 functionality relies upon pre-calculated lookup +tables for performance. These tables are derived from computing against +eligibility criteria in the respective standards using the command-line +script ``tools/idna-data``. + +This tool will fetch relevant codepoint data from the Unicode repository +and perform the required calculations to identify eligibility. There are +three main modes: + +* ``idna-data make-libdata``. Generates ``idnadata.py`` and + ``uts46data.py``, the pre-calculated lookup tables used for IDNA and + UTS 46 conversions. Implementers who wish to track this library against + a different Unicode version may use this tool to manually generate a + different version of the ``idnadata.py`` and ``uts46data.py`` files. + +* ``idna-data make-table``. Generate a table of the IDNA disposition + (e.g. PVALID, CONTEXTJ, CONTEXTO) in the format found in Appendix + B.1 of RFC 5892 and the pre-computed tables published by `IANA + `_. + +* ``idna-data U+0061``. Prints debugging output on the various + properties associated with an individual Unicode codepoint (in this + case, U+0061), that are used to assess the IDNA and UTS 46 status of a + codepoint. This is helpful in debugging or analysis. + +The tool accepts a number of arguments, described using ``idna-data +-h``. Most notably, the ``--version`` argument allows the specification +of the version of Unicode to be used in computing the table data. For +example, ``idna-data --version 9.0.0 make-libdata`` will generate +library data against Unicode 9.0.0. + + +Additional Notes +---------------- + +* **Packages**. The latest tagged release version is published in the + `Python Package Index `_. + +* **Version support**. This library supports Python 3.8 and higher. + As this library serves as a low-level toolkit for a variety of + applications, many of which strive for broad compatibility with older + Python versions, there is no rush to remove older interpreter support. + Support for older versions are likely to be removed from new releases + as automated tests can no longer easily be run, i.e. once the Python + version is officially end-of-life. + +* **Testing**. The library has a test suite based on each rule of the + IDNA specification, as well as tests that are provided as part of the + Unicode Technical Standard 46, `Unicode IDNA Compatibility Processing + `_. + +* **Emoji**. It is an occasional request to support emoji domains in + this library. Encoding of symbols like emoji is expressly prohibited by + the technical standard IDNA 2008 and emoji domains are broadly phased + out across the domain industry due to associated security risks. For + now, applications that need to support these non-compliant labels + may wish to consider trying the encode/decode operation in this library + first, and then falling back to using `encodings.idna`. See `the Github + project `_ for more discussion. + +* **Transitional processing**. Unicode 16.0.0 removed transitional + processing so the `transitional` argument for the encode() method + no longer has any effect and will be removed at a later date. + diff --git a/code-server-config/.cache/pip/http-v2/d/b/9/a/3/db9a3eb3ed1c69080413f0e56d069f54abebad45f36724e37d4d717e b/code-server-config/.cache/pip/http-v2/d/b/9/a/3/db9a3eb3ed1c69080413f0e56d069f54abebad45f36724e37d4d717e new file mode 100755 index 0000000..0a1e436 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/d/b/9/a/3/db9a3eb3ed1c69080413f0e56d069f54abebad45f36724e37d4d717e differ diff --git a/code-server-config/.cache/pip/http-v2/d/b/9/a/3/db9a3eb3ed1c69080413f0e56d069f54abebad45f36724e37d4d717e.body b/code-server-config/.cache/pip/http-v2/d/b/9/a/3/db9a3eb3ed1c69080413f0e56d069f54abebad45f36724e37d4d717e.body new file mode 100755 index 0000000..6c9dccf --- /dev/null +++ b/code-server-config/.cache/pip/http-v2/d/b/9/a/3/db9a3eb3ed1c69080413f0e56d069f54abebad45f36724e37d4d717e.body @@ -0,0 +1,115 @@ +Metadata-Version: 2.4 +Name: soupsieve +Version: 2.8.3 +Summary: A modern CSS selector implementation for Beautiful Soup. +Project-URL: Homepage, https://github.com/facelessuser/soupsieve +Author-email: Isaac Muse +License-Expression: MIT +License-File: LICENSE.md +Keywords: CSS,HTML,XML,filter,query,selector,soup +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Console +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Typing :: Typed +Requires-Python: >=3.9 +Description-Content-Type: text/markdown + +[![Donate via PayPal][donate-image]][donate-link] +[![Build][github-ci-image]][github-ci-link] +[![Coverage Status][codecov-image]][codecov-link] +[![PyPI Version][pypi-image]][pypi-link] +[![PyPI Downloads][pypi-down]][pypi-link] +[![PyPI - Python Version][python-image]][pypi-link] +[![License][license-image-mit]][license-link] + +# Soup Sieve + +## Overview + +Soup Sieve is a CSS selector library designed to be used with [Beautiful Soup 4][bs4]. It aims to provide selecting, +matching, and filtering using modern CSS selectors. Soup Sieve currently provides selectors from the CSS level 1 +specifications up through the latest CSS level 4 drafts and beyond (though some are not yet implemented). + +Soup Sieve was written with the intent to replace Beautiful Soup's builtin select feature, and as of Beautiful Soup +version 4.7.0, it now is :confetti_ball:. Soup Sieve can also be imported in order to use its API directly for +more controlled, specialized parsing. + +Soup Sieve has implemented most of the CSS selectors up through the latest CSS draft specifications, though there are a +number that don't make sense in a non-browser environment. Selectors that cannot provide meaningful functionality simply +do not match anything. Some of the supported selectors are: + +- `.classes` +- `#ids` +- `[attributes=value]` +- `parent child` +- `parent > child` +- `sibling ~ sibling` +- `sibling + sibling` +- `:not(element.class, element2.class)` +- `:is(element.class, element2.class)` +- `parent:has(> child)` +- and [many more](https://facelessuser.github.io/soupsieve/selectors/) + + +## Installation + +You must have Beautiful Soup already installed: + +``` +pip install beautifulsoup4 +``` + +In most cases, assuming you've installed version 4.7.0, that should be all you need to do, but if you've installed via +some alternative method, and Soup Sieve is not automatically installed, you can install it directly: + +``` +pip install soupsieve +``` + +If you want to manually install it from source, first ensure that [`build`](https://pypi.org/project/build/) is +installed: + +``` +pip install build +``` + +Then navigate to the root of the project and build the wheel and install (replacing `` with the current version): + +``` +python -m build -w +pip install dist/soupsieve--py3-none-any.whl +``` + +## Documentation + +Documentation is found here: https://facelessuser.github.io/soupsieve/. + +## License + +MIT + +[bs4]: https://beautiful-soup-4.readthedocs.io/en/latest/# + +[github-ci-image]: https://github.com/facelessuser/soupsieve/workflows/build/badge.svg +[github-ci-link]: https://github.com/facelessuser/soupsieve/actions?query=workflow%3Abuild+branch%3Amain +[codecov-image]: https://img.shields.io/codecov/c/github/facelessuser/soupsieve/master.svg?logo=codecov&logoColor=aaaaaa&labelColor=333333 +[codecov-link]: https://codecov.io/github/facelessuser/soupsieve +[pypi-image]: https://img.shields.io/pypi/v/soupsieve.svg?logo=pypi&logoColor=aaaaaa&labelColor=333333 +[pypi-down]: https://img.shields.io/pypi/dm/soupsieve.svg?logo=pypi&logoColor=aaaaaa&labelColor=333333 +[pypi-link]: https://pypi.python.org/pypi/soupsieve +[python-image]: https://img.shields.io/pypi/pyversions/soupsieve?logo=python&logoColor=aaaaaa&labelColor=333333 +[license-image-mit]: https://img.shields.io/badge/license-MIT-blue.svg?labelColor=333333 +[license-link]: https://github.com/facelessuser/soupsieve/blob/main/LICENSE.md +[donate-image]: https://img.shields.io/badge/Donate-PayPal-3fabd1?logo=paypal +[donate-link]: https://www.paypal.me/facelessuser diff --git a/code-server-config/.cache/pip/http-v2/d/e/e/3/2/dee321d19881b0f93bb72eb4ca6571ddc1fcf222716907097a4957e1 b/code-server-config/.cache/pip/http-v2/d/e/e/3/2/dee321d19881b0f93bb72eb4ca6571ddc1fcf222716907097a4957e1 new file mode 100755 index 0000000..3999213 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/d/e/e/3/2/dee321d19881b0f93bb72eb4ca6571ddc1fcf222716907097a4957e1 differ diff --git a/code-server-config/.cache/pip/http-v2/d/e/e/3/2/dee321d19881b0f93bb72eb4ca6571ddc1fcf222716907097a4957e1.body b/code-server-config/.cache/pip/http-v2/d/e/e/3/2/dee321d19881b0f93bb72eb4ca6571ddc1fcf222716907097a4957e1.body new file mode 100755 index 0000000..fd04670 --- /dev/null +++ b/code-server-config/.cache/pip/http-v2/d/e/e/3/2/dee321d19881b0f93bb72eb4ca6571ddc1fcf222716907097a4957e1.body @@ -0,0 +1,131 @@ +Metadata-Version: 2.4 +Name: asyncpg +Version: 0.31.0 +Summary: An asyncio PostgreSQL driver +Author-email: MagicStack Inc +License-Expression: Apache-2.0 +Project-URL: github, https://github.com/MagicStack/asyncpg +Keywords: database,postgres +Classifier: Development Status :: 5 - Production/Stable +Classifier: Framework :: AsyncIO +Classifier: Intended Audience :: Developers +Classifier: Operating System :: POSIX +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Operating System :: Microsoft :: Windows +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Free Threading :: 2 - Beta +Classifier: Topic :: Database :: Front-Ends +Requires-Python: >=3.9.0 +Description-Content-Type: text/x-rst +License-File: LICENSE +Requires-Dist: async_timeout>=4.0.3; python_version < "3.11.0" +Provides-Extra: gssauth +Requires-Dist: gssapi; platform_system != "Windows" and extra == "gssauth" +Requires-Dist: sspilib; platform_system == "Windows" and extra == "gssauth" +Dynamic: license-file + +asyncpg -- A fast PostgreSQL Database Client Library for Python/asyncio +======================================================================= + +.. image:: https://github.com/MagicStack/asyncpg/workflows/Tests/badge.svg + :target: https://github.com/MagicStack/asyncpg/actions?query=workflow%3ATests+branch%3Amaster + :alt: GitHub Actions status +.. image:: https://img.shields.io/pypi/v/asyncpg.svg + :target: https://pypi.python.org/pypi/asyncpg + +**asyncpg** is a database interface library designed specifically for +PostgreSQL and Python/asyncio. asyncpg is an efficient, clean implementation +of PostgreSQL server binary protocol for use with Python's ``asyncio`` +framework. You can read more about asyncpg in an introductory +`blog post `_. + +asyncpg requires Python 3.9 or later and is supported for PostgreSQL +versions 9.5 to 18. Other PostgreSQL versions or other databases +implementing the PostgreSQL protocol *may* work, but are not being +actively tested. + + +Documentation +------------- + +The project documentation can be found +`here `_. + + +Performance +----------- + +In our testing asyncpg is, on average, **5x** faster than psycopg3. + +.. image:: https://raw.githubusercontent.com/MagicStack/asyncpg/master/performance.png?fddca40ab0 + :target: https://gistpreview.github.io/?0ed296e93523831ea0918d42dd1258c2 + +The above results are a geometric mean of benchmarks obtained with PostgreSQL +`client driver benchmarking toolbench `_ +in June 2023 (click on the chart to see full details). + + +Features +-------- + +asyncpg implements PostgreSQL server protocol natively and exposes its +features directly, as opposed to hiding them behind a generic facade +like DB-API. + +This enables asyncpg to have easy-to-use support for: + +* **prepared statements** +* **scrollable cursors** +* **partial iteration** on query results +* automatic encoding and decoding of composite types, arrays, + and any combination of those +* straightforward support for custom data types + + +Installation +------------ + +asyncpg is available on PyPI. When not using GSSAPI/SSPI authentication it +has no dependencies. Use pip to install:: + + $ pip install asyncpg + +If you need GSSAPI/SSPI authentication, use:: + + $ pip install 'asyncpg[gssauth]' + +For more details, please `see the documentation +`_. + + +Basic Usage +----------- + +.. code-block:: python + + import asyncio + import asyncpg + + async def run(): + conn = await asyncpg.connect(user='user', password='password', + database='database', host='127.0.0.1') + values = await conn.fetch( + 'SELECT * FROM mytable WHERE id = $1', + 10, + ) + await conn.close() + + asyncio.run(run()) + + +License +------- + +asyncpg is developed and distributed under the Apache 2.0 license. diff --git a/code-server-config/.cache/pip/http-v2/e/0/b/4/f/e0b4f4d1d5b8bb8b844f230fb9255eeabd73b4bd6598e826c4219d4f b/code-server-config/.cache/pip/http-v2/e/0/b/4/f/e0b4f4d1d5b8bb8b844f230fb9255eeabd73b4bd6598e826c4219d4f new file mode 100755 index 0000000..340ad5a Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/e/0/b/4/f/e0b4f4d1d5b8bb8b844f230fb9255eeabd73b4bd6598e826c4219d4f differ diff --git a/code-server-config/.cache/pip/http-v2/e/0/b/4/f/e0b4f4d1d5b8bb8b844f230fb9255eeabd73b4bd6598e826c4219d4f.body b/code-server-config/.cache/pip/http-v2/e/0/b/4/f/e0b4f4d1d5b8bb8b844f230fb9255eeabd73b4bd6598e826c4219d4f.body new file mode 100755 index 0000000..5fec9ca Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/e/0/b/4/f/e0b4f4d1d5b8bb8b844f230fb9255eeabd73b4bd6598e826c4219d4f.body differ diff --git a/code-server-config/.cache/pip/http-v2/e/2/0/7/4/e207426cbcf220918fdf354826064190a066f96cd6ad8830f1f11fdc b/code-server-config/.cache/pip/http-v2/e/2/0/7/4/e207426cbcf220918fdf354826064190a066f96cd6ad8830f1f11fdc new file mode 100755 index 0000000..82c90da Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/e/2/0/7/4/e207426cbcf220918fdf354826064190a066f96cd6ad8830f1f11fdc differ diff --git a/code-server-config/.cache/pip/http-v2/e/2/0/7/4/e207426cbcf220918fdf354826064190a066f96cd6ad8830f1f11fdc.body b/code-server-config/.cache/pip/http-v2/e/2/0/7/4/e207426cbcf220918fdf354826064190a066f96cd6ad8830f1f11fdc.body new file mode 100755 index 0000000..a53f272 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/e/2/0/7/4/e207426cbcf220918fdf354826064190a066f96cd6ad8830f1f11fdc.body differ diff --git a/code-server-config/.cache/pip/http-v2/f/0/e/2/8/f0e28ece914c8ef232bd16f2cf5fb25d89ec879e8b2a76672e0df90c b/code-server-config/.cache/pip/http-v2/f/0/e/2/8/f0e28ece914c8ef232bd16f2cf5fb25d89ec879e8b2a76672e0df90c new file mode 100755 index 0000000..9687aa5 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/f/0/e/2/8/f0e28ece914c8ef232bd16f2cf5fb25d89ec879e8b2a76672e0df90c differ diff --git a/code-server-config/.cache/pip/http-v2/f/0/e/2/8/f0e28ece914c8ef232bd16f2cf5fb25d89ec879e8b2a76672e0df90c.body b/code-server-config/.cache/pip/http-v2/f/0/e/2/8/f0e28ece914c8ef232bd16f2cf5fb25d89ec879e8b2a76672e0df90c.body new file mode 100755 index 0000000..66ce9f9 Binary files /dev/null and b/code-server-config/.cache/pip/http-v2/f/0/e/2/8/f0e28ece914c8ef232bd16f2cf5fb25d89ec879e8b2a76672e0df90c.body differ diff --git a/code-server-config/.config/code-server/config.yaml b/code-server-config/.config/code-server/config.yaml new file mode 100755 index 0000000..3b58bf3 --- /dev/null +++ b/code-server-config/.config/code-server/config.yaml @@ -0,0 +1,4 @@ +bind-addr: 127.0.0.1:8080 +auth: password +password: ae12057fa11dcf48ceda7d66 +cert: false diff --git a/code-server-config/.local/bin/dotenv b/code-server-config/.local/bin/dotenv new file mode 100755 index 0000000..5f2f190 --- /dev/null +++ b/code-server-config/.local/bin/dotenv @@ -0,0 +1,8 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from dotenv.__main__ import cli +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(cli()) diff --git a/code-server-config/.local/bin/httpx b/code-server-config/.local/bin/httpx new file mode 100755 index 0000000..f509dcd --- /dev/null +++ b/code-server-config/.local/bin/httpx @@ -0,0 +1,8 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from httpx import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/code-server-config/.local/include/python3.12/greenlet/greenlet.h b/code-server-config/.local/include/python3.12/greenlet/greenlet.h new file mode 100755 index 0000000..d02a16e --- /dev/null +++ b/code-server-config/.local/include/python3.12/greenlet/greenlet.h @@ -0,0 +1,164 @@ +/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ + +/* Greenlet object interface */ + +#ifndef Py_GREENLETOBJECT_H +#define Py_GREENLETOBJECT_H + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* This is deprecated and undocumented. It does not change. */ +#define GREENLET_VERSION "1.0.0" + +#ifndef GREENLET_MODULE +#define implementation_ptr_t void* +#endif + +typedef struct _greenlet { + PyObject_HEAD + PyObject* weakreflist; + PyObject* dict; + implementation_ptr_t pimpl; +} PyGreenlet; + +#define PyGreenlet_Check(op) (op && PyObject_TypeCheck(op, &PyGreenlet_Type)) + + +/* C API functions */ + +/* Total number of symbols that are exported */ +#define PyGreenlet_API_pointers 12 + +#define PyGreenlet_Type_NUM 0 +#define PyExc_GreenletError_NUM 1 +#define PyExc_GreenletExit_NUM 2 + +#define PyGreenlet_New_NUM 3 +#define PyGreenlet_GetCurrent_NUM 4 +#define PyGreenlet_Throw_NUM 5 +#define PyGreenlet_Switch_NUM 6 +#define PyGreenlet_SetParent_NUM 7 + +#define PyGreenlet_MAIN_NUM 8 +#define PyGreenlet_STARTED_NUM 9 +#define PyGreenlet_ACTIVE_NUM 10 +#define PyGreenlet_GET_PARENT_NUM 11 + +#ifndef GREENLET_MODULE +/* This section is used by modules that uses the greenlet C API */ +static void** _PyGreenlet_API = NULL; + +# define PyGreenlet_Type \ + (*(PyTypeObject*)_PyGreenlet_API[PyGreenlet_Type_NUM]) + +# define PyExc_GreenletError \ + ((PyObject*)_PyGreenlet_API[PyExc_GreenletError_NUM]) + +# define PyExc_GreenletExit \ + ((PyObject*)_PyGreenlet_API[PyExc_GreenletExit_NUM]) + +/* + * PyGreenlet_New(PyObject *args) + * + * greenlet.greenlet(run, parent=None) + */ +# define PyGreenlet_New \ + (*(PyGreenlet * (*)(PyObject * run, PyGreenlet * parent)) \ + _PyGreenlet_API[PyGreenlet_New_NUM]) + +/* + * PyGreenlet_GetCurrent(void) + * + * greenlet.getcurrent() + */ +# define PyGreenlet_GetCurrent \ + (*(PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM]) + +/* + * PyGreenlet_Throw( + * PyGreenlet *greenlet, + * PyObject *typ, + * PyObject *val, + * PyObject *tb) + * + * g.throw(...) + */ +# define PyGreenlet_Throw \ + (*(PyObject * (*)(PyGreenlet * self, \ + PyObject * typ, \ + PyObject * val, \ + PyObject * tb)) \ + _PyGreenlet_API[PyGreenlet_Throw_NUM]) + +/* + * PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args) + * + * g.switch(*args, **kwargs) + */ +# define PyGreenlet_Switch \ + (*(PyObject * \ + (*)(PyGreenlet * greenlet, PyObject * args, PyObject * kwargs)) \ + _PyGreenlet_API[PyGreenlet_Switch_NUM]) + +/* + * PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent) + * + * g.parent = new_parent + */ +# define PyGreenlet_SetParent \ + (*(int (*)(PyGreenlet * greenlet, PyGreenlet * nparent)) \ + _PyGreenlet_API[PyGreenlet_SetParent_NUM]) + +/* + * PyGreenlet_GetParent(PyObject* greenlet) + * + * return greenlet.parent; + * + * This could return NULL even if there is no exception active. + * If it does not return NULL, you are responsible for decrementing the + * reference count. + */ +# define PyGreenlet_GetParent \ + (*(PyGreenlet* (*)(PyGreenlet*)) \ + _PyGreenlet_API[PyGreenlet_GET_PARENT_NUM]) + +/* + * deprecated, undocumented alias. + */ +# define PyGreenlet_GET_PARENT PyGreenlet_GetParent + +# define PyGreenlet_MAIN \ + (*(int (*)(PyGreenlet*)) \ + _PyGreenlet_API[PyGreenlet_MAIN_NUM]) + +# define PyGreenlet_STARTED \ + (*(int (*)(PyGreenlet*)) \ + _PyGreenlet_API[PyGreenlet_STARTED_NUM]) + +# define PyGreenlet_ACTIVE \ + (*(int (*)(PyGreenlet*)) \ + _PyGreenlet_API[PyGreenlet_ACTIVE_NUM]) + + + + +/* Macro that imports greenlet and initializes C API */ +/* NOTE: This has actually moved to ``greenlet._greenlet._C_API``, but we + keep the older definition to be sure older code that might have a copy of + the header still works. */ +# define PyGreenlet_Import() \ + { \ + _PyGreenlet_API = (void**)PyCapsule_Import("greenlet._C_API", 0); \ + } + +#endif /* GREENLET_MODULE */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_GREENLETOBJECT_H */ diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/INSTALLER b/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/INSTALLER new file mode 100755 index 0000000..a1b589e --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/METADATA b/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/METADATA new file mode 100755 index 0000000..dbeb198 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/METADATA @@ -0,0 +1,96 @@ +Metadata-Version: 2.4 +Name: anyio +Version: 4.12.1 +Summary: High-level concurrency and networking framework on top of asyncio or Trio +Author-email: Alex Grönholm +License-Expression: MIT +Project-URL: Documentation, https://anyio.readthedocs.io/en/latest/ +Project-URL: Changelog, https://anyio.readthedocs.io/en/stable/versionhistory.html +Project-URL: Source code, https://github.com/agronholm/anyio +Project-URL: Issue tracker, https://github.com/agronholm/anyio/issues +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Framework :: AnyIO +Classifier: Typing :: Typed +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 +Requires-Python: >=3.9 +Description-Content-Type: text/x-rst +License-File: LICENSE +Requires-Dist: exceptiongroup>=1.0.2; python_version < "3.11" +Requires-Dist: idna>=2.8 +Requires-Dist: typing_extensions>=4.5; python_version < "3.13" +Provides-Extra: trio +Requires-Dist: trio>=0.32.0; python_version >= "3.10" and extra == "trio" +Requires-Dist: trio>=0.31.0; python_version < "3.10" and extra == "trio" +Dynamic: license-file + +.. image:: https://github.com/agronholm/anyio/actions/workflows/test.yml/badge.svg + :target: https://github.com/agronholm/anyio/actions/workflows/test.yml + :alt: Build Status +.. image:: https://coveralls.io/repos/github/agronholm/anyio/badge.svg?branch=master + :target: https://coveralls.io/github/agronholm/anyio?branch=master + :alt: Code Coverage +.. image:: https://readthedocs.org/projects/anyio/badge/?version=latest + :target: https://anyio.readthedocs.io/en/latest/?badge=latest + :alt: Documentation +.. image:: https://badges.gitter.im/gitterHQ/gitter.svg + :target: https://gitter.im/python-trio/AnyIO + :alt: Gitter chat + +AnyIO is an asynchronous networking and concurrency library that works on top of either asyncio_ or +Trio_. It implements Trio-like `structured concurrency`_ (SC) on top of asyncio and works in harmony +with the native SC of Trio itself. + +Applications and libraries written against AnyIO's API will run unmodified on either asyncio_ or +Trio_. AnyIO can also be adopted into a library or application incrementally – bit by bit, no full +refactoring necessary. It will blend in with the native libraries of your chosen backend. + +To find out why you might want to use AnyIO's APIs instead of asyncio's, you can read about it +`here `_. + +Documentation +------------- + +View full documentation at: https://anyio.readthedocs.io/ + +Features +-------- + +AnyIO offers the following functionality: + +* Task groups (nurseries_ in trio terminology) +* High-level networking (TCP, UDP and UNIX sockets) + + * `Happy eyeballs`_ algorithm for TCP connections (more robust than that of asyncio on Python + 3.8) + * async/await style UDP sockets (unlike asyncio where you still have to use Transports and + Protocols) + +* A versatile API for byte streams and object streams +* Inter-task synchronization and communication (locks, conditions, events, semaphores, object + streams) +* Worker threads +* Subprocesses +* Subinterpreter support for code parallelization (on Python 3.13 and later) +* Asynchronous file I/O (using worker threads) +* Signal handling +* Asynchronous version of the functools_ module + +AnyIO also comes with its own pytest_ plugin which also supports asynchronous fixtures. +It even works with the popular Hypothesis_ library. + +.. _asyncio: https://docs.python.org/3/library/asyncio.html +.. _Trio: https://github.com/python-trio/trio +.. _structured concurrency: https://en.wikipedia.org/wiki/Structured_concurrency +.. _nurseries: https://trio.readthedocs.io/en/stable/reference-core.html#nurseries-and-spawning +.. _Happy eyeballs: https://en.wikipedia.org/wiki/Happy_Eyeballs +.. _pytest: https://docs.pytest.org/en/latest/ +.. _functools: https://docs.python.org/3/library/functools.html +.. _Hypothesis: https://hypothesis.works/ diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/RECORD b/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/RECORD new file mode 100755 index 0000000..4b3b57c --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/RECORD @@ -0,0 +1,92 @@ +anyio-4.12.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +anyio-4.12.1.dist-info/METADATA,sha256=DfiDab9Tmmcfy802lOLTMEHJQShkOSbopCwqCYbLuJk,4277 +anyio-4.12.1.dist-info/RECORD,, +anyio-4.12.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91 +anyio-4.12.1.dist-info/entry_points.txt,sha256=_d6Yu6uiaZmNe0CydowirE9Cmg7zUL2g08tQpoS3Qvc,39 +anyio-4.12.1.dist-info/licenses/LICENSE,sha256=U2GsncWPLvX9LpsJxoKXwX8ElQkJu8gCO9uC6s8iwrA,1081 +anyio-4.12.1.dist-info/top_level.txt,sha256=QglSMiWX8_5dpoVAEIHdEYzvqFMdSYWmCj6tYw2ITkQ,6 +anyio/__init__.py,sha256=7iDVqMUprUuKNY91FuoKqayAhR-OY136YDPI6P78HHk,6170 +anyio/__pycache__/__init__.cpython-312.pyc,, +anyio/__pycache__/from_thread.cpython-312.pyc,, +anyio/__pycache__/functools.cpython-312.pyc,, +anyio/__pycache__/lowlevel.cpython-312.pyc,, +anyio/__pycache__/pytest_plugin.cpython-312.pyc,, +anyio/__pycache__/to_interpreter.cpython-312.pyc,, +anyio/__pycache__/to_process.cpython-312.pyc,, +anyio/__pycache__/to_thread.cpython-312.pyc,, +anyio/_backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +anyio/_backends/__pycache__/__init__.cpython-312.pyc,, +anyio/_backends/__pycache__/_asyncio.cpython-312.pyc,, +anyio/_backends/__pycache__/_trio.cpython-312.pyc,, +anyio/_backends/_asyncio.py,sha256=xG6qv60mgGnL0mK82dxjH2b8hlkMlJ-x2BqIq3qv70Y,98863 +anyio/_backends/_trio.py,sha256=30Rctb7lm8g63ZHljVPVnj5aH-uK6oQvphjwUBoAzuI,41456 +anyio/_core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +anyio/_core/__pycache__/__init__.cpython-312.pyc,, +anyio/_core/__pycache__/_asyncio_selector_thread.cpython-312.pyc,, +anyio/_core/__pycache__/_contextmanagers.cpython-312.pyc,, +anyio/_core/__pycache__/_eventloop.cpython-312.pyc,, +anyio/_core/__pycache__/_exceptions.cpython-312.pyc,, +anyio/_core/__pycache__/_fileio.cpython-312.pyc,, +anyio/_core/__pycache__/_resources.cpython-312.pyc,, +anyio/_core/__pycache__/_signals.cpython-312.pyc,, +anyio/_core/__pycache__/_sockets.cpython-312.pyc,, +anyio/_core/__pycache__/_streams.cpython-312.pyc,, +anyio/_core/__pycache__/_subprocesses.cpython-312.pyc,, +anyio/_core/__pycache__/_synchronization.cpython-312.pyc,, +anyio/_core/__pycache__/_tasks.cpython-312.pyc,, +anyio/_core/__pycache__/_tempfile.cpython-312.pyc,, +anyio/_core/__pycache__/_testing.cpython-312.pyc,, +anyio/_core/__pycache__/_typedattr.cpython-312.pyc,, +anyio/_core/_asyncio_selector_thread.py,sha256=2PdxFM3cs02Kp6BSppbvmRT7q7asreTW5FgBxEsflBo,5626 +anyio/_core/_contextmanagers.py,sha256=YInBCabiEeS-UaP_Jdxa1CaFC71ETPW8HZTHIM8Rsc8,7215 +anyio/_core/_eventloop.py,sha256=c2EdcBX-xnKwxPcC4Pjn3_qG9I-x4IWFO2R9RqCGjM4,6448 +anyio/_core/_exceptions.py,sha256=Y3aq-Wxd7Q2HqwSg7nZPvRsHEuGazv_qeet6gqEBdPk,4407 +anyio/_core/_fileio.py,sha256=uc7t10Vb-If7GbdWM_zFf-ajUe6uek63fSt7IBLlZW0,25731 +anyio/_core/_resources.py,sha256=NbmU5O5UX3xEyACnkmYX28Fmwdl-f-ny0tHym26e0w0,435 +anyio/_core/_signals.py,sha256=mjTBB2hTKNPRlU0IhnijeQedpWOGERDiMjSlJQsFrug,1016 +anyio/_core/_sockets.py,sha256=RBXHcUqZt5gg_-OOfgHVv8uq2FSKk1uVUzTdpjBoI1o,34977 +anyio/_core/_streams.py,sha256=FczFwIgDpnkK0bODWJXMpsUJYdvAD04kaUaGzJU8DK0,1806 +anyio/_core/_subprocesses.py,sha256=EXm5igL7dj55iYkPlbYVAqtbqxJxjU-6OndSTIx9SRg,8047 +anyio/_core/_synchronization.py,sha256=MgVVqFzvt580tHC31LiOcq1G6aryut--xRG4Ff8KwxQ,20869 +anyio/_core/_tasks.py,sha256=pVB7K6AAulzUM8YgXAeqNZG44nSyZ1bYJjH8GznC00I,5435 +anyio/_core/_tempfile.py,sha256=lHb7CW4FyIlpkf5ADAf4VmLHCKwEHF9nxqNyBCFFUiA,19697 +anyio/_core/_testing.py,sha256=u7MPqGXwpTxqI7hclSdNA30z2GH1Nw258uwKvy_RfBg,2340 +anyio/_core/_typedattr.py,sha256=P4ozZikn3-DbpoYcvyghS_FOYAgbmUxeoU8-L_07pZM,2508 +anyio/abc/__init__.py,sha256=6mWhcl_pGXhrgZVHP_TCfMvIXIOp9mroEFM90fYCU_U,2869 +anyio/abc/__pycache__/__init__.cpython-312.pyc,, +anyio/abc/__pycache__/_eventloop.cpython-312.pyc,, +anyio/abc/__pycache__/_resources.cpython-312.pyc,, +anyio/abc/__pycache__/_sockets.cpython-312.pyc,, +anyio/abc/__pycache__/_streams.cpython-312.pyc,, +anyio/abc/__pycache__/_subprocesses.cpython-312.pyc,, +anyio/abc/__pycache__/_tasks.cpython-312.pyc,, +anyio/abc/__pycache__/_testing.cpython-312.pyc,, +anyio/abc/_eventloop.py,sha256=GlzgB3UJGgG6Kr7olpjOZ-o00PghecXuofVDQ_5611Q,10749 +anyio/abc/_resources.py,sha256=DrYvkNN1hH6Uvv5_5uKySvDsnknGVDe8FCKfko0VtN8,783 +anyio/abc/_sockets.py,sha256=ECTY0jLEF18gryANHR3vFzXzGdZ-xPwELq1QdgOb0Jo,13258 +anyio/abc/_streams.py,sha256=005GKSCXGprxnhucILboSqc2JFovECZk9m3p-qqxXVc,7640 +anyio/abc/_subprocesses.py,sha256=cumAPJTktOQtw63IqG0lDpyZqu_l1EElvQHMiwJgL08,2067 +anyio/abc/_tasks.py,sha256=KC7wrciE48AINOI-AhPutnFhe1ewfP7QnamFlDzqesQ,3721 +anyio/abc/_testing.py,sha256=tBJUzkSfOXJw23fe8qSJ03kJlShOYjjaEyFB6k6MYT8,1821 +anyio/from_thread.py,sha256=L-0w1HxJ6BSb-KuVi57k5Tkc3yzQrx3QK5tAxMPcY-0,19141 +anyio/functools.py,sha256=HWj7GBEmc0Z-mZg3uok7Z7ZJn0rEC_0Pzbt0nYUDaTQ,10973 +anyio/lowlevel.py,sha256=AyKLVK3LaWSoK39LkCKxE4_GDMLKZBNqTrLUgk63y80,5158 +anyio/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +anyio/pytest_plugin.py,sha256=3jAFQn0jv_pyoWE2GBBlHaj9sqXj4e8vob0_hgrsXE8,10244 +anyio/streams/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +anyio/streams/__pycache__/__init__.cpython-312.pyc,, +anyio/streams/__pycache__/buffered.cpython-312.pyc,, +anyio/streams/__pycache__/file.cpython-312.pyc,, +anyio/streams/__pycache__/memory.cpython-312.pyc,, +anyio/streams/__pycache__/stapled.cpython-312.pyc,, +anyio/streams/__pycache__/text.cpython-312.pyc,, +anyio/streams/__pycache__/tls.cpython-312.pyc,, +anyio/streams/buffered.py,sha256=2R3PeJhe4EXrdYqz44Y6-Eg9R6DrmlsYrP36Ir43-po,6263 +anyio/streams/file.py,sha256=4WZ7XGz5WNu39FQHvqbe__TQ0HDP9OOhgO1mk9iVpVU,4470 +anyio/streams/memory.py,sha256=F0zwzvFJKAhX_LRZGoKzzqDC2oMM-f-yyTBrEYEGOaU,10740 +anyio/streams/stapled.py,sha256=T8Xqwf8K6EgURPxbt1N4i7A8BAk-gScv-GRhjLXIf_o,4390 +anyio/streams/text.py,sha256=BcVAGJw1VRvtIqnv-o0Rb0pwH7p8vwlvl21xHq522ag,5765 +anyio/streams/tls.py,sha256=Jpxy0Mfbcp1BxHCwE-YjSSFaLnIBbnnwur-excYThs4,15368 +anyio/to_interpreter.py,sha256=_mLngrMy97TMR6VbW4Y6YzDUk9ZuPcQMPlkuyRh3C9k,7100 +anyio/to_process.py,sha256=J7gAA_YOuoHqnpDAf5fm1Qu6kOmTzdFbiDNvnV755vk,9798 +anyio/to_thread.py,sha256=menEgXYmUV7Fjg_9WqCV95P9MAtQS8BzPGGcWB_QnfQ,2687 diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/WHEEL b/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/WHEEL new file mode 100755 index 0000000..e7fa31b --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (80.9.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/entry_points.txt b/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/entry_points.txt new file mode 100755 index 0000000..44dd9bd --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[pytest11] +anyio = anyio.pytest_plugin diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/licenses/LICENSE b/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/licenses/LICENSE new file mode 100755 index 0000000..104eebf --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/licenses/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2018 Alex Grönholm + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/top_level.txt b/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/top_level.txt new file mode 100755 index 0000000..c77c069 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio-4.12.1.dist-info/top_level.txt @@ -0,0 +1 @@ +anyio diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/__init__.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/__init__.py new file mode 100755 index 0000000..d23c5a5 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/__init__.py @@ -0,0 +1,111 @@ +from __future__ import annotations + +from ._core._contextmanagers import AsyncContextManagerMixin as AsyncContextManagerMixin +from ._core._contextmanagers import ContextManagerMixin as ContextManagerMixin +from ._core._eventloop import current_time as current_time +from ._core._eventloop import get_all_backends as get_all_backends +from ._core._eventloop import get_available_backends as get_available_backends +from ._core._eventloop import get_cancelled_exc_class as get_cancelled_exc_class +from ._core._eventloop import run as run +from ._core._eventloop import sleep as sleep +from ._core._eventloop import sleep_forever as sleep_forever +from ._core._eventloop import sleep_until as sleep_until +from ._core._exceptions import BrokenResourceError as BrokenResourceError +from ._core._exceptions import BrokenWorkerInterpreter as BrokenWorkerInterpreter +from ._core._exceptions import BrokenWorkerProcess as BrokenWorkerProcess +from ._core._exceptions import BusyResourceError as BusyResourceError +from ._core._exceptions import ClosedResourceError as ClosedResourceError +from ._core._exceptions import ConnectionFailed as ConnectionFailed +from ._core._exceptions import DelimiterNotFound as DelimiterNotFound +from ._core._exceptions import EndOfStream as EndOfStream +from ._core._exceptions import IncompleteRead as IncompleteRead +from ._core._exceptions import NoEventLoopError as NoEventLoopError +from ._core._exceptions import RunFinishedError as RunFinishedError +from ._core._exceptions import TypedAttributeLookupError as TypedAttributeLookupError +from ._core._exceptions import WouldBlock as WouldBlock +from ._core._fileio import AsyncFile as AsyncFile +from ._core._fileio import Path as Path +from ._core._fileio import open_file as open_file +from ._core._fileio import wrap_file as wrap_file +from ._core._resources import aclose_forcefully as aclose_forcefully +from ._core._signals import open_signal_receiver as open_signal_receiver +from ._core._sockets import TCPConnectable as TCPConnectable +from ._core._sockets import UNIXConnectable as UNIXConnectable +from ._core._sockets import as_connectable as as_connectable +from ._core._sockets import connect_tcp as connect_tcp +from ._core._sockets import connect_unix as connect_unix +from ._core._sockets import create_connected_udp_socket as create_connected_udp_socket +from ._core._sockets import ( + create_connected_unix_datagram_socket as create_connected_unix_datagram_socket, +) +from ._core._sockets import create_tcp_listener as create_tcp_listener +from ._core._sockets import create_udp_socket as create_udp_socket +from ._core._sockets import create_unix_datagram_socket as create_unix_datagram_socket +from ._core._sockets import create_unix_listener as create_unix_listener +from ._core._sockets import getaddrinfo as getaddrinfo +from ._core._sockets import getnameinfo as getnameinfo +from ._core._sockets import notify_closing as notify_closing +from ._core._sockets import wait_readable as wait_readable +from ._core._sockets import wait_socket_readable as wait_socket_readable +from ._core._sockets import wait_socket_writable as wait_socket_writable +from ._core._sockets import wait_writable as wait_writable +from ._core._streams import create_memory_object_stream as create_memory_object_stream +from ._core._subprocesses import open_process as open_process +from ._core._subprocesses import run_process as run_process +from ._core._synchronization import CapacityLimiter as CapacityLimiter +from ._core._synchronization import ( + CapacityLimiterStatistics as CapacityLimiterStatistics, +) +from ._core._synchronization import Condition as Condition +from ._core._synchronization import ConditionStatistics as ConditionStatistics +from ._core._synchronization import Event as Event +from ._core._synchronization import EventStatistics as EventStatistics +from ._core._synchronization import Lock as Lock +from ._core._synchronization import LockStatistics as LockStatistics +from ._core._synchronization import ResourceGuard as ResourceGuard +from ._core._synchronization import Semaphore as Semaphore +from ._core._synchronization import SemaphoreStatistics as SemaphoreStatistics +from ._core._tasks import TASK_STATUS_IGNORED as TASK_STATUS_IGNORED +from ._core._tasks import CancelScope as CancelScope +from ._core._tasks import create_task_group as create_task_group +from ._core._tasks import current_effective_deadline as current_effective_deadline +from ._core._tasks import fail_after as fail_after +from ._core._tasks import move_on_after as move_on_after +from ._core._tempfile import NamedTemporaryFile as NamedTemporaryFile +from ._core._tempfile import SpooledTemporaryFile as SpooledTemporaryFile +from ._core._tempfile import TemporaryDirectory as TemporaryDirectory +from ._core._tempfile import TemporaryFile as TemporaryFile +from ._core._tempfile import gettempdir as gettempdir +from ._core._tempfile import gettempdirb as gettempdirb +from ._core._tempfile import mkdtemp as mkdtemp +from ._core._tempfile import mkstemp as mkstemp +from ._core._testing import TaskInfo as TaskInfo +from ._core._testing import get_current_task as get_current_task +from ._core._testing import get_running_tasks as get_running_tasks +from ._core._testing import wait_all_tasks_blocked as wait_all_tasks_blocked +from ._core._typedattr import TypedAttributeProvider as TypedAttributeProvider +from ._core._typedattr import TypedAttributeSet as TypedAttributeSet +from ._core._typedattr import typed_attribute as typed_attribute + +# Re-export imports so they look like they live directly in this package +for __value in list(locals().values()): + if getattr(__value, "__module__", "").startswith("anyio."): + __value.__module__ = __name__ + + +del __value + + +def __getattr__(attr: str) -> type[BrokenWorkerInterpreter]: + """Support deprecated aliases.""" + if attr == "BrokenWorkerIntepreter": + import warnings + + warnings.warn( + "The 'BrokenWorkerIntepreter' alias is deprecated, use 'BrokenWorkerInterpreter' instead.", + DeprecationWarning, + stacklevel=2, + ) + return BrokenWorkerInterpreter + + raise AttributeError(f"module {__name__!r} has no attribute {attr!r}") diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/_backends/__init__.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/_backends/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py new file mode 100755 index 0000000..8ff009e --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py @@ -0,0 +1,2980 @@ +from __future__ import annotations + +import array +import asyncio +import concurrent.futures +import contextvars +import math +import os +import socket +import sys +import threading +import weakref +from asyncio import ( + AbstractEventLoop, + CancelledError, + all_tasks, + create_task, + current_task, + get_running_loop, + sleep, +) +from asyncio.base_events import _run_until_complete_cb # type: ignore[attr-defined] +from collections import OrderedDict, deque +from collections.abc import ( + AsyncGenerator, + AsyncIterator, + Awaitable, + Callable, + Collection, + Coroutine, + Iterable, + Sequence, +) +from concurrent.futures import Future +from contextlib import AbstractContextManager, suppress +from contextvars import Context, copy_context +from dataclasses import dataclass, field +from functools import partial, wraps +from inspect import ( + CORO_RUNNING, + CORO_SUSPENDED, + getcoroutinestate, + iscoroutine, +) +from io import IOBase +from os import PathLike +from queue import Queue +from signal import Signals +from socket import AddressFamily, SocketKind +from threading import Thread +from types import CodeType, TracebackType +from typing import ( + IO, + TYPE_CHECKING, + Any, + Optional, + TypeVar, + cast, +) +from weakref import WeakKeyDictionary + +from .. import ( + CapacityLimiterStatistics, + EventStatistics, + LockStatistics, + TaskInfo, + abc, +) +from .._core._eventloop import ( + claim_worker_thread, + set_current_async_library, + threadlocals, +) +from .._core._exceptions import ( + BrokenResourceError, + BusyResourceError, + ClosedResourceError, + EndOfStream, + RunFinishedError, + WouldBlock, + iterate_exceptions, +) +from .._core._sockets import convert_ipv6_sockaddr +from .._core._streams import create_memory_object_stream +from .._core._synchronization import ( + CapacityLimiter as BaseCapacityLimiter, +) +from .._core._synchronization import Event as BaseEvent +from .._core._synchronization import Lock as BaseLock +from .._core._synchronization import ( + ResourceGuard, + SemaphoreStatistics, +) +from .._core._synchronization import Semaphore as BaseSemaphore +from .._core._tasks import CancelScope as BaseCancelScope +from ..abc import ( + AsyncBackend, + IPSockAddrType, + SocketListener, + UDPPacketType, + UNIXDatagramPacketType, +) +from ..abc._eventloop import StrOrBytesPath +from ..lowlevel import RunVar +from ..streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream + +if TYPE_CHECKING: + from _typeshed import FileDescriptorLike +else: + FileDescriptorLike = object + +if sys.version_info >= (3, 10): + from typing import ParamSpec +else: + from typing_extensions import ParamSpec + +if sys.version_info >= (3, 11): + from asyncio import Runner + from typing import TypeVarTuple, Unpack +else: + import contextvars + import enum + import signal + from asyncio import coroutines, events, exceptions, tasks + + from exceptiongroup import BaseExceptionGroup + from typing_extensions import TypeVarTuple, Unpack + + class _State(enum.Enum): + CREATED = "created" + INITIALIZED = "initialized" + CLOSED = "closed" + + class Runner: + # Copied from CPython 3.11 + def __init__( + self, + *, + debug: bool | None = None, + loop_factory: Callable[[], AbstractEventLoop] | None = None, + ): + self._state = _State.CREATED + self._debug = debug + self._loop_factory = loop_factory + self._loop: AbstractEventLoop | None = None + self._context = None + self._interrupt_count = 0 + self._set_event_loop = False + + def __enter__(self) -> Runner: + self._lazy_init() + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self.close() + + def close(self) -> None: + """Shutdown and close event loop.""" + loop = self._loop + if self._state is not _State.INITIALIZED or loop is None: + return + try: + _cancel_all_tasks(loop) + loop.run_until_complete(loop.shutdown_asyncgens()) + if hasattr(loop, "shutdown_default_executor"): + loop.run_until_complete(loop.shutdown_default_executor()) + else: + loop.run_until_complete(_shutdown_default_executor(loop)) + finally: + if self._set_event_loop: + events.set_event_loop(None) + loop.close() + self._loop = None + self._state = _State.CLOSED + + def get_loop(self) -> AbstractEventLoop: + """Return embedded event loop.""" + self._lazy_init() + return self._loop + + def run(self, coro: Coroutine[T_Retval], *, context=None) -> T_Retval: + """Run a coroutine inside the embedded event loop.""" + if not coroutines.iscoroutine(coro): + raise ValueError(f"a coroutine was expected, got {coro!r}") + + if events._get_running_loop() is not None: + # fail fast with short traceback + raise RuntimeError( + "Runner.run() cannot be called from a running event loop" + ) + + self._lazy_init() + + if context is None: + context = self._context + task = context.run(self._loop.create_task, coro) + + if ( + threading.current_thread() is threading.main_thread() + and signal.getsignal(signal.SIGINT) is signal.default_int_handler + ): + sigint_handler = partial(self._on_sigint, main_task=task) + try: + signal.signal(signal.SIGINT, sigint_handler) + except ValueError: + # `signal.signal` may throw if `threading.main_thread` does + # not support signals (e.g. embedded interpreter with signals + # not registered - see gh-91880) + sigint_handler = None + else: + sigint_handler = None + + self._interrupt_count = 0 + try: + return self._loop.run_until_complete(task) + except exceptions.CancelledError: + if self._interrupt_count > 0: + uncancel = getattr(task, "uncancel", None) + if uncancel is not None and uncancel() == 0: + raise KeyboardInterrupt # noqa: B904 + raise # CancelledError + finally: + if ( + sigint_handler is not None + and signal.getsignal(signal.SIGINT) is sigint_handler + ): + signal.signal(signal.SIGINT, signal.default_int_handler) + + def _lazy_init(self) -> None: + if self._state is _State.CLOSED: + raise RuntimeError("Runner is closed") + if self._state is _State.INITIALIZED: + return + if self._loop_factory is None: + self._loop = events.new_event_loop() + if not self._set_event_loop: + # Call set_event_loop only once to avoid calling + # attach_loop multiple times on child watchers + events.set_event_loop(self._loop) + self._set_event_loop = True + else: + self._loop = self._loop_factory() + if self._debug is not None: + self._loop.set_debug(self._debug) + self._context = contextvars.copy_context() + self._state = _State.INITIALIZED + + def _on_sigint(self, signum, frame, main_task: asyncio.Task) -> None: + self._interrupt_count += 1 + if self._interrupt_count == 1 and not main_task.done(): + main_task.cancel() + # wakeup loop if it is blocked by select() with long timeout + self._loop.call_soon_threadsafe(lambda: None) + return + raise KeyboardInterrupt() + + def _cancel_all_tasks(loop: AbstractEventLoop) -> None: + to_cancel = tasks.all_tasks(loop) + if not to_cancel: + return + + for task in to_cancel: + task.cancel() + + loop.run_until_complete(tasks.gather(*to_cancel, return_exceptions=True)) + + for task in to_cancel: + if task.cancelled(): + continue + if task.exception() is not None: + loop.call_exception_handler( + { + "message": "unhandled exception during asyncio.run() shutdown", + "exception": task.exception(), + "task": task, + } + ) + + async def _shutdown_default_executor(loop: AbstractEventLoop) -> None: + """Schedule the shutdown of the default executor.""" + + def _do_shutdown(future: asyncio.futures.Future) -> None: + try: + loop._default_executor.shutdown(wait=True) # type: ignore[attr-defined] + loop.call_soon_threadsafe(future.set_result, None) + except Exception as ex: + loop.call_soon_threadsafe(future.set_exception, ex) + + loop._executor_shutdown_called = True + if loop._default_executor is None: + return + future = loop.create_future() + thread = threading.Thread(target=_do_shutdown, args=(future,)) + thread.start() + try: + await future + finally: + thread.join() + + +T_Retval = TypeVar("T_Retval") +T_contra = TypeVar("T_contra", contravariant=True) +PosArgsT = TypeVarTuple("PosArgsT") +P = ParamSpec("P") + +_root_task: RunVar[asyncio.Task | None] = RunVar("_root_task") + + +def find_root_task() -> asyncio.Task: + root_task = _root_task.get(None) + if root_task is not None and not root_task.done(): + return root_task + + # Look for a task that has been started via run_until_complete() + for task in all_tasks(): + if task._callbacks and not task.done(): + callbacks = [cb for cb, context in task._callbacks] + for cb in callbacks: + if ( + cb is _run_until_complete_cb + or getattr(cb, "__module__", None) == "uvloop.loop" + ): + _root_task.set(task) + return task + + # Look up the topmost task in the AnyIO task tree, if possible + task = cast(asyncio.Task, current_task()) + state = _task_states.get(task) + if state: + cancel_scope = state.cancel_scope + while cancel_scope and cancel_scope._parent_scope is not None: + cancel_scope = cancel_scope._parent_scope + + if cancel_scope is not None: + return cast(asyncio.Task, cancel_scope._host_task) + + return task + + +def get_callable_name(func: Callable) -> str: + module = getattr(func, "__module__", None) + qualname = getattr(func, "__qualname__", None) + return ".".join([x for x in (module, qualname) if x]) + + +# +# Event loop +# + +_run_vars: WeakKeyDictionary[asyncio.AbstractEventLoop, Any] = WeakKeyDictionary() + + +def _task_started(task: asyncio.Task) -> bool: + """Return ``True`` if the task has been started and has not finished.""" + # The task coro should never be None here, as we never add finished tasks to the + # task list + coro = task.get_coro() + assert coro is not None + try: + return getcoroutinestate(coro) in (CORO_RUNNING, CORO_SUSPENDED) + except AttributeError: + # task coro is async_genenerator_asend https://bugs.python.org/issue37771 + raise Exception(f"Cannot determine if task {task} has started or not") from None + + +# +# Timeouts and cancellation +# + + +def is_anyio_cancellation(exc: CancelledError) -> bool: + # Sometimes third party frameworks catch a CancelledError and raise a new one, so as + # a workaround we have to look at the previous ones in __context__ too for a + # matching cancel message + while True: + if ( + exc.args + and isinstance(exc.args[0], str) + and exc.args[0].startswith("Cancelled via cancel scope ") + ): + return True + + if isinstance(exc.__context__, CancelledError): + exc = exc.__context__ + continue + + return False + + +class CancelScope(BaseCancelScope): + def __new__( + cls, *, deadline: float = math.inf, shield: bool = False + ) -> CancelScope: + return object.__new__(cls) + + def __init__(self, deadline: float = math.inf, shield: bool = False): + self._deadline = deadline + self._shield = shield + self._parent_scope: CancelScope | None = None + self._child_scopes: set[CancelScope] = set() + self._cancel_called = False + self._cancel_reason: str | None = None + self._cancelled_caught = False + self._active = False + self._timeout_handle: asyncio.TimerHandle | None = None + self._cancel_handle: asyncio.Handle | None = None + self._tasks: set[asyncio.Task] = set() + self._host_task: asyncio.Task | None = None + if sys.version_info >= (3, 11): + self._pending_uncancellations: int | None = 0 + else: + self._pending_uncancellations = None + + def __enter__(self) -> CancelScope: + if self._active: + raise RuntimeError( + "Each CancelScope may only be used for a single 'with' block" + ) + + self._host_task = host_task = cast(asyncio.Task, current_task()) + self._tasks.add(host_task) + try: + task_state = _task_states[host_task] + except KeyError: + task_state = TaskState(None, self) + _task_states[host_task] = task_state + else: + self._parent_scope = task_state.cancel_scope + task_state.cancel_scope = self + if self._parent_scope is not None: + # If using an eager task factory, the parent scope may not even contain + # the host task + self._parent_scope._child_scopes.add(self) + self._parent_scope._tasks.discard(host_task) + + self._timeout() + self._active = True + + # Start cancelling the host task if the scope was cancelled before entering + if self._cancel_called: + self._deliver_cancellation(self) + + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> bool: + del exc_tb + + if not self._active: + raise RuntimeError("This cancel scope is not active") + if current_task() is not self._host_task: + raise RuntimeError( + "Attempted to exit cancel scope in a different task than it was " + "entered in" + ) + + assert self._host_task is not None + host_task_state = _task_states.get(self._host_task) + if host_task_state is None or host_task_state.cancel_scope is not self: + raise RuntimeError( + "Attempted to exit a cancel scope that isn't the current tasks's " + "current cancel scope" + ) + + try: + self._active = False + if self._timeout_handle: + self._timeout_handle.cancel() + self._timeout_handle = None + + self._tasks.remove(self._host_task) + if self._parent_scope is not None: + self._parent_scope._child_scopes.remove(self) + self._parent_scope._tasks.add(self._host_task) + + host_task_state.cancel_scope = self._parent_scope + + # Restart the cancellation effort in the closest visible, cancelled parent + # scope if necessary + self._restart_cancellation_in_parent() + + # We only swallow the exception iff it was an AnyIO CancelledError, either + # directly as exc_val or inside an exception group and there are no cancelled + # parent cancel scopes visible to us here + if self._cancel_called and not self._parent_cancellation_is_visible_to_us: + # For each level-cancel() call made on the host task, call uncancel() + while self._pending_uncancellations: + self._host_task.uncancel() + self._pending_uncancellations -= 1 + + # Update cancelled_caught and check for exceptions we must not swallow + cannot_swallow_exc_val = False + if exc_val is not None: + for exc in iterate_exceptions(exc_val): + if isinstance(exc, CancelledError) and is_anyio_cancellation( + exc + ): + self._cancelled_caught = True + else: + cannot_swallow_exc_val = True + + return self._cancelled_caught and not cannot_swallow_exc_val + else: + if self._pending_uncancellations: + assert self._parent_scope is not None + assert self._parent_scope._pending_uncancellations is not None + self._parent_scope._pending_uncancellations += ( + self._pending_uncancellations + ) + self._pending_uncancellations = 0 + + return False + finally: + self._host_task = None + del exc_val + + @property + def _effectively_cancelled(self) -> bool: + cancel_scope: CancelScope | None = self + while cancel_scope is not None: + if cancel_scope._cancel_called: + return True + + if cancel_scope.shield: + return False + + cancel_scope = cancel_scope._parent_scope + + return False + + @property + def _parent_cancellation_is_visible_to_us(self) -> bool: + return ( + self._parent_scope is not None + and not self.shield + and self._parent_scope._effectively_cancelled + ) + + def _timeout(self) -> None: + if self._deadline != math.inf: + loop = get_running_loop() + if loop.time() >= self._deadline: + self.cancel("deadline exceeded") + else: + self._timeout_handle = loop.call_at(self._deadline, self._timeout) + + def _deliver_cancellation(self, origin: CancelScope) -> bool: + """ + Deliver cancellation to directly contained tasks and nested cancel scopes. + + Schedule another run at the end if we still have tasks eligible for + cancellation. + + :param origin: the cancel scope that originated the cancellation + :return: ``True`` if the delivery needs to be retried on the next cycle + + """ + should_retry = False + current = current_task() + for task in self._tasks: + should_retry = True + if task._must_cancel: # type: ignore[attr-defined] + continue + + # The task is eligible for cancellation if it has started + if task is not current and (task is self._host_task or _task_started(task)): + waiter = task._fut_waiter # type: ignore[attr-defined] + if not isinstance(waiter, asyncio.Future) or not waiter.done(): + task.cancel(origin._cancel_reason) + if ( + task is origin._host_task + and origin._pending_uncancellations is not None + ): + origin._pending_uncancellations += 1 + + # Deliver cancellation to child scopes that aren't shielded or running their own + # cancellation callbacks + for scope in self._child_scopes: + if not scope._shield and not scope.cancel_called: + should_retry = scope._deliver_cancellation(origin) or should_retry + + # Schedule another callback if there are still tasks left + if origin is self: + if should_retry: + self._cancel_handle = get_running_loop().call_soon( + self._deliver_cancellation, origin + ) + else: + self._cancel_handle = None + + return should_retry + + def _restart_cancellation_in_parent(self) -> None: + """ + Restart the cancellation effort in the closest directly cancelled parent scope. + + """ + scope = self._parent_scope + while scope is not None: + if scope._cancel_called: + if scope._cancel_handle is None: + scope._deliver_cancellation(scope) + + break + + # No point in looking beyond any shielded scope + if scope._shield: + break + + scope = scope._parent_scope + + def cancel(self, reason: str | None = None) -> None: + if not self._cancel_called: + if self._timeout_handle: + self._timeout_handle.cancel() + self._timeout_handle = None + + self._cancel_called = True + self._cancel_reason = f"Cancelled via cancel scope {id(self):x}" + if task := current_task(): + self._cancel_reason += f" by {task}" + + if reason: + self._cancel_reason += f"; reason: {reason}" + + if self._host_task is not None: + self._deliver_cancellation(self) + + @property + def deadline(self) -> float: + return self._deadline + + @deadline.setter + def deadline(self, value: float) -> None: + self._deadline = float(value) + if self._timeout_handle is not None: + self._timeout_handle.cancel() + self._timeout_handle = None + + if self._active and not self._cancel_called: + self._timeout() + + @property + def cancel_called(self) -> bool: + return self._cancel_called + + @property + def cancelled_caught(self) -> bool: + return self._cancelled_caught + + @property + def shield(self) -> bool: + return self._shield + + @shield.setter + def shield(self, value: bool) -> None: + if self._shield != value: + self._shield = value + if not value: + self._restart_cancellation_in_parent() + + +# +# Task states +# + + +class TaskState: + """ + Encapsulates auxiliary task information that cannot be added to the Task instance + itself because there are no guarantees about its implementation. + """ + + __slots__ = "parent_id", "cancel_scope", "__weakref__" + + def __init__(self, parent_id: int | None, cancel_scope: CancelScope | None): + self.parent_id = parent_id + self.cancel_scope = cancel_scope + + +_task_states: WeakKeyDictionary[asyncio.Task, TaskState] = WeakKeyDictionary() + + +# +# Task groups +# + + +class _AsyncioTaskStatus(abc.TaskStatus): + def __init__(self, future: asyncio.Future, parent_id: int): + self._future = future + self._parent_id = parent_id + + def started(self, value: T_contra | None = None) -> None: + try: + self._future.set_result(value) + except asyncio.InvalidStateError: + if not self._future.cancelled(): + raise RuntimeError( + "called 'started' twice on the same task status" + ) from None + + task = cast(asyncio.Task, current_task()) + _task_states[task].parent_id = self._parent_id + + +if sys.version_info >= (3, 12): + _eager_task_factory_code: CodeType | None = asyncio.eager_task_factory.__code__ +else: + _eager_task_factory_code = None + + +class TaskGroup(abc.TaskGroup): + def __init__(self) -> None: + self.cancel_scope: CancelScope = CancelScope() + self._active = False + self._exceptions: list[BaseException] = [] + self._tasks: set[asyncio.Task] = set() + self._on_completed_fut: asyncio.Future[None] | None = None + + async def __aenter__(self) -> TaskGroup: + self.cancel_scope.__enter__() + self._active = True + return self + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> bool: + try: + if exc_val is not None: + self.cancel_scope.cancel() + if not isinstance(exc_val, CancelledError): + self._exceptions.append(exc_val) + + loop = get_running_loop() + try: + if self._tasks: + with CancelScope() as wait_scope: + while self._tasks: + self._on_completed_fut = loop.create_future() + + try: + await self._on_completed_fut + except CancelledError as exc: + # Shield the scope against further cancellation attempts, + # as they're not productive (#695) + wait_scope.shield = True + self.cancel_scope.cancel() + + # Set exc_val from the cancellation exception if it was + # previously unset. However, we should not replace a native + # cancellation exception with one raise by a cancel scope. + if exc_val is None or ( + isinstance(exc_val, CancelledError) + and not is_anyio_cancellation(exc) + ): + exc_val = exc + + self._on_completed_fut = None + else: + # If there are no child tasks to wait on, run at least one checkpoint + # anyway + await AsyncIOBackend.cancel_shielded_checkpoint() + + self._active = False + if self._exceptions: + # The exception that got us here should already have been + # added to self._exceptions so it's ok to break exception + # chaining and avoid adding a "During handling of above..." + # for each nesting level. + raise BaseExceptionGroup( + "unhandled errors in a TaskGroup", self._exceptions + ) from None + elif exc_val: + raise exc_val + except BaseException as exc: + if self.cancel_scope.__exit__(type(exc), exc, exc.__traceback__): + return True + + raise + + return self.cancel_scope.__exit__(exc_type, exc_val, exc_tb) + finally: + del exc_val, exc_tb, self._exceptions + + def _spawn( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[Any]], + args: tuple[Unpack[PosArgsT]], + name: object, + task_status_future: asyncio.Future | None = None, + ) -> asyncio.Task: + def task_done(_task: asyncio.Task) -> None: + if sys.version_info >= (3, 14) and self.cancel_scope._host_task is not None: + asyncio.future_discard_from_awaited_by( + _task, self.cancel_scope._host_task + ) + + task_state = _task_states[_task] + assert task_state.cancel_scope is not None + assert _task in task_state.cancel_scope._tasks + task_state.cancel_scope._tasks.remove(_task) + self._tasks.remove(task) + del _task_states[_task] + + if self._on_completed_fut is not None and not self._tasks: + try: + self._on_completed_fut.set_result(None) + except asyncio.InvalidStateError: + pass + + try: + exc = _task.exception() + except CancelledError as e: + while isinstance(e.__context__, CancelledError): + e = e.__context__ + + exc = e + + if exc is not None: + # The future can only be in the cancelled state if the host task was + # cancelled, so return immediately instead of adding one more + # CancelledError to the exceptions list + if task_status_future is not None and task_status_future.cancelled(): + return + + if task_status_future is None or task_status_future.done(): + if not isinstance(exc, CancelledError): + self._exceptions.append(exc) + + if not self.cancel_scope._effectively_cancelled: + self.cancel_scope.cancel() + else: + task_status_future.set_exception(exc) + elif task_status_future is not None and not task_status_future.done(): + task_status_future.set_exception( + RuntimeError("Child exited without calling task_status.started()") + ) + + if not self._active: + raise RuntimeError( + "This task group is not active; no new tasks can be started." + ) + + kwargs = {} + if task_status_future: + parent_id = id(current_task()) + kwargs["task_status"] = _AsyncioTaskStatus( + task_status_future, id(self.cancel_scope._host_task) + ) + else: + parent_id = id(self.cancel_scope._host_task) + + coro = func(*args, **kwargs) + if not iscoroutine(coro): + prefix = f"{func.__module__}." if hasattr(func, "__module__") else "" + raise TypeError( + f"Expected {prefix}{func.__qualname__}() to return a coroutine, but " + f"the return value ({coro!r}) is not a coroutine object" + ) + + name = get_callable_name(func) if name is None else str(name) + loop = asyncio.get_running_loop() + if ( + (factory := loop.get_task_factory()) + and getattr(factory, "__code__", None) is _eager_task_factory_code + and (closure := getattr(factory, "__closure__", None)) + ): + custom_task_constructor = closure[0].cell_contents + task = custom_task_constructor(coro, loop=loop, name=name) + else: + task = create_task(coro, name=name) + + # Make the spawned task inherit the task group's cancel scope + _task_states[task] = TaskState( + parent_id=parent_id, cancel_scope=self.cancel_scope + ) + self.cancel_scope._tasks.add(task) + self._tasks.add(task) + if sys.version_info >= (3, 14) and self.cancel_scope._host_task is not None: + asyncio.future_add_to_awaited_by(task, self.cancel_scope._host_task) + + task.add_done_callback(task_done) + return task + + def start_soon( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[Any]], + *args: Unpack[PosArgsT], + name: object = None, + ) -> None: + self._spawn(func, args, name) + + async def start( + self, func: Callable[..., Awaitable[Any]], *args: object, name: object = None + ) -> Any: + future: asyncio.Future = asyncio.Future() + task = self._spawn(func, args, name, future) + + # If the task raises an exception after sending a start value without a switch + # point between, the task group is cancelled and this method never proceeds to + # process the completed future. That's why we have to have a shielded cancel + # scope here. + try: + return await future + except CancelledError: + # Cancel the task and wait for it to exit before returning + task.cancel() + with CancelScope(shield=True), suppress(CancelledError): + await task + + raise + + +# +# Threads +# + +_Retval_Queue_Type = tuple[Optional[T_Retval], Optional[BaseException]] + + +class WorkerThread(Thread): + MAX_IDLE_TIME = 10 # seconds + + def __init__( + self, + root_task: asyncio.Task, + workers: set[WorkerThread], + idle_workers: deque[WorkerThread], + ): + super().__init__(name="AnyIO worker thread") + self.root_task = root_task + self.workers = workers + self.idle_workers = idle_workers + self.loop = root_task._loop + self.queue: Queue[ + tuple[Context, Callable, tuple, asyncio.Future, CancelScope] | None + ] = Queue(2) + self.idle_since = AsyncIOBackend.current_time() + self.stopping = False + + def _report_result( + self, future: asyncio.Future, result: Any, exc: BaseException | None + ) -> None: + self.idle_since = AsyncIOBackend.current_time() + if not self.stopping: + self.idle_workers.append(self) + + if not future.cancelled(): + if exc is not None: + if isinstance(exc, StopIteration): + new_exc = RuntimeError("coroutine raised StopIteration") + new_exc.__cause__ = exc + exc = new_exc + + future.set_exception(exc) + else: + future.set_result(result) + + def run(self) -> None: + with claim_worker_thread(AsyncIOBackend, self.loop): + while True: + item = self.queue.get() + if item is None: + # Shutdown command received + return + + context, func, args, future, cancel_scope = item + if not future.cancelled(): + result = None + exception: BaseException | None = None + threadlocals.current_cancel_scope = cancel_scope + try: + result = context.run(func, *args) + except BaseException as exc: + exception = exc + finally: + del threadlocals.current_cancel_scope + + if not self.loop.is_closed(): + self.loop.call_soon_threadsafe( + self._report_result, future, result, exception + ) + + del result, exception + + self.queue.task_done() + del item, context, func, args, future, cancel_scope + + def stop(self, f: asyncio.Task | None = None) -> None: + self.stopping = True + self.queue.put_nowait(None) + self.workers.discard(self) + try: + self.idle_workers.remove(self) + except ValueError: + pass + + +_threadpool_idle_workers: RunVar[deque[WorkerThread]] = RunVar( + "_threadpool_idle_workers" +) +_threadpool_workers: RunVar[set[WorkerThread]] = RunVar("_threadpool_workers") + + +# +# Subprocesses +# + + +@dataclass(eq=False) +class StreamReaderWrapper(abc.ByteReceiveStream): + _stream: asyncio.StreamReader + + async def receive(self, max_bytes: int = 65536) -> bytes: + data = await self._stream.read(max_bytes) + if data: + return data + else: + raise EndOfStream + + async def aclose(self) -> None: + self._stream.set_exception(ClosedResourceError()) + await AsyncIOBackend.checkpoint() + + +@dataclass(eq=False) +class StreamWriterWrapper(abc.ByteSendStream): + _stream: asyncio.StreamWriter + _closed: bool = field(init=False, default=False) + + async def send(self, item: bytes) -> None: + await AsyncIOBackend.checkpoint_if_cancelled() + stream_paused = self._stream._protocol._paused # type: ignore[attr-defined] + try: + self._stream.write(item) + await self._stream.drain() + except (ConnectionResetError, BrokenPipeError, RuntimeError) as exc: + # If closed by us and/or the peer: + # * on stdlib, drain() raises ConnectionResetError or BrokenPipeError + # * on uvloop and Winloop, write() eventually starts raising RuntimeError + if self._closed: + raise ClosedResourceError from exc + elif self._stream.is_closing(): + raise BrokenResourceError from exc + + raise + + if not stream_paused: + await AsyncIOBackend.cancel_shielded_checkpoint() + + async def aclose(self) -> None: + self._closed = True + self._stream.close() + await AsyncIOBackend.checkpoint() + + +@dataclass(eq=False) +class Process(abc.Process): + _process: asyncio.subprocess.Process + _stdin: StreamWriterWrapper | None + _stdout: StreamReaderWrapper | None + _stderr: StreamReaderWrapper | None + + async def aclose(self) -> None: + with CancelScope(shield=True) as scope: + if self._stdin: + await self._stdin.aclose() + if self._stdout: + await self._stdout.aclose() + if self._stderr: + await self._stderr.aclose() + + scope.shield = False + try: + await self.wait() + except BaseException: + scope.shield = True + self.kill() + await self.wait() + raise + + async def wait(self) -> int: + return await self._process.wait() + + def terminate(self) -> None: + self._process.terminate() + + def kill(self) -> None: + self._process.kill() + + def send_signal(self, signal: int) -> None: + self._process.send_signal(signal) + + @property + def pid(self) -> int: + return self._process.pid + + @property + def returncode(self) -> int | None: + return self._process.returncode + + @property + def stdin(self) -> abc.ByteSendStream | None: + return self._stdin + + @property + def stdout(self) -> abc.ByteReceiveStream | None: + return self._stdout + + @property + def stderr(self) -> abc.ByteReceiveStream | None: + return self._stderr + + +def _forcibly_shutdown_process_pool_on_exit( + workers: set[Process], _task: object +) -> None: + """ + Forcibly shuts down worker processes belonging to this event loop.""" + child_watcher: asyncio.AbstractChildWatcher | None = None # type: ignore[name-defined] + if sys.version_info < (3, 12): + try: + child_watcher = asyncio.get_event_loop_policy().get_child_watcher() + except NotImplementedError: + pass + + # Close as much as possible (w/o async/await) to avoid warnings + for process in workers.copy(): + if process.returncode is None: + continue + + process._stdin._stream._transport.close() # type: ignore[union-attr] + process._stdout._stream._transport.close() # type: ignore[union-attr] + process._stderr._stream._transport.close() # type: ignore[union-attr] + process.kill() + if child_watcher: + child_watcher.remove_child_handler(process.pid) + + +async def _shutdown_process_pool_on_exit(workers: set[abc.Process]) -> None: + """ + Shuts down worker processes belonging to this event loop. + + NOTE: this only works when the event loop was started using asyncio.run() or + anyio.run(). + + """ + process: abc.Process + try: + await sleep(math.inf) + except asyncio.CancelledError: + workers = workers.copy() + for process in workers: + if process.returncode is None: + process.kill() + + for process in workers: + await process.aclose() + + +# +# Sockets and networking +# + + +class StreamProtocol(asyncio.Protocol): + read_queue: deque[bytes] + read_event: asyncio.Event + write_event: asyncio.Event + exception: Exception | None = None + is_at_eof: bool = False + + def connection_made(self, transport: asyncio.BaseTransport) -> None: + self.read_queue = deque() + self.read_event = asyncio.Event() + self.write_event = asyncio.Event() + self.write_event.set() + cast(asyncio.Transport, transport).set_write_buffer_limits(0) + + def connection_lost(self, exc: Exception | None) -> None: + if exc: + self.exception = BrokenResourceError() + self.exception.__cause__ = exc + + self.read_event.set() + self.write_event.set() + + def data_received(self, data: bytes) -> None: + # ProactorEventloop sometimes sends bytearray instead of bytes + self.read_queue.append(bytes(data)) + self.read_event.set() + + def eof_received(self) -> bool | None: + self.is_at_eof = True + self.read_event.set() + return True + + def pause_writing(self) -> None: + self.write_event = asyncio.Event() + + def resume_writing(self) -> None: + self.write_event.set() + + +class DatagramProtocol(asyncio.DatagramProtocol): + read_queue: deque[tuple[bytes, IPSockAddrType]] + read_event: asyncio.Event + write_event: asyncio.Event + exception: Exception | None = None + + def connection_made(self, transport: asyncio.BaseTransport) -> None: + self.read_queue = deque(maxlen=100) # arbitrary value + self.read_event = asyncio.Event() + self.write_event = asyncio.Event() + self.write_event.set() + + def connection_lost(self, exc: Exception | None) -> None: + self.read_event.set() + self.write_event.set() + + def datagram_received(self, data: bytes, addr: IPSockAddrType) -> None: + addr = convert_ipv6_sockaddr(addr) + self.read_queue.append((data, addr)) + self.read_event.set() + + def error_received(self, exc: Exception) -> None: + self.exception = exc + + def pause_writing(self) -> None: + self.write_event.clear() + + def resume_writing(self) -> None: + self.write_event.set() + + +class SocketStream(abc.SocketStream): + def __init__(self, transport: asyncio.Transport, protocol: StreamProtocol): + self._transport = transport + self._protocol = protocol + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + self._closed = False + + @property + def _raw_socket(self) -> socket.socket: + return self._transport.get_extra_info("socket") + + async def receive(self, max_bytes: int = 65536) -> bytes: + with self._receive_guard: + if ( + not self._protocol.read_event.is_set() + and not self._transport.is_closing() + and not self._protocol.is_at_eof + ): + self._transport.resume_reading() + await self._protocol.read_event.wait() + self._transport.pause_reading() + else: + await AsyncIOBackend.checkpoint() + + try: + chunk = self._protocol.read_queue.popleft() + except IndexError: + if self._closed: + raise ClosedResourceError from None + elif self._protocol.exception: + raise self._protocol.exception from None + else: + raise EndOfStream from None + + if len(chunk) > max_bytes: + # Split the oversized chunk + chunk, leftover = chunk[:max_bytes], chunk[max_bytes:] + self._protocol.read_queue.appendleft(leftover) + + # If the read queue is empty, clear the flag so that the next call will + # block until data is available + if not self._protocol.read_queue: + self._protocol.read_event.clear() + + return chunk + + async def send(self, item: bytes) -> None: + with self._send_guard: + await AsyncIOBackend.checkpoint() + + if self._closed: + raise ClosedResourceError + elif self._protocol.exception is not None: + raise self._protocol.exception + + try: + self._transport.write(item) + except RuntimeError as exc: + if self._transport.is_closing(): + raise BrokenResourceError from exc + else: + raise + + await self._protocol.write_event.wait() + + async def send_eof(self) -> None: + try: + self._transport.write_eof() + except OSError: + pass + + async def aclose(self) -> None: + self._closed = True + if not self._transport.is_closing(): + try: + self._transport.write_eof() + except OSError: + pass + + self._transport.close() + await sleep(0) + self._transport.abort() + + +class _RawSocketMixin: + _receive_future: asyncio.Future | None = None + _send_future: asyncio.Future | None = None + _closing = False + + def __init__(self, raw_socket: socket.socket): + self.__raw_socket = raw_socket + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + + @property + def _raw_socket(self) -> socket.socket: + return self.__raw_socket + + def _wait_until_readable(self, loop: asyncio.AbstractEventLoop) -> asyncio.Future: + def callback(f: object) -> None: + del self._receive_future + loop.remove_reader(self.__raw_socket) + + f = self._receive_future = asyncio.Future() + loop.add_reader(self.__raw_socket, f.set_result, None) + f.add_done_callback(callback) + return f + + def _wait_until_writable(self, loop: asyncio.AbstractEventLoop) -> asyncio.Future: + def callback(f: object) -> None: + del self._send_future + loop.remove_writer(self.__raw_socket) + + f = self._send_future = asyncio.Future() + loop.add_writer(self.__raw_socket, f.set_result, None) + f.add_done_callback(callback) + return f + + async def aclose(self) -> None: + if not self._closing: + self._closing = True + if self.__raw_socket.fileno() != -1: + self.__raw_socket.close() + + if self._receive_future: + self._receive_future.set_result(None) + if self._send_future: + self._send_future.set_result(None) + + +class UNIXSocketStream(_RawSocketMixin, abc.UNIXSocketStream): + async def send_eof(self) -> None: + with self._send_guard: + self._raw_socket.shutdown(socket.SHUT_WR) + + async def receive(self, max_bytes: int = 65536) -> bytes: + loop = get_running_loop() + await AsyncIOBackend.checkpoint() + with self._receive_guard: + while True: + try: + data = self._raw_socket.recv(max_bytes) + except BlockingIOError: + await self._wait_until_readable(loop) + except OSError as exc: + if self._closing: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + else: + if not data: + raise EndOfStream + + return data + + async def send(self, item: bytes) -> None: + loop = get_running_loop() + await AsyncIOBackend.checkpoint() + with self._send_guard: + view = memoryview(item) + while view: + try: + bytes_sent = self._raw_socket.send(view) + except BlockingIOError: + await self._wait_until_writable(loop) + except OSError as exc: + if self._closing: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + else: + view = view[bytes_sent:] + + async def receive_fds(self, msglen: int, maxfds: int) -> tuple[bytes, list[int]]: + if not isinstance(msglen, int) or msglen < 0: + raise ValueError("msglen must be a non-negative integer") + if not isinstance(maxfds, int) or maxfds < 1: + raise ValueError("maxfds must be a positive integer") + + loop = get_running_loop() + fds = array.array("i") + await AsyncIOBackend.checkpoint() + with self._receive_guard: + while True: + try: + message, ancdata, flags, addr = self._raw_socket.recvmsg( + msglen, socket.CMSG_LEN(maxfds * fds.itemsize) + ) + except BlockingIOError: + await self._wait_until_readable(loop) + except OSError as exc: + if self._closing: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + else: + if not message and not ancdata: + raise EndOfStream + + break + + for cmsg_level, cmsg_type, cmsg_data in ancdata: + if cmsg_level != socket.SOL_SOCKET or cmsg_type != socket.SCM_RIGHTS: + raise RuntimeError( + f"Received unexpected ancillary data; message = {message!r}, " + f"cmsg_level = {cmsg_level}, cmsg_type = {cmsg_type}" + ) + + fds.frombytes(cmsg_data[: len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) + + return message, list(fds) + + async def send_fds(self, message: bytes, fds: Collection[int | IOBase]) -> None: + if not message: + raise ValueError("message must not be empty") + if not fds: + raise ValueError("fds must not be empty") + + loop = get_running_loop() + filenos: list[int] = [] + for fd in fds: + if isinstance(fd, int): + filenos.append(fd) + elif isinstance(fd, IOBase): + filenos.append(fd.fileno()) + + fdarray = array.array("i", filenos) + await AsyncIOBackend.checkpoint() + with self._send_guard: + while True: + try: + # The ignore can be removed after mypy picks up + # https://github.com/python/typeshed/pull/5545 + self._raw_socket.sendmsg( + [message], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, fdarray)] + ) + break + except BlockingIOError: + await self._wait_until_writable(loop) + except OSError as exc: + if self._closing: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + + +class TCPSocketListener(abc.SocketListener): + _accept_scope: CancelScope | None = None + _closed = False + + def __init__(self, raw_socket: socket.socket): + self.__raw_socket = raw_socket + self._loop = cast(asyncio.BaseEventLoop, get_running_loop()) + self._accept_guard = ResourceGuard("accepting connections from") + + @property + def _raw_socket(self) -> socket.socket: + return self.__raw_socket + + async def accept(self) -> abc.SocketStream: + if self._closed: + raise ClosedResourceError + + with self._accept_guard: + await AsyncIOBackend.checkpoint() + with CancelScope() as self._accept_scope: + try: + client_sock, _addr = await self._loop.sock_accept(self._raw_socket) + except asyncio.CancelledError: + # Workaround for https://bugs.python.org/issue41317 + try: + self._loop.remove_reader(self._raw_socket) + except (ValueError, NotImplementedError): + pass + + if self._closed: + raise ClosedResourceError from None + + raise + finally: + self._accept_scope = None + + client_sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + transport, protocol = await self._loop.connect_accepted_socket( + StreamProtocol, client_sock + ) + return SocketStream(transport, protocol) + + async def aclose(self) -> None: + if self._closed: + return + + self._closed = True + if self._accept_scope: + # Workaround for https://bugs.python.org/issue41317 + try: + self._loop.remove_reader(self._raw_socket) + except (ValueError, NotImplementedError): + pass + + self._accept_scope.cancel() + await sleep(0) + + self._raw_socket.close() + + +class UNIXSocketListener(abc.SocketListener): + def __init__(self, raw_socket: socket.socket): + self.__raw_socket = raw_socket + self._loop = get_running_loop() + self._accept_guard = ResourceGuard("accepting connections from") + self._closed = False + + async def accept(self) -> abc.SocketStream: + await AsyncIOBackend.checkpoint() + with self._accept_guard: + while True: + try: + client_sock, _ = self.__raw_socket.accept() + client_sock.setblocking(False) + return UNIXSocketStream(client_sock) + except BlockingIOError: + f: asyncio.Future = asyncio.Future() + self._loop.add_reader(self.__raw_socket, f.set_result, None) + f.add_done_callback( + lambda _: self._loop.remove_reader(self.__raw_socket) + ) + await f + except OSError as exc: + if self._closed: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + + async def aclose(self) -> None: + self._closed = True + self.__raw_socket.close() + + @property + def _raw_socket(self) -> socket.socket: + return self.__raw_socket + + +class UDPSocket(abc.UDPSocket): + def __init__( + self, transport: asyncio.DatagramTransport, protocol: DatagramProtocol + ): + self._transport = transport + self._protocol = protocol + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + self._closed = False + + @property + def _raw_socket(self) -> socket.socket: + return self._transport.get_extra_info("socket") + + async def aclose(self) -> None: + self._closed = True + if not self._transport.is_closing(): + self._transport.close() + + async def receive(self) -> tuple[bytes, IPSockAddrType]: + with self._receive_guard: + await AsyncIOBackend.checkpoint() + + # If the buffer is empty, ask for more data + if not self._protocol.read_queue and not self._transport.is_closing(): + self._protocol.read_event.clear() + await self._protocol.read_event.wait() + + try: + return self._protocol.read_queue.popleft() + except IndexError: + if self._closed: + raise ClosedResourceError from None + else: + raise BrokenResourceError from None + + async def send(self, item: UDPPacketType) -> None: + with self._send_guard: + await AsyncIOBackend.checkpoint() + await self._protocol.write_event.wait() + if self._closed: + raise ClosedResourceError + elif self._transport.is_closing(): + raise BrokenResourceError + else: + self._transport.sendto(*item) + + +class ConnectedUDPSocket(abc.ConnectedUDPSocket): + def __init__( + self, transport: asyncio.DatagramTransport, protocol: DatagramProtocol + ): + self._transport = transport + self._protocol = protocol + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + self._closed = False + + @property + def _raw_socket(self) -> socket.socket: + return self._transport.get_extra_info("socket") + + async def aclose(self) -> None: + self._closed = True + if not self._transport.is_closing(): + self._transport.close() + + async def receive(self) -> bytes: + with self._receive_guard: + await AsyncIOBackend.checkpoint() + + # If the buffer is empty, ask for more data + if not self._protocol.read_queue and not self._transport.is_closing(): + self._protocol.read_event.clear() + await self._protocol.read_event.wait() + + try: + packet = self._protocol.read_queue.popleft() + except IndexError: + if self._closed: + raise ClosedResourceError from None + else: + raise BrokenResourceError from None + + return packet[0] + + async def send(self, item: bytes) -> None: + with self._send_guard: + await AsyncIOBackend.checkpoint() + await self._protocol.write_event.wait() + if self._closed: + raise ClosedResourceError + elif self._transport.is_closing(): + raise BrokenResourceError + else: + self._transport.sendto(item) + + +class UNIXDatagramSocket(_RawSocketMixin, abc.UNIXDatagramSocket): + async def receive(self) -> UNIXDatagramPacketType: + loop = get_running_loop() + await AsyncIOBackend.checkpoint() + with self._receive_guard: + while True: + try: + data = self._raw_socket.recvfrom(65536) + except BlockingIOError: + await self._wait_until_readable(loop) + except OSError as exc: + if self._closing: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + else: + return data + + async def send(self, item: UNIXDatagramPacketType) -> None: + loop = get_running_loop() + await AsyncIOBackend.checkpoint() + with self._send_guard: + while True: + try: + self._raw_socket.sendto(*item) + except BlockingIOError: + await self._wait_until_writable(loop) + except OSError as exc: + if self._closing: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + else: + return + + +class ConnectedUNIXDatagramSocket(_RawSocketMixin, abc.ConnectedUNIXDatagramSocket): + async def receive(self) -> bytes: + loop = get_running_loop() + await AsyncIOBackend.checkpoint() + with self._receive_guard: + while True: + try: + data = self._raw_socket.recv(65536) + except BlockingIOError: + await self._wait_until_readable(loop) + except OSError as exc: + if self._closing: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + else: + return data + + async def send(self, item: bytes) -> None: + loop = get_running_loop() + await AsyncIOBackend.checkpoint() + with self._send_guard: + while True: + try: + self._raw_socket.send(item) + except BlockingIOError: + await self._wait_until_writable(loop) + except OSError as exc: + if self._closing: + raise ClosedResourceError from None + else: + raise BrokenResourceError from exc + else: + return + + +_read_events: RunVar[dict[int, asyncio.Future[bool]]] = RunVar("read_events") +_write_events: RunVar[dict[int, asyncio.Future[bool]]] = RunVar("write_events") + + +# +# Synchronization +# + + +class Event(BaseEvent): + def __new__(cls) -> Event: + return object.__new__(cls) + + def __init__(self) -> None: + self._event = asyncio.Event() + + def set(self) -> None: + self._event.set() + + def is_set(self) -> bool: + return self._event.is_set() + + async def wait(self) -> None: + if self.is_set(): + await AsyncIOBackend.checkpoint() + else: + await self._event.wait() + + def statistics(self) -> EventStatistics: + return EventStatistics(len(self._event._waiters)) + + +class Lock(BaseLock): + def __new__(cls, *, fast_acquire: bool = False) -> Lock: + return object.__new__(cls) + + def __init__(self, *, fast_acquire: bool = False) -> None: + self._fast_acquire = fast_acquire + self._owner_task: asyncio.Task | None = None + self._waiters: deque[tuple[asyncio.Task, asyncio.Future]] = deque() + + async def acquire(self) -> None: + task = cast(asyncio.Task, current_task()) + if self._owner_task is None and not self._waiters: + await AsyncIOBackend.checkpoint_if_cancelled() + self._owner_task = task + + # Unless on the "fast path", yield control of the event loop so that other + # tasks can run too + if not self._fast_acquire: + try: + await AsyncIOBackend.cancel_shielded_checkpoint() + except CancelledError: + self.release() + raise + + return + + if self._owner_task == task: + raise RuntimeError("Attempted to acquire an already held Lock") + + fut: asyncio.Future[None] = asyncio.Future() + item = task, fut + self._waiters.append(item) + try: + await fut + except CancelledError: + self._waiters.remove(item) + if self._owner_task is task: + self.release() + + raise + + self._waiters.remove(item) + + def acquire_nowait(self) -> None: + task = cast(asyncio.Task, current_task()) + if self._owner_task is None and not self._waiters: + self._owner_task = task + return + + if self._owner_task is task: + raise RuntimeError("Attempted to acquire an already held Lock") + + raise WouldBlock + + def locked(self) -> bool: + return self._owner_task is not None + + def release(self) -> None: + if self._owner_task != current_task(): + raise RuntimeError("The current task is not holding this lock") + + for task, fut in self._waiters: + if not fut.cancelled(): + self._owner_task = task + fut.set_result(None) + return + + self._owner_task = None + + def statistics(self) -> LockStatistics: + task_info = AsyncIOTaskInfo(self._owner_task) if self._owner_task else None + return LockStatistics(self.locked(), task_info, len(self._waiters)) + + +class Semaphore(BaseSemaphore): + def __new__( + cls, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> Semaphore: + return object.__new__(cls) + + def __init__( + self, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ): + super().__init__(initial_value, max_value=max_value) + self._value = initial_value + self._max_value = max_value + self._fast_acquire = fast_acquire + self._waiters: deque[asyncio.Future[None]] = deque() + + async def acquire(self) -> None: + if self._value > 0 and not self._waiters: + await AsyncIOBackend.checkpoint_if_cancelled() + self._value -= 1 + + # Unless on the "fast path", yield control of the event loop so that other + # tasks can run too + if not self._fast_acquire: + try: + await AsyncIOBackend.cancel_shielded_checkpoint() + except CancelledError: + self.release() + raise + + return + + fut: asyncio.Future[None] = asyncio.Future() + self._waiters.append(fut) + try: + await fut + except CancelledError: + try: + self._waiters.remove(fut) + except ValueError: + self.release() + + raise + + def acquire_nowait(self) -> None: + if self._value == 0: + raise WouldBlock + + self._value -= 1 + + def release(self) -> None: + if self._max_value is not None and self._value == self._max_value: + raise ValueError("semaphore released too many times") + + for fut in self._waiters: + if not fut.cancelled(): + fut.set_result(None) + self._waiters.remove(fut) + return + + self._value += 1 + + @property + def value(self) -> int: + return self._value + + @property + def max_value(self) -> int | None: + return self._max_value + + def statistics(self) -> SemaphoreStatistics: + return SemaphoreStatistics(len(self._waiters)) + + +class CapacityLimiter(BaseCapacityLimiter): + _total_tokens: float = 0 + + def __new__(cls, total_tokens: float) -> CapacityLimiter: + return object.__new__(cls) + + def __init__(self, total_tokens: float): + self._borrowers: set[Any] = set() + self._wait_queue: OrderedDict[Any, asyncio.Event] = OrderedDict() + self.total_tokens = total_tokens + + async def __aenter__(self) -> None: + await self.acquire() + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self.release() + + @property + def total_tokens(self) -> float: + return self._total_tokens + + @total_tokens.setter + def total_tokens(self, value: float) -> None: + if not isinstance(value, int) and not math.isinf(value): + raise TypeError("total_tokens must be an int or math.inf") + + if value < 0: + raise ValueError("total_tokens must be >= 0") + + waiters_to_notify = max(value - self._total_tokens, 0) + self._total_tokens = value + + # Notify waiting tasks that they have acquired the limiter + while self._wait_queue and waiters_to_notify: + event = self._wait_queue.popitem(last=False)[1] + event.set() + waiters_to_notify -= 1 + + @property + def borrowed_tokens(self) -> int: + return len(self._borrowers) + + @property + def available_tokens(self) -> float: + return self._total_tokens - len(self._borrowers) + + def _notify_next_waiter(self) -> None: + """Notify the next task in line if this limiter has free capacity now.""" + if self._wait_queue and len(self._borrowers) < self._total_tokens: + event = self._wait_queue.popitem(last=False)[1] + event.set() + + def acquire_nowait(self) -> None: + self.acquire_on_behalf_of_nowait(current_task()) + + def acquire_on_behalf_of_nowait(self, borrower: object) -> None: + if borrower in self._borrowers: + raise RuntimeError( + "this borrower is already holding one of this CapacityLimiter's tokens" + ) + + if self._wait_queue or len(self._borrowers) >= self._total_tokens: + raise WouldBlock + + self._borrowers.add(borrower) + + async def acquire(self) -> None: + return await self.acquire_on_behalf_of(current_task()) + + async def acquire_on_behalf_of(self, borrower: object) -> None: + await AsyncIOBackend.checkpoint_if_cancelled() + try: + self.acquire_on_behalf_of_nowait(borrower) + except WouldBlock: + event = asyncio.Event() + self._wait_queue[borrower] = event + try: + await event.wait() + except BaseException: + self._wait_queue.pop(borrower, None) + if event.is_set(): + self._notify_next_waiter() + + raise + + self._borrowers.add(borrower) + else: + try: + await AsyncIOBackend.cancel_shielded_checkpoint() + except BaseException: + self.release() + raise + + def release(self) -> None: + self.release_on_behalf_of(current_task()) + + def release_on_behalf_of(self, borrower: object) -> None: + try: + self._borrowers.remove(borrower) + except KeyError: + raise RuntimeError( + "this borrower isn't holding any of this CapacityLimiter's tokens" + ) from None + + self._notify_next_waiter() + + def statistics(self) -> CapacityLimiterStatistics: + return CapacityLimiterStatistics( + self.borrowed_tokens, + self.total_tokens, + tuple(self._borrowers), + len(self._wait_queue), + ) + + +_default_thread_limiter: RunVar[CapacityLimiter] = RunVar("_default_thread_limiter") + + +# +# Operating system signals +# + + +class _SignalReceiver: + def __init__(self, signals: tuple[Signals, ...]): + self._signals = signals + self._loop = get_running_loop() + self._signal_queue: deque[Signals] = deque() + self._future: asyncio.Future = asyncio.Future() + self._handled_signals: set[Signals] = set() + + def _deliver(self, signum: Signals) -> None: + self._signal_queue.append(signum) + if not self._future.done(): + self._future.set_result(None) + + def __enter__(self) -> _SignalReceiver: + for sig in set(self._signals): + self._loop.add_signal_handler(sig, self._deliver, sig) + self._handled_signals.add(sig) + + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + for sig in self._handled_signals: + self._loop.remove_signal_handler(sig) + + def __aiter__(self) -> _SignalReceiver: + return self + + async def __anext__(self) -> Signals: + await AsyncIOBackend.checkpoint() + if not self._signal_queue: + self._future = asyncio.Future() + await self._future + + return self._signal_queue.popleft() + + +# +# Testing and debugging +# + + +class AsyncIOTaskInfo(TaskInfo): + def __init__(self, task: asyncio.Task): + task_state = _task_states.get(task) + if task_state is None: + parent_id = None + else: + parent_id = task_state.parent_id + + coro = task.get_coro() + assert coro is not None, "created TaskInfo from a completed Task" + super().__init__(id(task), parent_id, task.get_name(), coro) + self._task = weakref.ref(task) + + def has_pending_cancellation(self) -> bool: + if not (task := self._task()): + # If the task isn't around anymore, it won't have a pending cancellation + return False + + if task._must_cancel: # type: ignore[attr-defined] + return True + elif ( + isinstance(task._fut_waiter, asyncio.Future) # type: ignore[attr-defined] + and task._fut_waiter.cancelled() # type: ignore[attr-defined] + ): + return True + + if task_state := _task_states.get(task): + if cancel_scope := task_state.cancel_scope: + return cancel_scope._effectively_cancelled + + return False + + +class TestRunner(abc.TestRunner): + _send_stream: MemoryObjectSendStream[tuple[Awaitable[Any], asyncio.Future[Any]]] + + def __init__( + self, + *, + debug: bool | None = None, + use_uvloop: bool = False, + loop_factory: Callable[[], AbstractEventLoop] | None = None, + ) -> None: + if use_uvloop and loop_factory is None: + if sys.platform != "win32": + import uvloop + + loop_factory = uvloop.new_event_loop + else: + import winloop + + loop_factory = winloop.new_event_loop + + self._runner = Runner(debug=debug, loop_factory=loop_factory) + self._exceptions: list[BaseException] = [] + self._runner_task: asyncio.Task | None = None + + def __enter__(self) -> TestRunner: + self._runner.__enter__() + self.get_loop().set_exception_handler(self._exception_handler) + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self._runner.__exit__(exc_type, exc_val, exc_tb) + + def get_loop(self) -> AbstractEventLoop: + return self._runner.get_loop() + + def _exception_handler( + self, loop: asyncio.AbstractEventLoop, context: dict[str, Any] + ) -> None: + if isinstance(context.get("exception"), Exception): + self._exceptions.append(context["exception"]) + else: + loop.default_exception_handler(context) + + def _raise_async_exceptions(self) -> None: + # Re-raise any exceptions raised in asynchronous callbacks + if self._exceptions: + exceptions, self._exceptions = self._exceptions, [] + if len(exceptions) == 1: + raise exceptions[0] + elif exceptions: + raise BaseExceptionGroup( + "Multiple exceptions occurred in asynchronous callbacks", exceptions + ) + + async def _run_tests_and_fixtures( + self, + receive_stream: MemoryObjectReceiveStream[ + tuple[Awaitable[T_Retval], asyncio.Future[T_Retval]] + ], + ) -> None: + from _pytest.outcomes import OutcomeException + + with receive_stream, self._send_stream: + async for coro, future in receive_stream: + try: + retval = await coro + except CancelledError as exc: + if not future.cancelled(): + future.cancel(*exc.args) + + raise + except BaseException as exc: + if not future.cancelled(): + future.set_exception(exc) + + if not isinstance(exc, (Exception, OutcomeException)): + raise + else: + if not future.cancelled(): + future.set_result(retval) + + async def _call_in_runner_task( + self, + func: Callable[P, Awaitable[T_Retval]], + *args: P.args, + **kwargs: P.kwargs, + ) -> T_Retval: + if not self._runner_task: + self._send_stream, receive_stream = create_memory_object_stream[ + tuple[Awaitable[Any], asyncio.Future] + ](1) + self._runner_task = self.get_loop().create_task( + self._run_tests_and_fixtures(receive_stream) + ) + + coro = func(*args, **kwargs) + future: asyncio.Future[T_Retval] = self.get_loop().create_future() + self._send_stream.send_nowait((coro, future)) + return await future + + def run_asyncgen_fixture( + self, + fixture_func: Callable[..., AsyncGenerator[T_Retval, Any]], + kwargs: dict[str, Any], + ) -> Iterable[T_Retval]: + asyncgen = fixture_func(**kwargs) + fixturevalue: T_Retval = self.get_loop().run_until_complete( + self._call_in_runner_task(asyncgen.asend, None) + ) + self._raise_async_exceptions() + + yield fixturevalue + + try: + self.get_loop().run_until_complete( + self._call_in_runner_task(asyncgen.asend, None) + ) + except StopAsyncIteration: + self._raise_async_exceptions() + else: + self.get_loop().run_until_complete(asyncgen.aclose()) + raise RuntimeError("Async generator fixture did not stop") + + def run_fixture( + self, + fixture_func: Callable[..., Coroutine[Any, Any, T_Retval]], + kwargs: dict[str, Any], + ) -> T_Retval: + retval = self.get_loop().run_until_complete( + self._call_in_runner_task(fixture_func, **kwargs) + ) + self._raise_async_exceptions() + return retval + + def run_test( + self, test_func: Callable[..., Coroutine[Any, Any, Any]], kwargs: dict[str, Any] + ) -> None: + try: + self.get_loop().run_until_complete( + self._call_in_runner_task(test_func, **kwargs) + ) + except Exception as exc: + self._exceptions.append(exc) + + self._raise_async_exceptions() + + +class AsyncIOBackend(AsyncBackend): + @classmethod + def run( + cls, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + args: tuple[Unpack[PosArgsT]], + kwargs: dict[str, Any], + options: dict[str, Any], + ) -> T_Retval: + @wraps(func) + async def wrapper() -> T_Retval: + task = cast(asyncio.Task, current_task()) + task.set_name(get_callable_name(func)) + _task_states[task] = TaskState(None, None) + + try: + return await func(*args) + finally: + del _task_states[task] + + debug = options.get("debug", None) + loop_factory = options.get("loop_factory", None) + if loop_factory is None and options.get("use_uvloop", False): + if sys.platform != "win32": + import uvloop + + loop_factory = uvloop.new_event_loop + else: + import winloop + + loop_factory = winloop.new_event_loop + + with Runner(debug=debug, loop_factory=loop_factory) as runner: + return runner.run(wrapper()) + + @classmethod + def current_token(cls) -> object: + return get_running_loop() + + @classmethod + def current_time(cls) -> float: + return get_running_loop().time() + + @classmethod + def cancelled_exception_class(cls) -> type[BaseException]: + return CancelledError + + @classmethod + async def checkpoint(cls) -> None: + await sleep(0) + + @classmethod + async def checkpoint_if_cancelled(cls) -> None: + task = current_task() + if task is None: + return + + try: + cancel_scope = _task_states[task].cancel_scope + except KeyError: + return + + while cancel_scope: + if cancel_scope.cancel_called: + await sleep(0) + elif cancel_scope.shield: + break + else: + cancel_scope = cancel_scope._parent_scope + + @classmethod + async def cancel_shielded_checkpoint(cls) -> None: + with CancelScope(shield=True): + await sleep(0) + + @classmethod + async def sleep(cls, delay: float) -> None: + await sleep(delay) + + @classmethod + def create_cancel_scope( + cls, *, deadline: float = math.inf, shield: bool = False + ) -> CancelScope: + return CancelScope(deadline=deadline, shield=shield) + + @classmethod + def current_effective_deadline(cls) -> float: + if (task := current_task()) is None: + return math.inf + + try: + cancel_scope = _task_states[task].cancel_scope + except KeyError: + return math.inf + + deadline = math.inf + while cancel_scope: + deadline = min(deadline, cancel_scope.deadline) + if cancel_scope._cancel_called: + deadline = -math.inf + break + elif cancel_scope.shield: + break + else: + cancel_scope = cancel_scope._parent_scope + + return deadline + + @classmethod + def create_task_group(cls) -> abc.TaskGroup: + return TaskGroup() + + @classmethod + def create_event(cls) -> abc.Event: + return Event() + + @classmethod + def create_lock(cls, *, fast_acquire: bool) -> abc.Lock: + return Lock(fast_acquire=fast_acquire) + + @classmethod + def create_semaphore( + cls, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> abc.Semaphore: + return Semaphore(initial_value, max_value=max_value, fast_acquire=fast_acquire) + + @classmethod + def create_capacity_limiter(cls, total_tokens: float) -> abc.CapacityLimiter: + return CapacityLimiter(total_tokens) + + @classmethod + async def run_sync_in_worker_thread( # type: ignore[return] + cls, + func: Callable[[Unpack[PosArgsT]], T_Retval], + args: tuple[Unpack[PosArgsT]], + abandon_on_cancel: bool = False, + limiter: abc.CapacityLimiter | None = None, + ) -> T_Retval: + await cls.checkpoint() + + # If this is the first run in this event loop thread, set up the necessary + # variables + try: + idle_workers = _threadpool_idle_workers.get() + workers = _threadpool_workers.get() + except LookupError: + idle_workers = deque() + workers = set() + _threadpool_idle_workers.set(idle_workers) + _threadpool_workers.set(workers) + + async with limiter or cls.current_default_thread_limiter(): + with CancelScope(shield=not abandon_on_cancel) as scope: + future = asyncio.Future[T_Retval]() + root_task = find_root_task() + if not idle_workers: + worker = WorkerThread(root_task, workers, idle_workers) + worker.start() + workers.add(worker) + root_task.add_done_callback( + worker.stop, context=contextvars.Context() + ) + else: + worker = idle_workers.pop() + + # Prune any other workers that have been idle for MAX_IDLE_TIME + # seconds or longer + now = cls.current_time() + while idle_workers: + if ( + now - idle_workers[0].idle_since + < WorkerThread.MAX_IDLE_TIME + ): + break + + expired_worker = idle_workers.popleft() + expired_worker.root_task.remove_done_callback( + expired_worker.stop + ) + expired_worker.stop() + + context = copy_context() + context.run(set_current_async_library, None) + if abandon_on_cancel or scope._parent_scope is None: + worker_scope = scope + else: + worker_scope = scope._parent_scope + + worker.queue.put_nowait((context, func, args, future, worker_scope)) + return await future + + @classmethod + def check_cancelled(cls) -> None: + scope: CancelScope | None = threadlocals.current_cancel_scope + while scope is not None: + if scope.cancel_called: + raise CancelledError(f"Cancelled by cancel scope {id(scope):x}") + + if scope.shield: + return + + scope = scope._parent_scope + + @classmethod + def run_async_from_thread( + cls, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + args: tuple[Unpack[PosArgsT]], + token: object, + ) -> T_Retval: + async def task_wrapper() -> T_Retval: + __tracebackhide__ = True + if scope is not None: + task = cast(asyncio.Task, current_task()) + _task_states[task] = TaskState(None, scope) + scope._tasks.add(task) + try: + return await func(*args) + except CancelledError as exc: + raise concurrent.futures.CancelledError(str(exc)) from None + finally: + if scope is not None: + scope._tasks.discard(task) + + loop = cast( + "AbstractEventLoop", token or threadlocals.current_token.native_token + ) + if loop.is_closed(): + raise RunFinishedError + + context = copy_context() + context.run(set_current_async_library, "asyncio") + scope = getattr(threadlocals, "current_cancel_scope", None) + f: concurrent.futures.Future[T_Retval] = context.run( + asyncio.run_coroutine_threadsafe, task_wrapper(), loop=loop + ) + return f.result() + + @classmethod + def run_sync_from_thread( + cls, + func: Callable[[Unpack[PosArgsT]], T_Retval], + args: tuple[Unpack[PosArgsT]], + token: object, + ) -> T_Retval: + @wraps(func) + def wrapper() -> None: + try: + set_current_async_library("asyncio") + f.set_result(func(*args)) + except BaseException as exc: + f.set_exception(exc) + if not isinstance(exc, Exception): + raise + + loop = cast( + "AbstractEventLoop", token or threadlocals.current_token.native_token + ) + if loop.is_closed(): + raise RunFinishedError + + f: concurrent.futures.Future[T_Retval] = Future() + loop.call_soon_threadsafe(wrapper) + return f.result() + + @classmethod + async def open_process( + cls, + command: StrOrBytesPath | Sequence[StrOrBytesPath], + *, + stdin: int | IO[Any] | None, + stdout: int | IO[Any] | None, + stderr: int | IO[Any] | None, + **kwargs: Any, + ) -> Process: + await cls.checkpoint() + if isinstance(command, PathLike): + command = os.fspath(command) + + if isinstance(command, (str, bytes)): + process = await asyncio.create_subprocess_shell( + command, + stdin=stdin, + stdout=stdout, + stderr=stderr, + **kwargs, + ) + else: + process = await asyncio.create_subprocess_exec( + *command, + stdin=stdin, + stdout=stdout, + stderr=stderr, + **kwargs, + ) + + stdin_stream = StreamWriterWrapper(process.stdin) if process.stdin else None + stdout_stream = StreamReaderWrapper(process.stdout) if process.stdout else None + stderr_stream = StreamReaderWrapper(process.stderr) if process.stderr else None + return Process(process, stdin_stream, stdout_stream, stderr_stream) + + @classmethod + def setup_process_pool_exit_at_shutdown(cls, workers: set[abc.Process]) -> None: + create_task( + _shutdown_process_pool_on_exit(workers), + name="AnyIO process pool shutdown task", + ) + find_root_task().add_done_callback( + partial(_forcibly_shutdown_process_pool_on_exit, workers) # type:ignore[arg-type] + ) + + @classmethod + async def connect_tcp( + cls, host: str, port: int, local_address: IPSockAddrType | None = None + ) -> abc.SocketStream: + transport, protocol = cast( + tuple[asyncio.Transport, StreamProtocol], + await get_running_loop().create_connection( + StreamProtocol, host, port, local_addr=local_address + ), + ) + transport.pause_reading() + return SocketStream(transport, protocol) + + @classmethod + async def connect_unix(cls, path: str | bytes) -> abc.UNIXSocketStream: + await cls.checkpoint() + loop = get_running_loop() + raw_socket = socket.socket(socket.AF_UNIX) + raw_socket.setblocking(False) + while True: + try: + raw_socket.connect(path) + except BlockingIOError: + f: asyncio.Future = asyncio.Future() + loop.add_writer(raw_socket, f.set_result, None) + f.add_done_callback(lambda _: loop.remove_writer(raw_socket)) + await f + except BaseException: + raw_socket.close() + raise + else: + return UNIXSocketStream(raw_socket) + + @classmethod + def create_tcp_listener(cls, sock: socket.socket) -> SocketListener: + return TCPSocketListener(sock) + + @classmethod + def create_unix_listener(cls, sock: socket.socket) -> SocketListener: + return UNIXSocketListener(sock) + + @classmethod + async def create_udp_socket( + cls, + family: AddressFamily, + local_address: IPSockAddrType | None, + remote_address: IPSockAddrType | None, + reuse_port: bool, + ) -> UDPSocket | ConnectedUDPSocket: + transport, protocol = await get_running_loop().create_datagram_endpoint( + DatagramProtocol, + local_addr=local_address, + remote_addr=remote_address, + family=family, + reuse_port=reuse_port, + ) + if protocol.exception: + transport.close() + raise protocol.exception + + if not remote_address: + return UDPSocket(transport, protocol) + else: + return ConnectedUDPSocket(transport, protocol) + + @classmethod + async def create_unix_datagram_socket( # type: ignore[override] + cls, raw_socket: socket.socket, remote_path: str | bytes | None + ) -> abc.UNIXDatagramSocket | abc.ConnectedUNIXDatagramSocket: + await cls.checkpoint() + loop = get_running_loop() + + if remote_path: + while True: + try: + raw_socket.connect(remote_path) + except BlockingIOError: + f: asyncio.Future = asyncio.Future() + loop.add_writer(raw_socket, f.set_result, None) + f.add_done_callback(lambda _: loop.remove_writer(raw_socket)) + await f + except BaseException: + raw_socket.close() + raise + else: + return ConnectedUNIXDatagramSocket(raw_socket) + else: + return UNIXDatagramSocket(raw_socket) + + @classmethod + async def getaddrinfo( + cls, + host: bytes | str | None, + port: str | int | None, + *, + family: int | AddressFamily = 0, + type: int | SocketKind = 0, + proto: int = 0, + flags: int = 0, + ) -> Sequence[ + tuple[ + AddressFamily, + SocketKind, + int, + str, + tuple[str, int] | tuple[str, int, int, int] | tuple[int, bytes], + ] + ]: + return await get_running_loop().getaddrinfo( + host, port, family=family, type=type, proto=proto, flags=flags + ) + + @classmethod + async def getnameinfo( + cls, sockaddr: IPSockAddrType, flags: int = 0 + ) -> tuple[str, str]: + return await get_running_loop().getnameinfo(sockaddr, flags) + + @classmethod + async def wait_readable(cls, obj: FileDescriptorLike) -> None: + try: + read_events = _read_events.get() + except LookupError: + read_events = {} + _read_events.set(read_events) + + fd = obj if isinstance(obj, int) else obj.fileno() + if read_events.get(fd): + raise BusyResourceError("reading from") + + loop = get_running_loop() + fut: asyncio.Future[bool] = loop.create_future() + + def cb() -> None: + try: + del read_events[fd] + except KeyError: + pass + else: + remove_reader(fd) + + try: + fut.set_result(True) + except asyncio.InvalidStateError: + pass + + try: + loop.add_reader(fd, cb) + except NotImplementedError: + from anyio._core._asyncio_selector_thread import get_selector + + selector = get_selector() + selector.add_reader(fd, cb) + remove_reader = selector.remove_reader + else: + remove_reader = loop.remove_reader + + read_events[fd] = fut + try: + success = await fut + finally: + try: + del read_events[fd] + except KeyError: + pass + else: + remove_reader(fd) + + if not success: + raise ClosedResourceError + + @classmethod + async def wait_writable(cls, obj: FileDescriptorLike) -> None: + try: + write_events = _write_events.get() + except LookupError: + write_events = {} + _write_events.set(write_events) + + fd = obj if isinstance(obj, int) else obj.fileno() + if write_events.get(fd): + raise BusyResourceError("writing to") + + loop = get_running_loop() + fut: asyncio.Future[bool] = loop.create_future() + + def cb() -> None: + try: + del write_events[fd] + except KeyError: + pass + else: + remove_writer(fd) + + try: + fut.set_result(True) + except asyncio.InvalidStateError: + pass + + try: + loop.add_writer(fd, cb) + except NotImplementedError: + from anyio._core._asyncio_selector_thread import get_selector + + selector = get_selector() + selector.add_writer(fd, cb) + remove_writer = selector.remove_writer + else: + remove_writer = loop.remove_writer + + write_events[fd] = fut + try: + success = await fut + finally: + try: + del write_events[fd] + except KeyError: + pass + else: + remove_writer(fd) + + if not success: + raise ClosedResourceError + + @classmethod + def notify_closing(cls, obj: FileDescriptorLike) -> None: + fd = obj if isinstance(obj, int) else obj.fileno() + loop = get_running_loop() + + try: + write_events = _write_events.get() + except LookupError: + pass + else: + try: + fut = write_events.pop(fd) + except KeyError: + pass + else: + try: + fut.set_result(False) + except asyncio.InvalidStateError: + pass + + try: + loop.remove_writer(fd) + except NotImplementedError: + from anyio._core._asyncio_selector_thread import get_selector + + get_selector().remove_writer(fd) + + try: + read_events = _read_events.get() + except LookupError: + pass + else: + try: + fut = read_events.pop(fd) + except KeyError: + pass + else: + try: + fut.set_result(False) + except asyncio.InvalidStateError: + pass + + try: + loop.remove_reader(fd) + except NotImplementedError: + from anyio._core._asyncio_selector_thread import get_selector + + get_selector().remove_reader(fd) + + @classmethod + async def wrap_listener_socket(cls, sock: socket.socket) -> SocketListener: + return TCPSocketListener(sock) + + @classmethod + async def wrap_stream_socket(cls, sock: socket.socket) -> SocketStream: + transport, protocol = await get_running_loop().create_connection( + StreamProtocol, sock=sock + ) + return SocketStream(transport, protocol) + + @classmethod + async def wrap_unix_stream_socket(cls, sock: socket.socket) -> UNIXSocketStream: + return UNIXSocketStream(sock) + + @classmethod + async def wrap_udp_socket(cls, sock: socket.socket) -> UDPSocket: + transport, protocol = await get_running_loop().create_datagram_endpoint( + DatagramProtocol, sock=sock + ) + return UDPSocket(transport, protocol) + + @classmethod + async def wrap_connected_udp_socket(cls, sock: socket.socket) -> ConnectedUDPSocket: + transport, protocol = await get_running_loop().create_datagram_endpoint( + DatagramProtocol, sock=sock + ) + return ConnectedUDPSocket(transport, protocol) + + @classmethod + async def wrap_unix_datagram_socket(cls, sock: socket.socket) -> UNIXDatagramSocket: + return UNIXDatagramSocket(sock) + + @classmethod + async def wrap_connected_unix_datagram_socket( + cls, sock: socket.socket + ) -> ConnectedUNIXDatagramSocket: + return ConnectedUNIXDatagramSocket(sock) + + @classmethod + def current_default_thread_limiter(cls) -> CapacityLimiter: + try: + return _default_thread_limiter.get() + except LookupError: + limiter = CapacityLimiter(40) + _default_thread_limiter.set(limiter) + return limiter + + @classmethod + def open_signal_receiver( + cls, *signals: Signals + ) -> AbstractContextManager[AsyncIterator[Signals]]: + return _SignalReceiver(signals) + + @classmethod + def get_current_task(cls) -> TaskInfo: + return AsyncIOTaskInfo(current_task()) # type: ignore[arg-type] + + @classmethod + def get_running_tasks(cls) -> Sequence[TaskInfo]: + return [AsyncIOTaskInfo(task) for task in all_tasks() if not task.done()] + + @classmethod + async def wait_all_tasks_blocked(cls) -> None: + await cls.checkpoint() + this_task = current_task() + while True: + for task in all_tasks(): + if task is this_task: + continue + + waiter = task._fut_waiter # type: ignore[attr-defined] + if waiter is None or waiter.done(): + await sleep(0.1) + break + else: + return + + @classmethod + def create_test_runner(cls, options: dict[str, Any]) -> TestRunner: + return TestRunner(**options) + + +backend_class = AsyncIOBackend diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/_backends/_trio.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/_backends/_trio.py new file mode 100755 index 0000000..f460a7f --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/_backends/_trio.py @@ -0,0 +1,1346 @@ +from __future__ import annotations + +import array +import math +import os +import socket +import sys +import types +import weakref +from collections.abc import ( + AsyncGenerator, + AsyncIterator, + Awaitable, + Callable, + Collection, + Coroutine, + Iterable, + Sequence, +) +from contextlib import AbstractContextManager +from dataclasses import dataclass +from io import IOBase +from os import PathLike +from signal import Signals +from socket import AddressFamily, SocketKind +from types import TracebackType +from typing import ( + IO, + TYPE_CHECKING, + Any, + Generic, + NoReturn, + TypeVar, + cast, + overload, +) + +import trio.from_thread +import trio.lowlevel +from outcome import Error, Outcome, Value +from trio.lowlevel import ( + current_root_task, + current_task, + notify_closing, + wait_readable, + wait_writable, +) +from trio.socket import SocketType as TrioSocketType +from trio.to_thread import run_sync + +from .. import ( + CapacityLimiterStatistics, + EventStatistics, + LockStatistics, + RunFinishedError, + TaskInfo, + WouldBlock, + abc, +) +from .._core._eventloop import claim_worker_thread +from .._core._exceptions import ( + BrokenResourceError, + BusyResourceError, + ClosedResourceError, + EndOfStream, +) +from .._core._sockets import convert_ipv6_sockaddr +from .._core._streams import create_memory_object_stream +from .._core._synchronization import ( + CapacityLimiter as BaseCapacityLimiter, +) +from .._core._synchronization import Event as BaseEvent +from .._core._synchronization import Lock as BaseLock +from .._core._synchronization import ( + ResourceGuard, + SemaphoreStatistics, +) +from .._core._synchronization import Semaphore as BaseSemaphore +from .._core._tasks import CancelScope as BaseCancelScope +from ..abc import IPSockAddrType, UDPPacketType, UNIXDatagramPacketType +from ..abc._eventloop import AsyncBackend, StrOrBytesPath +from ..streams.memory import MemoryObjectSendStream + +if TYPE_CHECKING: + from _typeshed import FileDescriptorLike + +if sys.version_info >= (3, 10): + from typing import ParamSpec +else: + from typing_extensions import ParamSpec + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from exceptiongroup import BaseExceptionGroup + from typing_extensions import TypeVarTuple, Unpack + +T = TypeVar("T") +T_Retval = TypeVar("T_Retval") +T_SockAddr = TypeVar("T_SockAddr", str, IPSockAddrType) +PosArgsT = TypeVarTuple("PosArgsT") +P = ParamSpec("P") + + +# +# Event loop +# + +RunVar = trio.lowlevel.RunVar + + +# +# Timeouts and cancellation +# + + +class CancelScope(BaseCancelScope): + def __new__( + cls, original: trio.CancelScope | None = None, **kwargs: object + ) -> CancelScope: + return object.__new__(cls) + + def __init__(self, original: trio.CancelScope | None = None, **kwargs: Any) -> None: + self.__original = original or trio.CancelScope(**kwargs) + + def __enter__(self) -> CancelScope: + self.__original.__enter__() + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> bool: + return self.__original.__exit__(exc_type, exc_val, exc_tb) + + def cancel(self, reason: str | None = None) -> None: + self.__original.cancel(reason) + + @property + def deadline(self) -> float: + return self.__original.deadline + + @deadline.setter + def deadline(self, value: float) -> None: + self.__original.deadline = value + + @property + def cancel_called(self) -> bool: + return self.__original.cancel_called + + @property + def cancelled_caught(self) -> bool: + return self.__original.cancelled_caught + + @property + def shield(self) -> bool: + return self.__original.shield + + @shield.setter + def shield(self, value: bool) -> None: + self.__original.shield = value + + +# +# Task groups +# + + +class TaskGroup(abc.TaskGroup): + def __init__(self) -> None: + self._active = False + self._nursery_manager = trio.open_nursery(strict_exception_groups=True) + self.cancel_scope = None # type: ignore[assignment] + + async def __aenter__(self) -> TaskGroup: + self._active = True + self._nursery = await self._nursery_manager.__aenter__() + self.cancel_scope = CancelScope(self._nursery.cancel_scope) + return self + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> bool: + try: + # trio.Nursery.__exit__ returns bool; .open_nursery has wrong type + return await self._nursery_manager.__aexit__(exc_type, exc_val, exc_tb) # type: ignore[return-value] + except BaseExceptionGroup as exc: + if not exc.split(trio.Cancelled)[1]: + raise trio.Cancelled._create() from exc + + raise + finally: + del exc_val, exc_tb + self._active = False + + def start_soon( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[Any]], + *args: Unpack[PosArgsT], + name: object = None, + ) -> None: + if not self._active: + raise RuntimeError( + "This task group is not active; no new tasks can be started." + ) + + self._nursery.start_soon(func, *args, name=name) + + async def start( + self, func: Callable[..., Awaitable[Any]], *args: object, name: object = None + ) -> Any: + if not self._active: + raise RuntimeError( + "This task group is not active; no new tasks can be started." + ) + + return await self._nursery.start(func, *args, name=name) + + +# +# Subprocesses +# + + +@dataclass(eq=False) +class ReceiveStreamWrapper(abc.ByteReceiveStream): + _stream: trio.abc.ReceiveStream + + async def receive(self, max_bytes: int | None = None) -> bytes: + try: + data = await self._stream.receive_some(max_bytes) + except trio.ClosedResourceError as exc: + raise ClosedResourceError from exc.__cause__ + except trio.BrokenResourceError as exc: + raise BrokenResourceError from exc.__cause__ + + if data: + return bytes(data) + else: + raise EndOfStream + + async def aclose(self) -> None: + await self._stream.aclose() + + +@dataclass(eq=False) +class SendStreamWrapper(abc.ByteSendStream): + _stream: trio.abc.SendStream + + async def send(self, item: bytes) -> None: + try: + await self._stream.send_all(item) + except trio.ClosedResourceError as exc: + raise ClosedResourceError from exc.__cause__ + except trio.BrokenResourceError as exc: + raise BrokenResourceError from exc.__cause__ + + async def aclose(self) -> None: + await self._stream.aclose() + + +@dataclass(eq=False) +class Process(abc.Process): + _process: trio.Process + _stdin: abc.ByteSendStream | None + _stdout: abc.ByteReceiveStream | None + _stderr: abc.ByteReceiveStream | None + + async def aclose(self) -> None: + with CancelScope(shield=True): + if self._stdin: + await self._stdin.aclose() + if self._stdout: + await self._stdout.aclose() + if self._stderr: + await self._stderr.aclose() + + try: + await self.wait() + except BaseException: + self.kill() + with CancelScope(shield=True): + await self.wait() + raise + + async def wait(self) -> int: + return await self._process.wait() + + def terminate(self) -> None: + self._process.terminate() + + def kill(self) -> None: + self._process.kill() + + def send_signal(self, signal: Signals) -> None: + self._process.send_signal(signal) + + @property + def pid(self) -> int: + return self._process.pid + + @property + def returncode(self) -> int | None: + return self._process.returncode + + @property + def stdin(self) -> abc.ByteSendStream | None: + return self._stdin + + @property + def stdout(self) -> abc.ByteReceiveStream | None: + return self._stdout + + @property + def stderr(self) -> abc.ByteReceiveStream | None: + return self._stderr + + +class _ProcessPoolShutdownInstrument(trio.abc.Instrument): + def after_run(self) -> None: + super().after_run() + + +current_default_worker_process_limiter: trio.lowlevel.RunVar = RunVar( + "current_default_worker_process_limiter" +) + + +async def _shutdown_process_pool(workers: set[abc.Process]) -> None: + try: + await trio.sleep(math.inf) + except trio.Cancelled: + for process in workers: + if process.returncode is None: + process.kill() + + with CancelScope(shield=True): + for process in workers: + await process.aclose() + + +# +# Sockets and networking +# + + +class _TrioSocketMixin(Generic[T_SockAddr]): + def __init__(self, trio_socket: TrioSocketType) -> None: + self._trio_socket = trio_socket + self._closed = False + + def _check_closed(self) -> None: + if self._closed: + raise ClosedResourceError + if self._trio_socket.fileno() < 0: + raise BrokenResourceError + + @property + def _raw_socket(self) -> socket.socket: + return self._trio_socket._sock # type: ignore[attr-defined] + + async def aclose(self) -> None: + if self._trio_socket.fileno() >= 0: + self._closed = True + self._trio_socket.close() + + def _convert_socket_error(self, exc: BaseException) -> NoReturn: + if isinstance(exc, trio.ClosedResourceError): + raise ClosedResourceError from exc + elif self._trio_socket.fileno() < 0 and self._closed: + raise ClosedResourceError from None + elif isinstance(exc, OSError): + raise BrokenResourceError from exc + else: + raise exc + + +class SocketStream(_TrioSocketMixin, abc.SocketStream): + def __init__(self, trio_socket: TrioSocketType) -> None: + super().__init__(trio_socket) + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + + async def receive(self, max_bytes: int = 65536) -> bytes: + with self._receive_guard: + try: + data = await self._trio_socket.recv(max_bytes) + except BaseException as exc: + self._convert_socket_error(exc) + + if data: + return data + else: + raise EndOfStream + + async def send(self, item: bytes) -> None: + with self._send_guard: + view = memoryview(item) + while view: + try: + bytes_sent = await self._trio_socket.send(view) + except BaseException as exc: + self._convert_socket_error(exc) + + view = view[bytes_sent:] + + async def send_eof(self) -> None: + self._trio_socket.shutdown(socket.SHUT_WR) + + +class UNIXSocketStream(SocketStream, abc.UNIXSocketStream): + async def receive_fds(self, msglen: int, maxfds: int) -> tuple[bytes, list[int]]: + if not isinstance(msglen, int) or msglen < 0: + raise ValueError("msglen must be a non-negative integer") + if not isinstance(maxfds, int) or maxfds < 1: + raise ValueError("maxfds must be a positive integer") + + fds = array.array("i") + await trio.lowlevel.checkpoint() + with self._receive_guard: + while True: + try: + message, ancdata, flags, addr = await self._trio_socket.recvmsg( + msglen, socket.CMSG_LEN(maxfds * fds.itemsize) + ) + except BaseException as exc: + self._convert_socket_error(exc) + else: + if not message and not ancdata: + raise EndOfStream + + break + + for cmsg_level, cmsg_type, cmsg_data in ancdata: + if cmsg_level != socket.SOL_SOCKET or cmsg_type != socket.SCM_RIGHTS: + raise RuntimeError( + f"Received unexpected ancillary data; message = {message!r}, " + f"cmsg_level = {cmsg_level}, cmsg_type = {cmsg_type}" + ) + + fds.frombytes(cmsg_data[: len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) + + return message, list(fds) + + async def send_fds(self, message: bytes, fds: Collection[int | IOBase]) -> None: + if not message: + raise ValueError("message must not be empty") + if not fds: + raise ValueError("fds must not be empty") + + filenos: list[int] = [] + for fd in fds: + if isinstance(fd, int): + filenos.append(fd) + elif isinstance(fd, IOBase): + filenos.append(fd.fileno()) + + fdarray = array.array("i", filenos) + await trio.lowlevel.checkpoint() + with self._send_guard: + while True: + try: + await self._trio_socket.sendmsg( + [message], + [ + ( + socket.SOL_SOCKET, + socket.SCM_RIGHTS, + fdarray, + ) + ], + ) + break + except BaseException as exc: + self._convert_socket_error(exc) + + +class TCPSocketListener(_TrioSocketMixin, abc.SocketListener): + def __init__(self, raw_socket: socket.socket): + super().__init__(trio.socket.from_stdlib_socket(raw_socket)) + self._accept_guard = ResourceGuard("accepting connections from") + + async def accept(self) -> SocketStream: + with self._accept_guard: + try: + trio_socket, _addr = await self._trio_socket.accept() + except BaseException as exc: + self._convert_socket_error(exc) + + trio_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + return SocketStream(trio_socket) + + +class UNIXSocketListener(_TrioSocketMixin, abc.SocketListener): + def __init__(self, raw_socket: socket.socket): + super().__init__(trio.socket.from_stdlib_socket(raw_socket)) + self._accept_guard = ResourceGuard("accepting connections from") + + async def accept(self) -> UNIXSocketStream: + with self._accept_guard: + try: + trio_socket, _addr = await self._trio_socket.accept() + except BaseException as exc: + self._convert_socket_error(exc) + + return UNIXSocketStream(trio_socket) + + +class UDPSocket(_TrioSocketMixin[IPSockAddrType], abc.UDPSocket): + def __init__(self, trio_socket: TrioSocketType) -> None: + super().__init__(trio_socket) + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + + async def receive(self) -> tuple[bytes, IPSockAddrType]: + with self._receive_guard: + try: + data, addr = await self._trio_socket.recvfrom(65536) + return data, convert_ipv6_sockaddr(addr) + except BaseException as exc: + self._convert_socket_error(exc) + + async def send(self, item: UDPPacketType) -> None: + with self._send_guard: + try: + await self._trio_socket.sendto(*item) + except BaseException as exc: + self._convert_socket_error(exc) + + +class ConnectedUDPSocket(_TrioSocketMixin[IPSockAddrType], abc.ConnectedUDPSocket): + def __init__(self, trio_socket: TrioSocketType) -> None: + super().__init__(trio_socket) + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + + async def receive(self) -> bytes: + with self._receive_guard: + try: + return await self._trio_socket.recv(65536) + except BaseException as exc: + self._convert_socket_error(exc) + + async def send(self, item: bytes) -> None: + with self._send_guard: + try: + await self._trio_socket.send(item) + except BaseException as exc: + self._convert_socket_error(exc) + + +class UNIXDatagramSocket(_TrioSocketMixin[str], abc.UNIXDatagramSocket): + def __init__(self, trio_socket: TrioSocketType) -> None: + super().__init__(trio_socket) + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + + async def receive(self) -> UNIXDatagramPacketType: + with self._receive_guard: + try: + data, addr = await self._trio_socket.recvfrom(65536) + return data, addr + except BaseException as exc: + self._convert_socket_error(exc) + + async def send(self, item: UNIXDatagramPacketType) -> None: + with self._send_guard: + try: + await self._trio_socket.sendto(*item) + except BaseException as exc: + self._convert_socket_error(exc) + + +class ConnectedUNIXDatagramSocket( + _TrioSocketMixin[str], abc.ConnectedUNIXDatagramSocket +): + def __init__(self, trio_socket: TrioSocketType) -> None: + super().__init__(trio_socket) + self._receive_guard = ResourceGuard("reading from") + self._send_guard = ResourceGuard("writing to") + + async def receive(self) -> bytes: + with self._receive_guard: + try: + return await self._trio_socket.recv(65536) + except BaseException as exc: + self._convert_socket_error(exc) + + async def send(self, item: bytes) -> None: + with self._send_guard: + try: + await self._trio_socket.send(item) + except BaseException as exc: + self._convert_socket_error(exc) + + +# +# Synchronization +# + + +class Event(BaseEvent): + def __new__(cls) -> Event: + return object.__new__(cls) + + def __init__(self) -> None: + self.__original = trio.Event() + + def is_set(self) -> bool: + return self.__original.is_set() + + async def wait(self) -> None: + return await self.__original.wait() + + def statistics(self) -> EventStatistics: + orig_statistics = self.__original.statistics() + return EventStatistics(tasks_waiting=orig_statistics.tasks_waiting) + + def set(self) -> None: + self.__original.set() + + +class Lock(BaseLock): + def __new__(cls, *, fast_acquire: bool = False) -> Lock: + return object.__new__(cls) + + def __init__(self, *, fast_acquire: bool = False) -> None: + self._fast_acquire = fast_acquire + self.__original = trio.Lock() + + @staticmethod + def _convert_runtime_error_msg(exc: RuntimeError) -> None: + if exc.args == ("attempt to re-acquire an already held Lock",): + exc.args = ("Attempted to acquire an already held Lock",) + + async def acquire(self) -> None: + if not self._fast_acquire: + try: + await self.__original.acquire() + except RuntimeError as exc: + self._convert_runtime_error_msg(exc) + raise + + return + + # This is the "fast path" where we don't let other tasks run + await trio.lowlevel.checkpoint_if_cancelled() + try: + self.__original.acquire_nowait() + except trio.WouldBlock: + await self.__original._lot.park() + except RuntimeError as exc: + self._convert_runtime_error_msg(exc) + raise + + def acquire_nowait(self) -> None: + try: + self.__original.acquire_nowait() + except trio.WouldBlock: + raise WouldBlock from None + except RuntimeError as exc: + self._convert_runtime_error_msg(exc) + raise + + def locked(self) -> bool: + return self.__original.locked() + + def release(self) -> None: + self.__original.release() + + def statistics(self) -> LockStatistics: + orig_statistics = self.__original.statistics() + owner = TrioTaskInfo(orig_statistics.owner) if orig_statistics.owner else None + return LockStatistics( + orig_statistics.locked, owner, orig_statistics.tasks_waiting + ) + + +class Semaphore(BaseSemaphore): + def __new__( + cls, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> Semaphore: + return object.__new__(cls) + + def __init__( + self, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> None: + super().__init__(initial_value, max_value=max_value, fast_acquire=fast_acquire) + self.__original = trio.Semaphore(initial_value, max_value=max_value) + + async def acquire(self) -> None: + if not self._fast_acquire: + await self.__original.acquire() + return + + # This is the "fast path" where we don't let other tasks run + await trio.lowlevel.checkpoint_if_cancelled() + try: + self.__original.acquire_nowait() + except trio.WouldBlock: + await self.__original._lot.park() + + def acquire_nowait(self) -> None: + try: + self.__original.acquire_nowait() + except trio.WouldBlock: + raise WouldBlock from None + + @property + def max_value(self) -> int | None: + return self.__original.max_value + + @property + def value(self) -> int: + return self.__original.value + + def release(self) -> None: + self.__original.release() + + def statistics(self) -> SemaphoreStatistics: + orig_statistics = self.__original.statistics() + return SemaphoreStatistics(orig_statistics.tasks_waiting) + + +class CapacityLimiter(BaseCapacityLimiter): + def __new__( + cls, + total_tokens: float | None = None, + *, + original: trio.CapacityLimiter | None = None, + ) -> CapacityLimiter: + return object.__new__(cls) + + def __init__( + self, + total_tokens: float | None = None, + *, + original: trio.CapacityLimiter | None = None, + ) -> None: + if original is not None: + self.__original = original + else: + assert total_tokens is not None + self.__original = trio.CapacityLimiter(total_tokens) + + async def __aenter__(self) -> None: + return await self.__original.__aenter__() + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + await self.__original.__aexit__(exc_type, exc_val, exc_tb) + + @property + def total_tokens(self) -> float: + return self.__original.total_tokens + + @total_tokens.setter + def total_tokens(self, value: float) -> None: + self.__original.total_tokens = value + + @property + def borrowed_tokens(self) -> int: + return self.__original.borrowed_tokens + + @property + def available_tokens(self) -> float: + return self.__original.available_tokens + + def acquire_nowait(self) -> None: + self.__original.acquire_nowait() + + def acquire_on_behalf_of_nowait(self, borrower: object) -> None: + self.__original.acquire_on_behalf_of_nowait(borrower) + + async def acquire(self) -> None: + await self.__original.acquire() + + async def acquire_on_behalf_of(self, borrower: object) -> None: + await self.__original.acquire_on_behalf_of(borrower) + + def release(self) -> None: + return self.__original.release() + + def release_on_behalf_of(self, borrower: object) -> None: + return self.__original.release_on_behalf_of(borrower) + + def statistics(self) -> CapacityLimiterStatistics: + orig = self.__original.statistics() + return CapacityLimiterStatistics( + borrowed_tokens=orig.borrowed_tokens, + total_tokens=orig.total_tokens, + borrowers=tuple(orig.borrowers), + tasks_waiting=orig.tasks_waiting, + ) + + +_capacity_limiter_wrapper: trio.lowlevel.RunVar = RunVar("_capacity_limiter_wrapper") + + +# +# Signal handling +# + + +class _SignalReceiver: + _iterator: AsyncIterator[int] + + def __init__(self, signals: tuple[Signals, ...]): + self._signals = signals + + def __enter__(self) -> _SignalReceiver: + self._cm = trio.open_signal_receiver(*self._signals) + self._iterator = self._cm.__enter__() + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> bool | None: + return self._cm.__exit__(exc_type, exc_val, exc_tb) + + def __aiter__(self) -> _SignalReceiver: + return self + + async def __anext__(self) -> Signals: + signum = await self._iterator.__anext__() + return Signals(signum) + + +# +# Testing and debugging +# + + +class TestRunner(abc.TestRunner): + def __init__(self, **options: Any) -> None: + from queue import Queue + + self._call_queue: Queue[Callable[[], object]] = Queue() + self._send_stream: MemoryObjectSendStream | None = None + self._options = options + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: types.TracebackType | None, + ) -> None: + if self._send_stream: + self._send_stream.close() + while self._send_stream is not None: + self._call_queue.get()() + + async def _run_tests_and_fixtures(self) -> None: + self._send_stream, receive_stream = create_memory_object_stream(1) + with receive_stream: + async for coro, outcome_holder in receive_stream: + try: + retval = await coro + except BaseException as exc: + outcome_holder.append(Error(exc)) + else: + outcome_holder.append(Value(retval)) + + def _main_task_finished(self, outcome: object) -> None: + self._send_stream = None + + def _call_in_runner_task( + self, + func: Callable[P, Awaitable[T_Retval]], + *args: P.args, + **kwargs: P.kwargs, + ) -> T_Retval: + if self._send_stream is None: + trio.lowlevel.start_guest_run( + self._run_tests_and_fixtures, + run_sync_soon_threadsafe=self._call_queue.put, + done_callback=self._main_task_finished, + **self._options, + ) + while self._send_stream is None: + self._call_queue.get()() + + outcome_holder: list[Outcome] = [] + self._send_stream.send_nowait((func(*args, **kwargs), outcome_holder)) + while not outcome_holder: + self._call_queue.get()() + + return outcome_holder[0].unwrap() + + def run_asyncgen_fixture( + self, + fixture_func: Callable[..., AsyncGenerator[T_Retval, Any]], + kwargs: dict[str, Any], + ) -> Iterable[T_Retval]: + asyncgen = fixture_func(**kwargs) + fixturevalue: T_Retval = self._call_in_runner_task(asyncgen.asend, None) + + yield fixturevalue + + try: + self._call_in_runner_task(asyncgen.asend, None) + except StopAsyncIteration: + pass + else: + self._call_in_runner_task(asyncgen.aclose) + raise RuntimeError("Async generator fixture did not stop") + + def run_fixture( + self, + fixture_func: Callable[..., Coroutine[Any, Any, T_Retval]], + kwargs: dict[str, Any], + ) -> T_Retval: + return self._call_in_runner_task(fixture_func, **kwargs) + + def run_test( + self, test_func: Callable[..., Coroutine[Any, Any, Any]], kwargs: dict[str, Any] + ) -> None: + self._call_in_runner_task(test_func, **kwargs) + + +class TrioTaskInfo(TaskInfo): + def __init__(self, task: trio.lowlevel.Task): + parent_id = None + if task.parent_nursery and task.parent_nursery.parent_task: + parent_id = id(task.parent_nursery.parent_task) + + super().__init__(id(task), parent_id, task.name, task.coro) + self._task = weakref.proxy(task) + + def has_pending_cancellation(self) -> bool: + try: + return self._task._cancel_status.effectively_cancelled + except ReferenceError: + # If the task is no longer around, it surely doesn't have a cancellation + # pending + return False + + +class TrioBackend(AsyncBackend): + @classmethod + def run( + cls, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + args: tuple[Unpack[PosArgsT]], + kwargs: dict[str, Any], + options: dict[str, Any], + ) -> T_Retval: + return trio.run(func, *args) + + @classmethod + def current_token(cls) -> object: + return trio.lowlevel.current_trio_token() + + @classmethod + def current_time(cls) -> float: + return trio.current_time() + + @classmethod + def cancelled_exception_class(cls) -> type[BaseException]: + return trio.Cancelled + + @classmethod + async def checkpoint(cls) -> None: + await trio.lowlevel.checkpoint() + + @classmethod + async def checkpoint_if_cancelled(cls) -> None: + await trio.lowlevel.checkpoint_if_cancelled() + + @classmethod + async def cancel_shielded_checkpoint(cls) -> None: + await trio.lowlevel.cancel_shielded_checkpoint() + + @classmethod + async def sleep(cls, delay: float) -> None: + await trio.sleep(delay) + + @classmethod + def create_cancel_scope( + cls, *, deadline: float = math.inf, shield: bool = False + ) -> abc.CancelScope: + return CancelScope(deadline=deadline, shield=shield) + + @classmethod + def current_effective_deadline(cls) -> float: + return trio.current_effective_deadline() + + @classmethod + def create_task_group(cls) -> abc.TaskGroup: + return TaskGroup() + + @classmethod + def create_event(cls) -> abc.Event: + return Event() + + @classmethod + def create_lock(cls, *, fast_acquire: bool) -> Lock: + return Lock(fast_acquire=fast_acquire) + + @classmethod + def create_semaphore( + cls, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> abc.Semaphore: + return Semaphore(initial_value, max_value=max_value, fast_acquire=fast_acquire) + + @classmethod + def create_capacity_limiter(cls, total_tokens: float) -> CapacityLimiter: + return CapacityLimiter(total_tokens) + + @classmethod + async def run_sync_in_worker_thread( + cls, + func: Callable[[Unpack[PosArgsT]], T_Retval], + args: tuple[Unpack[PosArgsT]], + abandon_on_cancel: bool = False, + limiter: abc.CapacityLimiter | None = None, + ) -> T_Retval: + def wrapper() -> T_Retval: + with claim_worker_thread(TrioBackend, token): + return func(*args) + + token = TrioBackend.current_token() + return await run_sync( + wrapper, + abandon_on_cancel=abandon_on_cancel, + limiter=cast(trio.CapacityLimiter, limiter), + ) + + @classmethod + def check_cancelled(cls) -> None: + trio.from_thread.check_cancelled() + + @classmethod + def run_async_from_thread( + cls, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + args: tuple[Unpack[PosArgsT]], + token: object, + ) -> T_Retval: + trio_token = cast("trio.lowlevel.TrioToken | None", token) + try: + return trio.from_thread.run(func, *args, trio_token=trio_token) + except trio.RunFinishedError: + raise RunFinishedError from None + + @classmethod + def run_sync_from_thread( + cls, + func: Callable[[Unpack[PosArgsT]], T_Retval], + args: tuple[Unpack[PosArgsT]], + token: object, + ) -> T_Retval: + trio_token = cast("trio.lowlevel.TrioToken | None", token) + try: + return trio.from_thread.run_sync(func, *args, trio_token=trio_token) + except trio.RunFinishedError: + raise RunFinishedError from None + + @classmethod + async def open_process( + cls, + command: StrOrBytesPath | Sequence[StrOrBytesPath], + *, + stdin: int | IO[Any] | None, + stdout: int | IO[Any] | None, + stderr: int | IO[Any] | None, + **kwargs: Any, + ) -> Process: + def convert_item(item: StrOrBytesPath) -> str: + str_or_bytes = os.fspath(item) + if isinstance(str_or_bytes, str): + return str_or_bytes + else: + return os.fsdecode(str_or_bytes) + + if isinstance(command, (str, bytes, PathLike)): + process = await trio.lowlevel.open_process( + convert_item(command), + stdin=stdin, + stdout=stdout, + stderr=stderr, + shell=True, + **kwargs, + ) + else: + process = await trio.lowlevel.open_process( + [convert_item(item) for item in command], + stdin=stdin, + stdout=stdout, + stderr=stderr, + shell=False, + **kwargs, + ) + + stdin_stream = SendStreamWrapper(process.stdin) if process.stdin else None + stdout_stream = ReceiveStreamWrapper(process.stdout) if process.stdout else None + stderr_stream = ReceiveStreamWrapper(process.stderr) if process.stderr else None + return Process(process, stdin_stream, stdout_stream, stderr_stream) + + @classmethod + def setup_process_pool_exit_at_shutdown(cls, workers: set[abc.Process]) -> None: + trio.lowlevel.spawn_system_task(_shutdown_process_pool, workers) + + @classmethod + async def connect_tcp( + cls, host: str, port: int, local_address: IPSockAddrType | None = None + ) -> SocketStream: + family = socket.AF_INET6 if ":" in host else socket.AF_INET + trio_socket = trio.socket.socket(family) + trio_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + if local_address: + await trio_socket.bind(local_address) + + try: + await trio_socket.connect((host, port)) + except BaseException: + trio_socket.close() + raise + + return SocketStream(trio_socket) + + @classmethod + async def connect_unix(cls, path: str | bytes) -> abc.UNIXSocketStream: + trio_socket = trio.socket.socket(socket.AF_UNIX) + try: + await trio_socket.connect(path) + except BaseException: + trio_socket.close() + raise + + return UNIXSocketStream(trio_socket) + + @classmethod + def create_tcp_listener(cls, sock: socket.socket) -> abc.SocketListener: + return TCPSocketListener(sock) + + @classmethod + def create_unix_listener(cls, sock: socket.socket) -> abc.SocketListener: + return UNIXSocketListener(sock) + + @classmethod + async def create_udp_socket( + cls, + family: socket.AddressFamily, + local_address: IPSockAddrType | None, + remote_address: IPSockAddrType | None, + reuse_port: bool, + ) -> UDPSocket | ConnectedUDPSocket: + trio_socket = trio.socket.socket(family=family, type=socket.SOCK_DGRAM) + + if reuse_port: + trio_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) + + if local_address: + await trio_socket.bind(local_address) + + if remote_address: + await trio_socket.connect(remote_address) + return ConnectedUDPSocket(trio_socket) + else: + return UDPSocket(trio_socket) + + @classmethod + @overload + async def create_unix_datagram_socket( + cls, raw_socket: socket.socket, remote_path: None + ) -> abc.UNIXDatagramSocket: ... + + @classmethod + @overload + async def create_unix_datagram_socket( + cls, raw_socket: socket.socket, remote_path: str | bytes + ) -> abc.ConnectedUNIXDatagramSocket: ... + + @classmethod + async def create_unix_datagram_socket( + cls, raw_socket: socket.socket, remote_path: str | bytes | None + ) -> abc.UNIXDatagramSocket | abc.ConnectedUNIXDatagramSocket: + trio_socket = trio.socket.from_stdlib_socket(raw_socket) + + if remote_path: + await trio_socket.connect(remote_path) + return ConnectedUNIXDatagramSocket(trio_socket) + else: + return UNIXDatagramSocket(trio_socket) + + @classmethod + async def getaddrinfo( + cls, + host: bytes | str | None, + port: str | int | None, + *, + family: int | AddressFamily = 0, + type: int | SocketKind = 0, + proto: int = 0, + flags: int = 0, + ) -> Sequence[ + tuple[ + AddressFamily, + SocketKind, + int, + str, + tuple[str, int] | tuple[str, int, int, int] | tuple[int, bytes], + ] + ]: + return await trio.socket.getaddrinfo(host, port, family, type, proto, flags) + + @classmethod + async def getnameinfo( + cls, sockaddr: IPSockAddrType, flags: int = 0 + ) -> tuple[str, str]: + return await trio.socket.getnameinfo(sockaddr, flags) + + @classmethod + async def wait_readable(cls, obj: FileDescriptorLike) -> None: + try: + await wait_readable(obj) + except trio.ClosedResourceError as exc: + raise ClosedResourceError().with_traceback(exc.__traceback__) from None + except trio.BusyResourceError: + raise BusyResourceError("reading from") from None + + @classmethod + async def wait_writable(cls, obj: FileDescriptorLike) -> None: + try: + await wait_writable(obj) + except trio.ClosedResourceError as exc: + raise ClosedResourceError().with_traceback(exc.__traceback__) from None + except trio.BusyResourceError: + raise BusyResourceError("writing to") from None + + @classmethod + def notify_closing(cls, obj: FileDescriptorLike) -> None: + notify_closing(obj) + + @classmethod + async def wrap_listener_socket(cls, sock: socket.socket) -> abc.SocketListener: + return TCPSocketListener(sock) + + @classmethod + async def wrap_stream_socket(cls, sock: socket.socket) -> SocketStream: + trio_sock = trio.socket.from_stdlib_socket(sock) + return SocketStream(trio_sock) + + @classmethod + async def wrap_unix_stream_socket(cls, sock: socket.socket) -> UNIXSocketStream: + trio_sock = trio.socket.from_stdlib_socket(sock) + return UNIXSocketStream(trio_sock) + + @classmethod + async def wrap_udp_socket(cls, sock: socket.socket) -> UDPSocket: + trio_sock = trio.socket.from_stdlib_socket(sock) + return UDPSocket(trio_sock) + + @classmethod + async def wrap_connected_udp_socket(cls, sock: socket.socket) -> ConnectedUDPSocket: + trio_sock = trio.socket.from_stdlib_socket(sock) + return ConnectedUDPSocket(trio_sock) + + @classmethod + async def wrap_unix_datagram_socket(cls, sock: socket.socket) -> UNIXDatagramSocket: + trio_sock = trio.socket.from_stdlib_socket(sock) + return UNIXDatagramSocket(trio_sock) + + @classmethod + async def wrap_connected_unix_datagram_socket( + cls, sock: socket.socket + ) -> ConnectedUNIXDatagramSocket: + trio_sock = trio.socket.from_stdlib_socket(sock) + return ConnectedUNIXDatagramSocket(trio_sock) + + @classmethod + def current_default_thread_limiter(cls) -> CapacityLimiter: + try: + return _capacity_limiter_wrapper.get() + except LookupError: + limiter = CapacityLimiter( + original=trio.to_thread.current_default_thread_limiter() + ) + _capacity_limiter_wrapper.set(limiter) + return limiter + + @classmethod + def open_signal_receiver( + cls, *signals: Signals + ) -> AbstractContextManager[AsyncIterator[Signals]]: + return _SignalReceiver(signals) + + @classmethod + def get_current_task(cls) -> TaskInfo: + task = current_task() + return TrioTaskInfo(task) + + @classmethod + def get_running_tasks(cls) -> Sequence[TaskInfo]: + root_task = current_root_task() + assert root_task + task_infos = [TrioTaskInfo(root_task)] + nurseries = root_task.child_nurseries + while nurseries: + new_nurseries: list[trio.Nursery] = [] + for nursery in nurseries: + for task in nursery.child_tasks: + task_infos.append(TrioTaskInfo(task)) + new_nurseries.extend(task.child_nurseries) + + nurseries = new_nurseries + + return task_infos + + @classmethod + async def wait_all_tasks_blocked(cls) -> None: + from trio.testing import wait_all_tasks_blocked + + await wait_all_tasks_blocked() + + @classmethod + def create_test_runner(cls, options: dict[str, Any]) -> TestRunner: + return TestRunner(**options) + + +backend_class = TrioBackend diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/__init__.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_asyncio_selector_thread.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_asyncio_selector_thread.py new file mode 100755 index 0000000..9f35bae --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_asyncio_selector_thread.py @@ -0,0 +1,167 @@ +from __future__ import annotations + +import asyncio +import socket +import threading +from collections.abc import Callable +from selectors import EVENT_READ, EVENT_WRITE, DefaultSelector +from typing import TYPE_CHECKING, Any + +if TYPE_CHECKING: + from _typeshed import FileDescriptorLike + +_selector_lock = threading.Lock() +_selector: Selector | None = None + + +class Selector: + def __init__(self) -> None: + self._thread = threading.Thread(target=self.run, name="AnyIO socket selector") + self._selector = DefaultSelector() + self._send, self._receive = socket.socketpair() + self._send.setblocking(False) + self._receive.setblocking(False) + # This somewhat reduces the amount of memory wasted queueing up data + # for wakeups. With these settings, maximum number of 1-byte sends + # before getting BlockingIOError: + # Linux 4.8: 6 + # macOS (darwin 15.5): 1 + # Windows 10: 525347 + # Windows you're weird. (And on Windows setting SNDBUF to 0 makes send + # blocking, even on non-blocking sockets, so don't do that.) + self._receive.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 1) + self._send.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1) + # On Windows this is a TCP socket so this might matter. On other + # platforms this fails b/c AF_UNIX sockets aren't actually TCP. + try: + self._send.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + except OSError: + pass + + self._selector.register(self._receive, EVENT_READ) + self._closed = False + + def start(self) -> None: + self._thread.start() + threading._register_atexit(self._stop) # type: ignore[attr-defined] + + def _stop(self) -> None: + global _selector + self._closed = True + self._notify_self() + self._send.close() + self._thread.join() + self._selector.unregister(self._receive) + self._receive.close() + self._selector.close() + _selector = None + assert not self._selector.get_map(), ( + "selector still has registered file descriptors after shutdown" + ) + + def _notify_self(self) -> None: + try: + self._send.send(b"\x00") + except BlockingIOError: + pass + + def add_reader(self, fd: FileDescriptorLike, callback: Callable[[], Any]) -> None: + loop = asyncio.get_running_loop() + try: + key = self._selector.get_key(fd) + except KeyError: + self._selector.register(fd, EVENT_READ, {EVENT_READ: (loop, callback)}) + else: + if EVENT_READ in key.data: + raise ValueError( + "this file descriptor is already registered for reading" + ) + + key.data[EVENT_READ] = loop, callback + self._selector.modify(fd, key.events | EVENT_READ, key.data) + + self._notify_self() + + def add_writer(self, fd: FileDescriptorLike, callback: Callable[[], Any]) -> None: + loop = asyncio.get_running_loop() + try: + key = self._selector.get_key(fd) + except KeyError: + self._selector.register(fd, EVENT_WRITE, {EVENT_WRITE: (loop, callback)}) + else: + if EVENT_WRITE in key.data: + raise ValueError( + "this file descriptor is already registered for writing" + ) + + key.data[EVENT_WRITE] = loop, callback + self._selector.modify(fd, key.events | EVENT_WRITE, key.data) + + self._notify_self() + + def remove_reader(self, fd: FileDescriptorLike) -> bool: + try: + key = self._selector.get_key(fd) + except KeyError: + return False + + if new_events := key.events ^ EVENT_READ: + del key.data[EVENT_READ] + self._selector.modify(fd, new_events, key.data) + else: + self._selector.unregister(fd) + + return True + + def remove_writer(self, fd: FileDescriptorLike) -> bool: + try: + key = self._selector.get_key(fd) + except KeyError: + return False + + if new_events := key.events ^ EVENT_WRITE: + del key.data[EVENT_WRITE] + self._selector.modify(fd, new_events, key.data) + else: + self._selector.unregister(fd) + + return True + + def run(self) -> None: + while not self._closed: + for key, events in self._selector.select(): + if key.fileobj is self._receive: + try: + while self._receive.recv(4096): + pass + except BlockingIOError: + pass + + continue + + if events & EVENT_READ: + loop, callback = key.data[EVENT_READ] + self.remove_reader(key.fd) + try: + loop.call_soon_threadsafe(callback) + except RuntimeError: + pass # the loop was already closed + + if events & EVENT_WRITE: + loop, callback = key.data[EVENT_WRITE] + self.remove_writer(key.fd) + try: + loop.call_soon_threadsafe(callback) + except RuntimeError: + pass # the loop was already closed + + +def get_selector() -> Selector: + global _selector + + with _selector_lock: + if _selector is None: + _selector = Selector() + _selector.start() + + return _selector diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_contextmanagers.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_contextmanagers.py new file mode 100755 index 0000000..302f32b --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_contextmanagers.py @@ -0,0 +1,200 @@ +from __future__ import annotations + +from abc import abstractmethod +from contextlib import AbstractAsyncContextManager, AbstractContextManager +from inspect import isasyncgen, iscoroutine, isgenerator +from types import TracebackType +from typing import Protocol, TypeVar, cast, final + +_T_co = TypeVar("_T_co", covariant=True) +_ExitT_co = TypeVar("_ExitT_co", covariant=True, bound="bool | None") + + +class _SupportsCtxMgr(Protocol[_T_co, _ExitT_co]): + def __contextmanager__(self) -> AbstractContextManager[_T_co, _ExitT_co]: ... + + +class _SupportsAsyncCtxMgr(Protocol[_T_co, _ExitT_co]): + def __asynccontextmanager__( + self, + ) -> AbstractAsyncContextManager[_T_co, _ExitT_co]: ... + + +class ContextManagerMixin: + """ + Mixin class providing context manager functionality via a generator-based + implementation. + + This class allows you to implement a context manager via :meth:`__contextmanager__` + which should return a generator. The mechanics are meant to mirror those of + :func:`@contextmanager `. + + .. note:: Classes using this mix-in are not reentrant as context managers, meaning + that once you enter it, you can't re-enter before first exiting it. + + .. seealso:: :doc:`contextmanagers` + """ + + __cm: AbstractContextManager[object, bool | None] | None = None + + @final + def __enter__(self: _SupportsCtxMgr[_T_co, bool | None]) -> _T_co: + # Needed for mypy to assume self still has the __cm member + assert isinstance(self, ContextManagerMixin) + if self.__cm is not None: + raise RuntimeError( + f"this {self.__class__.__qualname__} has already been entered" + ) + + cm = self.__contextmanager__() + if not isinstance(cm, AbstractContextManager): + if isgenerator(cm): + raise TypeError( + "__contextmanager__() returned a generator object instead of " + "a context manager. Did you forget to add the @contextmanager " + "decorator?" + ) + + raise TypeError( + f"__contextmanager__() did not return a context manager object, " + f"but {cm.__class__!r}" + ) + + if cm is self: + raise TypeError( + f"{self.__class__.__qualname__}.__contextmanager__() returned " + f"self. Did you forget to add the @contextmanager decorator and a " + f"'yield' statement?" + ) + + value = cm.__enter__() + self.__cm = cm + return value + + @final + def __exit__( + self: _SupportsCtxMgr[object, _ExitT_co], + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> _ExitT_co: + # Needed for mypy to assume self still has the __cm member + assert isinstance(self, ContextManagerMixin) + if self.__cm is None: + raise RuntimeError( + f"this {self.__class__.__qualname__} has not been entered yet" + ) + + # Prevent circular references + cm = self.__cm + del self.__cm + + return cast(_ExitT_co, cm.__exit__(exc_type, exc_val, exc_tb)) + + @abstractmethod + def __contextmanager__(self) -> AbstractContextManager[object, bool | None]: + """ + Implement your context manager logic here. + + This method **must** be decorated with + :func:`@contextmanager `. + + .. note:: Remember that the ``yield`` will raise any exception raised in the + enclosed context block, so use a ``finally:`` block to clean up resources! + + :return: a context manager object + """ + + +class AsyncContextManagerMixin: + """ + Mixin class providing async context manager functionality via a generator-based + implementation. + + This class allows you to implement a context manager via + :meth:`__asynccontextmanager__`. The mechanics are meant to mirror those of + :func:`@asynccontextmanager `. + + .. note:: Classes using this mix-in are not reentrant as context managers, meaning + that once you enter it, you can't re-enter before first exiting it. + + .. seealso:: :doc:`contextmanagers` + """ + + __cm: AbstractAsyncContextManager[object, bool | None] | None = None + + @final + async def __aenter__(self: _SupportsAsyncCtxMgr[_T_co, bool | None]) -> _T_co: + # Needed for mypy to assume self still has the __cm member + assert isinstance(self, AsyncContextManagerMixin) + if self.__cm is not None: + raise RuntimeError( + f"this {self.__class__.__qualname__} has already been entered" + ) + + cm = self.__asynccontextmanager__() + if not isinstance(cm, AbstractAsyncContextManager): + if isasyncgen(cm): + raise TypeError( + "__asynccontextmanager__() returned an async generator instead of " + "an async context manager. Did you forget to add the " + "@asynccontextmanager decorator?" + ) + elif iscoroutine(cm): + cm.close() + raise TypeError( + "__asynccontextmanager__() returned a coroutine object instead of " + "an async context manager. Did you forget to add the " + "@asynccontextmanager decorator and a 'yield' statement?" + ) + + raise TypeError( + f"__asynccontextmanager__() did not return an async context manager, " + f"but {cm.__class__!r}" + ) + + if cm is self: + raise TypeError( + f"{self.__class__.__qualname__}.__asynccontextmanager__() returned " + f"self. Did you forget to add the @asynccontextmanager decorator and a " + f"'yield' statement?" + ) + + value = await cm.__aenter__() + self.__cm = cm + return value + + @final + async def __aexit__( + self: _SupportsAsyncCtxMgr[object, _ExitT_co], + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> _ExitT_co: + assert isinstance(self, AsyncContextManagerMixin) + if self.__cm is None: + raise RuntimeError( + f"this {self.__class__.__qualname__} has not been entered yet" + ) + + # Prevent circular references + cm = self.__cm + del self.__cm + + return cast(_ExitT_co, await cm.__aexit__(exc_type, exc_val, exc_tb)) + + @abstractmethod + def __asynccontextmanager__( + self, + ) -> AbstractAsyncContextManager[object, bool | None]: + """ + Implement your async context manager logic here. + + This method **must** be decorated with + :func:`@asynccontextmanager `. + + .. note:: Remember that the ``yield`` will raise any exception raised in the + enclosed context block, so use a ``finally:`` block to clean up resources! + + :return: an async context manager object + """ diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_eventloop.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_eventloop.py new file mode 100755 index 0000000..59a69cc --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_eventloop.py @@ -0,0 +1,234 @@ +from __future__ import annotations + +import math +import sys +import threading +from collections.abc import Awaitable, Callable, Generator +from contextlib import contextmanager +from contextvars import Token +from importlib import import_module +from typing import TYPE_CHECKING, Any, TypeVar + +from ._exceptions import NoEventLoopError + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +sniffio: Any +try: + import sniffio +except ModuleNotFoundError: + sniffio = None + +if TYPE_CHECKING: + from ..abc import AsyncBackend + +# This must be updated when new backends are introduced +BACKENDS = "asyncio", "trio" + +T_Retval = TypeVar("T_Retval") +PosArgsT = TypeVarTuple("PosArgsT") + +threadlocals = threading.local() +loaded_backends: dict[str, type[AsyncBackend]] = {} + + +def run( + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + *args: Unpack[PosArgsT], + backend: str = "asyncio", + backend_options: dict[str, Any] | None = None, +) -> T_Retval: + """ + Run the given coroutine function in an asynchronous event loop. + + The current thread must not be already running an event loop. + + :param func: a coroutine function + :param args: positional arguments to ``func`` + :param backend: name of the asynchronous event loop implementation – currently + either ``asyncio`` or ``trio`` + :param backend_options: keyword arguments to call the backend ``run()`` + implementation with (documented :ref:`here `) + :return: the return value of the coroutine function + :raises RuntimeError: if an asynchronous event loop is already running in this + thread + :raises LookupError: if the named backend is not found + + """ + if asynclib_name := current_async_library(): + raise RuntimeError(f"Already running {asynclib_name} in this thread") + + try: + async_backend = get_async_backend(backend) + except ImportError as exc: + raise LookupError(f"No such backend: {backend}") from exc + + token = None + if asynclib_name is None: + # Since we're in control of the event loop, we can cache the name of the async + # library + token = set_current_async_library(backend) + + try: + backend_options = backend_options or {} + return async_backend.run(func, args, {}, backend_options) + finally: + reset_current_async_library(token) + + +async def sleep(delay: float) -> None: + """ + Pause the current task for the specified duration. + + :param delay: the duration, in seconds + + """ + return await get_async_backend().sleep(delay) + + +async def sleep_forever() -> None: + """ + Pause the current task until it's cancelled. + + This is a shortcut for ``sleep(math.inf)``. + + .. versionadded:: 3.1 + + """ + await sleep(math.inf) + + +async def sleep_until(deadline: float) -> None: + """ + Pause the current task until the given time. + + :param deadline: the absolute time to wake up at (according to the internal + monotonic clock of the event loop) + + .. versionadded:: 3.1 + + """ + now = current_time() + await sleep(max(deadline - now, 0)) + + +def current_time() -> float: + """ + Return the current value of the event loop's internal clock. + + :return: the clock value (seconds) + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().current_time() + + +def get_all_backends() -> tuple[str, ...]: + """Return a tuple of the names of all built-in backends.""" + return BACKENDS + + +def get_available_backends() -> tuple[str, ...]: + """ + Test for the availability of built-in backends. + + :return a tuple of the built-in backend names that were successfully imported + + .. versionadded:: 4.12 + + """ + available_backends: list[str] = [] + for backend_name in get_all_backends(): + try: + get_async_backend(backend_name) + except ImportError: + continue + + available_backends.append(backend_name) + + return tuple(available_backends) + + +def get_cancelled_exc_class() -> type[BaseException]: + """ + Return the current async library's cancellation exception class. + + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().cancelled_exception_class() + + +# +# Private API +# + + +@contextmanager +def claim_worker_thread( + backend_class: type[AsyncBackend], token: object +) -> Generator[Any, None, None]: + from ..lowlevel import EventLoopToken + + threadlocals.current_token = EventLoopToken(backend_class, token) + try: + yield + finally: + del threadlocals.current_token + + +def get_async_backend(asynclib_name: str | None = None) -> type[AsyncBackend]: + if asynclib_name is None: + asynclib_name = current_async_library() + if not asynclib_name: + raise NoEventLoopError( + f"Not currently running on any asynchronous event loop. " + f"Available async backends: {', '.join(get_all_backends())}" + ) + + # We use our own dict instead of sys.modules to get the already imported back-end + # class because the appropriate modules in sys.modules could potentially be only + # partially initialized + try: + return loaded_backends[asynclib_name] + except KeyError: + module = import_module(f"anyio._backends._{asynclib_name}") + loaded_backends[asynclib_name] = module.backend_class + return module.backend_class + + +def current_async_library() -> str | None: + if sniffio is None: + # If sniffio is not installed, we assume we're either running asyncio or nothing + import asyncio + + try: + asyncio.get_running_loop() + return "asyncio" + except RuntimeError: + pass + else: + try: + return sniffio.current_async_library() + except sniffio.AsyncLibraryNotFoundError: + pass + + return None + + +def set_current_async_library(asynclib_name: str | None) -> Token | None: + # no-op if sniffio is not installed + if sniffio is None: + return None + + return sniffio.current_async_library_cvar.set(asynclib_name) + + +def reset_current_async_library(token: Token | None) -> None: + if token is not None: + sniffio.current_async_library_cvar.reset(token) diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_exceptions.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_exceptions.py new file mode 100755 index 0000000..3776bed --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_exceptions.py @@ -0,0 +1,156 @@ +from __future__ import annotations + +import sys +from collections.abc import Generator +from textwrap import dedent +from typing import Any + +if sys.version_info < (3, 11): + from exceptiongroup import BaseExceptionGroup + + +class BrokenResourceError(Exception): + """ + Raised when trying to use a resource that has been rendered unusable due to external + causes (e.g. a send stream whose peer has disconnected). + """ + + +class BrokenWorkerProcess(Exception): + """ + Raised by :meth:`~anyio.to_process.run_sync` if the worker process terminates abruptly or + otherwise misbehaves. + """ + + +class BrokenWorkerInterpreter(Exception): + """ + Raised by :meth:`~anyio.to_interpreter.run_sync` if an unexpected exception is + raised in the subinterpreter. + """ + + def __init__(self, excinfo: Any): + # This was adapted from concurrent.futures.interpreter.ExecutionFailed + msg = excinfo.formatted + if not msg: + if excinfo.type and excinfo.msg: + msg = f"{excinfo.type.__name__}: {excinfo.msg}" + else: + msg = excinfo.type.__name__ or excinfo.msg + + super().__init__(msg) + self.excinfo = excinfo + + def __str__(self) -> str: + try: + formatted = self.excinfo.errdisplay + except Exception: + return super().__str__() + else: + return dedent( + f""" + {super().__str__()} + + Uncaught in the interpreter: + + {formatted} + """.strip() + ) + + +class BusyResourceError(Exception): + """ + Raised when two tasks are trying to read from or write to the same resource + concurrently. + """ + + def __init__(self, action: str): + super().__init__(f"Another task is already {action} this resource") + + +class ClosedResourceError(Exception): + """Raised when trying to use a resource that has been closed.""" + + +class ConnectionFailed(OSError): + """ + Raised when a connection attempt fails. + + .. note:: This class inherits from :exc:`OSError` for backwards compatibility. + """ + + +def iterate_exceptions( + exception: BaseException, +) -> Generator[BaseException, None, None]: + if isinstance(exception, BaseExceptionGroup): + for exc in exception.exceptions: + yield from iterate_exceptions(exc) + else: + yield exception + + +class DelimiterNotFound(Exception): + """ + Raised during + :meth:`~anyio.streams.buffered.BufferedByteReceiveStream.receive_until` if the + maximum number of bytes has been read without the delimiter being found. + """ + + def __init__(self, max_bytes: int) -> None: + super().__init__( + f"The delimiter was not found among the first {max_bytes} bytes" + ) + + +class EndOfStream(Exception): + """ + Raised when trying to read from a stream that has been closed from the other end. + """ + + +class IncompleteRead(Exception): + """ + Raised during + :meth:`~anyio.streams.buffered.BufferedByteReceiveStream.receive_exactly` or + :meth:`~anyio.streams.buffered.BufferedByteReceiveStream.receive_until` if the + connection is closed before the requested amount of bytes has been read. + """ + + def __init__(self) -> None: + super().__init__( + "The stream was closed before the read operation could be completed" + ) + + +class TypedAttributeLookupError(LookupError): + """ + Raised by :meth:`~anyio.TypedAttributeProvider.extra` when the given typed attribute + is not found and no default value has been given. + """ + + +class WouldBlock(Exception): + """Raised by ``X_nowait`` functions if ``X()`` would block.""" + + +class NoEventLoopError(RuntimeError): + """ + Raised by several functions that require an event loop to be running in the current + thread when there is no running event loop. + + This is also raised by :func:`.from_thread.run` and :func:`.from_thread.run_sync` + if not calling from an AnyIO worker thread, and no ``token`` was passed. + """ + + +class RunFinishedError(RuntimeError): + """ + Raised by :func:`.from_thread.run` and :func:`.from_thread.run_sync` if the event + loop associated with the explicitly passed token has already finished. + """ + + def __init__(self) -> None: + super().__init__( + "The event loop associated with the given token has already finished" + ) diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_fileio.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_fileio.py new file mode 100755 index 0000000..061f0d7 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_fileio.py @@ -0,0 +1,797 @@ +from __future__ import annotations + +import os +import pathlib +import sys +from collections.abc import ( + AsyncIterator, + Callable, + Iterable, + Iterator, + Sequence, +) +from dataclasses import dataclass +from functools import partial +from os import PathLike +from typing import ( + IO, + TYPE_CHECKING, + Any, + AnyStr, + ClassVar, + Final, + Generic, + overload, +) + +from .. import to_thread +from ..abc import AsyncResource + +if TYPE_CHECKING: + from types import ModuleType + + from _typeshed import OpenBinaryMode, OpenTextMode, ReadableBuffer, WriteableBuffer +else: + ReadableBuffer = OpenBinaryMode = OpenTextMode = WriteableBuffer = object + + +class AsyncFile(AsyncResource, Generic[AnyStr]): + """ + An asynchronous file object. + + This class wraps a standard file object and provides async friendly versions of the + following blocking methods (where available on the original file object): + + * read + * read1 + * readline + * readlines + * readinto + * readinto1 + * write + * writelines + * truncate + * seek + * tell + * flush + + All other methods are directly passed through. + + This class supports the asynchronous context manager protocol which closes the + underlying file at the end of the context block. + + This class also supports asynchronous iteration:: + + async with await open_file(...) as f: + async for line in f: + print(line) + """ + + def __init__(self, fp: IO[AnyStr]) -> None: + self._fp: Any = fp + + def __getattr__(self, name: str) -> object: + return getattr(self._fp, name) + + @property + def wrapped(self) -> IO[AnyStr]: + """The wrapped file object.""" + return self._fp + + async def __aiter__(self) -> AsyncIterator[AnyStr]: + while True: + line = await self.readline() + if line: + yield line + else: + break + + async def aclose(self) -> None: + return await to_thread.run_sync(self._fp.close) + + async def read(self, size: int = -1) -> AnyStr: + return await to_thread.run_sync(self._fp.read, size) + + async def read1(self: AsyncFile[bytes], size: int = -1) -> bytes: + return await to_thread.run_sync(self._fp.read1, size) + + async def readline(self) -> AnyStr: + return await to_thread.run_sync(self._fp.readline) + + async def readlines(self) -> list[AnyStr]: + return await to_thread.run_sync(self._fp.readlines) + + async def readinto(self: AsyncFile[bytes], b: WriteableBuffer) -> int: + return await to_thread.run_sync(self._fp.readinto, b) + + async def readinto1(self: AsyncFile[bytes], b: WriteableBuffer) -> int: + return await to_thread.run_sync(self._fp.readinto1, b) + + @overload + async def write(self: AsyncFile[bytes], b: ReadableBuffer) -> int: ... + + @overload + async def write(self: AsyncFile[str], b: str) -> int: ... + + async def write(self, b: ReadableBuffer | str) -> int: + return await to_thread.run_sync(self._fp.write, b) + + @overload + async def writelines( + self: AsyncFile[bytes], lines: Iterable[ReadableBuffer] + ) -> None: ... + + @overload + async def writelines(self: AsyncFile[str], lines: Iterable[str]) -> None: ... + + async def writelines(self, lines: Iterable[ReadableBuffer] | Iterable[str]) -> None: + return await to_thread.run_sync(self._fp.writelines, lines) + + async def truncate(self, size: int | None = None) -> int: + return await to_thread.run_sync(self._fp.truncate, size) + + async def seek(self, offset: int, whence: int | None = os.SEEK_SET) -> int: + return await to_thread.run_sync(self._fp.seek, offset, whence) + + async def tell(self) -> int: + return await to_thread.run_sync(self._fp.tell) + + async def flush(self) -> None: + return await to_thread.run_sync(self._fp.flush) + + +@overload +async def open_file( + file: str | PathLike[str] | int, + mode: OpenBinaryMode, + buffering: int = ..., + encoding: str | None = ..., + errors: str | None = ..., + newline: str | None = ..., + closefd: bool = ..., + opener: Callable[[str, int], int] | None = ..., +) -> AsyncFile[bytes]: ... + + +@overload +async def open_file( + file: str | PathLike[str] | int, + mode: OpenTextMode = ..., + buffering: int = ..., + encoding: str | None = ..., + errors: str | None = ..., + newline: str | None = ..., + closefd: bool = ..., + opener: Callable[[str, int], int] | None = ..., +) -> AsyncFile[str]: ... + + +async def open_file( + file: str | PathLike[str] | int, + mode: str = "r", + buffering: int = -1, + encoding: str | None = None, + errors: str | None = None, + newline: str | None = None, + closefd: bool = True, + opener: Callable[[str, int], int] | None = None, +) -> AsyncFile[Any]: + """ + Open a file asynchronously. + + The arguments are exactly the same as for the builtin :func:`open`. + + :return: an asynchronous file object + + """ + fp = await to_thread.run_sync( + open, file, mode, buffering, encoding, errors, newline, closefd, opener + ) + return AsyncFile(fp) + + +def wrap_file(file: IO[AnyStr]) -> AsyncFile[AnyStr]: + """ + Wrap an existing file as an asynchronous file. + + :param file: an existing file-like object + :return: an asynchronous file object + + """ + return AsyncFile(file) + + +@dataclass(eq=False) +class _PathIterator(AsyncIterator["Path"]): + iterator: Iterator[PathLike[str]] + + async def __anext__(self) -> Path: + nextval = await to_thread.run_sync( + next, self.iterator, None, abandon_on_cancel=True + ) + if nextval is None: + raise StopAsyncIteration from None + + return Path(nextval) + + +class Path: + """ + An asynchronous version of :class:`pathlib.Path`. + + This class cannot be substituted for :class:`pathlib.Path` or + :class:`pathlib.PurePath`, but it is compatible with the :class:`os.PathLike` + interface. + + It implements the Python 3.10 version of :class:`pathlib.Path` interface, except for + the deprecated :meth:`~pathlib.Path.link_to` method. + + Some methods may be unavailable or have limited functionality, based on the Python + version: + + * :meth:`~pathlib.Path.copy` (available on Python 3.14 or later) + * :meth:`~pathlib.Path.copy_into` (available on Python 3.14 or later) + * :meth:`~pathlib.Path.from_uri` (available on Python 3.13 or later) + * :meth:`~pathlib.PurePath.full_match` (available on Python 3.13 or later) + * :attr:`~pathlib.Path.info` (available on Python 3.14 or later) + * :meth:`~pathlib.Path.is_junction` (available on Python 3.12 or later) + * :meth:`~pathlib.PurePath.match` (the ``case_sensitive`` parameter is only + available on Python 3.13 or later) + * :meth:`~pathlib.Path.move` (available on Python 3.14 or later) + * :meth:`~pathlib.Path.move_into` (available on Python 3.14 or later) + * :meth:`~pathlib.PurePath.relative_to` (the ``walk_up`` parameter is only available + on Python 3.12 or later) + * :meth:`~pathlib.Path.walk` (available on Python 3.12 or later) + + Any methods that do disk I/O need to be awaited on. These methods are: + + * :meth:`~pathlib.Path.absolute` + * :meth:`~pathlib.Path.chmod` + * :meth:`~pathlib.Path.cwd` + * :meth:`~pathlib.Path.exists` + * :meth:`~pathlib.Path.expanduser` + * :meth:`~pathlib.Path.group` + * :meth:`~pathlib.Path.hardlink_to` + * :meth:`~pathlib.Path.home` + * :meth:`~pathlib.Path.is_block_device` + * :meth:`~pathlib.Path.is_char_device` + * :meth:`~pathlib.Path.is_dir` + * :meth:`~pathlib.Path.is_fifo` + * :meth:`~pathlib.Path.is_file` + * :meth:`~pathlib.Path.is_junction` + * :meth:`~pathlib.Path.is_mount` + * :meth:`~pathlib.Path.is_socket` + * :meth:`~pathlib.Path.is_symlink` + * :meth:`~pathlib.Path.lchmod` + * :meth:`~pathlib.Path.lstat` + * :meth:`~pathlib.Path.mkdir` + * :meth:`~pathlib.Path.open` + * :meth:`~pathlib.Path.owner` + * :meth:`~pathlib.Path.read_bytes` + * :meth:`~pathlib.Path.read_text` + * :meth:`~pathlib.Path.readlink` + * :meth:`~pathlib.Path.rename` + * :meth:`~pathlib.Path.replace` + * :meth:`~pathlib.Path.resolve` + * :meth:`~pathlib.Path.rmdir` + * :meth:`~pathlib.Path.samefile` + * :meth:`~pathlib.Path.stat` + * :meth:`~pathlib.Path.symlink_to` + * :meth:`~pathlib.Path.touch` + * :meth:`~pathlib.Path.unlink` + * :meth:`~pathlib.Path.walk` + * :meth:`~pathlib.Path.write_bytes` + * :meth:`~pathlib.Path.write_text` + + Additionally, the following methods return an async iterator yielding + :class:`~.Path` objects: + + * :meth:`~pathlib.Path.glob` + * :meth:`~pathlib.Path.iterdir` + * :meth:`~pathlib.Path.rglob` + """ + + __slots__ = "_path", "__weakref__" + + __weakref__: Any + + def __init__(self, *args: str | PathLike[str]) -> None: + self._path: Final[pathlib.Path] = pathlib.Path(*args) + + def __fspath__(self) -> str: + return self._path.__fspath__() + + def __str__(self) -> str: + return self._path.__str__() + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({self.as_posix()!r})" + + def __bytes__(self) -> bytes: + return self._path.__bytes__() + + def __hash__(self) -> int: + return self._path.__hash__() + + def __eq__(self, other: object) -> bool: + target = other._path if isinstance(other, Path) else other + return self._path.__eq__(target) + + def __lt__(self, other: pathlib.PurePath | Path) -> bool: + target = other._path if isinstance(other, Path) else other + return self._path.__lt__(target) + + def __le__(self, other: pathlib.PurePath | Path) -> bool: + target = other._path if isinstance(other, Path) else other + return self._path.__le__(target) + + def __gt__(self, other: pathlib.PurePath | Path) -> bool: + target = other._path if isinstance(other, Path) else other + return self._path.__gt__(target) + + def __ge__(self, other: pathlib.PurePath | Path) -> bool: + target = other._path if isinstance(other, Path) else other + return self._path.__ge__(target) + + def __truediv__(self, other: str | PathLike[str]) -> Path: + return Path(self._path / other) + + def __rtruediv__(self, other: str | PathLike[str]) -> Path: + return Path(other) / self + + @property + def parts(self) -> tuple[str, ...]: + return self._path.parts + + @property + def drive(self) -> str: + return self._path.drive + + @property + def root(self) -> str: + return self._path.root + + @property + def anchor(self) -> str: + return self._path.anchor + + @property + def parents(self) -> Sequence[Path]: + return tuple(Path(p) for p in self._path.parents) + + @property + def parent(self) -> Path: + return Path(self._path.parent) + + @property + def name(self) -> str: + return self._path.name + + @property + def suffix(self) -> str: + return self._path.suffix + + @property + def suffixes(self) -> list[str]: + return self._path.suffixes + + @property + def stem(self) -> str: + return self._path.stem + + async def absolute(self) -> Path: + path = await to_thread.run_sync(self._path.absolute) + return Path(path) + + def as_posix(self) -> str: + return self._path.as_posix() + + def as_uri(self) -> str: + return self._path.as_uri() + + if sys.version_info >= (3, 13): + parser: ClassVar[ModuleType] = pathlib.Path.parser + + @classmethod + def from_uri(cls, uri: str) -> Path: + return Path(pathlib.Path.from_uri(uri)) + + def full_match( + self, path_pattern: str, *, case_sensitive: bool | None = None + ) -> bool: + return self._path.full_match(path_pattern, case_sensitive=case_sensitive) + + def match( + self, path_pattern: str, *, case_sensitive: bool | None = None + ) -> bool: + return self._path.match(path_pattern, case_sensitive=case_sensitive) + else: + + def match(self, path_pattern: str) -> bool: + return self._path.match(path_pattern) + + if sys.version_info >= (3, 14): + + @property + def info(self) -> Any: # TODO: add return type annotation when Typeshed gets it + return self._path.info + + async def copy( + self, + target: str | os.PathLike[str], + *, + follow_symlinks: bool = True, + preserve_metadata: bool = False, + ) -> Path: + func = partial( + self._path.copy, + follow_symlinks=follow_symlinks, + preserve_metadata=preserve_metadata, + ) + return Path(await to_thread.run_sync(func, pathlib.Path(target))) + + async def copy_into( + self, + target_dir: str | os.PathLike[str], + *, + follow_symlinks: bool = True, + preserve_metadata: bool = False, + ) -> Path: + func = partial( + self._path.copy_into, + follow_symlinks=follow_symlinks, + preserve_metadata=preserve_metadata, + ) + return Path(await to_thread.run_sync(func, pathlib.Path(target_dir))) + + async def move(self, target: str | os.PathLike[str]) -> Path: + # Upstream does not handle anyio.Path properly as a PathLike + target = pathlib.Path(target) + return Path(await to_thread.run_sync(self._path.move, target)) + + async def move_into( + self, + target_dir: str | os.PathLike[str], + ) -> Path: + return Path(await to_thread.run_sync(self._path.move_into, target_dir)) + + def is_relative_to(self, other: str | PathLike[str]) -> bool: + try: + self.relative_to(other) + return True + except ValueError: + return False + + async def chmod(self, mode: int, *, follow_symlinks: bool = True) -> None: + func = partial(os.chmod, follow_symlinks=follow_symlinks) + return await to_thread.run_sync(func, self._path, mode) + + @classmethod + async def cwd(cls) -> Path: + path = await to_thread.run_sync(pathlib.Path.cwd) + return cls(path) + + async def exists(self) -> bool: + return await to_thread.run_sync(self._path.exists, abandon_on_cancel=True) + + async def expanduser(self) -> Path: + return Path( + await to_thread.run_sync(self._path.expanduser, abandon_on_cancel=True) + ) + + if sys.version_info < (3, 12): + # Python 3.11 and earlier + def glob(self, pattern: str) -> AsyncIterator[Path]: + gen = self._path.glob(pattern) + return _PathIterator(gen) + elif (3, 12) <= sys.version_info < (3, 13): + # changed in Python 3.12: + # - The case_sensitive parameter was added. + def glob( + self, + pattern: str, + *, + case_sensitive: bool | None = None, + ) -> AsyncIterator[Path]: + gen = self._path.glob(pattern, case_sensitive=case_sensitive) + return _PathIterator(gen) + elif sys.version_info >= (3, 13): + # Changed in Python 3.13: + # - The recurse_symlinks parameter was added. + # - The pattern parameter accepts a path-like object. + def glob( # type: ignore[misc] # mypy doesn't allow for differing signatures in a conditional block + self, + pattern: str | PathLike[str], + *, + case_sensitive: bool | None = None, + recurse_symlinks: bool = False, + ) -> AsyncIterator[Path]: + gen = self._path.glob( + pattern, # type: ignore[arg-type] + case_sensitive=case_sensitive, + recurse_symlinks=recurse_symlinks, + ) + return _PathIterator(gen) + + async def group(self) -> str: + return await to_thread.run_sync(self._path.group, abandon_on_cancel=True) + + async def hardlink_to( + self, target: str | bytes | PathLike[str] | PathLike[bytes] + ) -> None: + if isinstance(target, Path): + target = target._path + + await to_thread.run_sync(os.link, target, self) + + @classmethod + async def home(cls) -> Path: + home_path = await to_thread.run_sync(pathlib.Path.home) + return cls(home_path) + + def is_absolute(self) -> bool: + return self._path.is_absolute() + + async def is_block_device(self) -> bool: + return await to_thread.run_sync( + self._path.is_block_device, abandon_on_cancel=True + ) + + async def is_char_device(self) -> bool: + return await to_thread.run_sync( + self._path.is_char_device, abandon_on_cancel=True + ) + + async def is_dir(self) -> bool: + return await to_thread.run_sync(self._path.is_dir, abandon_on_cancel=True) + + async def is_fifo(self) -> bool: + return await to_thread.run_sync(self._path.is_fifo, abandon_on_cancel=True) + + async def is_file(self) -> bool: + return await to_thread.run_sync(self._path.is_file, abandon_on_cancel=True) + + if sys.version_info >= (3, 12): + + async def is_junction(self) -> bool: + return await to_thread.run_sync(self._path.is_junction) + + async def is_mount(self) -> bool: + return await to_thread.run_sync( + os.path.ismount, self._path, abandon_on_cancel=True + ) + + def is_reserved(self) -> bool: + return self._path.is_reserved() + + async def is_socket(self) -> bool: + return await to_thread.run_sync(self._path.is_socket, abandon_on_cancel=True) + + async def is_symlink(self) -> bool: + return await to_thread.run_sync(self._path.is_symlink, abandon_on_cancel=True) + + async def iterdir(self) -> AsyncIterator[Path]: + gen = ( + self._path.iterdir() + if sys.version_info < (3, 13) + else await to_thread.run_sync(self._path.iterdir, abandon_on_cancel=True) + ) + async for path in _PathIterator(gen): + yield path + + def joinpath(self, *args: str | PathLike[str]) -> Path: + return Path(self._path.joinpath(*args)) + + async def lchmod(self, mode: int) -> None: + await to_thread.run_sync(self._path.lchmod, mode) + + async def lstat(self) -> os.stat_result: + return await to_thread.run_sync(self._path.lstat, abandon_on_cancel=True) + + async def mkdir( + self, mode: int = 0o777, parents: bool = False, exist_ok: bool = False + ) -> None: + await to_thread.run_sync(self._path.mkdir, mode, parents, exist_ok) + + @overload + async def open( + self, + mode: OpenBinaryMode, + buffering: int = ..., + encoding: str | None = ..., + errors: str | None = ..., + newline: str | None = ..., + ) -> AsyncFile[bytes]: ... + + @overload + async def open( + self, + mode: OpenTextMode = ..., + buffering: int = ..., + encoding: str | None = ..., + errors: str | None = ..., + newline: str | None = ..., + ) -> AsyncFile[str]: ... + + async def open( + self, + mode: str = "r", + buffering: int = -1, + encoding: str | None = None, + errors: str | None = None, + newline: str | None = None, + ) -> AsyncFile[Any]: + fp = await to_thread.run_sync( + self._path.open, mode, buffering, encoding, errors, newline + ) + return AsyncFile(fp) + + async def owner(self) -> str: + return await to_thread.run_sync(self._path.owner, abandon_on_cancel=True) + + async def read_bytes(self) -> bytes: + return await to_thread.run_sync(self._path.read_bytes) + + async def read_text( + self, encoding: str | None = None, errors: str | None = None + ) -> str: + return await to_thread.run_sync(self._path.read_text, encoding, errors) + + if sys.version_info >= (3, 12): + + def relative_to( + self, *other: str | PathLike[str], walk_up: bool = False + ) -> Path: + # relative_to() should work with any PathLike but it doesn't + others = [pathlib.Path(other) for other in other] + return Path(self._path.relative_to(*others, walk_up=walk_up)) + + else: + + def relative_to(self, *other: str | PathLike[str]) -> Path: + return Path(self._path.relative_to(*other)) + + async def readlink(self) -> Path: + target = await to_thread.run_sync(os.readlink, self._path) + return Path(target) + + async def rename(self, target: str | pathlib.PurePath | Path) -> Path: + if isinstance(target, Path): + target = target._path + + await to_thread.run_sync(self._path.rename, target) + return Path(target) + + async def replace(self, target: str | pathlib.PurePath | Path) -> Path: + if isinstance(target, Path): + target = target._path + + await to_thread.run_sync(self._path.replace, target) + return Path(target) + + async def resolve(self, strict: bool = False) -> Path: + func = partial(self._path.resolve, strict=strict) + return Path(await to_thread.run_sync(func, abandon_on_cancel=True)) + + if sys.version_info < (3, 12): + # Pre Python 3.12 + def rglob(self, pattern: str) -> AsyncIterator[Path]: + gen = self._path.rglob(pattern) + return _PathIterator(gen) + elif (3, 12) <= sys.version_info < (3, 13): + # Changed in Python 3.12: + # - The case_sensitive parameter was added. + def rglob( + self, pattern: str, *, case_sensitive: bool | None = None + ) -> AsyncIterator[Path]: + gen = self._path.rglob(pattern, case_sensitive=case_sensitive) + return _PathIterator(gen) + elif sys.version_info >= (3, 13): + # Changed in Python 3.13: + # - The recurse_symlinks parameter was added. + # - The pattern parameter accepts a path-like object. + def rglob( # type: ignore[misc] # mypy doesn't allow for differing signatures in a conditional block + self, + pattern: str | PathLike[str], + *, + case_sensitive: bool | None = None, + recurse_symlinks: bool = False, + ) -> AsyncIterator[Path]: + gen = self._path.rglob( + pattern, # type: ignore[arg-type] + case_sensitive=case_sensitive, + recurse_symlinks=recurse_symlinks, + ) + return _PathIterator(gen) + + async def rmdir(self) -> None: + await to_thread.run_sync(self._path.rmdir) + + async def samefile(self, other_path: str | PathLike[str]) -> bool: + if isinstance(other_path, Path): + other_path = other_path._path + + return await to_thread.run_sync( + self._path.samefile, other_path, abandon_on_cancel=True + ) + + async def stat(self, *, follow_symlinks: bool = True) -> os.stat_result: + func = partial(os.stat, follow_symlinks=follow_symlinks) + return await to_thread.run_sync(func, self._path, abandon_on_cancel=True) + + async def symlink_to( + self, + target: str | bytes | PathLike[str] | PathLike[bytes], + target_is_directory: bool = False, + ) -> None: + if isinstance(target, Path): + target = target._path + + await to_thread.run_sync(self._path.symlink_to, target, target_is_directory) + + async def touch(self, mode: int = 0o666, exist_ok: bool = True) -> None: + await to_thread.run_sync(self._path.touch, mode, exist_ok) + + async def unlink(self, missing_ok: bool = False) -> None: + try: + await to_thread.run_sync(self._path.unlink) + except FileNotFoundError: + if not missing_ok: + raise + + if sys.version_info >= (3, 12): + + async def walk( + self, + top_down: bool = True, + on_error: Callable[[OSError], object] | None = None, + follow_symlinks: bool = False, + ) -> AsyncIterator[tuple[Path, list[str], list[str]]]: + def get_next_value() -> tuple[pathlib.Path, list[str], list[str]] | None: + try: + return next(gen) + except StopIteration: + return None + + gen = self._path.walk(top_down, on_error, follow_symlinks) + while True: + value = await to_thread.run_sync(get_next_value) + if value is None: + return + + root, dirs, paths = value + yield Path(root), dirs, paths + + def with_name(self, name: str) -> Path: + return Path(self._path.with_name(name)) + + def with_stem(self, stem: str) -> Path: + return Path(self._path.with_name(stem + self._path.suffix)) + + def with_suffix(self, suffix: str) -> Path: + return Path(self._path.with_suffix(suffix)) + + def with_segments(self, *pathsegments: str | PathLike[str]) -> Path: + return Path(*pathsegments) + + async def write_bytes(self, data: bytes) -> int: + return await to_thread.run_sync(self._path.write_bytes, data) + + async def write_text( + self, + data: str, + encoding: str | None = None, + errors: str | None = None, + newline: str | None = None, + ) -> int: + # Path.write_text() does not support the "newline" parameter before Python 3.10 + def sync_write_text() -> int: + with self._path.open( + "w", encoding=encoding, errors=errors, newline=newline + ) as fp: + return fp.write(data) + + return await to_thread.run_sync(sync_write_text) + + +PathLike.register(Path) diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_resources.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_resources.py new file mode 100755 index 0000000..b9a5344 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_resources.py @@ -0,0 +1,18 @@ +from __future__ import annotations + +from ..abc import AsyncResource +from ._tasks import CancelScope + + +async def aclose_forcefully(resource: AsyncResource) -> None: + """ + Close an asynchronous resource in a cancelled scope. + + Doing this closes the resource without waiting on anything. + + :param resource: the resource to close + + """ + with CancelScope() as scope: + scope.cancel() + await resource.aclose() diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_signals.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_signals.py new file mode 100755 index 0000000..e24c79e --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_signals.py @@ -0,0 +1,29 @@ +from __future__ import annotations + +from collections.abc import AsyncIterator +from contextlib import AbstractContextManager +from signal import Signals + +from ._eventloop import get_async_backend + + +def open_signal_receiver( + *signals: Signals, +) -> AbstractContextManager[AsyncIterator[Signals]]: + """ + Start receiving operating system signals. + + :param signals: signals to receive (e.g. ``signal.SIGINT``) + :return: an asynchronous context manager for an asynchronous iterator which yields + signal numbers + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + .. warning:: Windows does not support signals natively so it is best to avoid + relying on this in cross-platform applications. + + .. warning:: On asyncio, this permanently replaces any previous signal handler for + the given signals, as set via :meth:`~asyncio.loop.add_signal_handler`. + + """ + return get_async_backend().open_signal_receiver(*signals) diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_sockets.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_sockets.py new file mode 100755 index 0000000..6c99b3a --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_sockets.py @@ -0,0 +1,1003 @@ +from __future__ import annotations + +import errno +import os +import socket +import ssl +import stat +import sys +from collections.abc import Awaitable +from dataclasses import dataclass +from ipaddress import IPv4Address, IPv6Address, ip_address +from os import PathLike, chmod +from socket import AddressFamily, SocketKind +from typing import TYPE_CHECKING, Any, Literal, cast, overload + +from .. import ConnectionFailed, to_thread +from ..abc import ( + ByteStreamConnectable, + ConnectedUDPSocket, + ConnectedUNIXDatagramSocket, + IPAddressType, + IPSockAddrType, + SocketListener, + SocketStream, + UDPSocket, + UNIXDatagramSocket, + UNIXSocketStream, +) +from ..streams.stapled import MultiListener +from ..streams.tls import TLSConnectable, TLSStream +from ._eventloop import get_async_backend +from ._resources import aclose_forcefully +from ._synchronization import Event +from ._tasks import create_task_group, move_on_after + +if TYPE_CHECKING: + from _typeshed import FileDescriptorLike +else: + FileDescriptorLike = object + +if sys.version_info < (3, 11): + from exceptiongroup import ExceptionGroup + +if sys.version_info >= (3, 12): + from typing import override +else: + from typing_extensions import override + +if sys.version_info < (3, 13): + from typing_extensions import deprecated +else: + from warnings import deprecated + +IPPROTO_IPV6 = getattr(socket, "IPPROTO_IPV6", 41) # https://bugs.python.org/issue29515 + +AnyIPAddressFamily = Literal[ + AddressFamily.AF_UNSPEC, AddressFamily.AF_INET, AddressFamily.AF_INET6 +] +IPAddressFamily = Literal[AddressFamily.AF_INET, AddressFamily.AF_INET6] + + +# tls_hostname given +@overload +async def connect_tcp( + remote_host: IPAddressType, + remote_port: int, + *, + local_host: IPAddressType | None = ..., + ssl_context: ssl.SSLContext | None = ..., + tls_standard_compatible: bool = ..., + tls_hostname: str, + happy_eyeballs_delay: float = ..., +) -> TLSStream: ... + + +# ssl_context given +@overload +async def connect_tcp( + remote_host: IPAddressType, + remote_port: int, + *, + local_host: IPAddressType | None = ..., + ssl_context: ssl.SSLContext, + tls_standard_compatible: bool = ..., + tls_hostname: str | None = ..., + happy_eyeballs_delay: float = ..., +) -> TLSStream: ... + + +# tls=True +@overload +async def connect_tcp( + remote_host: IPAddressType, + remote_port: int, + *, + local_host: IPAddressType | None = ..., + tls: Literal[True], + ssl_context: ssl.SSLContext | None = ..., + tls_standard_compatible: bool = ..., + tls_hostname: str | None = ..., + happy_eyeballs_delay: float = ..., +) -> TLSStream: ... + + +# tls=False +@overload +async def connect_tcp( + remote_host: IPAddressType, + remote_port: int, + *, + local_host: IPAddressType | None = ..., + tls: Literal[False], + ssl_context: ssl.SSLContext | None = ..., + tls_standard_compatible: bool = ..., + tls_hostname: str | None = ..., + happy_eyeballs_delay: float = ..., +) -> SocketStream: ... + + +# No TLS arguments +@overload +async def connect_tcp( + remote_host: IPAddressType, + remote_port: int, + *, + local_host: IPAddressType | None = ..., + happy_eyeballs_delay: float = ..., +) -> SocketStream: ... + + +async def connect_tcp( + remote_host: IPAddressType, + remote_port: int, + *, + local_host: IPAddressType | None = None, + tls: bool = False, + ssl_context: ssl.SSLContext | None = None, + tls_standard_compatible: bool = True, + tls_hostname: str | None = None, + happy_eyeballs_delay: float = 0.25, +) -> SocketStream | TLSStream: + """ + Connect to a host using the TCP protocol. + + This function implements the stateless version of the Happy Eyeballs algorithm (RFC + 6555). If ``remote_host`` is a host name that resolves to multiple IP addresses, + each one is tried until one connection attempt succeeds. If the first attempt does + not connected within 250 milliseconds, a second attempt is started using the next + address in the list, and so on. On IPv6 enabled systems, an IPv6 address (if + available) is tried first. + + When the connection has been established, a TLS handshake will be done if either + ``ssl_context`` or ``tls_hostname`` is not ``None``, or if ``tls`` is ``True``. + + :param remote_host: the IP address or host name to connect to + :param remote_port: port on the target host to connect to + :param local_host: the interface address or name to bind the socket to before + connecting + :param tls: ``True`` to do a TLS handshake with the connected stream and return a + :class:`~anyio.streams.tls.TLSStream` instead + :param ssl_context: the SSL context object to use (if omitted, a default context is + created) + :param tls_standard_compatible: If ``True``, performs the TLS shutdown handshake + before closing the stream and requires that the server does this as well. + Otherwise, :exc:`~ssl.SSLEOFError` may be raised during reads from the stream. + Some protocols, such as HTTP, require this option to be ``False``. + See :meth:`~ssl.SSLContext.wrap_socket` for details. + :param tls_hostname: host name to check the server certificate against (defaults to + the value of ``remote_host``) + :param happy_eyeballs_delay: delay (in seconds) before starting the next connection + attempt + :return: a socket stream object if no TLS handshake was done, otherwise a TLS stream + :raises ConnectionFailed: if the connection fails + + """ + # Placed here due to https://github.com/python/mypy/issues/7057 + connected_stream: SocketStream | None = None + + async def try_connect(remote_host: str, event: Event) -> None: + nonlocal connected_stream + try: + stream = await asynclib.connect_tcp(remote_host, remote_port, local_address) + except OSError as exc: + oserrors.append(exc) + return + else: + if connected_stream is None: + connected_stream = stream + tg.cancel_scope.cancel() + else: + await stream.aclose() + finally: + event.set() + + asynclib = get_async_backend() + local_address: IPSockAddrType | None = None + family = socket.AF_UNSPEC + if local_host: + gai_res = await getaddrinfo(str(local_host), None) + family, *_, local_address = gai_res[0] + + target_host = str(remote_host) + try: + addr_obj = ip_address(remote_host) + except ValueError: + addr_obj = None + + if addr_obj is not None: + if isinstance(addr_obj, IPv6Address): + target_addrs = [(socket.AF_INET6, addr_obj.compressed)] + else: + target_addrs = [(socket.AF_INET, addr_obj.compressed)] + else: + # getaddrinfo() will raise an exception if name resolution fails + gai_res = await getaddrinfo( + target_host, remote_port, family=family, type=socket.SOCK_STREAM + ) + + # Organize the list so that the first address is an IPv6 address (if available) + # and the second one is an IPv4 addresses. The rest can be in whatever order. + v6_found = v4_found = False + target_addrs = [] + for af, *_, sa in gai_res: + if af == socket.AF_INET6 and not v6_found: + v6_found = True + target_addrs.insert(0, (af, sa[0])) + elif af == socket.AF_INET and not v4_found and v6_found: + v4_found = True + target_addrs.insert(1, (af, sa[0])) + else: + target_addrs.append((af, sa[0])) + + oserrors: list[OSError] = [] + try: + async with create_task_group() as tg: + for _af, addr in target_addrs: + event = Event() + tg.start_soon(try_connect, addr, event) + with move_on_after(happy_eyeballs_delay): + await event.wait() + + if connected_stream is None: + cause = ( + oserrors[0] + if len(oserrors) == 1 + else ExceptionGroup("multiple connection attempts failed", oserrors) + ) + raise OSError("All connection attempts failed") from cause + finally: + oserrors.clear() + + if tls or tls_hostname or ssl_context: + try: + return await TLSStream.wrap( + connected_stream, + server_side=False, + hostname=tls_hostname or str(remote_host), + ssl_context=ssl_context, + standard_compatible=tls_standard_compatible, + ) + except BaseException: + await aclose_forcefully(connected_stream) + raise + + return connected_stream + + +async def connect_unix(path: str | bytes | PathLike[Any]) -> UNIXSocketStream: + """ + Connect to the given UNIX socket. + + Not available on Windows. + + :param path: path to the socket + :return: a socket stream object + :raises ConnectionFailed: if the connection fails + + """ + path = os.fspath(path) + return await get_async_backend().connect_unix(path) + + +async def create_tcp_listener( + *, + local_host: IPAddressType | None = None, + local_port: int = 0, + family: AnyIPAddressFamily = socket.AddressFamily.AF_UNSPEC, + backlog: int = 65536, + reuse_port: bool = False, +) -> MultiListener[SocketStream]: + """ + Create a TCP socket listener. + + :param local_port: port number to listen on + :param local_host: IP address of the interface to listen on. If omitted, listen on + all IPv4 and IPv6 interfaces. To listen on all interfaces on a specific address + family, use ``0.0.0.0`` for IPv4 or ``::`` for IPv6. + :param family: address family (used if ``local_host`` was omitted) + :param backlog: maximum number of queued incoming connections (up to a maximum of + 2**16, or 65536) + :param reuse_port: ``True`` to allow multiple sockets to bind to the same + address/port (not supported on Windows) + :return: a multi-listener object containing one or more socket listeners + :raises OSError: if there's an error creating a socket, or binding to one or more + interfaces failed + + """ + asynclib = get_async_backend() + backlog = min(backlog, 65536) + local_host = str(local_host) if local_host is not None else None + + def setup_raw_socket( + fam: AddressFamily, + bind_addr: tuple[str, int] | tuple[str, int, int, int], + *, + v6only: bool = True, + ) -> socket.socket: + sock = socket.socket(fam) + try: + sock.setblocking(False) + + if fam == AddressFamily.AF_INET6: + sock.setsockopt(IPPROTO_IPV6, socket.IPV6_V6ONLY, v6only) + + # For Windows, enable exclusive address use. For others, enable address + # reuse. + if sys.platform == "win32": + sock.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1) + else: + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + + if reuse_port: + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) + + # Workaround for #554 + if fam == socket.AF_INET6 and "%" in bind_addr[0]: + addr, scope_id = bind_addr[0].split("%", 1) + bind_addr = (addr, bind_addr[1], 0, int(scope_id)) + + sock.bind(bind_addr) + sock.listen(backlog) + except BaseException: + sock.close() + raise + + return sock + + # We passing type=0 on non-Windows platforms as a workaround for a uvloop bug + # where we don't get the correct scope ID for IPv6 link-local addresses when passing + # type=socket.SOCK_STREAM to getaddrinfo(): + # https://github.com/MagicStack/uvloop/issues/539 + gai_res = await getaddrinfo( + local_host, + local_port, + family=family, + type=socket.SOCK_STREAM if sys.platform == "win32" else 0, + flags=socket.AI_PASSIVE | socket.AI_ADDRCONFIG, + ) + + # The set comprehension is here to work around a glibc bug: + # https://sourceware.org/bugzilla/show_bug.cgi?id=14969 + sockaddrs = sorted({res for res in gai_res if res[1] == SocketKind.SOCK_STREAM}) + + # Special case for dual-stack binding on the "any" interface + if ( + local_host is None + and family == AddressFamily.AF_UNSPEC + and socket.has_dualstack_ipv6() + and any(fam == AddressFamily.AF_INET6 for fam, *_ in gai_res) + ): + raw_socket = setup_raw_socket( + AddressFamily.AF_INET6, ("::", local_port), v6only=False + ) + listener = asynclib.create_tcp_listener(raw_socket) + return MultiListener([listener]) + + errors: list[OSError] = [] + try: + for _ in range(len(sockaddrs)): + listeners: list[SocketListener] = [] + bound_ephemeral_port = local_port + try: + for fam, *_, sockaddr in sockaddrs: + sockaddr = sockaddr[0], bound_ephemeral_port, *sockaddr[2:] + raw_socket = setup_raw_socket(fam, sockaddr) + + # Store the assigned port if an ephemeral port was requested, so + # we'll bind to the same port on all interfaces + if local_port == 0 and len(gai_res) > 1: + bound_ephemeral_port = raw_socket.getsockname()[1] + + listeners.append(asynclib.create_tcp_listener(raw_socket)) + except BaseException as exc: + for listener in listeners: + await listener.aclose() + + # If an ephemeral port was requested but binding the assigned port + # failed for another interface, rotate the address list and try again + if ( + isinstance(exc, OSError) + and exc.errno == errno.EADDRINUSE + and local_port == 0 + and bound_ephemeral_port + ): + errors.append(exc) + sockaddrs.append(sockaddrs.pop(0)) + continue + + raise + + return MultiListener(listeners) + + raise OSError( + f"Could not create {len(sockaddrs)} listeners with a consistent port" + ) from ExceptionGroup("Several bind attempts failed", errors) + finally: + del errors # Prevent reference cycles + + +async def create_unix_listener( + path: str | bytes | PathLike[Any], + *, + mode: int | None = None, + backlog: int = 65536, +) -> SocketListener: + """ + Create a UNIX socket listener. + + Not available on Windows. + + :param path: path of the socket + :param mode: permissions to set on the socket + :param backlog: maximum number of queued incoming connections (up to a maximum of + 2**16, or 65536) + :return: a listener object + + .. versionchanged:: 3.0 + If a socket already exists on the file system in the given path, it will be + removed first. + + """ + backlog = min(backlog, 65536) + raw_socket = await setup_unix_local_socket(path, mode, socket.SOCK_STREAM) + try: + raw_socket.listen(backlog) + return get_async_backend().create_unix_listener(raw_socket) + except BaseException: + raw_socket.close() + raise + + +async def create_udp_socket( + family: AnyIPAddressFamily = AddressFamily.AF_UNSPEC, + *, + local_host: IPAddressType | None = None, + local_port: int = 0, + reuse_port: bool = False, +) -> UDPSocket: + """ + Create a UDP socket. + + If ``port`` has been given, the socket will be bound to this port on the local + machine, making this socket suitable for providing UDP based services. + + :param family: address family (``AF_INET`` or ``AF_INET6``) – automatically + determined from ``local_host`` if omitted + :param local_host: IP address or host name of the local interface to bind to + :param local_port: local port to bind to + :param reuse_port: ``True`` to allow multiple sockets to bind to the same + address/port (not supported on Windows) + :return: a UDP socket + + """ + if family is AddressFamily.AF_UNSPEC and not local_host: + raise ValueError('Either "family" or "local_host" must be given') + + if local_host: + gai_res = await getaddrinfo( + str(local_host), + local_port, + family=family, + type=socket.SOCK_DGRAM, + flags=socket.AI_PASSIVE | socket.AI_ADDRCONFIG, + ) + family = cast(AnyIPAddressFamily, gai_res[0][0]) + local_address = gai_res[0][-1] + elif family is AddressFamily.AF_INET6: + local_address = ("::", 0) + else: + local_address = ("0.0.0.0", 0) + + sock = await get_async_backend().create_udp_socket( + family, local_address, None, reuse_port + ) + return cast(UDPSocket, sock) + + +async def create_connected_udp_socket( + remote_host: IPAddressType, + remote_port: int, + *, + family: AnyIPAddressFamily = AddressFamily.AF_UNSPEC, + local_host: IPAddressType | None = None, + local_port: int = 0, + reuse_port: bool = False, +) -> ConnectedUDPSocket: + """ + Create a connected UDP socket. + + Connected UDP sockets can only communicate with the specified remote host/port, an + any packets sent from other sources are dropped. + + :param remote_host: remote host to set as the default target + :param remote_port: port on the remote host to set as the default target + :param family: address family (``AF_INET`` or ``AF_INET6``) – automatically + determined from ``local_host`` or ``remote_host`` if omitted + :param local_host: IP address or host name of the local interface to bind to + :param local_port: local port to bind to + :param reuse_port: ``True`` to allow multiple sockets to bind to the same + address/port (not supported on Windows) + :return: a connected UDP socket + + """ + local_address = None + if local_host: + gai_res = await getaddrinfo( + str(local_host), + local_port, + family=family, + type=socket.SOCK_DGRAM, + flags=socket.AI_PASSIVE | socket.AI_ADDRCONFIG, + ) + family = cast(AnyIPAddressFamily, gai_res[0][0]) + local_address = gai_res[0][-1] + + gai_res = await getaddrinfo( + str(remote_host), remote_port, family=family, type=socket.SOCK_DGRAM + ) + family = cast(AnyIPAddressFamily, gai_res[0][0]) + remote_address = gai_res[0][-1] + + sock = await get_async_backend().create_udp_socket( + family, local_address, remote_address, reuse_port + ) + return cast(ConnectedUDPSocket, sock) + + +async def create_unix_datagram_socket( + *, + local_path: None | str | bytes | PathLike[Any] = None, + local_mode: int | None = None, +) -> UNIXDatagramSocket: + """ + Create a UNIX datagram socket. + + Not available on Windows. + + If ``local_path`` has been given, the socket will be bound to this path, making this + socket suitable for receiving datagrams from other processes. Other processes can + send datagrams to this socket only if ``local_path`` is set. + + If a socket already exists on the file system in the ``local_path``, it will be + removed first. + + :param local_path: the path on which to bind to + :param local_mode: permissions to set on the local socket + :return: a UNIX datagram socket + + """ + raw_socket = await setup_unix_local_socket( + local_path, local_mode, socket.SOCK_DGRAM + ) + return await get_async_backend().create_unix_datagram_socket(raw_socket, None) + + +async def create_connected_unix_datagram_socket( + remote_path: str | bytes | PathLike[Any], + *, + local_path: None | str | bytes | PathLike[Any] = None, + local_mode: int | None = None, +) -> ConnectedUNIXDatagramSocket: + """ + Create a connected UNIX datagram socket. + + Connected datagram sockets can only communicate with the specified remote path. + + If ``local_path`` has been given, the socket will be bound to this path, making + this socket suitable for receiving datagrams from other processes. Other processes + can send datagrams to this socket only if ``local_path`` is set. + + If a socket already exists on the file system in the ``local_path``, it will be + removed first. + + :param remote_path: the path to set as the default target + :param local_path: the path on which to bind to + :param local_mode: permissions to set on the local socket + :return: a connected UNIX datagram socket + + """ + remote_path = os.fspath(remote_path) + raw_socket = await setup_unix_local_socket( + local_path, local_mode, socket.SOCK_DGRAM + ) + return await get_async_backend().create_unix_datagram_socket( + raw_socket, remote_path + ) + + +async def getaddrinfo( + host: bytes | str | None, + port: str | int | None, + *, + family: int | AddressFamily = 0, + type: int | SocketKind = 0, + proto: int = 0, + flags: int = 0, +) -> list[tuple[AddressFamily, SocketKind, int, str, tuple[str, int]]]: + """ + Look up a numeric IP address given a host name. + + Internationalized domain names are translated according to the (non-transitional) + IDNA 2008 standard. + + .. note:: 4-tuple IPv6 socket addresses are automatically converted to 2-tuples of + (host, port), unlike what :func:`socket.getaddrinfo` does. + + :param host: host name + :param port: port number + :param family: socket family (`'AF_INET``, ...) + :param type: socket type (``SOCK_STREAM``, ...) + :param proto: protocol number + :param flags: flags to pass to upstream ``getaddrinfo()`` + :return: list of tuples containing (family, type, proto, canonname, sockaddr) + + .. seealso:: :func:`socket.getaddrinfo` + + """ + # Handle unicode hostnames + if isinstance(host, str): + try: + encoded_host: bytes | None = host.encode("ascii") + except UnicodeEncodeError: + import idna + + encoded_host = idna.encode(host, uts46=True) + else: + encoded_host = host + + gai_res = await get_async_backend().getaddrinfo( + encoded_host, port, family=family, type=type, proto=proto, flags=flags + ) + return [ + (family, type, proto, canonname, convert_ipv6_sockaddr(sockaddr)) + for family, type, proto, canonname, sockaddr in gai_res + # filter out IPv6 results when IPv6 is disabled + if not isinstance(sockaddr[0], int) + ] + + +def getnameinfo(sockaddr: IPSockAddrType, flags: int = 0) -> Awaitable[tuple[str, str]]: + """ + Look up the host name of an IP address. + + :param sockaddr: socket address (e.g. (ipaddress, port) for IPv4) + :param flags: flags to pass to upstream ``getnameinfo()`` + :return: a tuple of (host name, service name) + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + .. seealso:: :func:`socket.getnameinfo` + + """ + return get_async_backend().getnameinfo(sockaddr, flags) + + +@deprecated("This function is deprecated; use `wait_readable` instead") +def wait_socket_readable(sock: socket.socket) -> Awaitable[None]: + """ + .. deprecated:: 4.7.0 + Use :func:`wait_readable` instead. + + Wait until the given socket has data to be read. + + .. warning:: Only use this on raw sockets that have not been wrapped by any higher + level constructs like socket streams! + + :param sock: a socket object + :raises ~anyio.ClosedResourceError: if the socket was closed while waiting for the + socket to become readable + :raises ~anyio.BusyResourceError: if another task is already waiting for the socket + to become readable + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().wait_readable(sock.fileno()) + + +@deprecated("This function is deprecated; use `wait_writable` instead") +def wait_socket_writable(sock: socket.socket) -> Awaitable[None]: + """ + .. deprecated:: 4.7.0 + Use :func:`wait_writable` instead. + + Wait until the given socket can be written to. + + This does **NOT** work on Windows when using the asyncio backend with a proactor + event loop (default on py3.8+). + + .. warning:: Only use this on raw sockets that have not been wrapped by any higher + level constructs like socket streams! + + :param sock: a socket object + :raises ~anyio.ClosedResourceError: if the socket was closed while waiting for the + socket to become writable + :raises ~anyio.BusyResourceError: if another task is already waiting for the socket + to become writable + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().wait_writable(sock.fileno()) + + +def wait_readable(obj: FileDescriptorLike) -> Awaitable[None]: + """ + Wait until the given object has data to be read. + + On Unix systems, ``obj`` must either be an integer file descriptor, or else an + object with a ``.fileno()`` method which returns an integer file descriptor. Any + kind of file descriptor can be passed, though the exact semantics will depend on + your kernel. For example, this probably won't do anything useful for on-disk files. + + On Windows systems, ``obj`` must either be an integer ``SOCKET`` handle, or else an + object with a ``.fileno()`` method which returns an integer ``SOCKET`` handle. File + descriptors aren't supported, and neither are handles that refer to anything besides + a ``SOCKET``. + + On backends where this functionality is not natively provided (asyncio + ``ProactorEventLoop`` on Windows), it is provided using a separate selector thread + which is set to shut down when the interpreter shuts down. + + .. warning:: Don't use this on raw sockets that have been wrapped by any higher + level constructs like socket streams! + + :param obj: an object with a ``.fileno()`` method or an integer handle + :raises ~anyio.ClosedResourceError: if the object was closed while waiting for the + object to become readable + :raises ~anyio.BusyResourceError: if another task is already waiting for the object + to become readable + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().wait_readable(obj) + + +def wait_writable(obj: FileDescriptorLike) -> Awaitable[None]: + """ + Wait until the given object can be written to. + + :param obj: an object with a ``.fileno()`` method or an integer handle + :raises ~anyio.ClosedResourceError: if the object was closed while waiting for the + object to become writable + :raises ~anyio.BusyResourceError: if another task is already waiting for the object + to become writable + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + .. seealso:: See the documentation of :func:`wait_readable` for the definition of + ``obj`` and notes on backend compatibility. + + .. warning:: Don't use this on raw sockets that have been wrapped by any higher + level constructs like socket streams! + + """ + return get_async_backend().wait_writable(obj) + + +def notify_closing(obj: FileDescriptorLike) -> None: + """ + Call this before closing a file descriptor (on Unix) or socket (on + Windows). This will cause any `wait_readable` or `wait_writable` + calls on the given object to immediately wake up and raise + `~anyio.ClosedResourceError`. + + This doesn't actually close the object – you still have to do that + yourself afterwards. Also, you want to be careful to make sure no + new tasks start waiting on the object in between when you call this + and when it's actually closed. So to close something properly, you + usually want to do these steps in order: + + 1. Explicitly mark the object as closed, so that any new attempts + to use it will abort before they start. + 2. Call `notify_closing` to wake up any already-existing users. + 3. Actually close the object. + + It's also possible to do them in a different order if that's more + convenient, *but only if* you make sure not to have any checkpoints in + between the steps. This way they all happen in a single atomic + step, so other tasks won't be able to tell what order they happened + in anyway. + + :param obj: an object with a ``.fileno()`` method or an integer handle + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + get_async_backend().notify_closing(obj) + + +# +# Private API +# + + +def convert_ipv6_sockaddr( + sockaddr: tuple[str, int, int, int] | tuple[str, int], +) -> tuple[str, int]: + """ + Convert a 4-tuple IPv6 socket address to a 2-tuple (address, port) format. + + If the scope ID is nonzero, it is added to the address, separated with ``%``. + Otherwise the flow id and scope id are simply cut off from the tuple. + Any other kinds of socket addresses are returned as-is. + + :param sockaddr: the result of :meth:`~socket.socket.getsockname` + :return: the converted socket address + + """ + # This is more complicated than it should be because of MyPy + if isinstance(sockaddr, tuple) and len(sockaddr) == 4: + host, port, flowinfo, scope_id = sockaddr + if scope_id: + # PyPy (as of v7.3.11) leaves the interface name in the result, so + # we discard it and only get the scope ID from the end + # (https://foss.heptapod.net/pypy/pypy/-/issues/3938) + host = host.split("%")[0] + + # Add scope_id to the address + return f"{host}%{scope_id}", port + else: + return host, port + else: + return sockaddr + + +async def setup_unix_local_socket( + path: None | str | bytes | PathLike[Any], + mode: int | None, + socktype: int, +) -> socket.socket: + """ + Create a UNIX local socket object, deleting the socket at the given path if it + exists. + + Not available on Windows. + + :param path: path of the socket + :param mode: permissions to set on the socket + :param socktype: socket.SOCK_STREAM or socket.SOCK_DGRAM + + """ + path_str: str | None + if path is not None: + path_str = os.fsdecode(path) + + # Linux abstract namespace sockets aren't backed by a concrete file so skip stat call + if not path_str.startswith("\0"): + # Copied from pathlib... + try: + stat_result = os.stat(path) + except OSError as e: + if e.errno not in ( + errno.ENOENT, + errno.ENOTDIR, + errno.EBADF, + errno.ELOOP, + ): + raise + else: + if stat.S_ISSOCK(stat_result.st_mode): + os.unlink(path) + else: + path_str = None + + raw_socket = socket.socket(socket.AF_UNIX, socktype) + raw_socket.setblocking(False) + + if path_str is not None: + try: + await to_thread.run_sync(raw_socket.bind, path_str, abandon_on_cancel=True) + if mode is not None: + await to_thread.run_sync(chmod, path_str, mode, abandon_on_cancel=True) + except BaseException: + raw_socket.close() + raise + + return raw_socket + + +@dataclass +class TCPConnectable(ByteStreamConnectable): + """ + Connects to a TCP server at the given host and port. + + :param host: host name or IP address of the server + :param port: TCP port number of the server + """ + + host: str | IPv4Address | IPv6Address + port: int + + def __post_init__(self) -> None: + if self.port < 1 or self.port > 65535: + raise ValueError("TCP port number out of range") + + @override + async def connect(self) -> SocketStream: + try: + return await connect_tcp(self.host, self.port) + except OSError as exc: + raise ConnectionFailed( + f"error connecting to {self.host}:{self.port}: {exc}" + ) from exc + + +@dataclass +class UNIXConnectable(ByteStreamConnectable): + """ + Connects to a UNIX domain socket at the given path. + + :param path: the file system path of the socket + """ + + path: str | bytes | PathLike[str] | PathLike[bytes] + + @override + async def connect(self) -> UNIXSocketStream: + try: + return await connect_unix(self.path) + except OSError as exc: + raise ConnectionFailed(f"error connecting to {self.path!r}: {exc}") from exc + + +def as_connectable( + remote: ByteStreamConnectable + | tuple[str | IPv4Address | IPv6Address, int] + | str + | bytes + | PathLike[str], + /, + *, + tls: bool = False, + ssl_context: ssl.SSLContext | None = None, + tls_hostname: str | None = None, + tls_standard_compatible: bool = True, +) -> ByteStreamConnectable: + """ + Return a byte stream connectable from the given object. + + If a bytestream connectable is given, it is returned unchanged. + If a tuple of (host, port) is given, a TCP connectable is returned. + If a string or bytes path is given, a UNIX connectable is returned. + + If ``tls=True``, the connectable will be wrapped in a + :class:`~.streams.tls.TLSConnectable`. + + :param remote: a connectable, a tuple of (host, port) or a path to a UNIX socket + :param tls: if ``True``, wrap the plaintext connectable in a + :class:`~.streams.tls.TLSConnectable`, using the provided TLS settings) + :param ssl_context: if ``tls=True``, the SSLContext object to use (if not provided, + a secure default will be created) + :param tls_hostname: if ``tls=True``, host name of the server to use for checking + the server certificate (defaults to the host portion of the address for TCP + connectables) + :param tls_standard_compatible: if ``False`` and ``tls=True``, makes the TLS stream + skip the closing handshake when closing the connection, so it won't raise an + exception if the server does the same + + """ + connectable: TCPConnectable | UNIXConnectable | TLSConnectable + if isinstance(remote, ByteStreamConnectable): + return remote + elif isinstance(remote, tuple) and len(remote) == 2: + connectable = TCPConnectable(*remote) + elif isinstance(remote, (str, bytes, PathLike)): + connectable = UNIXConnectable(remote) + else: + raise TypeError(f"cannot convert {remote!r} to a connectable") + + if tls: + if not tls_hostname and isinstance(connectable, TCPConnectable): + tls_hostname = str(connectable.host) + + connectable = TLSConnectable( + connectable, + ssl_context=ssl_context, + hostname=tls_hostname, + standard_compatible=tls_standard_compatible, + ) + + return connectable diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_streams.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_streams.py new file mode 100755 index 0000000..2b9c7df --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_streams.py @@ -0,0 +1,52 @@ +from __future__ import annotations + +import math +from typing import TypeVar +from warnings import warn + +from ..streams.memory import ( + MemoryObjectReceiveStream, + MemoryObjectSendStream, + _MemoryObjectStreamState, +) + +T_Item = TypeVar("T_Item") + + +class create_memory_object_stream( + tuple[MemoryObjectSendStream[T_Item], MemoryObjectReceiveStream[T_Item]], +): + """ + Create a memory object stream. + + The stream's item type can be annotated like + :func:`create_memory_object_stream[T_Item]`. + + :param max_buffer_size: number of items held in the buffer until ``send()`` starts + blocking + :param item_type: old way of marking the streams with the right generic type for + static typing (does nothing on AnyIO 4) + + .. deprecated:: 4.0 + Use ``create_memory_object_stream[YourItemType](...)`` instead. + :return: a tuple of (send stream, receive stream) + + """ + + def __new__( # type: ignore[misc] + cls, max_buffer_size: float = 0, item_type: object = None + ) -> tuple[MemoryObjectSendStream[T_Item], MemoryObjectReceiveStream[T_Item]]: + if max_buffer_size != math.inf and not isinstance(max_buffer_size, int): + raise ValueError("max_buffer_size must be either an integer or math.inf") + if max_buffer_size < 0: + raise ValueError("max_buffer_size cannot be negative") + if item_type is not None: + warn( + "The item_type argument has been deprecated in AnyIO 4.0. " + "Use create_memory_object_stream[YourItemType](...) instead.", + DeprecationWarning, + stacklevel=2, + ) + + state = _MemoryObjectStreamState[T_Item](max_buffer_size) + return (MemoryObjectSendStream(state), MemoryObjectReceiveStream(state)) diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_subprocesses.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_subprocesses.py new file mode 100755 index 0000000..36d9b30 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_subprocesses.py @@ -0,0 +1,202 @@ +from __future__ import annotations + +import sys +from collections.abc import AsyncIterable, Iterable, Mapping, Sequence +from io import BytesIO +from os import PathLike +from subprocess import PIPE, CalledProcessError, CompletedProcess +from typing import IO, Any, Union, cast + +from ..abc import Process +from ._eventloop import get_async_backend +from ._tasks import create_task_group + +if sys.version_info >= (3, 10): + from typing import TypeAlias +else: + from typing_extensions import TypeAlias + +StrOrBytesPath: TypeAlias = Union[str, bytes, "PathLike[str]", "PathLike[bytes]"] + + +async def run_process( + command: StrOrBytesPath | Sequence[StrOrBytesPath], + *, + input: bytes | None = None, + stdin: int | IO[Any] | None = None, + stdout: int | IO[Any] | None = PIPE, + stderr: int | IO[Any] | None = PIPE, + check: bool = True, + cwd: StrOrBytesPath | None = None, + env: Mapping[str, str] | None = None, + startupinfo: Any = None, + creationflags: int = 0, + start_new_session: bool = False, + pass_fds: Sequence[int] = (), + user: str | int | None = None, + group: str | int | None = None, + extra_groups: Iterable[str | int] | None = None, + umask: int = -1, +) -> CompletedProcess[bytes]: + """ + Run an external command in a subprocess and wait until it completes. + + .. seealso:: :func:`subprocess.run` + + :param command: either a string to pass to the shell, or an iterable of strings + containing the executable name or path and its arguments + :param input: bytes passed to the standard input of the subprocess + :param stdin: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, + a file-like object, or `None`; ``input`` overrides this + :param stdout: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, + a file-like object, or `None` + :param stderr: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, + :data:`subprocess.STDOUT`, a file-like object, or `None` + :param check: if ``True``, raise :exc:`~subprocess.CalledProcessError` if the + process terminates with a return code other than 0 + :param cwd: If not ``None``, change the working directory to this before running the + command + :param env: if not ``None``, this mapping replaces the inherited environment + variables from the parent process + :param startupinfo: an instance of :class:`subprocess.STARTUPINFO` that can be used + to specify process startup parameters (Windows only) + :param creationflags: flags that can be used to control the creation of the + subprocess (see :class:`subprocess.Popen` for the specifics) + :param start_new_session: if ``true`` the setsid() system call will be made in the + child process prior to the execution of the subprocess. (POSIX only) + :param pass_fds: sequence of file descriptors to keep open between the parent and + child processes. (POSIX only) + :param user: effective user to run the process as (Python >= 3.9, POSIX only) + :param group: effective group to run the process as (Python >= 3.9, POSIX only) + :param extra_groups: supplementary groups to set in the subprocess (Python >= 3.9, + POSIX only) + :param umask: if not negative, this umask is applied in the child process before + running the given command (Python >= 3.9, POSIX only) + :return: an object representing the completed process + :raises ~subprocess.CalledProcessError: if ``check`` is ``True`` and the process + exits with a nonzero return code + + """ + + async def drain_stream(stream: AsyncIterable[bytes], index: int) -> None: + buffer = BytesIO() + async for chunk in stream: + buffer.write(chunk) + + stream_contents[index] = buffer.getvalue() + + if stdin is not None and input is not None: + raise ValueError("only one of stdin and input is allowed") + + async with await open_process( + command, + stdin=PIPE if input else stdin, + stdout=stdout, + stderr=stderr, + cwd=cwd, + env=env, + startupinfo=startupinfo, + creationflags=creationflags, + start_new_session=start_new_session, + pass_fds=pass_fds, + user=user, + group=group, + extra_groups=extra_groups, + umask=umask, + ) as process: + stream_contents: list[bytes | None] = [None, None] + async with create_task_group() as tg: + if process.stdout: + tg.start_soon(drain_stream, process.stdout, 0) + + if process.stderr: + tg.start_soon(drain_stream, process.stderr, 1) + + if process.stdin and input: + await process.stdin.send(input) + await process.stdin.aclose() + + await process.wait() + + output, errors = stream_contents + if check and process.returncode != 0: + raise CalledProcessError(cast(int, process.returncode), command, output, errors) + + return CompletedProcess(command, cast(int, process.returncode), output, errors) + + +async def open_process( + command: StrOrBytesPath | Sequence[StrOrBytesPath], + *, + stdin: int | IO[Any] | None = PIPE, + stdout: int | IO[Any] | None = PIPE, + stderr: int | IO[Any] | None = PIPE, + cwd: StrOrBytesPath | None = None, + env: Mapping[str, str] | None = None, + startupinfo: Any = None, + creationflags: int = 0, + start_new_session: bool = False, + pass_fds: Sequence[int] = (), + user: str | int | None = None, + group: str | int | None = None, + extra_groups: Iterable[str | int] | None = None, + umask: int = -1, +) -> Process: + """ + Start an external command in a subprocess. + + .. seealso:: :class:`subprocess.Popen` + + :param command: either a string to pass to the shell, or an iterable of strings + containing the executable name or path and its arguments + :param stdin: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, a + file-like object, or ``None`` + :param stdout: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, + a file-like object, or ``None`` + :param stderr: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, + :data:`subprocess.STDOUT`, a file-like object, or ``None`` + :param cwd: If not ``None``, the working directory is changed before executing + :param env: If env is not ``None``, it must be a mapping that defines the + environment variables for the new process + :param creationflags: flags that can be used to control the creation of the + subprocess (see :class:`subprocess.Popen` for the specifics) + :param startupinfo: an instance of :class:`subprocess.STARTUPINFO` that can be used + to specify process startup parameters (Windows only) + :param start_new_session: if ``true`` the setsid() system call will be made in the + child process prior to the execution of the subprocess. (POSIX only) + :param pass_fds: sequence of file descriptors to keep open between the parent and + child processes. (POSIX only) + :param user: effective user to run the process as (POSIX only) + :param group: effective group to run the process as (POSIX only) + :param extra_groups: supplementary groups to set in the subprocess (POSIX only) + :param umask: if not negative, this umask is applied in the child process before + running the given command (POSIX only) + :return: an asynchronous process object + + """ + kwargs: dict[str, Any] = {} + if user is not None: + kwargs["user"] = user + + if group is not None: + kwargs["group"] = group + + if extra_groups is not None: + kwargs["extra_groups"] = group + + if umask >= 0: + kwargs["umask"] = umask + + return await get_async_backend().open_process( + command, + stdin=stdin, + stdout=stdout, + stderr=stderr, + cwd=cwd, + env=env, + startupinfo=startupinfo, + creationflags=creationflags, + start_new_session=start_new_session, + pass_fds=pass_fds, + **kwargs, + ) diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_synchronization.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_synchronization.py new file mode 100755 index 0000000..c0ef27a --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_synchronization.py @@ -0,0 +1,753 @@ +from __future__ import annotations + +import math +from collections import deque +from collections.abc import Callable +from dataclasses import dataclass +from types import TracebackType +from typing import TypeVar + +from ..lowlevel import checkpoint_if_cancelled +from ._eventloop import get_async_backend +from ._exceptions import BusyResourceError, NoEventLoopError +from ._tasks import CancelScope +from ._testing import TaskInfo, get_current_task + +T = TypeVar("T") + + +@dataclass(frozen=True) +class EventStatistics: + """ + :ivar int tasks_waiting: number of tasks waiting on :meth:`~.Event.wait` + """ + + tasks_waiting: int + + +@dataclass(frozen=True) +class CapacityLimiterStatistics: + """ + :ivar int borrowed_tokens: number of tokens currently borrowed by tasks + :ivar float total_tokens: total number of available tokens + :ivar tuple borrowers: tasks or other objects currently holding tokens borrowed from + this limiter + :ivar int tasks_waiting: number of tasks waiting on + :meth:`~.CapacityLimiter.acquire` or + :meth:`~.CapacityLimiter.acquire_on_behalf_of` + """ + + borrowed_tokens: int + total_tokens: float + borrowers: tuple[object, ...] + tasks_waiting: int + + +@dataclass(frozen=True) +class LockStatistics: + """ + :ivar bool locked: flag indicating if this lock is locked or not + :ivar ~anyio.TaskInfo owner: task currently holding the lock (or ``None`` if the + lock is not held by any task) + :ivar int tasks_waiting: number of tasks waiting on :meth:`~.Lock.acquire` + """ + + locked: bool + owner: TaskInfo | None + tasks_waiting: int + + +@dataclass(frozen=True) +class ConditionStatistics: + """ + :ivar int tasks_waiting: number of tasks blocked on :meth:`~.Condition.wait` + :ivar ~anyio.LockStatistics lock_statistics: statistics of the underlying + :class:`~.Lock` + """ + + tasks_waiting: int + lock_statistics: LockStatistics + + +@dataclass(frozen=True) +class SemaphoreStatistics: + """ + :ivar int tasks_waiting: number of tasks waiting on :meth:`~.Semaphore.acquire` + + """ + + tasks_waiting: int + + +class Event: + def __new__(cls) -> Event: + try: + return get_async_backend().create_event() + except NoEventLoopError: + return EventAdapter() + + def set(self) -> None: + """Set the flag, notifying all listeners.""" + raise NotImplementedError + + def is_set(self) -> bool: + """Return ``True`` if the flag is set, ``False`` if not.""" + raise NotImplementedError + + async def wait(self) -> None: + """ + Wait until the flag has been set. + + If the flag has already been set when this method is called, it returns + immediately. + + """ + raise NotImplementedError + + def statistics(self) -> EventStatistics: + """Return statistics about the current state of this event.""" + raise NotImplementedError + + +class EventAdapter(Event): + _internal_event: Event | None = None + _is_set: bool = False + + def __new__(cls) -> EventAdapter: + return object.__new__(cls) + + @property + def _event(self) -> Event: + if self._internal_event is None: + self._internal_event = get_async_backend().create_event() + if self._is_set: + self._internal_event.set() + + return self._internal_event + + def set(self) -> None: + if self._internal_event is None: + self._is_set = True + else: + self._event.set() + + def is_set(self) -> bool: + if self._internal_event is None: + return self._is_set + + return self._internal_event.is_set() + + async def wait(self) -> None: + await self._event.wait() + + def statistics(self) -> EventStatistics: + if self._internal_event is None: + return EventStatistics(tasks_waiting=0) + + return self._internal_event.statistics() + + +class Lock: + def __new__(cls, *, fast_acquire: bool = False) -> Lock: + try: + return get_async_backend().create_lock(fast_acquire=fast_acquire) + except NoEventLoopError: + return LockAdapter(fast_acquire=fast_acquire) + + async def __aenter__(self) -> None: + await self.acquire() + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self.release() + + async def acquire(self) -> None: + """Acquire the lock.""" + raise NotImplementedError + + def acquire_nowait(self) -> None: + """ + Acquire the lock, without blocking. + + :raises ~anyio.WouldBlock: if the operation would block + + """ + raise NotImplementedError + + def release(self) -> None: + """Release the lock.""" + raise NotImplementedError + + def locked(self) -> bool: + """Return True if the lock is currently held.""" + raise NotImplementedError + + def statistics(self) -> LockStatistics: + """ + Return statistics about the current state of this lock. + + .. versionadded:: 3.0 + """ + raise NotImplementedError + + +class LockAdapter(Lock): + _internal_lock: Lock | None = None + + def __new__(cls, *, fast_acquire: bool = False) -> LockAdapter: + return object.__new__(cls) + + def __init__(self, *, fast_acquire: bool = False): + self._fast_acquire = fast_acquire + + @property + def _lock(self) -> Lock: + if self._internal_lock is None: + self._internal_lock = get_async_backend().create_lock( + fast_acquire=self._fast_acquire + ) + + return self._internal_lock + + async def __aenter__(self) -> None: + await self._lock.acquire() + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + if self._internal_lock is not None: + self._internal_lock.release() + + async def acquire(self) -> None: + """Acquire the lock.""" + await self._lock.acquire() + + def acquire_nowait(self) -> None: + """ + Acquire the lock, without blocking. + + :raises ~anyio.WouldBlock: if the operation would block + + """ + self._lock.acquire_nowait() + + def release(self) -> None: + """Release the lock.""" + self._lock.release() + + def locked(self) -> bool: + """Return True if the lock is currently held.""" + return self._lock.locked() + + def statistics(self) -> LockStatistics: + """ + Return statistics about the current state of this lock. + + .. versionadded:: 3.0 + + """ + if self._internal_lock is None: + return LockStatistics(False, None, 0) + + return self._internal_lock.statistics() + + +class Condition: + _owner_task: TaskInfo | None = None + + def __init__(self, lock: Lock | None = None): + self._lock = lock or Lock() + self._waiters: deque[Event] = deque() + + async def __aenter__(self) -> None: + await self.acquire() + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self.release() + + def _check_acquired(self) -> None: + if self._owner_task != get_current_task(): + raise RuntimeError("The current task is not holding the underlying lock") + + async def acquire(self) -> None: + """Acquire the underlying lock.""" + await self._lock.acquire() + self._owner_task = get_current_task() + + def acquire_nowait(self) -> None: + """ + Acquire the underlying lock, without blocking. + + :raises ~anyio.WouldBlock: if the operation would block + + """ + self._lock.acquire_nowait() + self._owner_task = get_current_task() + + def release(self) -> None: + """Release the underlying lock.""" + self._lock.release() + + def locked(self) -> bool: + """Return True if the lock is set.""" + return self._lock.locked() + + def notify(self, n: int = 1) -> None: + """Notify exactly n listeners.""" + self._check_acquired() + for _ in range(n): + try: + event = self._waiters.popleft() + except IndexError: + break + + event.set() + + def notify_all(self) -> None: + """Notify all the listeners.""" + self._check_acquired() + for event in self._waiters: + event.set() + + self._waiters.clear() + + async def wait(self) -> None: + """Wait for a notification.""" + await checkpoint_if_cancelled() + self._check_acquired() + event = Event() + self._waiters.append(event) + self.release() + try: + await event.wait() + except BaseException: + if not event.is_set(): + self._waiters.remove(event) + + raise + finally: + with CancelScope(shield=True): + await self.acquire() + + async def wait_for(self, predicate: Callable[[], T]) -> T: + """ + Wait until a predicate becomes true. + + :param predicate: a callable that returns a truthy value when the condition is + met + :return: the result of the predicate + + .. versionadded:: 4.11.0 + + """ + while not (result := predicate()): + await self.wait() + + return result + + def statistics(self) -> ConditionStatistics: + """ + Return statistics about the current state of this condition. + + .. versionadded:: 3.0 + """ + return ConditionStatistics(len(self._waiters), self._lock.statistics()) + + +class Semaphore: + def __new__( + cls, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> Semaphore: + try: + return get_async_backend().create_semaphore( + initial_value, max_value=max_value, fast_acquire=fast_acquire + ) + except NoEventLoopError: + return SemaphoreAdapter(initial_value, max_value=max_value) + + def __init__( + self, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ): + if not isinstance(initial_value, int): + raise TypeError("initial_value must be an integer") + if initial_value < 0: + raise ValueError("initial_value must be >= 0") + if max_value is not None: + if not isinstance(max_value, int): + raise TypeError("max_value must be an integer or None") + if max_value < initial_value: + raise ValueError( + "max_value must be equal to or higher than initial_value" + ) + + self._fast_acquire = fast_acquire + + async def __aenter__(self) -> Semaphore: + await self.acquire() + return self + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self.release() + + async def acquire(self) -> None: + """Decrement the semaphore value, blocking if necessary.""" + raise NotImplementedError + + def acquire_nowait(self) -> None: + """ + Acquire the underlying lock, without blocking. + + :raises ~anyio.WouldBlock: if the operation would block + + """ + raise NotImplementedError + + def release(self) -> None: + """Increment the semaphore value.""" + raise NotImplementedError + + @property + def value(self) -> int: + """The current value of the semaphore.""" + raise NotImplementedError + + @property + def max_value(self) -> int | None: + """The maximum value of the semaphore.""" + raise NotImplementedError + + def statistics(self) -> SemaphoreStatistics: + """ + Return statistics about the current state of this semaphore. + + .. versionadded:: 3.0 + """ + raise NotImplementedError + + +class SemaphoreAdapter(Semaphore): + _internal_semaphore: Semaphore | None = None + + def __new__( + cls, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> SemaphoreAdapter: + return object.__new__(cls) + + def __init__( + self, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> None: + super().__init__(initial_value, max_value=max_value, fast_acquire=fast_acquire) + self._initial_value = initial_value + self._max_value = max_value + + @property + def _semaphore(self) -> Semaphore: + if self._internal_semaphore is None: + self._internal_semaphore = get_async_backend().create_semaphore( + self._initial_value, max_value=self._max_value + ) + + return self._internal_semaphore + + async def acquire(self) -> None: + await self._semaphore.acquire() + + def acquire_nowait(self) -> None: + self._semaphore.acquire_nowait() + + def release(self) -> None: + self._semaphore.release() + + @property + def value(self) -> int: + if self._internal_semaphore is None: + return self._initial_value + + return self._semaphore.value + + @property + def max_value(self) -> int | None: + return self._max_value + + def statistics(self) -> SemaphoreStatistics: + if self._internal_semaphore is None: + return SemaphoreStatistics(tasks_waiting=0) + + return self._semaphore.statistics() + + +class CapacityLimiter: + def __new__(cls, total_tokens: float) -> CapacityLimiter: + try: + return get_async_backend().create_capacity_limiter(total_tokens) + except NoEventLoopError: + return CapacityLimiterAdapter(total_tokens) + + async def __aenter__(self) -> None: + raise NotImplementedError + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + raise NotImplementedError + + @property + def total_tokens(self) -> float: + """ + The total number of tokens available for borrowing. + + This is a read-write property. If the total number of tokens is increased, the + proportionate number of tasks waiting on this limiter will be granted their + tokens. + + .. versionchanged:: 3.0 + The property is now writable. + .. versionchanged:: 4.12 + The value can now be set to 0. + + """ + raise NotImplementedError + + @total_tokens.setter + def total_tokens(self, value: float) -> None: + raise NotImplementedError + + @property + def borrowed_tokens(self) -> int: + """The number of tokens that have currently been borrowed.""" + raise NotImplementedError + + @property + def available_tokens(self) -> float: + """The number of tokens currently available to be borrowed""" + raise NotImplementedError + + def acquire_nowait(self) -> None: + """ + Acquire a token for the current task without waiting for one to become + available. + + :raises ~anyio.WouldBlock: if there are no tokens available for borrowing + + """ + raise NotImplementedError + + def acquire_on_behalf_of_nowait(self, borrower: object) -> None: + """ + Acquire a token without waiting for one to become available. + + :param borrower: the entity borrowing a token + :raises ~anyio.WouldBlock: if there are no tokens available for borrowing + + """ + raise NotImplementedError + + async def acquire(self) -> None: + """ + Acquire a token for the current task, waiting if necessary for one to become + available. + + """ + raise NotImplementedError + + async def acquire_on_behalf_of(self, borrower: object) -> None: + """ + Acquire a token, waiting if necessary for one to become available. + + :param borrower: the entity borrowing a token + + """ + raise NotImplementedError + + def release(self) -> None: + """ + Release the token held by the current task. + + :raises RuntimeError: if the current task has not borrowed a token from this + limiter. + + """ + raise NotImplementedError + + def release_on_behalf_of(self, borrower: object) -> None: + """ + Release the token held by the given borrower. + + :raises RuntimeError: if the borrower has not borrowed a token from this + limiter. + + """ + raise NotImplementedError + + def statistics(self) -> CapacityLimiterStatistics: + """ + Return statistics about the current state of this limiter. + + .. versionadded:: 3.0 + + """ + raise NotImplementedError + + +class CapacityLimiterAdapter(CapacityLimiter): + _internal_limiter: CapacityLimiter | None = None + + def __new__(cls, total_tokens: float) -> CapacityLimiterAdapter: + return object.__new__(cls) + + def __init__(self, total_tokens: float) -> None: + self.total_tokens = total_tokens + + @property + def _limiter(self) -> CapacityLimiter: + if self._internal_limiter is None: + self._internal_limiter = get_async_backend().create_capacity_limiter( + self._total_tokens + ) + + return self._internal_limiter + + async def __aenter__(self) -> None: + await self._limiter.__aenter__() + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + return await self._limiter.__aexit__(exc_type, exc_val, exc_tb) + + @property + def total_tokens(self) -> float: + if self._internal_limiter is None: + return self._total_tokens + + return self._internal_limiter.total_tokens + + @total_tokens.setter + def total_tokens(self, value: float) -> None: + if not isinstance(value, int) and value is not math.inf: + raise TypeError("total_tokens must be an int or math.inf") + elif value < 1: + raise ValueError("total_tokens must be >= 1") + + if self._internal_limiter is None: + self._total_tokens = value + return + + self._limiter.total_tokens = value + + @property + def borrowed_tokens(self) -> int: + if self._internal_limiter is None: + return 0 + + return self._internal_limiter.borrowed_tokens + + @property + def available_tokens(self) -> float: + if self._internal_limiter is None: + return self._total_tokens + + return self._internal_limiter.available_tokens + + def acquire_nowait(self) -> None: + self._limiter.acquire_nowait() + + def acquire_on_behalf_of_nowait(self, borrower: object) -> None: + self._limiter.acquire_on_behalf_of_nowait(borrower) + + async def acquire(self) -> None: + await self._limiter.acquire() + + async def acquire_on_behalf_of(self, borrower: object) -> None: + await self._limiter.acquire_on_behalf_of(borrower) + + def release(self) -> None: + self._limiter.release() + + def release_on_behalf_of(self, borrower: object) -> None: + self._limiter.release_on_behalf_of(borrower) + + def statistics(self) -> CapacityLimiterStatistics: + if self._internal_limiter is None: + return CapacityLimiterStatistics( + borrowed_tokens=0, + total_tokens=self.total_tokens, + borrowers=(), + tasks_waiting=0, + ) + + return self._internal_limiter.statistics() + + +class ResourceGuard: + """ + A context manager for ensuring that a resource is only used by a single task at a + time. + + Entering this context manager while the previous has not exited it yet will trigger + :exc:`BusyResourceError`. + + :param action: the action to guard against (visible in the :exc:`BusyResourceError` + when triggered, e.g. "Another task is already {action} this resource") + + .. versionadded:: 4.1 + """ + + __slots__ = "action", "_guarded" + + def __init__(self, action: str = "using"): + self.action: str = action + self._guarded = False + + def __enter__(self) -> None: + if self._guarded: + raise BusyResourceError(self.action) + + self._guarded = True + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self._guarded = False diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_tasks.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_tasks.py new file mode 100755 index 0000000..0688bfe --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_tasks.py @@ -0,0 +1,173 @@ +from __future__ import annotations + +import math +from collections.abc import Generator +from contextlib import contextmanager +from types import TracebackType + +from ..abc._tasks import TaskGroup, TaskStatus +from ._eventloop import get_async_backend + + +class _IgnoredTaskStatus(TaskStatus[object]): + def started(self, value: object = None) -> None: + pass + + +TASK_STATUS_IGNORED = _IgnoredTaskStatus() + + +class CancelScope: + """ + Wraps a unit of work that can be made separately cancellable. + + :param deadline: The time (clock value) when this scope is cancelled automatically + :param shield: ``True`` to shield the cancel scope from external cancellation + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + """ + + def __new__( + cls, *, deadline: float = math.inf, shield: bool = False + ) -> CancelScope: + return get_async_backend().create_cancel_scope(shield=shield, deadline=deadline) + + def cancel(self, reason: str | None = None) -> None: + """ + Cancel this scope immediately. + + :param reason: a message describing the reason for the cancellation + + """ + raise NotImplementedError + + @property + def deadline(self) -> float: + """ + The time (clock value) when this scope is cancelled automatically. + + Will be ``float('inf')`` if no timeout has been set. + + """ + raise NotImplementedError + + @deadline.setter + def deadline(self, value: float) -> None: + raise NotImplementedError + + @property + def cancel_called(self) -> bool: + """``True`` if :meth:`cancel` has been called.""" + raise NotImplementedError + + @property + def cancelled_caught(self) -> bool: + """ + ``True`` if this scope suppressed a cancellation exception it itself raised. + + This is typically used to check if any work was interrupted, or to see if the + scope was cancelled due to its deadline being reached. The value will, however, + only be ``True`` if the cancellation was triggered by the scope itself (and not + an outer scope). + + """ + raise NotImplementedError + + @property + def shield(self) -> bool: + """ + ``True`` if this scope is shielded from external cancellation. + + While a scope is shielded, it will not receive cancellations from outside. + + """ + raise NotImplementedError + + @shield.setter + def shield(self, value: bool) -> None: + raise NotImplementedError + + def __enter__(self) -> CancelScope: + raise NotImplementedError + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> bool: + raise NotImplementedError + + +@contextmanager +def fail_after( + delay: float | None, shield: bool = False +) -> Generator[CancelScope, None, None]: + """ + Create a context manager which raises a :class:`TimeoutError` if does not finish in + time. + + :param delay: maximum allowed time (in seconds) before raising the exception, or + ``None`` to disable the timeout + :param shield: ``True`` to shield the cancel scope from external cancellation + :return: a context manager that yields a cancel scope + :rtype: :class:`~typing.ContextManager`\\[:class:`~anyio.CancelScope`\\] + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + current_time = get_async_backend().current_time + deadline = (current_time() + delay) if delay is not None else math.inf + with get_async_backend().create_cancel_scope( + deadline=deadline, shield=shield + ) as cancel_scope: + yield cancel_scope + + if cancel_scope.cancelled_caught and current_time() >= cancel_scope.deadline: + raise TimeoutError + + +def move_on_after(delay: float | None, shield: bool = False) -> CancelScope: + """ + Create a cancel scope with a deadline that expires after the given delay. + + :param delay: maximum allowed time (in seconds) before exiting the context block, or + ``None`` to disable the timeout + :param shield: ``True`` to shield the cancel scope from external cancellation + :return: a cancel scope + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + deadline = ( + (get_async_backend().current_time() + delay) if delay is not None else math.inf + ) + return get_async_backend().create_cancel_scope(deadline=deadline, shield=shield) + + +def current_effective_deadline() -> float: + """ + Return the nearest deadline among all the cancel scopes effective for the current + task. + + :return: a clock value from the event loop's internal clock (or ``float('inf')`` if + there is no deadline in effect, or ``float('-inf')`` if the current scope has + been cancelled) + :rtype: float + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().current_effective_deadline() + + +def create_task_group() -> TaskGroup: + """ + Create a task group. + + :return: a task group + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().create_task_group() diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_tempfile.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_tempfile.py new file mode 100755 index 0000000..fbb6b14 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_tempfile.py @@ -0,0 +1,616 @@ +from __future__ import annotations + +import os +import sys +import tempfile +from collections.abc import Iterable +from io import BytesIO, TextIOWrapper +from types import TracebackType +from typing import ( + TYPE_CHECKING, + Any, + AnyStr, + Generic, + overload, +) + +from .. import to_thread +from .._core._fileio import AsyncFile +from ..lowlevel import checkpoint_if_cancelled + +if TYPE_CHECKING: + from _typeshed import OpenBinaryMode, OpenTextMode, ReadableBuffer, WriteableBuffer + + +class TemporaryFile(Generic[AnyStr]): + """ + An asynchronous temporary file that is automatically created and cleaned up. + + This class provides an asynchronous context manager interface to a temporary file. + The file is created using Python's standard `tempfile.TemporaryFile` function in a + background thread, and is wrapped as an asynchronous file using `AsyncFile`. + + :param mode: The mode in which the file is opened. Defaults to "w+b". + :param buffering: The buffering policy (-1 means the default buffering). + :param encoding: The encoding used to decode or encode the file. Only applicable in + text mode. + :param newline: Controls how universal newlines mode works (only applicable in text + mode). + :param suffix: The suffix for the temporary file name. + :param prefix: The prefix for the temporary file name. + :param dir: The directory in which the temporary file is created. + :param errors: The error handling scheme used for encoding/decoding errors. + """ + + _async_file: AsyncFile[AnyStr] + + @overload + def __init__( + self: TemporaryFile[bytes], + mode: OpenBinaryMode = ..., + buffering: int = ..., + encoding: str | None = ..., + newline: str | None = ..., + suffix: str | None = ..., + prefix: str | None = ..., + dir: str | None = ..., + *, + errors: str | None = ..., + ): ... + @overload + def __init__( + self: TemporaryFile[str], + mode: OpenTextMode, + buffering: int = ..., + encoding: str | None = ..., + newline: str | None = ..., + suffix: str | None = ..., + prefix: str | None = ..., + dir: str | None = ..., + *, + errors: str | None = ..., + ): ... + + def __init__( + self, + mode: OpenTextMode | OpenBinaryMode = "w+b", + buffering: int = -1, + encoding: str | None = None, + newline: str | None = None, + suffix: str | None = None, + prefix: str | None = None, + dir: str | None = None, + *, + errors: str | None = None, + ) -> None: + self.mode = mode + self.buffering = buffering + self.encoding = encoding + self.newline = newline + self.suffix: str | None = suffix + self.prefix: str | None = prefix + self.dir: str | None = dir + self.errors = errors + + async def __aenter__(self) -> AsyncFile[AnyStr]: + fp = await to_thread.run_sync( + lambda: tempfile.TemporaryFile( + self.mode, + self.buffering, + self.encoding, + self.newline, + self.suffix, + self.prefix, + self.dir, + errors=self.errors, + ) + ) + self._async_file = AsyncFile(fp) + return self._async_file + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + traceback: TracebackType | None, + ) -> None: + await self._async_file.aclose() + + +class NamedTemporaryFile(Generic[AnyStr]): + """ + An asynchronous named temporary file that is automatically created and cleaned up. + + This class provides an asynchronous context manager for a temporary file with a + visible name in the file system. It uses Python's standard + :func:`~tempfile.NamedTemporaryFile` function and wraps the file object with + :class:`AsyncFile` for asynchronous operations. + + :param mode: The mode in which the file is opened. Defaults to "w+b". + :param buffering: The buffering policy (-1 means the default buffering). + :param encoding: The encoding used to decode or encode the file. Only applicable in + text mode. + :param newline: Controls how universal newlines mode works (only applicable in text + mode). + :param suffix: The suffix for the temporary file name. + :param prefix: The prefix for the temporary file name. + :param dir: The directory in which the temporary file is created. + :param delete: Whether to delete the file when it is closed. + :param errors: The error handling scheme used for encoding/decoding errors. + :param delete_on_close: (Python 3.12+) Whether to delete the file on close. + """ + + _async_file: AsyncFile[AnyStr] + + @overload + def __init__( + self: NamedTemporaryFile[bytes], + mode: OpenBinaryMode = ..., + buffering: int = ..., + encoding: str | None = ..., + newline: str | None = ..., + suffix: str | None = ..., + prefix: str | None = ..., + dir: str | None = ..., + delete: bool = ..., + *, + errors: str | None = ..., + delete_on_close: bool = ..., + ): ... + @overload + def __init__( + self: NamedTemporaryFile[str], + mode: OpenTextMode, + buffering: int = ..., + encoding: str | None = ..., + newline: str | None = ..., + suffix: str | None = ..., + prefix: str | None = ..., + dir: str | None = ..., + delete: bool = ..., + *, + errors: str | None = ..., + delete_on_close: bool = ..., + ): ... + + def __init__( + self, + mode: OpenBinaryMode | OpenTextMode = "w+b", + buffering: int = -1, + encoding: str | None = None, + newline: str | None = None, + suffix: str | None = None, + prefix: str | None = None, + dir: str | None = None, + delete: bool = True, + *, + errors: str | None = None, + delete_on_close: bool = True, + ) -> None: + self._params: dict[str, Any] = { + "mode": mode, + "buffering": buffering, + "encoding": encoding, + "newline": newline, + "suffix": suffix, + "prefix": prefix, + "dir": dir, + "delete": delete, + "errors": errors, + } + if sys.version_info >= (3, 12): + self._params["delete_on_close"] = delete_on_close + + async def __aenter__(self) -> AsyncFile[AnyStr]: + fp = await to_thread.run_sync( + lambda: tempfile.NamedTemporaryFile(**self._params) + ) + self._async_file = AsyncFile(fp) + return self._async_file + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + traceback: TracebackType | None, + ) -> None: + await self._async_file.aclose() + + +class SpooledTemporaryFile(AsyncFile[AnyStr]): + """ + An asynchronous spooled temporary file that starts in memory and is spooled to disk. + + This class provides an asynchronous interface to a spooled temporary file, much like + Python's standard :class:`~tempfile.SpooledTemporaryFile`. It supports asynchronous + write operations and provides a method to force a rollover to disk. + + :param max_size: Maximum size in bytes before the file is rolled over to disk. + :param mode: The mode in which the file is opened. Defaults to "w+b". + :param buffering: The buffering policy (-1 means the default buffering). + :param encoding: The encoding used to decode or encode the file (text mode only). + :param newline: Controls how universal newlines mode works (text mode only). + :param suffix: The suffix for the temporary file name. + :param prefix: The prefix for the temporary file name. + :param dir: The directory in which the temporary file is created. + :param errors: The error handling scheme used for encoding/decoding errors. + """ + + _rolled: bool = False + + @overload + def __init__( + self: SpooledTemporaryFile[bytes], + max_size: int = ..., + mode: OpenBinaryMode = ..., + buffering: int = ..., + encoding: str | None = ..., + newline: str | None = ..., + suffix: str | None = ..., + prefix: str | None = ..., + dir: str | None = ..., + *, + errors: str | None = ..., + ): ... + @overload + def __init__( + self: SpooledTemporaryFile[str], + max_size: int = ..., + mode: OpenTextMode = ..., + buffering: int = ..., + encoding: str | None = ..., + newline: str | None = ..., + suffix: str | None = ..., + prefix: str | None = ..., + dir: str | None = ..., + *, + errors: str | None = ..., + ): ... + + def __init__( + self, + max_size: int = 0, + mode: OpenBinaryMode | OpenTextMode = "w+b", + buffering: int = -1, + encoding: str | None = None, + newline: str | None = None, + suffix: str | None = None, + prefix: str | None = None, + dir: str | None = None, + *, + errors: str | None = None, + ) -> None: + self._tempfile_params: dict[str, Any] = { + "mode": mode, + "buffering": buffering, + "encoding": encoding, + "newline": newline, + "suffix": suffix, + "prefix": prefix, + "dir": dir, + "errors": errors, + } + self._max_size = max_size + if "b" in mode: + super().__init__(BytesIO()) # type: ignore[arg-type] + else: + super().__init__( + TextIOWrapper( # type: ignore[arg-type] + BytesIO(), + encoding=encoding, + errors=errors, + newline=newline, + write_through=True, + ) + ) + + async def aclose(self) -> None: + if not self._rolled: + self._fp.close() + return + + await super().aclose() + + async def _check(self) -> None: + if self._rolled or self._fp.tell() <= self._max_size: + return + + await self.rollover() + + async def rollover(self) -> None: + if self._rolled: + return + + self._rolled = True + buffer = self._fp + buffer.seek(0) + self._fp = await to_thread.run_sync( + lambda: tempfile.TemporaryFile(**self._tempfile_params) + ) + await self.write(buffer.read()) + buffer.close() + + @property + def closed(self) -> bool: + return self._fp.closed + + async def read(self, size: int = -1) -> AnyStr: + if not self._rolled: + await checkpoint_if_cancelled() + return self._fp.read(size) + + return await super().read(size) # type: ignore[return-value] + + async def read1(self: SpooledTemporaryFile[bytes], size: int = -1) -> bytes: + if not self._rolled: + await checkpoint_if_cancelled() + return self._fp.read1(size) + + return await super().read1(size) + + async def readline(self) -> AnyStr: + if not self._rolled: + await checkpoint_if_cancelled() + return self._fp.readline() + + return await super().readline() # type: ignore[return-value] + + async def readlines(self) -> list[AnyStr]: + if not self._rolled: + await checkpoint_if_cancelled() + return self._fp.readlines() + + return await super().readlines() # type: ignore[return-value] + + async def readinto(self: SpooledTemporaryFile[bytes], b: WriteableBuffer) -> int: + if not self._rolled: + await checkpoint_if_cancelled() + self._fp.readinto(b) + + return await super().readinto(b) + + async def readinto1(self: SpooledTemporaryFile[bytes], b: WriteableBuffer) -> int: + if not self._rolled: + await checkpoint_if_cancelled() + self._fp.readinto(b) + + return await super().readinto1(b) + + async def seek(self, offset: int, whence: int | None = os.SEEK_SET) -> int: + if not self._rolled: + await checkpoint_if_cancelled() + return self._fp.seek(offset, whence) + + return await super().seek(offset, whence) + + async def tell(self) -> int: + if not self._rolled: + await checkpoint_if_cancelled() + return self._fp.tell() + + return await super().tell() + + async def truncate(self, size: int | None = None) -> int: + if not self._rolled: + await checkpoint_if_cancelled() + return self._fp.truncate(size) + + return await super().truncate(size) + + @overload + async def write(self: SpooledTemporaryFile[bytes], b: ReadableBuffer) -> int: ... + @overload + async def write(self: SpooledTemporaryFile[str], b: str) -> int: ... + + async def write(self, b: ReadableBuffer | str) -> int: + """ + Asynchronously write data to the spooled temporary file. + + If the file has not yet been rolled over, the data is written synchronously, + and a rollover is triggered if the size exceeds the maximum size. + + :param s: The data to write. + :return: The number of bytes written. + :raises RuntimeError: If the underlying file is not initialized. + + """ + if not self._rolled: + await checkpoint_if_cancelled() + result = self._fp.write(b) + await self._check() + return result + + return await super().write(b) # type: ignore[misc] + + @overload + async def writelines( + self: SpooledTemporaryFile[bytes], lines: Iterable[ReadableBuffer] + ) -> None: ... + @overload + async def writelines( + self: SpooledTemporaryFile[str], lines: Iterable[str] + ) -> None: ... + + async def writelines(self, lines: Iterable[str] | Iterable[ReadableBuffer]) -> None: + """ + Asynchronously write a list of lines to the spooled temporary file. + + If the file has not yet been rolled over, the lines are written synchronously, + and a rollover is triggered if the size exceeds the maximum size. + + :param lines: An iterable of lines to write. + :raises RuntimeError: If the underlying file is not initialized. + + """ + if not self._rolled: + await checkpoint_if_cancelled() + result = self._fp.writelines(lines) + await self._check() + return result + + return await super().writelines(lines) # type: ignore[misc] + + +class TemporaryDirectory(Generic[AnyStr]): + """ + An asynchronous temporary directory that is created and cleaned up automatically. + + This class provides an asynchronous context manager for creating a temporary + directory. It wraps Python's standard :class:`~tempfile.TemporaryDirectory` to + perform directory creation and cleanup operations in a background thread. + + :param suffix: Suffix to be added to the temporary directory name. + :param prefix: Prefix to be added to the temporary directory name. + :param dir: The parent directory where the temporary directory is created. + :param ignore_cleanup_errors: Whether to ignore errors during cleanup + (Python 3.10+). + :param delete: Whether to delete the directory upon closing (Python 3.12+). + """ + + def __init__( + self, + suffix: AnyStr | None = None, + prefix: AnyStr | None = None, + dir: AnyStr | None = None, + *, + ignore_cleanup_errors: bool = False, + delete: bool = True, + ) -> None: + self.suffix: AnyStr | None = suffix + self.prefix: AnyStr | None = prefix + self.dir: AnyStr | None = dir + self.ignore_cleanup_errors = ignore_cleanup_errors + self.delete = delete + + self._tempdir: tempfile.TemporaryDirectory | None = None + + async def __aenter__(self) -> str: + params: dict[str, Any] = { + "suffix": self.suffix, + "prefix": self.prefix, + "dir": self.dir, + } + if sys.version_info >= (3, 10): + params["ignore_cleanup_errors"] = self.ignore_cleanup_errors + + if sys.version_info >= (3, 12): + params["delete"] = self.delete + + self._tempdir = await to_thread.run_sync( + lambda: tempfile.TemporaryDirectory(**params) + ) + return await to_thread.run_sync(self._tempdir.__enter__) + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_value: BaseException | None, + traceback: TracebackType | None, + ) -> None: + if self._tempdir is not None: + await to_thread.run_sync( + self._tempdir.__exit__, exc_type, exc_value, traceback + ) + + async def cleanup(self) -> None: + if self._tempdir is not None: + await to_thread.run_sync(self._tempdir.cleanup) + + +@overload +async def mkstemp( + suffix: str | None = None, + prefix: str | None = None, + dir: str | None = None, + text: bool = False, +) -> tuple[int, str]: ... + + +@overload +async def mkstemp( + suffix: bytes | None = None, + prefix: bytes | None = None, + dir: bytes | None = None, + text: bool = False, +) -> tuple[int, bytes]: ... + + +async def mkstemp( + suffix: AnyStr | None = None, + prefix: AnyStr | None = None, + dir: AnyStr | None = None, + text: bool = False, +) -> tuple[int, str | bytes]: + """ + Asynchronously create a temporary file and return an OS-level handle and the file + name. + + This function wraps `tempfile.mkstemp` and executes it in a background thread. + + :param suffix: Suffix to be added to the file name. + :param prefix: Prefix to be added to the file name. + :param dir: Directory in which the temporary file is created. + :param text: Whether the file is opened in text mode. + :return: A tuple containing the file descriptor and the file name. + + """ + return await to_thread.run_sync(tempfile.mkstemp, suffix, prefix, dir, text) + + +@overload +async def mkdtemp( + suffix: str | None = None, + prefix: str | None = None, + dir: str | None = None, +) -> str: ... + + +@overload +async def mkdtemp( + suffix: bytes | None = None, + prefix: bytes | None = None, + dir: bytes | None = None, +) -> bytes: ... + + +async def mkdtemp( + suffix: AnyStr | None = None, + prefix: AnyStr | None = None, + dir: AnyStr | None = None, +) -> str | bytes: + """ + Asynchronously create a temporary directory and return its path. + + This function wraps `tempfile.mkdtemp` and executes it in a background thread. + + :param suffix: Suffix to be added to the directory name. + :param prefix: Prefix to be added to the directory name. + :param dir: Parent directory where the temporary directory is created. + :return: The path of the created temporary directory. + + """ + return await to_thread.run_sync(tempfile.mkdtemp, suffix, prefix, dir) + + +async def gettempdir() -> str: + """ + Asynchronously return the name of the directory used for temporary files. + + This function wraps `tempfile.gettempdir` and executes it in a background thread. + + :return: The path of the temporary directory as a string. + + """ + return await to_thread.run_sync(tempfile.gettempdir) + + +async def gettempdirb() -> bytes: + """ + Asynchronously return the name of the directory used for temporary files in bytes. + + This function wraps `tempfile.gettempdirb` and executes it in a background thread. + + :return: The path of the temporary directory as bytes. + + """ + return await to_thread.run_sync(tempfile.gettempdirb) diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_testing.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_testing.py new file mode 100755 index 0000000..369e65c --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_testing.py @@ -0,0 +1,82 @@ +from __future__ import annotations + +from collections.abc import Awaitable, Generator +from typing import Any, cast + +from ._eventloop import get_async_backend + + +class TaskInfo: + """ + Represents an asynchronous task. + + :ivar int id: the unique identifier of the task + :ivar parent_id: the identifier of the parent task, if any + :vartype parent_id: Optional[int] + :ivar str name: the description of the task (if any) + :ivar ~collections.abc.Coroutine coro: the coroutine object of the task + """ + + __slots__ = "_name", "id", "parent_id", "name", "coro" + + def __init__( + self, + id: int, + parent_id: int | None, + name: str | None, + coro: Generator[Any, Any, Any] | Awaitable[Any], + ): + func = get_current_task + self._name = f"{func.__module__}.{func.__qualname__}" + self.id: int = id + self.parent_id: int | None = parent_id + self.name: str | None = name + self.coro: Generator[Any, Any, Any] | Awaitable[Any] = coro + + def __eq__(self, other: object) -> bool: + if isinstance(other, TaskInfo): + return self.id == other.id + + return NotImplemented + + def __hash__(self) -> int: + return hash(self.id) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}(id={self.id!r}, name={self.name!r})" + + def has_pending_cancellation(self) -> bool: + """ + Return ``True`` if the task has a cancellation pending, ``False`` otherwise. + + """ + return False + + +def get_current_task() -> TaskInfo: + """ + Return the current task. + + :return: a representation of the current task + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().get_current_task() + + +def get_running_tasks() -> list[TaskInfo]: + """ + Return a list of running tasks in the current event loop. + + :return: a list of task info objects + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return cast("list[TaskInfo]", get_async_backend().get_running_tasks()) + + +async def wait_all_tasks_blocked() -> None: + """Wait until all other tasks are waiting for something.""" + await get_async_backend().wait_all_tasks_blocked() diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_typedattr.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_typedattr.py new file mode 100755 index 0000000..f358a44 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/_core/_typedattr.py @@ -0,0 +1,81 @@ +from __future__ import annotations + +from collections.abc import Callable, Mapping +from typing import Any, TypeVar, final, overload + +from ._exceptions import TypedAttributeLookupError + +T_Attr = TypeVar("T_Attr") +T_Default = TypeVar("T_Default") +undefined = object() + + +def typed_attribute() -> Any: + """Return a unique object, used to mark typed attributes.""" + return object() + + +class TypedAttributeSet: + """ + Superclass for typed attribute collections. + + Checks that every public attribute of every subclass has a type annotation. + """ + + def __init_subclass__(cls) -> None: + annotations: dict[str, Any] = getattr(cls, "__annotations__", {}) + for attrname in dir(cls): + if not attrname.startswith("_") and attrname not in annotations: + raise TypeError( + f"Attribute {attrname!r} is missing its type annotation" + ) + + super().__init_subclass__() + + +class TypedAttributeProvider: + """Base class for classes that wish to provide typed extra attributes.""" + + @property + def extra_attributes(self) -> Mapping[T_Attr, Callable[[], T_Attr]]: + """ + A mapping of the extra attributes to callables that return the corresponding + values. + + If the provider wraps another provider, the attributes from that wrapper should + also be included in the returned mapping (but the wrapper may override the + callables from the wrapped instance). + + """ + return {} + + @overload + def extra(self, attribute: T_Attr) -> T_Attr: ... + + @overload + def extra(self, attribute: T_Attr, default: T_Default) -> T_Attr | T_Default: ... + + @final + def extra(self, attribute: Any, default: object = undefined) -> object: + """ + extra(attribute, default=undefined) + + Return the value of the given typed extra attribute. + + :param attribute: the attribute (member of a :class:`~TypedAttributeSet`) to + look for + :param default: the value that should be returned if no value is found for the + attribute + :raises ~anyio.TypedAttributeLookupError: if the search failed and no default + value was given + + """ + try: + getter = self.extra_attributes[attribute] + except KeyError: + if default is undefined: + raise TypedAttributeLookupError("Attribute not found") from None + else: + return default + + return getter() diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/__init__.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/__init__.py new file mode 100755 index 0000000..d560ce3 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/__init__.py @@ -0,0 +1,58 @@ +from __future__ import annotations + +from ._eventloop import AsyncBackend as AsyncBackend +from ._resources import AsyncResource as AsyncResource +from ._sockets import ConnectedUDPSocket as ConnectedUDPSocket +from ._sockets import ConnectedUNIXDatagramSocket as ConnectedUNIXDatagramSocket +from ._sockets import IPAddressType as IPAddressType +from ._sockets import IPSockAddrType as IPSockAddrType +from ._sockets import SocketAttribute as SocketAttribute +from ._sockets import SocketListener as SocketListener +from ._sockets import SocketStream as SocketStream +from ._sockets import UDPPacketType as UDPPacketType +from ._sockets import UDPSocket as UDPSocket +from ._sockets import UNIXDatagramPacketType as UNIXDatagramPacketType +from ._sockets import UNIXDatagramSocket as UNIXDatagramSocket +from ._sockets import UNIXSocketStream as UNIXSocketStream +from ._streams import AnyByteReceiveStream as AnyByteReceiveStream +from ._streams import AnyByteSendStream as AnyByteSendStream +from ._streams import AnyByteStream as AnyByteStream +from ._streams import AnyByteStreamConnectable as AnyByteStreamConnectable +from ._streams import AnyUnreliableByteReceiveStream as AnyUnreliableByteReceiveStream +from ._streams import AnyUnreliableByteSendStream as AnyUnreliableByteSendStream +from ._streams import AnyUnreliableByteStream as AnyUnreliableByteStream +from ._streams import ByteReceiveStream as ByteReceiveStream +from ._streams import ByteSendStream as ByteSendStream +from ._streams import ByteStream as ByteStream +from ._streams import ByteStreamConnectable as ByteStreamConnectable +from ._streams import Listener as Listener +from ._streams import ObjectReceiveStream as ObjectReceiveStream +from ._streams import ObjectSendStream as ObjectSendStream +from ._streams import ObjectStream as ObjectStream +from ._streams import ObjectStreamConnectable as ObjectStreamConnectable +from ._streams import UnreliableObjectReceiveStream as UnreliableObjectReceiveStream +from ._streams import UnreliableObjectSendStream as UnreliableObjectSendStream +from ._streams import UnreliableObjectStream as UnreliableObjectStream +from ._subprocesses import Process as Process +from ._tasks import TaskGroup as TaskGroup +from ._tasks import TaskStatus as TaskStatus +from ._testing import TestRunner as TestRunner + +# Re-exported here, for backwards compatibility +# isort: off +from .._core._synchronization import ( + CapacityLimiter as CapacityLimiter, + Condition as Condition, + Event as Event, + Lock as Lock, + Semaphore as Semaphore, +) +from .._core._tasks import CancelScope as CancelScope +from ..from_thread import BlockingPortal as BlockingPortal + +# Re-export imports so they look like they live directly in this package +for __value in list(locals().values()): + if getattr(__value, "__module__", "").startswith("anyio.abc."): + __value.__module__ = __name__ + +del __value diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_eventloop.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_eventloop.py new file mode 100755 index 0000000..b1bd085 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_eventloop.py @@ -0,0 +1,414 @@ +from __future__ import annotations + +import math +import sys +from abc import ABCMeta, abstractmethod +from collections.abc import AsyncIterator, Awaitable, Callable, Sequence +from contextlib import AbstractContextManager +from os import PathLike +from signal import Signals +from socket import AddressFamily, SocketKind, socket +from typing import ( + IO, + TYPE_CHECKING, + Any, + TypeVar, + Union, + overload, +) + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +if sys.version_info >= (3, 10): + from typing import TypeAlias +else: + from typing_extensions import TypeAlias + +if TYPE_CHECKING: + from _typeshed import FileDescriptorLike + + from .._core._synchronization import CapacityLimiter, Event, Lock, Semaphore + from .._core._tasks import CancelScope + from .._core._testing import TaskInfo + from ._sockets import ( + ConnectedUDPSocket, + ConnectedUNIXDatagramSocket, + IPSockAddrType, + SocketListener, + SocketStream, + UDPSocket, + UNIXDatagramSocket, + UNIXSocketStream, + ) + from ._subprocesses import Process + from ._tasks import TaskGroup + from ._testing import TestRunner + +T_Retval = TypeVar("T_Retval") +PosArgsT = TypeVarTuple("PosArgsT") +StrOrBytesPath: TypeAlias = Union[str, bytes, "PathLike[str]", "PathLike[bytes]"] + + +class AsyncBackend(metaclass=ABCMeta): + @classmethod + @abstractmethod + def run( + cls, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + args: tuple[Unpack[PosArgsT]], + kwargs: dict[str, Any], + options: dict[str, Any], + ) -> T_Retval: + """ + Run the given coroutine function in an asynchronous event loop. + + The current thread must not be already running an event loop. + + :param func: a coroutine function + :param args: positional arguments to ``func`` + :param kwargs: positional arguments to ``func`` + :param options: keyword arguments to call the backend ``run()`` implementation + with + :return: the return value of the coroutine function + """ + + @classmethod + @abstractmethod + def current_token(cls) -> object: + """ + Return an object that allows other threads to run code inside the event loop. + + :return: a token object, specific to the event loop running in the current + thread + """ + + @classmethod + @abstractmethod + def current_time(cls) -> float: + """ + Return the current value of the event loop's internal clock. + + :return: the clock value (seconds) + """ + + @classmethod + @abstractmethod + def cancelled_exception_class(cls) -> type[BaseException]: + """Return the exception class that is raised in a task if it's cancelled.""" + + @classmethod + @abstractmethod + async def checkpoint(cls) -> None: + """ + Check if the task has been cancelled, and allow rescheduling of other tasks. + + This is effectively the same as running :meth:`checkpoint_if_cancelled` and then + :meth:`cancel_shielded_checkpoint`. + """ + + @classmethod + async def checkpoint_if_cancelled(cls) -> None: + """ + Check if the current task group has been cancelled. + + This will check if the task has been cancelled, but will not allow other tasks + to be scheduled if not. + + """ + if cls.current_effective_deadline() == -math.inf: + await cls.checkpoint() + + @classmethod + async def cancel_shielded_checkpoint(cls) -> None: + """ + Allow the rescheduling of other tasks. + + This will give other tasks the opportunity to run, but without checking if the + current task group has been cancelled, unlike with :meth:`checkpoint`. + + """ + with cls.create_cancel_scope(shield=True): + await cls.sleep(0) + + @classmethod + @abstractmethod + async def sleep(cls, delay: float) -> None: + """ + Pause the current task for the specified duration. + + :param delay: the duration, in seconds + """ + + @classmethod + @abstractmethod + def create_cancel_scope( + cls, *, deadline: float = math.inf, shield: bool = False + ) -> CancelScope: + pass + + @classmethod + @abstractmethod + def current_effective_deadline(cls) -> float: + """ + Return the nearest deadline among all the cancel scopes effective for the + current task. + + :return: + - a clock value from the event loop's internal clock + - ``inf`` if there is no deadline in effect + - ``-inf`` if the current scope has been cancelled + :rtype: float + """ + + @classmethod + @abstractmethod + def create_task_group(cls) -> TaskGroup: + pass + + @classmethod + @abstractmethod + def create_event(cls) -> Event: + pass + + @classmethod + @abstractmethod + def create_lock(cls, *, fast_acquire: bool) -> Lock: + pass + + @classmethod + @abstractmethod + def create_semaphore( + cls, + initial_value: int, + *, + max_value: int | None = None, + fast_acquire: bool = False, + ) -> Semaphore: + pass + + @classmethod + @abstractmethod + def create_capacity_limiter(cls, total_tokens: float) -> CapacityLimiter: + pass + + @classmethod + @abstractmethod + async def run_sync_in_worker_thread( + cls, + func: Callable[[Unpack[PosArgsT]], T_Retval], + args: tuple[Unpack[PosArgsT]], + abandon_on_cancel: bool = False, + limiter: CapacityLimiter | None = None, + ) -> T_Retval: + pass + + @classmethod + @abstractmethod + def check_cancelled(cls) -> None: + pass + + @classmethod + @abstractmethod + def run_async_from_thread( + cls, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + args: tuple[Unpack[PosArgsT]], + token: object, + ) -> T_Retval: + pass + + @classmethod + @abstractmethod + def run_sync_from_thread( + cls, + func: Callable[[Unpack[PosArgsT]], T_Retval], + args: tuple[Unpack[PosArgsT]], + token: object, + ) -> T_Retval: + pass + + @classmethod + @abstractmethod + async def open_process( + cls, + command: StrOrBytesPath | Sequence[StrOrBytesPath], + *, + stdin: int | IO[Any] | None, + stdout: int | IO[Any] | None, + stderr: int | IO[Any] | None, + **kwargs: Any, + ) -> Process: + pass + + @classmethod + @abstractmethod + def setup_process_pool_exit_at_shutdown(cls, workers: set[Process]) -> None: + pass + + @classmethod + @abstractmethod + async def connect_tcp( + cls, host: str, port: int, local_address: IPSockAddrType | None = None + ) -> SocketStream: + pass + + @classmethod + @abstractmethod + async def connect_unix(cls, path: str | bytes) -> UNIXSocketStream: + pass + + @classmethod + @abstractmethod + def create_tcp_listener(cls, sock: socket) -> SocketListener: + pass + + @classmethod + @abstractmethod + def create_unix_listener(cls, sock: socket) -> SocketListener: + pass + + @classmethod + @abstractmethod + async def create_udp_socket( + cls, + family: AddressFamily, + local_address: IPSockAddrType | None, + remote_address: IPSockAddrType | None, + reuse_port: bool, + ) -> UDPSocket | ConnectedUDPSocket: + pass + + @classmethod + @overload + async def create_unix_datagram_socket( + cls, raw_socket: socket, remote_path: None + ) -> UNIXDatagramSocket: ... + + @classmethod + @overload + async def create_unix_datagram_socket( + cls, raw_socket: socket, remote_path: str | bytes + ) -> ConnectedUNIXDatagramSocket: ... + + @classmethod + @abstractmethod + async def create_unix_datagram_socket( + cls, raw_socket: socket, remote_path: str | bytes | None + ) -> UNIXDatagramSocket | ConnectedUNIXDatagramSocket: + pass + + @classmethod + @abstractmethod + async def getaddrinfo( + cls, + host: bytes | str | None, + port: str | int | None, + *, + family: int | AddressFamily = 0, + type: int | SocketKind = 0, + proto: int = 0, + flags: int = 0, + ) -> Sequence[ + tuple[ + AddressFamily, + SocketKind, + int, + str, + tuple[str, int] | tuple[str, int, int, int] | tuple[int, bytes], + ] + ]: + pass + + @classmethod + @abstractmethod + async def getnameinfo( + cls, sockaddr: IPSockAddrType, flags: int = 0 + ) -> tuple[str, str]: + pass + + @classmethod + @abstractmethod + async def wait_readable(cls, obj: FileDescriptorLike) -> None: + pass + + @classmethod + @abstractmethod + async def wait_writable(cls, obj: FileDescriptorLike) -> None: + pass + + @classmethod + @abstractmethod + def notify_closing(cls, obj: FileDescriptorLike) -> None: + pass + + @classmethod + @abstractmethod + async def wrap_listener_socket(cls, sock: socket) -> SocketListener: + pass + + @classmethod + @abstractmethod + async def wrap_stream_socket(cls, sock: socket) -> SocketStream: + pass + + @classmethod + @abstractmethod + async def wrap_unix_stream_socket(cls, sock: socket) -> UNIXSocketStream: + pass + + @classmethod + @abstractmethod + async def wrap_udp_socket(cls, sock: socket) -> UDPSocket: + pass + + @classmethod + @abstractmethod + async def wrap_connected_udp_socket(cls, sock: socket) -> ConnectedUDPSocket: + pass + + @classmethod + @abstractmethod + async def wrap_unix_datagram_socket(cls, sock: socket) -> UNIXDatagramSocket: + pass + + @classmethod + @abstractmethod + async def wrap_connected_unix_datagram_socket( + cls, sock: socket + ) -> ConnectedUNIXDatagramSocket: + pass + + @classmethod + @abstractmethod + def current_default_thread_limiter(cls) -> CapacityLimiter: + pass + + @classmethod + @abstractmethod + def open_signal_receiver( + cls, *signals: Signals + ) -> AbstractContextManager[AsyncIterator[Signals]]: + pass + + @classmethod + @abstractmethod + def get_current_task(cls) -> TaskInfo: + pass + + @classmethod + @abstractmethod + def get_running_tasks(cls) -> Sequence[TaskInfo]: + pass + + @classmethod + @abstractmethod + async def wait_all_tasks_blocked(cls) -> None: + pass + + @classmethod + @abstractmethod + def create_test_runner(cls, options: dict[str, Any]) -> TestRunner: + pass diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_resources.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_resources.py new file mode 100755 index 0000000..10df115 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_resources.py @@ -0,0 +1,33 @@ +from __future__ import annotations + +from abc import ABCMeta, abstractmethod +from types import TracebackType +from typing import TypeVar + +T = TypeVar("T") + + +class AsyncResource(metaclass=ABCMeta): + """ + Abstract base class for all closeable asynchronous resources. + + Works as an asynchronous context manager which returns the instance itself on enter, + and calls :meth:`aclose` on exit. + """ + + __slots__ = () + + async def __aenter__(self: T) -> T: + return self + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + await self.aclose() + + @abstractmethod + async def aclose(self) -> None: + """Close the resource.""" diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_sockets.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_sockets.py new file mode 100755 index 0000000..3ff60d4 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_sockets.py @@ -0,0 +1,405 @@ +from __future__ import annotations + +import errno +import socket +import sys +from abc import abstractmethod +from collections.abc import Callable, Collection, Mapping +from contextlib import AsyncExitStack +from io import IOBase +from ipaddress import IPv4Address, IPv6Address +from socket import AddressFamily +from typing import Any, TypeVar, Union + +from .._core._eventloop import get_async_backend +from .._core._typedattr import ( + TypedAttributeProvider, + TypedAttributeSet, + typed_attribute, +) +from ._streams import ByteStream, Listener, UnreliableObjectStream +from ._tasks import TaskGroup + +if sys.version_info >= (3, 10): + from typing import TypeAlias +else: + from typing_extensions import TypeAlias + +IPAddressType: TypeAlias = Union[str, IPv4Address, IPv6Address] +IPSockAddrType: TypeAlias = tuple[str, int] +SockAddrType: TypeAlias = Union[IPSockAddrType, str] +UDPPacketType: TypeAlias = tuple[bytes, IPSockAddrType] +UNIXDatagramPacketType: TypeAlias = tuple[bytes, str] +T_Retval = TypeVar("T_Retval") + + +def _validate_socket( + sock_or_fd: socket.socket | int, + sock_type: socket.SocketKind, + addr_family: socket.AddressFamily = socket.AF_UNSPEC, + *, + require_connected: bool = False, + require_bound: bool = False, +) -> socket.socket: + if isinstance(sock_or_fd, int): + try: + sock = socket.socket(fileno=sock_or_fd) + except OSError as exc: + if exc.errno == errno.ENOTSOCK: + raise ValueError( + "the file descriptor does not refer to a socket" + ) from exc + elif require_connected: + raise ValueError("the socket must be connected") from exc + elif require_bound: + raise ValueError("the socket must be bound to a local address") from exc + else: + raise + elif isinstance(sock_or_fd, socket.socket): + sock = sock_or_fd + else: + raise TypeError( + f"expected an int or socket, got {type(sock_or_fd).__qualname__} instead" + ) + + try: + if require_connected: + try: + sock.getpeername() + except OSError as exc: + raise ValueError("the socket must be connected") from exc + + if require_bound: + try: + if sock.family in (socket.AF_INET, socket.AF_INET6): + bound_addr = sock.getsockname()[1] + else: + bound_addr = sock.getsockname() + except OSError: + bound_addr = None + + if not bound_addr: + raise ValueError("the socket must be bound to a local address") + + if addr_family != socket.AF_UNSPEC and sock.family != addr_family: + raise ValueError( + f"address family mismatch: expected {addr_family.name}, got " + f"{sock.family.name}" + ) + + if sock.type != sock_type: + raise ValueError( + f"socket type mismatch: expected {sock_type.name}, got {sock.type.name}" + ) + except BaseException: + # Avoid ResourceWarning from the locally constructed socket object + if isinstance(sock_or_fd, int): + sock.detach() + + raise + + sock.setblocking(False) + return sock + + +class SocketAttribute(TypedAttributeSet): + """ + .. attribute:: family + :type: socket.AddressFamily + + the address family of the underlying socket + + .. attribute:: local_address + :type: tuple[str, int] | str + + the local address the underlying socket is connected to + + .. attribute:: local_port + :type: int + + for IP based sockets, the local port the underlying socket is bound to + + .. attribute:: raw_socket + :type: socket.socket + + the underlying stdlib socket object + + .. attribute:: remote_address + :type: tuple[str, int] | str + + the remote address the underlying socket is connected to + + .. attribute:: remote_port + :type: int + + for IP based sockets, the remote port the underlying socket is connected to + """ + + family: AddressFamily = typed_attribute() + local_address: SockAddrType = typed_attribute() + local_port: int = typed_attribute() + raw_socket: socket.socket = typed_attribute() + remote_address: SockAddrType = typed_attribute() + remote_port: int = typed_attribute() + + +class _SocketProvider(TypedAttributeProvider): + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + from .._core._sockets import convert_ipv6_sockaddr as convert + + attributes: dict[Any, Callable[[], Any]] = { + SocketAttribute.family: lambda: self._raw_socket.family, + SocketAttribute.local_address: lambda: convert( + self._raw_socket.getsockname() + ), + SocketAttribute.raw_socket: lambda: self._raw_socket, + } + try: + peername: tuple[str, int] | None = convert(self._raw_socket.getpeername()) + except OSError: + peername = None + + # Provide the remote address for connected sockets + if peername is not None: + attributes[SocketAttribute.remote_address] = lambda: peername + + # Provide local and remote ports for IP based sockets + if self._raw_socket.family in (AddressFamily.AF_INET, AddressFamily.AF_INET6): + attributes[SocketAttribute.local_port] = ( + lambda: self._raw_socket.getsockname()[1] + ) + if peername is not None: + remote_port = peername[1] + attributes[SocketAttribute.remote_port] = lambda: remote_port + + return attributes + + @property + @abstractmethod + def _raw_socket(self) -> socket.socket: + pass + + +class SocketStream(ByteStream, _SocketProvider): + """ + Transports bytes over a socket. + + Supports all relevant extra attributes from :class:`~SocketAttribute`. + """ + + @classmethod + async def from_socket(cls, sock_or_fd: socket.socket | int) -> SocketStream: + """ + Wrap an existing socket object or file descriptor as a socket stream. + + The newly created socket wrapper takes ownership of the socket being passed in. + The existing socket must already be connected. + + :param sock_or_fd: a socket object or file descriptor + :return: a socket stream + + """ + sock = _validate_socket(sock_or_fd, socket.SOCK_STREAM, require_connected=True) + return await get_async_backend().wrap_stream_socket(sock) + + +class UNIXSocketStream(SocketStream): + @classmethod + async def from_socket(cls, sock_or_fd: socket.socket | int) -> UNIXSocketStream: + """ + Wrap an existing socket object or file descriptor as a UNIX socket stream. + + The newly created socket wrapper takes ownership of the socket being passed in. + The existing socket must already be connected. + + :param sock_or_fd: a socket object or file descriptor + :return: a UNIX socket stream + + """ + sock = _validate_socket( + sock_or_fd, socket.SOCK_STREAM, socket.AF_UNIX, require_connected=True + ) + return await get_async_backend().wrap_unix_stream_socket(sock) + + @abstractmethod + async def send_fds(self, message: bytes, fds: Collection[int | IOBase]) -> None: + """ + Send file descriptors along with a message to the peer. + + :param message: a non-empty bytestring + :param fds: a collection of files (either numeric file descriptors or open file + or socket objects) + """ + + @abstractmethod + async def receive_fds(self, msglen: int, maxfds: int) -> tuple[bytes, list[int]]: + """ + Receive file descriptors along with a message from the peer. + + :param msglen: length of the message to expect from the peer + :param maxfds: maximum number of file descriptors to expect from the peer + :return: a tuple of (message, file descriptors) + """ + + +class SocketListener(Listener[SocketStream], _SocketProvider): + """ + Listens to incoming socket connections. + + Supports all relevant extra attributes from :class:`~SocketAttribute`. + """ + + @classmethod + async def from_socket( + cls, + sock_or_fd: socket.socket | int, + ) -> SocketListener: + """ + Wrap an existing socket object or file descriptor as a socket listener. + + The newly created listener takes ownership of the socket being passed in. + + :param sock_or_fd: a socket object or file descriptor + :return: a socket listener + + """ + sock = _validate_socket(sock_or_fd, socket.SOCK_STREAM, require_bound=True) + return await get_async_backend().wrap_listener_socket(sock) + + @abstractmethod + async def accept(self) -> SocketStream: + """Accept an incoming connection.""" + + async def serve( + self, + handler: Callable[[SocketStream], Any], + task_group: TaskGroup | None = None, + ) -> None: + from .. import create_task_group + + async with AsyncExitStack() as stack: + if task_group is None: + task_group = await stack.enter_async_context(create_task_group()) + + while True: + stream = await self.accept() + task_group.start_soon(handler, stream) + + +class UDPSocket(UnreliableObjectStream[UDPPacketType], _SocketProvider): + """ + Represents an unconnected UDP socket. + + Supports all relevant extra attributes from :class:`~SocketAttribute`. + """ + + @classmethod + async def from_socket(cls, sock_or_fd: socket.socket | int) -> UDPSocket: + """ + Wrap an existing socket object or file descriptor as a UDP socket. + + The newly created socket wrapper takes ownership of the socket being passed in. + The existing socket must be bound to a local address. + + :param sock_or_fd: a socket object or file descriptor + :return: a UDP socket + + """ + sock = _validate_socket(sock_or_fd, socket.SOCK_DGRAM, require_bound=True) + return await get_async_backend().wrap_udp_socket(sock) + + async def sendto(self, data: bytes, host: str, port: int) -> None: + """ + Alias for :meth:`~.UnreliableObjectSendStream.send` ((data, (host, port))). + + """ + return await self.send((data, (host, port))) + + +class ConnectedUDPSocket(UnreliableObjectStream[bytes], _SocketProvider): + """ + Represents an connected UDP socket. + + Supports all relevant extra attributes from :class:`~SocketAttribute`. + """ + + @classmethod + async def from_socket(cls, sock_or_fd: socket.socket | int) -> ConnectedUDPSocket: + """ + Wrap an existing socket object or file descriptor as a connected UDP socket. + + The newly created socket wrapper takes ownership of the socket being passed in. + The existing socket must already be connected. + + :param sock_or_fd: a socket object or file descriptor + :return: a connected UDP socket + + """ + sock = _validate_socket( + sock_or_fd, + socket.SOCK_DGRAM, + require_connected=True, + ) + return await get_async_backend().wrap_connected_udp_socket(sock) + + +class UNIXDatagramSocket( + UnreliableObjectStream[UNIXDatagramPacketType], _SocketProvider +): + """ + Represents an unconnected Unix datagram socket. + + Supports all relevant extra attributes from :class:`~SocketAttribute`. + """ + + @classmethod + async def from_socket( + cls, + sock_or_fd: socket.socket | int, + ) -> UNIXDatagramSocket: + """ + Wrap an existing socket object or file descriptor as a UNIX datagram + socket. + + The newly created socket wrapper takes ownership of the socket being passed in. + + :param sock_or_fd: a socket object or file descriptor + :return: a UNIX datagram socket + + """ + sock = _validate_socket(sock_or_fd, socket.SOCK_DGRAM, socket.AF_UNIX) + return await get_async_backend().wrap_unix_datagram_socket(sock) + + async def sendto(self, data: bytes, path: str) -> None: + """Alias for :meth:`~.UnreliableObjectSendStream.send` ((data, path)).""" + return await self.send((data, path)) + + +class ConnectedUNIXDatagramSocket(UnreliableObjectStream[bytes], _SocketProvider): + """ + Represents a connected Unix datagram socket. + + Supports all relevant extra attributes from :class:`~SocketAttribute`. + """ + + @classmethod + async def from_socket( + cls, + sock_or_fd: socket.socket | int, + ) -> ConnectedUNIXDatagramSocket: + """ + Wrap an existing socket object or file descriptor as a connected UNIX datagram + socket. + + The newly created socket wrapper takes ownership of the socket being passed in. + The existing socket must already be connected. + + :param sock_or_fd: a socket object or file descriptor + :return: a connected UNIX datagram socket + + """ + sock = _validate_socket( + sock_or_fd, socket.SOCK_DGRAM, socket.AF_UNIX, require_connected=True + ) + return await get_async_backend().wrap_connected_unix_datagram_socket(sock) diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_streams.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_streams.py new file mode 100755 index 0000000..369df3f --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_streams.py @@ -0,0 +1,239 @@ +from __future__ import annotations + +import sys +from abc import ABCMeta, abstractmethod +from collections.abc import Callable +from typing import Any, Generic, TypeVar, Union + +from .._core._exceptions import EndOfStream +from .._core._typedattr import TypedAttributeProvider +from ._resources import AsyncResource +from ._tasks import TaskGroup + +if sys.version_info >= (3, 10): + from typing import TypeAlias +else: + from typing_extensions import TypeAlias + +T_Item = TypeVar("T_Item") +T_co = TypeVar("T_co", covariant=True) +T_contra = TypeVar("T_contra", contravariant=True) + + +class UnreliableObjectReceiveStream( + Generic[T_co], AsyncResource, TypedAttributeProvider +): + """ + An interface for receiving objects. + + This interface makes no guarantees that the received messages arrive in the order in + which they were sent, or that no messages are missed. + + Asynchronously iterating over objects of this type will yield objects matching the + given type parameter. + """ + + def __aiter__(self) -> UnreliableObjectReceiveStream[T_co]: + return self + + async def __anext__(self) -> T_co: + try: + return await self.receive() + except EndOfStream: + raise StopAsyncIteration from None + + @abstractmethod + async def receive(self) -> T_co: + """ + Receive the next item. + + :raises ~anyio.ClosedResourceError: if the receive stream has been explicitly + closed + :raises ~anyio.EndOfStream: if this stream has been closed from the other end + :raises ~anyio.BrokenResourceError: if this stream has been rendered unusable + due to external causes + """ + + +class UnreliableObjectSendStream( + Generic[T_contra], AsyncResource, TypedAttributeProvider +): + """ + An interface for sending objects. + + This interface makes no guarantees that the messages sent will reach the + recipient(s) in the same order in which they were sent, or at all. + """ + + @abstractmethod + async def send(self, item: T_contra) -> None: + """ + Send an item to the peer(s). + + :param item: the item to send + :raises ~anyio.ClosedResourceError: if the send stream has been explicitly + closed + :raises ~anyio.BrokenResourceError: if this stream has been rendered unusable + due to external causes + """ + + +class UnreliableObjectStream( + UnreliableObjectReceiveStream[T_Item], UnreliableObjectSendStream[T_Item] +): + """ + A bidirectional message stream which does not guarantee the order or reliability of + message delivery. + """ + + +class ObjectReceiveStream(UnreliableObjectReceiveStream[T_co]): + """ + A receive message stream which guarantees that messages are received in the same + order in which they were sent, and that no messages are missed. + """ + + +class ObjectSendStream(UnreliableObjectSendStream[T_contra]): + """ + A send message stream which guarantees that messages are delivered in the same order + in which they were sent, without missing any messages in the middle. + """ + + +class ObjectStream( + ObjectReceiveStream[T_Item], + ObjectSendStream[T_Item], + UnreliableObjectStream[T_Item], +): + """ + A bidirectional message stream which guarantees the order and reliability of message + delivery. + """ + + @abstractmethod + async def send_eof(self) -> None: + """ + Send an end-of-file indication to the peer. + + You should not try to send any further data to this stream after calling this + method. This method is idempotent (does nothing on successive calls). + """ + + +class ByteReceiveStream(AsyncResource, TypedAttributeProvider): + """ + An interface for receiving bytes from a single peer. + + Iterating this byte stream will yield a byte string of arbitrary length, but no more + than 65536 bytes. + """ + + def __aiter__(self) -> ByteReceiveStream: + return self + + async def __anext__(self) -> bytes: + try: + return await self.receive() + except EndOfStream: + raise StopAsyncIteration from None + + @abstractmethod + async def receive(self, max_bytes: int = 65536) -> bytes: + """ + Receive at most ``max_bytes`` bytes from the peer. + + .. note:: Implementers of this interface should not return an empty + :class:`bytes` object, and users should ignore them. + + :param max_bytes: maximum number of bytes to receive + :return: the received bytes + :raises ~anyio.EndOfStream: if this stream has been closed from the other end + """ + + +class ByteSendStream(AsyncResource, TypedAttributeProvider): + """An interface for sending bytes to a single peer.""" + + @abstractmethod + async def send(self, item: bytes) -> None: + """ + Send the given bytes to the peer. + + :param item: the bytes to send + """ + + +class ByteStream(ByteReceiveStream, ByteSendStream): + """A bidirectional byte stream.""" + + @abstractmethod + async def send_eof(self) -> None: + """ + Send an end-of-file indication to the peer. + + You should not try to send any further data to this stream after calling this + method. This method is idempotent (does nothing on successive calls). + """ + + +#: Type alias for all unreliable bytes-oriented receive streams. +AnyUnreliableByteReceiveStream: TypeAlias = Union[ + UnreliableObjectReceiveStream[bytes], ByteReceiveStream +] +#: Type alias for all unreliable bytes-oriented send streams. +AnyUnreliableByteSendStream: TypeAlias = Union[ + UnreliableObjectSendStream[bytes], ByteSendStream +] +#: Type alias for all unreliable bytes-oriented streams. +AnyUnreliableByteStream: TypeAlias = Union[UnreliableObjectStream[bytes], ByteStream] +#: Type alias for all bytes-oriented receive streams. +AnyByteReceiveStream: TypeAlias = Union[ObjectReceiveStream[bytes], ByteReceiveStream] +#: Type alias for all bytes-oriented send streams. +AnyByteSendStream: TypeAlias = Union[ObjectSendStream[bytes], ByteSendStream] +#: Type alias for all bytes-oriented streams. +AnyByteStream: TypeAlias = Union[ObjectStream[bytes], ByteStream] + + +class Listener(Generic[T_co], AsyncResource, TypedAttributeProvider): + """An interface for objects that let you accept incoming connections.""" + + @abstractmethod + async def serve( + self, handler: Callable[[T_co], Any], task_group: TaskGroup | None = None + ) -> None: + """ + Accept incoming connections as they come in and start tasks to handle them. + + :param handler: a callable that will be used to handle each accepted connection + :param task_group: the task group that will be used to start tasks for handling + each accepted connection (if omitted, an ad-hoc task group will be created) + """ + + +class ObjectStreamConnectable(Generic[T_co], metaclass=ABCMeta): + @abstractmethod + async def connect(self) -> ObjectStream[T_co]: + """ + Connect to the remote endpoint. + + :return: an object stream connected to the remote end + :raises ConnectionFailed: if the connection fails + """ + + +class ByteStreamConnectable(metaclass=ABCMeta): + @abstractmethod + async def connect(self) -> ByteStream: + """ + Connect to the remote endpoint. + + :return: a bytestream connected to the remote end + :raises ConnectionFailed: if the connection fails + """ + + +#: Type alias for all connectables returning bytestreams or bytes-oriented object streams +AnyByteStreamConnectable: TypeAlias = Union[ + ObjectStreamConnectable[bytes], ByteStreamConnectable +] diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_subprocesses.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_subprocesses.py new file mode 100755 index 0000000..ce0564c --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_subprocesses.py @@ -0,0 +1,79 @@ +from __future__ import annotations + +from abc import abstractmethod +from signal import Signals + +from ._resources import AsyncResource +from ._streams import ByteReceiveStream, ByteSendStream + + +class Process(AsyncResource): + """An asynchronous version of :class:`subprocess.Popen`.""" + + @abstractmethod + async def wait(self) -> int: + """ + Wait until the process exits. + + :return: the exit code of the process + """ + + @abstractmethod + def terminate(self) -> None: + """ + Terminates the process, gracefully if possible. + + On Windows, this calls ``TerminateProcess()``. + On POSIX systems, this sends ``SIGTERM`` to the process. + + .. seealso:: :meth:`subprocess.Popen.terminate` + """ + + @abstractmethod + def kill(self) -> None: + """ + Kills the process. + + On Windows, this calls ``TerminateProcess()``. + On POSIX systems, this sends ``SIGKILL`` to the process. + + .. seealso:: :meth:`subprocess.Popen.kill` + """ + + @abstractmethod + def send_signal(self, signal: Signals) -> None: + """ + Send a signal to the subprocess. + + .. seealso:: :meth:`subprocess.Popen.send_signal` + + :param signal: the signal number (e.g. :data:`signal.SIGHUP`) + """ + + @property + @abstractmethod + def pid(self) -> int: + """The process ID of the process.""" + + @property + @abstractmethod + def returncode(self) -> int | None: + """ + The return code of the process. If the process has not yet terminated, this will + be ``None``. + """ + + @property + @abstractmethod + def stdin(self) -> ByteSendStream | None: + """The stream for the standard input of the process.""" + + @property + @abstractmethod + def stdout(self) -> ByteReceiveStream | None: + """The stream for the standard output of the process.""" + + @property + @abstractmethod + def stderr(self) -> ByteReceiveStream | None: + """The stream for the standard error output of the process.""" diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_tasks.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_tasks.py new file mode 100755 index 0000000..516b3ec --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_tasks.py @@ -0,0 +1,117 @@ +from __future__ import annotations + +import sys +from abc import ABCMeta, abstractmethod +from collections.abc import Awaitable, Callable +from types import TracebackType +from typing import TYPE_CHECKING, Any, Protocol, overload + +if sys.version_info >= (3, 13): + from typing import TypeVar +else: + from typing_extensions import TypeVar + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +if TYPE_CHECKING: + from .._core._tasks import CancelScope + +T_Retval = TypeVar("T_Retval") +T_contra = TypeVar("T_contra", contravariant=True, default=None) +PosArgsT = TypeVarTuple("PosArgsT") + + +class TaskStatus(Protocol[T_contra]): + @overload + def started(self: TaskStatus[None]) -> None: ... + + @overload + def started(self, value: T_contra) -> None: ... + + def started(self, value: T_contra | None = None) -> None: + """ + Signal that the task has started. + + :param value: object passed back to the starter of the task + """ + + +class TaskGroup(metaclass=ABCMeta): + """ + Groups several asynchronous tasks together. + + :ivar cancel_scope: the cancel scope inherited by all child tasks + :vartype cancel_scope: CancelScope + + .. note:: On asyncio, support for eager task factories is considered to be + **experimental**. In particular, they don't follow the usual semantics of new + tasks being scheduled on the next iteration of the event loop, and may thus + cause unexpected behavior in code that wasn't written with such semantics in + mind. + """ + + cancel_scope: CancelScope + + @abstractmethod + def start_soon( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[Any]], + *args: Unpack[PosArgsT], + name: object = None, + ) -> None: + """ + Start a new task in this task group. + + :param func: a coroutine function + :param args: positional arguments to call the function with + :param name: name of the task, for the purposes of introspection and debugging + + .. versionadded:: 3.0 + """ + + @abstractmethod + async def start( + self, + func: Callable[..., Awaitable[Any]], + *args: object, + name: object = None, + ) -> Any: + """ + Start a new task and wait until it signals for readiness. + + The target callable must accept a keyword argument ``task_status`` (of type + :class:`TaskStatus`). Awaiting on this method will return whatever was passed to + ``task_status.started()`` (``None`` by default). + + .. note:: The :class:`TaskStatus` class is generic, and the type argument should + indicate the type of the value that will be passed to + ``task_status.started()``. + + :param func: a coroutine function that accepts the ``task_status`` keyword + argument + :param args: positional arguments to call the function with + :param name: an optional name for the task, for introspection and debugging + :return: the value passed to ``task_status.started()`` + :raises RuntimeError: if the task finishes without calling + ``task_status.started()`` + + .. seealso:: :ref:`start_initialize` + + .. versionadded:: 3.0 + """ + + @abstractmethod + async def __aenter__(self) -> TaskGroup: + """Enter the task group context and allow starting new tasks.""" + + @abstractmethod + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> bool: + """Exit the task group context waiting for all tasks to finish.""" diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_testing.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_testing.py new file mode 100755 index 0000000..7c50ed7 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/abc/_testing.py @@ -0,0 +1,65 @@ +from __future__ import annotations + +import types +from abc import ABCMeta, abstractmethod +from collections.abc import AsyncGenerator, Callable, Coroutine, Iterable +from typing import Any, TypeVar + +_T = TypeVar("_T") + + +class TestRunner(metaclass=ABCMeta): + """ + Encapsulates a running event loop. Every call made through this object will use the + same event loop. + """ + + def __enter__(self) -> TestRunner: + return self + + @abstractmethod + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: types.TracebackType | None, + ) -> bool | None: ... + + @abstractmethod + def run_asyncgen_fixture( + self, + fixture_func: Callable[..., AsyncGenerator[_T, Any]], + kwargs: dict[str, Any], + ) -> Iterable[_T]: + """ + Run an async generator fixture. + + :param fixture_func: the fixture function + :param kwargs: keyword arguments to call the fixture function with + :return: an iterator yielding the value yielded from the async generator + """ + + @abstractmethod + def run_fixture( + self, + fixture_func: Callable[..., Coroutine[Any, Any, _T]], + kwargs: dict[str, Any], + ) -> _T: + """ + Run an async fixture. + + :param fixture_func: the fixture function + :param kwargs: keyword arguments to call the fixture function with + :return: the return value of the fixture function + """ + + @abstractmethod + def run_test( + self, test_func: Callable[..., Coroutine[Any, Any, Any]], kwargs: dict[str, Any] + ) -> None: + """ + Run an async test function. + + :param test_func: the test function + :param kwargs: keyword arguments to call the test function with + """ diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/from_thread.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/from_thread.py new file mode 100755 index 0000000..837de5e --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/from_thread.py @@ -0,0 +1,578 @@ +from __future__ import annotations + +__all__ = ( + "BlockingPortal", + "BlockingPortalProvider", + "check_cancelled", + "run", + "run_sync", + "start_blocking_portal", +) + +import sys +from collections.abc import Awaitable, Callable, Generator +from concurrent.futures import Future +from contextlib import ( + AbstractAsyncContextManager, + AbstractContextManager, + contextmanager, +) +from dataclasses import dataclass, field +from functools import partial +from inspect import isawaitable +from threading import Lock, Thread, current_thread, get_ident +from types import TracebackType +from typing import ( + Any, + Generic, + TypeVar, + cast, + overload, +) + +from ._core._eventloop import ( + get_cancelled_exc_class, + threadlocals, +) +from ._core._eventloop import run as run_eventloop +from ._core._exceptions import NoEventLoopError +from ._core._synchronization import Event +from ._core._tasks import CancelScope, create_task_group +from .abc._tasks import TaskStatus +from .lowlevel import EventLoopToken, current_token + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +T_Retval = TypeVar("T_Retval") +T_co = TypeVar("T_co", covariant=True) +PosArgsT = TypeVarTuple("PosArgsT") + + +def _token_or_error(token: EventLoopToken | None) -> EventLoopToken: + if token is not None: + return token + + try: + return threadlocals.current_token + except AttributeError: + raise NoEventLoopError( + "Not running inside an AnyIO worker thread, and no event loop token was " + "provided" + ) from None + + +def run( + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + *args: Unpack[PosArgsT], + token: EventLoopToken | None = None, +) -> T_Retval: + """ + Call a coroutine function from a worker thread. + + :param func: a coroutine function + :param args: positional arguments for the callable + :param token: an event loop token to use to get back to the event loop thread + (required if calling this function from outside an AnyIO worker thread) + :return: the return value of the coroutine function + :raises MissingTokenError: if no token was provided and called from outside an + AnyIO worker thread + :raises RunFinishedError: if the event loop tied to ``token`` is no longer running + + .. versionchanged:: 4.11.0 + Added the ``token`` parameter. + + """ + explicit_token = token is not None + token = _token_or_error(token) + return token.backend_class.run_async_from_thread( + func, args, token=token.native_token if explicit_token else None + ) + + +def run_sync( + func: Callable[[Unpack[PosArgsT]], T_Retval], + *args: Unpack[PosArgsT], + token: EventLoopToken | None = None, +) -> T_Retval: + """ + Call a function in the event loop thread from a worker thread. + + :param func: a callable + :param args: positional arguments for the callable + :param token: an event loop token to use to get back to the event loop thread + (required if calling this function from outside an AnyIO worker thread) + :return: the return value of the callable + :raises MissingTokenError: if no token was provided and called from outside an + AnyIO worker thread + :raises RunFinishedError: if the event loop tied to ``token`` is no longer running + + .. versionchanged:: 4.11.0 + Added the ``token`` parameter. + + """ + explicit_token = token is not None + token = _token_or_error(token) + return token.backend_class.run_sync_from_thread( + func, args, token=token.native_token if explicit_token else None + ) + + +class _BlockingAsyncContextManager(Generic[T_co], AbstractContextManager): + _enter_future: Future[T_co] + _exit_future: Future[bool | None] + _exit_event: Event + _exit_exc_info: tuple[ + type[BaseException] | None, BaseException | None, TracebackType | None + ] = (None, None, None) + + def __init__( + self, async_cm: AbstractAsyncContextManager[T_co], portal: BlockingPortal + ): + self._async_cm = async_cm + self._portal = portal + + async def run_async_cm(self) -> bool | None: + try: + self._exit_event = Event() + value = await self._async_cm.__aenter__() + except BaseException as exc: + self._enter_future.set_exception(exc) + raise + else: + self._enter_future.set_result(value) + + try: + # Wait for the sync context manager to exit. + # This next statement can raise `get_cancelled_exc_class()` if + # something went wrong in a task group in this async context + # manager. + await self._exit_event.wait() + finally: + # In case of cancellation, it could be that we end up here before + # `_BlockingAsyncContextManager.__exit__` is called, and an + # `_exit_exc_info` has been set. + result = await self._async_cm.__aexit__(*self._exit_exc_info) + + return result + + def __enter__(self) -> T_co: + self._enter_future = Future() + self._exit_future = self._portal.start_task_soon(self.run_async_cm) + return self._enter_future.result() + + def __exit__( + self, + __exc_type: type[BaseException] | None, + __exc_value: BaseException | None, + __traceback: TracebackType | None, + ) -> bool | None: + self._exit_exc_info = __exc_type, __exc_value, __traceback + self._portal.call(self._exit_event.set) + return self._exit_future.result() + + +class _BlockingPortalTaskStatus(TaskStatus): + def __init__(self, future: Future): + self._future = future + + def started(self, value: object = None) -> None: + self._future.set_result(value) + + +class BlockingPortal: + """ + An object that lets external threads run code in an asynchronous event loop. + + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + """ + + def __init__(self) -> None: + self._token = current_token() + self._event_loop_thread_id: int | None = get_ident() + self._stop_event = Event() + self._task_group = create_task_group() + + async def __aenter__(self) -> BlockingPortal: + await self._task_group.__aenter__() + return self + + async def __aexit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> bool: + await self.stop() + return await self._task_group.__aexit__(exc_type, exc_val, exc_tb) + + def _check_running(self) -> None: + if self._event_loop_thread_id is None: + raise RuntimeError("This portal is not running") + if self._event_loop_thread_id == get_ident(): + raise RuntimeError( + "This method cannot be called from the event loop thread" + ) + + async def sleep_until_stopped(self) -> None: + """Sleep until :meth:`stop` is called.""" + await self._stop_event.wait() + + async def stop(self, cancel_remaining: bool = False) -> None: + """ + Signal the portal to shut down. + + This marks the portal as no longer accepting new calls and exits from + :meth:`sleep_until_stopped`. + + :param cancel_remaining: ``True`` to cancel all the remaining tasks, ``False`` + to let them finish before returning + + """ + self._event_loop_thread_id = None + self._stop_event.set() + if cancel_remaining: + self._task_group.cancel_scope.cancel("the blocking portal is shutting down") + + async def _call_func( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval] | T_Retval], + args: tuple[Unpack[PosArgsT]], + kwargs: dict[str, Any], + future: Future[T_Retval], + ) -> None: + def callback(f: Future[T_Retval]) -> None: + if f.cancelled(): + if self._event_loop_thread_id == get_ident(): + scope.cancel("the future was cancelled") + elif self._event_loop_thread_id is not None: + self.call(scope.cancel, "the future was cancelled") + + try: + retval_or_awaitable = func(*args, **kwargs) + if isawaitable(retval_or_awaitable): + with CancelScope() as scope: + future.add_done_callback(callback) + retval = await retval_or_awaitable + else: + retval = retval_or_awaitable + except get_cancelled_exc_class(): + future.cancel() + future.set_running_or_notify_cancel() + except BaseException as exc: + if not future.cancelled(): + future.set_exception(exc) + + # Let base exceptions fall through + if not isinstance(exc, Exception): + raise + else: + if not future.cancelled(): + future.set_result(retval) + finally: + scope = None # type: ignore[assignment] + + def _spawn_task_from_thread( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval] | T_Retval], + args: tuple[Unpack[PosArgsT]], + kwargs: dict[str, Any], + name: object, + future: Future[T_Retval], + ) -> None: + """ + Spawn a new task using the given callable. + + :param func: a callable + :param args: positional arguments to be passed to the callable + :param kwargs: keyword arguments to be passed to the callable + :param name: name of the task (will be coerced to a string if not ``None``) + :param future: a future that will resolve to the return value of the callable, + or the exception raised during its execution + + """ + run_sync( + partial(self._task_group.start_soon, name=name), + self._call_func, + func, + args, + kwargs, + future, + token=self._token, + ) + + @overload + def call( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + *args: Unpack[PosArgsT], + ) -> T_Retval: ... + + @overload + def call( + self, func: Callable[[Unpack[PosArgsT]], T_Retval], *args: Unpack[PosArgsT] + ) -> T_Retval: ... + + def call( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval] | T_Retval], + *args: Unpack[PosArgsT], + ) -> T_Retval: + """ + Call the given function in the event loop thread. + + If the callable returns a coroutine object, it is awaited on. + + :param func: any callable + :raises RuntimeError: if the portal is not running or if this method is called + from within the event loop thread + + """ + return cast(T_Retval, self.start_task_soon(func, *args).result()) + + @overload + def start_task_soon( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], + *args: Unpack[PosArgsT], + name: object = None, + ) -> Future[T_Retval]: ... + + @overload + def start_task_soon( + self, + func: Callable[[Unpack[PosArgsT]], T_Retval], + *args: Unpack[PosArgsT], + name: object = None, + ) -> Future[T_Retval]: ... + + def start_task_soon( + self, + func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval] | T_Retval], + *args: Unpack[PosArgsT], + name: object = None, + ) -> Future[T_Retval]: + """ + Start a task in the portal's task group. + + The task will be run inside a cancel scope which can be cancelled by cancelling + the returned future. + + :param func: the target function + :param args: positional arguments passed to ``func`` + :param name: name of the task (will be coerced to a string if not ``None``) + :return: a future that resolves with the return value of the callable if the + task completes successfully, or with the exception raised in the task + :raises RuntimeError: if the portal is not running or if this method is called + from within the event loop thread + :rtype: concurrent.futures.Future[T_Retval] + + .. versionadded:: 3.0 + + """ + self._check_running() + f: Future[T_Retval] = Future() + self._spawn_task_from_thread(func, args, {}, name, f) + return f + + def start_task( + self, + func: Callable[..., Awaitable[T_Retval]], + *args: object, + name: object = None, + ) -> tuple[Future[T_Retval], Any]: + """ + Start a task in the portal's task group and wait until it signals for readiness. + + This method works the same way as :meth:`.abc.TaskGroup.start`. + + :param func: the target function + :param args: positional arguments passed to ``func`` + :param name: name of the task (will be coerced to a string if not ``None``) + :return: a tuple of (future, task_status_value) where the ``task_status_value`` + is the value passed to ``task_status.started()`` from within the target + function + :rtype: tuple[concurrent.futures.Future[T_Retval], Any] + + .. versionadded:: 3.0 + + """ + + def task_done(future: Future[T_Retval]) -> None: + if not task_status_future.done(): + if future.cancelled(): + task_status_future.cancel() + elif future.exception(): + task_status_future.set_exception(future.exception()) + else: + exc = RuntimeError( + "Task exited without calling task_status.started()" + ) + task_status_future.set_exception(exc) + + self._check_running() + task_status_future: Future = Future() + task_status = _BlockingPortalTaskStatus(task_status_future) + f: Future = Future() + f.add_done_callback(task_done) + self._spawn_task_from_thread(func, args, {"task_status": task_status}, name, f) + return f, task_status_future.result() + + def wrap_async_context_manager( + self, cm: AbstractAsyncContextManager[T_co] + ) -> AbstractContextManager[T_co]: + """ + Wrap an async context manager as a synchronous context manager via this portal. + + Spawns a task that will call both ``__aenter__()`` and ``__aexit__()``, stopping + in the middle until the synchronous context manager exits. + + :param cm: an asynchronous context manager + :return: a synchronous context manager + + .. versionadded:: 2.1 + + """ + return _BlockingAsyncContextManager(cm, self) + + +@dataclass +class BlockingPortalProvider: + """ + A manager for a blocking portal. Used as a context manager. The first thread to + enter this context manager causes a blocking portal to be started with the specific + parameters, and the last thread to exit causes the portal to be shut down. Thus, + there will be exactly one blocking portal running in this context as long as at + least one thread has entered this context manager. + + The parameters are the same as for :func:`~anyio.run`. + + :param backend: name of the backend + :param backend_options: backend options + + .. versionadded:: 4.4 + """ + + backend: str = "asyncio" + backend_options: dict[str, Any] | None = None + _lock: Lock = field(init=False, default_factory=Lock) + _leases: int = field(init=False, default=0) + _portal: BlockingPortal = field(init=False) + _portal_cm: AbstractContextManager[BlockingPortal] | None = field( + init=False, default=None + ) + + def __enter__(self) -> BlockingPortal: + with self._lock: + if self._portal_cm is None: + self._portal_cm = start_blocking_portal( + self.backend, self.backend_options + ) + self._portal = self._portal_cm.__enter__() + + self._leases += 1 + return self._portal + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + portal_cm: AbstractContextManager[BlockingPortal] | None = None + with self._lock: + assert self._portal_cm + assert self._leases > 0 + self._leases -= 1 + if not self._leases: + portal_cm = self._portal_cm + self._portal_cm = None + del self._portal + + if portal_cm: + portal_cm.__exit__(None, None, None) + + +@contextmanager +def start_blocking_portal( + backend: str = "asyncio", + backend_options: dict[str, Any] | None = None, + *, + name: str | None = None, +) -> Generator[BlockingPortal, Any, None]: + """ + Start a new event loop in a new thread and run a blocking portal in its main task. + + The parameters are the same as for :func:`~anyio.run`. + + :param backend: name of the backend + :param backend_options: backend options + :param name: name of the thread + :return: a context manager that yields a blocking portal + + .. versionchanged:: 3.0 + Usage as a context manager is now required. + + """ + + async def run_portal() -> None: + async with BlockingPortal() as portal_: + if name is None: + current_thread().name = f"{backend}-portal-{id(portal_):x}" + + future.set_result(portal_) + await portal_.sleep_until_stopped() + + def run_blocking_portal() -> None: + if future.set_running_or_notify_cancel(): + try: + run_eventloop( + run_portal, backend=backend, backend_options=backend_options + ) + except BaseException as exc: + if not future.done(): + future.set_exception(exc) + + future: Future[BlockingPortal] = Future() + thread = Thread(target=run_blocking_portal, daemon=True, name=name) + thread.start() + try: + cancel_remaining_tasks = False + portal = future.result() + try: + yield portal + except BaseException: + cancel_remaining_tasks = True + raise + finally: + try: + portal.call(portal.stop, cancel_remaining_tasks) + except RuntimeError: + pass + finally: + thread.join() + + +def check_cancelled() -> None: + """ + Check if the cancel scope of the host task's running the current worker thread has + been cancelled. + + If the host task's current cancel scope has indeed been cancelled, the + backend-specific cancellation exception will be raised. + + :raises RuntimeError: if the current thread was not spawned by + :func:`.to_thread.run_sync` + + """ + try: + token: EventLoopToken = threadlocals.current_token + except AttributeError: + raise NoEventLoopError( + "This function can only be called inside an AnyIO worker thread" + ) from None + + token.backend_class.check_cancelled() diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/functools.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/functools.py new file mode 100755 index 0000000..b80afe6 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/functools.py @@ -0,0 +1,375 @@ +from __future__ import annotations + +__all__ = ( + "AsyncCacheInfo", + "AsyncCacheParameters", + "AsyncLRUCacheWrapper", + "cache", + "lru_cache", + "reduce", +) + +import functools +import sys +from collections import OrderedDict +from collections.abc import ( + AsyncIterable, + Awaitable, + Callable, + Coroutine, + Hashable, + Iterable, +) +from functools import update_wrapper +from inspect import iscoroutinefunction +from typing import ( + Any, + Generic, + NamedTuple, + TypedDict, + TypeVar, + cast, + final, + overload, +) +from weakref import WeakKeyDictionary + +from ._core._synchronization import Lock +from .lowlevel import RunVar, checkpoint + +if sys.version_info >= (3, 11): + from typing import ParamSpec +else: + from typing_extensions import ParamSpec + +T = TypeVar("T") +S = TypeVar("S") +P = ParamSpec("P") +lru_cache_items: RunVar[ + WeakKeyDictionary[ + AsyncLRUCacheWrapper[Any, Any], + OrderedDict[Hashable, tuple[_InitialMissingType, Lock] | tuple[Any, None]], + ] +] = RunVar("lru_cache_items") + + +class _InitialMissingType: + pass + + +initial_missing: _InitialMissingType = _InitialMissingType() + + +class AsyncCacheInfo(NamedTuple): + hits: int + misses: int + maxsize: int | None + currsize: int + + +class AsyncCacheParameters(TypedDict): + maxsize: int | None + typed: bool + always_checkpoint: bool + + +class _LRUMethodWrapper(Generic[T]): + def __init__(self, wrapper: AsyncLRUCacheWrapper[..., T], instance: object): + self.__wrapper = wrapper + self.__instance = instance + + def cache_info(self) -> AsyncCacheInfo: + return self.__wrapper.cache_info() + + def cache_parameters(self) -> AsyncCacheParameters: + return self.__wrapper.cache_parameters() + + def cache_clear(self) -> None: + self.__wrapper.cache_clear() + + async def __call__(self, *args: Any, **kwargs: Any) -> T: + if self.__instance is None: + return await self.__wrapper(*args, **kwargs) + + return await self.__wrapper(self.__instance, *args, **kwargs) + + +@final +class AsyncLRUCacheWrapper(Generic[P, T]): + def __init__( + self, + func: Callable[P, Awaitable[T]], + maxsize: int | None, + typed: bool, + always_checkpoint: bool, + ): + self.__wrapped__ = func + self._hits: int = 0 + self._misses: int = 0 + self._maxsize = max(maxsize, 0) if maxsize is not None else None + self._currsize: int = 0 + self._typed = typed + self._always_checkpoint = always_checkpoint + update_wrapper(self, func) + + def cache_info(self) -> AsyncCacheInfo: + return AsyncCacheInfo(self._hits, self._misses, self._maxsize, self._currsize) + + def cache_parameters(self) -> AsyncCacheParameters: + return { + "maxsize": self._maxsize, + "typed": self._typed, + "always_checkpoint": self._always_checkpoint, + } + + def cache_clear(self) -> None: + if cache := lru_cache_items.get(None): + cache.pop(self, None) + self._hits = self._misses = self._currsize = 0 + + async def __call__(self, *args: P.args, **kwargs: P.kwargs) -> T: + # Easy case first: if maxsize == 0, no caching is done + if self._maxsize == 0: + value = await self.__wrapped__(*args, **kwargs) + self._misses += 1 + return value + + # The key is constructed as a flat tuple to avoid memory overhead + key: tuple[Any, ...] = args + if kwargs: + # initial_missing is used as a separator + key += (initial_missing,) + sum(kwargs.items(), ()) + + if self._typed: + key += tuple(type(arg) for arg in args) + if kwargs: + key += (initial_missing,) + tuple(type(val) for val in kwargs.values()) + + try: + cache = lru_cache_items.get() + except LookupError: + cache = WeakKeyDictionary() + lru_cache_items.set(cache) + + try: + cache_entry = cache[self] + except KeyError: + cache_entry = cache[self] = OrderedDict() + + cached_value: T | _InitialMissingType + try: + cached_value, lock = cache_entry[key] + except KeyError: + # We're the first task to call this function + cached_value, lock = ( + initial_missing, + Lock(fast_acquire=not self._always_checkpoint), + ) + cache_entry[key] = cached_value, lock + + if lock is None: + # The value was already cached + self._hits += 1 + cache_entry.move_to_end(key) + if self._always_checkpoint: + await checkpoint() + + return cast(T, cached_value) + + async with lock: + # Check if another task filled the cache while we acquired the lock + if (cached_value := cache_entry[key][0]) is initial_missing: + self._misses += 1 + if self._maxsize is not None and self._currsize >= self._maxsize: + cache_entry.popitem(last=False) + else: + self._currsize += 1 + + value = await self.__wrapped__(*args, **kwargs) + cache_entry[key] = value, None + else: + # Another task filled the cache while we were waiting for the lock + self._hits += 1 + cache_entry.move_to_end(key) + value = cast(T, cached_value) + + return value + + def __get__( + self, instance: object, owner: type | None = None + ) -> _LRUMethodWrapper[T]: + wrapper = _LRUMethodWrapper(self, instance) + update_wrapper(wrapper, self.__wrapped__) + return wrapper + + +class _LRUCacheWrapper(Generic[T]): + def __init__(self, maxsize: int | None, typed: bool, always_checkpoint: bool): + self._maxsize = maxsize + self._typed = typed + self._always_checkpoint = always_checkpoint + + @overload + def __call__( # type: ignore[overload-overlap] + self, func: Callable[P, Coroutine[Any, Any, T]], / + ) -> AsyncLRUCacheWrapper[P, T]: ... + + @overload + def __call__( + self, func: Callable[..., T], / + ) -> functools._lru_cache_wrapper[T]: ... + + def __call__( + self, f: Callable[P, Coroutine[Any, Any, T]] | Callable[..., T], / + ) -> AsyncLRUCacheWrapper[P, T] | functools._lru_cache_wrapper[T]: + if iscoroutinefunction(f): + return AsyncLRUCacheWrapper( + f, self._maxsize, self._typed, self._always_checkpoint + ) + + return functools.lru_cache(maxsize=self._maxsize, typed=self._typed)(f) # type: ignore[arg-type] + + +@overload +def cache( # type: ignore[overload-overlap] + func: Callable[P, Coroutine[Any, Any, T]], / +) -> AsyncLRUCacheWrapper[P, T]: ... + + +@overload +def cache(func: Callable[..., T], /) -> functools._lru_cache_wrapper[T]: ... + + +def cache( + func: Callable[..., T] | Callable[P, Coroutine[Any, Any, T]], / +) -> AsyncLRUCacheWrapper[P, T] | functools._lru_cache_wrapper[T]: + """ + A convenient shortcut for :func:`lru_cache` with ``maxsize=None``. + + This is the asynchronous equivalent to :func:`functools.cache`. + + """ + return lru_cache(maxsize=None)(func) + + +@overload +def lru_cache( + *, maxsize: int | None = ..., typed: bool = ..., always_checkpoint: bool = ... +) -> _LRUCacheWrapper[Any]: ... + + +@overload +def lru_cache( # type: ignore[overload-overlap] + func: Callable[P, Coroutine[Any, Any, T]], / +) -> AsyncLRUCacheWrapper[P, T]: ... + + +@overload +def lru_cache(func: Callable[..., T], /) -> functools._lru_cache_wrapper[T]: ... + + +def lru_cache( + func: Callable[P, Coroutine[Any, Any, T]] | Callable[..., T] | None = None, + /, + *, + maxsize: int | None = 128, + typed: bool = False, + always_checkpoint: bool = False, +) -> ( + AsyncLRUCacheWrapper[P, T] | functools._lru_cache_wrapper[T] | _LRUCacheWrapper[Any] +): + """ + An asynchronous version of :func:`functools.lru_cache`. + + If a synchronous function is passed, the standard library + :func:`functools.lru_cache` is applied instead. + + :param always_checkpoint: if ``True``, every call to the cached function will be + guaranteed to yield control to the event loop at least once + + .. note:: Caches and locks are managed on a per-event loop basis. + + """ + if func is None: + return _LRUCacheWrapper[Any](maxsize, typed, always_checkpoint) + + if not callable(func): + raise TypeError("the first argument must be callable") + + return _LRUCacheWrapper[T](maxsize, typed, always_checkpoint)(func) + + +@overload +async def reduce( + function: Callable[[T, S], Awaitable[T]], + iterable: Iterable[S] | AsyncIterable[S], + /, + initial: T, +) -> T: ... + + +@overload +async def reduce( + function: Callable[[T, T], Awaitable[T]], + iterable: Iterable[T] | AsyncIterable[T], + /, +) -> T: ... + + +async def reduce( # type: ignore[misc] + function: Callable[[T, T], Awaitable[T]] | Callable[[T, S], Awaitable[T]], + iterable: Iterable[T] | Iterable[S] | AsyncIterable[T] | AsyncIterable[S], + /, + initial: T | _InitialMissingType = initial_missing, +) -> T: + """ + Asynchronous version of :func:`functools.reduce`. + + :param function: a coroutine function that takes two arguments: the accumulated + value and the next element from the iterable + :param iterable: an iterable or async iterable + :param initial: the initial value (if missing, the first element of the iterable is + used as the initial value) + + """ + element: Any + function_called = False + if isinstance(iterable, AsyncIterable): + async_it = iterable.__aiter__() + if initial is initial_missing: + try: + value = cast(T, await async_it.__anext__()) + except StopAsyncIteration: + raise TypeError( + "reduce() of empty sequence with no initial value" + ) from None + else: + value = cast(T, initial) + + async for element in async_it: + value = await function(value, element) + function_called = True + elif isinstance(iterable, Iterable): + it = iter(iterable) + if initial is initial_missing: + try: + value = cast(T, next(it)) + except StopIteration: + raise TypeError( + "reduce() of empty sequence with no initial value" + ) from None + else: + value = cast(T, initial) + + for element in it: + value = await function(value, element) + function_called = True + else: + raise TypeError("reduce() argument 2 must be an iterable or async iterable") + + # Make sure there is at least one checkpoint, even if an empty iterable and an + # initial value were given + if not function_called: + await checkpoint() + + return value diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/lowlevel.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/lowlevel.py new file mode 100755 index 0000000..ffbb75a --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/lowlevel.py @@ -0,0 +1,196 @@ +from __future__ import annotations + +__all__ = ( + "EventLoopToken", + "RunvarToken", + "RunVar", + "checkpoint", + "checkpoint_if_cancelled", + "cancel_shielded_checkpoint", + "current_token", +) + +import enum +from dataclasses import dataclass +from types import TracebackType +from typing import Any, Generic, Literal, TypeVar, final, overload +from weakref import WeakKeyDictionary + +from ._core._eventloop import get_async_backend +from .abc import AsyncBackend + +T = TypeVar("T") +D = TypeVar("D") + + +async def checkpoint() -> None: + """ + Check for cancellation and allow the scheduler to switch to another task. + + Equivalent to (but more efficient than):: + + await checkpoint_if_cancelled() + await cancel_shielded_checkpoint() + + .. versionadded:: 3.0 + + """ + await get_async_backend().checkpoint() + + +async def checkpoint_if_cancelled() -> None: + """ + Enter a checkpoint if the enclosing cancel scope has been cancelled. + + This does not allow the scheduler to switch to a different task. + + .. versionadded:: 3.0 + + """ + await get_async_backend().checkpoint_if_cancelled() + + +async def cancel_shielded_checkpoint() -> None: + """ + Allow the scheduler to switch to another task but without checking for cancellation. + + Equivalent to (but potentially more efficient than):: + + with CancelScope(shield=True): + await checkpoint() + + .. versionadded:: 3.0 + + """ + await get_async_backend().cancel_shielded_checkpoint() + + +@final +@dataclass(frozen=True, repr=False) +class EventLoopToken: + """ + An opaque object that holds a reference to an event loop. + + .. versionadded:: 4.11.0 + """ + + backend_class: type[AsyncBackend] + native_token: object + + +def current_token() -> EventLoopToken: + """ + Return a token object that can be used to call code in the current event loop from + another thread. + + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + .. versionadded:: 4.11.0 + + """ + backend_class = get_async_backend() + raw_token = backend_class.current_token() + return EventLoopToken(backend_class, raw_token) + + +_run_vars: WeakKeyDictionary[object, dict[RunVar[Any], Any]] = WeakKeyDictionary() + + +class _NoValueSet(enum.Enum): + NO_VALUE_SET = enum.auto() + + +class RunvarToken(Generic[T]): + __slots__ = "_var", "_value", "_redeemed" + + def __init__(self, var: RunVar[T], value: T | Literal[_NoValueSet.NO_VALUE_SET]): + self._var = var + self._value: T | Literal[_NoValueSet.NO_VALUE_SET] = value + self._redeemed = False + + def __enter__(self) -> RunvarToken[T]: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self._var.reset(self) + + +class RunVar(Generic[T]): + """ + Like a :class:`~contextvars.ContextVar`, except scoped to the running event loop. + + Can be used as a context manager, Just like :class:`~contextvars.ContextVar`, that + will reset the variable to its previous value when the context block is exited. + """ + + __slots__ = "_name", "_default" + + NO_VALUE_SET: Literal[_NoValueSet.NO_VALUE_SET] = _NoValueSet.NO_VALUE_SET + + def __init__( + self, name: str, default: T | Literal[_NoValueSet.NO_VALUE_SET] = NO_VALUE_SET + ): + self._name = name + self._default = default + + @property + def _current_vars(self) -> dict[RunVar[T], T]: + native_token = current_token().native_token + try: + return _run_vars[native_token] + except KeyError: + run_vars = _run_vars[native_token] = {} + return run_vars + + @overload + def get(self, default: D) -> T | D: ... + + @overload + def get(self) -> T: ... + + def get( + self, default: D | Literal[_NoValueSet.NO_VALUE_SET] = NO_VALUE_SET + ) -> T | D: + try: + return self._current_vars[self] + except KeyError: + if default is not RunVar.NO_VALUE_SET: + return default + elif self._default is not RunVar.NO_VALUE_SET: + return self._default + + raise LookupError( + f'Run variable "{self._name}" has no value and no default set' + ) + + def set(self, value: T) -> RunvarToken[T]: + current_vars = self._current_vars + token = RunvarToken(self, current_vars.get(self, RunVar.NO_VALUE_SET)) + current_vars[self] = value + return token + + def reset(self, token: RunvarToken[T]) -> None: + if token._var is not self: + raise ValueError("This token does not belong to this RunVar") + + if token._redeemed: + raise ValueError("This token has already been used") + + if token._value is _NoValueSet.NO_VALUE_SET: + try: + del self._current_vars[self] + except KeyError: + pass + else: + self._current_vars[self] = token._value + + token._redeemed = True + + def __repr__(self) -> str: + return f"" diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/py.typed b/code-server-config/.local/lib/python3.12/site-packages/anyio/py.typed new file mode 100755 index 0000000..e69de29 diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/pytest_plugin.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/pytest_plugin.py new file mode 100755 index 0000000..4222816 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/pytest_plugin.py @@ -0,0 +1,302 @@ +from __future__ import annotations + +import socket +import sys +from collections.abc import Callable, Generator, Iterator +from contextlib import ExitStack, contextmanager +from inspect import isasyncgenfunction, iscoroutinefunction, ismethod +from typing import Any, cast + +import pytest +from _pytest.fixtures import SubRequest +from _pytest.outcomes import Exit + +from . import get_available_backends +from ._core._eventloop import ( + current_async_library, + get_async_backend, + reset_current_async_library, + set_current_async_library, +) +from ._core._exceptions import iterate_exceptions +from .abc import TestRunner + +if sys.version_info < (3, 11): + from exceptiongroup import ExceptionGroup + +_current_runner: TestRunner | None = None +_runner_stack: ExitStack | None = None +_runner_leases = 0 + + +def extract_backend_and_options(backend: object) -> tuple[str, dict[str, Any]]: + if isinstance(backend, str): + return backend, {} + elif isinstance(backend, tuple) and len(backend) == 2: + if isinstance(backend[0], str) and isinstance(backend[1], dict): + return cast(tuple[str, dict[str, Any]], backend) + + raise TypeError("anyio_backend must be either a string or tuple of (string, dict)") + + +@contextmanager +def get_runner( + backend_name: str, backend_options: dict[str, Any] +) -> Iterator[TestRunner]: + global _current_runner, _runner_leases, _runner_stack + if _current_runner is None: + asynclib = get_async_backend(backend_name) + _runner_stack = ExitStack() + if current_async_library() is None: + # Since we're in control of the event loop, we can cache the name of the + # async library + token = set_current_async_library(backend_name) + _runner_stack.callback(reset_current_async_library, token) + + backend_options = backend_options or {} + _current_runner = _runner_stack.enter_context( + asynclib.create_test_runner(backend_options) + ) + + _runner_leases += 1 + try: + yield _current_runner + finally: + _runner_leases -= 1 + if not _runner_leases: + assert _runner_stack is not None + _runner_stack.close() + _runner_stack = _current_runner = None + + +def pytest_addoption(parser: pytest.Parser) -> None: + parser.addini( + "anyio_mode", + default="strict", + help='AnyIO plugin mode (either "strict" or "auto")', + ) + + +def pytest_configure(config: pytest.Config) -> None: + config.addinivalue_line( + "markers", + "anyio: mark the (coroutine function) test to be run asynchronously via anyio.", + ) + if ( + config.getini("anyio_mode") == "auto" + and config.pluginmanager.has_plugin("asyncio") + and config.getini("asyncio_mode") == "auto" + ): + config.issue_config_time_warning( + pytest.PytestConfigWarning( + "AnyIO auto mode has been enabled together with pytest-asyncio auto " + "mode. This may cause unexpected behavior." + ), + 1, + ) + + +@pytest.hookimpl(hookwrapper=True) +def pytest_fixture_setup(fixturedef: Any, request: Any) -> Generator[Any]: + def wrapper(anyio_backend: Any, request: SubRequest, **kwargs: Any) -> Any: + # Rebind any fixture methods to the request instance + if ( + request.instance + and ismethod(func) + and type(func.__self__) is type(request.instance) + ): + local_func = func.__func__.__get__(request.instance) + else: + local_func = func + + backend_name, backend_options = extract_backend_and_options(anyio_backend) + if has_backend_arg: + kwargs["anyio_backend"] = anyio_backend + + if has_request_arg: + kwargs["request"] = request + + with get_runner(backend_name, backend_options) as runner: + if isasyncgenfunction(local_func): + yield from runner.run_asyncgen_fixture(local_func, kwargs) + else: + yield runner.run_fixture(local_func, kwargs) + + # Only apply this to coroutine functions and async generator functions in requests + # that involve the anyio_backend fixture + func = fixturedef.func + if isasyncgenfunction(func) or iscoroutinefunction(func): + if "anyio_backend" in request.fixturenames: + fixturedef.func = wrapper + original_argname = fixturedef.argnames + + if not (has_backend_arg := "anyio_backend" in fixturedef.argnames): + fixturedef.argnames += ("anyio_backend",) + + if not (has_request_arg := "request" in fixturedef.argnames): + fixturedef.argnames += ("request",) + + try: + return (yield) + finally: + fixturedef.func = func + fixturedef.argnames = original_argname + + return (yield) + + +@pytest.hookimpl(tryfirst=True) +def pytest_pycollect_makeitem( + collector: pytest.Module | pytest.Class, name: str, obj: object +) -> None: + if collector.istestfunction(obj, name): + inner_func = obj.hypothesis.inner_test if hasattr(obj, "hypothesis") else obj + if iscoroutinefunction(inner_func): + anyio_auto_mode = collector.config.getini("anyio_mode") == "auto" + marker = collector.get_closest_marker("anyio") + own_markers = getattr(obj, "pytestmark", ()) + if ( + anyio_auto_mode + or marker + or any(marker.name == "anyio" for marker in own_markers) + ): + pytest.mark.usefixtures("anyio_backend")(obj) + + +@pytest.hookimpl(tryfirst=True) +def pytest_pyfunc_call(pyfuncitem: Any) -> bool | None: + def run_with_hypothesis(**kwargs: Any) -> None: + with get_runner(backend_name, backend_options) as runner: + runner.run_test(original_func, kwargs) + + backend = pyfuncitem.funcargs.get("anyio_backend") + if backend: + backend_name, backend_options = extract_backend_and_options(backend) + + if hasattr(pyfuncitem.obj, "hypothesis"): + # Wrap the inner test function unless it's already wrapped + original_func = pyfuncitem.obj.hypothesis.inner_test + if original_func.__qualname__ != run_with_hypothesis.__qualname__: + if iscoroutinefunction(original_func): + pyfuncitem.obj.hypothesis.inner_test = run_with_hypothesis + + return None + + if iscoroutinefunction(pyfuncitem.obj): + funcargs = pyfuncitem.funcargs + testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} + with get_runner(backend_name, backend_options) as runner: + try: + runner.run_test(pyfuncitem.obj, testargs) + except ExceptionGroup as excgrp: + for exc in iterate_exceptions(excgrp): + if isinstance(exc, (Exit, KeyboardInterrupt, SystemExit)): + raise exc from excgrp + + raise + + return True + + return None + + +@pytest.fixture(scope="module", params=get_available_backends()) +def anyio_backend(request: Any) -> Any: + return request.param + + +@pytest.fixture +def anyio_backend_name(anyio_backend: Any) -> str: + if isinstance(anyio_backend, str): + return anyio_backend + else: + return anyio_backend[0] + + +@pytest.fixture +def anyio_backend_options(anyio_backend: Any) -> dict[str, Any]: + if isinstance(anyio_backend, str): + return {} + else: + return anyio_backend[1] + + +class FreePortFactory: + """ + Manages port generation based on specified socket kind, ensuring no duplicate + ports are generated. + + This class provides functionality for generating available free ports on the + system. It is initialized with a specific socket kind and can generate ports + for given address families while avoiding reuse of previously generated ports. + + Users should not instantiate this class directly, but use the + ``free_tcp_port_factory`` and ``free_udp_port_factory`` fixtures instead. For simple + uses cases, ``free_tcp_port`` and ``free_udp_port`` can be used instead. + """ + + def __init__(self, kind: socket.SocketKind) -> None: + self._kind = kind + self._generated = set[int]() + + @property + def kind(self) -> socket.SocketKind: + """ + The type of socket connection (e.g., :data:`~socket.SOCK_STREAM` or + :data:`~socket.SOCK_DGRAM`) used to bind for checking port availability + + """ + return self._kind + + def __call__(self, family: socket.AddressFamily | None = None) -> int: + """ + Return an unbound port for the given address family. + + :param family: if omitted, both IPv4 and IPv6 addresses will be tried + :return: a port number + + """ + if family is not None: + families = [family] + else: + families = [socket.AF_INET] + if socket.has_ipv6: + families.append(socket.AF_INET6) + + while True: + port = 0 + with ExitStack() as stack: + for family in families: + sock = stack.enter_context(socket.socket(family, self._kind)) + addr = "::1" if family == socket.AF_INET6 else "127.0.0.1" + try: + sock.bind((addr, port)) + except OSError: + break + + if not port: + port = sock.getsockname()[1] + else: + if port not in self._generated: + self._generated.add(port) + return port + + +@pytest.fixture(scope="session") +def free_tcp_port_factory() -> FreePortFactory: + return FreePortFactory(socket.SOCK_STREAM) + + +@pytest.fixture(scope="session") +def free_udp_port_factory() -> FreePortFactory: + return FreePortFactory(socket.SOCK_DGRAM) + + +@pytest.fixture +def free_tcp_port(free_tcp_port_factory: Callable[[], int]) -> int: + return free_tcp_port_factory() + + +@pytest.fixture +def free_udp_port(free_udp_port_factory: Callable[[], int]) -> int: + return free_udp_port_factory() diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/__init__.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/buffered.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/buffered.py new file mode 100755 index 0000000..57c7cd7 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/buffered.py @@ -0,0 +1,188 @@ +from __future__ import annotations + +__all__ = ( + "BufferedByteReceiveStream", + "BufferedByteStream", + "BufferedConnectable", +) + +import sys +from collections.abc import Callable, Iterable, Mapping +from dataclasses import dataclass, field +from typing import Any, SupportsIndex + +from .. import ClosedResourceError, DelimiterNotFound, EndOfStream, IncompleteRead +from ..abc import ( + AnyByteReceiveStream, + AnyByteStream, + AnyByteStreamConnectable, + ByteReceiveStream, + ByteStream, + ByteStreamConnectable, +) + +if sys.version_info >= (3, 12): + from typing import override +else: + from typing_extensions import override + + +@dataclass(eq=False) +class BufferedByteReceiveStream(ByteReceiveStream): + """ + Wraps any bytes-based receive stream and uses a buffer to provide sophisticated + receiving capabilities in the form of a byte stream. + """ + + receive_stream: AnyByteReceiveStream + _buffer: bytearray = field(init=False, default_factory=bytearray) + _closed: bool = field(init=False, default=False) + + async def aclose(self) -> None: + await self.receive_stream.aclose() + self._closed = True + + @property + def buffer(self) -> bytes: + """The bytes currently in the buffer.""" + return bytes(self._buffer) + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + return self.receive_stream.extra_attributes + + def feed_data(self, data: Iterable[SupportsIndex], /) -> None: + """ + Append data directly into the buffer. + + Any data in the buffer will be consumed by receive operations before receiving + anything from the wrapped stream. + + :param data: the data to append to the buffer (can be bytes or anything else + that supports ``__index__()``) + + """ + self._buffer.extend(data) + + async def receive(self, max_bytes: int = 65536) -> bytes: + if self._closed: + raise ClosedResourceError + + if self._buffer: + chunk = bytes(self._buffer[:max_bytes]) + del self._buffer[:max_bytes] + return chunk + elif isinstance(self.receive_stream, ByteReceiveStream): + return await self.receive_stream.receive(max_bytes) + else: + # With a bytes-oriented object stream, we need to handle any surplus bytes + # we get from the receive() call + chunk = await self.receive_stream.receive() + if len(chunk) > max_bytes: + # Save the surplus bytes in the buffer + self._buffer.extend(chunk[max_bytes:]) + return chunk[:max_bytes] + else: + return chunk + + async def receive_exactly(self, nbytes: int) -> bytes: + """ + Read exactly the given amount of bytes from the stream. + + :param nbytes: the number of bytes to read + :return: the bytes read + :raises ~anyio.IncompleteRead: if the stream was closed before the requested + amount of bytes could be read from the stream + + """ + while True: + remaining = nbytes - len(self._buffer) + if remaining <= 0: + retval = self._buffer[:nbytes] + del self._buffer[:nbytes] + return bytes(retval) + + try: + if isinstance(self.receive_stream, ByteReceiveStream): + chunk = await self.receive_stream.receive(remaining) + else: + chunk = await self.receive_stream.receive() + except EndOfStream as exc: + raise IncompleteRead from exc + + self._buffer.extend(chunk) + + async def receive_until(self, delimiter: bytes, max_bytes: int) -> bytes: + """ + Read from the stream until the delimiter is found or max_bytes have been read. + + :param delimiter: the marker to look for in the stream + :param max_bytes: maximum number of bytes that will be read before raising + :exc:`~anyio.DelimiterNotFound` + :return: the bytes read (not including the delimiter) + :raises ~anyio.IncompleteRead: if the stream was closed before the delimiter + was found + :raises ~anyio.DelimiterNotFound: if the delimiter is not found within the + bytes read up to the maximum allowed + + """ + delimiter_size = len(delimiter) + offset = 0 + while True: + # Check if the delimiter can be found in the current buffer + index = self._buffer.find(delimiter, offset) + if index >= 0: + found = self._buffer[:index] + del self._buffer[: index + len(delimiter) :] + return bytes(found) + + # Check if the buffer is already at or over the limit + if len(self._buffer) >= max_bytes: + raise DelimiterNotFound(max_bytes) + + # Read more data into the buffer from the socket + try: + data = await self.receive_stream.receive() + except EndOfStream as exc: + raise IncompleteRead from exc + + # Move the offset forward and add the new data to the buffer + offset = max(len(self._buffer) - delimiter_size + 1, 0) + self._buffer.extend(data) + + +class BufferedByteStream(BufferedByteReceiveStream, ByteStream): + """ + A full-duplex variant of :class:`BufferedByteReceiveStream`. All writes are passed + through to the wrapped stream as-is. + """ + + def __init__(self, stream: AnyByteStream): + """ + :param stream: the stream to be wrapped + + """ + super().__init__(stream) + self._stream = stream + + @override + async def send_eof(self) -> None: + await self._stream.send_eof() + + @override + async def send(self, item: bytes) -> None: + await self._stream.send(item) + + +class BufferedConnectable(ByteStreamConnectable): + def __init__(self, connectable: AnyByteStreamConnectable): + """ + :param connectable: the connectable to wrap + + """ + self.connectable = connectable + + @override + async def connect(self) -> BufferedByteStream: + stream = await self.connectable.connect() + return BufferedByteStream(stream) diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/file.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/file.py new file mode 100755 index 0000000..82d2da8 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/file.py @@ -0,0 +1,154 @@ +from __future__ import annotations + +__all__ = ( + "FileReadStream", + "FileStreamAttribute", + "FileWriteStream", +) + +from collections.abc import Callable, Mapping +from io import SEEK_SET, UnsupportedOperation +from os import PathLike +from pathlib import Path +from typing import Any, BinaryIO, cast + +from .. import ( + BrokenResourceError, + ClosedResourceError, + EndOfStream, + TypedAttributeSet, + to_thread, + typed_attribute, +) +from ..abc import ByteReceiveStream, ByteSendStream + + +class FileStreamAttribute(TypedAttributeSet): + #: the open file descriptor + file: BinaryIO = typed_attribute() + #: the path of the file on the file system, if available (file must be a real file) + path: Path = typed_attribute() + #: the file number, if available (file must be a real file or a TTY) + fileno: int = typed_attribute() + + +class _BaseFileStream: + def __init__(self, file: BinaryIO): + self._file = file + + async def aclose(self) -> None: + await to_thread.run_sync(self._file.close) + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + attributes: dict[Any, Callable[[], Any]] = { + FileStreamAttribute.file: lambda: self._file, + } + + if hasattr(self._file, "name"): + attributes[FileStreamAttribute.path] = lambda: Path(self._file.name) + + try: + self._file.fileno() + except UnsupportedOperation: + pass + else: + attributes[FileStreamAttribute.fileno] = lambda: self._file.fileno() + + return attributes + + +class FileReadStream(_BaseFileStream, ByteReceiveStream): + """ + A byte stream that reads from a file in the file system. + + :param file: a file that has been opened for reading in binary mode + + .. versionadded:: 3.0 + """ + + @classmethod + async def from_path(cls, path: str | PathLike[str]) -> FileReadStream: + """ + Create a file read stream by opening the given file. + + :param path: path of the file to read from + + """ + file = await to_thread.run_sync(Path(path).open, "rb") + return cls(cast(BinaryIO, file)) + + async def receive(self, max_bytes: int = 65536) -> bytes: + try: + data = await to_thread.run_sync(self._file.read, max_bytes) + except ValueError: + raise ClosedResourceError from None + except OSError as exc: + raise BrokenResourceError from exc + + if data: + return data + else: + raise EndOfStream + + async def seek(self, position: int, whence: int = SEEK_SET) -> int: + """ + Seek the file to the given position. + + .. seealso:: :meth:`io.IOBase.seek` + + .. note:: Not all file descriptors are seekable. + + :param position: position to seek the file to + :param whence: controls how ``position`` is interpreted + :return: the new absolute position + :raises OSError: if the file is not seekable + + """ + return await to_thread.run_sync(self._file.seek, position, whence) + + async def tell(self) -> int: + """ + Return the current stream position. + + .. note:: Not all file descriptors are seekable. + + :return: the current absolute position + :raises OSError: if the file is not seekable + + """ + return await to_thread.run_sync(self._file.tell) + + +class FileWriteStream(_BaseFileStream, ByteSendStream): + """ + A byte stream that writes to a file in the file system. + + :param file: a file that has been opened for writing in binary mode + + .. versionadded:: 3.0 + """ + + @classmethod + async def from_path( + cls, path: str | PathLike[str], append: bool = False + ) -> FileWriteStream: + """ + Create a file write stream by opening the given file for writing. + + :param path: path of the file to write to + :param append: if ``True``, open the file for appending; if ``False``, any + existing file at the given path will be truncated + + """ + mode = "ab" if append else "wb" + file = await to_thread.run_sync(Path(path).open, mode) + return cls(cast(BinaryIO, file)) + + async def send(self, item: bytes) -> None: + try: + await to_thread.run_sync(self._file.write, item) + except ValueError: + raise ClosedResourceError from None + except OSError as exc: + raise BrokenResourceError from exc diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/memory.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/memory.py new file mode 100755 index 0000000..a3fa0c3 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/memory.py @@ -0,0 +1,325 @@ +from __future__ import annotations + +__all__ = ( + "MemoryObjectReceiveStream", + "MemoryObjectSendStream", + "MemoryObjectStreamStatistics", +) + +import warnings +from collections import OrderedDict, deque +from dataclasses import dataclass, field +from types import TracebackType +from typing import Generic, NamedTuple, TypeVar + +from .. import ( + BrokenResourceError, + ClosedResourceError, + EndOfStream, + WouldBlock, +) +from .._core._testing import TaskInfo, get_current_task +from ..abc import Event, ObjectReceiveStream, ObjectSendStream +from ..lowlevel import checkpoint + +T_Item = TypeVar("T_Item") +T_co = TypeVar("T_co", covariant=True) +T_contra = TypeVar("T_contra", contravariant=True) + + +class MemoryObjectStreamStatistics(NamedTuple): + current_buffer_used: int #: number of items stored in the buffer + #: maximum number of items that can be stored on this stream (or :data:`math.inf`) + max_buffer_size: float + open_send_streams: int #: number of unclosed clones of the send stream + open_receive_streams: int #: number of unclosed clones of the receive stream + #: number of tasks blocked on :meth:`MemoryObjectSendStream.send` + tasks_waiting_send: int + #: number of tasks blocked on :meth:`MemoryObjectReceiveStream.receive` + tasks_waiting_receive: int + + +@dataclass(eq=False) +class _MemoryObjectItemReceiver(Generic[T_Item]): + task_info: TaskInfo = field(init=False, default_factory=get_current_task) + item: T_Item = field(init=False) + + def __repr__(self) -> str: + # When item is not defined, we get following error with default __repr__: + # AttributeError: 'MemoryObjectItemReceiver' object has no attribute 'item' + item = getattr(self, "item", None) + return f"{self.__class__.__name__}(task_info={self.task_info}, item={item!r})" + + +@dataclass(eq=False) +class _MemoryObjectStreamState(Generic[T_Item]): + max_buffer_size: float = field() + buffer: deque[T_Item] = field(init=False, default_factory=deque) + open_send_channels: int = field(init=False, default=0) + open_receive_channels: int = field(init=False, default=0) + waiting_receivers: OrderedDict[Event, _MemoryObjectItemReceiver[T_Item]] = field( + init=False, default_factory=OrderedDict + ) + waiting_senders: OrderedDict[Event, T_Item] = field( + init=False, default_factory=OrderedDict + ) + + def statistics(self) -> MemoryObjectStreamStatistics: + return MemoryObjectStreamStatistics( + len(self.buffer), + self.max_buffer_size, + self.open_send_channels, + self.open_receive_channels, + len(self.waiting_senders), + len(self.waiting_receivers), + ) + + +@dataclass(eq=False) +class MemoryObjectReceiveStream(Generic[T_co], ObjectReceiveStream[T_co]): + _state: _MemoryObjectStreamState[T_co] + _closed: bool = field(init=False, default=False) + + def __post_init__(self) -> None: + self._state.open_receive_channels += 1 + + def receive_nowait(self) -> T_co: + """ + Receive the next item if it can be done without waiting. + + :return: the received item + :raises ~anyio.ClosedResourceError: if this send stream has been closed + :raises ~anyio.EndOfStream: if the buffer is empty and this stream has been + closed from the sending end + :raises ~anyio.WouldBlock: if there are no items in the buffer and no tasks + waiting to send + + """ + if self._closed: + raise ClosedResourceError + + if self._state.waiting_senders: + # Get the item from the next sender + send_event, item = self._state.waiting_senders.popitem(last=False) + self._state.buffer.append(item) + send_event.set() + + if self._state.buffer: + return self._state.buffer.popleft() + elif not self._state.open_send_channels: + raise EndOfStream + + raise WouldBlock + + async def receive(self) -> T_co: + await checkpoint() + try: + return self.receive_nowait() + except WouldBlock: + # Add ourselves in the queue + receive_event = Event() + receiver = _MemoryObjectItemReceiver[T_co]() + self._state.waiting_receivers[receive_event] = receiver + + try: + await receive_event.wait() + finally: + self._state.waiting_receivers.pop(receive_event, None) + + try: + return receiver.item + except AttributeError: + raise EndOfStream from None + + def clone(self) -> MemoryObjectReceiveStream[T_co]: + """ + Create a clone of this receive stream. + + Each clone can be closed separately. Only when all clones have been closed will + the receiving end of the memory stream be considered closed by the sending ends. + + :return: the cloned stream + + """ + if self._closed: + raise ClosedResourceError + + return MemoryObjectReceiveStream(_state=self._state) + + def close(self) -> None: + """ + Close the stream. + + This works the exact same way as :meth:`aclose`, but is provided as a special + case for the benefit of synchronous callbacks. + + """ + if not self._closed: + self._closed = True + self._state.open_receive_channels -= 1 + if self._state.open_receive_channels == 0: + send_events = list(self._state.waiting_senders.keys()) + for event in send_events: + event.set() + + async def aclose(self) -> None: + self.close() + + def statistics(self) -> MemoryObjectStreamStatistics: + """ + Return statistics about the current state of this stream. + + .. versionadded:: 3.0 + """ + return self._state.statistics() + + def __enter__(self) -> MemoryObjectReceiveStream[T_co]: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self.close() + + def __del__(self) -> None: + if not self._closed: + warnings.warn( + f"Unclosed <{self.__class__.__name__} at {id(self):x}>", + ResourceWarning, + stacklevel=1, + source=self, + ) + + +@dataclass(eq=False) +class MemoryObjectSendStream(Generic[T_contra], ObjectSendStream[T_contra]): + _state: _MemoryObjectStreamState[T_contra] + _closed: bool = field(init=False, default=False) + + def __post_init__(self) -> None: + self._state.open_send_channels += 1 + + def send_nowait(self, item: T_contra) -> None: + """ + Send an item immediately if it can be done without waiting. + + :param item: the item to send + :raises ~anyio.ClosedResourceError: if this send stream has been closed + :raises ~anyio.BrokenResourceError: if the stream has been closed from the + receiving end + :raises ~anyio.WouldBlock: if the buffer is full and there are no tasks waiting + to receive + + """ + if self._closed: + raise ClosedResourceError + if not self._state.open_receive_channels: + raise BrokenResourceError + + while self._state.waiting_receivers: + receive_event, receiver = self._state.waiting_receivers.popitem(last=False) + if not receiver.task_info.has_pending_cancellation(): + receiver.item = item + receive_event.set() + return + + if len(self._state.buffer) < self._state.max_buffer_size: + self._state.buffer.append(item) + else: + raise WouldBlock + + async def send(self, item: T_contra) -> None: + """ + Send an item to the stream. + + If the buffer is full, this method blocks until there is again room in the + buffer or the item can be sent directly to a receiver. + + :param item: the item to send + :raises ~anyio.ClosedResourceError: if this send stream has been closed + :raises ~anyio.BrokenResourceError: if the stream has been closed from the + receiving end + + """ + await checkpoint() + try: + self.send_nowait(item) + except WouldBlock: + # Wait until there's someone on the receiving end + send_event = Event() + self._state.waiting_senders[send_event] = item + try: + await send_event.wait() + except BaseException: + self._state.waiting_senders.pop(send_event, None) + raise + + if send_event in self._state.waiting_senders: + del self._state.waiting_senders[send_event] + raise BrokenResourceError from None + + def clone(self) -> MemoryObjectSendStream[T_contra]: + """ + Create a clone of this send stream. + + Each clone can be closed separately. Only when all clones have been closed will + the sending end of the memory stream be considered closed by the receiving ends. + + :return: the cloned stream + + """ + if self._closed: + raise ClosedResourceError + + return MemoryObjectSendStream(_state=self._state) + + def close(self) -> None: + """ + Close the stream. + + This works the exact same way as :meth:`aclose`, but is provided as a special + case for the benefit of synchronous callbacks. + + """ + if not self._closed: + self._closed = True + self._state.open_send_channels -= 1 + if self._state.open_send_channels == 0: + receive_events = list(self._state.waiting_receivers.keys()) + self._state.waiting_receivers.clear() + for event in receive_events: + event.set() + + async def aclose(self) -> None: + self.close() + + def statistics(self) -> MemoryObjectStreamStatistics: + """ + Return statistics about the current state of this stream. + + .. versionadded:: 3.0 + """ + return self._state.statistics() + + def __enter__(self) -> MemoryObjectSendStream[T_contra]: + return self + + def __exit__( + self, + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, + ) -> None: + self.close() + + def __del__(self) -> None: + if not self._closed: + warnings.warn( + f"Unclosed <{self.__class__.__name__} at {id(self):x}>", + ResourceWarning, + stacklevel=1, + source=self, + ) diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/stapled.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/stapled.py new file mode 100755 index 0000000..9248b68 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/stapled.py @@ -0,0 +1,147 @@ +from __future__ import annotations + +__all__ = ( + "MultiListener", + "StapledByteStream", + "StapledObjectStream", +) + +from collections.abc import Callable, Mapping, Sequence +from dataclasses import dataclass +from typing import Any, Generic, TypeVar + +from ..abc import ( + ByteReceiveStream, + ByteSendStream, + ByteStream, + Listener, + ObjectReceiveStream, + ObjectSendStream, + ObjectStream, + TaskGroup, +) + +T_Item = TypeVar("T_Item") +T_Stream = TypeVar("T_Stream") + + +@dataclass(eq=False) +class StapledByteStream(ByteStream): + """ + Combines two byte streams into a single, bidirectional byte stream. + + Extra attributes will be provided from both streams, with the receive stream + providing the values in case of a conflict. + + :param ByteSendStream send_stream: the sending byte stream + :param ByteReceiveStream receive_stream: the receiving byte stream + """ + + send_stream: ByteSendStream + receive_stream: ByteReceiveStream + + async def receive(self, max_bytes: int = 65536) -> bytes: + return await self.receive_stream.receive(max_bytes) + + async def send(self, item: bytes) -> None: + await self.send_stream.send(item) + + async def send_eof(self) -> None: + await self.send_stream.aclose() + + async def aclose(self) -> None: + await self.send_stream.aclose() + await self.receive_stream.aclose() + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + return { + **self.send_stream.extra_attributes, + **self.receive_stream.extra_attributes, + } + + +@dataclass(eq=False) +class StapledObjectStream(Generic[T_Item], ObjectStream[T_Item]): + """ + Combines two object streams into a single, bidirectional object stream. + + Extra attributes will be provided from both streams, with the receive stream + providing the values in case of a conflict. + + :param ObjectSendStream send_stream: the sending object stream + :param ObjectReceiveStream receive_stream: the receiving object stream + """ + + send_stream: ObjectSendStream[T_Item] + receive_stream: ObjectReceiveStream[T_Item] + + async def receive(self) -> T_Item: + return await self.receive_stream.receive() + + async def send(self, item: T_Item) -> None: + await self.send_stream.send(item) + + async def send_eof(self) -> None: + await self.send_stream.aclose() + + async def aclose(self) -> None: + await self.send_stream.aclose() + await self.receive_stream.aclose() + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + return { + **self.send_stream.extra_attributes, + **self.receive_stream.extra_attributes, + } + + +@dataclass(eq=False) +class MultiListener(Generic[T_Stream], Listener[T_Stream]): + """ + Combines multiple listeners into one, serving connections from all of them at once. + + Any MultiListeners in the given collection of listeners will have their listeners + moved into this one. + + Extra attributes are provided from each listener, with each successive listener + overriding any conflicting attributes from the previous one. + + :param listeners: listeners to serve + :type listeners: Sequence[Listener[T_Stream]] + """ + + listeners: Sequence[Listener[T_Stream]] + + def __post_init__(self) -> None: + listeners: list[Listener[T_Stream]] = [] + for listener in self.listeners: + if isinstance(listener, MultiListener): + listeners.extend(listener.listeners) + del listener.listeners[:] # type: ignore[attr-defined] + else: + listeners.append(listener) + + self.listeners = listeners + + async def serve( + self, handler: Callable[[T_Stream], Any], task_group: TaskGroup | None = None + ) -> None: + from .. import create_task_group + + async with create_task_group() as tg: + for listener in self.listeners: + tg.start_soon(listener.serve, handler, task_group) + + async def aclose(self) -> None: + for listener in self.listeners: + await listener.aclose() + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + attributes: dict = {} + for listener in self.listeners: + attributes.update(listener.extra_attributes) + + return attributes diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/text.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/text.py new file mode 100755 index 0000000..296cd25 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/text.py @@ -0,0 +1,176 @@ +from __future__ import annotations + +__all__ = ( + "TextConnectable", + "TextReceiveStream", + "TextSendStream", + "TextStream", +) + +import codecs +import sys +from collections.abc import Callable, Mapping +from dataclasses import InitVar, dataclass, field +from typing import Any + +from ..abc import ( + AnyByteReceiveStream, + AnyByteSendStream, + AnyByteStream, + AnyByteStreamConnectable, + ObjectReceiveStream, + ObjectSendStream, + ObjectStream, + ObjectStreamConnectable, +) + +if sys.version_info >= (3, 12): + from typing import override +else: + from typing_extensions import override + + +@dataclass(eq=False) +class TextReceiveStream(ObjectReceiveStream[str]): + """ + Stream wrapper that decodes bytes to strings using the given encoding. + + Decoding is done using :class:`~codecs.IncrementalDecoder` which returns any + completely received unicode characters as soon as they come in. + + :param transport_stream: any bytes-based receive stream + :param encoding: character encoding to use for decoding bytes to strings (defaults + to ``utf-8``) + :param errors: handling scheme for decoding errors (defaults to ``strict``; see the + `codecs module documentation`_ for a comprehensive list of options) + + .. _codecs module documentation: + https://docs.python.org/3/library/codecs.html#codec-objects + """ + + transport_stream: AnyByteReceiveStream + encoding: InitVar[str] = "utf-8" + errors: InitVar[str] = "strict" + _decoder: codecs.IncrementalDecoder = field(init=False) + + def __post_init__(self, encoding: str, errors: str) -> None: + decoder_class = codecs.getincrementaldecoder(encoding) + self._decoder = decoder_class(errors=errors) + + async def receive(self) -> str: + while True: + chunk = await self.transport_stream.receive() + decoded = self._decoder.decode(chunk) + if decoded: + return decoded + + async def aclose(self) -> None: + await self.transport_stream.aclose() + self._decoder.reset() + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + return self.transport_stream.extra_attributes + + +@dataclass(eq=False) +class TextSendStream(ObjectSendStream[str]): + """ + Sends strings to the wrapped stream as bytes using the given encoding. + + :param AnyByteSendStream transport_stream: any bytes-based send stream + :param str encoding: character encoding to use for encoding strings to bytes + (defaults to ``utf-8``) + :param str errors: handling scheme for encoding errors (defaults to ``strict``; see + the `codecs module documentation`_ for a comprehensive list of options) + + .. _codecs module documentation: + https://docs.python.org/3/library/codecs.html#codec-objects + """ + + transport_stream: AnyByteSendStream + encoding: InitVar[str] = "utf-8" + errors: str = "strict" + _encoder: Callable[..., tuple[bytes, int]] = field(init=False) + + def __post_init__(self, encoding: str) -> None: + self._encoder = codecs.getencoder(encoding) + + async def send(self, item: str) -> None: + encoded = self._encoder(item, self.errors)[0] + await self.transport_stream.send(encoded) + + async def aclose(self) -> None: + await self.transport_stream.aclose() + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + return self.transport_stream.extra_attributes + + +@dataclass(eq=False) +class TextStream(ObjectStream[str]): + """ + A bidirectional stream that decodes bytes to strings on receive and encodes strings + to bytes on send. + + Extra attributes will be provided from both streams, with the receive stream + providing the values in case of a conflict. + + :param AnyByteStream transport_stream: any bytes-based stream + :param str encoding: character encoding to use for encoding/decoding strings to/from + bytes (defaults to ``utf-8``) + :param str errors: handling scheme for encoding errors (defaults to ``strict``; see + the `codecs module documentation`_ for a comprehensive list of options) + + .. _codecs module documentation: + https://docs.python.org/3/library/codecs.html#codec-objects + """ + + transport_stream: AnyByteStream + encoding: InitVar[str] = "utf-8" + errors: InitVar[str] = "strict" + _receive_stream: TextReceiveStream = field(init=False) + _send_stream: TextSendStream = field(init=False) + + def __post_init__(self, encoding: str, errors: str) -> None: + self._receive_stream = TextReceiveStream( + self.transport_stream, encoding=encoding, errors=errors + ) + self._send_stream = TextSendStream( + self.transport_stream, encoding=encoding, errors=errors + ) + + async def receive(self) -> str: + return await self._receive_stream.receive() + + async def send(self, item: str) -> None: + await self._send_stream.send(item) + + async def send_eof(self) -> None: + await self.transport_stream.send_eof() + + async def aclose(self) -> None: + await self._send_stream.aclose() + await self._receive_stream.aclose() + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + return { + **self._send_stream.extra_attributes, + **self._receive_stream.extra_attributes, + } + + +class TextConnectable(ObjectStreamConnectable[str]): + def __init__(self, connectable: AnyByteStreamConnectable): + """ + :param connectable: the bytestream endpoint to wrap + + """ + self.connectable = connectable + + @override + async def connect(self) -> TextStream: + stream = await self.connectable.connect() + return TextStream(stream) diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/tls.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/tls.py new file mode 100755 index 0000000..b507488 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/streams/tls.py @@ -0,0 +1,424 @@ +from __future__ import annotations + +__all__ = ( + "TLSAttribute", + "TLSConnectable", + "TLSListener", + "TLSStream", +) + +import logging +import re +import ssl +import sys +from collections.abc import Callable, Mapping +from dataclasses import dataclass +from functools import wraps +from ssl import SSLContext +from typing import Any, TypeVar + +from .. import ( + BrokenResourceError, + EndOfStream, + aclose_forcefully, + get_cancelled_exc_class, + to_thread, +) +from .._core._typedattr import TypedAttributeSet, typed_attribute +from ..abc import ( + AnyByteStream, + AnyByteStreamConnectable, + ByteStream, + ByteStreamConnectable, + Listener, + TaskGroup, +) + +if sys.version_info >= (3, 10): + from typing import TypeAlias +else: + from typing_extensions import TypeAlias + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +if sys.version_info >= (3, 12): + from typing import override +else: + from typing_extensions import override + +T_Retval = TypeVar("T_Retval") +PosArgsT = TypeVarTuple("PosArgsT") +_PCTRTT: TypeAlias = tuple[tuple[str, str], ...] +_PCTRTTT: TypeAlias = tuple[_PCTRTT, ...] + + +class TLSAttribute(TypedAttributeSet): + """Contains Transport Layer Security related attributes.""" + + #: the selected ALPN protocol + alpn_protocol: str | None = typed_attribute() + #: the channel binding for type ``tls-unique`` + channel_binding_tls_unique: bytes = typed_attribute() + #: the selected cipher + cipher: tuple[str, str, int] = typed_attribute() + #: the peer certificate in dictionary form (see :meth:`ssl.SSLSocket.getpeercert` + # for more information) + peer_certificate: None | (dict[str, str | _PCTRTTT | _PCTRTT]) = typed_attribute() + #: the peer certificate in binary form + peer_certificate_binary: bytes | None = typed_attribute() + #: ``True`` if this is the server side of the connection + server_side: bool = typed_attribute() + #: ciphers shared by the client during the TLS handshake (``None`` if this is the + #: client side) + shared_ciphers: list[tuple[str, str, int]] | None = typed_attribute() + #: the :class:`~ssl.SSLObject` used for encryption + ssl_object: ssl.SSLObject = typed_attribute() + #: ``True`` if this stream does (and expects) a closing TLS handshake when the + #: stream is being closed + standard_compatible: bool = typed_attribute() + #: the TLS protocol version (e.g. ``TLSv1.2``) + tls_version: str = typed_attribute() + + +@dataclass(eq=False) +class TLSStream(ByteStream): + """ + A stream wrapper that encrypts all sent data and decrypts received data. + + This class has no public initializer; use :meth:`wrap` instead. + All extra attributes from :class:`~TLSAttribute` are supported. + + :var AnyByteStream transport_stream: the wrapped stream + + """ + + transport_stream: AnyByteStream + standard_compatible: bool + _ssl_object: ssl.SSLObject + _read_bio: ssl.MemoryBIO + _write_bio: ssl.MemoryBIO + + @classmethod + async def wrap( + cls, + transport_stream: AnyByteStream, + *, + server_side: bool | None = None, + hostname: str | None = None, + ssl_context: ssl.SSLContext | None = None, + standard_compatible: bool = True, + ) -> TLSStream: + """ + Wrap an existing stream with Transport Layer Security. + + This performs a TLS handshake with the peer. + + :param transport_stream: a bytes-transporting stream to wrap + :param server_side: ``True`` if this is the server side of the connection, + ``False`` if this is the client side (if omitted, will be set to ``False`` + if ``hostname`` has been provided, ``False`` otherwise). Used only to create + a default context when an explicit context has not been provided. + :param hostname: host name of the peer (if host name checking is desired) + :param ssl_context: the SSLContext object to use (if not provided, a secure + default will be created) + :param standard_compatible: if ``False``, skip the closing handshake when + closing the connection, and don't raise an exception if the peer does the + same + :raises ~ssl.SSLError: if the TLS handshake fails + + """ + if server_side is None: + server_side = not hostname + + if not ssl_context: + purpose = ( + ssl.Purpose.CLIENT_AUTH if server_side else ssl.Purpose.SERVER_AUTH + ) + ssl_context = ssl.create_default_context(purpose) + + # Re-enable detection of unexpected EOFs if it was disabled by Python + if hasattr(ssl, "OP_IGNORE_UNEXPECTED_EOF"): + ssl_context.options &= ~ssl.OP_IGNORE_UNEXPECTED_EOF + + bio_in = ssl.MemoryBIO() + bio_out = ssl.MemoryBIO() + + # External SSLContext implementations may do blocking I/O in wrap_bio(), + # but the standard library implementation won't + if type(ssl_context) is ssl.SSLContext: + ssl_object = ssl_context.wrap_bio( + bio_in, bio_out, server_side=server_side, server_hostname=hostname + ) + else: + ssl_object = await to_thread.run_sync( + ssl_context.wrap_bio, + bio_in, + bio_out, + server_side, + hostname, + None, + ) + + wrapper = cls( + transport_stream=transport_stream, + standard_compatible=standard_compatible, + _ssl_object=ssl_object, + _read_bio=bio_in, + _write_bio=bio_out, + ) + await wrapper._call_sslobject_method(ssl_object.do_handshake) + return wrapper + + async def _call_sslobject_method( + self, func: Callable[[Unpack[PosArgsT]], T_Retval], *args: Unpack[PosArgsT] + ) -> T_Retval: + while True: + try: + result = func(*args) + except ssl.SSLWantReadError: + try: + # Flush any pending writes first + if self._write_bio.pending: + await self.transport_stream.send(self._write_bio.read()) + + data = await self.transport_stream.receive() + except EndOfStream: + self._read_bio.write_eof() + except OSError as exc: + self._read_bio.write_eof() + self._write_bio.write_eof() + raise BrokenResourceError from exc + else: + self._read_bio.write(data) + except ssl.SSLWantWriteError: + await self.transport_stream.send(self._write_bio.read()) + except ssl.SSLSyscallError as exc: + self._read_bio.write_eof() + self._write_bio.write_eof() + raise BrokenResourceError from exc + except ssl.SSLError as exc: + self._read_bio.write_eof() + self._write_bio.write_eof() + if isinstance(exc, ssl.SSLEOFError) or ( + exc.strerror and "UNEXPECTED_EOF_WHILE_READING" in exc.strerror + ): + if self.standard_compatible: + raise BrokenResourceError from exc + else: + raise EndOfStream from None + + raise + else: + # Flush any pending writes first + if self._write_bio.pending: + await self.transport_stream.send(self._write_bio.read()) + + return result + + async def unwrap(self) -> tuple[AnyByteStream, bytes]: + """ + Does the TLS closing handshake. + + :return: a tuple of (wrapped byte stream, bytes left in the read buffer) + + """ + await self._call_sslobject_method(self._ssl_object.unwrap) + self._read_bio.write_eof() + self._write_bio.write_eof() + return self.transport_stream, self._read_bio.read() + + async def aclose(self) -> None: + if self.standard_compatible: + try: + await self.unwrap() + except BaseException: + await aclose_forcefully(self.transport_stream) + raise + + await self.transport_stream.aclose() + + async def receive(self, max_bytes: int = 65536) -> bytes: + data = await self._call_sslobject_method(self._ssl_object.read, max_bytes) + if not data: + raise EndOfStream + + return data + + async def send(self, item: bytes) -> None: + await self._call_sslobject_method(self._ssl_object.write, item) + + async def send_eof(self) -> None: + tls_version = self.extra(TLSAttribute.tls_version) + match = re.match(r"TLSv(\d+)(?:\.(\d+))?", tls_version) + if match: + major, minor = int(match.group(1)), int(match.group(2) or 0) + if (major, minor) < (1, 3): + raise NotImplementedError( + f"send_eof() requires at least TLSv1.3; current " + f"session uses {tls_version}" + ) + + raise NotImplementedError( + "send_eof() has not yet been implemented for TLS streams" + ) + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + return { + **self.transport_stream.extra_attributes, + TLSAttribute.alpn_protocol: self._ssl_object.selected_alpn_protocol, + TLSAttribute.channel_binding_tls_unique: ( + self._ssl_object.get_channel_binding + ), + TLSAttribute.cipher: self._ssl_object.cipher, + TLSAttribute.peer_certificate: lambda: self._ssl_object.getpeercert(False), + TLSAttribute.peer_certificate_binary: lambda: self._ssl_object.getpeercert( + True + ), + TLSAttribute.server_side: lambda: self._ssl_object.server_side, + TLSAttribute.shared_ciphers: lambda: self._ssl_object.shared_ciphers() + if self._ssl_object.server_side + else None, + TLSAttribute.standard_compatible: lambda: self.standard_compatible, + TLSAttribute.ssl_object: lambda: self._ssl_object, + TLSAttribute.tls_version: self._ssl_object.version, + } + + +@dataclass(eq=False) +class TLSListener(Listener[TLSStream]): + """ + A convenience listener that wraps another listener and auto-negotiates a TLS session + on every accepted connection. + + If the TLS handshake times out or raises an exception, + :meth:`handle_handshake_error` is called to do whatever post-mortem processing is + deemed necessary. + + Supports only the :attr:`~TLSAttribute.standard_compatible` extra attribute. + + :param Listener listener: the listener to wrap + :param ssl_context: the SSL context object + :param standard_compatible: a flag passed through to :meth:`TLSStream.wrap` + :param handshake_timeout: time limit for the TLS handshake + (passed to :func:`~anyio.fail_after`) + """ + + listener: Listener[Any] + ssl_context: ssl.SSLContext + standard_compatible: bool = True + handshake_timeout: float = 30 + + @staticmethod + async def handle_handshake_error(exc: BaseException, stream: AnyByteStream) -> None: + """ + Handle an exception raised during the TLS handshake. + + This method does 3 things: + + #. Forcefully closes the original stream + #. Logs the exception (unless it was a cancellation exception) using the + ``anyio.streams.tls`` logger + #. Reraises the exception if it was a base exception or a cancellation exception + + :param exc: the exception + :param stream: the original stream + + """ + await aclose_forcefully(stream) + + # Log all except cancellation exceptions + if not isinstance(exc, get_cancelled_exc_class()): + # CPython (as of 3.11.5) returns incorrect `sys.exc_info()` here when using + # any asyncio implementation, so we explicitly pass the exception to log + # (https://github.com/python/cpython/issues/108668). Trio does not have this + # issue because it works around the CPython bug. + logging.getLogger(__name__).exception( + "Error during TLS handshake", exc_info=exc + ) + + # Only reraise base exceptions and cancellation exceptions + if not isinstance(exc, Exception) or isinstance(exc, get_cancelled_exc_class()): + raise + + async def serve( + self, + handler: Callable[[TLSStream], Any], + task_group: TaskGroup | None = None, + ) -> None: + @wraps(handler) + async def handler_wrapper(stream: AnyByteStream) -> None: + from .. import fail_after + + try: + with fail_after(self.handshake_timeout): + wrapped_stream = await TLSStream.wrap( + stream, + ssl_context=self.ssl_context, + standard_compatible=self.standard_compatible, + ) + except BaseException as exc: + await self.handle_handshake_error(exc, stream) + else: + await handler(wrapped_stream) + + await self.listener.serve(handler_wrapper, task_group) + + async def aclose(self) -> None: + await self.listener.aclose() + + @property + def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: + return { + TLSAttribute.standard_compatible: lambda: self.standard_compatible, + } + + +class TLSConnectable(ByteStreamConnectable): + """ + Wraps another connectable and does TLS negotiation after a successful connection. + + :param connectable: the connectable to wrap + :param hostname: host name of the server (if host name checking is desired) + :param ssl_context: the SSLContext object to use (if not provided, a secure default + will be created) + :param standard_compatible: if ``False``, skip the closing handshake when closing + the connection, and don't raise an exception if the server does the same + """ + + def __init__( + self, + connectable: AnyByteStreamConnectable, + *, + hostname: str | None = None, + ssl_context: ssl.SSLContext | None = None, + standard_compatible: bool = True, + ) -> None: + self.connectable = connectable + self.ssl_context: SSLContext = ssl_context or ssl.create_default_context( + ssl.Purpose.SERVER_AUTH + ) + if not isinstance(self.ssl_context, ssl.SSLContext): + raise TypeError( + "ssl_context must be an instance of ssl.SSLContext, not " + f"{type(self.ssl_context).__name__}" + ) + self.hostname = hostname + self.standard_compatible = standard_compatible + + @override + async def connect(self) -> TLSStream: + stream = await self.connectable.connect() + try: + return await TLSStream.wrap( + stream, + hostname=self.hostname, + ssl_context=self.ssl_context, + standard_compatible=self.standard_compatible, + ) + except BaseException: + await aclose_forcefully(stream) + raise diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/to_interpreter.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/to_interpreter.py new file mode 100755 index 0000000..694dbe7 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/to_interpreter.py @@ -0,0 +1,246 @@ +from __future__ import annotations + +__all__ = ( + "run_sync", + "current_default_interpreter_limiter", +) + +import atexit +import os +import sys +from collections import deque +from collections.abc import Callable +from typing import Any, Final, TypeVar + +from . import current_time, to_thread +from ._core._exceptions import BrokenWorkerInterpreter +from ._core._synchronization import CapacityLimiter +from .lowlevel import RunVar + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +if sys.version_info >= (3, 14): + from concurrent.interpreters import ExecutionFailed, create + + def _interp_call( + func: Callable[..., Any], args: tuple[Any, ...] + ) -> tuple[Any, bool]: + try: + retval = func(*args) + except BaseException as exc: + return exc, True + else: + return retval, False + + class _Worker: + last_used: float = 0 + + def __init__(self) -> None: + self._interpreter = create() + + def destroy(self) -> None: + self._interpreter.close() + + def call( + self, + func: Callable[..., T_Retval], + args: tuple[Any, ...], + ) -> T_Retval: + try: + res, is_exception = self._interpreter.call(_interp_call, func, args) + except ExecutionFailed as exc: + raise BrokenWorkerInterpreter(exc.excinfo) from exc + + if is_exception: + raise res + + return res +elif sys.version_info >= (3, 13): + import _interpqueues + import _interpreters + + UNBOUND: Final = 2 # I have no clue how this works, but it was used in the stdlib + FMT_UNPICKLED: Final = 0 + FMT_PICKLED: Final = 1 + QUEUE_PICKLE_ARGS: Final = (FMT_PICKLED, UNBOUND) + QUEUE_UNPICKLE_ARGS: Final = (FMT_UNPICKLED, UNBOUND) + + _run_func = compile( + """ +import _interpqueues +from _interpreters import NotShareableError +from pickle import loads, dumps, HIGHEST_PROTOCOL + +QUEUE_PICKLE_ARGS = (1, 2) +QUEUE_UNPICKLE_ARGS = (0, 2) + +item = _interpqueues.get(queue_id)[0] +try: + func, args = loads(item) + retval = func(*args) +except BaseException as exc: + is_exception = True + retval = exc +else: + is_exception = False + +try: + _interpqueues.put(queue_id, (retval, is_exception), *QUEUE_UNPICKLE_ARGS) +except NotShareableError: + retval = dumps(retval, HIGHEST_PROTOCOL) + _interpqueues.put(queue_id, (retval, is_exception), *QUEUE_PICKLE_ARGS) + """, + "", + "exec", + ) + + class _Worker: + last_used: float = 0 + + def __init__(self) -> None: + self._interpreter_id = _interpreters.create() + self._queue_id = _interpqueues.create(1, *QUEUE_UNPICKLE_ARGS) + _interpreters.set___main___attrs( + self._interpreter_id, {"queue_id": self._queue_id} + ) + + def destroy(self) -> None: + _interpqueues.destroy(self._queue_id) + _interpreters.destroy(self._interpreter_id) + + def call( + self, + func: Callable[..., T_Retval], + args: tuple[Any, ...], + ) -> T_Retval: + import pickle + + item = pickle.dumps((func, args), pickle.HIGHEST_PROTOCOL) + _interpqueues.put(self._queue_id, item, *QUEUE_PICKLE_ARGS) + exc_info = _interpreters.exec(self._interpreter_id, _run_func) + if exc_info: + raise BrokenWorkerInterpreter(exc_info) + + res = _interpqueues.get(self._queue_id) + (res, is_exception), fmt = res[:2] + if fmt == FMT_PICKLED: + res = pickle.loads(res) + + if is_exception: + raise res + + return res +else: + + class _Worker: + last_used: float = 0 + + def __init__(self) -> None: + raise RuntimeError("subinterpreters require at least Python 3.13") + + def call( + self, + func: Callable[..., T_Retval], + args: tuple[Any, ...], + ) -> T_Retval: + raise NotImplementedError + + def destroy(self) -> None: + pass + + +DEFAULT_CPU_COUNT: Final = 8 # this is just an arbitrarily selected value +MAX_WORKER_IDLE_TIME = ( + 30 # seconds a subinterpreter can be idle before becoming eligible for pruning +) + +T_Retval = TypeVar("T_Retval") +PosArgsT = TypeVarTuple("PosArgsT") + +_idle_workers = RunVar[deque[_Worker]]("_available_workers") +_default_interpreter_limiter = RunVar[CapacityLimiter]("_default_interpreter_limiter") + + +def _stop_workers(workers: deque[_Worker]) -> None: + for worker in workers: + worker.destroy() + + workers.clear() + + +async def run_sync( + func: Callable[[Unpack[PosArgsT]], T_Retval], + *args: Unpack[PosArgsT], + limiter: CapacityLimiter | None = None, +) -> T_Retval: + """ + Call the given function with the given arguments in a subinterpreter. + + .. warning:: On Python 3.13, the :mod:`concurrent.interpreters` module was not yet + available, so the code path for that Python version relies on an undocumented, + private API. As such, it is recommended to not rely on this function for anything + mission-critical on Python 3.13. + + :param func: a callable + :param args: the positional arguments for the callable + :param limiter: capacity limiter to use to limit the total number of subinterpreters + running (if omitted, the default limiter is used) + :return: the result of the call + :raises BrokenWorkerInterpreter: if there's an internal error in a subinterpreter + + """ + if limiter is None: + limiter = current_default_interpreter_limiter() + + try: + idle_workers = _idle_workers.get() + except LookupError: + idle_workers = deque() + _idle_workers.set(idle_workers) + atexit.register(_stop_workers, idle_workers) + + async with limiter: + try: + worker = idle_workers.pop() + except IndexError: + worker = _Worker() + + try: + return await to_thread.run_sync( + worker.call, + func, + args, + limiter=limiter, + ) + finally: + # Prune workers that have been idle for too long + now = current_time() + while idle_workers: + if now - idle_workers[0].last_used <= MAX_WORKER_IDLE_TIME: + break + + await to_thread.run_sync(idle_workers.popleft().destroy, limiter=limiter) + + worker.last_used = current_time() + idle_workers.append(worker) + + +def current_default_interpreter_limiter() -> CapacityLimiter: + """ + Return the capacity limiter used by default to limit the number of concurrently + running subinterpreters. + + Defaults to the number of CPU cores. + + :return: a capacity limiter object + + """ + try: + return _default_interpreter_limiter.get() + except LookupError: + limiter = CapacityLimiter(os.cpu_count() or DEFAULT_CPU_COUNT) + _default_interpreter_limiter.set(limiter) + return limiter diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/to_process.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/to_process.py new file mode 100755 index 0000000..b289234 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/to_process.py @@ -0,0 +1,266 @@ +from __future__ import annotations + +__all__ = ( + "current_default_process_limiter", + "process_worker", + "run_sync", +) + +import os +import pickle +import subprocess +import sys +from collections import deque +from collections.abc import Callable +from importlib.util import module_from_spec, spec_from_file_location +from typing import TypeVar, cast + +from ._core._eventloop import current_time, get_async_backend, get_cancelled_exc_class +from ._core._exceptions import BrokenWorkerProcess +from ._core._subprocesses import open_process +from ._core._synchronization import CapacityLimiter +from ._core._tasks import CancelScope, fail_after +from .abc import ByteReceiveStream, ByteSendStream, Process +from .lowlevel import RunVar, checkpoint_if_cancelled +from .streams.buffered import BufferedByteReceiveStream + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +WORKER_MAX_IDLE_TIME = 300 # 5 minutes + +T_Retval = TypeVar("T_Retval") +PosArgsT = TypeVarTuple("PosArgsT") + +_process_pool_workers: RunVar[set[Process]] = RunVar("_process_pool_workers") +_process_pool_idle_workers: RunVar[deque[tuple[Process, float]]] = RunVar( + "_process_pool_idle_workers" +) +_default_process_limiter: RunVar[CapacityLimiter] = RunVar("_default_process_limiter") + + +async def run_sync( # type: ignore[return] + func: Callable[[Unpack[PosArgsT]], T_Retval], + *args: Unpack[PosArgsT], + cancellable: bool = False, + limiter: CapacityLimiter | None = None, +) -> T_Retval: + """ + Call the given function with the given arguments in a worker process. + + If the ``cancellable`` option is enabled and the task waiting for its completion is + cancelled, the worker process running it will be abruptly terminated using SIGKILL + (or ``terminateProcess()`` on Windows). + + :param func: a callable + :param args: positional arguments for the callable + :param cancellable: ``True`` to allow cancellation of the operation while it's + running + :param limiter: capacity limiter to use to limit the total amount of processes + running (if omitted, the default limiter is used) + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + :return: an awaitable that yields the return value of the function. + + """ + + async def send_raw_command(pickled_cmd: bytes) -> object: + try: + await stdin.send(pickled_cmd) + response = await buffered.receive_until(b"\n", 50) + status, length = response.split(b" ") + if status not in (b"RETURN", b"EXCEPTION"): + raise RuntimeError( + f"Worker process returned unexpected response: {response!r}" + ) + + pickled_response = await buffered.receive_exactly(int(length)) + except BaseException as exc: + workers.discard(process) + try: + process.kill() + with CancelScope(shield=True): + await process.aclose() + except ProcessLookupError: + pass + + if isinstance(exc, get_cancelled_exc_class()): + raise + else: + raise BrokenWorkerProcess from exc + + retval = pickle.loads(pickled_response) + if status == b"EXCEPTION": + assert isinstance(retval, BaseException) + raise retval + else: + return retval + + # First pickle the request before trying to reserve a worker process + await checkpoint_if_cancelled() + request = pickle.dumps(("run", func, args), protocol=pickle.HIGHEST_PROTOCOL) + + # If this is the first run in this event loop thread, set up the necessary variables + try: + workers = _process_pool_workers.get() + idle_workers = _process_pool_idle_workers.get() + except LookupError: + workers = set() + idle_workers = deque() + _process_pool_workers.set(workers) + _process_pool_idle_workers.set(idle_workers) + get_async_backend().setup_process_pool_exit_at_shutdown(workers) + + async with limiter or current_default_process_limiter(): + # Pop processes from the pool (starting from the most recently used) until we + # find one that hasn't exited yet + process: Process + while idle_workers: + process, idle_since = idle_workers.pop() + if process.returncode is None: + stdin = cast(ByteSendStream, process.stdin) + buffered = BufferedByteReceiveStream( + cast(ByteReceiveStream, process.stdout) + ) + + # Prune any other workers that have been idle for WORKER_MAX_IDLE_TIME + # seconds or longer + now = current_time() + killed_processes: list[Process] = [] + while idle_workers: + if now - idle_workers[0][1] < WORKER_MAX_IDLE_TIME: + break + + process_to_kill, idle_since = idle_workers.popleft() + process_to_kill.kill() + workers.remove(process_to_kill) + killed_processes.append(process_to_kill) + + with CancelScope(shield=True): + for killed_process in killed_processes: + await killed_process.aclose() + + break + + workers.remove(process) + else: + command = [sys.executable, "-u", "-m", __name__] + process = await open_process( + command, stdin=subprocess.PIPE, stdout=subprocess.PIPE + ) + try: + stdin = cast(ByteSendStream, process.stdin) + buffered = BufferedByteReceiveStream( + cast(ByteReceiveStream, process.stdout) + ) + with fail_after(20): + message = await buffered.receive(6) + + if message != b"READY\n": + raise BrokenWorkerProcess( + f"Worker process returned unexpected response: {message!r}" + ) + + main_module_path = getattr(sys.modules["__main__"], "__file__", None) + pickled = pickle.dumps( + ("init", sys.path, main_module_path), + protocol=pickle.HIGHEST_PROTOCOL, + ) + await send_raw_command(pickled) + except (BrokenWorkerProcess, get_cancelled_exc_class()): + raise + except BaseException as exc: + process.kill() + raise BrokenWorkerProcess( + "Error during worker process initialization" + ) from exc + + workers.add(process) + + with CancelScope(shield=not cancellable): + try: + return cast(T_Retval, await send_raw_command(request)) + finally: + if process in workers: + idle_workers.append((process, current_time())) + + +def current_default_process_limiter() -> CapacityLimiter: + """ + Return the capacity limiter that is used by default to limit the number of worker + processes. + + :return: a capacity limiter object + + """ + try: + return _default_process_limiter.get() + except LookupError: + limiter = CapacityLimiter(os.cpu_count() or 2) + _default_process_limiter.set(limiter) + return limiter + + +def process_worker() -> None: + # Redirect standard streams to os.devnull so that user code won't interfere with the + # parent-worker communication + stdin = sys.stdin + stdout = sys.stdout + sys.stdin = open(os.devnull) + sys.stdout = open(os.devnull, "w") + + stdout.buffer.write(b"READY\n") + while True: + retval = exception = None + try: + command, *args = pickle.load(stdin.buffer) + except EOFError: + return + except BaseException as exc: + exception = exc + else: + if command == "run": + func, args = args + try: + retval = func(*args) + except BaseException as exc: + exception = exc + elif command == "init": + main_module_path: str | None + sys.path, main_module_path = args + del sys.modules["__main__"] + if main_module_path and os.path.isfile(main_module_path): + # Load the parent's main module but as __mp_main__ instead of + # __main__ (like multiprocessing does) to avoid infinite recursion + try: + spec = spec_from_file_location("__mp_main__", main_module_path) + if spec and spec.loader: + main = module_from_spec(spec) + spec.loader.exec_module(main) + sys.modules["__main__"] = main + except BaseException as exc: + exception = exc + try: + if exception is not None: + status = b"EXCEPTION" + pickled = pickle.dumps(exception, pickle.HIGHEST_PROTOCOL) + else: + status = b"RETURN" + pickled = pickle.dumps(retval, pickle.HIGHEST_PROTOCOL) + except BaseException as exc: + exception = exc + status = b"EXCEPTION" + pickled = pickle.dumps(exc, pickle.HIGHEST_PROTOCOL) + + stdout.buffer.write(b"%s %d\n" % (status, len(pickled))) + stdout.buffer.write(pickled) + + # Respect SIGTERM + if isinstance(exception, SystemExit): + raise exception + + +if __name__ == "__main__": + process_worker() diff --git a/code-server-config/.local/lib/python3.12/site-packages/anyio/to_thread.py b/code-server-config/.local/lib/python3.12/site-packages/anyio/to_thread.py new file mode 100755 index 0000000..4be5b71 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/anyio/to_thread.py @@ -0,0 +1,78 @@ +from __future__ import annotations + +__all__ = ( + "run_sync", + "current_default_thread_limiter", +) + +import sys +from collections.abc import Callable +from typing import TypeVar +from warnings import warn + +from ._core._eventloop import get_async_backend +from .abc import CapacityLimiter + +if sys.version_info >= (3, 11): + from typing import TypeVarTuple, Unpack +else: + from typing_extensions import TypeVarTuple, Unpack + +T_Retval = TypeVar("T_Retval") +PosArgsT = TypeVarTuple("PosArgsT") + + +async def run_sync( + func: Callable[[Unpack[PosArgsT]], T_Retval], + *args: Unpack[PosArgsT], + abandon_on_cancel: bool = False, + cancellable: bool | None = None, + limiter: CapacityLimiter | None = None, +) -> T_Retval: + """ + Call the given function with the given arguments in a worker thread. + + If the ``cancellable`` option is enabled and the task waiting for its completion is + cancelled, the thread will still run its course but its return value (or any raised + exception) will be ignored. + + :param func: a callable + :param args: positional arguments for the callable + :param abandon_on_cancel: ``True`` to abandon the thread (leaving it to run + unchecked on own) if the host task is cancelled, ``False`` to ignore + cancellations in the host task until the operation has completed in the worker + thread + :param cancellable: deprecated alias of ``abandon_on_cancel``; will override + ``abandon_on_cancel`` if both parameters are passed + :param limiter: capacity limiter to use to limit the total amount of threads running + (if omitted, the default limiter is used) + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + :return: an awaitable that yields the return value of the function. + + """ + if cancellable is not None: + abandon_on_cancel = cancellable + warn( + "The `cancellable=` keyword argument to `anyio.to_thread.run_sync` is " + "deprecated since AnyIO 4.1.0; use `abandon_on_cancel=` instead", + DeprecationWarning, + stacklevel=2, + ) + + return await get_async_backend().run_sync_in_worker_thread( + func, args, abandon_on_cancel=abandon_on_cancel, limiter=limiter + ) + + +def current_default_thread_limiter() -> CapacityLimiter: + """ + Return the capacity limiter that is used by default to limit the number of + concurrent threads. + + :return: a capacity limiter object + :raises NoEventLoopError: if no supported asynchronous event loop is running in the + current thread + + """ + return get_async_backend().current_default_thread_limiter() diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/INSTALLER b/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/INSTALLER new file mode 100755 index 0000000..a1b589e --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/METADATA b/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/METADATA new file mode 100755 index 0000000..fd04670 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/METADATA @@ -0,0 +1,131 @@ +Metadata-Version: 2.4 +Name: asyncpg +Version: 0.31.0 +Summary: An asyncio PostgreSQL driver +Author-email: MagicStack Inc +License-Expression: Apache-2.0 +Project-URL: github, https://github.com/MagicStack/asyncpg +Keywords: database,postgres +Classifier: Development Status :: 5 - Production/Stable +Classifier: Framework :: AsyncIO +Classifier: Intended Audience :: Developers +Classifier: Operating System :: POSIX +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Operating System :: Microsoft :: Windows +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: 3.14 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Free Threading :: 2 - Beta +Classifier: Topic :: Database :: Front-Ends +Requires-Python: >=3.9.0 +Description-Content-Type: text/x-rst +License-File: LICENSE +Requires-Dist: async_timeout>=4.0.3; python_version < "3.11.0" +Provides-Extra: gssauth +Requires-Dist: gssapi; platform_system != "Windows" and extra == "gssauth" +Requires-Dist: sspilib; platform_system == "Windows" and extra == "gssauth" +Dynamic: license-file + +asyncpg -- A fast PostgreSQL Database Client Library for Python/asyncio +======================================================================= + +.. image:: https://github.com/MagicStack/asyncpg/workflows/Tests/badge.svg + :target: https://github.com/MagicStack/asyncpg/actions?query=workflow%3ATests+branch%3Amaster + :alt: GitHub Actions status +.. image:: https://img.shields.io/pypi/v/asyncpg.svg + :target: https://pypi.python.org/pypi/asyncpg + +**asyncpg** is a database interface library designed specifically for +PostgreSQL and Python/asyncio. asyncpg is an efficient, clean implementation +of PostgreSQL server binary protocol for use with Python's ``asyncio`` +framework. You can read more about asyncpg in an introductory +`blog post `_. + +asyncpg requires Python 3.9 or later and is supported for PostgreSQL +versions 9.5 to 18. Other PostgreSQL versions or other databases +implementing the PostgreSQL protocol *may* work, but are not being +actively tested. + + +Documentation +------------- + +The project documentation can be found +`here `_. + + +Performance +----------- + +In our testing asyncpg is, on average, **5x** faster than psycopg3. + +.. image:: https://raw.githubusercontent.com/MagicStack/asyncpg/master/performance.png?fddca40ab0 + :target: https://gistpreview.github.io/?0ed296e93523831ea0918d42dd1258c2 + +The above results are a geometric mean of benchmarks obtained with PostgreSQL +`client driver benchmarking toolbench `_ +in June 2023 (click on the chart to see full details). + + +Features +-------- + +asyncpg implements PostgreSQL server protocol natively and exposes its +features directly, as opposed to hiding them behind a generic facade +like DB-API. + +This enables asyncpg to have easy-to-use support for: + +* **prepared statements** +* **scrollable cursors** +* **partial iteration** on query results +* automatic encoding and decoding of composite types, arrays, + and any combination of those +* straightforward support for custom data types + + +Installation +------------ + +asyncpg is available on PyPI. When not using GSSAPI/SSPI authentication it +has no dependencies. Use pip to install:: + + $ pip install asyncpg + +If you need GSSAPI/SSPI authentication, use:: + + $ pip install 'asyncpg[gssauth]' + +For more details, please `see the documentation +`_. + + +Basic Usage +----------- + +.. code-block:: python + + import asyncio + import asyncpg + + async def run(): + conn = await asyncpg.connect(user='user', password='password', + database='database', host='127.0.0.1') + values = await conn.fetch( + 'SELECT * FROM mytable WHERE id = $1', + 10, + ) + await conn.close() + + asyncio.run(run()) + + +License +------- + +asyncpg is developed and distributed under the Apache 2.0 license. diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/RECORD b/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/RECORD new file mode 100755 index 0000000..c68fb65 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/RECORD @@ -0,0 +1,115 @@ +asyncpg-0.31.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +asyncpg-0.31.0.dist-info/METADATA,sha256=6_wrzxCAjX9RTCqcxrKtAFVVNEZ2fTxlHcbvo62M0R8,4412 +asyncpg-0.31.0.dist-info/RECORD,, +asyncpg-0.31.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +asyncpg-0.31.0.dist-info/WHEEL,sha256=VXvNKn6nFeCM45GEUrNLJOO_J_e-cNJphGt9rWFxyE0,113 +asyncpg-0.31.0.dist-info/licenses/LICENSE,sha256=2SItc_2sUJkhdAdu-gT0T2-82dVhVafHCS6YdXBCpvY,11466 +asyncpg-0.31.0.dist-info/top_level.txt,sha256=DdhVhpzCq49mykkHNag6i9zuJx05_tx4CMZymM1F8dU,8 +asyncpg/__init__.py,sha256=bzD31aMekbKR9waMXuAxIYFbmrQ-S1Mttjmru_sSjo8,647 +asyncpg/__pycache__/__init__.cpython-312.pyc,, +asyncpg/__pycache__/_asyncio_compat.cpython-312.pyc,, +asyncpg/__pycache__/_version.cpython-312.pyc,, +asyncpg/__pycache__/cluster.cpython-312.pyc,, +asyncpg/__pycache__/compat.cpython-312.pyc,, +asyncpg/__pycache__/connect_utils.cpython-312.pyc,, +asyncpg/__pycache__/connection.cpython-312.pyc,, +asyncpg/__pycache__/connresource.cpython-312.pyc,, +asyncpg/__pycache__/cursor.cpython-312.pyc,, +asyncpg/__pycache__/introspection.cpython-312.pyc,, +asyncpg/__pycache__/pool.cpython-312.pyc,, +asyncpg/__pycache__/prepared_stmt.cpython-312.pyc,, +asyncpg/__pycache__/serverversion.cpython-312.pyc,, +asyncpg/__pycache__/transaction.cpython-312.pyc,, +asyncpg/__pycache__/types.cpython-312.pyc,, +asyncpg/__pycache__/utils.cpython-312.pyc,, +asyncpg/_asyncio_compat.py,sha256=pXF_aF4o_AqxNql0sPnuGdoe5sSSwQxHpKWF6ShZTbo,2540 +asyncpg/_testbase/__init__.py,sha256=IzMqfgI5gtOxajneoeWyoI4NtmE5sp7S5dXmU0gwwB8,16499 +asyncpg/_testbase/__pycache__/__init__.cpython-312.pyc,, +asyncpg/_testbase/__pycache__/fuzzer.cpython-312.pyc,, +asyncpg/_testbase/fuzzer.py,sha256=3Uxdu0YXei-7JZMCuCI3bxKMdnbuossV-KC68GG-AS4,9804 +asyncpg/_version.py,sha256=DIxy-OSz203zJ1z-llM0b0YFnqQtPgPR9jOjCWlyutE,641 +asyncpg/cluster.py,sha256=s_HmtiEGJqJ6GQWa6_zmfe11fZ29OpOtMT6Ufcu-g0g,24476 +asyncpg/compat.py,sha256=ebs2IeJw82rY9m0ZCmOYUqry_2nF3zqTi3tsWP5FT2o,2459 +asyncpg/connect_utils.py,sha256=-kLsbKn6zO5ixgatHN3Av3FvkZrLIAXF-tpao_bmy5w,43438 +asyncpg/connection.py,sha256=6avVwVO8cM-tthIV8RFA6QdBwv7Vkp5XS2VI74CStIw,99069 +asyncpg/connresource.py,sha256=tBAidNpEhbDvrMOKQbwn3ZNgIVAtsVxARxTnwj5fk-Q,1384 +asyncpg/cursor.py,sha256=rKeSIJMW5mUpvsian6a1MLrLoEwbkYTZsmZtEgwFT6s,9160 +asyncpg/exceptions/__init__.py,sha256=FXUYDFQw9gxE3mVz99FmsldYxivLUMtTIhXzu5tZ7Pk,29157 +asyncpg/exceptions/__pycache__/__init__.cpython-312.pyc,, +asyncpg/exceptions/__pycache__/_base.cpython-312.pyc,, +asyncpg/exceptions/_base.py,sha256=u62xv69n4AHO1xr35FjdgZhYvqdeb_mkQKyp-ip_AyQ,9260 +asyncpg/introspection.py,sha256=0eRQtt0mKPGv8V2fnTSizC_vLuk8jbO1VwoiQ5SAcd4,9340 +asyncpg/pgproto/__init__.pxd,sha256=uUIkKuI6IGnQ5tZXtrjOC_13qjp9MZOwewKlrxKFzPY,213 +asyncpg/pgproto/__init__.py,sha256=uUIkKuI6IGnQ5tZXtrjOC_13qjp9MZOwewKlrxKFzPY,213 +asyncpg/pgproto/__pycache__/__init__.cpython-312.pyc,, +asyncpg/pgproto/__pycache__/types.cpython-312.pyc,, +asyncpg/pgproto/buffer.pxd,sha256=d-hqi81ZVLD16lT-NacaQXTYKCtE-RYxWJmZisliZV8,4542 +asyncpg/pgproto/buffer.pxi,sha256=zdk5rOOoenHpwwYXcEo-NyUcLgUv3QxA40JCXarKVsM,93 +asyncpg/pgproto/buffer.pyx,sha256=mcaNScr1jPI8kpxT9jfg_Nicy8JOjQv6WM2j5JNPoAA,25710 +asyncpg/pgproto/codecs/__init__.pxd,sha256=zHtFdDnGn8eDSPOTPw8JzD8w_OCJyqL0F6s9dR8Vz2Y,6130 +asyncpg/pgproto/codecs/bits.pyx,sha256=x4MMVRLotz9R8n81E0S3lQQk23AvLlODb2pe_NGYqCI,1475 +asyncpg/pgproto/codecs/bytea.pyx,sha256=ot-oFH-hzQ89EUWneHk5QDUxl2krKkpYE_nWklVHXWU,997 +asyncpg/pgproto/codecs/context.pyx,sha256=oYurToHnpZz-Q8kPzRORFS_RyV4HH5kscNKsZYPt4FU,623 +asyncpg/pgproto/codecs/datetime.pyx,sha256=wLcPVOoPMsI7P8VIuQRO7oyqhr8VRIrKMvDtSqjYSVo,12855 +asyncpg/pgproto/codecs/float.pyx,sha256=A6XXA2NdS82EENhADA35LInxLcJsRpXvF6JVme_6HCc,1031 +asyncpg/pgproto/codecs/geometry.pyx,sha256=DtRADwsifbzAZyACxakne2MVApcUNji8EyOgtKuoEaw,4665 +asyncpg/pgproto/codecs/hstore.pyx,sha256=sXwFn3uzypvPkYIFH0FykiW9RU8qRme2N0lg8UoB6kg,2018 +asyncpg/pgproto/codecs/int.pyx,sha256=4RuntTl_4-I7ekCSONK9y4CWFghUmaFGldXL6ruLgxM,4527 +asyncpg/pgproto/codecs/json.pyx,sha256=fs7d0sroyMM9UZW-mmGgvHtVG7MiBac7Inb_wz1mMRs,1454 +asyncpg/pgproto/codecs/jsonpath.pyx,sha256=bAXgTvPzQlkJdlHHB95CNl03J2WAd_iK3JsE1PXI2KU,833 +asyncpg/pgproto/codecs/misc.pyx,sha256=ul5HFobQ1H3shO6ThrSlkEHO1lvxOoqTnRej3UabKiQ,484 +asyncpg/pgproto/codecs/network.pyx,sha256=1oFM__xT5H3pIZrLyRqjNqrR6z1UNlqMOWGTGnsbOyw,3917 +asyncpg/pgproto/codecs/numeric.pyx,sha256=TAN5stFXzmEiyP69MDG1oXryPAFCyZmxHcqPc-vy7LM,10373 +asyncpg/pgproto/codecs/pg_snapshot.pyx,sha256=WGJ-dv7JXVufybAiuScth7KlXXLRdMqSKbtfT4kpVWI,1814 +asyncpg/pgproto/codecs/text.pyx,sha256=yHpJCRxrf2Pgmz1abYSgvFQDRcgCJN137aniygOo_ec,1516 +asyncpg/pgproto/codecs/tid.pyx,sha256=_9L8C9NSDV6Ehk48VV8xOLDNLVJz2R88EornZbHcq88,1549 +asyncpg/pgproto/codecs/uuid.pyx,sha256=XIydQCaPUlfz9MvVDOu_5BTHd1kSKmJ1r3kBpsfjfYE,855 +asyncpg/pgproto/consts.pxi,sha256=emui5kw362ivo2G15l8epVAA8m5eDlcbcrRn794_kew,282 +asyncpg/pgproto/cpythonx.pxd,sha256=B9fAfasXgoWN-Z-STGCxbu0sW-QR8EblCIbxlzPo0Uc,736 +asyncpg/pgproto/debug.pxd,sha256=SuLG2tteWe3cXnS0czRTTNnnm2QGgG02icp_6G_X9Yw,263 +asyncpg/pgproto/frb.pxd,sha256=B2s2dw-SkzfKWeLEWzVLTkjjYYW53pazPcVNH3vPxAk,1212 +asyncpg/pgproto/frb.pyx,sha256=7bipWSBXebweq3JBFlCvSwa03fIZGLkKPqWbJ8VFWFI,409 +asyncpg/pgproto/hton.pxd,sha256=Swx5ry82iWYO9Ok4fRa_b7cLSrIPyxNYlyXm-ncYweo,953 +asyncpg/pgproto/pgproto.cpython-312-x86_64-linux-gnu.so,sha256=NTdRB22nirJunzh0LxTilo0tt4TwIBn6OuKV3eDvhkc,3188448 +asyncpg/pgproto/pgproto.pxd,sha256=QUUxWiHKdKfFxdDT0czSvOFsA4b59MJRR6WlUbJFgPg,430 +asyncpg/pgproto/pgproto.pyi,sha256=vDsno93anu44CMa0TGTOcQSBT8mRXV-vvOH0v-kGCI0,411 +asyncpg/pgproto/pgproto.pyx,sha256=bK75qfRQlofzO8dDzJ2mHUE0wLeXSsc5SLeAGvyXSeE,1249 +asyncpg/pgproto/tohex.pxd,sha256=fQVaxBu6dBw2P_ROR8MSPVDlVep0McKi69fdQBLhifI,361 +asyncpg/pgproto/types.py,sha256=7Onq2d7i01PLjR199TdraZFB66CdgIEXYuHoQCT3jKU,12775 +asyncpg/pgproto/uuid.pyx,sha256=heUtr0KxJSSNQ92Wz9xYCHbuzS_uMHzqmJrEtKW_0cc,10243 +asyncpg/pool.py,sha256=q8cQHSnbR_8x---isjqk_o_FmSS9LICuNiKkICSvhM8,42368 +asyncpg/prepared_stmt.py,sha256=rLWS-YvCtxEgMWEIlbSgcuUcB39wzCoxfkzCE806Mac,9783 +asyncpg/protocol/__init__.py,sha256=fDWUanigffIYzRccQeD2nhQXekl0bNGvefJDcMiOE8I,359 +asyncpg/protocol/__pycache__/__init__.cpython-312.pyc,, +asyncpg/protocol/codecs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +asyncpg/protocol/codecs/__pycache__/__init__.cpython-312.pyc,, +asyncpg/protocol/codecs/array.pyx,sha256=1S_6xdgxllG8_1Lb68XdPkH1QgF63gAAmjh091Q7Dyk,29486 +asyncpg/protocol/codecs/base.pxd,sha256=wSk_mmRGI-4echq_F-bj5Am33kd3cuUODFe5KgSLfME,6614 +asyncpg/protocol/codecs/base.pyx,sha256=58vw_sWBBPIRHLBACBUpUJ0geAREGDaS434-V_eBMUk,34460 +asyncpg/protocol/codecs/pgproto.pyx,sha256=5PDv1JT_nXbDbHtYVrGCcZN3CxzQdgwqlXT8GpyMamk,17175 +asyncpg/protocol/codecs/range.pyx,sha256=-P-acyY2e5TlEtjqbkeH28PYk-DGLxqbmzKDFGL5BbI,6359 +asyncpg/protocol/codecs/record.pyx,sha256=l17HPv3ZeZzvDMXmh-FTdOQ0LxqaQsge_4hlmnGaf6s,2362 +asyncpg/protocol/codecs/textutils.pyx,sha256=UmTt1Zs5N2oLVDMTSlSe1zAFt5q4_4akbXZoS6HSPO8,2011 +asyncpg/protocol/consts.pxi,sha256=VT7NLBpLgPUvcUbPflrX84I79JZiFg4zFzBK28nCRZo,381 +asyncpg/protocol/coreproto.pxd,sha256=77yJqaBMGWHmxyihZIFfyVgfzICF9jLwKSvtuCoE8rM,6215 +asyncpg/protocol/coreproto.pyx,sha256=G6HhC5sbsAFVNmNvvp8gFgaeTaVDRBRkfB8X0DXHYFA,41005 +asyncpg/protocol/cpythonx.pxd,sha256=VX71g4PiwXWGTY-BzBPm7S-AiX5ySRrY40qAggH-BIA,613 +asyncpg/protocol/encodings.pyx,sha256=rTjWPi-nMun7x8UYCkwsUN16pL5M5LPODYWI28nIKL4,1634 +asyncpg/protocol/pgtypes.pxi,sha256=4XVeMr1Y04QOJV9f76V2882nT1vmcK-8J4AhFw0eFOw,6918 +asyncpg/protocol/prepared_stmt.pxd,sha256=GhHzJgQMehpWg0i3XSmbkJH6G5nnnmdNCf2EU_gXhDY,1115 +asyncpg/protocol/prepared_stmt.pyx,sha256=f-YQVhV5trxNdnlyjHCjOmi9byP5mbP__eps_JamQts,13036 +asyncpg/protocol/protocol.cpython-312-x86_64-linux-gnu.so,sha256=oecLbiotWzaj1mpL0m8YlOgb5n9I_Jpq0kxctF6elN8,8949160 +asyncpg/protocol/protocol.pxd,sha256=yOVFbkD7mA8VK5IGIJ4dGTyvHKWZTQOFfCFNfdeUdK8,1927 +asyncpg/protocol/protocol.pyi,sha256=F3LFOSUEWZF5-XLpAkUomHflQT9ITm985J-HsN1QVO8,9108 +asyncpg/protocol/protocol.pyx,sha256=li4lQhO3PeulcvSy6_Gi4PJAUp3GHE9e-nqh6xtQ-QU,34473 +asyncpg/protocol/record.cpython-312-x86_64-linux-gnu.so,sha256=mjK7E05BF9dbEBdlLAIjrQvvWH3vHB-fANm2hOJIFus,135280 +asyncpg/protocol/record.pyi,sha256=KJ6nF9Ad5tz4Z8wEAye_rzjBNghyCXUh9PAOqW53jW0,741 +asyncpg/protocol/recordcapi.pxd,sha256=AkcjhRpPAmun1gmohKLwvalcqODvAEdUijnsK6wY6Lg,360 +asyncpg/protocol/scram.pxd,sha256=t_nkicIS_4AzxyHoq-aYUNrFNv8O0W7E090HfMAIuno,1299 +asyncpg/protocol/scram.pyx,sha256=nT_Rawg6h3OrRWDBwWN7lju5_hnOmXpwWFWVrb3l_dQ,14594 +asyncpg/protocol/settings.pxd,sha256=8DTwZ5mi0aAUJRWE6SUIRDhWFGFis1mj8lcA8hNFTL0,1066 +asyncpg/protocol/settings.pyx,sha256=yICjZF5FXwfmdxQBg-1qO0XbpLvZL11-c3aMbiwM7oo,3777 +asyncpg/serverversion.py,sha256=WwlqBJkXZHvvnFluubCjPoaX_7OqjR8QgiOe90w6C9E,2133 +asyncpg/transaction.py,sha256=uAJok6Shx7-Kdt5l4NX-GJtLxVJSPXTOJUryGdbIVG8,8497 +asyncpg/types.py,sha256=rvWDTt-ZF56HrAjtDlOe7aodldEmtTTCDo3l134VHVM,5512 +asyncpg/utils.py,sha256=Y0vATexoIHFkpWURlqnlUZUacc4F1iZJ9rWJ3654OnM,1495 diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/REQUESTED b/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/REQUESTED new file mode 100755 index 0000000..e69de29 diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/WHEEL b/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/WHEEL new file mode 100755 index 0000000..d3bb8ca --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (80.9.0) +Root-Is-Purelib: false +Tag: cp312-cp312-manylinux_2_28_x86_64 + diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/licenses/LICENSE b/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/licenses/LICENSE new file mode 100755 index 0000000..d931386 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/licenses/LICENSE @@ -0,0 +1,204 @@ +Copyright (C) 2016-present the asyncpg authors and contributors. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright (C) 2016-present the asyncpg authors and contributors + + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/top_level.txt b/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/top_level.txt new file mode 100755 index 0000000..5789edd --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg-0.31.0.dist-info/top_level.txt @@ -0,0 +1 @@ +asyncpg diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/__init__.py b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/__init__.py new file mode 100755 index 0000000..e8811a9 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/__init__.py @@ -0,0 +1,24 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + +from __future__ import annotations + +from .connection import connect, Connection # NOQA +from .exceptions import * # NOQA +from .pool import create_pool, Pool # NOQA +from .protocol import Record # NOQA +from .types import * # NOQA + + +from ._version import __version__ # NOQA + +from . import exceptions + + +__all__: tuple[str, ...] = ( + 'connect', 'create_pool', 'Pool', 'Record', 'Connection' +) +__all__ += exceptions.__all__ # NOQA diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/_asyncio_compat.py b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/_asyncio_compat.py new file mode 100755 index 0000000..a211d0a --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/_asyncio_compat.py @@ -0,0 +1,94 @@ +# Backports from Python/Lib/asyncio for older Pythons +# +# Copyright (c) 2001-2023 Python Software Foundation; All Rights Reserved +# +# SPDX-License-Identifier: PSF-2.0 + +from __future__ import annotations + +import asyncio +import functools +import sys +import typing + +if typing.TYPE_CHECKING: + from . import compat + +if sys.version_info < (3, 11): + from async_timeout import timeout as timeout_ctx +else: + from asyncio import timeout as timeout_ctx + +_T = typing.TypeVar('_T') + + +async def wait_for(fut: compat.Awaitable[_T], timeout: float | None) -> _T: + """Wait for the single Future or coroutine to complete, with timeout. + + Coroutine will be wrapped in Task. + + Returns result of the Future or coroutine. When a timeout occurs, + it cancels the task and raises TimeoutError. To avoid the task + cancellation, wrap it in shield(). + + If the wait is cancelled, the task is also cancelled. + + If the task supresses the cancellation and returns a value instead, + that value is returned. + + This function is a coroutine. + """ + # The special case for timeout <= 0 is for the following case: + # + # async def test_waitfor(): + # func_started = False + # + # async def func(): + # nonlocal func_started + # func_started = True + # + # try: + # await asyncio.wait_for(func(), 0) + # except asyncio.TimeoutError: + # assert not func_started + # else: + # assert False + # + # asyncio.run(test_waitfor()) + + if timeout is not None and timeout <= 0: + fut = asyncio.ensure_future(fut) + + if fut.done(): + return fut.result() + + await _cancel_and_wait(fut) + try: + return fut.result() + except asyncio.CancelledError as exc: + raise TimeoutError from exc + + async with timeout_ctx(timeout): + return await fut + + +async def _cancel_and_wait(fut: asyncio.Future[_T]) -> None: + """Cancel the *fut* future or task and wait until it completes.""" + + loop = asyncio.get_running_loop() + waiter = loop.create_future() + cb = functools.partial(_release_waiter, waiter) + fut.add_done_callback(cb) + + try: + fut.cancel() + # We cannot wait on *fut* directly to make + # sure _cancel_and_wait itself is reliably cancellable. + await waiter + finally: + fut.remove_done_callback(cb) + + +def _release_waiter(waiter: asyncio.Future[typing.Any], *args: object) -> None: + if not waiter.done(): + waiter.set_result(None) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/_testbase/__init__.py b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/_testbase/__init__.py new file mode 100755 index 0000000..95775e1 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/_testbase/__init__.py @@ -0,0 +1,543 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +import asyncio +import atexit +import contextlib +import functools +import inspect +import logging +import os +import re +import textwrap +import time +import traceback +import unittest + + +import asyncpg +from asyncpg import cluster as pg_cluster +from asyncpg import connection as pg_connection +from asyncpg import pool as pg_pool + +from . import fuzzer + + +@contextlib.contextmanager +def silence_asyncio_long_exec_warning(): + def flt(log_record): + msg = log_record.getMessage() + return not msg.startswith('Executing ') + + logger = logging.getLogger('asyncio') + logger.addFilter(flt) + try: + yield + finally: + logger.removeFilter(flt) + + +def with_timeout(timeout): + def wrap(func): + func.__timeout__ = timeout + return func + + return wrap + + +class TestCaseMeta(type(unittest.TestCase)): + TEST_TIMEOUT = None + + @staticmethod + def _iter_methods(bases, ns): + for base in bases: + for methname in dir(base): + if not methname.startswith('test_'): + continue + + meth = getattr(base, methname) + if not inspect.iscoroutinefunction(meth): + continue + + yield methname, meth + + for methname, meth in ns.items(): + if not methname.startswith('test_'): + continue + + if not inspect.iscoroutinefunction(meth): + continue + + yield methname, meth + + def __new__(mcls, name, bases, ns): + for methname, meth in mcls._iter_methods(bases, ns): + @functools.wraps(meth) + def wrapper(self, *args, __meth__=meth, **kwargs): + coro = __meth__(self, *args, **kwargs) + timeout = getattr(__meth__, '__timeout__', mcls.TEST_TIMEOUT) + if timeout: + coro = asyncio.wait_for(coro, timeout) + try: + self.loop.run_until_complete(coro) + except asyncio.TimeoutError: + raise self.failureException( + 'test timed out after {} seconds'.format( + timeout)) from None + else: + self.loop.run_until_complete(coro) + ns[methname] = wrapper + + return super().__new__(mcls, name, bases, ns) + + +class TestCase(unittest.TestCase, metaclass=TestCaseMeta): + + @classmethod + def setUpClass(cls): + if os.environ.get('USE_UVLOOP'): + import uvloop + asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) + + loop = asyncio.new_event_loop() + asyncio.set_event_loop(None) + cls.loop = loop + + @classmethod + def tearDownClass(cls): + cls.loop.close() + asyncio.set_event_loop(None) + + def setUp(self): + self.loop.set_exception_handler(self.loop_exception_handler) + self.__unhandled_exceptions = [] + + def tearDown(self): + excs = [] + for exc in self.__unhandled_exceptions: + if isinstance(exc, ConnectionResetError): + texc = traceback.TracebackException.from_exception( + exc, lookup_lines=False) + if texc.stack[-1].name == "_call_connection_lost": + # On Windows calling socket.shutdown may raise + # ConnectionResetError, which happens in the + # finally block of _call_connection_lost. + continue + excs.append(exc) + + if excs: + formatted = [] + + for i, context in enumerate(excs): + formatted.append(self._format_loop_exception(context, i + 1)) + + self.fail( + 'unexpected exceptions in asynchronous code:\n' + + '\n'.join(formatted)) + + @contextlib.contextmanager + def assertRunUnder(self, delta): + st = time.monotonic() + try: + yield + finally: + elapsed = time.monotonic() - st + if elapsed > delta: + raise AssertionError( + 'running block took {:0.3f}s which is longer ' + 'than the expected maximum of {:0.3f}s'.format( + elapsed, delta)) + + @contextlib.contextmanager + def assertLoopErrorHandlerCalled(self, msg_re: str): + contexts = [] + + def handler(loop, ctx): + contexts.append(ctx) + + old_handler = self.loop.get_exception_handler() + self.loop.set_exception_handler(handler) + try: + yield + + for ctx in contexts: + msg = ctx.get('message') + if msg and re.search(msg_re, msg): + return + + raise AssertionError( + 'no message matching {!r} was logged with ' + 'loop.call_exception_handler()'.format(msg_re)) + + finally: + self.loop.set_exception_handler(old_handler) + + def loop_exception_handler(self, loop, context): + self.__unhandled_exceptions.append(context) + loop.default_exception_handler(context) + + def _format_loop_exception(self, context, n): + message = context.get('message', 'Unhandled exception in event loop') + exception = context.get('exception') + if exception is not None: + exc_info = (type(exception), exception, exception.__traceback__) + else: + exc_info = None + + lines = [] + for key in sorted(context): + if key in {'message', 'exception'}: + continue + value = context[key] + if key == 'source_traceback': + tb = ''.join(traceback.format_list(value)) + value = 'Object created at (most recent call last):\n' + value += tb.rstrip() + else: + try: + value = repr(value) + except Exception as ex: + value = ('Exception in __repr__ {!r}; ' + 'value type: {!r}'.format(ex, type(value))) + lines.append('[{}]: {}\n\n'.format(key, value)) + + if exc_info is not None: + lines.append('[exception]:\n') + formatted_exc = textwrap.indent( + ''.join(traceback.format_exception(*exc_info)), ' ') + lines.append(formatted_exc) + + details = textwrap.indent(''.join(lines), ' ') + return '{:02d}. {}:\n{}\n'.format(n, message, details) + + +_default_cluster = None + + +def _init_cluster(ClusterCls, cluster_kwargs, initdb_options=None): + cluster = ClusterCls(**cluster_kwargs) + cluster.init(**(initdb_options or {})) + cluster.trust_local_connections() + atexit.register(_shutdown_cluster, cluster) + return cluster + + +def _get_initdb_options(initdb_options=None): + if not initdb_options: + initdb_options = {} + else: + initdb_options = dict(initdb_options) + + # Make the default superuser name stable. + if 'username' not in initdb_options: + initdb_options['username'] = 'postgres' + + return initdb_options + + +def _init_default_cluster(initdb_options=None): + global _default_cluster + + if _default_cluster is None: + pg_host = os.environ.get('PGHOST') + if pg_host: + # Using existing cluster, assuming it is initialized and running + _default_cluster = pg_cluster.RunningCluster() + else: + _default_cluster = _init_cluster( + pg_cluster.TempCluster, + cluster_kwargs={ + "data_dir_suffix": ".apgtest", + }, + initdb_options=_get_initdb_options(initdb_options), + ) + + return _default_cluster + + +def _shutdown_cluster(cluster): + if cluster.get_status() == 'running': + cluster.stop() + if cluster.get_status() != 'not-initialized': + cluster.destroy() + + +def create_pool(dsn=None, *, + min_size=10, + max_size=10, + max_queries=50000, + max_inactive_connection_lifetime=60.0, + connect=None, + setup=None, + init=None, + loop=None, + pool_class=pg_pool.Pool, + connection_class=pg_connection.Connection, + record_class=asyncpg.Record, + **connect_kwargs): + return pool_class( + dsn, + min_size=min_size, + max_size=max_size, + max_queries=max_queries, + loop=loop, + connect=connect, + setup=setup, + init=init, + max_inactive_connection_lifetime=max_inactive_connection_lifetime, + connection_class=connection_class, + record_class=record_class, + **connect_kwargs, + ) + + +class ClusterTestCase(TestCase): + @classmethod + def get_server_settings(cls): + settings = { + 'log_connections': 'on' + } + + if cls.cluster.get_pg_version() >= (11, 0): + # JITting messes up timing tests, and + # is not essential for testing. + settings['jit'] = 'off' + + return settings + + @classmethod + def new_cluster(cls, ClusterCls, *, cluster_kwargs={}, initdb_options={}): + cluster = _init_cluster(ClusterCls, cluster_kwargs, + _get_initdb_options(initdb_options)) + cls._clusters.append(cluster) + return cluster + + @classmethod + def start_cluster(cls, cluster, *, server_settings={}): + cluster.start(port='dynamic', server_settings=server_settings) + + @classmethod + def setup_cluster(cls): + cls.cluster = _init_default_cluster() + + if cls.cluster.get_status() != 'running': + cls.cluster.start( + port='dynamic', server_settings=cls.get_server_settings()) + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls._clusters = [] + cls.setup_cluster() + + @classmethod + def tearDownClass(cls): + super().tearDownClass() + for cluster in cls._clusters: + if cluster is not _default_cluster: + cluster.stop() + cluster.destroy() + cls._clusters = [] + + @classmethod + def get_connection_spec(cls, kwargs={}): + conn_spec = cls.cluster.get_connection_spec() + if kwargs.get('dsn'): + conn_spec.pop('host') + conn_spec.update(kwargs) + if not os.environ.get('PGHOST') and not kwargs.get('dsn'): + if 'database' not in conn_spec: + conn_spec['database'] = 'postgres' + if 'user' not in conn_spec: + conn_spec['user'] = 'postgres' + return conn_spec + + @classmethod + def connect(cls, **kwargs): + conn_spec = cls.get_connection_spec(kwargs) + return pg_connection.connect(**conn_spec, loop=cls.loop) + + def setUp(self): + super().setUp() + self._pools = [] + + def tearDown(self): + super().tearDown() + for pool in self._pools: + pool.terminate() + self._pools = [] + + def create_pool(self, pool_class=pg_pool.Pool, + connection_class=pg_connection.Connection, **kwargs): + conn_spec = self.get_connection_spec(kwargs) + pool = create_pool(loop=self.loop, pool_class=pool_class, + connection_class=connection_class, **conn_spec) + self._pools.append(pool) + return pool + + +class ProxiedClusterTestCase(ClusterTestCase): + @classmethod + def get_server_settings(cls): + settings = dict(super().get_server_settings()) + settings['listen_addresses'] = '127.0.0.1' + return settings + + @classmethod + def get_proxy_settings(cls): + return {'fuzzing-mode': None} + + @classmethod + def setUpClass(cls): + super().setUpClass() + conn_spec = cls.cluster.get_connection_spec() + host = conn_spec.get('host') + if not host: + host = '127.0.0.1' + elif host.startswith('/'): + host = '127.0.0.1' + cls.proxy = fuzzer.TCPFuzzingProxy( + backend_host=host, + backend_port=conn_spec['port'], + ) + cls.proxy.start() + + @classmethod + def tearDownClass(cls): + cls.proxy.stop() + super().tearDownClass() + + @classmethod + def get_connection_spec(cls, kwargs): + conn_spec = super().get_connection_spec(kwargs) + conn_spec['host'] = cls.proxy.listening_addr + conn_spec['port'] = cls.proxy.listening_port + return conn_spec + + def tearDown(self): + self.proxy.reset() + super().tearDown() + + +def with_connection_options(**options): + if not options: + raise ValueError('no connection options were specified') + + def wrap(func): + func.__connect_options__ = options + return func + + return wrap + + +class ConnectedTestCase(ClusterTestCase): + + def setUp(self): + super().setUp() + + # Extract options set up with `with_connection_options`. + test_func = getattr(self, self._testMethodName).__func__ + opts = getattr(test_func, '__connect_options__', {}) + self.con = self.loop.run_until_complete(self.connect(**opts)) + self.server_version = self.con.get_server_version() + + def tearDown(self): + try: + self.loop.run_until_complete(self.con.close()) + self.con = None + finally: + super().tearDown() + + +class HotStandbyTestCase(ClusterTestCase): + + @classmethod + def setup_cluster(cls): + cls.master_cluster = cls.new_cluster(pg_cluster.TempCluster) + cls.start_cluster( + cls.master_cluster, + server_settings={ + 'max_wal_senders': 10, + 'wal_level': 'hot_standby' + } + ) + + con = None + + try: + con = cls.loop.run_until_complete( + cls.master_cluster.connect( + database='postgres', user='postgres', loop=cls.loop)) + + cls.loop.run_until_complete( + con.execute(''' + CREATE ROLE replication WITH LOGIN REPLICATION + ''')) + + cls.master_cluster.trust_local_replication_by('replication') + + conn_spec = cls.master_cluster.get_connection_spec() + + cls.standby_cluster = cls.new_cluster( + pg_cluster.HotStandbyCluster, + cluster_kwargs={ + 'master': conn_spec, + 'replication_user': 'replication' + } + ) + cls.start_cluster( + cls.standby_cluster, + server_settings={ + 'hot_standby': True + } + ) + + finally: + if con is not None: + cls.loop.run_until_complete(con.close()) + + @classmethod + def get_cluster_connection_spec(cls, cluster, kwargs={}): + conn_spec = cluster.get_connection_spec() + if kwargs.get('dsn'): + conn_spec.pop('host') + conn_spec.update(kwargs) + if not os.environ.get('PGHOST') and not kwargs.get('dsn'): + if 'database' not in conn_spec: + conn_spec['database'] = 'postgres' + if 'user' not in conn_spec: + conn_spec['user'] = 'postgres' + return conn_spec + + @classmethod + def get_connection_spec(cls, kwargs={}): + primary_spec = cls.get_cluster_connection_spec( + cls.master_cluster, kwargs + ) + standby_spec = cls.get_cluster_connection_spec( + cls.standby_cluster, kwargs + ) + return { + 'host': [primary_spec['host'], standby_spec['host']], + 'port': [primary_spec['port'], standby_spec['port']], + 'database': primary_spec['database'], + 'user': primary_spec['user'], + **kwargs + } + + @classmethod + def connect_primary(cls, **kwargs): + conn_spec = cls.get_cluster_connection_spec(cls.master_cluster, kwargs) + return pg_connection.connect(**conn_spec, loop=cls.loop) + + @classmethod + def connect_standby(cls, **kwargs): + conn_spec = cls.get_cluster_connection_spec( + cls.standby_cluster, + kwargs + ) + return pg_connection.connect(**conn_spec, loop=cls.loop) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/_testbase/fuzzer.py b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/_testbase/fuzzer.py new file mode 100755 index 0000000..8874564 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/_testbase/fuzzer.py @@ -0,0 +1,306 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +import asyncio +import socket +import threading +import typing + +from asyncpg import cluster + + +class StopServer(Exception): + pass + + +class TCPFuzzingProxy: + def __init__(self, *, listening_addr: str='127.0.0.1', + listening_port: typing.Optional[int]=None, + backend_host: str, backend_port: int, + settings: typing.Optional[dict]=None) -> None: + self.listening_addr = listening_addr + self.listening_port = listening_port + self.backend_host = backend_host + self.backend_port = backend_port + self.settings = settings or {} + self.loop = None + self.connectivity = None + self.connectivity_loss = None + self.stop_event = None + self.connections = {} + self.sock = None + self.listen_task = None + + async def _wait(self, work): + work_task = asyncio.ensure_future(work) + stop_event_task = asyncio.ensure_future(self.stop_event.wait()) + + try: + await asyncio.wait( + [work_task, stop_event_task], + return_when=asyncio.FIRST_COMPLETED) + + if self.stop_event.is_set(): + raise StopServer() + else: + return work_task.result() + finally: + if not work_task.done(): + work_task.cancel() + if not stop_event_task.done(): + stop_event_task.cancel() + + def start(self): + started = threading.Event() + self.thread = threading.Thread( + target=self._start_thread, args=(started,)) + self.thread.start() + if not started.wait(timeout=2): + raise RuntimeError('fuzzer proxy failed to start') + + def stop(self): + self.loop.call_soon_threadsafe(self._stop) + self.thread.join() + + def _stop(self): + self.stop_event.set() + + def _start_thread(self, started_event): + self.loop = asyncio.new_event_loop() + asyncio.set_event_loop(self.loop) + + self.connectivity = asyncio.Event() + self.connectivity.set() + self.connectivity_loss = asyncio.Event() + self.stop_event = asyncio.Event() + + if self.listening_port is None: + self.listening_port = cluster.find_available_port() + + self.sock = socket.socket() + self.sock.bind((self.listening_addr, self.listening_port)) + self.sock.listen(50) + self.sock.setblocking(False) + + try: + self.loop.run_until_complete(self._main(started_event)) + finally: + self.loop.close() + + async def _main(self, started_event): + self.listen_task = asyncio.ensure_future(self.listen()) + # Notify the main thread that we are ready to go. + started_event.set() + try: + await self.listen_task + finally: + for c in list(self.connections): + c.close() + await asyncio.sleep(0.01) + if hasattr(self.loop, 'remove_reader'): + self.loop.remove_reader(self.sock.fileno()) + self.sock.close() + + async def listen(self): + while True: + try: + client_sock, _ = await self._wait( + self.loop.sock_accept(self.sock)) + + backend_sock = socket.socket() + backend_sock.setblocking(False) + + await self._wait(self.loop.sock_connect( + backend_sock, (self.backend_host, self.backend_port))) + except StopServer: + break + + conn = Connection(client_sock, backend_sock, self) + conn_task = self.loop.create_task(conn.handle()) + self.connections[conn] = conn_task + + def trigger_connectivity_loss(self): + self.loop.call_soon_threadsafe(self._trigger_connectivity_loss) + + def _trigger_connectivity_loss(self): + self.connectivity.clear() + self.connectivity_loss.set() + + def restore_connectivity(self): + self.loop.call_soon_threadsafe(self._restore_connectivity) + + def _restore_connectivity(self): + self.connectivity.set() + self.connectivity_loss.clear() + + def reset(self): + self.restore_connectivity() + + def _close_connection(self, connection): + conn_task = self.connections.pop(connection, None) + if conn_task is not None: + conn_task.cancel() + + def close_all_connections(self): + for conn in list(self.connections): + self.loop.call_soon_threadsafe(self._close_connection, conn) + + +class Connection: + def __init__(self, client_sock, backend_sock, proxy): + self.client_sock = client_sock + self.backend_sock = backend_sock + self.proxy = proxy + self.loop = proxy.loop + self.connectivity = proxy.connectivity + self.connectivity_loss = proxy.connectivity_loss + self.proxy_to_backend_task = None + self.proxy_from_backend_task = None + self.is_closed = False + + def close(self): + if self.is_closed: + return + + self.is_closed = True + + if self.proxy_to_backend_task is not None: + self.proxy_to_backend_task.cancel() + self.proxy_to_backend_task = None + + if self.proxy_from_backend_task is not None: + self.proxy_from_backend_task.cancel() + self.proxy_from_backend_task = None + + self.proxy._close_connection(self) + + async def handle(self): + self.proxy_to_backend_task = asyncio.ensure_future( + self.proxy_to_backend()) + + self.proxy_from_backend_task = asyncio.ensure_future( + self.proxy_from_backend()) + + try: + await asyncio.wait( + [self.proxy_to_backend_task, self.proxy_from_backend_task], + return_when=asyncio.FIRST_COMPLETED) + + finally: + if self.proxy_to_backend_task is not None: + self.proxy_to_backend_task.cancel() + + if self.proxy_from_backend_task is not None: + self.proxy_from_backend_task.cancel() + + # Asyncio fails to properly remove the readers and writers + # when the task doing recv() or send() is cancelled, so + # we must remove the readers and writers manually before + # closing the sockets. + self.loop.remove_reader(self.client_sock.fileno()) + self.loop.remove_writer(self.client_sock.fileno()) + self.loop.remove_reader(self.backend_sock.fileno()) + self.loop.remove_writer(self.backend_sock.fileno()) + + self.client_sock.close() + self.backend_sock.close() + + async def _read(self, sock, n): + read_task = asyncio.ensure_future( + self.loop.sock_recv(sock, n)) + conn_event_task = asyncio.ensure_future( + self.connectivity_loss.wait()) + + try: + await asyncio.wait( + [read_task, conn_event_task], + return_when=asyncio.FIRST_COMPLETED) + + if self.connectivity_loss.is_set(): + return None + else: + return read_task.result() + finally: + if not self.loop.is_closed(): + if not read_task.done(): + read_task.cancel() + if not conn_event_task.done(): + conn_event_task.cancel() + + async def _write(self, sock, data): + write_task = asyncio.ensure_future( + self.loop.sock_sendall(sock, data)) + conn_event_task = asyncio.ensure_future( + self.connectivity_loss.wait()) + + try: + await asyncio.wait( + [write_task, conn_event_task], + return_when=asyncio.FIRST_COMPLETED) + + if self.connectivity_loss.is_set(): + return None + else: + return write_task.result() + finally: + if not self.loop.is_closed(): + if not write_task.done(): + write_task.cancel() + if not conn_event_task.done(): + conn_event_task.cancel() + + async def proxy_to_backend(self): + buf = None + + try: + while True: + await self.connectivity.wait() + if buf is not None: + data = buf + buf = None + else: + data = await self._read(self.client_sock, 4096) + if data == b'': + break + if self.connectivity_loss.is_set(): + if data: + buf = data + continue + await self._write(self.backend_sock, data) + + except ConnectionError: + pass + + finally: + if not self.loop.is_closed(): + self.loop.call_soon(self.close) + + async def proxy_from_backend(self): + buf = None + + try: + while True: + await self.connectivity.wait() + if buf is not None: + data = buf + buf = None + else: + data = await self._read(self.backend_sock, 4096) + if data == b'': + break + if self.connectivity_loss.is_set(): + if data: + buf = data + continue + await self._write(self.client_sock, data) + + except ConnectionError: + pass + + finally: + if not self.loop.is_closed(): + self.loop.call_soon(self.close) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/_version.py b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/_version.py new file mode 100755 index 0000000..55a4fbf --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/_version.py @@ -0,0 +1,17 @@ +# This file MUST NOT contain anything but the __version__ assignment. +# +# When making a release, change the value of __version__ +# to an appropriate value, and open a pull request against +# the correct branch (master if making a new feature release). +# The commit message MUST contain a properly formatted release +# log, and the commit must be signed. +# +# The release automation will: build and test the packages for the +# supported platforms, publish the packages on PyPI, merge the PR +# to the target branch, create a Git tag pointing to the commit. + +from __future__ import annotations + +import typing + +__version__: typing.Final = '0.31.0' diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/cluster.py b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/cluster.py new file mode 100755 index 0000000..606c2ea --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/cluster.py @@ -0,0 +1,729 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +import asyncio +import os +import os.path +import platform +import random +import re +import shutil +import socket +import string +import subprocess +import sys +import tempfile +import textwrap +import time + +import asyncpg +from asyncpg import serverversion + + +_system = platform.uname().system + +if _system == 'Windows': + def platform_exe(name): + if name.endswith('.exe'): + return name + return name + '.exe' +else: + def platform_exe(name): + return name + + +def find_available_port(): + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + try: + sock.bind(('127.0.0.1', 0)) + return sock.getsockname()[1] + except Exception: + return None + finally: + sock.close() + + +def _world_readable_mkdtemp(suffix=None, prefix=None, dir=None): + name = "".join(random.choices(string.ascii_lowercase, k=8)) + if dir is None: + dir = tempfile.gettempdir() + if prefix is None: + prefix = tempfile.gettempprefix() + if suffix is None: + suffix = "" + fn = os.path.join(dir, prefix + name + suffix) + os.mkdir(fn, 0o755) + return fn + + +def _mkdtemp(suffix=None, prefix=None, dir=None): + if _system == 'Windows' and os.environ.get("GITHUB_ACTIONS"): + # Due to mitigations introduced in python/cpython#118486 + # when Python runs in a session created via an SSH connection + # tempfile.mkdtemp creates directories that are not accessible. + return _world_readable_mkdtemp(suffix, prefix, dir) + else: + return tempfile.mkdtemp(suffix, prefix, dir) + + +class ClusterError(Exception): + pass + + +class Cluster: + def __init__(self, data_dir, *, pg_config_path=None): + self._data_dir = data_dir + self._pg_config_path = pg_config_path + self._pg_bin_dir = ( + os.environ.get('PGINSTALLATION') + or os.environ.get('PGBIN') + ) + self._pg_ctl = None + self._daemon_pid = None + self._daemon_process = None + self._connection_addr = None + self._connection_spec_override = None + + def get_pg_version(self): + return self._pg_version + + def is_managed(self): + return True + + def get_data_dir(self): + return self._data_dir + + def get_status(self): + if self._pg_ctl is None: + self._init_env() + + process = subprocess.run( + [self._pg_ctl, 'status', '-D', self._data_dir], + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, stderr = process.stdout, process.stderr + + if (process.returncode == 4 or not os.path.exists(self._data_dir) or + not os.listdir(self._data_dir)): + return 'not-initialized' + elif process.returncode == 3: + return 'stopped' + elif process.returncode == 0: + r = re.match(r'.*PID\s?:\s+(\d+).*', stdout.decode()) + if not r: + raise ClusterError( + 'could not parse pg_ctl status output: {}'.format( + stdout.decode())) + self._daemon_pid = int(r.group(1)) + return self._test_connection(timeout=0) + else: + raise ClusterError( + 'pg_ctl status exited with status {:d}: {}'.format( + process.returncode, stderr)) + + async def connect(self, loop=None, **kwargs): + conn_info = self.get_connection_spec() + conn_info.update(kwargs) + return await asyncpg.connect(loop=loop, **conn_info) + + def init(self, **settings): + """Initialize cluster.""" + if self.get_status() != 'not-initialized': + raise ClusterError( + 'cluster in {!r} has already been initialized'.format( + self._data_dir)) + + settings = dict(settings) + if 'encoding' not in settings: + settings['encoding'] = 'UTF-8' + + if settings: + settings_args = ['--{}={}'.format(k, v) + for k, v in settings.items()] + extra_args = ['-o'] + [' '.join(settings_args)] + else: + extra_args = [] + + os.makedirs(self._data_dir, exist_ok=True) + process = subprocess.run( + [self._pg_ctl, 'init', '-D', self._data_dir] + extra_args, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + cwd=self._data_dir, + ) + + output = process.stdout + + if process.returncode != 0: + raise ClusterError( + 'pg_ctl init exited with status {:d}:\n{}'.format( + process.returncode, output.decode())) + + return output.decode() + + def start(self, wait=60, *, server_settings={}, **opts): + """Start the cluster.""" + status = self.get_status() + if status == 'running': + return + elif status == 'not-initialized': + raise ClusterError( + 'cluster in {!r} has not been initialized'.format( + self._data_dir)) + + port = opts.pop('port', None) + if port == 'dynamic': + port = find_available_port() + + extra_args = ['--{}={}'.format(k, v) for k, v in opts.items()] + extra_args.append('--port={}'.format(port)) + + sockdir = server_settings.get('unix_socket_directories') + if sockdir is None: + sockdir = server_settings.get('unix_socket_directory') + if sockdir is None and _system != 'Windows': + sockdir = tempfile.gettempdir() + + ssl_key = server_settings.get('ssl_key_file') + if ssl_key: + # Make sure server certificate key file has correct permissions. + keyfile = os.path.join(self._data_dir, 'srvkey.pem') + shutil.copy(ssl_key, keyfile) + os.chmod(keyfile, 0o600) + server_settings = server_settings.copy() + server_settings['ssl_key_file'] = keyfile + + if sockdir is not None: + if self._pg_version < (9, 3): + sockdir_opt = 'unix_socket_directory' + else: + sockdir_opt = 'unix_socket_directories' + + server_settings[sockdir_opt] = sockdir + + for k, v in server_settings.items(): + extra_args.extend(['-c', '{}={}'.format(k, v)]) + + if _system == 'Windows': + # On Windows we have to use pg_ctl as direct execution + # of postgres daemon under an Administrative account + # is not permitted and there is no easy way to drop + # privileges. + if os.getenv('ASYNCPG_DEBUG_SERVER'): + stdout = sys.stdout + print( + 'asyncpg.cluster: Running', + ' '.join([ + self._pg_ctl, 'start', '-D', self._data_dir, + '-o', ' '.join(extra_args) + ]), + file=sys.stderr, + ) + else: + stdout = subprocess.DEVNULL + + process = subprocess.run( + [self._pg_ctl, 'start', '-D', self._data_dir, + '-o', ' '.join(extra_args)], + stdout=stdout, + stderr=subprocess.STDOUT, + cwd=self._data_dir, + ) + + if process.returncode != 0: + if process.stderr: + stderr = ':\n{}'.format(process.stderr.decode()) + else: + stderr = '' + raise ClusterError( + 'pg_ctl start exited with status {:d}{}'.format( + process.returncode, stderr)) + else: + if os.getenv('ASYNCPG_DEBUG_SERVER'): + stdout = sys.stdout + else: + stdout = subprocess.DEVNULL + + self._daemon_process = \ + subprocess.Popen( + [self._postgres, '-D', self._data_dir, *extra_args], + stdout=stdout, + stderr=subprocess.STDOUT, + cwd=self._data_dir, + ) + + self._daemon_pid = self._daemon_process.pid + + self._test_connection(timeout=wait) + + def reload(self): + """Reload server configuration.""" + status = self.get_status() + if status != 'running': + raise ClusterError('cannot reload: cluster is not running') + + process = subprocess.run( + [self._pg_ctl, 'reload', '-D', self._data_dir], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + cwd=self._data_dir, + ) + + stderr = process.stderr + + if process.returncode != 0: + raise ClusterError( + 'pg_ctl stop exited with status {:d}: {}'.format( + process.returncode, stderr.decode())) + + def stop(self, wait=60): + process = subprocess.run( + [self._pg_ctl, 'stop', '-D', self._data_dir, '-t', str(wait), + '-m', 'fast'], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + cwd=self._data_dir, + ) + + stderr = process.stderr + + if process.returncode != 0: + raise ClusterError( + 'pg_ctl stop exited with status {:d}: {}'.format( + process.returncode, stderr.decode())) + + if (self._daemon_process is not None and + self._daemon_process.returncode is None): + self._daemon_process.kill() + + def destroy(self): + status = self.get_status() + if status == 'stopped' or status == 'not-initialized': + shutil.rmtree(self._data_dir) + else: + raise ClusterError('cannot destroy {} cluster'.format(status)) + + def _get_connection_spec(self): + if self._connection_addr is None: + self._connection_addr = self._connection_addr_from_pidfile() + + if self._connection_addr is not None: + if self._connection_spec_override: + args = self._connection_addr.copy() + args.update(self._connection_spec_override) + return args + else: + return self._connection_addr + + def get_connection_spec(self): + status = self.get_status() + if status != 'running': + raise ClusterError('cluster is not running') + + return self._get_connection_spec() + + def override_connection_spec(self, **kwargs): + self._connection_spec_override = kwargs + + def reset_wal(self, *, oid=None, xid=None): + status = self.get_status() + if status == 'not-initialized': + raise ClusterError( + 'cannot modify WAL status: cluster is not initialized') + + if status == 'running': + raise ClusterError( + 'cannot modify WAL status: cluster is running') + + opts = [] + if oid is not None: + opts.extend(['-o', str(oid)]) + if xid is not None: + opts.extend(['-x', str(xid)]) + if not opts: + return + + opts.append(self._data_dir) + + try: + reset_wal = self._find_pg_binary('pg_resetwal') + except ClusterError: + reset_wal = self._find_pg_binary('pg_resetxlog') + + process = subprocess.run( + [reset_wal] + opts, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + + stderr = process.stderr + + if process.returncode != 0: + raise ClusterError( + 'pg_resetwal exited with status {:d}: {}'.format( + process.returncode, stderr.decode())) + + def reset_hba(self): + """Remove all records from pg_hba.conf.""" + status = self.get_status() + if status == 'not-initialized': + raise ClusterError( + 'cannot modify HBA records: cluster is not initialized') + + pg_hba = os.path.join(self._data_dir, 'pg_hba.conf') + + try: + with open(pg_hba, 'w'): + pass + except IOError as e: + raise ClusterError( + 'cannot modify HBA records: {}'.format(e)) from e + + def add_hba_entry(self, *, type='host', database, user, address=None, + auth_method, auth_options=None): + """Add a record to pg_hba.conf.""" + status = self.get_status() + if status == 'not-initialized': + raise ClusterError( + 'cannot modify HBA records: cluster is not initialized') + + if type not in {'local', 'host', 'hostssl', 'hostnossl'}: + raise ValueError('invalid HBA record type: {!r}'.format(type)) + + pg_hba = os.path.join(self._data_dir, 'pg_hba.conf') + + record = '{} {} {}'.format(type, database, user) + + if type != 'local': + if address is None: + raise ValueError( + '{!r} entry requires a valid address'.format(type)) + else: + record += ' {}'.format(address) + + record += ' {}'.format(auth_method) + + if auth_options is not None: + record += ' ' + ' '.join( + '{}={}'.format(k, v) for k, v in auth_options) + + try: + with open(pg_hba, 'a') as f: + print(record, file=f) + except IOError as e: + raise ClusterError( + 'cannot modify HBA records: {}'.format(e)) from e + + def trust_local_connections(self): + self.reset_hba() + + if _system != 'Windows': + self.add_hba_entry(type='local', database='all', + user='all', auth_method='trust') + self.add_hba_entry(type='host', address='127.0.0.1/32', + database='all', user='all', + auth_method='trust') + self.add_hba_entry(type='host', address='::1/128', + database='all', user='all', + auth_method='trust') + status = self.get_status() + if status == 'running': + self.reload() + + def trust_local_replication_by(self, user): + if _system != 'Windows': + self.add_hba_entry(type='local', database='replication', + user=user, auth_method='trust') + self.add_hba_entry(type='host', address='127.0.0.1/32', + database='replication', user=user, + auth_method='trust') + self.add_hba_entry(type='host', address='::1/128', + database='replication', user=user, + auth_method='trust') + status = self.get_status() + if status == 'running': + self.reload() + + def _init_env(self): + if not self._pg_bin_dir: + pg_config = self._find_pg_config(self._pg_config_path) + pg_config_data = self._run_pg_config(pg_config) + + self._pg_bin_dir = pg_config_data.get('bindir') + if not self._pg_bin_dir: + raise ClusterError( + 'pg_config output did not provide the BINDIR value') + + self._pg_ctl = self._find_pg_binary('pg_ctl') + self._postgres = self._find_pg_binary('postgres') + self._pg_version = self._get_pg_version() + + def _connection_addr_from_pidfile(self): + pidfile = os.path.join(self._data_dir, 'postmaster.pid') + + try: + with open(pidfile, 'rt') as f: + piddata = f.read() + except FileNotFoundError: + return None + + lines = piddata.splitlines() + + if len(lines) < 6: + # A complete postgres pidfile is at least 6 lines + return None + + pmpid = int(lines[0]) + if self._daemon_pid and pmpid != self._daemon_pid: + # This might be an old pidfile left from previous postgres + # daemon run. + return None + + portnum = lines[3] + sockdir = lines[4] + hostaddr = lines[5] + + if sockdir: + if sockdir[0] != '/': + # Relative sockdir + sockdir = os.path.normpath( + os.path.join(self._data_dir, sockdir)) + host_str = sockdir + else: + host_str = hostaddr + + if host_str == '*': + host_str = 'localhost' + elif host_str == '0.0.0.0': + host_str = '127.0.0.1' + elif host_str == '::': + host_str = '::1' + + return { + 'host': host_str, + 'port': portnum + } + + def _test_connection(self, timeout=60): + self._connection_addr = None + + loop = asyncio.new_event_loop() + + try: + for i in range(timeout): + if self._connection_addr is None: + conn_spec = self._get_connection_spec() + if conn_spec is None: + time.sleep(1) + continue + + try: + con = loop.run_until_complete( + asyncpg.connect(database='postgres', + user='postgres', + timeout=5, loop=loop, + **self._connection_addr)) + except (OSError, asyncio.TimeoutError, + asyncpg.CannotConnectNowError, + asyncpg.PostgresConnectionError): + time.sleep(1) + continue + except asyncpg.PostgresError: + # Any other error other than ServerNotReadyError or + # ConnectionError is interpreted to indicate the server is + # up. + break + else: + loop.run_until_complete(con.close()) + break + finally: + loop.close() + + return 'running' + + def _run_pg_config(self, pg_config_path): + process = subprocess.run( + pg_config_path, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, stderr = process.stdout, process.stderr + + if process.returncode != 0: + raise ClusterError('pg_config exited with status {:d}: {}'.format( + process.returncode, stderr)) + else: + config = {} + + for line in stdout.splitlines(): + k, eq, v = line.decode('utf-8').partition('=') + if eq: + config[k.strip().lower()] = v.strip() + + return config + + def _find_pg_config(self, pg_config_path): + if pg_config_path is None: + pg_install = ( + os.environ.get('PGINSTALLATION') + or os.environ.get('PGBIN') + ) + if pg_install: + pg_config_path = platform_exe( + os.path.join(pg_install, 'pg_config')) + else: + pathenv = os.environ.get('PATH').split(os.pathsep) + for path in pathenv: + pg_config_path = platform_exe( + os.path.join(path, 'pg_config')) + if os.path.exists(pg_config_path): + break + else: + pg_config_path = None + + if not pg_config_path: + raise ClusterError('could not find pg_config executable') + + if not os.path.isfile(pg_config_path): + raise ClusterError('{!r} is not an executable'.format( + pg_config_path)) + + return pg_config_path + + def _find_pg_binary(self, binary): + bpath = platform_exe(os.path.join(self._pg_bin_dir, binary)) + + if not os.path.isfile(bpath): + raise ClusterError( + 'could not find {} executable: '.format(binary) + + '{!r} does not exist or is not a file'.format(bpath)) + + return bpath + + def _get_pg_version(self): + process = subprocess.run( + [self._postgres, '--version'], + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, stderr = process.stdout, process.stderr + + if process.returncode != 0: + raise ClusterError( + 'postgres --version exited with status {:d}: {}'.format( + process.returncode, stderr)) + + version_string = stdout.decode('utf-8').strip(' \n') + prefix = 'postgres (PostgreSQL) ' + if not version_string.startswith(prefix): + raise ClusterError( + 'could not determine server version from {!r}'.format( + version_string)) + version_string = version_string[len(prefix):] + + return serverversion.split_server_version_string(version_string) + + +class TempCluster(Cluster): + def __init__(self, *, + data_dir_suffix=None, data_dir_prefix=None, + data_dir_parent=None, pg_config_path=None): + self._data_dir = _mkdtemp(suffix=data_dir_suffix, + prefix=data_dir_prefix, + dir=data_dir_parent) + super().__init__(self._data_dir, pg_config_path=pg_config_path) + + +class HotStandbyCluster(TempCluster): + def __init__(self, *, + master, replication_user, + data_dir_suffix=None, data_dir_prefix=None, + data_dir_parent=None, pg_config_path=None): + self._master = master + self._repl_user = replication_user + super().__init__( + data_dir_suffix=data_dir_suffix, + data_dir_prefix=data_dir_prefix, + data_dir_parent=data_dir_parent, + pg_config_path=pg_config_path) + + def _init_env(self): + super()._init_env() + self._pg_basebackup = self._find_pg_binary('pg_basebackup') + + def init(self, **settings): + """Initialize cluster.""" + if self.get_status() != 'not-initialized': + raise ClusterError( + 'cluster in {!r} has already been initialized'.format( + self._data_dir)) + + process = subprocess.run( + [self._pg_basebackup, '-h', self._master['host'], + '-p', self._master['port'], '-D', self._data_dir, + '-U', self._repl_user], + stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + + output = process.stdout + + if process.returncode != 0: + raise ClusterError( + 'pg_basebackup init exited with status {:d}:\n{}'.format( + process.returncode, output.decode())) + + if self._pg_version < (12, 0): + with open(os.path.join(self._data_dir, 'recovery.conf'), 'w') as f: + f.write(textwrap.dedent("""\ + standby_mode = 'on' + primary_conninfo = 'host={host} port={port} user={user}' + """.format( + host=self._master['host'], + port=self._master['port'], + user=self._repl_user))) + else: + f = open(os.path.join(self._data_dir, 'standby.signal'), 'w') + f.close() + + return output.decode() + + def start(self, wait=60, *, server_settings={}, **opts): + if self._pg_version >= (12, 0): + server_settings = server_settings.copy() + server_settings['primary_conninfo'] = ( + '"host={host} port={port} user={user}"'.format( + host=self._master['host'], + port=self._master['port'], + user=self._repl_user, + ) + ) + + super().start(wait=wait, server_settings=server_settings, **opts) + + +class RunningCluster(Cluster): + def __init__(self, **kwargs): + self.conn_spec = kwargs + + def is_managed(self): + return False + + def get_connection_spec(self): + return dict(self.conn_spec) + + def get_status(self): + return 'running' + + def init(self, **settings): + pass + + def start(self, wait=60, **settings): + pass + + def stop(self, wait=60): + pass + + def destroy(self): + pass + + def reset_hba(self): + raise ClusterError('cannot modify HBA records of unmanaged cluster') + + def add_hba_entry(self, *, type='host', database, user, address=None, + auth_method, auth_options=None): + raise ClusterError('cannot modify HBA records of unmanaged cluster') diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/compat.py b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/compat.py new file mode 100755 index 0000000..57eec65 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/compat.py @@ -0,0 +1,88 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + +from __future__ import annotations + +import enum +import pathlib +import platform +import typing +import sys + +if typing.TYPE_CHECKING: + import asyncio + +SYSTEM: typing.Final = platform.uname().system + + +if sys.platform == 'win32': + import ctypes.wintypes + + CSIDL_APPDATA: typing.Final = 0x001a + + def get_pg_home_directory() -> pathlib.Path | None: + # We cannot simply use expanduser() as that returns the user's + # home directory, whereas Postgres stores its config in + # %AppData% on Windows. + buf = ctypes.create_unicode_buffer(ctypes.wintypes.MAX_PATH) + r = ctypes.windll.shell32.SHGetFolderPathW(0, CSIDL_APPDATA, 0, 0, buf) + if r: + return None + else: + return pathlib.Path(buf.value) / 'postgresql' + +else: + def get_pg_home_directory() -> pathlib.Path | None: + try: + return pathlib.Path.home() + except (RuntimeError, KeyError): + return None + + +async def wait_closed(stream: asyncio.StreamWriter) -> None: + # Not all asyncio versions have StreamWriter.wait_closed(). + if hasattr(stream, 'wait_closed'): + try: + await stream.wait_closed() + except ConnectionResetError: + # On Windows wait_closed() sometimes propagates + # ConnectionResetError which is totally unnecessary. + pass + + +if sys.version_info < (3, 12): + def markcoroutinefunction(c): # type: ignore + pass +else: + from inspect import markcoroutinefunction # noqa: F401 + + +if sys.version_info < (3, 12): + from ._asyncio_compat import wait_for as wait_for # noqa: F401 +else: + from asyncio import wait_for as wait_for # noqa: F401 + + +if sys.version_info < (3, 11): + from ._asyncio_compat import timeout_ctx as timeout # noqa: F401 +else: + from asyncio import timeout as timeout # noqa: F401 + +if sys.version_info < (3, 9): + from typing import ( # noqa: F401 + Awaitable as Awaitable, + ) +else: + from collections.abc import ( # noqa: F401 + Awaitable as Awaitable, + ) + +if sys.version_info < (3, 11): + class StrEnum(str, enum.Enum): + __str__ = str.__str__ + __repr__ = enum.Enum.__repr__ +else: + from enum import StrEnum as StrEnum # noqa: F401 diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/connect_utils.py b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/connect_utils.py new file mode 100755 index 0000000..07c4fdd --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/connect_utils.py @@ -0,0 +1,1313 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + +from __future__ import annotations + +import asyncio +import configparser +import collections +from collections.abc import Callable +import enum +import functools +import getpass +import os +import pathlib +import platform +import random +import re +import socket +import ssl as ssl_module +import stat +import struct +import sys +import typing +import urllib.parse +import warnings +import inspect + +from . import compat +from . import exceptions +from . import protocol + + +class SSLMode(enum.IntEnum): + disable = 0 + allow = 1 + prefer = 2 + require = 3 + verify_ca = 4 + verify_full = 5 + + @classmethod + def parse(cls, sslmode): + if isinstance(sslmode, cls): + return sslmode + return getattr(cls, sslmode.replace('-', '_')) + + +class SSLNegotiation(compat.StrEnum): + postgres = "postgres" + direct = "direct" + + +_ConnectionParameters = collections.namedtuple( + 'ConnectionParameters', + [ + 'user', + 'password', + 'database', + 'ssl', + 'sslmode', + 'ssl_negotiation', + 'server_settings', + 'target_session_attrs', + 'krbsrvname', + 'gsslib', + ]) + + +_ClientConfiguration = collections.namedtuple( + 'ConnectionConfiguration', + [ + 'command_timeout', + 'statement_cache_size', + 'max_cached_statement_lifetime', + 'max_cacheable_statement_size', + ]) + + +_system = platform.uname().system + + +if _system == 'Windows': + PGPASSFILE = 'pgpass.conf' +else: + PGPASSFILE = '.pgpass' + + +PG_SERVICEFILE = '.pg_service.conf' + + +def _read_password_file(passfile: pathlib.Path) \ + -> typing.List[typing.Tuple[str, ...]]: + + passtab = [] + + try: + if not passfile.exists(): + return [] + + if not passfile.is_file(): + warnings.warn( + 'password file {!r} is not a plain file'.format(passfile)) + + return [] + + if _system != 'Windows': + if passfile.stat().st_mode & (stat.S_IRWXG | stat.S_IRWXO): + warnings.warn( + 'password file {!r} has group or world access; ' + 'permissions should be u=rw (0600) or less'.format( + passfile)) + + return [] + + with passfile.open('rt') as f: + for line in f: + line = line.strip() + if not line or line.startswith('#'): + # Skip empty lines and comments. + continue + # Backslash escapes both itself and the colon, + # which is a record separator. + line = line.replace(R'\\', '\n') + passtab.append(tuple( + p.replace('\n', R'\\') + for p in re.split(r'(? 1: + # If there is a list of ports, its length must + # match that of the host list. + if len(port) != len(hosts): + raise exceptions.ClientConfigurationError( + 'could not match {} port numbers to {} hosts'.format( + len(port), len(hosts))) + elif isinstance(port, list) and len(port) == 1: + port = [port[0] for _ in range(len(hosts))] + else: + port = [port for _ in range(len(hosts))] + + return port + + +def _parse_hostlist(hostlist, port, *, unquote=False): + if ',' in hostlist: + # A comma-separated list of host addresses. + hostspecs = hostlist.split(',') + else: + hostspecs = [hostlist] + + hosts = [] + hostlist_ports = [] + + if not port: + portspec = os.environ.get('PGPORT') + if portspec: + if ',' in portspec: + default_port = [int(p) for p in portspec.split(',')] + else: + default_port = int(portspec) + else: + default_port = 5432 + + default_port = _validate_port_spec(hostspecs, default_port) + + else: + port = _validate_port_spec(hostspecs, port) + + for i, hostspec in enumerate(hostspecs): + if hostspec[0] == '/': + # Unix socket + addr = hostspec + hostspec_port = '' + elif hostspec[0] == '[': + # IPv6 address + m = re.match(r'(?:\[([^\]]+)\])(?::([0-9]+))?', hostspec) + if m: + addr = m.group(1) + hostspec_port = m.group(2) + else: + raise exceptions.ClientConfigurationError( + 'invalid IPv6 address in the connection URI: {!r}'.format( + hostspec + ) + ) + else: + # IPv4 address + addr, _, hostspec_port = hostspec.partition(':') + + if unquote: + addr = urllib.parse.unquote(addr) + + hosts.append(addr) + if not port: + if hostspec_port: + if unquote: + hostspec_port = urllib.parse.unquote(hostspec_port) + hostlist_ports.append(int(hostspec_port)) + else: + hostlist_ports.append(default_port[i]) + + if not port: + port = hostlist_ports + + return hosts, port + + +def _parse_tls_version(tls_version): + if tls_version.startswith('SSL'): + raise exceptions.ClientConfigurationError( + f"Unsupported TLS version: {tls_version}" + ) + try: + return ssl_module.TLSVersion[tls_version.replace('.', '_')] + except KeyError: + raise exceptions.ClientConfigurationError( + f"No such TLS version: {tls_version}" + ) + + +def _dot_postgresql_path(filename) -> typing.Optional[pathlib.Path]: + try: + homedir = pathlib.Path.home() + except (RuntimeError, KeyError): + return None + + return (homedir / '.postgresql' / filename).resolve() + + +def _parse_connect_dsn_and_args(*, dsn, host, port, user, + password, passfile, database, ssl, + service, servicefile, + direct_tls, server_settings, + target_session_attrs, krbsrvname, gsslib): + # `auth_hosts` is the version of host information for the purposes + # of reading the pgpass file. + auth_hosts = None + sslcert = sslkey = sslrootcert = sslcrl = sslpassword = None + ssl_min_protocol_version = ssl_max_protocol_version = None + sslnegotiation = None + + if dsn: + parsed = urllib.parse.urlparse(dsn) + + query = None + if parsed.query: + query = urllib.parse.parse_qs(parsed.query, strict_parsing=True) + for key, val in query.items(): + if isinstance(val, list): + query[key] = val[-1] + + if 'service' in query: + val = query.pop('service') + if not service and val: + service = val + + connection_service_file = servicefile + + if connection_service_file is None: + connection_service_file = os.getenv('PGSERVICEFILE') + + if connection_service_file is None: + homedir = compat.get_pg_home_directory() + if homedir: + connection_service_file = homedir / PG_SERVICEFILE + else: + connection_service_file = None + else: + connection_service_file = pathlib.Path(connection_service_file) + + if parsed.scheme not in {'postgresql', 'postgres'}: + raise exceptions.ClientConfigurationError( + 'invalid DSN: scheme is expected to be either ' + '"postgresql" or "postgres", got {!r}'.format(parsed.scheme)) + + if parsed.netloc: + if '@' in parsed.netloc: + dsn_auth, _, dsn_hostspec = parsed.netloc.partition('@') + else: + dsn_hostspec = parsed.netloc + dsn_auth = '' + else: + dsn_auth = dsn_hostspec = '' + + if dsn_auth: + dsn_user, _, dsn_password = dsn_auth.partition(':') + else: + dsn_user = dsn_password = '' + + if not host and dsn_hostspec: + host, port = _parse_hostlist(dsn_hostspec, port, unquote=True) + + if parsed.path and database is None: + dsn_database = parsed.path + if dsn_database.startswith('/'): + dsn_database = dsn_database[1:] + database = urllib.parse.unquote(dsn_database) + + if user is None and dsn_user: + user = urllib.parse.unquote(dsn_user) + + if password is None and dsn_password: + password = urllib.parse.unquote(dsn_password) + + if query: + + if 'port' in query: + val = query.pop('port') + if not port and val: + port = [int(p) for p in val.split(',')] + + if 'host' in query: + val = query.pop('host') + if not host and val: + host, port = _parse_hostlist(val, port) + + if 'dbname' in query: + val = query.pop('dbname') + if database is None: + database = val + + if 'database' in query: + val = query.pop('database') + if database is None: + database = val + + if 'user' in query: + val = query.pop('user') + if user is None: + user = val + + if 'password' in query: + val = query.pop('password') + if password is None: + password = val + + if 'passfile' in query: + val = query.pop('passfile') + if passfile is None: + passfile = val + + if 'sslmode' in query: + val = query.pop('sslmode') + if ssl is None: + ssl = val + + if 'sslcert' in query: + sslcert = query.pop('sslcert') + + if 'sslkey' in query: + sslkey = query.pop('sslkey') + + if 'sslrootcert' in query: + sslrootcert = query.pop('sslrootcert') + + if 'sslnegotiation' in query: + sslnegotiation = query.pop('sslnegotiation') + + if 'sslcrl' in query: + sslcrl = query.pop('sslcrl') + + if 'sslpassword' in query: + sslpassword = query.pop('sslpassword') + + if 'ssl_min_protocol_version' in query: + ssl_min_protocol_version = query.pop( + 'ssl_min_protocol_version' + ) + + if 'ssl_max_protocol_version' in query: + ssl_max_protocol_version = query.pop( + 'ssl_max_protocol_version' + ) + + if 'target_session_attrs' in query: + dsn_target_session_attrs = query.pop( + 'target_session_attrs' + ) + if target_session_attrs is None: + target_session_attrs = dsn_target_session_attrs + + if 'krbsrvname' in query: + val = query.pop('krbsrvname') + if krbsrvname is None: + krbsrvname = val + + if 'gsslib' in query: + val = query.pop('gsslib') + if gsslib is None: + gsslib = val + + if 'service' in query: + val = query.pop('service') + if service is None: + service = val + + if query: + if server_settings is None: + server_settings = query + else: + server_settings = {**query, **server_settings} + + if connection_service_file is not None and service is not None: + pg_service = configparser.ConfigParser() + pg_service.read(connection_service_file) + if service in pg_service.sections(): + service_params = pg_service[service] + if 'port' in service_params: + val = service_params.pop('port') + if not port and val: + port = [int(p) for p in val.split(',')] + + if 'host' in service_params: + val = service_params.pop('host') + if not host and val: + host, port = _parse_hostlist(val, port) + + if 'dbname' in service_params: + val = service_params.pop('dbname') + if database is None: + database = val + + if 'database' in service_params: + val = service_params.pop('database') + if database is None: + database = val + + if 'user' in service_params: + val = service_params.pop('user') + if user is None: + user = val + + if 'password' in service_params: + val = service_params.pop('password') + if password is None: + password = val + + if 'passfile' in service_params: + val = service_params.pop('passfile') + if passfile is None: + passfile = val + + if 'sslmode' in service_params: + val = service_params.pop('sslmode') + if ssl is None: + ssl = val + + if 'sslcert' in service_params: + val = service_params.pop('sslcert') + if sslcert is None: + sslcert = val + + if 'sslkey' in service_params: + val = service_params.pop('sslkey') + if sslkey is None: + sslkey = val + + if 'sslrootcert' in service_params: + val = service_params.pop('sslrootcert') + if sslrootcert is None: + sslrootcert = val + + if 'sslnegotiation' in service_params: + val = service_params.pop('sslnegotiation') + if sslnegotiation is None: + sslnegotiation = val + + if 'sslcrl' in service_params: + val = service_params.pop('sslcrl') + if sslcrl is None: + sslcrl = val + + if 'sslpassword' in service_params: + val = service_params.pop('sslpassword') + if sslpassword is None: + sslpassword = val + + if 'ssl_min_protocol_version' in service_params: + val = service_params.pop( + 'ssl_min_protocol_version' + ) + if ssl_min_protocol_version is None: + ssl_min_protocol_version = val + + if 'ssl_max_protocol_version' in service_params: + val = service_params.pop( + 'ssl_max_protocol_version' + ) + if ssl_max_protocol_version is None: + ssl_max_protocol_version = val + + if 'target_session_attrs' in service_params: + dsn_target_session_attrs = service_params.pop( + 'target_session_attrs' + ) + if target_session_attrs is None: + target_session_attrs = dsn_target_session_attrs + + if 'krbsrvname' in service_params: + val = service_params.pop('krbsrvname') + if krbsrvname is None: + krbsrvname = val + + if 'gsslib' in service_params: + val = service_params.pop('gsslib') + if gsslib is None: + gsslib = val + if not service: + service = os.environ.get('PGSERVICE') + if not host: + hostspec = os.environ.get('PGHOST') + if hostspec: + host, port = _parse_hostlist(hostspec, port) + + if not host: + auth_hosts = ['localhost'] + + if _system == 'Windows': + host = ['localhost'] + else: + host = ['/run/postgresql', '/var/run/postgresql', + '/tmp', '/private/tmp', 'localhost'] + + if not isinstance(host, (list, tuple)): + host = [host] + + if auth_hosts is None: + auth_hosts = host + + if not port: + portspec = os.environ.get('PGPORT') + if portspec: + if ',' in portspec: + port = [int(p) for p in portspec.split(',')] + else: + port = int(portspec) + else: + port = 5432 + + elif isinstance(port, (list, tuple)): + port = [int(p) for p in port] + + else: + port = int(port) + + port = _validate_port_spec(host, port) + + if user is None: + user = os.getenv('PGUSER') + if not user: + user = getpass.getuser() + + if password is None: + password = os.getenv('PGPASSWORD') + + if database is None: + database = os.getenv('PGDATABASE') + + if database is None: + database = user + + if user is None: + raise exceptions.ClientConfigurationError( + 'could not determine user name to connect with') + + if database is None: + raise exceptions.ClientConfigurationError( + 'could not determine database name to connect to') + + if password is None: + if passfile is None: + passfile = os.getenv('PGPASSFILE') + + if passfile is None: + homedir = compat.get_pg_home_directory() + if homedir: + passfile = homedir / PGPASSFILE + else: + passfile = None + else: + passfile = pathlib.Path(passfile) + + if passfile is not None: + password = _read_password_from_pgpass( + hosts=auth_hosts, ports=port, + database=database, user=user, + passfile=passfile) + + addrs = [] + have_tcp_addrs = False + for h, p in zip(host, port): + if h.startswith('/'): + # UNIX socket name + if '.s.PGSQL.' not in h: + h = os.path.join(h, '.s.PGSQL.{}'.format(p)) + addrs.append(h) + else: + # TCP host/port + addrs.append((h, p)) + have_tcp_addrs = True + + if not addrs: + raise exceptions.InternalClientError( + 'could not determine the database address to connect to') + + if ssl is None: + ssl = os.getenv('PGSSLMODE') + + if ssl is None and have_tcp_addrs: + ssl = 'prefer' + + if direct_tls is not None: + sslneg = ( + SSLNegotiation.direct if direct_tls else SSLNegotiation.postgres + ) + else: + if sslnegotiation is None: + sslnegotiation = os.environ.get("PGSSLNEGOTIATION") + + if sslnegotiation is not None: + try: + sslneg = SSLNegotiation(sslnegotiation) + except ValueError: + modes = ', '.join( + m.name.replace('_', '-') + for m in SSLNegotiation + ) + raise exceptions.ClientConfigurationError( + f'`sslnegotiation` parameter must be one of: {modes}' + ) from None + else: + sslneg = SSLNegotiation.postgres + + if isinstance(ssl, (str, SSLMode)): + try: + sslmode = SSLMode.parse(ssl) + except AttributeError: + modes = ', '.join(m.name.replace('_', '-') for m in SSLMode) + raise exceptions.ClientConfigurationError( + '`sslmode` parameter must be one of: {}'.format(modes) + ) from None + + # docs at https://www.postgresql.org/docs/10/static/libpq-connect.html + if sslmode < SSLMode.allow: + ssl = False + else: + ssl = ssl_module.SSLContext(ssl_module.PROTOCOL_TLS_CLIENT) + ssl.check_hostname = sslmode >= SSLMode.verify_full + if sslmode < SSLMode.require: + ssl.verify_mode = ssl_module.CERT_NONE + else: + if sslrootcert is None: + sslrootcert = os.getenv('PGSSLROOTCERT') + if sslrootcert: + ssl.load_verify_locations(cafile=sslrootcert) + ssl.verify_mode = ssl_module.CERT_REQUIRED + else: + try: + sslrootcert = _dot_postgresql_path('root.crt') + if sslrootcert is not None: + ssl.load_verify_locations(cafile=sslrootcert) + else: + raise exceptions.ClientConfigurationError( + 'cannot determine location of user ' + 'PostgreSQL configuration directory' + ) + except ( + exceptions.ClientConfigurationError, + FileNotFoundError, + NotADirectoryError, + ): + if sslmode > SSLMode.require: + if sslrootcert is None: + sslrootcert = '~/.postgresql/root.crt' + detail = ( + 'Could not determine location of user ' + 'home directory (HOME is either unset, ' + 'inaccessible, or does not point to a ' + 'valid directory)' + ) + else: + detail = None + raise exceptions.ClientConfigurationError( + f'root certificate file "{sslrootcert}" does ' + f'not exist or cannot be accessed', + hint='Provide the certificate file directly ' + f'or make sure "{sslrootcert}" ' + 'exists and is readable.', + detail=detail, + ) + elif sslmode == SSLMode.require: + ssl.verify_mode = ssl_module.CERT_NONE + else: + assert False, 'unreachable' + else: + ssl.verify_mode = ssl_module.CERT_REQUIRED + + if sslcrl is None: + sslcrl = os.getenv('PGSSLCRL') + if sslcrl: + ssl.load_verify_locations(cafile=sslcrl) + ssl.verify_flags |= ssl_module.VERIFY_CRL_CHECK_CHAIN + else: + sslcrl = _dot_postgresql_path('root.crl') + if sslcrl is not None: + try: + ssl.load_verify_locations(cafile=sslcrl) + except ( + FileNotFoundError, + NotADirectoryError, + ): + pass + else: + ssl.verify_flags |= \ + ssl_module.VERIFY_CRL_CHECK_CHAIN + + if sslkey is None: + sslkey = os.getenv('PGSSLKEY') + if not sslkey: + sslkey = _dot_postgresql_path('postgresql.key') + if sslkey is not None and not sslkey.exists(): + sslkey = None + if not sslpassword: + sslpassword = '' + if sslcert is None: + sslcert = os.getenv('PGSSLCERT') + if sslcert: + ssl.load_cert_chain( + sslcert, keyfile=sslkey, password=lambda: sslpassword + ) + else: + sslcert = _dot_postgresql_path('postgresql.crt') + if sslcert is not None: + try: + ssl.load_cert_chain( + sslcert, + keyfile=sslkey, + password=lambda: sslpassword + ) + except (FileNotFoundError, NotADirectoryError): + pass + + # OpenSSL 1.1.1 keylog file, copied from create_default_context() + if hasattr(ssl, 'keylog_filename'): + keylogfile = os.environ.get('SSLKEYLOGFILE') + if keylogfile and not sys.flags.ignore_environment: + ssl.keylog_filename = keylogfile + + if ssl_min_protocol_version is None: + ssl_min_protocol_version = os.getenv('PGSSLMINPROTOCOLVERSION') + if ssl_min_protocol_version: + ssl.minimum_version = _parse_tls_version( + ssl_min_protocol_version + ) + else: + ssl.minimum_version = _parse_tls_version('TLSv1.2') + + if ssl_max_protocol_version is None: + ssl_max_protocol_version = os.getenv('PGSSLMAXPROTOCOLVERSION') + if ssl_max_protocol_version: + ssl.maximum_version = _parse_tls_version( + ssl_max_protocol_version + ) + + elif ssl is True: + ssl = ssl_module.create_default_context() + sslmode = SSLMode.verify_full + else: + sslmode = SSLMode.disable + + if server_settings is not None and ( + not isinstance(server_settings, dict) or + not all(isinstance(k, str) for k in server_settings) or + not all(isinstance(v, str) for v in server_settings.values())): + raise exceptions.ClientConfigurationError( + 'server_settings is expected to be None or ' + 'a Dict[str, str]') + + if target_session_attrs is None: + target_session_attrs = os.getenv( + "PGTARGETSESSIONATTRS", SessionAttribute.any + ) + try: + target_session_attrs = SessionAttribute(target_session_attrs) + except ValueError: + raise exceptions.ClientConfigurationError( + "target_session_attrs is expected to be one of " + "{!r}" + ", got {!r}".format( + SessionAttribute.__members__.values, target_session_attrs + ) + ) from None + + if krbsrvname is None: + krbsrvname = os.getenv('PGKRBSRVNAME') + + if gsslib is None: + gsslib = os.getenv('PGGSSLIB') + if gsslib is None: + gsslib = 'sspi' if _system == 'Windows' else 'gssapi' + if gsslib not in {'gssapi', 'sspi'}: + raise exceptions.ClientConfigurationError( + "gsslib parameter must be either 'gssapi' or 'sspi'" + ", got {!r}".format(gsslib)) + + params = _ConnectionParameters( + user=user, password=password, database=database, ssl=ssl, + sslmode=sslmode, ssl_negotiation=sslneg, + server_settings=server_settings, + target_session_attrs=target_session_attrs, + krbsrvname=krbsrvname, gsslib=gsslib) + + return addrs, params + + +def _parse_connect_arguments(*, dsn, host, port, user, password, passfile, + database, command_timeout, + statement_cache_size, + max_cached_statement_lifetime, + max_cacheable_statement_size, + ssl, direct_tls, server_settings, + target_session_attrs, krbsrvname, gsslib, + service, servicefile): + local_vars = locals() + for var_name in {'max_cacheable_statement_size', + 'max_cached_statement_lifetime', + 'statement_cache_size'}: + var_val = local_vars[var_name] + if var_val is None or isinstance(var_val, bool) or var_val < 0: + raise ValueError( + '{} is expected to be greater ' + 'or equal to 0, got {!r}'.format(var_name, var_val)) + + if command_timeout is not None: + try: + if isinstance(command_timeout, bool): + raise ValueError + command_timeout = float(command_timeout) + if command_timeout <= 0: + raise ValueError + except ValueError: + raise ValueError( + 'invalid command_timeout value: ' + 'expected greater than 0 float (got {!r})'.format( + command_timeout)) from None + + addrs, params = _parse_connect_dsn_and_args( + dsn=dsn, host=host, port=port, user=user, + password=password, passfile=passfile, ssl=ssl, + direct_tls=direct_tls, database=database, + server_settings=server_settings, + target_session_attrs=target_session_attrs, + krbsrvname=krbsrvname, gsslib=gsslib, + service=service, servicefile=servicefile) + + config = _ClientConfiguration( + command_timeout=command_timeout, + statement_cache_size=statement_cache_size, + max_cached_statement_lifetime=max_cached_statement_lifetime, + max_cacheable_statement_size=max_cacheable_statement_size,) + + return addrs, params, config + + +class TLSUpgradeProto(asyncio.Protocol): + def __init__( + self, + loop: asyncio.AbstractEventLoop, + host: str, + port: int, + ssl_context: ssl_module.SSLContext, + ssl_is_advisory: bool, + ) -> None: + self.on_data = _create_future(loop) + self.host = host + self.port = port + self.ssl_context = ssl_context + self.ssl_is_advisory = ssl_is_advisory + + def data_received(self, data: bytes) -> None: + if data == b'S': + self.on_data.set_result(True) + elif (self.ssl_is_advisory and + self.ssl_context.verify_mode == ssl_module.CERT_NONE and + data == b'N'): + # ssl_is_advisory will imply that ssl.verify_mode == CERT_NONE, + # since the only way to get ssl_is_advisory is from + # sslmode=prefer. But be extra sure to disallow insecure + # connections when the ssl context asks for real security. + self.on_data.set_result(False) + else: + self.on_data.set_exception( + ConnectionError( + 'PostgreSQL server at "{host}:{port}" ' + 'rejected SSL upgrade'.format( + host=self.host, port=self.port))) + + def connection_lost(self, exc: typing.Optional[Exception]) -> None: + if not self.on_data.done(): + if exc is None: + exc = ConnectionError('unexpected connection_lost() call') + self.on_data.set_exception(exc) + + +_ProctolFactoryR = typing.TypeVar( + "_ProctolFactoryR", bound=asyncio.protocols.Protocol +) + + +async def _create_ssl_connection( + # TODO: The return type is a specific combination of subclasses of + # asyncio.protocols.Protocol that we can't express. For now, having the + # return type be dependent on signature of the factory is an improvement + protocol_factory: Callable[[], _ProctolFactoryR], + host: str, + port: int, + *, + loop: asyncio.AbstractEventLoop, + ssl_context: ssl_module.SSLContext, + ssl_is_advisory: bool = False, +) -> typing.Tuple[asyncio.Transport, _ProctolFactoryR]: + + tr, pr = await loop.create_connection( + lambda: TLSUpgradeProto(loop, host, port, + ssl_context, ssl_is_advisory), + host, port) + + tr.write(struct.pack('!ll', 8, 80877103)) # SSLRequest message. + + try: + do_ssl_upgrade = await pr.on_data + except (Exception, asyncio.CancelledError): + tr.close() + raise + + if hasattr(loop, 'start_tls'): + if do_ssl_upgrade: + try: + new_tr = await loop.start_tls( + tr, pr, ssl_context, server_hostname=host) + assert new_tr is not None + except (Exception, asyncio.CancelledError): + tr.close() + raise + else: + new_tr = tr + + pg_proto = protocol_factory() + pg_proto.is_ssl = do_ssl_upgrade + pg_proto.connection_made(new_tr) + new_tr.set_protocol(pg_proto) + + return new_tr, pg_proto + else: + conn_factory = functools.partial( + loop.create_connection, protocol_factory) + + if do_ssl_upgrade: + conn_factory = functools.partial( + conn_factory, ssl=ssl_context, server_hostname=host) + + sock = _get_socket(tr) + sock = sock.dup() + _set_nodelay(sock) + tr.close() + + try: + new_tr, pg_proto = await conn_factory(sock=sock) + pg_proto.is_ssl = do_ssl_upgrade + return new_tr, pg_proto + except (Exception, asyncio.CancelledError): + sock.close() + raise + + +async def _connect_addr( + *, + addr, + loop, + params, + config, + connection_class, + record_class +): + assert loop is not None + + params_input = params + if callable(params.password): + password = params.password() + if inspect.isawaitable(password): + password = await password + + params = params._replace(password=password) + args = (addr, loop, config, connection_class, record_class, params_input) + + # prepare the params (which attempt has ssl) for the 2 attempts + if params.sslmode == SSLMode.allow: + params_retry = params + params = params._replace(ssl=None) + elif params.sslmode == SSLMode.prefer: + params_retry = params._replace(ssl=None) + else: + # skip retry if we don't have to + return await __connect_addr(params, False, *args) + + # first attempt + try: + return await __connect_addr(params, True, *args) + except _RetryConnectSignal: + pass + + # second attempt + return await __connect_addr(params_retry, False, *args) + + +class _RetryConnectSignal(Exception): + pass + + +async def __connect_addr( + params, + retry, + addr, + loop, + config, + connection_class, + record_class, + params_input, +): + connected = _create_future(loop) + + proto_factory = lambda: protocol.Protocol( + addr, connected, params, record_class, loop) + + if isinstance(addr, str): + # UNIX socket + connector = loop.create_unix_connection(proto_factory, addr) + + elif params.ssl and params.ssl_negotiation is SSLNegotiation.direct: + # if ssl and ssl_negotiation is `direct`, skip STARTTLS and perform + # direct SSL connection + connector = loop.create_connection( + proto_factory, *addr, ssl=params.ssl + ) + + elif params.ssl: + connector = _create_ssl_connection( + proto_factory, *addr, loop=loop, ssl_context=params.ssl, + ssl_is_advisory=params.sslmode == SSLMode.prefer) + else: + connector = loop.create_connection(proto_factory, *addr) + + tr, pr = await connector + + try: + await connected + except ( + exceptions.InvalidAuthorizationSpecificationError, + exceptions.ConnectionDoesNotExistError, # seen on Windows + ): + tr.close() + + # retry=True here is a redundant check because we don't want to + # accidentally raise the internal _RetryConnectSignal to the user + if retry and ( + params.sslmode == SSLMode.allow and not pr.is_ssl or + params.sslmode == SSLMode.prefer and pr.is_ssl + ): + # Trigger retry when: + # 1. First attempt with sslmode=allow, ssl=None failed + # 2. First attempt with sslmode=prefer, ssl=ctx failed while the + # server claimed to support SSL (returning "S" for SSLRequest) + # (likely because pg_hba.conf rejected the connection) + raise _RetryConnectSignal() + + else: + # but will NOT retry if: + # 1. First attempt with sslmode=prefer failed but the server + # doesn't support SSL (returning 'N' for SSLRequest), because + # we already tried to connect without SSL thru ssl_is_advisory + # 2. Second attempt with sslmode=prefer, ssl=None failed + # 3. Second attempt with sslmode=allow, ssl=ctx failed + # 4. Any other sslmode + raise + + except (Exception, asyncio.CancelledError): + tr.close() + raise + + con = connection_class(pr, tr, loop, addr, config, params_input) + pr.set_connection(con) + return con + + +class SessionAttribute(str, enum.Enum): + any = 'any' + primary = 'primary' + standby = 'standby' + prefer_standby = 'prefer-standby' + read_write = "read-write" + read_only = "read-only" + + +def _accept_in_hot_standby(should_be_in_hot_standby: bool): + """ + If the server didn't report "in_hot_standby" at startup, we must determine + the state by checking "SELECT pg_catalog.pg_is_in_recovery()". + If the server allows a connection and states it is in recovery it must + be a replica/standby server. + """ + async def can_be_used(connection): + settings = connection.get_settings() + hot_standby_status = getattr(settings, 'in_hot_standby', None) + if hot_standby_status is not None: + is_in_hot_standby = hot_standby_status == 'on' + else: + is_in_hot_standby = await connection.fetchval( + "SELECT pg_catalog.pg_is_in_recovery()" + ) + return is_in_hot_standby == should_be_in_hot_standby + + return can_be_used + + +def _accept_read_only(should_be_read_only: bool): + """ + Verify the server has not set default_transaction_read_only=True + """ + async def can_be_used(connection): + settings = connection.get_settings() + is_readonly = getattr(settings, 'default_transaction_read_only', 'off') + + if is_readonly == "on": + return should_be_read_only + + return await _accept_in_hot_standby(should_be_read_only)(connection) + return can_be_used + + +async def _accept_any(_): + return True + + +target_attrs_check = { + SessionAttribute.any: _accept_any, + SessionAttribute.primary: _accept_in_hot_standby(False), + SessionAttribute.standby: _accept_in_hot_standby(True), + SessionAttribute.prefer_standby: _accept_in_hot_standby(True), + SessionAttribute.read_write: _accept_read_only(False), + SessionAttribute.read_only: _accept_read_only(True), +} + + +async def _can_use_connection(connection, attr: SessionAttribute): + can_use = target_attrs_check[attr] + return await can_use(connection) + + +async def _connect(*, loop, connection_class, record_class, **kwargs): + if loop is None: + loop = asyncio.get_event_loop() + + addrs, params, config = _parse_connect_arguments(**kwargs) + target_attr = params.target_session_attrs + + candidates = [] + chosen_connection = None + last_error = None + try: + for addr in addrs: + try: + conn = await _connect_addr( + addr=addr, + loop=loop, + params=params, + config=config, + connection_class=connection_class, + record_class=record_class, + ) + candidates.append(conn) + if await _can_use_connection(conn, target_attr): + chosen_connection = conn + break + except OSError as ex: + last_error = ex + else: + if target_attr == SessionAttribute.prefer_standby and candidates: + chosen_connection = random.choice(candidates) + finally: + + async def _close_candidates(conns, chosen): + await asyncio.gather( + *(c.close() for c in conns if c is not chosen), + return_exceptions=True + ) + if candidates: + asyncio.create_task( + _close_candidates(candidates, chosen_connection)) + + if chosen_connection: + return chosen_connection + + raise last_error or exceptions.TargetServerAttributeNotMatched( + 'None of the hosts match the target attribute requirement ' + '{!r}'.format(target_attr) + ) + + +async def _cancel(*, loop, addr, params: _ConnectionParameters, + backend_pid, backend_secret): + + class CancelProto(asyncio.Protocol): + + def __init__(self): + self.on_disconnect = _create_future(loop) + self.is_ssl = False + + def connection_lost(self, exc): + if not self.on_disconnect.done(): + self.on_disconnect.set_result(True) + + if isinstance(addr, str): + tr, pr = await loop.create_unix_connection(CancelProto, addr) + else: + if params.ssl and params.sslmode != SSLMode.allow: + tr, pr = await _create_ssl_connection( + CancelProto, + *addr, + loop=loop, + ssl_context=params.ssl, + ssl_is_advisory=params.sslmode == SSLMode.prefer) + else: + tr, pr = await loop.create_connection( + CancelProto, *addr) + _set_nodelay(_get_socket(tr)) + + # Pack a CancelRequest message + msg = struct.pack('!llll', 16, 80877102, backend_pid, backend_secret) + + try: + tr.write(msg) + await pr.on_disconnect + finally: + tr.close() + + +def _get_socket(transport): + sock = transport.get_extra_info('socket') + if sock is None: + # Shouldn't happen with any asyncio-complaint event loop. + raise ConnectionError( + 'could not get the socket for transport {!r}'.format(transport)) + return sock + + +def _set_nodelay(sock): + if not hasattr(socket, 'AF_UNIX') or sock.family != socket.AF_UNIX: + sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + + +def _create_future(loop): + try: + create_future = loop.create_future + except AttributeError: + return asyncio.Future(loop=loop) + else: + return create_future() diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/connection.py b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/connection.py new file mode 100755 index 0000000..71fb04f --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/connection.py @@ -0,0 +1,2773 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +import asyncio +import asyncpg +import collections +import collections.abc +import contextlib +import functools +import itertools +import inspect +import os +import sys +import time +import traceback +import typing +import warnings +import weakref + +from . import compat +from . import connect_utils +from . import cursor +from . import exceptions +from . import introspection +from . import prepared_stmt +from . import protocol +from . import serverversion +from . import transaction +from . import utils + + +class ConnectionMeta(type): + + def __instancecheck__(cls, instance): + mro = type(instance).__mro__ + return Connection in mro or _ConnectionProxy in mro + + +class Connection(metaclass=ConnectionMeta): + """A representation of a database session. + + Connections are created by calling :func:`~asyncpg.connection.connect`. + """ + + __slots__ = ('_protocol', '_transport', '_loop', + '_top_xact', '_aborted', + '_pool_release_ctr', '_stmt_cache', '_stmts_to_close', + '_stmt_cache_enabled', + '_listeners', '_server_version', '_server_caps', + '_intro_query', '_reset_query', '_proxy', + '_stmt_exclusive_section', '_config', '_params', '_addr', + '_log_listeners', '_termination_listeners', '_cancellations', + '_source_traceback', '_query_loggers', '__weakref__') + + def __init__(self, protocol, transport, loop, + addr, + config: connect_utils._ClientConfiguration, + params: connect_utils._ConnectionParameters): + self._protocol = protocol + self._transport = transport + self._loop = loop + self._top_xact = None + self._aborted = False + # Incremented every time the connection is released back to a pool. + # Used to catch invalid references to connection-related resources + # post-release (e.g. explicit prepared statements). + self._pool_release_ctr = 0 + + self._addr = addr + self._config = config + self._params = params + + self._stmt_cache = _StatementCache( + loop=loop, + max_size=config.statement_cache_size, + on_remove=functools.partial( + _weak_maybe_gc_stmt, weakref.ref(self)), + max_lifetime=config.max_cached_statement_lifetime) + + self._stmts_to_close = set() + self._stmt_cache_enabled = config.statement_cache_size > 0 + + self._listeners = {} + self._log_listeners = set() + self._cancellations = set() + self._termination_listeners = set() + self._query_loggers = set() + + settings = self._protocol.get_settings() + ver_string = settings.server_version + self._server_version = \ + serverversion.split_server_version_string(ver_string) + + self._server_caps = _detect_server_capabilities( + self._server_version, settings) + + if self._server_version < (14, 0): + self._intro_query = introspection.INTRO_LOOKUP_TYPES_13 + else: + self._intro_query = introspection.INTRO_LOOKUP_TYPES + + self._reset_query = None + self._proxy = None + + # Used to serialize operations that might involve anonymous + # statements. Specifically, we want to make the following + # operation atomic: + # ("prepare an anonymous statement", "use the statement") + # + # Used for `con.fetchval()`, `con.fetch()`, `con.fetchrow()`, + # `con.execute()`, and `con.executemany()`. + self._stmt_exclusive_section = _Atomic() + + if loop.get_debug(): + self._source_traceback = _extract_stack() + else: + self._source_traceback = None + + def __del__(self): + if not self.is_closed() and self._protocol is not None: + if self._source_traceback: + msg = "unclosed connection {!r}; created at:\n {}".format( + self, self._source_traceback) + else: + msg = ( + "unclosed connection {!r}; run in asyncio debug " + "mode to show the traceback of connection " + "origin".format(self) + ) + + warnings.warn(msg, ResourceWarning) + if not self._loop.is_closed(): + self.terminate() + + async def add_listener(self, channel, callback): + """Add a listener for Postgres notifications. + + :param str channel: Channel to listen on. + + :param callable callback: + A callable or a coroutine function receiving the following + arguments: + **connection**: a Connection the callback is registered with; + **pid**: PID of the Postgres server that sent the notification; + **channel**: name of the channel the notification was sent to; + **payload**: the payload. + + .. versionchanged:: 0.24.0 + The ``callback`` argument may be a coroutine function. + """ + self._check_open() + if channel not in self._listeners: + await self.fetch('LISTEN {}'.format(utils._quote_ident(channel))) + self._listeners[channel] = set() + self._listeners[channel].add(_Callback.from_callable(callback)) + + async def remove_listener(self, channel, callback): + """Remove a listening callback on the specified channel.""" + if self.is_closed(): + return + if channel not in self._listeners: + return + cb = _Callback.from_callable(callback) + if cb not in self._listeners[channel]: + return + self._listeners[channel].remove(cb) + if not self._listeners[channel]: + del self._listeners[channel] + await self.fetch('UNLISTEN {}'.format(utils._quote_ident(channel))) + + def add_log_listener(self, callback): + """Add a listener for Postgres log messages. + + It will be called when asyncronous NoticeResponse is received + from the connection. Possible message types are: WARNING, NOTICE, + DEBUG, INFO, or LOG. + + :param callable callback: + A callable or a coroutine function receiving the following + arguments: + **connection**: a Connection the callback is registered with; + **message**: the `exceptions.PostgresLogMessage` message. + + .. versionadded:: 0.12.0 + + .. versionchanged:: 0.24.0 + The ``callback`` argument may be a coroutine function. + """ + if self.is_closed(): + raise exceptions.InterfaceError('connection is closed') + self._log_listeners.add(_Callback.from_callable(callback)) + + def remove_log_listener(self, callback): + """Remove a listening callback for log messages. + + .. versionadded:: 0.12.0 + """ + self._log_listeners.discard(_Callback.from_callable(callback)) + + def add_termination_listener(self, callback): + """Add a listener that will be called when the connection is closed. + + :param callable callback: + A callable or a coroutine function receiving one argument: + **connection**: a Connection the callback is registered with. + + .. versionadded:: 0.21.0 + + .. versionchanged:: 0.24.0 + The ``callback`` argument may be a coroutine function. + """ + self._termination_listeners.add(_Callback.from_callable(callback)) + + def remove_termination_listener(self, callback): + """Remove a listening callback for connection termination. + + :param callable callback: + The callable or coroutine function that was passed to + :meth:`Connection.add_termination_listener`. + + .. versionadded:: 0.21.0 + """ + self._termination_listeners.discard(_Callback.from_callable(callback)) + + def add_query_logger(self, callback): + """Add a logger that will be called when queries are executed. + + :param callable callback: + A callable or a coroutine function receiving one argument: + **record**, a LoggedQuery containing `query`, `args`, `timeout`, + `elapsed`, `exception`, `conn_addr`, and `conn_params`. + + .. versionadded:: 0.29.0 + """ + self._query_loggers.add(_Callback.from_callable(callback)) + + def remove_query_logger(self, callback): + """Remove a query logger callback. + + :param callable callback: + The callable or coroutine function that was passed to + :meth:`Connection.add_query_logger`. + + .. versionadded:: 0.29.0 + """ + self._query_loggers.discard(_Callback.from_callable(callback)) + + def get_server_pid(self): + """Return the PID of the Postgres server the connection is bound to.""" + return self._protocol.get_server_pid() + + def get_server_version(self): + """Return the version of the connected PostgreSQL server. + + The returned value is a named tuple similar to that in + ``sys.version_info``: + + .. code-block:: pycon + + >>> con.get_server_version() + ServerVersion(major=9, minor=6, micro=1, + releaselevel='final', serial=0) + + .. versionadded:: 0.8.0 + """ + return self._server_version + + def get_settings(self): + """Return connection settings. + + :return: :class:`~asyncpg.ConnectionSettings`. + """ + return self._protocol.get_settings() + + def transaction(self, *, isolation=None, readonly=False, + deferrable=False): + """Create a :class:`~transaction.Transaction` object. + + Refer to `PostgreSQL documentation`_ on the meaning of transaction + parameters. + + :param isolation: Transaction isolation mode, can be one of: + `'serializable'`, `'repeatable_read'`, + `'read_uncommitted'`, `'read_committed'`. If not + specified, the behavior is up to the server and + session, which is usually ``read_committed``. + + :param readonly: Specifies whether or not this transaction is + read-only. + + :param deferrable: Specifies whether or not this transaction is + deferrable. + + .. _`PostgreSQL documentation`: + https://www.postgresql.org/docs/ + current/static/sql-set-transaction.html + """ + self._check_open() + return transaction.Transaction(self, isolation, readonly, deferrable) + + def is_in_transaction(self): + """Return True if Connection is currently inside a transaction. + + :return bool: True if inside transaction, False otherwise. + + .. versionadded:: 0.16.0 + """ + return self._protocol.is_in_transaction() + + async def execute( + self, + query: str, + *args, + timeout: typing.Optional[float]=None, + ) -> str: + """Execute an SQL command (or commands). + + This method can execute many SQL commands at once, when no arguments + are provided. + + Example: + + .. code-block:: pycon + + >>> await con.execute(''' + ... CREATE TABLE mytab (a int); + ... INSERT INTO mytab (a) VALUES (100), (200), (300); + ... ''') + INSERT 0 3 + + >>> await con.execute(''' + ... INSERT INTO mytab (a) VALUES ($1), ($2) + ... ''', 10, 20) + INSERT 0 2 + + :param args: Query arguments. + :param float timeout: Optional timeout value in seconds. + :return str: Status of the last SQL command. + + .. versionchanged:: 0.5.4 + Made it possible to pass query arguments. + """ + self._check_open() + + if not args: + if self._query_loggers: + with self._time_and_log(query, args, timeout): + result = await self._protocol.query(query, timeout) + else: + result = await self._protocol.query(query, timeout) + return result + + _, status, _ = await self._execute( + query, + args, + 0, + timeout, + return_status=True, + ) + return status.decode() + + async def executemany( + self, + command: str, + args, + *, + timeout: typing.Optional[float]=None, + ): + """Execute an SQL *command* for each sequence of arguments in *args*. + + Example: + + .. code-block:: pycon + + >>> await con.executemany(''' + ... INSERT INTO mytab (a) VALUES ($1, $2, $3); + ... ''', [(1, 2, 3), (4, 5, 6)]) + + :param command: Command to execute. + :param args: An iterable containing sequences of arguments. + :param float timeout: Optional timeout value in seconds. + :return None: This method discards the results of the operations. + + .. versionadded:: 0.7.0 + + .. versionchanged:: 0.11.0 + `timeout` became a keyword-only parameter. + + .. versionchanged:: 0.22.0 + ``executemany()`` is now an atomic operation, which means that + either all executions succeed, or none at all. This is in contrast + to prior versions, where the effect of already-processed iterations + would remain in place when an error has occurred, unless + ``executemany()`` was called in a transaction. + """ + self._check_open() + return await self._executemany(command, args, timeout) + + async def _get_statement( + self, + query, + timeout, + *, + named: typing.Union[str, bool, None] = False, + use_cache=True, + ignore_custom_codec=False, + record_class=None + ): + if record_class is None: + record_class = self._protocol.get_record_class() + else: + _check_record_class(record_class) + + if use_cache: + statement = self._stmt_cache.get( + (query, record_class, ignore_custom_codec) + ) + if statement is not None: + return statement + + # Only use the cache when: + # * `statement_cache_size` is greater than 0; + # * query size is less than `max_cacheable_statement_size`. + use_cache = ( + self._stmt_cache_enabled + and ( + not self._config.max_cacheable_statement_size + or len(query) <= self._config.max_cacheable_statement_size + ) + ) + + if isinstance(named, str): + stmt_name = named + elif use_cache or named: + stmt_name = self._get_unique_id('stmt') + else: + stmt_name = '' + + statement = await self._protocol.prepare( + stmt_name, + query, + timeout, + record_class=record_class, + ignore_custom_codec=ignore_custom_codec, + ) + need_reprepare = False + types_with_missing_codecs = statement._init_types() + tries = 0 + while types_with_missing_codecs: + settings = self._protocol.get_settings() + + # Introspect newly seen types and populate the + # codec cache. + types, intro_stmt = await self._introspect_types( + types_with_missing_codecs, timeout) + + settings.register_data_types(types) + + # The introspection query has used an anonymous statement, + # which has blown away the anonymous statement we've prepared + # for the query, so we need to re-prepare it. + need_reprepare = not intro_stmt.name and not statement.name + types_with_missing_codecs = statement._init_types() + tries += 1 + if tries > 5: + # In the vast majority of cases there will be only + # one iteration. In rare cases, there might be a race + # with reload_schema_state(), which would cause a + # second try. More than five is clearly a bug. + raise exceptions.InternalClientError( + 'could not resolve query result and/or argument types ' + 'in {} attempts'.format(tries) + ) + + # Now that types have been resolved, populate the codec pipeline + # for the statement. + statement._init_codecs() + + if ( + need_reprepare + or (not statement.name and not self._stmt_cache_enabled) + ): + # Mark this anonymous prepared statement as "unprepared", + # causing it to get re-Parsed in next bind_execute. + # We always do this when stmt_cache_size is set to 0 assuming + # people are running PgBouncer which is mishandling implicit + # transactions. + statement.mark_unprepared() + + if use_cache: + self._stmt_cache.put( + (query, record_class, ignore_custom_codec), statement) + + # If we've just created a new statement object, check if there + # are any statements for GC. + if self._stmts_to_close: + await self._cleanup_stmts() + + return statement + + async def _introspect_types(self, typeoids, timeout): + if self._server_caps.jit: + try: + cfgrow, _ = await self.__execute( + """ + SELECT + current_setting('jit') AS cur, + set_config('jit', 'off', false) AS new + """, + (), + 0, + timeout, + ignore_custom_codec=True, + ) + jit_state = cfgrow[0]['cur'] + except exceptions.UndefinedObjectError: + jit_state = 'off' + else: + jit_state = 'off' + + result = await self.__execute( + self._intro_query, + (list(typeoids),), + 0, + timeout, + ignore_custom_codec=True, + ) + + if jit_state != 'off': + await self.__execute( + """ + SELECT + set_config('jit', $1, false) + """, + (jit_state,), + 0, + timeout, + ignore_custom_codec=True, + ) + + return result + + async def _introspect_type(self, typename, schema): + if schema == 'pg_catalog' and not typename.endswith("[]"): + typeoid = protocol.BUILTIN_TYPE_NAME_MAP.get(typename.lower()) + if typeoid is not None: + return introspection.TypeRecord((typeoid, None, b"b")) + + rows = await self._execute( + introspection.TYPE_BY_NAME, + [typename, schema], + limit=1, + timeout=None, + ignore_custom_codec=True, + ) + + if not rows: + raise ValueError( + 'unknown type: {}.{}'.format(schema, typename)) + + return rows[0] + + def cursor( + self, + query, + *args, + prefetch=None, + timeout=None, + record_class=None + ): + """Return a *cursor factory* for the specified query. + + :param args: + Query arguments. + :param int prefetch: + The number of rows the *cursor iterator* + will prefetch (defaults to ``50``.) + :param float timeout: + Optional timeout in seconds. + :param type record_class: + If specified, the class to use for records returned by this cursor. + Must be a subclass of :class:`~asyncpg.Record`. If not specified, + a per-connection *record_class* is used. + + :return: + A :class:`~cursor.CursorFactory` object. + + .. versionchanged:: 0.22.0 + Added the *record_class* parameter. + """ + self._check_open() + return cursor.CursorFactory( + self, + query, + None, + args, + prefetch, + timeout, + record_class, + ) + + async def prepare( + self, + query, + *, + name=None, + timeout=None, + record_class=None, + ): + """Create a *prepared statement* for the specified query. + + :param str query: + Text of the query to create a prepared statement for. + :param str name: + Optional name of the returned prepared statement. If not + specified, the name is auto-generated. + :param float timeout: + Optional timeout value in seconds. + :param type record_class: + If specified, the class to use for records returned by the + prepared statement. Must be a subclass of + :class:`~asyncpg.Record`. If not specified, a per-connection + *record_class* is used. + + :return: + A :class:`~prepared_stmt.PreparedStatement` instance. + + .. versionchanged:: 0.22.0 + Added the *record_class* parameter. + + .. versionchanged:: 0.25.0 + Added the *name* parameter. + """ + return await self._prepare( + query, + name=name, + timeout=timeout, + record_class=record_class, + ) + + async def _prepare( + self, + query, + *, + name: typing.Union[str, bool, None] = None, + timeout=None, + use_cache: bool=False, + record_class=None + ): + self._check_open() + if name is None: + name = self._stmt_cache_enabled + stmt = await self._get_statement( + query, + timeout, + named=name, + use_cache=use_cache, + record_class=record_class, + ) + return prepared_stmt.PreparedStatement(self, query, stmt) + + async def fetch( + self, + query, + *args, + timeout=None, + record_class=None + ) -> list: + """Run a query and return the results as a list of :class:`Record`. + + :param str query: + Query text. + :param args: + Query arguments. + :param float timeout: + Optional timeout value in seconds. + :param type record_class: + If specified, the class to use for records returned by this method. + Must be a subclass of :class:`~asyncpg.Record`. If not specified, + a per-connection *record_class* is used. + + :return list: + A list of :class:`~asyncpg.Record` instances. If specified, the + actual type of list elements would be *record_class*. + + .. versionchanged:: 0.22.0 + Added the *record_class* parameter. + """ + self._check_open() + return await self._execute( + query, + args, + 0, + timeout, + record_class=record_class, + ) + + async def fetchval(self, query, *args, column=0, timeout=None): + """Run a query and return a value in the first row. + + :param str query: Query text. + :param args: Query arguments. + :param int column: Numeric index within the record of the value to + return (defaults to 0). + :param float timeout: Optional timeout value in seconds. + If not specified, defaults to the value of + ``command_timeout`` argument to the ``Connection`` + instance constructor. + + :return: The value of the specified column of the first record, or + None if no records were returned by the query. + """ + self._check_open() + data = await self._execute(query, args, 1, timeout) + if not data: + return None + return data[0][column] + + async def fetchrow( + self, + query, + *args, + timeout=None, + record_class=None + ): + """Run a query and return the first row. + + :param str query: + Query text + :param args: + Query arguments + :param float timeout: + Optional timeout value in seconds. + :param type record_class: + If specified, the class to use for the value returned by this + method. Must be a subclass of :class:`~asyncpg.Record`. + If not specified, a per-connection *record_class* is used. + + :return: + The first row as a :class:`~asyncpg.Record` instance, or None if + no records were returned by the query. If specified, + *record_class* is used as the type for the result value. + + .. versionchanged:: 0.22.0 + Added the *record_class* parameter. + """ + self._check_open() + data = await self._execute( + query, + args, + 1, + timeout, + record_class=record_class, + ) + if not data: + return None + return data[0] + + async def fetchmany( + self, + query, + args, + *, + timeout: typing.Optional[float]=None, + record_class=None, + ): + """Run a query for each sequence of arguments in *args* + and return the results as a list of :class:`Record`. + + :param query: + Query to execute. + :param args: + An iterable containing sequences of arguments for the query. + :param float timeout: + Optional timeout value in seconds. + :param type record_class: + If specified, the class to use for records returned by this method. + Must be a subclass of :class:`~asyncpg.Record`. If not specified, + a per-connection *record_class* is used. + + :return list: + A list of :class:`~asyncpg.Record` instances. If specified, the + actual type of list elements would be *record_class*. + + Example: + + .. code-block:: pycon + + >>> rows = await con.fetchmany(''' + ... INSERT INTO mytab (a, b) VALUES ($1, $2) RETURNING a; + ... ''', [('x', 1), ('y', 2), ('z', 3)]) + >>> rows + [, , ] + + .. versionadded:: 0.30.0 + """ + self._check_open() + return await self._executemany( + query, args, timeout, return_rows=True, record_class=record_class + ) + + async def copy_from_table(self, table_name, *, output, + columns=None, schema_name=None, timeout=None, + format=None, oids=None, delimiter=None, + null=None, header=None, quote=None, + escape=None, force_quote=None, encoding=None): + """Copy table contents to a file or file-like object. + + :param str table_name: + The name of the table to copy data from. + + :param output: + A :term:`path-like object `, + or a :term:`file-like object `, or + a :term:`coroutine function ` + that takes a ``bytes`` instance as a sole argument. + + :param list columns: + An optional list of column names to copy. + + :param str schema_name: + An optional schema name to qualify the table. + + :param float timeout: + Optional timeout value in seconds. + + The remaining keyword arguments are ``COPY`` statement options, + see `COPY statement documentation`_ for details. + + :return: The status string of the COPY command. + + Example: + + .. code-block:: pycon + + >>> import asyncpg + >>> import asyncio + >>> async def run(): + ... con = await asyncpg.connect(user='postgres') + ... result = await con.copy_from_table( + ... 'mytable', columns=('foo', 'bar'), + ... output='file.csv', format='csv') + ... print(result) + ... + >>> asyncio.run(run()) + 'COPY 100' + + .. _`COPY statement documentation`: + https://www.postgresql.org/docs/current/static/sql-copy.html + + .. versionadded:: 0.11.0 + """ + tabname = utils._quote_ident(table_name) + if schema_name: + tabname = utils._quote_ident(schema_name) + '.' + tabname + + if columns: + cols = '({})'.format( + ', '.join(utils._quote_ident(c) for c in columns)) + else: + cols = '' + + opts = self._format_copy_opts( + format=format, oids=oids, delimiter=delimiter, + null=null, header=header, quote=quote, escape=escape, + force_quote=force_quote, encoding=encoding + ) + + copy_stmt = 'COPY {tab}{cols} TO STDOUT {opts}'.format( + tab=tabname, cols=cols, opts=opts) + + return await self._copy_out(copy_stmt, output, timeout) + + async def copy_from_query(self, query, *args, output, + timeout=None, format=None, oids=None, + delimiter=None, null=None, header=None, + quote=None, escape=None, force_quote=None, + encoding=None): + """Copy the results of a query to a file or file-like object. + + :param str query: + The query to copy the results of. + + :param args: + Query arguments. + + :param output: + A :term:`path-like object `, + or a :term:`file-like object `, or + a :term:`coroutine function ` + that takes a ``bytes`` instance as a sole argument. + + :param float timeout: + Optional timeout value in seconds. + + The remaining keyword arguments are ``COPY`` statement options, + see `COPY statement documentation`_ for details. + + :return: The status string of the COPY command. + + Example: + + .. code-block:: pycon + + >>> import asyncpg + >>> import asyncio + >>> async def run(): + ... con = await asyncpg.connect(user='postgres') + ... result = await con.copy_from_query( + ... 'SELECT foo, bar FROM mytable WHERE foo > $1', 10, + ... output='file.csv', format='csv') + ... print(result) + ... + >>> asyncio.run(run()) + 'COPY 10' + + .. _`COPY statement documentation`: + https://www.postgresql.org/docs/current/static/sql-copy.html + + .. versionadded:: 0.11.0 + """ + opts = self._format_copy_opts( + format=format, oids=oids, delimiter=delimiter, + null=null, header=header, quote=quote, escape=escape, + force_quote=force_quote, encoding=encoding + ) + + if args: + query = await utils._mogrify(self, query, args) + + copy_stmt = 'COPY ({query}) TO STDOUT {opts}'.format( + query=query, opts=opts) + + return await self._copy_out(copy_stmt, output, timeout) + + async def copy_to_table(self, table_name, *, source, + columns=None, schema_name=None, timeout=None, + format=None, oids=None, freeze=None, + delimiter=None, null=None, header=None, + quote=None, escape=None, force_quote=None, + force_not_null=None, force_null=None, + encoding=None, where=None): + """Copy data to the specified table. + + :param str table_name: + The name of the table to copy data to. + + :param source: + A :term:`path-like object `, + or a :term:`file-like object `, or + an :term:`asynchronous iterable ` + that returns ``bytes``, or an object supporting the + :ref:`buffer protocol `. + + :param list columns: + An optional list of column names to copy. + + :param str schema_name: + An optional schema name to qualify the table. + + :param str where: + An optional SQL expression used to filter rows when copying. + + .. note:: + + Usage of this parameter requires support for the + ``COPY FROM ... WHERE`` syntax, introduced in + PostgreSQL version 12. + + :param float timeout: + Optional timeout value in seconds. + + The remaining keyword arguments are ``COPY`` statement options, + see `COPY statement documentation`_ for details. + + :return: The status string of the COPY command. + + Example: + + .. code-block:: pycon + + >>> import asyncpg + >>> import asyncio + >>> async def run(): + ... con = await asyncpg.connect(user='postgres') + ... result = await con.copy_to_table( + ... 'mytable', source='datafile.tbl') + ... print(result) + ... + >>> asyncio.run(run()) + 'COPY 140000' + + .. _`COPY statement documentation`: + https://www.postgresql.org/docs/current/static/sql-copy.html + + .. versionadded:: 0.11.0 + + .. versionadded:: 0.29.0 + Added the *where* parameter. + """ + tabname = utils._quote_ident(table_name) + if schema_name: + tabname = utils._quote_ident(schema_name) + '.' + tabname + + if columns: + cols = '({})'.format( + ', '.join(utils._quote_ident(c) for c in columns)) + else: + cols = '' + + cond = self._format_copy_where(where) + opts = self._format_copy_opts( + format=format, oids=oids, freeze=freeze, delimiter=delimiter, + null=null, header=header, quote=quote, escape=escape, + force_not_null=force_not_null, force_null=force_null, + encoding=encoding + ) + + copy_stmt = 'COPY {tab}{cols} FROM STDIN {opts} {cond}'.format( + tab=tabname, cols=cols, opts=opts, cond=cond) + + return await self._copy_in(copy_stmt, source, timeout) + + async def copy_records_to_table(self, table_name, *, records, + columns=None, schema_name=None, + timeout=None, where=None): + """Copy a list of records to the specified table using binary COPY. + + :param str table_name: + The name of the table to copy data to. + + :param records: + An iterable returning row tuples to copy into the table. + :term:`Asynchronous iterables ` + are also supported. + + :param list columns: + An optional list of column names to copy. + + :param str schema_name: + An optional schema name to qualify the table. + + :param str where: + An optional SQL expression used to filter rows when copying. + + .. note:: + + Usage of this parameter requires support for the + ``COPY FROM ... WHERE`` syntax, introduced in + PostgreSQL version 12. + + + :param float timeout: + Optional timeout value in seconds. + + :return: The status string of the COPY command. + + Example: + + .. code-block:: pycon + + >>> import asyncpg + >>> import asyncio + >>> async def run(): + ... con = await asyncpg.connect(user='postgres') + ... result = await con.copy_records_to_table( + ... 'mytable', records=[ + ... (1, 'foo', 'bar'), + ... (2, 'ham', 'spam')]) + ... print(result) + ... + >>> asyncio.run(run()) + 'COPY 2' + + Asynchronous record iterables are also supported: + + .. code-block:: pycon + + >>> import asyncpg + >>> import asyncio + >>> async def run(): + ... con = await asyncpg.connect(user='postgres') + ... async def record_gen(size): + ... for i in range(size): + ... yield (i,) + ... result = await con.copy_records_to_table( + ... 'mytable', records=record_gen(100)) + ... print(result) + ... + >>> asyncio.run(run()) + 'COPY 100' + + .. versionadded:: 0.11.0 + + .. versionchanged:: 0.24.0 + The ``records`` argument may be an asynchronous iterable. + + .. versionadded:: 0.29.0 + Added the *where* parameter. + """ + tabname = utils._quote_ident(table_name) + if schema_name: + tabname = utils._quote_ident(schema_name) + '.' + tabname + + if columns: + col_list = ', '.join(utils._quote_ident(c) for c in columns) + cols = '({})'.format(col_list) + else: + col_list = '*' + cols = '' + + intro_query = 'SELECT {cols} FROM {tab} LIMIT 1'.format( + tab=tabname, cols=col_list) + + intro_ps = await self.prepare(intro_query) + + cond = self._format_copy_where(where) + opts = '(FORMAT binary)' + + copy_stmt = 'COPY {tab}{cols} FROM STDIN {opts} {cond}'.format( + tab=tabname, cols=cols, opts=opts, cond=cond) + + return await self._protocol.copy_in( + copy_stmt, None, None, records, intro_ps._state, timeout) + + def _format_copy_where(self, where): + if where and not self._server_caps.sql_copy_from_where: + raise exceptions.UnsupportedServerFeatureError( + 'the `where` parameter requires PostgreSQL 12 or later') + + if where: + where_clause = 'WHERE ' + where + else: + where_clause = '' + + return where_clause + + def _format_copy_opts(self, *, format=None, oids=None, freeze=None, + delimiter=None, null=None, header=None, quote=None, + escape=None, force_quote=None, force_not_null=None, + force_null=None, encoding=None): + kwargs = dict(locals()) + kwargs.pop('self') + opts = [] + + if force_quote is not None and isinstance(force_quote, bool): + kwargs.pop('force_quote') + if force_quote: + opts.append('FORCE_QUOTE *') + + for k, v in kwargs.items(): + if v is not None: + if k in ('force_not_null', 'force_null', 'force_quote'): + v = '(' + ', '.join(utils._quote_ident(c) for c in v) + ')' + elif k in ('oids', 'freeze', 'header'): + v = str(v) + else: + v = utils._quote_literal(v) + + opts.append('{} {}'.format(k.upper(), v)) + + if opts: + return '(' + ', '.join(opts) + ')' + else: + return '' + + async def _copy_out(self, copy_stmt, output, timeout): + try: + path = os.fspath(output) + except TypeError: + # output is not a path-like object + path = None + + writer = None + opened_by_us = False + run_in_executor = self._loop.run_in_executor + + if path is not None: + # a path + f = await run_in_executor(None, open, path, 'wb') + opened_by_us = True + elif hasattr(output, 'write'): + # file-like + f = output + elif callable(output): + # assuming calling output returns an awaitable. + writer = output + else: + raise TypeError( + 'output is expected to be a file-like object, ' + 'a path-like object or a coroutine function, ' + 'not {}'.format(type(output).__name__) + ) + + if writer is None: + async def _writer(data): + await run_in_executor(None, f.write, data) + writer = _writer + + try: + return await self._protocol.copy_out(copy_stmt, writer, timeout) + finally: + if opened_by_us: + f.close() + + async def _copy_in(self, copy_stmt, source, timeout): + try: + path = os.fspath(source) + except TypeError: + # source is not a path-like object + path = None + + f = None + reader = None + data = None + opened_by_us = False + run_in_executor = self._loop.run_in_executor + + if path is not None: + # a path + f = await run_in_executor(None, open, path, 'rb') + opened_by_us = True + elif hasattr(source, 'read'): + # file-like + f = source + elif isinstance(source, collections.abc.AsyncIterable): + # assuming calling output returns an awaitable. + # copy_in() is designed to handle very large amounts of data, and + # the source async iterable is allowed to return an arbitrary + # amount of data on every iteration. + reader = source + else: + # assuming source is an instance supporting the buffer protocol. + data = source + + if f is not None: + # Copying from a file-like object. + class _Reader: + def __aiter__(self): + return self + + async def __anext__(self): + data = await run_in_executor(None, f.read, 524288) + if len(data) == 0: + raise StopAsyncIteration + else: + return data + + reader = _Reader() + + try: + return await self._protocol.copy_in( + copy_stmt, reader, data, None, None, timeout) + finally: + if opened_by_us: + await run_in_executor(None, f.close) + + async def set_type_codec(self, typename, *, + schema='public', encoder, decoder, + format='text'): + """Set an encoder/decoder pair for the specified data type. + + :param typename: + Name of the data type the codec is for. + + :param schema: + Schema name of the data type the codec is for + (defaults to ``'public'``) + + :param format: + The type of the argument received by the *decoder* callback, + and the type of the *encoder* callback return value. + + If *format* is ``'text'`` (the default), the exchange datum is a + ``str`` instance containing valid text representation of the + data type. + + If *format* is ``'binary'``, the exchange datum is a ``bytes`` + instance containing valid _binary_ representation of the + data type. + + If *format* is ``'tuple'``, the exchange datum is a type-specific + ``tuple`` of values. The table below lists supported data + types and their format for this mode. + + +-----------------+---------------------------------------------+ + | Type | Tuple layout | + +=================+=============================================+ + | ``interval`` | (``months``, ``days``, ``microseconds``) | + +-----------------+---------------------------------------------+ + | ``date`` | (``date ordinal relative to Jan 1 2000``,) | + | | ``-2^31`` for negative infinity timestamp | + | | ``2^31-1`` for positive infinity timestamp. | + +-----------------+---------------------------------------------+ + | ``timestamp`` | (``microseconds relative to Jan 1 2000``,) | + | | ``-2^63`` for negative infinity timestamp | + | | ``2^63-1`` for positive infinity timestamp. | + +-----------------+---------------------------------------------+ + | ``timestamp | (``microseconds relative to Jan 1 2000 | + | with time zone``| UTC``,) | + | | ``-2^63`` for negative infinity timestamp | + | | ``2^63-1`` for positive infinity timestamp. | + +-----------------+---------------------------------------------+ + | ``time`` | (``microseconds``,) | + +-----------------+---------------------------------------------+ + | ``time with | (``microseconds``, | + | time zone`` | ``time zone offset in seconds``) | + +-----------------+---------------------------------------------+ + | any composite | Composite value elements | + | type | | + +-----------------+---------------------------------------------+ + + :param encoder: + Callable accepting a Python object as a single argument and + returning a value encoded according to *format*. + + :param decoder: + Callable accepting a single argument encoded according to *format* + and returning a decoded Python object. + + Example: + + .. code-block:: pycon + + >>> import asyncpg + >>> import asyncio + >>> import datetime + >>> from dateutil.relativedelta import relativedelta + >>> async def run(): + ... con = await asyncpg.connect(user='postgres') + ... def encoder(delta): + ... ndelta = delta.normalized() + ... return (ndelta.years * 12 + ndelta.months, + ... ndelta.days, + ... ((ndelta.hours * 3600 + + ... ndelta.minutes * 60 + + ... ndelta.seconds) * 1000000 + + ... ndelta.microseconds)) + ... def decoder(tup): + ... return relativedelta(months=tup[0], days=tup[1], + ... microseconds=tup[2]) + ... await con.set_type_codec( + ... 'interval', schema='pg_catalog', encoder=encoder, + ... decoder=decoder, format='tuple') + ... result = await con.fetchval( + ... "SELECT '2 years 3 mons 1 day'::interval") + ... print(result) + ... print(datetime.datetime(2002, 1, 1) + result) + ... + >>> asyncio.run(run()) + relativedelta(years=+2, months=+3, days=+1) + 2004-04-02 00:00:00 + + .. versionadded:: 0.12.0 + Added the ``format`` keyword argument and support for 'tuple' + format. + + .. versionchanged:: 0.12.0 + The ``binary`` keyword argument is deprecated in favor of + ``format``. + + .. versionchanged:: 0.13.0 + The ``binary`` keyword argument was removed in favor of + ``format``. + + .. versionchanged:: 0.29.0 + Custom codecs for composite types are now supported with + ``format='tuple'``. + + .. note:: + + It is recommended to use the ``'binary'`` or ``'tuple'`` *format* + whenever possible and if the underlying type supports it. Asyncpg + currently does not support text I/O for composite and range types, + and some other functionality, such as + :meth:`Connection.copy_to_table`, does not support types with text + codecs. + """ + self._check_open() + settings = self._protocol.get_settings() + typeinfo = await self._introspect_type(typename, schema) + full_typeinfos = [] + if introspection.is_scalar_type(typeinfo): + kind = 'scalar' + elif introspection.is_composite_type(typeinfo): + if format != 'tuple': + raise exceptions.UnsupportedClientFeatureError( + 'only tuple-format codecs can be used on composite types', + hint="Use `set_type_codec(..., format='tuple')` and " + "pass/interpret data as a Python tuple. See an " + "example at https://magicstack.github.io/asyncpg/" + "current/usage.html#example-decoding-complex-types", + ) + kind = 'composite' + full_typeinfos, _ = await self._introspect_types( + (typeinfo['oid'],), 10) + else: + raise exceptions.InterfaceError( + f'cannot use custom codec on type {schema}.{typename}: ' + f'it is neither a scalar type nor a composite type' + ) + if introspection.is_domain_type(typeinfo): + raise exceptions.UnsupportedClientFeatureError( + 'custom codecs on domain types are not supported', + hint='Set the codec on the base type.', + detail=( + 'PostgreSQL does not distinguish domains from ' + 'their base types in query results at the protocol level.' + ) + ) + + oid = typeinfo['oid'] + settings.add_python_codec( + oid, typename, schema, full_typeinfos, kind, + encoder, decoder, format) + + # Statement cache is no longer valid due to codec changes. + self._drop_local_statement_cache() + + async def reset_type_codec(self, typename, *, schema='public'): + """Reset *typename* codec to the default implementation. + + :param typename: + Name of the data type the codec is for. + + :param schema: + Schema name of the data type the codec is for + (defaults to ``'public'``) + + .. versionadded:: 0.12.0 + """ + + typeinfo = await self._introspect_type(typename, schema) + self._protocol.get_settings().remove_python_codec( + typeinfo['oid'], typename, schema) + + # Statement cache is no longer valid due to codec changes. + self._drop_local_statement_cache() + + async def set_builtin_type_codec(self, typename, *, + schema='public', codec_name, + format=None): + """Set a builtin codec for the specified scalar data type. + + This method has two uses. The first is to register a builtin + codec for an extension type without a stable OID, such as 'hstore'. + The second use is to declare that an extension type or a + user-defined type is wire-compatible with a certain builtin + data type and should be exchanged as such. + + :param typename: + Name of the data type the codec is for. + + :param schema: + Schema name of the data type the codec is for + (defaults to ``'public'``). + + :param codec_name: + The name of the builtin codec to use for the type. + This should be either the name of a known core type + (such as ``"int"``), or the name of a supported extension + type. Currently, the only supported extension type is + ``"pg_contrib.hstore"``. + + :param format: + If *format* is ``None`` (the default), all formats supported + by the target codec are declared to be supported for *typename*. + If *format* is ``'text'`` or ``'binary'``, then only the + specified format is declared to be supported for *typename*. + + .. versionchanged:: 0.18.0 + The *codec_name* argument can be the name of any known + core data type. Added the *format* keyword argument. + """ + self._check_open() + typeinfo = await self._introspect_type(typename, schema) + if not introspection.is_scalar_type(typeinfo): + raise exceptions.InterfaceError( + 'cannot alias non-scalar type {}.{}'.format( + schema, typename)) + + oid = typeinfo['oid'] + + self._protocol.get_settings().set_builtin_type_codec( + oid, typename, schema, 'scalar', codec_name, format) + + # Statement cache is no longer valid due to codec changes. + self._drop_local_statement_cache() + + def is_closed(self): + """Return ``True`` if the connection is closed, ``False`` otherwise. + + :return bool: ``True`` if the connection is closed, ``False`` + otherwise. + """ + return self._aborted or not self._protocol.is_connected() + + async def close(self, *, timeout=None): + """Close the connection gracefully. + + :param float timeout: + Optional timeout value in seconds. + + .. versionchanged:: 0.14.0 + Added the *timeout* parameter. + """ + try: + if not self.is_closed(): + await self._protocol.close(timeout) + except (Exception, asyncio.CancelledError): + # If we fail to close gracefully, abort the connection. + self._abort() + raise + finally: + self._cleanup() + + def terminate(self): + """Terminate the connection without waiting for pending data.""" + if not self.is_closed(): + self._abort() + self._cleanup() + + async def _reset(self): + self._check_open() + self._listeners.clear() + self._log_listeners.clear() + + if self._protocol.is_in_transaction() or self._top_xact is not None: + if self._top_xact is None or not self._top_xact._managed: + # Managed transactions are guaranteed to __aexit__ + # correctly. + self._loop.call_exception_handler({ + 'message': 'Resetting connection with an ' + 'active transaction {!r}'.format(self) + }) + + self._top_xact = None + await self.execute("ROLLBACK") + + async def reset(self, *, timeout=None): + """Reset the connection state. + + Calling this will reset the connection session state to a state + resembling that of a newly obtained connection. Namely, an open + transaction (if any) is rolled back, open cursors are closed, + all `LISTEN `_ + registrations are removed, all session configuration + variables are reset to their default values, and all advisory locks + are released. + + Note that the above describes the default query returned by + :meth:`Connection.get_reset_query`. If one overloads the method + by subclassing ``Connection``, then this method will do whatever + the overloaded method returns, except open transactions are always + terminated and any callbacks registered by + :meth:`Connection.add_listener` or :meth:`Connection.add_log_listener` + are removed. + + :param float timeout: + A timeout for resetting the connection. If not specified, defaults + to no timeout. + """ + async with compat.timeout(timeout): + await self._reset() + reset_query = self.get_reset_query() + if reset_query: + await self.execute(reset_query) + + def _abort(self): + # Put the connection into the aborted state. + self._aborted = True + self._protocol.abort() + self._protocol = None + + def _cleanup(self): + self._call_termination_listeners() + # Free the resources associated with this connection. + # This must be called when a connection is terminated. + + if self._proxy is not None: + # Connection is a member of a pool, so let the pool + # know that this connection is dead. + self._proxy._holder._release_on_close() + + self._mark_stmts_as_closed() + self._listeners.clear() + self._log_listeners.clear() + self._query_loggers.clear() + self._clean_tasks() + + def _clean_tasks(self): + # Wrap-up any remaining tasks associated with this connection. + if self._cancellations: + for fut in self._cancellations: + if not fut.done(): + fut.cancel() + self._cancellations.clear() + + def _check_open(self): + if self.is_closed(): + raise exceptions.InterfaceError('connection is closed') + + def _get_unique_id(self, prefix): + global _uid + _uid += 1 + return '__asyncpg_{}_{:x}__'.format(prefix, _uid) + + def _mark_stmts_as_closed(self): + for stmt in self._stmt_cache.iter_statements(): + stmt.mark_closed() + + for stmt in self._stmts_to_close: + stmt.mark_closed() + + self._stmt_cache.clear() + self._stmts_to_close.clear() + + def _maybe_gc_stmt(self, stmt): + if ( + stmt.refs == 0 + and stmt.name + and not self._stmt_cache.has( + (stmt.query, stmt.record_class, stmt.ignore_custom_codec) + ) + ): + # If low-level `stmt` isn't referenced from any high-level + # `PreparedStatement` object and is not in the `_stmt_cache`: + # + # * mark it as closed, which will make it non-usable + # for any `PreparedStatement` or for methods like + # `Connection.fetch()`. + # + # * schedule it to be formally closed on the server. + stmt.mark_closed() + self._stmts_to_close.add(stmt) + + async def _cleanup_stmts(self): + # Called whenever we create a new prepared statement in + # `Connection._get_statement()` and `_stmts_to_close` is + # not empty. + to_close = self._stmts_to_close + self._stmts_to_close = set() + for stmt in to_close: + # It is imperative that statements are cleaned properly, + # so we ignore the timeout. + await self._protocol.close_statement(stmt, protocol.NO_TIMEOUT) + + async def _cancel(self, waiter): + try: + # Open new connection to the server + await connect_utils._cancel( + loop=self._loop, addr=self._addr, params=self._params, + backend_pid=self._protocol.backend_pid, + backend_secret=self._protocol.backend_secret) + except ConnectionResetError as ex: + # On some systems Postgres will reset the connection + # after processing the cancellation command. + if not waiter.done(): + waiter.set_exception(ex) + except asyncio.CancelledError: + # There are two scenarios in which the cancellation + # itself will be cancelled: 1) the connection is being closed, + # 2) the event loop is being shut down. + # In either case we do not care about the propagation of + # the CancelledError, and don't want the loop to warn about + # an unretrieved exception. + pass + except (Exception, asyncio.CancelledError) as ex: + if not waiter.done(): + waiter.set_exception(ex) + finally: + self._cancellations.discard( + asyncio.current_task(self._loop)) + if not waiter.done(): + waiter.set_result(None) + + def _cancel_current_command(self, waiter): + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + + def _process_log_message(self, fields, last_query): + if not self._log_listeners: + return + + message = exceptions.PostgresLogMessage.new(fields, query=last_query) + + con_ref = self._unwrap() + for cb in self._log_listeners: + if cb.is_async: + self._loop.create_task(cb.cb(con_ref, message)) + else: + self._loop.call_soon(cb.cb, con_ref, message) + + def _call_termination_listeners(self): + if not self._termination_listeners: + return + + con_ref = self._unwrap() + for cb in self._termination_listeners: + if cb.is_async: + self._loop.create_task(cb.cb(con_ref)) + else: + self._loop.call_soon(cb.cb, con_ref) + + self._termination_listeners.clear() + + def _process_notification(self, pid, channel, payload): + if channel not in self._listeners: + return + + con_ref = self._unwrap() + for cb in self._listeners[channel]: + if cb.is_async: + self._loop.create_task(cb.cb(con_ref, pid, channel, payload)) + else: + self._loop.call_soon(cb.cb, con_ref, pid, channel, payload) + + def _unwrap(self): + if self._proxy is None: + con_ref = self + else: + # `_proxy` is not None when the connection is a member + # of a connection pool. Which means that the user is working + # with a `PoolConnectionProxy` instance, and expects to see it + # (and not the actual Connection) in their event callbacks. + con_ref = self._proxy + return con_ref + + def get_reset_query(self): + """Return the query sent to server on connection release. + + The query returned by this method is used by :meth:`Connection.reset`, + which is, in turn, used by :class:`~asyncpg.pool.Pool` before making + the connection available to another acquirer. + + .. versionadded:: 0.30.0 + """ + if self._reset_query is not None: + return self._reset_query + + caps = self._server_caps + + _reset_query = [] + if caps.advisory_locks: + _reset_query.append('SELECT pg_advisory_unlock_all();') + if caps.sql_close_all: + _reset_query.append('CLOSE ALL;') + if caps.notifications and caps.plpgsql: + _reset_query.append('UNLISTEN *;') + if caps.sql_reset: + _reset_query.append('RESET ALL;') + + _reset_query = '\n'.join(_reset_query) + self._reset_query = _reset_query + + return _reset_query + + def _set_proxy(self, proxy): + if self._proxy is not None and proxy is not None: + # Should not happen unless there is a bug in `Pool`. + raise exceptions.InterfaceError( + 'internal asyncpg error: connection is already proxied') + + self._proxy = proxy + + def _check_listeners(self, listeners, listener_type): + if listeners: + count = len(listeners) + + w = exceptions.InterfaceWarning( + '{conn!r} is being released to the pool but has {c} active ' + '{type} listener{s}'.format( + conn=self, c=count, type=listener_type, + s='s' if count > 1 else '')) + + warnings.warn(w) + + def _on_release(self, stacklevel=1): + # Invalidate external references to the connection. + self._pool_release_ctr += 1 + # Called when the connection is about to be released to the pool. + # Let's check that the user has not left any listeners on it. + self._check_listeners( + list(itertools.chain.from_iterable(self._listeners.values())), + 'notification') + self._check_listeners( + self._log_listeners, 'log') + + def _drop_local_statement_cache(self): + self._stmt_cache.clear() + + def _drop_global_statement_cache(self): + if self._proxy is not None: + # This connection is a member of a pool, so we delegate + # the cache drop to the pool. + pool = self._proxy._holder._pool + pool._drop_statement_cache() + else: + self._drop_local_statement_cache() + + def _drop_local_type_cache(self): + self._protocol.get_settings().clear_type_cache() + + def _drop_global_type_cache(self): + if self._proxy is not None: + # This connection is a member of a pool, so we delegate + # the cache drop to the pool. + pool = self._proxy._holder._pool + pool._drop_type_cache() + else: + self._drop_local_type_cache() + + async def reload_schema_state(self): + """Indicate that the database schema information must be reloaded. + + For performance reasons, asyncpg caches certain aspects of the + database schema, such as the layout of composite types. Consequently, + when the database schema changes, and asyncpg is not able to + gracefully recover from an error caused by outdated schema + assumptions, an :exc:`~asyncpg.exceptions.OutdatedSchemaCacheError` + is raised. To prevent the exception, this method may be used to inform + asyncpg that the database schema has changed. + + Example: + + .. code-block:: pycon + + >>> import asyncpg + >>> import asyncio + >>> async def change_type(con): + ... result = await con.fetch('SELECT id, info FROM tbl') + ... # Change composite's attribute type "int"=>"text" + ... await con.execute('ALTER TYPE custom DROP ATTRIBUTE y') + ... await con.execute('ALTER TYPE custom ADD ATTRIBUTE y text') + ... await con.reload_schema_state() + ... for id_, info in result: + ... new = (info['x'], str(info['y'])) + ... await con.execute( + ... 'UPDATE tbl SET info=$2 WHERE id=$1', id_, new) + ... + >>> async def run(): + ... # Initial schema: + ... # CREATE TYPE custom AS (x int, y int); + ... # CREATE TABLE tbl(id int, info custom); + ... con = await asyncpg.connect(user='postgres') + ... async with con.transaction(): + ... # Prevent concurrent changes in the table + ... await con.execute('LOCK TABLE tbl') + ... await change_type(con) + ... + >>> asyncio.run(run()) + + .. versionadded:: 0.14.0 + """ + self._drop_global_type_cache() + self._drop_global_statement_cache() + + async def _execute( + self, + query, + args, + limit, + timeout, + *, + return_status=False, + ignore_custom_codec=False, + record_class=None + ): + with self._stmt_exclusive_section: + result, _ = await self.__execute( + query, + args, + limit, + timeout, + return_status=return_status, + record_class=record_class, + ignore_custom_codec=ignore_custom_codec, + ) + return result + + @contextlib.contextmanager + def query_logger(self, callback): + """Context manager that adds `callback` to the list of query loggers, + and removes it upon exit. + + :param callable callback: + A callable or a coroutine function receiving one argument: + **record**, a LoggedQuery containing `query`, `args`, `timeout`, + `elapsed`, `exception`, `conn_addr`, and `conn_params`. + + Example: + + .. code-block:: pycon + + >>> class QuerySaver: + def __init__(self): + self.queries = [] + def __call__(self, record): + self.queries.append(record.query) + >>> with con.query_logger(QuerySaver()): + >>> await con.execute("SELECT 1") + >>> print(log.queries) + ['SELECT 1'] + + .. versionadded:: 0.29.0 + """ + self.add_query_logger(callback) + yield + self.remove_query_logger(callback) + + @contextlib.contextmanager + def _time_and_log(self, query, args, timeout): + start = time.monotonic() + exception = None + try: + yield + except BaseException as ex: + exception = ex + raise + finally: + elapsed = time.monotonic() - start + record = LoggedQuery( + query=query, + args=args, + timeout=timeout, + elapsed=elapsed, + exception=exception, + conn_addr=self._addr, + conn_params=self._params, + ) + for cb in self._query_loggers: + if cb.is_async: + self._loop.create_task(cb.cb(record)) + else: + self._loop.call_soon(cb.cb, record) + + async def __execute( + self, + query, + args, + limit, + timeout, + *, + return_status=False, + ignore_custom_codec=False, + record_class=None + ): + executor = lambda stmt, timeout: self._protocol.bind_execute( + state=stmt, + args=args, + portal_name='', + limit=limit, + return_extra=return_status, + timeout=timeout, + ) + timeout = self._protocol._get_timeout(timeout) + if self._query_loggers: + with self._time_and_log(query, args, timeout): + result, stmt = await self._do_execute( + query, + executor, + timeout, + record_class=record_class, + ignore_custom_codec=ignore_custom_codec, + ) + else: + result, stmt = await self._do_execute( + query, + executor, + timeout, + record_class=record_class, + ignore_custom_codec=ignore_custom_codec, + ) + return result, stmt + + async def _executemany( + self, + query, + args, + timeout, + return_rows=False, + record_class=None, + ): + executor = lambda stmt, timeout: self._protocol.bind_execute_many( + state=stmt, + args=args, + portal_name='', + timeout=timeout, + return_rows=return_rows, + ) + timeout = self._protocol._get_timeout(timeout) + with self._stmt_exclusive_section: + with self._time_and_log(query, args, timeout): + result, _ = await self._do_execute( + query, executor, timeout, record_class=record_class + ) + return result + + async def _do_execute( + self, + query, + executor, + timeout, + retry=True, + *, + ignore_custom_codec=False, + record_class=None + ): + if timeout is None: + stmt = await self._get_statement( + query, + None, + record_class=record_class, + ignore_custom_codec=ignore_custom_codec, + ) + else: + before = time.monotonic() + stmt = await self._get_statement( + query, + timeout, + record_class=record_class, + ignore_custom_codec=ignore_custom_codec, + ) + after = time.monotonic() + timeout -= after - before + before = after + + try: + if timeout is None: + result = await executor(stmt, None) + else: + try: + result = await executor(stmt, timeout) + finally: + after = time.monotonic() + timeout -= after - before + + except exceptions.OutdatedSchemaCacheError: + # This exception is raised when we detect a difference between + # cached type's info and incoming tuple from the DB (when a type is + # changed by the ALTER TYPE). + # It is not possible to recover (the statement is already done at + # the server's side), the only way is to drop our caches and + # reraise the exception to the caller. + await self.reload_schema_state() + raise + except exceptions.InvalidCachedStatementError: + # PostgreSQL will raise an exception when it detects + # that the result type of the query has changed from + # when the statement was prepared. This may happen, + # for example, after an ALTER TABLE or SET search_path. + # + # When this happens, and there is no transaction running, + # we can simply re-prepare the statement and try once + # again. We deliberately retry only once as this is + # supposed to be a rare occurrence. + # + # If the transaction _is_ running, this error will put it + # into an error state, and we have no choice but to + # re-raise the exception. + # + # In either case we clear the statement cache for this + # connection and all other connections of the pool this + # connection belongs to (if any). + # + # See https://github.com/MagicStack/asyncpg/issues/72 + # and https://github.com/MagicStack/asyncpg/issues/76 + # for discussion. + # + self._drop_global_statement_cache() + if self._protocol.is_in_transaction() or not retry: + raise + else: + return await self._do_execute( + query, executor, timeout, retry=False) + + return result, stmt + + +async def connect(dsn=None, *, + host=None, port=None, + user=None, password=None, passfile=None, + service=None, + servicefile=None, + database=None, + loop=None, + timeout=60, + statement_cache_size=100, + max_cached_statement_lifetime=300, + max_cacheable_statement_size=1024 * 15, + command_timeout=None, + ssl=None, + direct_tls=None, + connection_class=Connection, + record_class=protocol.Record, + server_settings=None, + target_session_attrs=None, + krbsrvname=None, + gsslib=None): + r"""A coroutine to establish a connection to a PostgreSQL server. + + The connection parameters may be specified either as a connection + URI in *dsn*, or as specific keyword arguments, or both. + If both *dsn* and keyword arguments are specified, the latter + override the corresponding values parsed from the connection URI. + The default values for the majority of arguments can be specified + using `environment variables `_. + + Returns a new :class:`~asyncpg.connection.Connection` object. + + :param dsn: + Connection arguments specified using as a single string in the + `libpq connection URI format`_: + ``postgres://user:password@host:port/database?option=value``. + The following options are recognized by asyncpg: ``host``, + ``port``, ``user``, ``database`` (or ``dbname``), ``password``, + ``passfile``, ``sslmode``, ``sslcert``, ``sslkey``, ``sslrootcert``, + and ``sslcrl``. Unlike libpq, asyncpg will treat unrecognized + options as `server settings`_ to be used for the connection. + + .. note:: + + The URI must be *valid*, which means that all components must + be properly quoted with :py:func:`urllib.parse.quote_plus`, and + any literal IPv6 addresses must be enclosed in square brackets. + For example: + + .. code-block:: text + + postgres://dbuser@[fe80::1ff:fe23:4567:890a%25eth0]/dbname + + :param host: + Database host address as one of the following: + + - an IP address or a domain name; + - an absolute path to the directory containing the database + server Unix-domain socket (not supported on Windows); + - a sequence of any of the above, in which case the addresses + will be tried in order, and the first successful connection + will be returned. + + If not specified, asyncpg will try the following, in order: + + - host address(es) parsed from the *dsn* argument, + - the value of the ``PGHOST`` environment variable, + - on Unix, common directories used for PostgreSQL Unix-domain + sockets: ``"/run/postgresql"``, ``"/var/run/postgresl"``, + ``"/var/pgsql_socket"``, ``"/private/tmp"``, and ``"/tmp"``, + - ``"localhost"``. + + :param port: + Port number to connect to at the server host + (or Unix-domain socket file extension). If multiple host + addresses were specified, this parameter may specify a + sequence of port numbers of the same length as the host sequence, + or it may specify a single port number to be used for all host + addresses. + + If not specified, the value parsed from the *dsn* argument is used, + or the value of the ``PGPORT`` environment variable, or ``5432`` if + neither is specified. + + :param user: + The name of the database role used for authentication. + + If not specified, the value parsed from the *dsn* argument is used, + or the value of the ``PGUSER`` environment variable, or the + operating system name of the user running the application. + + :param database: + The name of the database to connect to. + + If not specified, the value parsed from the *dsn* argument is used, + or the value of the ``PGDATABASE`` environment variable, or the + computed value of the *user* argument. + + :param password: + Password to be used for authentication, if the server requires + one. If not specified, the value parsed from the *dsn* argument + is used, or the value of the ``PGPASSWORD`` environment variable. + Note that the use of the environment variable is discouraged as + other users and applications may be able to read it without needing + specific privileges. It is recommended to use *passfile* instead. + + Password may be either a string, or a callable that returns a string. + If a callable is provided, it will be called each time a new connection + is established. + + :param passfile: + The name of the file used to store passwords + (defaults to ``~/.pgpass``, or ``%APPDATA%\postgresql\pgpass.conf`` + on Windows). + + :param service: + The name of the postgres connection service stored in the postgres + connection service file. + + :param servicefile: + The location of the connnection service file used to store + connection parameters. + + :param loop: + An asyncio event loop instance. If ``None``, the default + event loop will be used. + + :param float timeout: + Connection timeout in seconds. + + :param int statement_cache_size: + The size of prepared statement LRU cache. Pass ``0`` to + disable the cache. + + :param int max_cached_statement_lifetime: + The maximum time in seconds a prepared statement will stay + in the cache. Pass ``0`` to allow statements be cached + indefinitely. + + :param int max_cacheable_statement_size: + The maximum size of a statement that can be cached (15KiB by + default). Pass ``0`` to allow all statements to be cached + regardless of their size. + + :param float command_timeout: + The default timeout for operations on this connection + (the default is ``None``: no timeout). + + :param ssl: + Pass ``True`` or an `ssl.SSLContext `_ instance to + require an SSL connection. If ``True``, a default SSL context + returned by `ssl.create_default_context() `_ + will be used. The value can also be one of the following strings: + + - ``'disable'`` - SSL is disabled (equivalent to ``False``) + - ``'prefer'`` - try SSL first, fallback to non-SSL connection + if SSL connection fails + - ``'allow'`` - try without SSL first, then retry with SSL if the first + attempt fails. + - ``'require'`` - only try an SSL connection. Certificate + verification errors are ignored + - ``'verify-ca'`` - only try an SSL connection, and verify + that the server certificate is issued by a trusted certificate + authority (CA) + - ``'verify-full'`` - only try an SSL connection, verify + that the server certificate is issued by a trusted CA and + that the requested server host name matches that in the + certificate. + + The default is ``'prefer'``: try an SSL connection and fallback to + non-SSL connection if that fails. + + .. note:: + + *ssl* is ignored for Unix domain socket communication. + + Example of programmatic SSL context configuration that is equivalent + to ``sslmode=verify-full&sslcert=..&sslkey=..&sslrootcert=..``: + + .. code-block:: pycon + + >>> import asyncpg + >>> import asyncio + >>> import ssl + >>> async def main(): + ... # Load CA bundle for server certificate verification, + ... # equivalent to sslrootcert= in DSN. + ... sslctx = ssl.create_default_context( + ... ssl.Purpose.SERVER_AUTH, + ... cafile="path/to/ca_bundle.pem") + ... # If True, equivalent to sslmode=verify-full, if False: + ... # sslmode=verify-ca. + ... sslctx.check_hostname = True + ... # Load client certificate and private key for client + ... # authentication, equivalent to sslcert= and sslkey= in + ... # DSN. + ... sslctx.load_cert_chain( + ... "path/to/client.cert", + ... keyfile="path/to/client.key", + ... ) + ... con = await asyncpg.connect(user='postgres', ssl=sslctx) + ... await con.close() + >>> asyncio.run(main()) + + Example of programmatic SSL context configuration that is equivalent + to ``sslmode=require`` (no server certificate or host verification): + + .. code-block:: pycon + + >>> import asyncpg + >>> import asyncio + >>> import ssl + >>> async def main(): + ... sslctx = ssl.create_default_context( + ... ssl.Purpose.SERVER_AUTH) + ... sslctx.check_hostname = False + ... sslctx.verify_mode = ssl.CERT_NONE + ... con = await asyncpg.connect(user='postgres', ssl=sslctx) + ... await con.close() + >>> asyncio.run(main()) + + :param bool direct_tls: + Pass ``True`` to skip PostgreSQL STARTTLS mode and perform a direct + SSL connection. Must be used alongside ``ssl`` param. + + :param dict server_settings: + An optional dict of server runtime parameters. Refer to + PostgreSQL documentation for + a `list of supported options `_. + + :param type connection_class: + Class of the returned connection object. Must be a subclass of + :class:`~asyncpg.connection.Connection`. + + :param type record_class: + If specified, the class to use for records returned by queries on + this connection object. Must be a subclass of + :class:`~asyncpg.Record`. + + :param SessionAttribute target_session_attrs: + If specified, check that the host has the correct attribute. + Can be one of: + + - ``"any"`` - the first successfully connected host + - ``"primary"`` - the host must NOT be in hot standby mode + - ``"standby"`` - the host must be in hot standby mode + - ``"read-write"`` - the host must allow writes + - ``"read-only"`` - the host most NOT allow writes + - ``"prefer-standby"`` - first try to find a standby host, but if + none of the listed hosts is a standby server, + return any of them. + + If not specified, the value parsed from the *dsn* argument is used, + or the value of the ``PGTARGETSESSIONATTRS`` environment variable, + or ``"any"`` if neither is specified. + + :param str krbsrvname: + Kerberos service name to use when authenticating with GSSAPI. This + must match the server configuration. Defaults to 'postgres'. + + :param str gsslib: + GSS library to use for GSSAPI/SSPI authentication. Can be 'gssapi' + or 'sspi'. Defaults to 'sspi' on Windows and 'gssapi' otherwise. + + :return: A :class:`~asyncpg.connection.Connection` instance. + + Example: + + .. code-block:: pycon + + >>> import asyncpg + >>> import asyncio + >>> async def run(): + ... con = await asyncpg.connect(user='postgres') + ... types = await con.fetch('SELECT * FROM pg_type') + ... print(types) + ... + >>> asyncio.run(run()) + [= 0 + self._max_size = new_size + self._maybe_cleanup() + + def get_max_lifetime(self): + return self._max_lifetime + + def set_max_lifetime(self, new_lifetime): + assert new_lifetime >= 0 + self._max_lifetime = new_lifetime + for entry in self._entries.values(): + # For every entry cancel the existing callback + # and setup a new one if necessary. + self._set_entry_timeout(entry) + + def get(self, query, *, promote=True): + if not self._max_size: + # The cache is disabled. + return + + entry = self._entries.get(query) # type: _StatementCacheEntry + if entry is None: + return + + if entry._statement.closed: + # Happens in unittests when we call `stmt._state.mark_closed()` + # manually or when a prepared statement closes itself on type + # cache error. + self._entries.pop(query) + self._clear_entry_callback(entry) + return + + if promote: + # `promote` is `False` when `get()` is called by `has()`. + self._entries.move_to_end(query, last=True) + + return entry._statement + + def has(self, query): + return self.get(query, promote=False) is not None + + def put(self, query, statement): + if not self._max_size: + # The cache is disabled. + return + + self._entries[query] = self._new_entry(query, statement) + + # Check if the cache is bigger than max_size and trim it + # if necessary. + self._maybe_cleanup() + + def iter_statements(self): + return (e._statement for e in self._entries.values()) + + def clear(self): + # Store entries for later. + entries = tuple(self._entries.values()) + + # Clear the entries dict. + self._entries.clear() + + # Make sure that we cancel all scheduled callbacks + # and call on_remove callback for each entry. + for entry in entries: + self._clear_entry_callback(entry) + self._on_remove(entry._statement) + + def _set_entry_timeout(self, entry): + # Clear the existing timeout. + self._clear_entry_callback(entry) + + # Set the new timeout if it's not 0. + if self._max_lifetime: + entry._cleanup_cb = self._loop.call_later( + self._max_lifetime, self._on_entry_expired, entry) + + def _new_entry(self, query, statement): + entry = _StatementCacheEntry(self, query, statement) + self._set_entry_timeout(entry) + return entry + + def _on_entry_expired(self, entry): + # `call_later` callback, called when an entry stayed longer + # than `self._max_lifetime`. + if self._entries.get(entry._query) is entry: + self._entries.pop(entry._query) + self._on_remove(entry._statement) + + def _clear_entry_callback(self, entry): + if entry._cleanup_cb is not None: + entry._cleanup_cb.cancel() + + def _maybe_cleanup(self): + # Delete cache entries until the size of the cache is `max_size`. + while len(self._entries) > self._max_size: + old_query, old_entry = self._entries.popitem(last=False) + self._clear_entry_callback(old_entry) + + # Let the connection know that the statement was removed + # from the cache. + self._on_remove(old_entry._statement) + + +class _Callback(typing.NamedTuple): + + cb: typing.Callable[..., None] + is_async: bool + + @classmethod + def from_callable(cls, cb: typing.Callable[..., None]) -> '_Callback': + if inspect.iscoroutinefunction(cb): + is_async = True + elif callable(cb): + is_async = False + else: + raise exceptions.InterfaceError( + 'expected a callable or an `async def` function,' + 'got {!r}'.format(cb) + ) + + return cls(cb, is_async) + + +class _Atomic: + __slots__ = ('_acquired',) + + def __init__(self): + self._acquired = 0 + + def __enter__(self): + if self._acquired: + raise exceptions.InterfaceError( + 'cannot perform operation: another operation is in progress') + self._acquired = 1 + + def __exit__(self, t, e, tb): + self._acquired = 0 + + +class _ConnectionProxy: + # Base class to enable `isinstance(Connection)` check. + __slots__ = () + + +LoggedQuery = collections.namedtuple( + 'LoggedQuery', + ['query', 'args', 'timeout', 'elapsed', 'exception', 'conn_addr', + 'conn_params']) +LoggedQuery.__doc__ = 'Log record of an executed query.' + + +ServerCapabilities = collections.namedtuple( + 'ServerCapabilities', + ['advisory_locks', 'notifications', 'plpgsql', 'sql_reset', + 'sql_close_all', 'sql_copy_from_where', 'jit']) +ServerCapabilities.__doc__ = 'PostgreSQL server capabilities.' + + +def _detect_server_capabilities(server_version, connection_settings): + if hasattr(connection_settings, 'padb_revision'): + # Amazon Redshift detected. + advisory_locks = False + notifications = False + plpgsql = False + sql_reset = True + sql_close_all = False + jit = False + sql_copy_from_where = False + elif hasattr(connection_settings, 'crdb_version'): + # CockroachDB detected. + advisory_locks = False + notifications = False + plpgsql = False + sql_reset = False + sql_close_all = False + jit = False + sql_copy_from_where = False + elif hasattr(connection_settings, 'crate_version'): + # CrateDB detected. + advisory_locks = False + notifications = False + plpgsql = False + sql_reset = False + sql_close_all = False + jit = False + sql_copy_from_where = False + else: + # Standard PostgreSQL server assumed. + advisory_locks = True + notifications = True + plpgsql = True + sql_reset = True + sql_close_all = True + jit = server_version >= (11, 0) + sql_copy_from_where = server_version.major >= 12 + + return ServerCapabilities( + advisory_locks=advisory_locks, + notifications=notifications, + plpgsql=plpgsql, + sql_reset=sql_reset, + sql_close_all=sql_close_all, + sql_copy_from_where=sql_copy_from_where, + jit=jit, + ) + + +def _extract_stack(limit=10): + """Replacement for traceback.extract_stack() that only does the + necessary work for asyncio debug mode. + """ + frame = sys._getframe().f_back + try: + stack = traceback.StackSummary.extract( + traceback.walk_stack(frame), lookup_lines=False) + finally: + del frame + + apg_path = asyncpg.__path__[0] + i = 0 + while i < len(stack) and stack[i][0].startswith(apg_path): + i += 1 + stack = stack[i:i + limit] + + stack.reverse() + return ''.join(traceback.format_list(stack)) + + +def _check_record_class(record_class): + if record_class is protocol.Record: + pass + elif ( + isinstance(record_class, type) + and issubclass(record_class, protocol.Record) + ): + if ( + record_class.__new__ is not protocol.Record.__new__ + or record_class.__init__ is not protocol.Record.__init__ + ): + raise exceptions.InterfaceError( + 'record_class must not redefine __new__ or __init__' + ) + else: + raise exceptions.InterfaceError( + 'record_class is expected to be a subclass of ' + 'asyncpg.Record, got {!r}'.format(record_class) + ) + + +def _weak_maybe_gc_stmt(weak_ref, stmt): + self = weak_ref() + if self is not None: + self._maybe_gc_stmt(stmt) + + +_uid = 0 diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/connresource.py b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/connresource.py new file mode 100755 index 0000000..3b0c1d3 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/connresource.py @@ -0,0 +1,44 @@ + +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +import functools + +from . import exceptions + + +def guarded(meth): + """A decorator to add a sanity check to ConnectionResource methods.""" + + @functools.wraps(meth) + def _check(self, *args, **kwargs): + self._check_conn_validity(meth.__name__) + return meth(self, *args, **kwargs) + + return _check + + +class ConnectionResource: + __slots__ = ('_connection', '_con_release_ctr') + + def __init__(self, connection): + self._connection = connection + self._con_release_ctr = connection._pool_release_ctr + + def _check_conn_validity(self, meth_name): + con_release_ctr = self._connection._pool_release_ctr + if con_release_ctr != self._con_release_ctr: + raise exceptions.InterfaceError( + 'cannot call {}.{}(): ' + 'the underlying connection has been released back ' + 'to the pool'.format(self.__class__.__name__, meth_name)) + + if self._connection.is_closed(): + raise exceptions.InterfaceError( + 'cannot call {}.{}(): ' + 'the underlying connection is closed'.format( + self.__class__.__name__, meth_name)) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/cursor.py b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/cursor.py new file mode 100755 index 0000000..b4abeed --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/cursor.py @@ -0,0 +1,323 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +import collections + +from . import connresource +from . import exceptions + + +class CursorFactory(connresource.ConnectionResource): + """A cursor interface for the results of a query. + + A cursor interface can be used to initiate efficient traversal of the + results of a large query. + """ + + __slots__ = ( + '_state', + '_args', + '_prefetch', + '_query', + '_timeout', + '_record_class', + ) + + def __init__( + self, + connection, + query, + state, + args, + prefetch, + timeout, + record_class + ): + super().__init__(connection) + self._args = args + self._prefetch = prefetch + self._query = query + self._timeout = timeout + self._state = state + self._record_class = record_class + if state is not None: + state.attach() + + @connresource.guarded + def __aiter__(self): + prefetch = 50 if self._prefetch is None else self._prefetch + return CursorIterator( + self._connection, + self._query, + self._state, + self._args, + self._record_class, + prefetch, + self._timeout, + ) + + @connresource.guarded + def __await__(self): + if self._prefetch is not None: + raise exceptions.InterfaceError( + 'prefetch argument can only be specified for iterable cursor') + cursor = Cursor( + self._connection, + self._query, + self._state, + self._args, + self._record_class, + ) + return cursor._init(self._timeout).__await__() + + def __del__(self): + if self._state is not None: + self._state.detach() + self._connection._maybe_gc_stmt(self._state) + + +class BaseCursor(connresource.ConnectionResource): + + __slots__ = ( + '_state', + '_args', + '_portal_name', + '_exhausted', + '_query', + '_record_class', + ) + + def __init__(self, connection, query, state, args, record_class): + super().__init__(connection) + self._args = args + self._state = state + if state is not None: + state.attach() + self._portal_name = None + self._exhausted = False + self._query = query + self._record_class = record_class + + def _check_ready(self): + if self._state is None: + raise exceptions.InterfaceError( + 'cursor: no associated prepared statement') + + if self._state.closed: + raise exceptions.InterfaceError( + 'cursor: the prepared statement is closed') + + if not self._connection._top_xact: + raise exceptions.NoActiveSQLTransactionError( + 'cursor cannot be created outside of a transaction') + + async def _bind_exec(self, n, timeout): + self._check_ready() + + if self._portal_name: + raise exceptions.InterfaceError( + 'cursor already has an open portal') + + con = self._connection + protocol = con._protocol + + self._portal_name = con._get_unique_id('portal') + buffer, _, self._exhausted = await protocol.bind_execute( + self._state, self._args, self._portal_name, n, True, timeout) + return buffer + + async def _bind(self, timeout): + self._check_ready() + + if self._portal_name: + raise exceptions.InterfaceError( + 'cursor already has an open portal') + + con = self._connection + protocol = con._protocol + + self._portal_name = con._get_unique_id('portal') + buffer = await protocol.bind(self._state, self._args, + self._portal_name, + timeout) + return buffer + + async def _exec(self, n, timeout): + self._check_ready() + + if not self._portal_name: + raise exceptions.InterfaceError( + 'cursor does not have an open portal') + + protocol = self._connection._protocol + buffer, _, self._exhausted = await protocol.execute( + self._state, self._portal_name, n, True, timeout) + return buffer + + async def _close_portal(self, timeout): + self._check_ready() + + if not self._portal_name: + raise exceptions.InterfaceError( + 'cursor does not have an open portal') + + protocol = self._connection._protocol + await protocol.close_portal(self._portal_name, timeout) + self._portal_name = None + + def __repr__(self): + attrs = [] + if self._exhausted: + attrs.append('exhausted') + attrs.append('') # to separate from id + + if self.__class__.__module__.startswith('asyncpg.'): + mod = 'asyncpg' + else: + mod = self.__class__.__module__ + + return '<{}.{} "{!s:.30}" {}{:#x}>'.format( + mod, self.__class__.__name__, + self._state.query, + ' '.join(attrs), id(self)) + + def __del__(self): + if self._state is not None: + self._state.detach() + self._connection._maybe_gc_stmt(self._state) + + +class CursorIterator(BaseCursor): + + __slots__ = ('_buffer', '_prefetch', '_timeout') + + def __init__( + self, + connection, + query, + state, + args, + record_class, + prefetch, + timeout + ): + super().__init__(connection, query, state, args, record_class) + + if prefetch <= 0: + raise exceptions.InterfaceError( + 'prefetch argument must be greater than zero') + + self._buffer = collections.deque() + self._prefetch = prefetch + self._timeout = timeout + + @connresource.guarded + def __aiter__(self): + return self + + @connresource.guarded + async def __anext__(self): + if self._state is None: + self._state = await self._connection._get_statement( + self._query, + self._timeout, + named=True, + record_class=self._record_class, + ) + self._state.attach() + + if not self._portal_name and not self._exhausted: + buffer = await self._bind_exec(self._prefetch, self._timeout) + self._buffer.extend(buffer) + + if not self._buffer and not self._exhausted: + buffer = await self._exec(self._prefetch, self._timeout) + self._buffer.extend(buffer) + + if self._portal_name and self._exhausted: + await self._close_portal(self._timeout) + + if self._buffer: + return self._buffer.popleft() + + raise StopAsyncIteration + + +class Cursor(BaseCursor): + """An open *portal* into the results of a query.""" + + __slots__ = () + + async def _init(self, timeout): + if self._state is None: + self._state = await self._connection._get_statement( + self._query, + timeout, + named=True, + record_class=self._record_class, + ) + self._state.attach() + self._check_ready() + await self._bind(timeout) + return self + + @connresource.guarded + async def fetch(self, n, *, timeout=None): + r"""Return the next *n* rows as a list of :class:`Record` objects. + + :param float timeout: Optional timeout value in seconds. + + :return: A list of :class:`Record` instances. + """ + self._check_ready() + if n <= 0: + raise exceptions.InterfaceError('n must be greater than zero') + if self._exhausted: + return [] + recs = await self._exec(n, timeout) + if len(recs) < n: + self._exhausted = True + return recs + + @connresource.guarded + async def fetchrow(self, *, timeout=None): + r"""Return the next row. + + :param float timeout: Optional timeout value in seconds. + + :return: A :class:`Record` instance. + """ + self._check_ready() + if self._exhausted: + return None + recs = await self._exec(1, timeout) + if len(recs) < 1: + self._exhausted = True + return None + return recs[0] + + @connresource.guarded + async def forward(self, n, *, timeout=None) -> int: + r"""Skip over the next *n* rows. + + :param float timeout: Optional timeout value in seconds. + + :return: A number of rows actually skipped over (<= *n*). + """ + self._check_ready() + if n <= 0: + raise exceptions.InterfaceError('n must be greater than zero') + + protocol = self._connection._protocol + status = await protocol.query('MOVE FORWARD {:d} {}'.format( + n, self._portal_name), timeout) + + advanced = int(status.split()[1]) + if advanced < n: + self._exhausted = True + + return advanced diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/exceptions/__init__.py b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/exceptions/__init__.py new file mode 100755 index 0000000..752fd00 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/exceptions/__init__.py @@ -0,0 +1,1211 @@ +# GENERATED FROM postgresql/src/backend/utils/errcodes.txt +# DO NOT MODIFY, use tools/generate_exceptions.py to update + +from ._base import * # NOQA +from . import _base + + +class PostgresWarning(_base.PostgresLogMessage, Warning): + sqlstate = '01000' + + +class DynamicResultSetsReturned(PostgresWarning): + sqlstate = '0100C' + + +class ImplicitZeroBitPadding(PostgresWarning): + sqlstate = '01008' + + +class NullValueEliminatedInSetFunction(PostgresWarning): + sqlstate = '01003' + + +class PrivilegeNotGranted(PostgresWarning): + sqlstate = '01007' + + +class PrivilegeNotRevoked(PostgresWarning): + sqlstate = '01006' + + +class StringDataRightTruncation(PostgresWarning): + sqlstate = '01004' + + +class DeprecatedFeature(PostgresWarning): + sqlstate = '01P01' + + +class NoData(PostgresWarning): + sqlstate = '02000' + + +class NoAdditionalDynamicResultSetsReturned(NoData): + sqlstate = '02001' + + +class SQLStatementNotYetCompleteError(_base.PostgresError): + sqlstate = '03000' + + +class PostgresConnectionError(_base.PostgresError): + sqlstate = '08000' + + +class ConnectionDoesNotExistError(PostgresConnectionError): + sqlstate = '08003' + + +class ConnectionFailureError(PostgresConnectionError): + sqlstate = '08006' + + +class ClientCannotConnectError(PostgresConnectionError): + sqlstate = '08001' + + +class ConnectionRejectionError(PostgresConnectionError): + sqlstate = '08004' + + +class TransactionResolutionUnknownError(PostgresConnectionError): + sqlstate = '08007' + + +class ProtocolViolationError(PostgresConnectionError): + sqlstate = '08P01' + + +class TriggeredActionError(_base.PostgresError): + sqlstate = '09000' + + +class FeatureNotSupportedError(_base.PostgresError): + sqlstate = '0A000' + + +class InvalidCachedStatementError(FeatureNotSupportedError): + pass + + +class InvalidTransactionInitiationError(_base.PostgresError): + sqlstate = '0B000' + + +class LocatorError(_base.PostgresError): + sqlstate = '0F000' + + +class InvalidLocatorSpecificationError(LocatorError): + sqlstate = '0F001' + + +class InvalidGrantorError(_base.PostgresError): + sqlstate = '0L000' + + +class InvalidGrantOperationError(InvalidGrantorError): + sqlstate = '0LP01' + + +class InvalidRoleSpecificationError(_base.PostgresError): + sqlstate = '0P000' + + +class DiagnosticsError(_base.PostgresError): + sqlstate = '0Z000' + + +class StackedDiagnosticsAccessedWithoutActiveHandlerError(DiagnosticsError): + sqlstate = '0Z002' + + +class InvalidArgumentForXqueryError(_base.PostgresError): + sqlstate = '10608' + + +class CaseNotFoundError(_base.PostgresError): + sqlstate = '20000' + + +class CardinalityViolationError(_base.PostgresError): + sqlstate = '21000' + + +class DataError(_base.PostgresError): + sqlstate = '22000' + + +class ArraySubscriptError(DataError): + sqlstate = '2202E' + + +class CharacterNotInRepertoireError(DataError): + sqlstate = '22021' + + +class DatetimeFieldOverflowError(DataError): + sqlstate = '22008' + + +class DivisionByZeroError(DataError): + sqlstate = '22012' + + +class ErrorInAssignmentError(DataError): + sqlstate = '22005' + + +class EscapeCharacterConflictError(DataError): + sqlstate = '2200B' + + +class IndicatorOverflowError(DataError): + sqlstate = '22022' + + +class IntervalFieldOverflowError(DataError): + sqlstate = '22015' + + +class InvalidArgumentForLogarithmError(DataError): + sqlstate = '2201E' + + +class InvalidArgumentForNtileFunctionError(DataError): + sqlstate = '22014' + + +class InvalidArgumentForNthValueFunctionError(DataError): + sqlstate = '22016' + + +class InvalidArgumentForPowerFunctionError(DataError): + sqlstate = '2201F' + + +class InvalidArgumentForWidthBucketFunctionError(DataError): + sqlstate = '2201G' + + +class InvalidCharacterValueForCastError(DataError): + sqlstate = '22018' + + +class InvalidDatetimeFormatError(DataError): + sqlstate = '22007' + + +class InvalidEscapeCharacterError(DataError): + sqlstate = '22019' + + +class InvalidEscapeOctetError(DataError): + sqlstate = '2200D' + + +class InvalidEscapeSequenceError(DataError): + sqlstate = '22025' + + +class NonstandardUseOfEscapeCharacterError(DataError): + sqlstate = '22P06' + + +class InvalidIndicatorParameterValueError(DataError): + sqlstate = '22010' + + +class InvalidParameterValueError(DataError): + sqlstate = '22023' + + +class InvalidPrecedingOrFollowingSizeError(DataError): + sqlstate = '22013' + + +class InvalidRegularExpressionError(DataError): + sqlstate = '2201B' + + +class InvalidRowCountInLimitClauseError(DataError): + sqlstate = '2201W' + + +class InvalidRowCountInResultOffsetClauseError(DataError): + sqlstate = '2201X' + + +class InvalidTablesampleArgumentError(DataError): + sqlstate = '2202H' + + +class InvalidTablesampleRepeatError(DataError): + sqlstate = '2202G' + + +class InvalidTimeZoneDisplacementValueError(DataError): + sqlstate = '22009' + + +class InvalidUseOfEscapeCharacterError(DataError): + sqlstate = '2200C' + + +class MostSpecificTypeMismatchError(DataError): + sqlstate = '2200G' + + +class NullValueNotAllowedError(DataError): + sqlstate = '22004' + + +class NullValueNoIndicatorParameterError(DataError): + sqlstate = '22002' + + +class NumericValueOutOfRangeError(DataError): + sqlstate = '22003' + + +class SequenceGeneratorLimitExceededError(DataError): + sqlstate = '2200H' + + +class StringDataLengthMismatchError(DataError): + sqlstate = '22026' + + +class StringDataRightTruncationError(DataError): + sqlstate = '22001' + + +class SubstringError(DataError): + sqlstate = '22011' + + +class TrimError(DataError): + sqlstate = '22027' + + +class UnterminatedCStringError(DataError): + sqlstate = '22024' + + +class ZeroLengthCharacterStringError(DataError): + sqlstate = '2200F' + + +class PostgresFloatingPointError(DataError): + sqlstate = '22P01' + + +class InvalidTextRepresentationError(DataError): + sqlstate = '22P02' + + +class InvalidBinaryRepresentationError(DataError): + sqlstate = '22P03' + + +class BadCopyFileFormatError(DataError): + sqlstate = '22P04' + + +class UntranslatableCharacterError(DataError): + sqlstate = '22P05' + + +class NotAnXmlDocumentError(DataError): + sqlstate = '2200L' + + +class InvalidXmlDocumentError(DataError): + sqlstate = '2200M' + + +class InvalidXmlContentError(DataError): + sqlstate = '2200N' + + +class InvalidXmlCommentError(DataError): + sqlstate = '2200S' + + +class InvalidXmlProcessingInstructionError(DataError): + sqlstate = '2200T' + + +class DuplicateJsonObjectKeyValueError(DataError): + sqlstate = '22030' + + +class InvalidArgumentForSQLJsonDatetimeFunctionError(DataError): + sqlstate = '22031' + + +class InvalidJsonTextError(DataError): + sqlstate = '22032' + + +class InvalidSQLJsonSubscriptError(DataError): + sqlstate = '22033' + + +class MoreThanOneSQLJsonItemError(DataError): + sqlstate = '22034' + + +class NoSQLJsonItemError(DataError): + sqlstate = '22035' + + +class NonNumericSQLJsonItemError(DataError): + sqlstate = '22036' + + +class NonUniqueKeysInAJsonObjectError(DataError): + sqlstate = '22037' + + +class SingletonSQLJsonItemRequiredError(DataError): + sqlstate = '22038' + + +class SQLJsonArrayNotFoundError(DataError): + sqlstate = '22039' + + +class SQLJsonMemberNotFoundError(DataError): + sqlstate = '2203A' + + +class SQLJsonNumberNotFoundError(DataError): + sqlstate = '2203B' + + +class SQLJsonObjectNotFoundError(DataError): + sqlstate = '2203C' + + +class TooManyJsonArrayElementsError(DataError): + sqlstate = '2203D' + + +class TooManyJsonObjectMembersError(DataError): + sqlstate = '2203E' + + +class SQLJsonScalarRequiredError(DataError): + sqlstate = '2203F' + + +class SQLJsonItemCannotBeCastToTargetTypeError(DataError): + sqlstate = '2203G' + + +class IntegrityConstraintViolationError(_base.PostgresError): + sqlstate = '23000' + + +class RestrictViolationError(IntegrityConstraintViolationError): + sqlstate = '23001' + + +class NotNullViolationError(IntegrityConstraintViolationError): + sqlstate = '23502' + + +class ForeignKeyViolationError(IntegrityConstraintViolationError): + sqlstate = '23503' + + +class UniqueViolationError(IntegrityConstraintViolationError): + sqlstate = '23505' + + +class CheckViolationError(IntegrityConstraintViolationError): + sqlstate = '23514' + + +class ExclusionViolationError(IntegrityConstraintViolationError): + sqlstate = '23P01' + + +class InvalidCursorStateError(_base.PostgresError): + sqlstate = '24000' + + +class InvalidTransactionStateError(_base.PostgresError): + sqlstate = '25000' + + +class ActiveSQLTransactionError(InvalidTransactionStateError): + sqlstate = '25001' + + +class BranchTransactionAlreadyActiveError(InvalidTransactionStateError): + sqlstate = '25002' + + +class HeldCursorRequiresSameIsolationLevelError(InvalidTransactionStateError): + sqlstate = '25008' + + +class InappropriateAccessModeForBranchTransactionError( + InvalidTransactionStateError): + sqlstate = '25003' + + +class InappropriateIsolationLevelForBranchTransactionError( + InvalidTransactionStateError): + sqlstate = '25004' + + +class NoActiveSQLTransactionForBranchTransactionError( + InvalidTransactionStateError): + sqlstate = '25005' + + +class ReadOnlySQLTransactionError(InvalidTransactionStateError): + sqlstate = '25006' + + +class SchemaAndDataStatementMixingNotSupportedError( + InvalidTransactionStateError): + sqlstate = '25007' + + +class NoActiveSQLTransactionError(InvalidTransactionStateError): + sqlstate = '25P01' + + +class InFailedSQLTransactionError(InvalidTransactionStateError): + sqlstate = '25P02' + + +class IdleInTransactionSessionTimeoutError(InvalidTransactionStateError): + sqlstate = '25P03' + + +class TransactionTimeoutError(InvalidTransactionStateError): + sqlstate = '25P04' + + +class InvalidSQLStatementNameError(_base.PostgresError): + sqlstate = '26000' + + +class TriggeredDataChangeViolationError(_base.PostgresError): + sqlstate = '27000' + + +class InvalidAuthorizationSpecificationError(_base.PostgresError): + sqlstate = '28000' + + +class InvalidPasswordError(InvalidAuthorizationSpecificationError): + sqlstate = '28P01' + + +class DependentPrivilegeDescriptorsStillExistError(_base.PostgresError): + sqlstate = '2B000' + + +class DependentObjectsStillExistError( + DependentPrivilegeDescriptorsStillExistError): + sqlstate = '2BP01' + + +class InvalidTransactionTerminationError(_base.PostgresError): + sqlstate = '2D000' + + +class SQLRoutineError(_base.PostgresError): + sqlstate = '2F000' + + +class FunctionExecutedNoReturnStatementError(SQLRoutineError): + sqlstate = '2F005' + + +class ModifyingSQLDataNotPermittedError(SQLRoutineError): + sqlstate = '2F002' + + +class ProhibitedSQLStatementAttemptedError(SQLRoutineError): + sqlstate = '2F003' + + +class ReadingSQLDataNotPermittedError(SQLRoutineError): + sqlstate = '2F004' + + +class InvalidCursorNameError(_base.PostgresError): + sqlstate = '34000' + + +class ExternalRoutineError(_base.PostgresError): + sqlstate = '38000' + + +class ContainingSQLNotPermittedError(ExternalRoutineError): + sqlstate = '38001' + + +class ModifyingExternalRoutineSQLDataNotPermittedError(ExternalRoutineError): + sqlstate = '38002' + + +class ProhibitedExternalRoutineSQLStatementAttemptedError( + ExternalRoutineError): + sqlstate = '38003' + + +class ReadingExternalRoutineSQLDataNotPermittedError(ExternalRoutineError): + sqlstate = '38004' + + +class ExternalRoutineInvocationError(_base.PostgresError): + sqlstate = '39000' + + +class InvalidSqlstateReturnedError(ExternalRoutineInvocationError): + sqlstate = '39001' + + +class NullValueInExternalRoutineNotAllowedError( + ExternalRoutineInvocationError): + sqlstate = '39004' + + +class TriggerProtocolViolatedError(ExternalRoutineInvocationError): + sqlstate = '39P01' + + +class SrfProtocolViolatedError(ExternalRoutineInvocationError): + sqlstate = '39P02' + + +class EventTriggerProtocolViolatedError(ExternalRoutineInvocationError): + sqlstate = '39P03' + + +class SavepointError(_base.PostgresError): + sqlstate = '3B000' + + +class InvalidSavepointSpecificationError(SavepointError): + sqlstate = '3B001' + + +class InvalidCatalogNameError(_base.PostgresError): + sqlstate = '3D000' + + +class InvalidSchemaNameError(_base.PostgresError): + sqlstate = '3F000' + + +class TransactionRollbackError(_base.PostgresError): + sqlstate = '40000' + + +class TransactionIntegrityConstraintViolationError(TransactionRollbackError): + sqlstate = '40002' + + +class SerializationError(TransactionRollbackError): + sqlstate = '40001' + + +class StatementCompletionUnknownError(TransactionRollbackError): + sqlstate = '40003' + + +class DeadlockDetectedError(TransactionRollbackError): + sqlstate = '40P01' + + +class SyntaxOrAccessError(_base.PostgresError): + sqlstate = '42000' + + +class PostgresSyntaxError(SyntaxOrAccessError): + sqlstate = '42601' + + +class InsufficientPrivilegeError(SyntaxOrAccessError): + sqlstate = '42501' + + +class CannotCoerceError(SyntaxOrAccessError): + sqlstate = '42846' + + +class GroupingError(SyntaxOrAccessError): + sqlstate = '42803' + + +class WindowingError(SyntaxOrAccessError): + sqlstate = '42P20' + + +class InvalidRecursionError(SyntaxOrAccessError): + sqlstate = '42P19' + + +class InvalidForeignKeyError(SyntaxOrAccessError): + sqlstate = '42830' + + +class InvalidNameError(SyntaxOrAccessError): + sqlstate = '42602' + + +class NameTooLongError(SyntaxOrAccessError): + sqlstate = '42622' + + +class ReservedNameError(SyntaxOrAccessError): + sqlstate = '42939' + + +class DatatypeMismatchError(SyntaxOrAccessError): + sqlstate = '42804' + + +class IndeterminateDatatypeError(SyntaxOrAccessError): + sqlstate = '42P18' + + +class CollationMismatchError(SyntaxOrAccessError): + sqlstate = '42P21' + + +class IndeterminateCollationError(SyntaxOrAccessError): + sqlstate = '42P22' + + +class WrongObjectTypeError(SyntaxOrAccessError): + sqlstate = '42809' + + +class GeneratedAlwaysError(SyntaxOrAccessError): + sqlstate = '428C9' + + +class UndefinedColumnError(SyntaxOrAccessError): + sqlstate = '42703' + + +class UndefinedFunctionError(SyntaxOrAccessError): + sqlstate = '42883' + + +class UndefinedTableError(SyntaxOrAccessError): + sqlstate = '42P01' + + +class UndefinedParameterError(SyntaxOrAccessError): + sqlstate = '42P02' + + +class UndefinedObjectError(SyntaxOrAccessError): + sqlstate = '42704' + + +class DuplicateColumnError(SyntaxOrAccessError): + sqlstate = '42701' + + +class DuplicateCursorError(SyntaxOrAccessError): + sqlstate = '42P03' + + +class DuplicateDatabaseError(SyntaxOrAccessError): + sqlstate = '42P04' + + +class DuplicateFunctionError(SyntaxOrAccessError): + sqlstate = '42723' + + +class DuplicatePreparedStatementError(SyntaxOrAccessError): + sqlstate = '42P05' + + +class DuplicateSchemaError(SyntaxOrAccessError): + sqlstate = '42P06' + + +class DuplicateTableError(SyntaxOrAccessError): + sqlstate = '42P07' + + +class DuplicateAliasError(SyntaxOrAccessError): + sqlstate = '42712' + + +class DuplicateObjectError(SyntaxOrAccessError): + sqlstate = '42710' + + +class AmbiguousColumnError(SyntaxOrAccessError): + sqlstate = '42702' + + +class AmbiguousFunctionError(SyntaxOrAccessError): + sqlstate = '42725' + + +class AmbiguousParameterError(SyntaxOrAccessError): + sqlstate = '42P08' + + +class AmbiguousAliasError(SyntaxOrAccessError): + sqlstate = '42P09' + + +class InvalidColumnReferenceError(SyntaxOrAccessError): + sqlstate = '42P10' + + +class InvalidColumnDefinitionError(SyntaxOrAccessError): + sqlstate = '42611' + + +class InvalidCursorDefinitionError(SyntaxOrAccessError): + sqlstate = '42P11' + + +class InvalidDatabaseDefinitionError(SyntaxOrAccessError): + sqlstate = '42P12' + + +class InvalidFunctionDefinitionError(SyntaxOrAccessError): + sqlstate = '42P13' + + +class InvalidPreparedStatementDefinitionError(SyntaxOrAccessError): + sqlstate = '42P14' + + +class InvalidSchemaDefinitionError(SyntaxOrAccessError): + sqlstate = '42P15' + + +class InvalidTableDefinitionError(SyntaxOrAccessError): + sqlstate = '42P16' + + +class InvalidObjectDefinitionError(SyntaxOrAccessError): + sqlstate = '42P17' + + +class WithCheckOptionViolationError(_base.PostgresError): + sqlstate = '44000' + + +class InsufficientResourcesError(_base.PostgresError): + sqlstate = '53000' + + +class DiskFullError(InsufficientResourcesError): + sqlstate = '53100' + + +class OutOfMemoryError(InsufficientResourcesError): + sqlstate = '53200' + + +class TooManyConnectionsError(InsufficientResourcesError): + sqlstate = '53300' + + +class ConfigurationLimitExceededError(InsufficientResourcesError): + sqlstate = '53400' + + +class ProgramLimitExceededError(_base.PostgresError): + sqlstate = '54000' + + +class StatementTooComplexError(ProgramLimitExceededError): + sqlstate = '54001' + + +class TooManyColumnsError(ProgramLimitExceededError): + sqlstate = '54011' + + +class TooManyArgumentsError(ProgramLimitExceededError): + sqlstate = '54023' + + +class ObjectNotInPrerequisiteStateError(_base.PostgresError): + sqlstate = '55000' + + +class ObjectInUseError(ObjectNotInPrerequisiteStateError): + sqlstate = '55006' + + +class CantChangeRuntimeParamError(ObjectNotInPrerequisiteStateError): + sqlstate = '55P02' + + +class LockNotAvailableError(ObjectNotInPrerequisiteStateError): + sqlstate = '55P03' + + +class UnsafeNewEnumValueUsageError(ObjectNotInPrerequisiteStateError): + sqlstate = '55P04' + + +class OperatorInterventionError(_base.PostgresError): + sqlstate = '57000' + + +class QueryCanceledError(OperatorInterventionError): + sqlstate = '57014' + + +class AdminShutdownError(OperatorInterventionError): + sqlstate = '57P01' + + +class CrashShutdownError(OperatorInterventionError): + sqlstate = '57P02' + + +class CannotConnectNowError(OperatorInterventionError): + sqlstate = '57P03' + + +class DatabaseDroppedError(OperatorInterventionError): + sqlstate = '57P04' + + +class IdleSessionTimeoutError(OperatorInterventionError): + sqlstate = '57P05' + + +class PostgresSystemError(_base.PostgresError): + sqlstate = '58000' + + +class PostgresIOError(PostgresSystemError): + sqlstate = '58030' + + +class UndefinedFileError(PostgresSystemError): + sqlstate = '58P01' + + +class DuplicateFileError(PostgresSystemError): + sqlstate = '58P02' + + +class FileNameTooLongError(PostgresSystemError): + sqlstate = '58P03' + + +class SnapshotTooOldError(_base.PostgresError): + sqlstate = '72000' + + +class ConfigFileError(_base.PostgresError): + sqlstate = 'F0000' + + +class LockFileExistsError(ConfigFileError): + sqlstate = 'F0001' + + +class FDWError(_base.PostgresError): + sqlstate = 'HV000' + + +class FDWColumnNameNotFoundError(FDWError): + sqlstate = 'HV005' + + +class FDWDynamicParameterValueNeededError(FDWError): + sqlstate = 'HV002' + + +class FDWFunctionSequenceError(FDWError): + sqlstate = 'HV010' + + +class FDWInconsistentDescriptorInformationError(FDWError): + sqlstate = 'HV021' + + +class FDWInvalidAttributeValueError(FDWError): + sqlstate = 'HV024' + + +class FDWInvalidColumnNameError(FDWError): + sqlstate = 'HV007' + + +class FDWInvalidColumnNumberError(FDWError): + sqlstate = 'HV008' + + +class FDWInvalidDataTypeError(FDWError): + sqlstate = 'HV004' + + +class FDWInvalidDataTypeDescriptorsError(FDWError): + sqlstate = 'HV006' + + +class FDWInvalidDescriptorFieldIdentifierError(FDWError): + sqlstate = 'HV091' + + +class FDWInvalidHandleError(FDWError): + sqlstate = 'HV00B' + + +class FDWInvalidOptionIndexError(FDWError): + sqlstate = 'HV00C' + + +class FDWInvalidOptionNameError(FDWError): + sqlstate = 'HV00D' + + +class FDWInvalidStringLengthOrBufferLengthError(FDWError): + sqlstate = 'HV090' + + +class FDWInvalidStringFormatError(FDWError): + sqlstate = 'HV00A' + + +class FDWInvalidUseOfNullPointerError(FDWError): + sqlstate = 'HV009' + + +class FDWTooManyHandlesError(FDWError): + sqlstate = 'HV014' + + +class FDWOutOfMemoryError(FDWError): + sqlstate = 'HV001' + + +class FDWNoSchemasError(FDWError): + sqlstate = 'HV00P' + + +class FDWOptionNameNotFoundError(FDWError): + sqlstate = 'HV00J' + + +class FDWReplyHandleError(FDWError): + sqlstate = 'HV00K' + + +class FDWSchemaNotFoundError(FDWError): + sqlstate = 'HV00Q' + + +class FDWTableNotFoundError(FDWError): + sqlstate = 'HV00R' + + +class FDWUnableToCreateExecutionError(FDWError): + sqlstate = 'HV00L' + + +class FDWUnableToCreateReplyError(FDWError): + sqlstate = 'HV00M' + + +class FDWUnableToEstablishConnectionError(FDWError): + sqlstate = 'HV00N' + + +class PLPGSQLError(_base.PostgresError): + sqlstate = 'P0000' + + +class RaiseError(PLPGSQLError): + sqlstate = 'P0001' + + +class NoDataFoundError(PLPGSQLError): + sqlstate = 'P0002' + + +class TooManyRowsError(PLPGSQLError): + sqlstate = 'P0003' + + +class AssertError(PLPGSQLError): + sqlstate = 'P0004' + + +class InternalServerError(_base.PostgresError): + sqlstate = 'XX000' + + +class DataCorruptedError(InternalServerError): + sqlstate = 'XX001' + + +class IndexCorruptedError(InternalServerError): + sqlstate = 'XX002' + + +__all__ = ( + 'ActiveSQLTransactionError', 'AdminShutdownError', + 'AmbiguousAliasError', 'AmbiguousColumnError', + 'AmbiguousFunctionError', 'AmbiguousParameterError', + 'ArraySubscriptError', 'AssertError', 'BadCopyFileFormatError', + 'BranchTransactionAlreadyActiveError', 'CannotCoerceError', + 'CannotConnectNowError', 'CantChangeRuntimeParamError', + 'CardinalityViolationError', 'CaseNotFoundError', + 'CharacterNotInRepertoireError', 'CheckViolationError', + 'ClientCannotConnectError', 'CollationMismatchError', + 'ConfigFileError', 'ConfigurationLimitExceededError', + 'ConnectionDoesNotExistError', 'ConnectionFailureError', + 'ConnectionRejectionError', 'ContainingSQLNotPermittedError', + 'CrashShutdownError', 'DataCorruptedError', 'DataError', + 'DatabaseDroppedError', 'DatatypeMismatchError', + 'DatetimeFieldOverflowError', 'DeadlockDetectedError', + 'DependentObjectsStillExistError', + 'DependentPrivilegeDescriptorsStillExistError', 'DeprecatedFeature', + 'DiagnosticsError', 'DiskFullError', 'DivisionByZeroError', + 'DuplicateAliasError', 'DuplicateColumnError', 'DuplicateCursorError', + 'DuplicateDatabaseError', 'DuplicateFileError', + 'DuplicateFunctionError', 'DuplicateJsonObjectKeyValueError', + 'DuplicateObjectError', 'DuplicatePreparedStatementError', + 'DuplicateSchemaError', 'DuplicateTableError', + 'DynamicResultSetsReturned', 'ErrorInAssignmentError', + 'EscapeCharacterConflictError', 'EventTriggerProtocolViolatedError', + 'ExclusionViolationError', 'ExternalRoutineError', + 'ExternalRoutineInvocationError', 'FDWColumnNameNotFoundError', + 'FDWDynamicParameterValueNeededError', 'FDWError', + 'FDWFunctionSequenceError', + 'FDWInconsistentDescriptorInformationError', + 'FDWInvalidAttributeValueError', 'FDWInvalidColumnNameError', + 'FDWInvalidColumnNumberError', 'FDWInvalidDataTypeDescriptorsError', + 'FDWInvalidDataTypeError', 'FDWInvalidDescriptorFieldIdentifierError', + 'FDWInvalidHandleError', 'FDWInvalidOptionIndexError', + 'FDWInvalidOptionNameError', 'FDWInvalidStringFormatError', + 'FDWInvalidStringLengthOrBufferLengthError', + 'FDWInvalidUseOfNullPointerError', 'FDWNoSchemasError', + 'FDWOptionNameNotFoundError', 'FDWOutOfMemoryError', + 'FDWReplyHandleError', 'FDWSchemaNotFoundError', + 'FDWTableNotFoundError', 'FDWTooManyHandlesError', + 'FDWUnableToCreateExecutionError', 'FDWUnableToCreateReplyError', + 'FDWUnableToEstablishConnectionError', 'FeatureNotSupportedError', + 'FileNameTooLongError', 'ForeignKeyViolationError', + 'FunctionExecutedNoReturnStatementError', 'GeneratedAlwaysError', + 'GroupingError', 'HeldCursorRequiresSameIsolationLevelError', + 'IdleInTransactionSessionTimeoutError', 'IdleSessionTimeoutError', + 'ImplicitZeroBitPadding', 'InFailedSQLTransactionError', + 'InappropriateAccessModeForBranchTransactionError', + 'InappropriateIsolationLevelForBranchTransactionError', + 'IndeterminateCollationError', 'IndeterminateDatatypeError', + 'IndexCorruptedError', 'IndicatorOverflowError', + 'InsufficientPrivilegeError', 'InsufficientResourcesError', + 'IntegrityConstraintViolationError', 'InternalServerError', + 'IntervalFieldOverflowError', 'InvalidArgumentForLogarithmError', + 'InvalidArgumentForNthValueFunctionError', + 'InvalidArgumentForNtileFunctionError', + 'InvalidArgumentForPowerFunctionError', + 'InvalidArgumentForSQLJsonDatetimeFunctionError', + 'InvalidArgumentForWidthBucketFunctionError', + 'InvalidArgumentForXqueryError', + 'InvalidAuthorizationSpecificationError', + 'InvalidBinaryRepresentationError', 'InvalidCachedStatementError', + 'InvalidCatalogNameError', 'InvalidCharacterValueForCastError', + 'InvalidColumnDefinitionError', 'InvalidColumnReferenceError', + 'InvalidCursorDefinitionError', 'InvalidCursorNameError', + 'InvalidCursorStateError', 'InvalidDatabaseDefinitionError', + 'InvalidDatetimeFormatError', 'InvalidEscapeCharacterError', + 'InvalidEscapeOctetError', 'InvalidEscapeSequenceError', + 'InvalidForeignKeyError', 'InvalidFunctionDefinitionError', + 'InvalidGrantOperationError', 'InvalidGrantorError', + 'InvalidIndicatorParameterValueError', 'InvalidJsonTextError', + 'InvalidLocatorSpecificationError', 'InvalidNameError', + 'InvalidObjectDefinitionError', 'InvalidParameterValueError', + 'InvalidPasswordError', 'InvalidPrecedingOrFollowingSizeError', + 'InvalidPreparedStatementDefinitionError', 'InvalidRecursionError', + 'InvalidRegularExpressionError', 'InvalidRoleSpecificationError', + 'InvalidRowCountInLimitClauseError', + 'InvalidRowCountInResultOffsetClauseError', + 'InvalidSQLJsonSubscriptError', 'InvalidSQLStatementNameError', + 'InvalidSavepointSpecificationError', 'InvalidSchemaDefinitionError', + 'InvalidSchemaNameError', 'InvalidSqlstateReturnedError', + 'InvalidTableDefinitionError', 'InvalidTablesampleArgumentError', + 'InvalidTablesampleRepeatError', 'InvalidTextRepresentationError', + 'InvalidTimeZoneDisplacementValueError', + 'InvalidTransactionInitiationError', 'InvalidTransactionStateError', + 'InvalidTransactionTerminationError', + 'InvalidUseOfEscapeCharacterError', 'InvalidXmlCommentError', + 'InvalidXmlContentError', 'InvalidXmlDocumentError', + 'InvalidXmlProcessingInstructionError', 'LocatorError', + 'LockFileExistsError', 'LockNotAvailableError', + 'ModifyingExternalRoutineSQLDataNotPermittedError', + 'ModifyingSQLDataNotPermittedError', 'MoreThanOneSQLJsonItemError', + 'MostSpecificTypeMismatchError', 'NameTooLongError', + 'NoActiveSQLTransactionError', + 'NoActiveSQLTransactionForBranchTransactionError', + 'NoAdditionalDynamicResultSetsReturned', 'NoData', 'NoDataFoundError', + 'NoSQLJsonItemError', 'NonNumericSQLJsonItemError', + 'NonUniqueKeysInAJsonObjectError', + 'NonstandardUseOfEscapeCharacterError', 'NotAnXmlDocumentError', + 'NotNullViolationError', 'NullValueEliminatedInSetFunction', + 'NullValueInExternalRoutineNotAllowedError', + 'NullValueNoIndicatorParameterError', 'NullValueNotAllowedError', + 'NumericValueOutOfRangeError', 'ObjectInUseError', + 'ObjectNotInPrerequisiteStateError', 'OperatorInterventionError', + 'OutOfMemoryError', 'PLPGSQLError', 'PostgresConnectionError', + 'PostgresFloatingPointError', 'PostgresIOError', + 'PostgresSyntaxError', 'PostgresSystemError', 'PostgresWarning', + 'PrivilegeNotGranted', 'PrivilegeNotRevoked', + 'ProgramLimitExceededError', + 'ProhibitedExternalRoutineSQLStatementAttemptedError', + 'ProhibitedSQLStatementAttemptedError', 'ProtocolViolationError', + 'QueryCanceledError', 'RaiseError', 'ReadOnlySQLTransactionError', + 'ReadingExternalRoutineSQLDataNotPermittedError', + 'ReadingSQLDataNotPermittedError', 'ReservedNameError', + 'RestrictViolationError', 'SQLJsonArrayNotFoundError', + 'SQLJsonItemCannotBeCastToTargetTypeError', + 'SQLJsonMemberNotFoundError', 'SQLJsonNumberNotFoundError', + 'SQLJsonObjectNotFoundError', 'SQLJsonScalarRequiredError', + 'SQLRoutineError', 'SQLStatementNotYetCompleteError', + 'SavepointError', 'SchemaAndDataStatementMixingNotSupportedError', + 'SequenceGeneratorLimitExceededError', 'SerializationError', + 'SingletonSQLJsonItemRequiredError', 'SnapshotTooOldError', + 'SrfProtocolViolatedError', + 'StackedDiagnosticsAccessedWithoutActiveHandlerError', + 'StatementCompletionUnknownError', 'StatementTooComplexError', + 'StringDataLengthMismatchError', 'StringDataRightTruncation', + 'StringDataRightTruncationError', 'SubstringError', + 'SyntaxOrAccessError', 'TooManyArgumentsError', 'TooManyColumnsError', + 'TooManyConnectionsError', 'TooManyJsonArrayElementsError', + 'TooManyJsonObjectMembersError', 'TooManyRowsError', + 'TransactionIntegrityConstraintViolationError', + 'TransactionResolutionUnknownError', 'TransactionRollbackError', + 'TransactionTimeoutError', 'TriggerProtocolViolatedError', + 'TriggeredActionError', 'TriggeredDataChangeViolationError', + 'TrimError', 'UndefinedColumnError', 'UndefinedFileError', + 'UndefinedFunctionError', 'UndefinedObjectError', + 'UndefinedParameterError', 'UndefinedTableError', + 'UniqueViolationError', 'UnsafeNewEnumValueUsageError', + 'UnterminatedCStringError', 'UntranslatableCharacterError', + 'WindowingError', 'WithCheckOptionViolationError', + 'WrongObjectTypeError', 'ZeroLengthCharacterStringError' +) + +__all__ += _base.__all__ diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/exceptions/_base.py b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/exceptions/_base.py new file mode 100755 index 0000000..00e9699 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/exceptions/_base.py @@ -0,0 +1,299 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +import asyncpg +import sys +import textwrap + + +__all__ = ('PostgresError', 'FatalPostgresError', 'UnknownPostgresError', + 'InterfaceError', 'InterfaceWarning', 'PostgresLogMessage', + 'ClientConfigurationError', + 'InternalClientError', 'OutdatedSchemaCacheError', 'ProtocolError', + 'UnsupportedClientFeatureError', 'TargetServerAttributeNotMatched', + 'UnsupportedServerFeatureError') + + +def _is_asyncpg_class(cls): + modname = cls.__module__ + return modname == 'asyncpg' or modname.startswith('asyncpg.') + + +class PostgresMessageMeta(type): + + _message_map = {} + _field_map = { + 'S': 'severity', + 'V': 'severity_en', + 'C': 'sqlstate', + 'M': 'message', + 'D': 'detail', + 'H': 'hint', + 'P': 'position', + 'p': 'internal_position', + 'q': 'internal_query', + 'W': 'context', + 's': 'schema_name', + 't': 'table_name', + 'c': 'column_name', + 'd': 'data_type_name', + 'n': 'constraint_name', + 'F': 'server_source_filename', + 'L': 'server_source_line', + 'R': 'server_source_function' + } + + def __new__(mcls, name, bases, dct): + cls = super().__new__(mcls, name, bases, dct) + if cls.__module__ == mcls.__module__ and name == 'PostgresMessage': + for f in mcls._field_map.values(): + setattr(cls, f, None) + + if _is_asyncpg_class(cls): + mod = sys.modules[cls.__module__] + if hasattr(mod, name): + raise RuntimeError('exception class redefinition: {}'.format( + name)) + + code = dct.get('sqlstate') + if code is not None: + existing = mcls._message_map.get(code) + if existing is not None: + raise TypeError('{} has duplicate SQLSTATE code, which is' + 'already defined by {}'.format( + name, existing.__name__)) + mcls._message_map[code] = cls + + return cls + + @classmethod + def get_message_class_for_sqlstate(mcls, code): + return mcls._message_map.get(code, UnknownPostgresError) + + +class PostgresMessage(metaclass=PostgresMessageMeta): + + @classmethod + def _get_error_class(cls, fields): + sqlstate = fields.get('C') + return type(cls).get_message_class_for_sqlstate(sqlstate) + + @classmethod + def _get_error_dict(cls, fields, query): + dct = { + 'query': query + } + + field_map = type(cls)._field_map + for k, v in fields.items(): + field = field_map.get(k) + if field: + dct[field] = v + + return dct + + @classmethod + def _make_constructor(cls, fields, query=None): + dct = cls._get_error_dict(fields, query) + + exccls = cls._get_error_class(fields) + message = dct.get('message', '') + + # PostgreSQL will raise an exception when it detects + # that the result type of the query has changed from + # when the statement was prepared. + # + # The original error is somewhat cryptic and unspecific, + # so we raise a custom subclass that is easier to handle + # and identify. + # + # Note that we specifically do not rely on the error + # message, as it is localizable. + is_icse = ( + exccls.__name__ == 'FeatureNotSupportedError' and + _is_asyncpg_class(exccls) and + dct.get('server_source_function') == 'RevalidateCachedQuery' + ) + + if is_icse: + exceptions = sys.modules[exccls.__module__] + exccls = exceptions.InvalidCachedStatementError + message = ('cached statement plan is invalid due to a database ' + 'schema or configuration change') + + is_prepared_stmt_error = ( + exccls.__name__ in ('DuplicatePreparedStatementError', + 'InvalidSQLStatementNameError') and + _is_asyncpg_class(exccls) + ) + + if is_prepared_stmt_error: + hint = dct.get('hint', '') + hint += textwrap.dedent("""\ + + NOTE: pgbouncer with pool_mode set to "transaction" or + "statement" does not support prepared statements properly. + You have two options: + + * if you are using pgbouncer for connection pooling to a + single server, switch to the connection pool functionality + provided by asyncpg, it is a much better option for this + purpose; + + * if you have no option of avoiding the use of pgbouncer, + then you can set statement_cache_size to 0 when creating + the asyncpg connection object. + """) + + dct['hint'] = hint + + return exccls, message, dct + + def as_dict(self): + dct = {} + for f in type(self)._field_map.values(): + val = getattr(self, f) + if val is not None: + dct[f] = val + return dct + + +class PostgresError(PostgresMessage, Exception): + """Base class for all Postgres errors.""" + + def __str__(self): + msg = self.args[0] + if self.detail: + msg += '\nDETAIL: {}'.format(self.detail) + if self.hint: + msg += '\nHINT: {}'.format(self.hint) + + return msg + + @classmethod + def new(cls, fields, query=None): + exccls, message, dct = cls._make_constructor(fields, query) + ex = exccls(message) + ex.__dict__.update(dct) + return ex + + +class FatalPostgresError(PostgresError): + """A fatal error that should result in server disconnection.""" + + +class UnknownPostgresError(FatalPostgresError): + """An error with an unknown SQLSTATE code.""" + + +class InterfaceMessage: + def __init__(self, *, detail=None, hint=None): + self.detail = detail + self.hint = hint + + def __str__(self): + msg = self.args[0] + if self.detail: + msg += '\nDETAIL: {}'.format(self.detail) + if self.hint: + msg += '\nHINT: {}'.format(self.hint) + + return msg + + +class InterfaceError(InterfaceMessage, Exception): + """An error caused by improper use of asyncpg API.""" + + def __init__(self, msg, *, detail=None, hint=None): + InterfaceMessage.__init__(self, detail=detail, hint=hint) + Exception.__init__(self, msg) + + def with_msg(self, msg): + return type(self)( + msg, + detail=self.detail, + hint=self.hint, + ).with_traceback( + self.__traceback__ + ) + + +class ClientConfigurationError(InterfaceError, ValueError): + """An error caused by improper client configuration.""" + + +class DataError(InterfaceError, ValueError): + """An error caused by invalid query input.""" + + +class UnsupportedClientFeatureError(InterfaceError): + """Requested feature is unsupported by asyncpg.""" + + +class UnsupportedServerFeatureError(InterfaceError): + """Requested feature is unsupported by PostgreSQL server.""" + + +class InterfaceWarning(InterfaceMessage, UserWarning): + """A warning caused by an improper use of asyncpg API.""" + + def __init__(self, msg, *, detail=None, hint=None): + InterfaceMessage.__init__(self, detail=detail, hint=hint) + UserWarning.__init__(self, msg) + + +class InternalClientError(Exception): + """All unexpected errors not classified otherwise.""" + + +class ProtocolError(InternalClientError): + """Unexpected condition in the handling of PostgreSQL protocol input.""" + + +class TargetServerAttributeNotMatched(InternalClientError): + """Could not find a host that satisfies the target attribute requirement""" + + +class OutdatedSchemaCacheError(InternalClientError): + """A value decoding error caused by a schema change before row fetching.""" + + def __init__(self, msg, *, schema=None, data_type=None, position=None): + super().__init__(msg) + self.schema_name = schema + self.data_type_name = data_type + self.position = position + + +class PostgresLogMessage(PostgresMessage): + """A base class for non-error server messages.""" + + def __str__(self): + return '{}: {}'.format(type(self).__name__, self.message) + + def __setattr__(self, name, val): + raise TypeError('instances of {} are immutable'.format( + type(self).__name__)) + + @classmethod + def new(cls, fields, query=None): + exccls, message_text, dct = cls._make_constructor(fields, query) + + if exccls is UnknownPostgresError: + exccls = PostgresLogMessage + + if exccls is PostgresLogMessage: + severity = dct.get('severity_en') or dct.get('severity') + if severity and severity.upper() == 'WARNING': + exccls = asyncpg.PostgresWarning + + if issubclass(exccls, (BaseException, Warning)): + msg = exccls(message_text) + else: + msg = exccls() + + msg.__dict__.update(dct) + return msg diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/introspection.py b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/introspection.py new file mode 100755 index 0000000..c3b4e60 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/introspection.py @@ -0,0 +1,296 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + +from __future__ import annotations + +import typing +from .protocol.protocol import _create_record # type: ignore + +if typing.TYPE_CHECKING: + from . import protocol + + +_TYPEINFO_13: typing.Final = '''\ + ( + SELECT + t.oid AS oid, + ns.nspname AS ns, + t.typname AS name, + t.typtype AS kind, + (CASE WHEN t.typtype = 'd' THEN + (WITH RECURSIVE typebases(oid, depth) AS ( + SELECT + t2.typbasetype AS oid, + 0 AS depth + FROM + pg_type t2 + WHERE + t2.oid = t.oid + + UNION ALL + + SELECT + t2.typbasetype AS oid, + tb.depth + 1 AS depth + FROM + pg_type t2, + typebases tb + WHERE + tb.oid = t2.oid + AND t2.typbasetype != 0 + ) SELECT oid FROM typebases ORDER BY depth DESC LIMIT 1) + + ELSE NULL + END) AS basetype, + t.typelem AS elemtype, + elem_t.typdelim AS elemdelim, + range_t.rngsubtype AS range_subtype, + (CASE WHEN t.typtype = 'c' THEN + (SELECT + array_agg(ia.atttypid ORDER BY ia.attnum) + FROM + pg_attribute ia + INNER JOIN pg_class c + ON (ia.attrelid = c.oid) + WHERE + ia.attnum > 0 AND NOT ia.attisdropped + AND c.reltype = t.oid) + + ELSE NULL + END) AS attrtypoids, + (CASE WHEN t.typtype = 'c' THEN + (SELECT + array_agg(ia.attname::text ORDER BY ia.attnum) + FROM + pg_attribute ia + INNER JOIN pg_class c + ON (ia.attrelid = c.oid) + WHERE + ia.attnum > 0 AND NOT ia.attisdropped + AND c.reltype = t.oid) + + ELSE NULL + END) AS attrnames + FROM + pg_catalog.pg_type AS t + INNER JOIN pg_catalog.pg_namespace ns ON ( + ns.oid = t.typnamespace) + LEFT JOIN pg_type elem_t ON ( + t.typlen = -1 AND + t.typelem != 0 AND + t.typelem = elem_t.oid + ) + LEFT JOIN pg_range range_t ON ( + t.oid = range_t.rngtypid + ) + ) +''' + + +INTRO_LOOKUP_TYPES_13 = '''\ +WITH RECURSIVE typeinfo_tree( + oid, ns, name, kind, basetype, elemtype, elemdelim, + range_subtype, attrtypoids, attrnames, depth) +AS ( + SELECT + ti.oid, ti.ns, ti.name, ti.kind, ti.basetype, + ti.elemtype, ti.elemdelim, ti.range_subtype, + ti.attrtypoids, ti.attrnames, 0 + FROM + {typeinfo} AS ti + WHERE + ti.oid = any($1::oid[]) + + UNION ALL + + SELECT + ti.oid, ti.ns, ti.name, ti.kind, ti.basetype, + ti.elemtype, ti.elemdelim, ti.range_subtype, + ti.attrtypoids, ti.attrnames, tt.depth + 1 + FROM + {typeinfo} ti, + typeinfo_tree tt + WHERE + (tt.elemtype IS NOT NULL AND ti.oid = tt.elemtype) + OR (tt.attrtypoids IS NOT NULL AND ti.oid = any(tt.attrtypoids)) + OR (tt.range_subtype IS NOT NULL AND ti.oid = tt.range_subtype) + OR (tt.basetype IS NOT NULL AND ti.oid = tt.basetype) +) + +SELECT DISTINCT + *, + basetype::regtype::text AS basetype_name, + elemtype::regtype::text AS elemtype_name, + range_subtype::regtype::text AS range_subtype_name +FROM + typeinfo_tree +ORDER BY + depth DESC +'''.format(typeinfo=_TYPEINFO_13) + + +_TYPEINFO: typing.Final = '''\ + ( + SELECT + t.oid AS oid, + ns.nspname AS ns, + t.typname AS name, + t.typtype AS kind, + (CASE WHEN t.typtype = 'd' THEN + (WITH RECURSIVE typebases(oid, depth) AS ( + SELECT + t2.typbasetype AS oid, + 0 AS depth + FROM + pg_type t2 + WHERE + t2.oid = t.oid + + UNION ALL + + SELECT + t2.typbasetype AS oid, + tb.depth + 1 AS depth + FROM + pg_type t2, + typebases tb + WHERE + tb.oid = t2.oid + AND t2.typbasetype != 0 + ) SELECT oid FROM typebases ORDER BY depth DESC LIMIT 1) + + ELSE NULL + END) AS basetype, + t.typelem AS elemtype, + elem_t.typdelim AS elemdelim, + COALESCE( + range_t.rngsubtype, + multirange_t.rngsubtype) AS range_subtype, + (CASE WHEN t.typtype = 'c' THEN + (SELECT + array_agg(ia.atttypid ORDER BY ia.attnum) + FROM + pg_attribute ia + INNER JOIN pg_class c + ON (ia.attrelid = c.oid) + WHERE + ia.attnum > 0 AND NOT ia.attisdropped + AND c.reltype = t.oid) + + ELSE NULL + END) AS attrtypoids, + (CASE WHEN t.typtype = 'c' THEN + (SELECT + array_agg(ia.attname::text ORDER BY ia.attnum) + FROM + pg_attribute ia + INNER JOIN pg_class c + ON (ia.attrelid = c.oid) + WHERE + ia.attnum > 0 AND NOT ia.attisdropped + AND c.reltype = t.oid) + + ELSE NULL + END) AS attrnames + FROM + pg_catalog.pg_type AS t + INNER JOIN pg_catalog.pg_namespace ns ON ( + ns.oid = t.typnamespace) + LEFT JOIN pg_type elem_t ON ( + t.typlen = -1 AND + t.typelem != 0 AND + t.typelem = elem_t.oid + ) + LEFT JOIN pg_range range_t ON ( + t.oid = range_t.rngtypid + ) + LEFT JOIN pg_range multirange_t ON ( + t.oid = multirange_t.rngmultitypid + ) + ) +''' + + +INTRO_LOOKUP_TYPES = '''\ +WITH RECURSIVE typeinfo_tree( + oid, ns, name, kind, basetype, elemtype, elemdelim, + range_subtype, attrtypoids, attrnames, depth) +AS ( + SELECT + ti.oid, ti.ns, ti.name, ti.kind, ti.basetype, + ti.elemtype, ti.elemdelim, ti.range_subtype, + ti.attrtypoids, ti.attrnames, 0 + FROM + {typeinfo} AS ti + WHERE + ti.oid = any($1::oid[]) + + UNION ALL + + SELECT + ti.oid, ti.ns, ti.name, ti.kind, ti.basetype, + ti.elemtype, ti.elemdelim, ti.range_subtype, + ti.attrtypoids, ti.attrnames, tt.depth + 1 + FROM + {typeinfo} ti, + typeinfo_tree tt + WHERE + (tt.elemtype IS NOT NULL AND ti.oid = tt.elemtype) + OR (tt.attrtypoids IS NOT NULL AND ti.oid = any(tt.attrtypoids)) + OR (tt.range_subtype IS NOT NULL AND ti.oid = tt.range_subtype) + OR (tt.basetype IS NOT NULL AND ti.oid = tt.basetype) +) + +SELECT DISTINCT + *, + basetype::regtype::text AS basetype_name, + elemtype::regtype::text AS elemtype_name, + range_subtype::regtype::text AS range_subtype_name +FROM + typeinfo_tree +ORDER BY + depth DESC +'''.format(typeinfo=_TYPEINFO) + + +TYPE_BY_NAME: typing.Final = '''\ +SELECT + t.oid, + t.typelem AS elemtype, + t.typtype AS kind +FROM + pg_catalog.pg_type AS t + INNER JOIN pg_catalog.pg_namespace ns ON (ns.oid = t.typnamespace) +WHERE + t.typname = $1 AND ns.nspname = $2 +''' + + +def TypeRecord( + rec: typing.Tuple[int, typing.Optional[int], bytes], +) -> protocol.Record: + assert len(rec) == 3 + return _create_record( # type: ignore + {"oid": 0, "elemtype": 1, "kind": 2}, rec) + + +# 'b' for a base type, 'd' for a domain, 'e' for enum. +SCALAR_TYPE_KINDS = (b'b', b'd', b'e') + + +def is_scalar_type(typeinfo: protocol.Record) -> bool: + return ( + typeinfo['kind'] in SCALAR_TYPE_KINDS and + not typeinfo['elemtype'] + ) + + +def is_domain_type(typeinfo: protocol.Record) -> bool: + return typeinfo['kind'] == b'd' # type: ignore[no-any-return] + + +def is_composite_type(typeinfo: protocol.Record) -> bool: + return typeinfo['kind'] == b'c' # type: ignore[no-any-return] diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/__init__.pxd b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/__init__.pxd new file mode 100755 index 0000000..1df403c --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/__init__.pxd @@ -0,0 +1,5 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/__init__.py b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/__init__.py new file mode 100755 index 0000000..1df403c --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/__init__.py @@ -0,0 +1,5 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/buffer.pxd b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/buffer.pxd new file mode 100755 index 0000000..05d62bf --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/buffer.pxd @@ -0,0 +1,143 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +from libc.stdint cimport int8_t, uint8_t, int16_t, uint16_t, \ + int32_t, uint32_t, int64_t, uint64_t + + +include "./buffer.pxi" + + +cdef class WriteBuffer: + cdef: + # Preallocated small buffer + bint _smallbuf_inuse + char _smallbuf[_BUFFER_INITIAL_SIZE] + + char *_buf + + # Allocated size + ssize_t _size + + # Length of data in the buffer + ssize_t _length + + # Number of memoryviews attached to the buffer + int _view_count + + # True is start_message was used + bint _message_mode + + cdef inline len(self): + return self._length + + cdef inline write_len_prefixed_utf8(self, str s): + return self.write_len_prefixed_bytes(s.encode('utf-8')) + + cdef inline _check_readonly(self) + cdef inline _ensure_alloced(self, ssize_t extra_length) + cdef _reallocate(self, ssize_t new_size) + cdef inline reset(self) + cdef inline start_message(self, char type) + cdef inline end_message(self) + cdef write_buffer(self, WriteBuffer buf) + cdef write_byte(self, char b) + cdef write_bytes(self, bytes data) + cdef write_len_prefixed_buffer(self, WriteBuffer buf) + cdef write_len_prefixed_bytes(self, bytes data) + cdef write_bytestring(self, bytes string) + cdef write_str(self, str string, str encoding) + cdef write_frbuf(self, FRBuffer *buf) + cdef write_cstr(self, const char *data, ssize_t len) + cdef write_int16(self, int16_t i) + cdef write_int32(self, int32_t i) + cdef write_int64(self, int64_t i) + cdef write_float(self, float f) + cdef write_double(self, double d) + + @staticmethod + cdef WriteBuffer new_message(char type) + + @staticmethod + cdef WriteBuffer new() + + +ctypedef const char * (*try_consume_message_method)(object, ssize_t*) +ctypedef int32_t (*take_message_type_method)(object, char) except -1 +ctypedef int32_t (*take_message_method)(object) except -1 +ctypedef char (*get_message_type_method)(object) + + +cdef class ReadBuffer: + cdef: + # A deque of buffers (bytes objects) + object _bufs + object _bufs_append + object _bufs_popleft + + # A pointer to the first buffer in `_bufs` + bytes _buf0 + + # A pointer to the previous first buffer + # (used to prolong the life of _buf0 when using + # methods like _try_read_bytes) + bytes _buf0_prev + + # Number of buffers in `_bufs` + int32_t _bufs_len + + # A read position in the first buffer in `_bufs` + ssize_t _pos0 + + # Length of the first buffer in `_bufs` + ssize_t _len0 + + # A total number of buffered bytes in ReadBuffer + ssize_t _length + + char _current_message_type + int32_t _current_message_len + ssize_t _current_message_len_unread + bint _current_message_ready + + cdef inline len(self): + return self._length + + cdef inline char get_message_type(self): + return self._current_message_type + + cdef inline int32_t get_message_length(self): + return self._current_message_len + + cdef feed_data(self, data) + cdef inline _ensure_first_buf(self) + cdef _switch_to_next_buf(self) + cdef inline char read_byte(self) except? -1 + cdef inline const char* _try_read_bytes(self, ssize_t nbytes) + cdef inline _read_into(self, char *buf, ssize_t nbytes) + cdef inline _read_and_discard(self, ssize_t nbytes) + cdef bytes read_bytes(self, ssize_t nbytes) + cdef bytes read_len_prefixed_bytes(self) + cdef str read_len_prefixed_utf8(self) + cdef read_uuid(self) + cdef inline int64_t read_int64(self) except? -1 + cdef inline int32_t read_int32(self) except? -1 + cdef inline int16_t read_int16(self) except? -1 + cdef inline read_null_str(self) + cdef int32_t take_message(self) except -1 + cdef inline int32_t take_message_type(self, char mtype) except -1 + cdef int32_t put_message(self) except -1 + cdef inline const char* try_consume_message(self, ssize_t* len) + cdef bytes consume_message(self) + cdef discard_message(self) + cdef int32_t redirect_messages(self, WriteBuffer buf, char mtype, int stop_at=?) + cdef bytearray consume_messages(self, char mtype) + cdef finish_message(self) + cdef inline _finish_message(self) + + @staticmethod + cdef ReadBuffer new_message_parser(object data) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/buffer.pxi b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/buffer.pxi new file mode 100755 index 0000000..626880e --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/buffer.pxi @@ -0,0 +1,3 @@ +DEF _BUFFER_INITIAL_SIZE = 1024 +DEF _BUFFER_MAX_GROW = 65536 +DEF _BUFFER_FREELIST_SIZE = 256 diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/buffer.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/buffer.pyx new file mode 100755 index 0000000..462a51f --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/buffer.pyx @@ -0,0 +1,829 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +from libc.string cimport memcpy + +import collections + +class BufferError(Exception): + pass + +include "./buffer.pxi" + +@cython.no_gc_clear +@cython.final +@cython.freelist(_BUFFER_FREELIST_SIZE) +cdef class WriteBuffer: + + def __cinit__(self): + self._smallbuf_inuse = True + self._buf = self._smallbuf + self._size = _BUFFER_INITIAL_SIZE + self._length = 0 + self._message_mode = 0 + + def __dealloc__(self): + if self._buf is not NULL and not self._smallbuf_inuse: + cpython.PyMem_Free(self._buf) + self._buf = NULL + self._size = 0 + + if self._view_count: + raise BufferError( + 'Deallocating buffer with attached memoryviews') + + def __getbuffer__(self, Py_buffer *buffer, int flags): + self._view_count += 1 + + cpython.PyBuffer_FillInfo( + buffer, self, self._buf, self._length, + 1, # read-only + flags) + + def __releasebuffer__(self, Py_buffer *buffer): + self._view_count -= 1 + + cdef inline _check_readonly(self): + if self._view_count: + raise BufferError('the buffer is in read-only mode') + + cdef inline _ensure_alloced(self, ssize_t extra_length): + cdef ssize_t new_size = extra_length + self._length + + if new_size > self._size: + self._reallocate(new_size) + + cdef _reallocate(self, ssize_t new_size): + cdef char *new_buf + + if new_size < _BUFFER_MAX_GROW: + new_size = _BUFFER_MAX_GROW + else: + # Add a little extra + new_size += _BUFFER_INITIAL_SIZE + + if self._smallbuf_inuse: + new_buf = cpython.PyMem_Malloc( + sizeof(char) * new_size) + if new_buf is NULL: + self._buf = NULL + self._size = 0 + self._length = 0 + raise MemoryError + memcpy(new_buf, self._buf, self._size) + self._size = new_size + self._buf = new_buf + self._smallbuf_inuse = False + else: + new_buf = cpython.PyMem_Realloc( + self._buf, new_size) + if new_buf is NULL: + cpython.PyMem_Free(self._buf) + self._buf = NULL + self._size = 0 + self._length = 0 + raise MemoryError + self._buf = new_buf + self._size = new_size + + cdef inline start_message(self, char type): + if self._length != 0: + raise BufferError( + 'cannot start_message for a non-empty buffer') + self._ensure_alloced(5) + self._message_mode = 1 + self._buf[0] = type + self._length = 5 + + cdef inline end_message(self): + # "length-1" to exclude the message type byte + cdef ssize_t mlen = self._length - 1 + + self._check_readonly() + if not self._message_mode: + raise BufferError( + 'end_message can only be called with start_message') + if self._length < 5: + raise BufferError('end_message: buffer is too small') + if mlen > _MAXINT32: + raise BufferError('end_message: message is too large') + + hton.pack_int32(&self._buf[1], mlen) + return self + + cdef inline reset(self): + self._length = 0 + self._message_mode = 0 + + cdef write_buffer(self, WriteBuffer buf): + self._check_readonly() + + if not buf._length: + return + + self._ensure_alloced(buf._length) + memcpy(self._buf + self._length, + buf._buf, + buf._length) + self._length += buf._length + + cdef write_byte(self, char b): + self._check_readonly() + + self._ensure_alloced(1) + self._buf[self._length] = b + self._length += 1 + + cdef write_bytes(self, bytes data): + cdef char* buf + cdef ssize_t len + + cpython.PyBytes_AsStringAndSize(data, &buf, &len) + self.write_cstr(buf, len) + + cdef write_bytestring(self, bytes string): + cdef char* buf + cdef ssize_t len + + cpython.PyBytes_AsStringAndSize(string, &buf, &len) + # PyBytes_AsStringAndSize returns a null-terminated buffer, + # but the null byte is not counted in len. hence the + 1 + self.write_cstr(buf, len + 1) + + cdef write_str(self, str string, str encoding): + self.write_bytestring(string.encode(encoding)) + + cdef write_len_prefixed_buffer(self, WriteBuffer buf): + # Write a length-prefixed (not NULL-terminated) bytes sequence. + self.write_int32(buf.len()) + self.write_buffer(buf) + + cdef write_len_prefixed_bytes(self, bytes data): + # Write a length-prefixed (not NULL-terminated) bytes sequence. + cdef: + char *buf + ssize_t size + + cpython.PyBytes_AsStringAndSize(data, &buf, &size) + if size > _MAXINT32: + raise BufferError('string is too large') + # `size` does not account for the NULL at the end. + self.write_int32(size) + self.write_cstr(buf, size) + + cdef write_frbuf(self, FRBuffer *buf): + cdef: + ssize_t buf_len = buf.len + if buf_len > 0: + self.write_cstr(frb_read_all(buf), buf_len) + + cdef write_cstr(self, const char *data, ssize_t len): + self._check_readonly() + self._ensure_alloced(len) + + memcpy(self._buf + self._length, data, len) + self._length += len + + cdef write_int16(self, int16_t i): + self._check_readonly() + self._ensure_alloced(2) + + hton.pack_int16(&self._buf[self._length], i) + self._length += 2 + + cdef write_int32(self, int32_t i): + self._check_readonly() + self._ensure_alloced(4) + + hton.pack_int32(&self._buf[self._length], i) + self._length += 4 + + cdef write_int64(self, int64_t i): + self._check_readonly() + self._ensure_alloced(8) + + hton.pack_int64(&self._buf[self._length], i) + self._length += 8 + + cdef write_float(self, float f): + self._check_readonly() + self._ensure_alloced(4) + + hton.pack_float(&self._buf[self._length], f) + self._length += 4 + + cdef write_double(self, double d): + self._check_readonly() + self._ensure_alloced(8) + + hton.pack_double(&self._buf[self._length], d) + self._length += 8 + + @staticmethod + cdef WriteBuffer new_message(char type): + cdef WriteBuffer buf + buf = WriteBuffer.__new__(WriteBuffer) + buf.start_message(type) + return buf + + @staticmethod + cdef WriteBuffer new(): + cdef WriteBuffer buf + buf = WriteBuffer.__new__(WriteBuffer) + return buf + + +@cython.no_gc_clear +@cython.final +@cython.freelist(_BUFFER_FREELIST_SIZE) +cdef class ReadBuffer: + + def __cinit__(self): + self._bufs = collections.deque() + self._bufs_append = self._bufs.append + self._bufs_popleft = self._bufs.popleft + self._bufs_len = 0 + self._buf0 = None + self._buf0_prev = None + self._pos0 = 0 + self._len0 = 0 + self._length = 0 + + self._current_message_type = 0 + self._current_message_len = 0 + self._current_message_len_unread = 0 + self._current_message_ready = 0 + + cdef feed_data(self, data): + cdef: + ssize_t dlen + bytes data_bytes + + if not cpython.PyBytes_CheckExact(data): + if cpythonx.PyByteArray_CheckExact(data): + # ProactorEventLoop in Python 3.10+ seems to be sending + # bytearray objects instead of bytes. Handle this here + # to avoid duplicating this check in every data_received(). + data = bytes(data) + else: + raise BufferError( + 'feed_data: a bytes or bytearray object expected') + + # Uncomment the below code to test code paths that + # read single int/str/bytes sequences are split over + # multiple received buffers. + # + # ll = 107 + # if len(data) > ll: + # self.feed_data(data[:ll]) + # self.feed_data(data[ll:]) + # return + + data_bytes = data + + dlen = cpython.Py_SIZE(data_bytes) + if dlen == 0: + # EOF? + return + + self._bufs_append(data_bytes) + self._length += dlen + + if self._bufs_len == 0: + # First buffer + self._len0 = dlen + self._buf0 = data_bytes + + self._bufs_len += 1 + + cdef inline _ensure_first_buf(self): + if PG_DEBUG: + if self._len0 == 0: + raise BufferError('empty first buffer') + if self._length == 0: + raise BufferError('empty buffer') + + if self._pos0 == self._len0: + self._switch_to_next_buf() + + cdef _switch_to_next_buf(self): + # The first buffer is fully read, discard it + self._bufs_popleft() + self._bufs_len -= 1 + + # Shouldn't fail, since we've checked that `_length >= 1` + # in _ensure_first_buf() + self._buf0_prev = self._buf0 + self._buf0 = self._bufs[0] + + self._pos0 = 0 + self._len0 = len(self._buf0) + + if PG_DEBUG: + if self._len0 < 1: + raise BufferError( + 'debug: second buffer of ReadBuffer is empty') + + cdef inline const char* _try_read_bytes(self, ssize_t nbytes): + # Try to read *nbytes* from the first buffer. + # + # Returns pointer to data if there is at least *nbytes* + # in the buffer, NULL otherwise. + # + # Important: caller must call _ensure_first_buf() prior + # to calling try_read_bytes, and must not overread + + cdef: + const char *result + + if PG_DEBUG: + if nbytes > self._length: + return NULL + + if self._current_message_ready: + if self._current_message_len_unread < nbytes: + return NULL + + if self._pos0 + nbytes <= self._len0: + result = cpython.PyBytes_AS_STRING(self._buf0) + result += self._pos0 + self._pos0 += nbytes + self._length -= nbytes + if self._current_message_ready: + self._current_message_len_unread -= nbytes + return result + else: + return NULL + + cdef inline _read_into(self, char *buf, ssize_t nbytes): + cdef: + ssize_t nread + char *buf0 + + while True: + buf0 = cpython.PyBytes_AS_STRING(self._buf0) + + if self._pos0 + nbytes > self._len0: + nread = self._len0 - self._pos0 + memcpy(buf, buf0 + self._pos0, nread) + self._pos0 = self._len0 + self._length -= nread + nbytes -= nread + buf += nread + self._ensure_first_buf() + + else: + memcpy(buf, buf0 + self._pos0, nbytes) + self._pos0 += nbytes + self._length -= nbytes + break + + cdef inline _read_and_discard(self, ssize_t nbytes): + cdef: + ssize_t nread + + self._ensure_first_buf() + while True: + if self._pos0 + nbytes > self._len0: + nread = self._len0 - self._pos0 + self._pos0 = self._len0 + self._length -= nread + nbytes -= nread + self._ensure_first_buf() + + else: + self._pos0 += nbytes + self._length -= nbytes + break + + cdef bytes read_bytes(self, ssize_t nbytes): + cdef: + bytes result + ssize_t nread + const char *cbuf + char *buf + + self._ensure_first_buf() + cbuf = self._try_read_bytes(nbytes) + if cbuf != NULL: + return cpython.PyBytes_FromStringAndSize(cbuf, nbytes) + + if nbytes > self._length: + raise BufferError( + 'not enough data to read {} bytes'.format(nbytes)) + + if self._current_message_ready: + self._current_message_len_unread -= nbytes + if self._current_message_len_unread < 0: + raise BufferError('buffer overread') + + result = cpython.PyBytes_FromStringAndSize(NULL, nbytes) + buf = cpython.PyBytes_AS_STRING(result) + self._read_into(buf, nbytes) + return result + + cdef bytes read_len_prefixed_bytes(self): + cdef int32_t size = self.read_int32() + if size < 0: + raise BufferError( + 'negative length for a len-prefixed bytes value') + if size == 0: + return b'' + return self.read_bytes(size) + + cdef str read_len_prefixed_utf8(self): + cdef: + int32_t size + const char *cbuf + + size = self.read_int32() + if size < 0: + raise BufferError( + 'negative length for a len-prefixed bytes value') + + if size == 0: + return '' + + self._ensure_first_buf() + cbuf = self._try_read_bytes(size) + if cbuf != NULL: + return cpython.PyUnicode_DecodeUTF8(cbuf, size, NULL) + else: + return self.read_bytes(size).decode('utf-8') + + cdef read_uuid(self): + cdef: + bytes mem + const char *cbuf + + self._ensure_first_buf() + cbuf = self._try_read_bytes(16) + if cbuf != NULL: + return pg_uuid_from_buf(cbuf) + else: + return pg_UUID(self.read_bytes(16)) + + cdef inline char read_byte(self) except? -1: + cdef const char *first_byte + + if PG_DEBUG: + if not self._buf0: + raise BufferError( + 'debug: first buffer of ReadBuffer is empty') + + self._ensure_first_buf() + first_byte = self._try_read_bytes(1) + if first_byte is NULL: + raise BufferError('not enough data to read one byte') + + return first_byte[0] + + cdef inline int64_t read_int64(self) except? -1: + cdef: + bytes mem + const char *cbuf + + self._ensure_first_buf() + cbuf = self._try_read_bytes(8) + if cbuf != NULL: + return hton.unpack_int64(cbuf) + else: + mem = self.read_bytes(8) + return hton.unpack_int64(cpython.PyBytes_AS_STRING(mem)) + + cdef inline int32_t read_int32(self) except? -1: + cdef: + bytes mem + const char *cbuf + + self._ensure_first_buf() + cbuf = self._try_read_bytes(4) + if cbuf != NULL: + return hton.unpack_int32(cbuf) + else: + mem = self.read_bytes(4) + return hton.unpack_int32(cpython.PyBytes_AS_STRING(mem)) + + cdef inline int16_t read_int16(self) except? -1: + cdef: + bytes mem + const char *cbuf + + self._ensure_first_buf() + cbuf = self._try_read_bytes(2) + if cbuf != NULL: + return hton.unpack_int16(cbuf) + else: + mem = self.read_bytes(2) + return hton.unpack_int16(cpython.PyBytes_AS_STRING(mem)) + + cdef inline read_null_str(self): + if not self._current_message_ready: + raise BufferError( + 'read_null_str only works when the message guaranteed ' + 'to be in the buffer') + + cdef: + ssize_t pos + ssize_t nread + bytes result + const char *buf + const char *buf_start + + self._ensure_first_buf() + + buf_start = cpython.PyBytes_AS_STRING(self._buf0) + buf = buf_start + self._pos0 + while buf - buf_start < self._len0: + if buf[0] == 0: + pos = buf - buf_start + nread = pos - self._pos0 + buf = self._try_read_bytes(nread + 1) + if buf != NULL: + return cpython.PyBytes_FromStringAndSize(buf, nread) + else: + break + else: + buf += 1 + + result = b'' + while True: + pos = self._buf0.find(b'\x00', self._pos0) + if pos >= 0: + result += self._buf0[self._pos0 : pos] + nread = pos - self._pos0 + 1 + self._pos0 = pos + 1 + self._length -= nread + + self._current_message_len_unread -= nread + if self._current_message_len_unread < 0: + raise BufferError( + 'read_null_str: buffer overread') + + return result + + else: + result += self._buf0[self._pos0:] + nread = self._len0 - self._pos0 + self._pos0 = self._len0 + self._length -= nread + + self._current_message_len_unread -= nread + if self._current_message_len_unread < 0: + raise BufferError( + 'read_null_str: buffer overread') + + self._ensure_first_buf() + + cdef int32_t take_message(self) except -1: + cdef: + const char *cbuf + + if self._current_message_ready: + return 1 + + if self._current_message_type == 0: + if self._length < 1: + return 0 + self._ensure_first_buf() + cbuf = self._try_read_bytes(1) + if cbuf == NULL: + raise BufferError( + 'failed to read one byte on a non-empty buffer') + self._current_message_type = cbuf[0] + + if self._current_message_len == 0: + if self._length < 4: + return 0 + + self._ensure_first_buf() + cbuf = self._try_read_bytes(4) + if cbuf != NULL: + self._current_message_len = hton.unpack_int32(cbuf) + else: + self._current_message_len = self.read_int32() + + self._current_message_len_unread = self._current_message_len - 4 + + if self._length < self._current_message_len_unread: + return 0 + + self._current_message_ready = 1 + return 1 + + cdef inline int32_t take_message_type(self, char mtype) except -1: + cdef const char *buf0 + + if self._current_message_ready: + return self._current_message_type == mtype + elif self._length >= 1: + self._ensure_first_buf() + buf0 = cpython.PyBytes_AS_STRING(self._buf0) + + return buf0[self._pos0] == mtype and self.take_message() + else: + return 0 + + cdef int32_t put_message(self) except -1: + if not self._current_message_ready: + raise BufferError( + 'cannot put message: no message taken') + self._current_message_ready = False + return 0 + + cdef inline const char* try_consume_message(self, ssize_t* len): + cdef: + ssize_t buf_len + const char *buf + + if not self._current_message_ready: + return NULL + + self._ensure_first_buf() + buf_len = self._current_message_len_unread + buf = self._try_read_bytes(buf_len) + if buf != NULL: + len[0] = buf_len + self._finish_message() + return buf + + cdef discard_message(self): + if not self._current_message_ready: + raise BufferError('no message to discard') + if self._current_message_len_unread > 0: + self._read_and_discard(self._current_message_len_unread) + self._current_message_len_unread = 0 + self._finish_message() + + cdef bytes consume_message(self): + if not self._current_message_ready: + raise BufferError('no message to consume') + if self._current_message_len_unread > 0: + mem = self.read_bytes(self._current_message_len_unread) + else: + mem = b'' + self._finish_message() + return mem + + cdef int32_t redirect_messages(self, WriteBuffer buf, char mtype, + int stop_at=0): + # Redirects messages from self into buf until either + # a message with a type different than mtype is encountered, or + # buf contains stop_at bytes. + # Returns the number of messages redirected. + + if not self._current_message_ready: + raise BufferError( + 'consume_full_messages called on a buffer without a ' + 'complete first message') + if mtype != self._current_message_type: + raise BufferError( + 'consume_full_messages called with a wrong mtype') + if self._current_message_len_unread != self._current_message_len - 4: + raise BufferError( + 'consume_full_messages called on a partially read message') + + cdef: + const char* cbuf + ssize_t cbuf_len + int32_t msg_len + ssize_t new_pos0 + ssize_t pos_delta + int32_t done + int32_t count + + count = 0 + while True: + count += 1 + buf.write_byte(mtype) + buf.write_int32(self._current_message_len) + + cbuf = self.try_consume_message(&cbuf_len) + if cbuf != NULL: + buf.write_cstr(cbuf, cbuf_len) + else: + buf.write_bytes(self.consume_message()) + + if self._length > 0: + self._ensure_first_buf() + else: + return count + + if stop_at and buf._length >= stop_at: + return count + + # Fast path: exhaust buf0 as efficiently as possible. + if self._pos0 + 5 <= self._len0: + cbuf = cpython.PyBytes_AS_STRING(self._buf0) + new_pos0 = self._pos0 + cbuf_len = self._len0 + + done = 0 + # Scan the first buffer and find the position of the + # end of the last "mtype" message. + while new_pos0 + 5 <= cbuf_len: + if (cbuf + new_pos0)[0] != mtype: + done = 1 + break + if (stop_at and + (buf._length + new_pos0 - self._pos0) > stop_at): + done = 1 + break + msg_len = hton.unpack_int32(cbuf + new_pos0 + 1) + 1 + if new_pos0 + msg_len > cbuf_len: + break + new_pos0 += msg_len + count += 1 + + if new_pos0 != self._pos0: + assert self._pos0 < new_pos0 <= self._len0 + + pos_delta = new_pos0 - self._pos0 + buf.write_cstr( + cbuf + self._pos0, + pos_delta + ) + + self._pos0 = new_pos0 + self._length -= pos_delta + + assert self._length >= 0 + + if done: + # The next message is of a different type. + return count + + # Back to slow path. + if not self.take_message_type(mtype): + return count + + cdef bytearray consume_messages(self, char mtype): + """Consume consecutive messages of the same type.""" + cdef: + char *buf + ssize_t nbytes + ssize_t total_bytes = 0 + bytearray result + + if not self.take_message_type(mtype): + return None + + # consume_messages is a volume-oriented method, so + # we assume that the remainder of the buffer will contain + # messages of the requested type. + result = cpythonx.PyByteArray_FromStringAndSize(NULL, self._length) + buf = cpythonx.PyByteArray_AsString(result) + + while self.take_message_type(mtype): + self._ensure_first_buf() + nbytes = self._current_message_len_unread + self._read_into(buf, nbytes) + buf += nbytes + total_bytes += nbytes + self._finish_message() + + # Clamp the result to an actual size read. + cpythonx.PyByteArray_Resize(result, total_bytes) + + return result + + cdef finish_message(self): + if self._current_message_type == 0 or not self._current_message_ready: + # The message has already been finished (e.g by consume_message()), + # or has been put back by put_message(). + return + + if self._current_message_len_unread: + if PG_DEBUG: + mtype = chr(self._current_message_type) + + discarded = self.consume_message() + + if PG_DEBUG: + print('!!! discarding message {!r} unread data: {!r}'.format( + mtype, + discarded)) + + self._finish_message() + + cdef inline _finish_message(self): + self._current_message_type = 0 + self._current_message_len = 0 + self._current_message_ready = 0 + self._current_message_len_unread = 0 + + @staticmethod + cdef ReadBuffer new_message_parser(object data): + cdef ReadBuffer buf + + buf = ReadBuffer.__new__(ReadBuffer) + buf.feed_data(data) + + buf._current_message_ready = 1 + buf._current_message_len_unread = buf._len0 + + return buf diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/__init__.pxd b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/__init__.pxd new file mode 100755 index 0000000..67e20b8 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/__init__.pxd @@ -0,0 +1,159 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cdef class CodecContext: + + cpdef get_text_codec(self) + cdef is_encoding_utf8(self) + cpdef get_json_decoder(self) + cdef is_decoding_json(self) + cpdef get_json_encoder(self) + cdef is_encoding_json(self) + + +ctypedef object (*encode_func)(CodecContext settings, + WriteBuffer buf, + object obj) + +ctypedef object (*decode_func)(CodecContext settings, + FRBuffer *buf) + + +# Datetime +cdef date_encode(CodecContext settings, WriteBuffer buf, obj) +cdef date_decode(CodecContext settings, FRBuffer * buf) +cdef date_encode_tuple(CodecContext settings, WriteBuffer buf, obj) +cdef date_decode_tuple(CodecContext settings, FRBuffer * buf) +cdef timestamp_encode(CodecContext settings, WriteBuffer buf, obj) +cdef timestamp_decode(CodecContext settings, FRBuffer * buf) +cdef timestamp_encode_tuple(CodecContext settings, WriteBuffer buf, obj) +cdef timestamp_decode_tuple(CodecContext settings, FRBuffer * buf) +cdef timestamptz_encode(CodecContext settings, WriteBuffer buf, obj) +cdef timestamptz_decode(CodecContext settings, FRBuffer * buf) +cdef time_encode(CodecContext settings, WriteBuffer buf, obj) +cdef time_decode(CodecContext settings, FRBuffer * buf) +cdef time_encode_tuple(CodecContext settings, WriteBuffer buf, obj) +cdef time_decode_tuple(CodecContext settings, FRBuffer * buf) +cdef timetz_encode(CodecContext settings, WriteBuffer buf, obj) +cdef timetz_decode(CodecContext settings, FRBuffer * buf) +cdef timetz_encode_tuple(CodecContext settings, WriteBuffer buf, obj) +cdef timetz_decode_tuple(CodecContext settings, FRBuffer * buf) +cdef interval_encode(CodecContext settings, WriteBuffer buf, obj) +cdef interval_decode(CodecContext settings, FRBuffer * buf) +cdef interval_encode_tuple(CodecContext settings, WriteBuffer buf, tuple obj) +cdef interval_decode_tuple(CodecContext settings, FRBuffer * buf) + + +# Bits +cdef bits_encode(CodecContext settings, WriteBuffer wbuf, obj) +cdef bits_decode(CodecContext settings, FRBuffer * buf) + + +# Bools +cdef bool_encode(CodecContext settings, WriteBuffer buf, obj) +cdef bool_decode(CodecContext settings, FRBuffer * buf) + + +# Geometry +cdef box_encode(CodecContext settings, WriteBuffer wbuf, obj) +cdef box_decode(CodecContext settings, FRBuffer * buf) +cdef line_encode(CodecContext settings, WriteBuffer wbuf, obj) +cdef line_decode(CodecContext settings, FRBuffer * buf) +cdef lseg_encode(CodecContext settings, WriteBuffer wbuf, obj) +cdef lseg_decode(CodecContext settings, FRBuffer * buf) +cdef point_encode(CodecContext settings, WriteBuffer wbuf, obj) +cdef point_decode(CodecContext settings, FRBuffer * buf) +cdef path_encode(CodecContext settings, WriteBuffer wbuf, obj) +cdef path_decode(CodecContext settings, FRBuffer * buf) +cdef poly_encode(CodecContext settings, WriteBuffer wbuf, obj) +cdef poly_decode(CodecContext settings, FRBuffer * buf) +cdef circle_encode(CodecContext settings, WriteBuffer wbuf, obj) +cdef circle_decode(CodecContext settings, FRBuffer * buf) + + +# Hstore +cdef hstore_encode(CodecContext settings, WriteBuffer buf, obj) +cdef hstore_decode(CodecContext settings, FRBuffer * buf) + + +# Ints +cdef int2_encode(CodecContext settings, WriteBuffer buf, obj) +cdef int2_decode(CodecContext settings, FRBuffer * buf) +cdef int4_encode(CodecContext settings, WriteBuffer buf, obj) +cdef int4_decode(CodecContext settings, FRBuffer * buf) +cdef uint4_encode(CodecContext settings, WriteBuffer buf, obj) +cdef uint4_decode(CodecContext settings, FRBuffer * buf) +cdef int8_encode(CodecContext settings, WriteBuffer buf, obj) +cdef int8_decode(CodecContext settings, FRBuffer * buf) +cdef uint8_encode(CodecContext settings, WriteBuffer buf, obj) +cdef uint8_decode(CodecContext settings, FRBuffer * buf) + + +# Floats +cdef float4_encode(CodecContext settings, WriteBuffer buf, obj) +cdef float4_decode(CodecContext settings, FRBuffer * buf) +cdef float8_encode(CodecContext settings, WriteBuffer buf, obj) +cdef float8_decode(CodecContext settings, FRBuffer * buf) + + +# JSON +cdef jsonb_encode(CodecContext settings, WriteBuffer buf, obj) +cdef jsonb_decode(CodecContext settings, FRBuffer * buf) +cdef json_encode(CodecContext settings, WriteBuffer buf, obj) +cdef json_decode(CodecContext settings, FRBuffer *buf) + + +# JSON path +cdef jsonpath_encode(CodecContext settings, WriteBuffer buf, obj) +cdef jsonpath_decode(CodecContext settings, FRBuffer * buf) + + +# Text +cdef as_pg_string_and_size( + CodecContext settings, obj, char **cstr, ssize_t *size) +cdef text_encode(CodecContext settings, WriteBuffer buf, obj) +cdef text_decode(CodecContext settings, FRBuffer * buf) + +# Bytea +cdef bytea_encode(CodecContext settings, WriteBuffer wbuf, obj) +cdef bytea_decode(CodecContext settings, FRBuffer * buf) + + +# UUID +cdef uuid_encode(CodecContext settings, WriteBuffer wbuf, obj) +cdef uuid_decode(CodecContext settings, FRBuffer * buf) + + +# Numeric +cdef numeric_encode_text(CodecContext settings, WriteBuffer buf, obj) +cdef numeric_decode_text(CodecContext settings, FRBuffer * buf) +cdef numeric_encode_binary(CodecContext settings, WriteBuffer buf, obj) +cdef numeric_decode_binary(CodecContext settings, FRBuffer * buf) +cdef numeric_decode_binary_ex(CodecContext settings, FRBuffer * buf, + bint trail_fract_zero) + + +# Void +cdef void_encode(CodecContext settings, WriteBuffer buf, obj) +cdef void_decode(CodecContext settings, FRBuffer * buf) + + +# tid +cdef tid_encode(CodecContext settings, WriteBuffer buf, obj) +cdef tid_decode(CodecContext settings, FRBuffer * buf) + + +# Network +cdef cidr_encode(CodecContext settings, WriteBuffer buf, obj) +cdef cidr_decode(CodecContext settings, FRBuffer * buf) +cdef inet_encode(CodecContext settings, WriteBuffer buf, obj) +cdef inet_decode(CodecContext settings, FRBuffer * buf) + + +# pg_snapshot +cdef pg_snapshot_encode(CodecContext settings, WriteBuffer buf, obj) +cdef pg_snapshot_decode(CodecContext settings, FRBuffer * buf) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/bits.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/bits.pyx new file mode 100755 index 0000000..14f7bb0 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/bits.pyx @@ -0,0 +1,47 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cdef bits_encode(CodecContext settings, WriteBuffer wbuf, obj): + cdef: + Py_buffer pybuf + bint pybuf_used = False + char *buf + ssize_t len + ssize_t bitlen + + if cpython.PyBytes_CheckExact(obj): + buf = cpython.PyBytes_AS_STRING(obj) + len = cpython.Py_SIZE(obj) + bitlen = len * 8 + elif isinstance(obj, pgproto_types.BitString): + cpython.PyBytes_AsStringAndSize(obj.bytes, &buf, &len) + bitlen = obj.__len__() + else: + cpython.PyObject_GetBuffer(obj, &pybuf, cpython.PyBUF_SIMPLE) + pybuf_used = True + buf = pybuf.buf + len = pybuf.len + bitlen = len * 8 + + try: + if bitlen > _MAXINT32: + raise ValueError('bit value too long') + wbuf.write_int32(4 + len) + wbuf.write_int32(bitlen) + wbuf.write_cstr(buf, len) + finally: + if pybuf_used: + cpython.PyBuffer_Release(&pybuf) + + +cdef bits_decode(CodecContext settings, FRBuffer *buf): + cdef: + int32_t bitlen = hton.unpack_int32(frb_read(buf, 4)) + ssize_t buf_len = buf.len + + bytes_ = cpython.PyBytes_FromStringAndSize(frb_read_all(buf), buf_len) + return pgproto_types.BitString.frombytes(bytes_, bitlen) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/bytea.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/bytea.pyx new file mode 100755 index 0000000..1581825 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/bytea.pyx @@ -0,0 +1,34 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cdef bytea_encode(CodecContext settings, WriteBuffer wbuf, obj): + cdef: + Py_buffer pybuf + bint pybuf_used = False + char *buf + ssize_t len + + if cpython.PyBytes_CheckExact(obj): + buf = cpython.PyBytes_AS_STRING(obj) + len = cpython.Py_SIZE(obj) + else: + cpython.PyObject_GetBuffer(obj, &pybuf, cpython.PyBUF_SIMPLE) + pybuf_used = True + buf = pybuf.buf + len = pybuf.len + + try: + wbuf.write_int32(len) + wbuf.write_cstr(buf, len) + finally: + if pybuf_used: + cpython.PyBuffer_Release(&pybuf) + + +cdef bytea_decode(CodecContext settings, FRBuffer *buf): + cdef ssize_t buf_len = buf.len + return cpython.PyBytes_FromStringAndSize(frb_read_all(buf), buf_len) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/context.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/context.pyx new file mode 100755 index 0000000..c4d4416 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/context.pyx @@ -0,0 +1,26 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cdef class CodecContext: + + cpdef get_text_codec(self): + raise NotImplementedError + + cdef is_encoding_utf8(self): + raise NotImplementedError + + cpdef get_json_decoder(self): + raise NotImplementedError + + cdef is_decoding_json(self): + return False + + cpdef get_json_encoder(self): + raise NotImplementedError + + cdef is_encoding_json(self): + return False diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/datetime.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/datetime.pyx new file mode 100755 index 0000000..4d43b85 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/datetime.pyx @@ -0,0 +1,423 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cimport cpython.datetime +import datetime + +cpython.datetime.import_datetime() + +utc = datetime.timezone.utc +date_from_ordinal = datetime.date.fromordinal +timedelta = datetime.timedelta + +pg_epoch_datetime = datetime.datetime(2000, 1, 1) +cdef int32_t pg_epoch_datetime_ts = \ + cpython.PyLong_AsLong(int(pg_epoch_datetime.timestamp())) + +pg_epoch_datetime_utc = datetime.datetime(2000, 1, 1, tzinfo=utc) +cdef int32_t pg_epoch_datetime_utc_ts = \ + cpython.PyLong_AsLong(int(pg_epoch_datetime_utc.timestamp())) + +pg_epoch_date = datetime.date(2000, 1, 1) +cdef int32_t pg_date_offset_ord = \ + cpython.PyLong_AsLong(pg_epoch_date.toordinal()) + +# Binary representations of infinity for datetimes. +cdef const int64_t pg_time64_infinity = 0x7fffffffffffffff +cdef const int64_t pg_time64_negative_infinity = 0x8000000000000000 +cdef const int32_t pg_date_infinity = 0x7fffffff +cdef const int32_t pg_date_negative_infinity = 0x80000000 + +infinity_datetime = datetime.datetime( + datetime.MAXYEAR, 12, 31, 23, 59, 59, 999999) + +cdef int32_t infinity_datetime_ord = cpython.PyLong_AsLong( + infinity_datetime.toordinal()) + +cdef int64_t infinity_datetime_ts = 252455615999999999 + +negative_infinity_datetime = datetime.datetime( + datetime.MINYEAR, 1, 1, 0, 0, 0, 0) + +cdef int32_t negative_infinity_datetime_ord = cpython.PyLong_AsLong( + negative_infinity_datetime.toordinal()) + +cdef int64_t negative_infinity_datetime_ts = -63082281600000000 + +infinity_date = datetime.date(datetime.MAXYEAR, 12, 31) + +cdef int32_t infinity_date_ord = cpython.PyLong_AsLong( + infinity_date.toordinal()) + +negative_infinity_date = datetime.date(datetime.MINYEAR, 1, 1) + +cdef int32_t negative_infinity_date_ord = cpython.PyLong_AsLong( + negative_infinity_date.toordinal()) + + +cdef inline _local_timezone(): + d = datetime.datetime.now(datetime.timezone.utc).astimezone() + return datetime.timezone(d.utcoffset()) + + +cdef inline _encode_time(WriteBuffer buf, int64_t seconds, + int32_t microseconds): + # XXX: add support for double timestamps + # int64 timestamps, + cdef int64_t ts = seconds * 1000000 + microseconds + + if ts == infinity_datetime_ts: + buf.write_int64(pg_time64_infinity) + elif ts == negative_infinity_datetime_ts: + buf.write_int64(pg_time64_negative_infinity) + else: + buf.write_int64(ts) + + +cdef inline int32_t _decode_time(FRBuffer *buf, int64_t *seconds, + int32_t *microseconds): + cdef int64_t ts = hton.unpack_int64(frb_read(buf, 8)) + + if ts == pg_time64_infinity: + return 1 + elif ts == pg_time64_negative_infinity: + return -1 + else: + seconds[0] = ts // 1000000 + microseconds[0] = (ts % 1000000) + return 0 + + +cdef date_encode(CodecContext settings, WriteBuffer buf, obj): + cdef: + int32_t ordinal = cpython.PyLong_AsLong(obj.toordinal()) + int32_t pg_ordinal + + if ordinal == infinity_date_ord: + pg_ordinal = pg_date_infinity + elif ordinal == negative_infinity_date_ord: + pg_ordinal = pg_date_negative_infinity + else: + pg_ordinal = ordinal - pg_date_offset_ord + + buf.write_int32(4) + buf.write_int32(pg_ordinal) + + +cdef date_encode_tuple(CodecContext settings, WriteBuffer buf, obj): + cdef: + int32_t pg_ordinal + + if len(obj) != 1: + raise ValueError( + 'date tuple encoder: expecting 1 element ' + 'in tuple, got {}'.format(len(obj))) + + pg_ordinal = obj[0] + buf.write_int32(4) + buf.write_int32(pg_ordinal) + + +cdef date_decode(CodecContext settings, FRBuffer *buf): + cdef int32_t pg_ordinal = hton.unpack_int32(frb_read(buf, 4)) + + if pg_ordinal == pg_date_infinity: + return infinity_date + elif pg_ordinal == pg_date_negative_infinity: + return negative_infinity_date + else: + return date_from_ordinal(pg_ordinal + pg_date_offset_ord) + + +cdef date_decode_tuple(CodecContext settings, FRBuffer *buf): + cdef int32_t pg_ordinal = hton.unpack_int32(frb_read(buf, 4)) + + return (pg_ordinal,) + + +cdef timestamp_encode(CodecContext settings, WriteBuffer buf, obj): + if not cpython.datetime.PyDateTime_Check(obj): + if cpython.datetime.PyDate_Check(obj): + obj = datetime.datetime(obj.year, obj.month, obj.day) + else: + raise TypeError( + 'expected a datetime.date or datetime.datetime instance, ' + 'got {!r}'.format(type(obj).__name__) + ) + + delta = obj - pg_epoch_datetime + cdef: + int64_t seconds = cpython.PyLong_AsLongLong(delta.days) * 86400 + \ + cpython.PyLong_AsLong(delta.seconds) + int32_t microseconds = cpython.PyLong_AsLong( + delta.microseconds) + + buf.write_int32(8) + _encode_time(buf, seconds, microseconds) + + +cdef timestamp_encode_tuple(CodecContext settings, WriteBuffer buf, obj): + cdef: + int64_t microseconds + + if len(obj) != 1: + raise ValueError( + 'timestamp tuple encoder: expecting 1 element ' + 'in tuple, got {}'.format(len(obj))) + + microseconds = obj[0] + + buf.write_int32(8) + buf.write_int64(microseconds) + + +cdef timestamp_decode(CodecContext settings, FRBuffer *buf): + cdef: + int64_t seconds = 0 + int32_t microseconds = 0 + int32_t inf = _decode_time(buf, &seconds, µseconds) + + if inf > 0: + # positive infinity + return infinity_datetime + elif inf < 0: + # negative infinity + return negative_infinity_datetime + else: + return pg_epoch_datetime.__add__( + timedelta(0, seconds, microseconds)) + + +cdef timestamp_decode_tuple(CodecContext settings, FRBuffer *buf): + cdef: + int64_t ts = hton.unpack_int64(frb_read(buf, 8)) + + return (ts,) + + +cdef timestamptz_encode(CodecContext settings, WriteBuffer buf, obj): + if not cpython.datetime.PyDateTime_Check(obj): + if cpython.datetime.PyDate_Check(obj): + obj = datetime.datetime(obj.year, obj.month, obj.day, + tzinfo=_local_timezone()) + else: + raise TypeError( + 'expected a datetime.date or datetime.datetime instance, ' + 'got {!r}'.format(type(obj).__name__) + ) + + buf.write_int32(8) + + if obj == infinity_datetime: + buf.write_int64(pg_time64_infinity) + return + elif obj == negative_infinity_datetime: + buf.write_int64(pg_time64_negative_infinity) + return + + utc_dt = obj.astimezone(utc) + + delta = utc_dt - pg_epoch_datetime_utc + cdef: + int64_t seconds = cpython.PyLong_AsLongLong(delta.days) * 86400 + \ + cpython.PyLong_AsLong(delta.seconds) + int32_t microseconds = cpython.PyLong_AsLong( + delta.microseconds) + + _encode_time(buf, seconds, microseconds) + + +cdef timestamptz_decode(CodecContext settings, FRBuffer *buf): + cdef: + int64_t seconds = 0 + int32_t microseconds = 0 + int32_t inf = _decode_time(buf, &seconds, µseconds) + + if inf > 0: + # positive infinity + return infinity_datetime + elif inf < 0: + # negative infinity + return negative_infinity_datetime + else: + return pg_epoch_datetime_utc.__add__( + timedelta(0, seconds, microseconds)) + + +cdef time_encode(CodecContext settings, WriteBuffer buf, obj): + cdef: + int64_t seconds = cpython.PyLong_AsLong(obj.hour) * 3600 + \ + cpython.PyLong_AsLong(obj.minute) * 60 + \ + cpython.PyLong_AsLong(obj.second) + int32_t microseconds = cpython.PyLong_AsLong(obj.microsecond) + + buf.write_int32(8) + _encode_time(buf, seconds, microseconds) + + +cdef time_encode_tuple(CodecContext settings, WriteBuffer buf, obj): + cdef: + int64_t microseconds + + if len(obj) != 1: + raise ValueError( + 'time tuple encoder: expecting 1 element ' + 'in tuple, got {}'.format(len(obj))) + + microseconds = obj[0] + + buf.write_int32(8) + buf.write_int64(microseconds) + + +cdef time_decode(CodecContext settings, FRBuffer *buf): + cdef: + int64_t seconds = 0 + int32_t microseconds = 0 + + _decode_time(buf, &seconds, µseconds) + + cdef: + int64_t minutes = (seconds / 60) + int64_t sec = seconds % 60 + int64_t hours = (minutes / 60) + int64_t min = minutes % 60 + + return datetime.time(hours, min, sec, microseconds) + + +cdef time_decode_tuple(CodecContext settings, FRBuffer *buf): + cdef: + int64_t ts = hton.unpack_int64(frb_read(buf, 8)) + + return (ts,) + + +cdef timetz_encode(CodecContext settings, WriteBuffer buf, obj): + offset = obj.tzinfo.utcoffset(None) + + cdef: + int32_t offset_sec = \ + cpython.PyLong_AsLong(offset.days) * 24 * 60 * 60 + \ + cpython.PyLong_AsLong(offset.seconds) + + int64_t seconds = cpython.PyLong_AsLong(obj.hour) * 3600 + \ + cpython.PyLong_AsLong(obj.minute) * 60 + \ + cpython.PyLong_AsLong(obj.second) + + int32_t microseconds = cpython.PyLong_AsLong(obj.microsecond) + + buf.write_int32(12) + _encode_time(buf, seconds, microseconds) + # In Python utcoffset() is the difference between the local time + # and the UTC, whereas in PostgreSQL it's the opposite, + # so we need to flip the sign. + buf.write_int32(-offset_sec) + + +cdef timetz_encode_tuple(CodecContext settings, WriteBuffer buf, obj): + cdef: + int64_t microseconds + int32_t offset_sec + + if len(obj) != 2: + raise ValueError( + 'time tuple encoder: expecting 2 elements2 ' + 'in tuple, got {}'.format(len(obj))) + + microseconds = obj[0] + offset_sec = obj[1] + + buf.write_int32(12) + buf.write_int64(microseconds) + buf.write_int32(offset_sec) + + +cdef timetz_decode(CodecContext settings, FRBuffer *buf): + time = time_decode(settings, buf) + cdef int32_t offset = (hton.unpack_int32(frb_read(buf, 4)) / 60) + # See the comment in the `timetz_encode` method. + return time.replace(tzinfo=datetime.timezone(timedelta(minutes=-offset))) + + +cdef timetz_decode_tuple(CodecContext settings, FRBuffer *buf): + cdef: + int64_t microseconds = hton.unpack_int64(frb_read(buf, 8)) + int32_t offset_sec = hton.unpack_int32(frb_read(buf, 4)) + + return (microseconds, offset_sec) + + +cdef interval_encode(CodecContext settings, WriteBuffer buf, obj): + cdef: + int32_t days = cpython.PyLong_AsLong(obj.days) + int64_t seconds = cpython.PyLong_AsLongLong(obj.seconds) + int32_t microseconds = cpython.PyLong_AsLong(obj.microseconds) + + buf.write_int32(16) + _encode_time(buf, seconds, microseconds) + buf.write_int32(days) + buf.write_int32(0) # Months + + +cdef interval_encode_tuple(CodecContext settings, WriteBuffer buf, + tuple obj): + cdef: + int32_t months + int32_t days + int64_t microseconds + + if len(obj) != 3: + raise ValueError( + 'interval tuple encoder: expecting 3 elements ' + 'in tuple, got {}'.format(len(obj))) + + months = obj[0] + days = obj[1] + microseconds = obj[2] + + buf.write_int32(16) + buf.write_int64(microseconds) + buf.write_int32(days) + buf.write_int32(months) + + +cdef interval_decode(CodecContext settings, FRBuffer *buf): + cdef: + int32_t days + int32_t months + int32_t years + int64_t seconds = 0 + int32_t microseconds = 0 + + _decode_time(buf, &seconds, µseconds) + + days = hton.unpack_int32(frb_read(buf, 4)) + months = hton.unpack_int32(frb_read(buf, 4)) + + if months < 0: + years = -(-months // 12) + months = -(-months % 12) + else: + years = (months // 12) + months = (months % 12) + + return datetime.timedelta(days=days + months * 30 + years * 365, + seconds=seconds, microseconds=microseconds) + + +cdef interval_decode_tuple(CodecContext settings, FRBuffer *buf): + cdef: + int32_t days + int32_t months + int64_t microseconds + + microseconds = hton.unpack_int64(frb_read(buf, 8)) + days = hton.unpack_int32(frb_read(buf, 4)) + months = hton.unpack_int32(frb_read(buf, 4)) + + return (months, days, microseconds) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/float.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/float.pyx new file mode 100755 index 0000000..94eda03 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/float.pyx @@ -0,0 +1,34 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +from libc cimport math + + +cdef float4_encode(CodecContext settings, WriteBuffer buf, obj): + cdef double dval = cpython.PyFloat_AsDouble(obj) + cdef float fval = dval + if math.isinf(fval) and not math.isinf(dval): + raise ValueError('value out of float32 range') + + buf.write_int32(4) + buf.write_float(fval) + + +cdef float4_decode(CodecContext settings, FRBuffer *buf): + cdef float f = hton.unpack_float(frb_read(buf, 4)) + return cpython.PyFloat_FromDouble(f) + + +cdef float8_encode(CodecContext settings, WriteBuffer buf, obj): + cdef double dval = cpython.PyFloat_AsDouble(obj) + buf.write_int32(8) + buf.write_double(dval) + + +cdef float8_decode(CodecContext settings, FRBuffer *buf): + cdef double f = hton.unpack_double(frb_read(buf, 8)) + return cpython.PyFloat_FromDouble(f) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/geometry.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/geometry.pyx new file mode 100755 index 0000000..44aac64 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/geometry.pyx @@ -0,0 +1,164 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cdef inline _encode_points(WriteBuffer wbuf, object points): + cdef object point + + for point in points: + wbuf.write_double(point[0]) + wbuf.write_double(point[1]) + + +cdef inline _decode_points(FRBuffer *buf): + cdef: + int32_t npts = hton.unpack_int32(frb_read(buf, 4)) + pts = cpython.PyTuple_New(npts) + int32_t i + object point + double x + double y + + for i in range(npts): + x = hton.unpack_double(frb_read(buf, 8)) + y = hton.unpack_double(frb_read(buf, 8)) + point = pgproto_types.Point(x, y) + cpython.Py_INCREF(point) + cpython.PyTuple_SET_ITEM(pts, i, point) + + return pts + + +cdef box_encode(CodecContext settings, WriteBuffer wbuf, obj): + wbuf.write_int32(32) + _encode_points(wbuf, (obj[0], obj[1])) + + +cdef box_decode(CodecContext settings, FRBuffer *buf): + cdef: + double high_x = hton.unpack_double(frb_read(buf, 8)) + double high_y = hton.unpack_double(frb_read(buf, 8)) + double low_x = hton.unpack_double(frb_read(buf, 8)) + double low_y = hton.unpack_double(frb_read(buf, 8)) + + return pgproto_types.Box( + pgproto_types.Point(high_x, high_y), + pgproto_types.Point(low_x, low_y)) + + +cdef line_encode(CodecContext settings, WriteBuffer wbuf, obj): + wbuf.write_int32(24) + wbuf.write_double(obj[0]) + wbuf.write_double(obj[1]) + wbuf.write_double(obj[2]) + + +cdef line_decode(CodecContext settings, FRBuffer *buf): + cdef: + double A = hton.unpack_double(frb_read(buf, 8)) + double B = hton.unpack_double(frb_read(buf, 8)) + double C = hton.unpack_double(frb_read(buf, 8)) + + return pgproto_types.Line(A, B, C) + + +cdef lseg_encode(CodecContext settings, WriteBuffer wbuf, obj): + wbuf.write_int32(32) + _encode_points(wbuf, (obj[0], obj[1])) + + +cdef lseg_decode(CodecContext settings, FRBuffer *buf): + cdef: + double p1_x = hton.unpack_double(frb_read(buf, 8)) + double p1_y = hton.unpack_double(frb_read(buf, 8)) + double p2_x = hton.unpack_double(frb_read(buf, 8)) + double p2_y = hton.unpack_double(frb_read(buf, 8)) + + return pgproto_types.LineSegment((p1_x, p1_y), (p2_x, p2_y)) + + +cdef point_encode(CodecContext settings, WriteBuffer wbuf, obj): + wbuf.write_int32(16) + wbuf.write_double(obj[0]) + wbuf.write_double(obj[1]) + + +cdef point_decode(CodecContext settings, FRBuffer *buf): + cdef: + double x = hton.unpack_double(frb_read(buf, 8)) + double y = hton.unpack_double(frb_read(buf, 8)) + + return pgproto_types.Point(x, y) + + +cdef path_encode(CodecContext settings, WriteBuffer wbuf, obj): + cdef: + int8_t is_closed = 0 + ssize_t npts + ssize_t encoded_len + int32_t i + + if cpython.PyTuple_Check(obj): + is_closed = 1 + elif cpython.PyList_Check(obj): + is_closed = 0 + elif isinstance(obj, pgproto_types.Path): + is_closed = obj.is_closed + + npts = len(obj) + encoded_len = 1 + 4 + 16 * npts + if encoded_len > _MAXINT32: + raise ValueError('path value too long') + + wbuf.write_int32(encoded_len) + wbuf.write_byte(is_closed) + wbuf.write_int32(npts) + + _encode_points(wbuf, obj) + + +cdef path_decode(CodecContext settings, FRBuffer *buf): + cdef: + int8_t is_closed = (frb_read(buf, 1)[0]) + + return pgproto_types.Path(*_decode_points(buf), is_closed=is_closed == 1) + + +cdef poly_encode(CodecContext settings, WriteBuffer wbuf, obj): + cdef: + bint is_closed + ssize_t npts + ssize_t encoded_len + int32_t i + + npts = len(obj) + encoded_len = 4 + 16 * npts + if encoded_len > _MAXINT32: + raise ValueError('polygon value too long') + + wbuf.write_int32(encoded_len) + wbuf.write_int32(npts) + _encode_points(wbuf, obj) + + +cdef poly_decode(CodecContext settings, FRBuffer *buf): + return pgproto_types.Polygon(*_decode_points(buf)) + + +cdef circle_encode(CodecContext settings, WriteBuffer wbuf, obj): + wbuf.write_int32(24) + wbuf.write_double(obj[0][0]) + wbuf.write_double(obj[0][1]) + wbuf.write_double(obj[1]) + + +cdef circle_decode(CodecContext settings, FRBuffer *buf): + cdef: + double center_x = hton.unpack_double(frb_read(buf, 8)) + double center_y = hton.unpack_double(frb_read(buf, 8)) + double radius = hton.unpack_double(frb_read(buf, 8)) + + return pgproto_types.Circle((center_x, center_y), radius) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/hstore.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/hstore.pyx new file mode 100755 index 0000000..09051c7 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/hstore.pyx @@ -0,0 +1,73 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cdef hstore_encode(CodecContext settings, WriteBuffer buf, obj): + cdef: + char *str + ssize_t size + ssize_t count + object items + WriteBuffer item_buf = WriteBuffer.new() + + count = len(obj) + if count > _MAXINT32: + raise ValueError('hstore value is too large') + item_buf.write_int32(count) + + if hasattr(obj, 'items'): + items = obj.items() + else: + items = obj + + for k, v in items: + if k is None: + raise ValueError('null value not allowed in hstore key') + as_pg_string_and_size(settings, k, &str, &size) + item_buf.write_int32(size) + item_buf.write_cstr(str, size) + if v is None: + item_buf.write_int32(-1) + else: + as_pg_string_and_size(settings, v, &str, &size) + item_buf.write_int32(size) + item_buf.write_cstr(str, size) + + buf.write_int32(item_buf.len()) + buf.write_buffer(item_buf) + + +cdef hstore_decode(CodecContext settings, FRBuffer *buf): + cdef: + dict result + uint32_t elem_count + int32_t elem_len + uint32_t i + str k + str v + + result = {} + + elem_count = hton.unpack_int32(frb_read(buf, 4)) + if elem_count == 0: + return result + + for i in range(elem_count): + elem_len = hton.unpack_int32(frb_read(buf, 4)) + if elem_len < 0: + raise ValueError('null value not allowed in hstore key') + + k = decode_pg_string(settings, frb_read(buf, elem_len), elem_len) + + elem_len = hton.unpack_int32(frb_read(buf, 4)) + if elem_len < 0: + v = None + else: + v = decode_pg_string(settings, frb_read(buf, elem_len), elem_len) + + result[k] = v + + return result diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/int.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/int.pyx new file mode 100755 index 0000000..9997244 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/int.pyx @@ -0,0 +1,144 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cdef bool_encode(CodecContext settings, WriteBuffer buf, obj): + if not cpython.PyBool_Check(obj): + raise TypeError('a boolean is required (got type {})'.format( + type(obj).__name__)) + + buf.write_int32(1) + buf.write_byte(b'\x01' if obj is True else b'\x00') + + +cdef bool_decode(CodecContext settings, FRBuffer *buf): + return frb_read(buf, 1)[0] is b'\x01' + + +cdef int2_encode(CodecContext settings, WriteBuffer buf, obj): + cdef int overflow = 0 + cdef long val + + try: + if type(obj) is not int and hasattr(type(obj), '__int__'): + # Silence a Python warning about implicit __int__ + # conversion. + obj = int(obj) + val = cpython.PyLong_AsLong(obj) + except OverflowError: + overflow = 1 + + if overflow or val < INT16_MIN or val > INT16_MAX: + raise OverflowError('value out of int16 range') + + buf.write_int32(2) + buf.write_int16(val) + + +cdef int2_decode(CodecContext settings, FRBuffer *buf): + return cpython.PyLong_FromLong(hton.unpack_int16(frb_read(buf, 2))) + + +cdef int4_encode(CodecContext settings, WriteBuffer buf, obj): + cdef int overflow = 0 + cdef long val = 0 + + try: + if type(obj) is not int and hasattr(type(obj), '__int__'): + # Silence a Python warning about implicit __int__ + # conversion. + obj = int(obj) + val = cpython.PyLong_AsLong(obj) + except OverflowError: + overflow = 1 + + # "long" and "long long" have the same size for x86_64, need an extra check + if overflow or (sizeof(val) > 4 and (val < INT32_MIN or val > INT32_MAX)): + raise OverflowError('value out of int32 range') + + buf.write_int32(4) + buf.write_int32(val) + + +cdef int4_decode(CodecContext settings, FRBuffer *buf): + return cpython.PyLong_FromLong(hton.unpack_int32(frb_read(buf, 4))) + + +cdef uint4_encode(CodecContext settings, WriteBuffer buf, obj): + cdef int overflow = 0 + cdef unsigned long val = 0 + + try: + if type(obj) is not int and hasattr(type(obj), '__int__'): + # Silence a Python warning about implicit __int__ + # conversion. + obj = int(obj) + val = cpython.PyLong_AsUnsignedLong(obj) + except OverflowError: + overflow = 1 + + # "long" and "long long" have the same size for x86_64, need an extra check + if overflow or (sizeof(val) > 4 and val > UINT32_MAX): + raise OverflowError('value out of uint32 range') + + buf.write_int32(4) + buf.write_int32(val) + + +cdef uint4_decode(CodecContext settings, FRBuffer *buf): + return cpython.PyLong_FromUnsignedLong( + hton.unpack_int32(frb_read(buf, 4))) + + +cdef int8_encode(CodecContext settings, WriteBuffer buf, obj): + cdef int overflow = 0 + cdef long long val + + try: + if type(obj) is not int and hasattr(type(obj), '__int__'): + # Silence a Python warning about implicit __int__ + # conversion. + obj = int(obj) + val = cpython.PyLong_AsLongLong(obj) + except OverflowError: + overflow = 1 + + # Just in case for systems with "long long" bigger than 8 bytes + if overflow or (sizeof(val) > 8 and (val < INT64_MIN or val > INT64_MAX)): + raise OverflowError('value out of int64 range') + + buf.write_int32(8) + buf.write_int64(val) + + +cdef int8_decode(CodecContext settings, FRBuffer *buf): + return cpython.PyLong_FromLongLong(hton.unpack_int64(frb_read(buf, 8))) + + +cdef uint8_encode(CodecContext settings, WriteBuffer buf, obj): + cdef int overflow = 0 + cdef unsigned long long val = 0 + + try: + if type(obj) is not int and hasattr(type(obj), '__int__'): + # Silence a Python warning about implicit __int__ + # conversion. + obj = int(obj) + val = cpython.PyLong_AsUnsignedLongLong(obj) + except OverflowError: + overflow = 1 + + # Just in case for systems with "long long" bigger than 8 bytes + if overflow or (sizeof(val) > 8 and val > UINT64_MAX): + raise OverflowError('value out of uint64 range') + + buf.write_int32(8) + buf.write_int64(val) + + +cdef uint8_decode(CodecContext settings, FRBuffer *buf): + return cpython.PyLong_FromUnsignedLongLong( + hton.unpack_int64(frb_read(buf, 8))) \ No newline at end of file diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/json.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/json.pyx new file mode 100755 index 0000000..97e6916 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/json.pyx @@ -0,0 +1,57 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cdef jsonb_encode(CodecContext settings, WriteBuffer buf, obj): + cdef: + char *str + ssize_t size + + if settings.is_encoding_json(): + obj = settings.get_json_encoder().encode(obj) + + as_pg_string_and_size(settings, obj, &str, &size) + + if size > 0x7fffffff - 1: + raise ValueError('string too long') + + buf.write_int32(size + 1) + buf.write_byte(1) # JSONB format version + buf.write_cstr(str, size) + + +cdef jsonb_decode(CodecContext settings, FRBuffer *buf): + cdef uint8_t format = (frb_read(buf, 1)[0]) + + if format != 1: + raise ValueError('unexpected JSONB format: {}'.format(format)) + + rv = text_decode(settings, buf) + + if settings.is_decoding_json(): + rv = settings.get_json_decoder().decode(rv) + + return rv + + +cdef json_encode(CodecContext settings, WriteBuffer buf, obj): + cdef: + char *str + ssize_t size + + if settings.is_encoding_json(): + obj = settings.get_json_encoder().encode(obj) + + text_encode(settings, buf, obj) + + +cdef json_decode(CodecContext settings, FRBuffer *buf): + rv = text_decode(settings, buf) + + if settings.is_decoding_json(): + rv = settings.get_json_decoder().decode(rv) + + return rv diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/jsonpath.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/jsonpath.pyx new file mode 100755 index 0000000..610b30d --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/jsonpath.pyx @@ -0,0 +1,29 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cdef jsonpath_encode(CodecContext settings, WriteBuffer buf, obj): + cdef: + char *str + ssize_t size + + as_pg_string_and_size(settings, obj, &str, &size) + + if size > 0x7fffffff - 1: + raise ValueError('string too long') + + buf.write_int32(size + 1) + buf.write_byte(1) # jsonpath format version + buf.write_cstr(str, size) + + +cdef jsonpath_decode(CodecContext settings, FRBuffer *buf): + cdef uint8_t format = (frb_read(buf, 1)[0]) + + if format != 1: + raise ValueError('unexpected jsonpath format: {}'.format(format)) + + return text_decode(settings, buf) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/misc.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/misc.pyx new file mode 100755 index 0000000..99b19c9 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/misc.pyx @@ -0,0 +1,16 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cdef void_encode(CodecContext settings, WriteBuffer buf, obj): + # Void is zero bytes + buf.write_int32(0) + + +cdef void_decode(CodecContext settings, FRBuffer *buf): + # Do nothing; void will be passed as NULL so this function + # will never be called. + pass diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/network.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/network.pyx new file mode 100755 index 0000000..730c947 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/network.pyx @@ -0,0 +1,139 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +import ipaddress + + +# defined in postgresql/src/include/inet.h +# +DEF PGSQL_AF_INET = 2 # AF_INET +DEF PGSQL_AF_INET6 = 3 # AF_INET + 1 + + +_ipaddr = ipaddress.ip_address +_ipiface = ipaddress.ip_interface +_ipnet = ipaddress.ip_network + + +cdef inline uint8_t _ip_max_prefix_len(int32_t family): + # Maximum number of bits in the network prefix of the specified + # IP protocol version. + if family == PGSQL_AF_INET: + return 32 + else: + return 128 + + +cdef inline int32_t _ip_addr_len(int32_t family): + # Length of address in bytes for the specified IP protocol version. + if family == PGSQL_AF_INET: + return 4 + else: + return 16 + + +cdef inline int8_t _ver_to_family(int32_t version): + if version == 4: + return PGSQL_AF_INET + else: + return PGSQL_AF_INET6 + + +cdef inline _net_encode(WriteBuffer buf, int8_t family, uint32_t bits, + int8_t is_cidr, bytes addr): + + cdef: + char *addrbytes + ssize_t addrlen + + cpython.PyBytes_AsStringAndSize(addr, &addrbytes, &addrlen) + + buf.write_int32(4 + addrlen) + buf.write_byte(family) + buf.write_byte(bits) + buf.write_byte(is_cidr) + buf.write_byte(addrlen) + buf.write_cstr(addrbytes, addrlen) + + +cdef net_decode(CodecContext settings, FRBuffer *buf, bint as_cidr): + cdef: + int32_t family = frb_read(buf, 1)[0] + uint8_t bits = frb_read(buf, 1)[0] + int prefix_len + int32_t is_cidr = frb_read(buf, 1)[0] + int32_t addrlen = frb_read(buf, 1)[0] + bytes addr + uint8_t max_prefix_len = _ip_max_prefix_len(family) + + if is_cidr != as_cidr: + raise ValueError('unexpected CIDR flag set in non-cidr value') + + if family != PGSQL_AF_INET and family != PGSQL_AF_INET6: + raise ValueError('invalid address family in "{}" value'.format( + 'cidr' if is_cidr else 'inet' + )) + + max_prefix_len = _ip_max_prefix_len(family) + + if bits > max_prefix_len: + raise ValueError('invalid network prefix length in "{}" value'.format( + 'cidr' if is_cidr else 'inet' + )) + + if addrlen != _ip_addr_len(family): + raise ValueError('invalid address length in "{}" value'.format( + 'cidr' if is_cidr else 'inet' + )) + + addr = cpython.PyBytes_FromStringAndSize(frb_read(buf, addrlen), addrlen) + + if as_cidr or bits != max_prefix_len: + prefix_len = cpython.PyLong_FromLong(bits) + + if as_cidr: + return _ipnet((addr, prefix_len)) + else: + return _ipiface((addr, prefix_len)) + else: + return _ipaddr(addr) + + +cdef cidr_encode(CodecContext settings, WriteBuffer buf, obj): + cdef: + object ipnet + int8_t family + + ipnet = _ipnet(obj) + family = _ver_to_family(ipnet.version) + _net_encode(buf, family, ipnet.prefixlen, 1, ipnet.network_address.packed) + + +cdef cidr_decode(CodecContext settings, FRBuffer *buf): + return net_decode(settings, buf, True) + + +cdef inet_encode(CodecContext settings, WriteBuffer buf, obj): + cdef: + object ipaddr + int8_t family + + try: + ipaddr = _ipaddr(obj) + except ValueError: + # PostgreSQL accepts *both* CIDR and host values + # for the host datatype. + ipaddr = _ipiface(obj) + family = _ver_to_family(ipaddr.version) + _net_encode(buf, family, ipaddr.network.prefixlen, 1, ipaddr.packed) + else: + family = _ver_to_family(ipaddr.version) + _net_encode(buf, family, _ip_max_prefix_len(family), 0, ipaddr.packed) + + +cdef inet_decode(CodecContext settings, FRBuffer *buf): + return net_decode(settings, buf, False) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/numeric.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/numeric.pyx new file mode 100755 index 0000000..b75d096 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/numeric.pyx @@ -0,0 +1,356 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +from libc.math cimport abs, log10 +from libc.stdio cimport snprintf + +import decimal + +# defined in postgresql/src/backend/utils/adt/numeric.c +DEF DEC_DIGITS = 4 +DEF MAX_DSCALE = 0x3FFF +DEF NUMERIC_POS = 0x0000 +DEF NUMERIC_NEG = 0x4000 +DEF NUMERIC_NAN = 0xC000 +DEF NUMERIC_PINF = 0xD000 +DEF NUMERIC_NINF = 0xF000 + +_Dec = decimal.Decimal + + +cdef numeric_encode_text(CodecContext settings, WriteBuffer buf, obj): + text_encode(settings, buf, str(obj)) + + +cdef numeric_decode_text(CodecContext settings, FRBuffer *buf): + return _Dec(text_decode(settings, buf)) + + +cdef numeric_encode_binary(CodecContext settings, WriteBuffer buf, obj): + cdef: + object dec + object dt + int64_t exponent + int64_t i + int64_t j + tuple pydigits + int64_t num_pydigits + int16_t pgdigit + int64_t num_pgdigits + int16_t dscale + int64_t dweight + int64_t weight + uint16_t sign + int64_t padding_size = 0 + + if isinstance(obj, _Dec): + dec = obj + else: + dec = _Dec(obj) + + dt = dec.as_tuple() + + if dt.exponent == 'n' or dt.exponent == 'N': + # NaN + sign = NUMERIC_NAN + num_pgdigits = 0 + weight = 0 + dscale = 0 + elif dt.exponent == 'F': + # Infinity + if dt.sign: + sign = NUMERIC_NINF + else: + sign = NUMERIC_PINF + num_pgdigits = 0 + weight = 0 + dscale = 0 + else: + exponent = dt.exponent + if exponent < 0 and -exponent > MAX_DSCALE: + raise ValueError( + 'cannot encode Decimal value into numeric: ' + 'exponent is too small') + + if dt.sign: + sign = NUMERIC_NEG + else: + sign = NUMERIC_POS + + pydigits = dt.digits + num_pydigits = len(pydigits) + + dweight = num_pydigits + exponent - 1 + if dweight >= 0: + weight = (dweight + DEC_DIGITS) // DEC_DIGITS - 1 + else: + weight = -((-dweight - 1) // DEC_DIGITS + 1) + + if weight > 2 ** 16 - 1: + raise ValueError( + 'cannot encode Decimal value into numeric: ' + 'exponent is too large') + + padding_size = \ + (weight + 1) * DEC_DIGITS - (dweight + 1) + num_pgdigits = \ + (num_pydigits + padding_size + DEC_DIGITS - 1) // DEC_DIGITS + + if num_pgdigits > 2 ** 16 - 1: + raise ValueError( + 'cannot encode Decimal value into numeric: ' + 'number of digits is too large') + + # Pad decimal digits to provide room for correct Postgres + # digit alignment in the digit computation loop. + pydigits = (0,) * DEC_DIGITS + pydigits + (0,) * DEC_DIGITS + + if exponent < 0: + if -exponent > MAX_DSCALE: + raise ValueError( + 'cannot encode Decimal value into numeric: ' + 'exponent is too small') + dscale = -exponent + else: + dscale = 0 + + buf.write_int32(2 + 2 + 2 + 2 + 2 * num_pgdigits) + buf.write_int16(num_pgdigits) + buf.write_int16(weight) + buf.write_int16(sign) + buf.write_int16(dscale) + + j = DEC_DIGITS - padding_size + + for i in range(num_pgdigits): + pgdigit = (pydigits[j] * 1000 + pydigits[j + 1] * 100 + + pydigits[j + 2] * 10 + pydigits[j + 3]) + j += DEC_DIGITS + buf.write_int16(pgdigit) + + +# The decoding strategy here is to form a string representation of +# the numeric var, as it is faster than passing an iterable of digits. +# For this reason the below code is pure overhead and is ~25% slower +# than the simple text decoder above. That said, we need the binary +# decoder to support binary COPY with numeric values. +cdef numeric_decode_binary_ex( + CodecContext settings, + FRBuffer *buf, + bint trail_fract_zero, +): + cdef: + uint16_t num_pgdigits = hton.unpack_int16(frb_read(buf, 2)) + int16_t weight = hton.unpack_int16(frb_read(buf, 2)) + uint16_t sign = hton.unpack_int16(frb_read(buf, 2)) + uint16_t dscale = hton.unpack_int16(frb_read(buf, 2)) + int16_t pgdigit0 + ssize_t i + int16_t pgdigit + object pydigits + ssize_t num_pydigits + ssize_t actual_num_pydigits + ssize_t buf_size + int64_t exponent + int64_t abs_exponent + ssize_t exponent_chars + ssize_t front_padding = 0 + ssize_t num_fract_digits + ssize_t trailing_fract_zeros_adj + char smallbuf[_NUMERIC_DECODER_SMALLBUF_SIZE] + char *charbuf + char *bufptr + bint buf_allocated = False + + if sign == NUMERIC_NAN: + # Not-a-number + return _Dec('NaN') + elif sign == NUMERIC_PINF: + # +Infinity + return _Dec('Infinity') + elif sign == NUMERIC_NINF: + # -Infinity + return _Dec('-Infinity') + + if num_pgdigits == 0: + # Zero + return _Dec('0e-' + str(dscale)) + + pgdigit0 = hton.unpack_int16(frb_read(buf, 2)) + if weight >= 0: + if pgdigit0 < 10: + front_padding = 3 + elif pgdigit0 < 100: + front_padding = 2 + elif pgdigit0 < 1000: + front_padding = 1 + + # The number of fractional decimal digits actually encoded in + # base-DEC_DEIGITS digits sent by Postgres. + num_fract_digits = (num_pgdigits - weight - 1) * DEC_DIGITS + + # The trailing zero adjustment necessary to obtain exactly + # dscale number of fractional digits in output. May be negative, + # which indicates that trailing zeros in the last input digit + # should be discarded. + trailing_fract_zeros_adj = dscale - num_fract_digits + + # Maximum possible number of decimal digits in base 10. + # The actual number might be up to 3 digits smaller due to + # leading zeros in first input digit. + num_pydigits = num_pgdigits * DEC_DIGITS + if trailing_fract_zeros_adj > 0: + num_pydigits += trailing_fract_zeros_adj + + # Exponent. + exponent = (weight + 1) * DEC_DIGITS - front_padding + abs_exponent = abs(exponent) + if abs_exponent != 0: + # Number of characters required to render absolute exponent value + # in decimal. + exponent_chars = log10(abs_exponent) + 1 + else: + exponent_chars = 0 + + # Output buffer size. + buf_size = ( + 1 + # sign + 1 + # leading zero + 1 + # decimal dot + num_pydigits + # digits + 1 + # possible trailing zero padding + 2 + # exponent indicator (E-,E+) + exponent_chars + # exponent + 1 # null terminator char + ) + + if buf_size > _NUMERIC_DECODER_SMALLBUF_SIZE: + charbuf = cpython.PyMem_Malloc(buf_size) + buf_allocated = True + else: + charbuf = smallbuf + + try: + bufptr = charbuf + + if sign == NUMERIC_NEG: + bufptr[0] = b'-' + bufptr += 1 + + bufptr[0] = b'0' + bufptr[1] = b'.' + bufptr += 2 + + if weight >= 0: + bufptr = _unpack_digit_stripping_lzeros(bufptr, pgdigit0) + else: + bufptr = _unpack_digit(bufptr, pgdigit0) + + for i in range(1, num_pgdigits): + pgdigit = hton.unpack_int16(frb_read(buf, 2)) + bufptr = _unpack_digit(bufptr, pgdigit) + + if dscale: + if trailing_fract_zeros_adj > 0: + for i in range(trailing_fract_zeros_adj): + bufptr[i] = b'0' + + # If display scale is _less_ than the number of rendered digits, + # trailing_fract_zeros_adj will be negative and this will strip + # the excess trailing zeros. + bufptr += trailing_fract_zeros_adj + + if trail_fract_zero: + # Check if the number of rendered digits matches the exponent, + # and if so, add another trailing zero, so the result always + # appears with a decimal point. + actual_num_pydigits = bufptr - charbuf - 2 + if sign == NUMERIC_NEG: + actual_num_pydigits -= 1 + + if actual_num_pydigits == abs_exponent: + bufptr[0] = b'0' + bufptr += 1 + + if exponent != 0: + bufptr[0] = b'E' + if exponent < 0: + bufptr[1] = b'-' + else: + bufptr[1] = b'+' + bufptr += 2 + snprintf(bufptr, exponent_chars + 1, '%d', + abs_exponent) + bufptr += exponent_chars + + bufptr[0] = 0 + + pydigits = cpythonx.PyUnicode_FromString(charbuf) + + return _Dec(pydigits) + + finally: + if buf_allocated: + cpython.PyMem_Free(charbuf) + + +cdef numeric_decode_binary(CodecContext settings, FRBuffer *buf): + return numeric_decode_binary_ex(settings, buf, False) + + +cdef inline char *_unpack_digit_stripping_lzeros(char *buf, int64_t pgdigit): + cdef: + int64_t d + bint significant + + d = pgdigit // 1000 + significant = (d > 0) + if significant: + pgdigit -= d * 1000 + buf[0] = (d + b'0') + buf += 1 + + d = pgdigit // 100 + significant |= (d > 0) + if significant: + pgdigit -= d * 100 + buf[0] = (d + b'0') + buf += 1 + + d = pgdigit // 10 + significant |= (d > 0) + if significant: + pgdigit -= d * 10 + buf[0] = (d + b'0') + buf += 1 + + buf[0] = (pgdigit + b'0') + buf += 1 + + return buf + + +cdef inline char *_unpack_digit(char *buf, int64_t pgdigit): + cdef: + int64_t d + + d = pgdigit // 1000 + pgdigit -= d * 1000 + buf[0] = (d + b'0') + + d = pgdigit // 100 + pgdigit -= d * 100 + buf[1] = (d + b'0') + + d = pgdigit // 10 + pgdigit -= d * 10 + buf[2] = (d + b'0') + + buf[3] = (pgdigit + b'0') + buf += 4 + + return buf diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/pg_snapshot.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/pg_snapshot.pyx new file mode 100755 index 0000000..d96107c --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/pg_snapshot.pyx @@ -0,0 +1,63 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cdef pg_snapshot_encode(CodecContext settings, WriteBuffer buf, obj): + cdef: + ssize_t nxip + uint64_t xmin + uint64_t xmax + int i + WriteBuffer xip_buf = WriteBuffer.new() + + if not (cpython.PyTuple_Check(obj) or cpython.PyList_Check(obj)): + raise TypeError( + 'list or tuple expected (got type {})'.format(type(obj))) + + if len(obj) != 3: + raise ValueError( + 'invalid number of elements in txid_snapshot tuple, expecting 4') + + nxip = len(obj[2]) + if nxip > _MAXINT32: + raise ValueError('txid_snapshot value is too long') + + xmin = obj[0] + xmax = obj[1] + + for i in range(nxip): + xip_buf.write_int64( + cpython.PyLong_AsUnsignedLongLong(obj[2][i])) + + buf.write_int32(20 + xip_buf.len()) + + buf.write_int32(nxip) + buf.write_int64(xmin) + buf.write_int64(xmax) + buf.write_buffer(xip_buf) + + +cdef pg_snapshot_decode(CodecContext settings, FRBuffer *buf): + cdef: + int32_t nxip + uint64_t xmin + uint64_t xmax + tuple xip_tup + int32_t i + object xip + + nxip = hton.unpack_int32(frb_read(buf, 4)) + xmin = hton.unpack_int64(frb_read(buf, 8)) + xmax = hton.unpack_int64(frb_read(buf, 8)) + + xip_tup = cpython.PyTuple_New(nxip) + for i in range(nxip): + xip = cpython.PyLong_FromUnsignedLongLong( + hton.unpack_int64(frb_read(buf, 8))) + cpython.Py_INCREF(xip) + cpython.PyTuple_SET_ITEM(xip_tup, i, xip) + + return (xmin, xmax, xip_tup) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/text.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/text.pyx new file mode 100755 index 0000000..79f375d --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/text.pyx @@ -0,0 +1,48 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cdef inline as_pg_string_and_size( + CodecContext settings, obj, char **cstr, ssize_t *size): + + if not cpython.PyUnicode_Check(obj): + raise TypeError('expected str, got {}'.format(type(obj).__name__)) + + if settings.is_encoding_utf8(): + cstr[0] = cpythonx.PyUnicode_AsUTF8AndSize(obj, size) + else: + encoded = settings.get_text_codec().encode(obj)[0] + cpython.PyBytes_AsStringAndSize(encoded, cstr, size) + + if size[0] > 0x7fffffff: + raise ValueError('string too long') + + +cdef text_encode(CodecContext settings, WriteBuffer buf, obj): + cdef: + char *str + ssize_t size + + as_pg_string_and_size(settings, obj, &str, &size) + + buf.write_int32(size) + buf.write_cstr(str, size) + + +cdef inline decode_pg_string(CodecContext settings, const char* data, + ssize_t len): + + if settings.is_encoding_utf8(): + # decode UTF-8 in strict mode + return cpython.PyUnicode_DecodeUTF8(data, len, NULL) + else: + bytes = cpython.PyBytes_FromStringAndSize(data, len) + return settings.get_text_codec().decode(bytes)[0] + + +cdef text_decode(CodecContext settings, FRBuffer *buf): + cdef ssize_t buf_len = buf.len + return decode_pg_string(settings, frb_read_all(buf), buf_len) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/tid.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/tid.pyx new file mode 100755 index 0000000..b39bddc --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/tid.pyx @@ -0,0 +1,51 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cdef tid_encode(CodecContext settings, WriteBuffer buf, obj): + cdef int overflow = 0 + cdef unsigned long block, offset + + if not (cpython.PyTuple_Check(obj) or cpython.PyList_Check(obj)): + raise TypeError( + 'list or tuple expected (got type {})'.format(type(obj))) + + if len(obj) != 2: + raise ValueError( + 'invalid number of elements in tid tuple, expecting 2') + + try: + block = cpython.PyLong_AsUnsignedLong(obj[0]) + except OverflowError: + overflow = 1 + + # "long" and "long long" have the same size for x86_64, need an extra check + if overflow or (sizeof(block) > 4 and block > UINT32_MAX): + raise OverflowError('tuple id block value out of uint32 range') + + try: + offset = cpython.PyLong_AsUnsignedLong(obj[1]) + overflow = 0 + except OverflowError: + overflow = 1 + + if overflow or offset > 65535: + raise OverflowError('tuple id offset value out of uint16 range') + + buf.write_int32(6) + buf.write_int32(block) + buf.write_int16(offset) + + +cdef tid_decode(CodecContext settings, FRBuffer *buf): + cdef: + uint32_t block + uint16_t offset + + block = hton.unpack_int32(frb_read(buf, 4)) + offset = hton.unpack_int16(frb_read(buf, 2)) + + return (block, offset) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/uuid.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/uuid.pyx new file mode 100755 index 0000000..0bc4567 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/codecs/uuid.pyx @@ -0,0 +1,27 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cdef uuid_encode(CodecContext settings, WriteBuffer wbuf, obj): + cdef: + char buf[16] + + if type(obj) is pg_UUID: + wbuf.write_int32(16) + wbuf.write_cstr((obj)._data, 16) + elif cpython.PyUnicode_Check(obj): + pg_uuid_bytes_from_str(obj, buf) + wbuf.write_int32(16) + wbuf.write_cstr(buf, 16) + else: + bytea_encode(settings, wbuf, obj.bytes) + + +cdef uuid_decode(CodecContext settings, FRBuffer *buf): + if buf.len != 16: + raise TypeError( + f'cannot decode UUID, expected 16 bytes, got {buf.len}') + return pg_uuid_from_buf(frb_read_all(buf)) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/consts.pxi b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/consts.pxi new file mode 100755 index 0000000..68bf31f --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/consts.pxi @@ -0,0 +1,9 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +DEF _MAXINT32 = 2**31 - 1 +DEF _NUMERIC_DECODER_SMALLBUF_SIZE = 256 diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/cpythonx.pxd b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/cpythonx.pxd new file mode 100755 index 0000000..7b4f4f3 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/cpythonx.pxd @@ -0,0 +1,23 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +from cpython cimport Py_buffer + +cdef extern from "Python.h": + int PyUnicode_1BYTE_KIND + + int PyByteArray_CheckExact(object) + int PyByteArray_Resize(object, ssize_t) except -1 + object PyByteArray_FromStringAndSize(const char *, ssize_t) + char* PyByteArray_AsString(object) + + object PyUnicode_FromString(const char *u) + const char* PyUnicode_AsUTF8AndSize( + object unicode, ssize_t *size) except NULL + + object PyUnicode_FromKindAndData( + int kind, const void *buffer, Py_ssize_t size) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/debug.pxd b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/debug.pxd new file mode 100755 index 0000000..5e59ec1 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/debug.pxd @@ -0,0 +1,10 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cdef extern from "debug.h": + + cdef int PG_DEBUG diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/frb.pxd b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/frb.pxd new file mode 100755 index 0000000..9ff8d10 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/frb.pxd @@ -0,0 +1,48 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cdef: + + struct FRBuffer: + const char* buf + ssize_t len + + inline ssize_t frb_get_len(FRBuffer *frb): + return frb.len + + inline void frb_set_len(FRBuffer *frb, ssize_t new_len): + frb.len = new_len + + inline void frb_init(FRBuffer *frb, const char *buf, ssize_t len): + frb.buf = buf + frb.len = len + + inline const char* frb_read(FRBuffer *frb, ssize_t n) except NULL: + cdef const char *result + + frb_check(frb, n) + + result = frb.buf + frb.buf += n + frb.len -= n + + return result + + inline const char* frb_read_all(FRBuffer *frb): + cdef const char *result + result = frb.buf + frb.buf += frb.len + frb.len = 0 + return result + + inline FRBuffer *frb_slice_from(FRBuffer *frb, + FRBuffer* source, ssize_t len): + frb.buf = frb_read(source, len) + frb.len = len + return frb + + object frb_check(FRBuffer *frb, ssize_t n) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/frb.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/frb.pyx new file mode 100755 index 0000000..f11f6b9 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/frb.pyx @@ -0,0 +1,12 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cdef object frb_check(FRBuffer *frb, ssize_t n): + if n > frb.len: + raise AssertionError( + f'insufficient data in buffer: requested {n} ' + f'remaining {frb.len}') diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/hton.pxd b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/hton.pxd new file mode 100755 index 0000000..9b73abc --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/hton.pxd @@ -0,0 +1,24 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +from libc.stdint cimport int16_t, int32_t, uint16_t, uint32_t, int64_t, uint64_t + + +cdef extern from "./hton.h": + cdef void pack_int16(char *buf, int16_t x); + cdef void pack_int32(char *buf, int32_t x); + cdef void pack_int64(char *buf, int64_t x); + cdef void pack_float(char *buf, float f); + cdef void pack_double(char *buf, double f); + cdef int16_t unpack_int16(const char *buf); + cdef uint16_t unpack_uint16(const char *buf); + cdef int32_t unpack_int32(const char *buf); + cdef uint32_t unpack_uint32(const char *buf); + cdef int64_t unpack_int64(const char *buf); + cdef uint64_t unpack_uint64(const char *buf); + cdef float unpack_float(const char *buf); + cdef double unpack_double(const char *buf); diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/pgproto.cpython-312-x86_64-linux-gnu.so b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/pgproto.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000..b70be7f Binary files /dev/null and b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/pgproto.cpython-312-x86_64-linux-gnu.so differ diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/pgproto.pxd b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/pgproto.pxd new file mode 100755 index 0000000..ee9ec45 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/pgproto.pxd @@ -0,0 +1,19 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cimport cython +cimport cpython + +from libc.stdint cimport int16_t, int32_t, uint16_t, uint32_t, int64_t, uint64_t + + +include "./consts.pxi" +include "./frb.pxd" +include "./buffer.pxd" + + +include "./codecs/__init__.pxd" diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/pgproto.pyi b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/pgproto.pyi new file mode 100755 index 0000000..cbbcaec --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/pgproto.pyi @@ -0,0 +1,20 @@ +import codecs +import typing +import uuid + +class CodecContext: + def get_text_codec(self) -> codecs.CodecInfo: ... + def get_json_decoder(self) -> object: ... + def get_json_encoder(self) -> object: ... + +@typing.final +class ReadBuffer: ... + +@typing.final +class WriteBuffer: ... + +class BufferError(Exception): ... + +@typing.final +class UUID(uuid.UUID): + def __init__(self, inp: typing.AnyStr) -> None: ... diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/pgproto.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/pgproto.pyx new file mode 100755 index 0000000..b880b7e --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/pgproto.pyx @@ -0,0 +1,49 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cimport cython +cimport cpython + +from . cimport cpythonx + +from libc.stdint cimport int8_t, uint8_t, int16_t, uint16_t, \ + int32_t, uint32_t, int64_t, uint64_t, \ + INT16_MIN, INT16_MAX, INT32_MIN, INT32_MAX, \ + UINT32_MAX, INT64_MIN, INT64_MAX, UINT64_MAX + + +from . cimport hton +from . cimport tohex + +from .debug cimport PG_DEBUG +from . import types as pgproto_types + + +include "./consts.pxi" +include "./frb.pyx" +include "./buffer.pyx" +include "./uuid.pyx" + +include "./codecs/context.pyx" + +include "./codecs/bytea.pyx" +include "./codecs/text.pyx" + +include "./codecs/datetime.pyx" +include "./codecs/float.pyx" +include "./codecs/int.pyx" +include "./codecs/json.pyx" +include "./codecs/jsonpath.pyx" +include "./codecs/uuid.pyx" +include "./codecs/numeric.pyx" +include "./codecs/bits.pyx" +include "./codecs/geometry.pyx" +include "./codecs/hstore.pyx" +include "./codecs/misc.pyx" +include "./codecs/network.pyx" +include "./codecs/tid.pyx" +include "./codecs/pg_snapshot.pyx" diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/tohex.pxd b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/tohex.pxd new file mode 100755 index 0000000..12fda84 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/tohex.pxd @@ -0,0 +1,10 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cdef extern from "./tohex.h": + cdef void uuid_to_str(const char *source, char *dest) + cdef void uuid_to_hex(const char *source, char *dest) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/types.py b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/types.py new file mode 100755 index 0000000..0c45467 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/types.py @@ -0,0 +1,435 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + +from __future__ import annotations + +import typing + +if typing.TYPE_CHECKING: + import builtins + import sys + + if sys.version_info < (3, 11): + from typing_extensions import Self + else: + from typing import Self + + +__all__ = ( + 'BitString', 'Point', 'Path', 'Polygon', + 'Box', 'Line', 'LineSegment', 'Circle', +) + +_BitOrderType = typing.Literal['big', 'little'] + + +class BitString: + """Immutable representation of PostgreSQL `bit` and `varbit` types.""" + + __slots__ = '_bytes', '_bitlength' + + _bytes: bytes + _bitlength: int + + def __init__(self, + bitstring: builtins.bytes | None = None) -> None: + if not bitstring: + self._bytes = bytes() + self._bitlength = 0 + else: + bytelen = len(bitstring) // 8 + 1 + bytes_ = bytearray(bytelen) + byte = 0 + byte_pos = 0 + bit_pos = 0 + + for i, bit in enumerate(bitstring): + if bit == ' ': # type: ignore + continue + bit = int(bit) + if bit != 0 and bit != 1: + raise ValueError( + 'invalid bit value at position {}'.format(i)) + + byte |= bit << (8 - bit_pos - 1) + bit_pos += 1 + if bit_pos == 8: + bytes_[byte_pos] = byte + byte = 0 + byte_pos += 1 + bit_pos = 0 + + if bit_pos != 0: + bytes_[byte_pos] = byte + + bitlen = byte_pos * 8 + bit_pos + bytelen = byte_pos + (1 if bit_pos else 0) + + self._bytes = bytes(bytes_[:bytelen]) + self._bitlength = bitlen + + @classmethod + def frombytes(cls, + bytes_: builtins.bytes | None = None, + bitlength: int | None = None) -> Self: + if bitlength is None: + if bytes_ is None: + bytes_ = bytes() + bitlength = 0 + else: + bitlength = len(bytes_) * 8 + else: + if bytes_ is None: + bytes_ = bytes(bitlength // 8 + 1) + bitlength = bitlength + else: + bytes_len = len(bytes_) * 8 + + if bytes_len == 0 and bitlength != 0: + raise ValueError('invalid bit length specified') + + if bytes_len != 0 and bitlength == 0: + raise ValueError('invalid bit length specified') + + if bitlength < bytes_len - 8: + raise ValueError('invalid bit length specified') + + if bitlength > bytes_len: + raise ValueError('invalid bit length specified') + + result = cls() + result._bytes = bytes_ + result._bitlength = bitlength + + return result + + @property + def bytes(self) -> builtins.bytes: + return self._bytes + + def as_string(self) -> str: + s = '' + + for i in range(self._bitlength): + s += str(self._getitem(i)) + if i % 4 == 3: + s += ' ' + + return s.strip() + + def to_int(self, bitorder: _BitOrderType = 'big', + *, signed: bool = False) -> int: + """Interpret the BitString as a Python int. + Acts similarly to int.from_bytes. + + :param bitorder: + Determines the bit order used to interpret the BitString. By + default, this function uses Postgres conventions for casting bits + to ints. If bitorder is 'big', the most significant bit is at the + start of the string (this is the same as the default). If bitorder + is 'little', the most significant bit is at the end of the string. + + :param bool signed: + Determines whether two's complement is used to interpret the + BitString. If signed is False, the returned value is always + non-negative. + + :return int: An integer representing the BitString. Information about + the BitString's exact length is lost. + + .. versionadded:: 0.18.0 + """ + x = int.from_bytes(self._bytes, byteorder='big') + x >>= -self._bitlength % 8 + if bitorder == 'big': + pass + elif bitorder == 'little': + x = int(bin(x)[:1:-1].ljust(self._bitlength, '0'), 2) + else: + raise ValueError("bitorder must be either 'big' or 'little'") + + if signed and self._bitlength > 0 and x & (1 << (self._bitlength - 1)): + x -= 1 << self._bitlength + return x + + @classmethod + def from_int(cls, x: int, length: int, + bitorder: _BitOrderType = 'big', *, signed: bool = False) \ + -> Self: + """Represent the Python int x as a BitString. + Acts similarly to int.to_bytes. + + :param int x: + An integer to represent. Negative integers are represented in two's + complement form, unless the argument signed is False, in which case + negative integers raise an OverflowError. + + :param int length: + The length of the resulting BitString. An OverflowError is raised + if the integer is not representable in this many bits. + + :param bitorder: + Determines the bit order used in the BitString representation. By + default, this function uses Postgres conventions for casting ints + to bits. If bitorder is 'big', the most significant bit is at the + start of the string (this is the same as the default). If bitorder + is 'little', the most significant bit is at the end of the string. + + :param bool signed: + Determines whether two's complement is used in the BitString + representation. If signed is False and a negative integer is given, + an OverflowError is raised. + + :return BitString: A BitString representing the input integer, in the + form specified by the other input args. + + .. versionadded:: 0.18.0 + """ + # Exception types are by analogy to int.to_bytes + if length < 0: + raise ValueError("length argument must be non-negative") + elif length < x.bit_length(): + raise OverflowError("int too big to convert") + + if x < 0: + if not signed: + raise OverflowError("can't convert negative int to unsigned") + x &= (1 << length) - 1 + + if bitorder == 'big': + pass + elif bitorder == 'little': + x = int(bin(x)[:1:-1].ljust(length, '0'), 2) + else: + raise ValueError("bitorder must be either 'big' or 'little'") + + x <<= (-length % 8) + bytes_ = x.to_bytes((length + 7) // 8, byteorder='big') + return cls.frombytes(bytes_, length) + + def __repr__(self) -> str: + return ''.format(self.as_string()) + + __str__: typing.Callable[['BitString'], str] = __repr__ + + def __eq__(self, other: object) -> bool: + if not isinstance(other, BitString): + return NotImplemented + + return (self._bytes == other._bytes and + self._bitlength == other._bitlength) + + def __hash__(self) -> int: + return hash((self._bytes, self._bitlength)) + + def _getitem(self, i: int) -> int: + byte = self._bytes[i // 8] + shift = 8 - i % 8 - 1 + return (byte >> shift) & 0x1 + + def __getitem__(self, i: int) -> int: + if isinstance(i, slice): + raise NotImplementedError('BitString does not support slices') + + if i >= self._bitlength: + raise IndexError('index out of range') + + return self._getitem(i) + + def __len__(self) -> int: + return self._bitlength + + +class Point(typing.Tuple[float, float]): + """Immutable representation of PostgreSQL `point` type.""" + + __slots__ = () + + def __new__( + cls, + x: ( + typing.SupportsFloat | + typing.SupportsIndex | + str | + builtins.bytes | + builtins.bytearray + ), + y: ( + typing.SupportsFloat | + typing.SupportsIndex | + str | + builtins.bytes | + builtins.bytearray + ) + ) -> Self: + return super().__new__(cls, + typing.cast(typing.Any, (float(x), float(y)))) + + def __repr__(self) -> str: + return '{}.{}({})'.format( + type(self).__module__, + type(self).__name__, + tuple.__repr__(self) + ) + + @property + def x(self) -> float: + return self[0] + + @property + def y(self) -> float: + return self[1] + + +class Box(typing.Tuple[Point, Point]): + """Immutable representation of PostgreSQL `box` type.""" + + __slots__ = () + + def __new__(cls, high: typing.Sequence[float], + low: typing.Sequence[float]) -> Self: + return super().__new__(cls, + typing.cast(typing.Any, (Point(*high), + Point(*low)))) + + def __repr__(self) -> str: + return '{}.{}({})'.format( + type(self).__module__, + type(self).__name__, + tuple.__repr__(self) + ) + + @property + def high(self) -> Point: + return self[0] + + @property + def low(self) -> Point: + return self[1] + + +class Line(typing.Tuple[float, float, float]): + """Immutable representation of PostgreSQL `line` type.""" + + __slots__ = () + + def __new__(cls, A: float, B: float, C: float) -> Self: + return super().__new__(cls, typing.cast(typing.Any, (A, B, C))) + + @property + def A(self) -> float: + return self[0] + + @property + def B(self) -> float: + return self[1] + + @property + def C(self) -> float: + return self[2] + + +class LineSegment(typing.Tuple[Point, Point]): + """Immutable representation of PostgreSQL `lseg` type.""" + + __slots__ = () + + def __new__(cls, p1: typing.Sequence[float], + p2: typing.Sequence[float]) -> Self: + return super().__new__(cls, + typing.cast(typing.Any, (Point(*p1), + Point(*p2)))) + + def __repr__(self) -> str: + return '{}.{}({})'.format( + type(self).__module__, + type(self).__name__, + tuple.__repr__(self) + ) + + @property + def p1(self) -> Point: + return self[0] + + @property + def p2(self) -> Point: + return self[1] + + +class Path: + """Immutable representation of PostgreSQL `path` type.""" + + __slots__ = '_is_closed', 'points' + + points: typing.Tuple[Point, ...] + + def __init__(self, *points: typing.Sequence[float], + is_closed: bool = False) -> None: + self.points = tuple(Point(*p) for p in points) + self._is_closed = is_closed + + @property + def is_closed(self) -> bool: + return self._is_closed + + def __eq__(self, other: object) -> bool: + if not isinstance(other, Path): + return NotImplemented + + return (self.points == other.points and + self._is_closed == other._is_closed) + + def __hash__(self) -> int: + return hash((self.points, self.is_closed)) + + def __iter__(self) -> typing.Iterator[Point]: + return iter(self.points) + + def __len__(self) -> int: + return len(self.points) + + @typing.overload + def __getitem__(self, i: int) -> Point: + ... + + @typing.overload + def __getitem__(self, i: slice) -> typing.Tuple[Point, ...]: + ... + + def __getitem__( + self, i: int | slice + ) -> Point | typing.Tuple[Point, ...]: + return self.points[i] + + def __contains__(self, point: object) -> bool: + return point in self.points + + +class Polygon(Path): + """Immutable representation of PostgreSQL `polygon` type.""" + + __slots__ = () + + def __init__(self, *points: typing.Sequence[float]) -> None: + # polygon is always closed + super().__init__(*points, is_closed=True) + + +class Circle(typing.Tuple[Point, float]): + """Immutable representation of PostgreSQL `circle` type.""" + + __slots__ = () + + def __new__(cls, center: Point, radius: float) -> Self: + return super().__new__(cls, typing.cast(typing.Any, (center, radius))) + + @property + def center(self) -> Point: + return self[0] + + @property + def radius(self) -> float: + return self[1] diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/uuid.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/uuid.pyx new file mode 100755 index 0000000..e1accd2 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pgproto/uuid.pyx @@ -0,0 +1,359 @@ +import functools +import uuid + +cimport cython +cimport cpython + +from libc.stdint cimport uint8_t, int8_t +from libc.string cimport memcpy, memcmp + + +cdef extern from "Python.h": + int PyUnicode_1BYTE_KIND + const char* PyUnicode_AsUTF8AndSize( + object unicode, Py_ssize_t *size) except NULL + object PyUnicode_FromKindAndData( + int kind, const void *buffer, Py_ssize_t size) + + +cdef extern from "./tohex.h": + cdef void uuid_to_str(const char *source, char *dest) + cdef void uuid_to_hex(const char *source, char *dest) + + +# A more efficient UUID type implementation +# (6-7x faster than the starndard uuid.UUID): +# +# -= Benchmark results (less is better): =- +# +# std_UUID(bytes): 1.2368 +# c_UUID(bytes): * 0.1645 (7.52x) +# object(): 0.1483 +# +# std_UUID(str): 1.8038 +# c_UUID(str): * 0.2313 (7.80x) +# +# str(std_UUID()): 1.4625 +# str(c_UUID()): * 0.2681 (5.46x) +# str(object()): 0.5975 +# +# std_UUID().bytes: 0.3508 +# c_UUID().bytes: * 0.1068 (3.28x) +# +# std_UUID().int: 0.0871 +# c_UUID().int: * 0.0856 +# +# std_UUID().hex: 0.4871 +# c_UUID().hex: * 0.1405 +# +# hash(std_UUID()): 0.3635 +# hash(c_UUID()): * 0.1564 (2.32x) +# +# dct[std_UUID()]: 0.3319 +# dct[c_UUID()]: * 0.1570 (2.11x) +# +# std_UUID() ==: 0.3478 +# c_UUID() ==: * 0.0915 (3.80x) + + +cdef char _hextable[256] +_hextable[:] = [ + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1, 0,1,2,3,4,5,6,7,8,9,-1,-1,-1,-1,-1,-1,-1,10,11,12,13,14,15,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +] + + +std_UUID = uuid.UUID + + +cdef pg_uuid_bytes_from_str(str u, char *out): + cdef: + const char *orig_buf + Py_ssize_t size + unsigned char ch + uint8_t acc, part, acc_set + int i, j + + orig_buf = PyUnicode_AsUTF8AndSize(u, &size) + if size > 36 or size < 32: + raise ValueError( + f'invalid UUID {u!r}: ' + f'length must be between 32..36 characters, got {size}') + + acc_set = 0 + j = 0 + for i in range(size): + ch = orig_buf[i] + if ch == b'-': + continue + + part = _hextable[ch] + if part == -1: + if ch >= 0x20 and ch <= 0x7e: + raise ValueError( + f'invalid UUID {u!r}: unexpected character {chr(ch)!r}') + else: + raise ValueError('invalid UUID {u!r}: unexpected character') + + if acc_set: + acc |= part + out[j] = acc + acc_set = 0 + j += 1 + else: + acc = (part << 4) + acc_set = 1 + + if j > 16 or (j == 16 and acc_set): + raise ValueError( + f'invalid UUID {u!r}: decodes to more than 16 bytes') + + if j != 16: + raise ValueError( + f'invalid UUID {u!r}: decodes to less than 16 bytes') + + +cdef class __UUIDReplaceMe: + pass + + +cdef pg_uuid_from_buf(const char *buf): + cdef: + UUID u = UUID.__new__(UUID) + memcpy(u._data, buf, 16) + return u + + +@cython.final +@cython.no_gc_clear +cdef class UUID(__UUIDReplaceMe): + + cdef: + char _data[16] + object _int + object _hash + object __weakref__ + + def __cinit__(self): + self._int = None + self._hash = None + + def __init__(self, inp): + cdef: + char *buf + Py_ssize_t size + + if cpython.PyBytes_Check(inp): + cpython.PyBytes_AsStringAndSize(inp, &buf, &size) + if size != 16: + raise ValueError(f'16 bytes were expected, got {size}') + memcpy(self._data, buf, 16) + + elif cpython.PyUnicode_Check(inp): + pg_uuid_bytes_from_str(inp, self._data) + else: + raise TypeError(f'a bytes or str object expected, got {inp!r}') + + @property + def bytes(self): + return cpython.PyBytes_FromStringAndSize(self._data, 16) + + @property + def int(self): + if self._int is None: + # The cache is important because `self.int` can be + # used multiple times by __hash__ etc. + # + # The or 0 works around a bug interaction between cpython + # 3.10 and earlier and Cython ~3.0.11 in which + # int.from_bytes returns a "non-canonical 0" and then + # Cython's implementation of & mishandles it. + # See cython/cython#6480. + self._int = int.from_bytes(self.bytes, 'big') or 0 + return self._int + + @property + def is_safe(self): + return uuid.SafeUUID.unknown + + def __str__(self): + cdef char out[36] + uuid_to_str(self._data, out) + return PyUnicode_FromKindAndData(PyUnicode_1BYTE_KIND, out, 36) + + @property + def hex(self): + cdef char out[32] + uuid_to_hex(self._data, out) + return PyUnicode_FromKindAndData(PyUnicode_1BYTE_KIND, out, 32) + + def __repr__(self): + return f"UUID('{self}')" + + def __reduce__(self): + return (type(self), (self.bytes,)) + + def __eq__(self, other): + if type(other) is UUID: + return memcmp(self._data, (other)._data, 16) == 0 + if isinstance(other, std_UUID): + return self.int == other.int + return NotImplemented + + def __ne__(self, other): + if type(other) is UUID: + return memcmp(self._data, (other)._data, 16) != 0 + if isinstance(other, std_UUID): + return self.int != other.int + return NotImplemented + + def __lt__(self, other): + if type(other) is UUID: + return memcmp(self._data, (other)._data, 16) < 0 + if isinstance(other, std_UUID): + return self.int < other.int + return NotImplemented + + def __gt__(self, other): + if type(other) is UUID: + return memcmp(self._data, (other)._data, 16) > 0 + if isinstance(other, std_UUID): + return self.int > other.int + return NotImplemented + + def __le__(self, other): + if type(other) is UUID: + return memcmp(self._data, (other)._data, 16) <= 0 + if isinstance(other, std_UUID): + return self.int <= other.int + return NotImplemented + + def __ge__(self, other): + if type(other) is UUID: + return memcmp(self._data, (other)._data, 16) >= 0 + if isinstance(other, std_UUID): + return self.int >= other.int + return NotImplemented + + def __hash__(self): + # In EdgeDB every schema object has a uuid and there are + # huge hash-maps of them. We want UUID.__hash__ to be + # as fast as possible. + if self._hash is not None: + return self._hash + + self._hash = hash(self.int) + return self._hash + + def __int__(self): + return self.int + + @property + def bytes_le(self): + bytes = self.bytes + return (bytes[4-1::-1] + bytes[6-1:4-1:-1] + bytes[8-1:6-1:-1] + + bytes[8:]) + + @property + def fields(self): + return (self.time_low, self.time_mid, self.time_hi_version, + self.clock_seq_hi_variant, self.clock_seq_low, self.node) + + @property + def time_low(self): + return self.int >> 96 + + @property + def time_mid(self): + return (self.int >> 80) & 0xffff + + @property + def time_hi_version(self): + return (self.int >> 64) & 0xffff + + @property + def clock_seq_hi_variant(self): + return (self.int >> 56) & 0xff + + @property + def clock_seq_low(self): + return (self.int >> 48) & 0xff + + @property + def time(self): + return (((self.time_hi_version & 0x0fff) << 48) | + (self.time_mid << 32) | self.time_low) + + @property + def clock_seq(self): + return (((self.clock_seq_hi_variant & 0x3f) << 8) | + self.clock_seq_low) + + @property + def node(self): + return self.int & 0xffffffffffff + + @property + def urn(self): + return 'urn:uuid:' + str(self) + + @property + def variant(self): + if not self.int & (0x8000 << 48): + return uuid.RESERVED_NCS + elif not self.int & (0x4000 << 48): + return uuid.RFC_4122 + elif not self.int & (0x2000 << 48): + return uuid.RESERVED_MICROSOFT + else: + return uuid.RESERVED_FUTURE + + @property + def version(self): + # The version bits are only meaningful for RFC 4122 UUIDs. + if self.variant == uuid.RFC_4122: + return int((self.int >> 76) & 0xf) + + +# +# In order for `isinstance(pgproto.UUID, uuid.UUID)` to work, +# patch __bases__ and __mro__ by injecting `uuid.UUID`. +# +# We apply brute-force here because the following pattern stopped +# working with Python 3.8: +# +# cdef class OurUUID: +# ... +# +# class UUID(OurUUID, uuid.UUID): +# ... +# +# With Python 3.8 it now produces +# +# "TypeError: multiple bases have instance lay-out conflict" +# +# error. Maybe it's possible to fix this some other way, but +# the best solution possible would be to just contribute our +# faster UUID to the standard library and not have this problem +# at all. For now this hack is pretty safe and should be +# compatible with future Pythons for long enough. +# +assert UUID.__bases__[0] is __UUIDReplaceMe +assert UUID.__mro__[1] is __UUIDReplaceMe +cpython.Py_INCREF(std_UUID) +cpython.PyTuple_SET_ITEM(UUID.__bases__, 0, std_UUID) +cpython.Py_INCREF(std_UUID) +cpython.PyTuple_SET_ITEM(UUID.__mro__, 1, std_UUID) +# + + +pg_UUID = UUID diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pool.py b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pool.py new file mode 100755 index 0000000..5c7ea9c --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/pool.py @@ -0,0 +1,1248 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + +from __future__ import annotations + +import asyncio +from collections.abc import Awaitable, Callable +import functools +import inspect +import logging +import time +from types import TracebackType +from typing import Any, Optional, Type +import warnings + +from . import compat +from . import connection +from . import exceptions +from . import protocol + + +logger = logging.getLogger(__name__) + + +class PoolConnectionProxyMeta(type): + + def __new__( + mcls, + name: str, + bases: tuple[Type[Any], ...], + dct: dict[str, Any], + *, + wrap: bool = False, + ) -> PoolConnectionProxyMeta: + if wrap: + for attrname in dir(connection.Connection): + if attrname.startswith('_') or attrname in dct: + continue + + meth = getattr(connection.Connection, attrname) + if not inspect.isfunction(meth): + continue + + iscoroutine = inspect.iscoroutinefunction(meth) + wrapper = mcls._wrap_connection_method(attrname, iscoroutine) + wrapper = functools.update_wrapper(wrapper, meth) + dct[attrname] = wrapper + + if '__doc__' not in dct: + dct['__doc__'] = connection.Connection.__doc__ + + return super().__new__(mcls, name, bases, dct) + + @staticmethod + def _wrap_connection_method( + meth_name: str, iscoroutine: bool + ) -> Callable[..., Any]: + def call_con_method(self: Any, *args: Any, **kwargs: Any) -> Any: + # This method will be owned by PoolConnectionProxy class. + if self._con is None: + raise exceptions.InterfaceError( + 'cannot call Connection.{}(): ' + 'connection has been released back to the pool'.format( + meth_name)) + + meth = getattr(self._con.__class__, meth_name) + return meth(self._con, *args, **kwargs) + + if iscoroutine: + compat.markcoroutinefunction(call_con_method) + + return call_con_method + + +class PoolConnectionProxy(connection._ConnectionProxy, + metaclass=PoolConnectionProxyMeta, + wrap=True): + + __slots__ = ('_con', '_holder') + + def __init__( + self, holder: PoolConnectionHolder, con: connection.Connection + ) -> None: + self._con = con + self._holder = holder + con._set_proxy(self) + + def __getattr__(self, attr: str) -> Any: + # Proxy all unresolved attributes to the wrapped Connection object. + return getattr(self._con, attr) + + def _detach(self) -> Optional[connection.Connection]: + if self._con is None: + return + + con, self._con = self._con, None + con._set_proxy(None) + return con + + def __repr__(self) -> str: + if self._con is None: + return '<{classname} [released] {id:#x}>'.format( + classname=self.__class__.__name__, id=id(self)) + else: + return '<{classname} {con!r} {id:#x}>'.format( + classname=self.__class__.__name__, con=self._con, id=id(self)) + + +class PoolConnectionHolder: + + __slots__ = ('_con', '_pool', '_loop', '_proxy', + '_max_queries', '_setup', + '_max_inactive_time', '_in_use', + '_inactive_callback', '_timeout', + '_generation') + + def __init__( + self, + pool: "Pool", + *, + max_queries: float, + setup: Optional[Callable[[PoolConnectionProxy], Awaitable[None]]], + max_inactive_time: float, + ) -> None: + + self._pool = pool + self._con: Optional[connection.Connection] = None + self._proxy: Optional[PoolConnectionProxy] = None + + self._max_queries = max_queries + self._max_inactive_time = max_inactive_time + self._setup = setup + self._inactive_callback: Optional[Callable] = None + self._in_use: Optional[asyncio.Future] = None + self._timeout: Optional[float] = None + self._generation: Optional[int] = None + + def is_connected(self) -> bool: + return self._con is not None and not self._con.is_closed() + + def is_idle(self) -> bool: + return not self._in_use + + async def connect(self) -> None: + if self._con is not None: + raise exceptions.InternalClientError( + 'PoolConnectionHolder.connect() called while another ' + 'connection already exists') + + self._con = await self._pool._get_new_connection() + self._generation = self._pool._generation + self._maybe_cancel_inactive_callback() + self._setup_inactive_callback() + + async def acquire(self) -> PoolConnectionProxy: + if self._con is None or self._con.is_closed(): + self._con = None + await self.connect() + + elif self._generation != self._pool._generation: + # Connections have been expired, re-connect the holder. + self._pool._loop.create_task( + self._con.close(timeout=self._timeout)) + self._con = None + await self.connect() + + self._maybe_cancel_inactive_callback() + + self._proxy = proxy = PoolConnectionProxy(self, self._con) + + if self._setup is not None: + try: + await self._setup(proxy) + except (Exception, asyncio.CancelledError) as ex: + # If a user-defined `setup` function fails, we don't + # know if the connection is safe for re-use, hence + # we close it. A new connection will be created + # when `acquire` is called again. + try: + # Use `close()` to close the connection gracefully. + # An exception in `setup` isn't necessarily caused + # by an IO or a protocol error. close() will + # do the necessary cleanup via _release_on_close(). + await self._con.close() + finally: + raise ex + + self._in_use = self._pool._loop.create_future() + + return proxy + + async def release(self, timeout: Optional[float]) -> None: + if self._in_use is None: + raise exceptions.InternalClientError( + 'PoolConnectionHolder.release() called on ' + 'a free connection holder') + + if self._con.is_closed(): + # When closing, pool connections perform the necessary + # cleanup, so we don't have to do anything else here. + return + + self._timeout = None + + if self._con._protocol.queries_count >= self._max_queries: + # The connection has reached its maximum utilization limit, + # so close it. Connection.close() will call _release(). + await self._con.close(timeout=timeout) + return + + if self._generation != self._pool._generation: + # The connection has expired because it belongs to + # an older generation (Pool.expire_connections() has + # been called.) + await self._con.close(timeout=timeout) + return + + try: + budget = timeout + + if self._con._protocol._is_cancelling(): + # If the connection is in cancellation state, + # wait for the cancellation + started = time.monotonic() + await compat.wait_for( + self._con._protocol._wait_for_cancellation(), + budget) + if budget is not None: + budget -= time.monotonic() - started + + if self._pool._reset is not None: + async with compat.timeout(budget): + await self._con._reset() + await self._pool._reset(self._con) + else: + await self._con.reset(timeout=budget) + except (Exception, asyncio.CancelledError) as ex: + # If the `reset` call failed, terminate the connection. + # A new one will be created when `acquire` is called + # again. + try: + # An exception in `reset` is most likely caused by + # an IO error, so terminate the connection. + self._con.terminate() + finally: + raise ex + + # Free this connection holder and invalidate the + # connection proxy. + self._release() + + # Rearm the connection inactivity timer. + self._setup_inactive_callback() + + async def wait_until_released(self) -> None: + if self._in_use is None: + return + else: + await self._in_use + + async def close(self) -> None: + if self._con is not None: + # Connection.close() will call _release_on_close() to + # finish holder cleanup. + await self._con.close() + + def terminate(self) -> None: + if self._con is not None: + # Connection.terminate() will call _release_on_close() to + # finish holder cleanup. + self._con.terminate() + + def _setup_inactive_callback(self) -> None: + if self._inactive_callback is not None: + raise exceptions.InternalClientError( + 'pool connection inactivity timer already exists') + + if self._max_inactive_time: + self._inactive_callback = self._pool._loop.call_later( + self._max_inactive_time, self._deactivate_inactive_connection) + + def _maybe_cancel_inactive_callback(self) -> None: + if self._inactive_callback is not None: + self._inactive_callback.cancel() + self._inactive_callback = None + + def _deactivate_inactive_connection(self) -> None: + if self._in_use is not None: + raise exceptions.InternalClientError( + 'attempting to deactivate an acquired connection') + + if self._con is not None: + # The connection is idle and not in use, so it's fine to + # use terminate() instead of close(). + self._con.terminate() + # Must call clear_connection, because _deactivate_connection + # is called when the connection is *not* checked out, and + # so terminate() above will not call the below. + self._release_on_close() + + def _release_on_close(self) -> None: + self._maybe_cancel_inactive_callback() + self._release() + self._con = None + + def _release(self) -> None: + """Release this connection holder.""" + if self._in_use is None: + # The holder is not checked out. + return + + if not self._in_use.done(): + self._in_use.set_result(None) + self._in_use = None + + # Deinitialize the connection proxy. All subsequent + # operations on it will fail. + if self._proxy is not None: + self._proxy._detach() + self._proxy = None + + # Put ourselves back to the pool queue. + self._pool._queue.put_nowait(self) + + +class Pool: + """A connection pool. + + Connection pool can be used to manage a set of connections to the database. + Connections are first acquired from the pool, then used, and then released + back to the pool. Once a connection is released, it's reset to close all + open cursors and other resources *except* prepared statements. + + Pools are created by calling :func:`~asyncpg.pool.create_pool`. + """ + + __slots__ = ( + '_queue', '_loop', '_minsize', '_maxsize', + '_init', '_connect', '_reset', '_connect_args', '_connect_kwargs', + '_holders', '_initialized', '_initializing', '_closing', + '_closed', '_connection_class', '_record_class', '_generation', + '_setup', '_max_queries', '_max_inactive_connection_lifetime' + ) + + def __init__(self, *connect_args, + min_size, + max_size, + max_queries, + max_inactive_connection_lifetime, + connect=None, + setup=None, + init=None, + reset=None, + loop, + connection_class, + record_class, + **connect_kwargs): + + if len(connect_args) > 1: + warnings.warn( + "Passing multiple positional arguments to asyncpg.Pool " + "constructor is deprecated and will be removed in " + "asyncpg 0.17.0. The non-deprecated form is " + "asyncpg.Pool(, **kwargs)", + DeprecationWarning, stacklevel=2) + + if loop is None: + loop = asyncio.get_event_loop() + self._loop = loop + + if max_size <= 0: + raise ValueError('max_size is expected to be greater than zero') + + if min_size < 0: + raise ValueError( + 'min_size is expected to be greater or equal to zero') + + if min_size > max_size: + raise ValueError('min_size is greater than max_size') + + if max_queries <= 0: + raise ValueError('max_queries is expected to be greater than zero') + + if max_inactive_connection_lifetime < 0: + raise ValueError( + 'max_inactive_connection_lifetime is expected to be greater ' + 'or equal to zero') + + if not issubclass(connection_class, connection.Connection): + raise TypeError( + 'connection_class is expected to be a subclass of ' + 'asyncpg.Connection, got {!r}'.format(connection_class)) + + if not issubclass(record_class, protocol.Record): + raise TypeError( + 'record_class is expected to be a subclass of ' + 'asyncpg.Record, got {!r}'.format(record_class)) + + self._minsize = min_size + self._maxsize = max_size + + self._holders = [] + self._initialized = False + self._initializing = False + self._queue = None + + self._connection_class = connection_class + self._record_class = record_class + + self._closing = False + self._closed = False + self._generation = 0 + + self._connect = connect if connect is not None else connection.connect + self._connect_args = connect_args + self._connect_kwargs = connect_kwargs + + self._setup = setup + self._init = init + self._reset = reset + + self._max_queries = max_queries + self._max_inactive_connection_lifetime = \ + max_inactive_connection_lifetime + + async def _async__init__(self): + if self._initialized: + return self + if self._initializing: + raise exceptions.InterfaceError( + 'pool is being initialized in another task') + if self._closed: + raise exceptions.InterfaceError('pool is closed') + self._initializing = True + try: + await self._initialize() + return self + finally: + self._initializing = False + self._initialized = True + + async def _initialize(self): + self._queue = asyncio.LifoQueue(maxsize=self._maxsize) + for _ in range(self._maxsize): + ch = PoolConnectionHolder( + self, + max_queries=self._max_queries, + max_inactive_time=self._max_inactive_connection_lifetime, + setup=self._setup) + + self._holders.append(ch) + self._queue.put_nowait(ch) + + if self._minsize: + # Since we use a LIFO queue, the first items in the queue will be + # the last ones in `self._holders`. We want to pre-connect the + # first few connections in the queue, therefore we want to walk + # `self._holders` in reverse. + + # Connect the first connection holder in the queue so that + # any connection issues are visible early. + first_ch = self._holders[-1] # type: PoolConnectionHolder + await first_ch.connect() + + if self._minsize > 1: + connect_tasks = [] + for i, ch in enumerate(reversed(self._holders[:-1])): + # `minsize - 1` because we already have first_ch + if i >= self._minsize - 1: + break + connect_tasks.append(ch.connect()) + + await asyncio.gather(*connect_tasks) + + def is_closing(self): + """Return ``True`` if the pool is closing or is closed. + + .. versionadded:: 0.28.0 + """ + return self._closed or self._closing + + def get_size(self): + """Return the current number of connections in this pool. + + .. versionadded:: 0.25.0 + """ + return sum(h.is_connected() for h in self._holders) + + def get_min_size(self): + """Return the minimum number of connections in this pool. + + .. versionadded:: 0.25.0 + """ + return self._minsize + + def get_max_size(self): + """Return the maximum allowed number of connections in this pool. + + .. versionadded:: 0.25.0 + """ + return self._maxsize + + def get_idle_size(self): + """Return the current number of idle connections in this pool. + + .. versionadded:: 0.25.0 + """ + return sum(h.is_connected() and h.is_idle() for h in self._holders) + + def set_connect_args(self, dsn=None, **connect_kwargs): + r"""Set the new connection arguments for this pool. + + The new connection arguments will be used for all subsequent + new connection attempts. Existing connections will remain until + they expire. Use :meth:`Pool.expire_connections() + ` to expedite the connection + expiry. + + :param str dsn: + Connection arguments specified using as a single string in + the following format: + ``postgres://user:pass@host:port/database?option=value``. + + :param \*\*connect_kwargs: + Keyword arguments for the :func:`~asyncpg.connection.connect` + function. + + .. versionadded:: 0.16.0 + """ + + self._connect_args = [dsn] + self._connect_kwargs = connect_kwargs + + async def _get_new_connection(self): + con = await self._connect( + *self._connect_args, + loop=self._loop, + connection_class=self._connection_class, + record_class=self._record_class, + **self._connect_kwargs, + ) + if not isinstance(con, self._connection_class): + good = self._connection_class + good_n = f'{good.__module__}.{good.__name__}' + bad = type(con) + if bad.__module__ == "builtins": + bad_n = bad.__name__ + else: + bad_n = f'{bad.__module__}.{bad.__name__}' + raise exceptions.InterfaceError( + "expected pool connect callback to return an instance of " + f"'{good_n}', got " f"'{bad_n}'" + ) + + if self._init is not None: + try: + await self._init(con) + except (Exception, asyncio.CancelledError) as ex: + # If a user-defined `init` function fails, we don't + # know if the connection is safe for re-use, hence + # we close it. A new connection will be created + # when `acquire` is called again. + try: + # Use `close()` to close the connection gracefully. + # An exception in `init` isn't necessarily caused + # by an IO or a protocol error. close() will + # do the necessary cleanup via _release_on_close(). + await con.close() + finally: + raise ex + + return con + + async def execute( + self, + query: str, + *args, + timeout: Optional[float]=None, + ) -> str: + """Execute an SQL command (or commands). + + Pool performs this operation using one of its connections. Other than + that, it behaves identically to + :meth:`Connection.execute() `. + + .. versionadded:: 0.10.0 + """ + async with self.acquire() as con: + return await con.execute(query, *args, timeout=timeout) + + async def executemany( + self, + command: str, + args, + *, + timeout: Optional[float]=None, + ): + """Execute an SQL *command* for each sequence of arguments in *args*. + + Pool performs this operation using one of its connections. Other than + that, it behaves identically to + :meth:`Connection.executemany() + `. + + .. versionadded:: 0.10.0 + """ + async with self.acquire() as con: + return await con.executemany(command, args, timeout=timeout) + + async def fetch( + self, + query, + *args, + timeout=None, + record_class=None + ) -> list: + """Run a query and return the results as a list of :class:`Record`. + + Pool performs this operation using one of its connections. Other than + that, it behaves identically to + :meth:`Connection.fetch() `. + + .. versionadded:: 0.10.0 + """ + async with self.acquire() as con: + return await con.fetch( + query, + *args, + timeout=timeout, + record_class=record_class + ) + + async def fetchval(self, query, *args, column=0, timeout=None): + """Run a query and return a value in the first row. + + Pool performs this operation using one of its connections. Other than + that, it behaves identically to + :meth:`Connection.fetchval() + `. + + .. versionadded:: 0.10.0 + """ + async with self.acquire() as con: + return await con.fetchval( + query, *args, column=column, timeout=timeout) + + async def fetchrow(self, query, *args, timeout=None, record_class=None): + """Run a query and return the first row. + + Pool performs this operation using one of its connections. Other than + that, it behaves identically to + :meth:`Connection.fetchrow() `. + + .. versionadded:: 0.10.0 + """ + async with self.acquire() as con: + return await con.fetchrow( + query, + *args, + timeout=timeout, + record_class=record_class + ) + + async def fetchmany(self, query, args, *, timeout=None, record_class=None): + """Run a query for each sequence of arguments in *args* + and return the results as a list of :class:`Record`. + + Pool performs this operation using one of its connections. Other than + that, it behaves identically to + :meth:`Connection.fetchmany() + `. + + .. versionadded:: 0.30.0 + """ + async with self.acquire() as con: + return await con.fetchmany( + query, args, timeout=timeout, record_class=record_class + ) + + async def copy_from_table( + self, + table_name, + *, + output, + columns=None, + schema_name=None, + timeout=None, + format=None, + oids=None, + delimiter=None, + null=None, + header=None, + quote=None, + escape=None, + force_quote=None, + encoding=None + ): + """Copy table contents to a file or file-like object. + + Pool performs this operation using one of its connections. Other than + that, it behaves identically to + :meth:`Connection.copy_from_table() + `. + + .. versionadded:: 0.24.0 + """ + async with self.acquire() as con: + return await con.copy_from_table( + table_name, + output=output, + columns=columns, + schema_name=schema_name, + timeout=timeout, + format=format, + oids=oids, + delimiter=delimiter, + null=null, + header=header, + quote=quote, + escape=escape, + force_quote=force_quote, + encoding=encoding + ) + + async def copy_from_query( + self, + query, + *args, + output, + timeout=None, + format=None, + oids=None, + delimiter=None, + null=None, + header=None, + quote=None, + escape=None, + force_quote=None, + encoding=None + ): + """Copy the results of a query to a file or file-like object. + + Pool performs this operation using one of its connections. Other than + that, it behaves identically to + :meth:`Connection.copy_from_query() + `. + + .. versionadded:: 0.24.0 + """ + async with self.acquire() as con: + return await con.copy_from_query( + query, + *args, + output=output, + timeout=timeout, + format=format, + oids=oids, + delimiter=delimiter, + null=null, + header=header, + quote=quote, + escape=escape, + force_quote=force_quote, + encoding=encoding + ) + + async def copy_to_table( + self, + table_name, + *, + source, + columns=None, + schema_name=None, + timeout=None, + format=None, + oids=None, + freeze=None, + delimiter=None, + null=None, + header=None, + quote=None, + escape=None, + force_quote=None, + force_not_null=None, + force_null=None, + encoding=None, + where=None + ): + """Copy data to the specified table. + + Pool performs this operation using one of its connections. Other than + that, it behaves identically to + :meth:`Connection.copy_to_table() + `. + + .. versionadded:: 0.24.0 + """ + async with self.acquire() as con: + return await con.copy_to_table( + table_name, + source=source, + columns=columns, + schema_name=schema_name, + timeout=timeout, + format=format, + oids=oids, + freeze=freeze, + delimiter=delimiter, + null=null, + header=header, + quote=quote, + escape=escape, + force_quote=force_quote, + force_not_null=force_not_null, + force_null=force_null, + encoding=encoding, + where=where + ) + + async def copy_records_to_table( + self, + table_name, + *, + records, + columns=None, + schema_name=None, + timeout=None, + where=None + ): + """Copy a list of records to the specified table using binary COPY. + + Pool performs this operation using one of its connections. Other than + that, it behaves identically to + :meth:`Connection.copy_records_to_table() + `. + + .. versionadded:: 0.24.0 + """ + async with self.acquire() as con: + return await con.copy_records_to_table( + table_name, + records=records, + columns=columns, + schema_name=schema_name, + timeout=timeout, + where=where + ) + + def acquire(self, *, timeout=None): + """Acquire a database connection from the pool. + + :param float timeout: A timeout for acquiring a Connection. + :return: An instance of :class:`~asyncpg.connection.Connection`. + + Can be used in an ``await`` expression or with an ``async with`` block. + + .. code-block:: python + + async with pool.acquire() as con: + await con.execute(...) + + Or: + + .. code-block:: python + + con = await pool.acquire() + try: + await con.execute(...) + finally: + await pool.release(con) + """ + return PoolAcquireContext(self, timeout) + + async def _acquire(self, timeout): + async def _acquire_impl(): + ch = await self._queue.get() # type: PoolConnectionHolder + try: + proxy = await ch.acquire() # type: PoolConnectionProxy + except (Exception, asyncio.CancelledError): + self._queue.put_nowait(ch) + raise + else: + # Record the timeout, as we will apply it by default + # in release(). + ch._timeout = timeout + return proxy + + if self._closing: + raise exceptions.InterfaceError('pool is closing') + self._check_init() + + if timeout is None: + return await _acquire_impl() + else: + return await compat.wait_for( + _acquire_impl(), timeout=timeout) + + async def release(self, connection, *, timeout=None): + """Release a database connection back to the pool. + + :param Connection connection: + A :class:`~asyncpg.connection.Connection` object to release. + :param float timeout: + A timeout for releasing the connection. If not specified, defaults + to the timeout provided in the corresponding call to the + :meth:`Pool.acquire() ` method. + + .. versionchanged:: 0.14.0 + Added the *timeout* parameter. + """ + if (type(connection) is not PoolConnectionProxy or + connection._holder._pool is not self): + raise exceptions.InterfaceError( + 'Pool.release() received invalid connection: ' + '{connection!r} is not a member of this pool'.format( + connection=connection)) + + if connection._con is None: + # Already released, do nothing. + return + + self._check_init() + + # Let the connection do its internal housekeeping when its released. + connection._con._on_release() + + ch = connection._holder + if timeout is None: + timeout = ch._timeout + + # Use asyncio.shield() to guarantee that task cancellation + # does not prevent the connection from being returned to the + # pool properly. + return await asyncio.shield(ch.release(timeout)) + + async def close(self): + """Attempt to gracefully close all connections in the pool. + + Wait until all pool connections are released, close them and + shut down the pool. If any error (including cancellation) occurs + in ``close()`` the pool will terminate by calling + :meth:`Pool.terminate() `. + + It is advisable to use :func:`python:asyncio.wait_for` to set + a timeout. + + .. versionchanged:: 0.16.0 + ``close()`` now waits until all pool connections are released + before closing them and the pool. Errors raised in ``close()`` + will cause immediate pool termination. + """ + if self._closed: + return + self._check_init() + + self._closing = True + + warning_callback = None + try: + warning_callback = self._loop.call_later( + 60, self._warn_on_long_close) + + release_coros = [ + ch.wait_until_released() for ch in self._holders] + await asyncio.gather(*release_coros) + + close_coros = [ + ch.close() for ch in self._holders] + await asyncio.gather(*close_coros) + + except (Exception, asyncio.CancelledError): + self.terminate() + raise + + finally: + if warning_callback is not None: + warning_callback.cancel() + self._closed = True + self._closing = False + + def _warn_on_long_close(self): + logger.warning('Pool.close() is taking over 60 seconds to complete. ' + 'Check if you have any unreleased connections left. ' + 'Use asyncio.wait_for() to set a timeout for ' + 'Pool.close().') + + def terminate(self): + """Terminate all connections in the pool.""" + if self._closed: + return + self._check_init() + for ch in self._holders: + ch.terminate() + self._closed = True + + async def expire_connections(self): + """Expire all currently open connections. + + Cause all currently open connections to get replaced on the + next :meth:`~asyncpg.pool.Pool.acquire()` call. + + .. versionadded:: 0.16.0 + """ + self._generation += 1 + + def _check_init(self): + if not self._initialized: + if self._initializing: + raise exceptions.InterfaceError( + 'pool is being initialized, but not yet ready: ' + 'likely there is a race between creating a pool and ' + 'using it') + raise exceptions.InterfaceError('pool is not initialized') + if self._closed: + raise exceptions.InterfaceError('pool is closed') + + def _drop_statement_cache(self): + # Drop statement cache for all connections in the pool. + for ch in self._holders: + if ch._con is not None: + ch._con._drop_local_statement_cache() + + def _drop_type_cache(self): + # Drop type codec cache for all connections in the pool. + for ch in self._holders: + if ch._con is not None: + ch._con._drop_local_type_cache() + + def __await__(self): + return self._async__init__().__await__() + + async def __aenter__(self): + await self._async__init__() + return self + + async def __aexit__(self, *exc): + await self.close() + + +class PoolAcquireContext: + + __slots__ = ('timeout', 'connection', 'done', 'pool') + + def __init__(self, pool: Pool, timeout: Optional[float]) -> None: + self.pool = pool + self.timeout = timeout + self.connection = None + self.done = False + + async def __aenter__(self): + if self.connection is not None or self.done: + raise exceptions.InterfaceError('a connection is already acquired') + self.connection = await self.pool._acquire(self.timeout) + return self.connection + + async def __aexit__( + self, + exc_type: Optional[Type[BaseException]] = None, + exc_val: Optional[BaseException] = None, + exc_tb: Optional[TracebackType] = None, + ) -> None: + self.done = True + con = self.connection + self.connection = None + await self.pool.release(con) + + def __await__(self): + self.done = True + return self.pool._acquire(self.timeout).__await__() + + +def create_pool(dsn=None, *, + min_size=10, + max_size=10, + max_queries=50000, + max_inactive_connection_lifetime=300.0, + connect=None, + setup=None, + init=None, + reset=None, + loop=None, + connection_class=connection.Connection, + record_class=protocol.Record, + **connect_kwargs): + r"""Create a connection pool. + + Can be used either with an ``async with`` block: + + .. code-block:: python + + async with asyncpg.create_pool(user='postgres', + command_timeout=60) as pool: + await pool.fetch('SELECT 1') + + Or to perform multiple operations on a single connection: + + .. code-block:: python + + async with asyncpg.create_pool(user='postgres', + command_timeout=60) as pool: + async with pool.acquire() as con: + await con.execute(''' + CREATE TABLE names ( + id serial PRIMARY KEY, + name VARCHAR (255) NOT NULL) + ''') + await con.fetch('SELECT 1') + + Or directly with ``await`` (not recommended): + + .. code-block:: python + + pool = await asyncpg.create_pool(user='postgres', command_timeout=60) + con = await pool.acquire() + try: + await con.fetch('SELECT 1') + finally: + await pool.release(con) + + .. warning:: + Prepared statements and cursors returned by + :meth:`Connection.prepare() ` + and :meth:`Connection.cursor() ` + become invalid once the connection is released. Likewise, all + notification and log listeners are removed, and ``asyncpg`` will + issue a warning if there are any listener callbacks registered on a + connection that is being released to the pool. + + :param str dsn: + Connection arguments specified using as a single string in + the following format: + ``postgres://user:pass@host:port/database?option=value``. + + :param \*\*connect_kwargs: + Keyword arguments for the :func:`~asyncpg.connection.connect` + function. + + :param Connection connection_class: + The class to use for connections. Must be a subclass of + :class:`~asyncpg.connection.Connection`. + + :param type record_class: + If specified, the class to use for records returned by queries on + the connections in this pool. Must be a subclass of + :class:`~asyncpg.Record`. + + :param int min_size: + Number of connection the pool will be initialized with. + + :param int max_size: + Max number of connections in the pool. + + :param int max_queries: + Number of queries after a connection is closed and replaced + with a new connection. + + :param float max_inactive_connection_lifetime: + Number of seconds after which inactive connections in the + pool will be closed. Pass ``0`` to disable this mechanism. + + :param coroutine connect: + A coroutine that is called instead of + :func:`~asyncpg.connection.connect` whenever the pool needs to make a + new connection. Must return an instance of type specified by + *connection_class* or :class:`~asyncpg.connection.Connection` if + *connection_class* was not specified. + + :param coroutine setup: + A coroutine to prepare a connection right before it is returned + from :meth:`Pool.acquire()`. An example use + case would be to automatically set up notifications listeners for + all connections of a pool. + + :param coroutine init: + A coroutine to initialize a connection when it is created. + An example use case would be to setup type codecs with + :meth:`Connection.set_builtin_type_codec() <\ + asyncpg.connection.Connection.set_builtin_type_codec>` + or :meth:`Connection.set_type_codec() <\ + asyncpg.connection.Connection.set_type_codec>`. + + :param coroutine reset: + A coroutine to reset a connection before it is returned to the pool by + :meth:`Pool.release()`. The function is supposed + to reset any changes made to the database session so that the next + acquirer gets the connection in a well-defined state. + + The default implementation calls :meth:`Connection.reset() <\ + asyncpg.connection.Connection.reset>`, which runs the following:: + + SELECT pg_advisory_unlock_all(); + CLOSE ALL; + UNLISTEN *; + RESET ALL; + + The exact reset query is determined by detected server capabilities, + and a custom *reset* implementation can obtain the default query + by calling :meth:`Connection.get_reset_query() <\ + asyncpg.connection.Connection.get_reset_query>`. + + :param loop: + An asyncio event loop instance. If ``None``, the default + event loop will be used. + + :return: An instance of :class:`~asyncpg.pool.Pool`. + + .. versionchanged:: 0.10.0 + An :exc:`~asyncpg.exceptions.InterfaceError` will be raised on any + attempted operation on a released connection. + + .. versionchanged:: 0.13.0 + An :exc:`~asyncpg.exceptions.InterfaceError` will be raised on any + attempted operation on a prepared statement or a cursor created + on a connection that has been released to the pool. + + .. versionchanged:: 0.13.0 + An :exc:`~asyncpg.exceptions.InterfaceWarning` will be produced + if there are any active listeners (added via + :meth:`Connection.add_listener() + ` + or :meth:`Connection.add_log_listener() + `) present on the + connection at the moment of its release to the pool. + + .. versionchanged:: 0.22.0 + Added the *record_class* parameter. + + .. versionchanged:: 0.30.0 + Added the *connect* and *reset* parameters. + """ + return Pool( + dsn, + connection_class=connection_class, + record_class=record_class, + min_size=min_size, + max_size=max_size, + max_queries=max_queries, + loop=loop, + connect=connect, + setup=setup, + init=init, + reset=reset, + max_inactive_connection_lifetime=max_inactive_connection_lifetime, + **connect_kwargs, + ) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/prepared_stmt.py b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/prepared_stmt.py new file mode 100755 index 0000000..0c2d335 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/prepared_stmt.py @@ -0,0 +1,286 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +import json +import typing + +from . import connresource +from . import cursor +from . import exceptions + + +class PreparedStatement(connresource.ConnectionResource): + """A representation of a prepared statement.""" + + __slots__ = ('_state', '_query', '_last_status') + + def __init__(self, connection, query, state): + super().__init__(connection) + self._state = state + self._query = query + state.attach() + self._last_status = None + + @connresource.guarded + def get_name(self) -> str: + """Return the name of this prepared statement. + + .. versionadded:: 0.25.0 + """ + return self._state.name + + @connresource.guarded + def get_query(self) -> str: + """Return the text of the query for this prepared statement. + + Example:: + + stmt = await connection.prepare('SELECT $1::int') + assert stmt.get_query() == "SELECT $1::int" + """ + return self._query + + @connresource.guarded + def get_statusmsg(self) -> str: + """Return the status of the executed command. + + Example:: + + stmt = await connection.prepare('CREATE TABLE mytab (a int)') + await stmt.fetch() + assert stmt.get_statusmsg() == "CREATE TABLE" + """ + if self._last_status is None: + return self._last_status + return self._last_status.decode() + + @connresource.guarded + def get_parameters(self): + """Return a description of statement parameters types. + + :return: A tuple of :class:`asyncpg.types.Type`. + + Example:: + + stmt = await connection.prepare('SELECT ($1::int, $2::text)') + print(stmt.get_parameters()) + + # Will print: + # (Type(oid=23, name='int4', kind='scalar', schema='pg_catalog'), + # Type(oid=25, name='text', kind='scalar', schema='pg_catalog')) + """ + return self._state._get_parameters() + + @connresource.guarded + def get_attributes(self): + """Return a description of relation attributes (columns). + + :return: A tuple of :class:`asyncpg.types.Attribute`. + + Example:: + + st = await self.con.prepare(''' + SELECT typname, typnamespace FROM pg_type + ''') + print(st.get_attributes()) + + # Will print: + # (Attribute( + # name='typname', + # type=Type(oid=19, name='name', kind='scalar', + # schema='pg_catalog')), + # Attribute( + # name='typnamespace', + # type=Type(oid=26, name='oid', kind='scalar', + # schema='pg_catalog'))) + """ + return self._state._get_attributes() + + @connresource.guarded + def cursor(self, *args, prefetch=None, + timeout=None) -> cursor.CursorFactory: + """Return a *cursor factory* for the prepared statement. + + :param args: Query arguments. + :param int prefetch: The number of rows the *cursor iterator* + will prefetch (defaults to ``50``.) + :param float timeout: Optional timeout in seconds. + + :return: A :class:`~cursor.CursorFactory` object. + """ + return cursor.CursorFactory( + self._connection, + self._query, + self._state, + args, + prefetch, + timeout, + self._state.record_class, + ) + + @connresource.guarded + async def explain(self, *args, analyze=False): + """Return the execution plan of the statement. + + :param args: Query arguments. + :param analyze: If ``True``, the statement will be executed and + the run time statitics added to the return value. + + :return: An object representing the execution plan. This value + is actually a deserialized JSON output of the SQL + ``EXPLAIN`` command. + """ + query = 'EXPLAIN (FORMAT JSON, VERBOSE' + if analyze: + query += ', ANALYZE) ' + else: + query += ') ' + query += self._state.query + + if analyze: + # From PostgreSQL docs: + # Important: Keep in mind that the statement is actually + # executed when the ANALYZE option is used. Although EXPLAIN + # will discard any output that a SELECT would return, other + # side effects of the statement will happen as usual. If you + # wish to use EXPLAIN ANALYZE on an INSERT, UPDATE, DELETE, + # MERGE, CREATE TABLE AS, or EXECUTE statement without letting + # the command affect your data, use this approach: + # BEGIN; + # EXPLAIN ANALYZE ...; + # ROLLBACK; + tr = self._connection.transaction() + await tr.start() + try: + data = await self._connection.fetchval(query, *args) + finally: + await tr.rollback() + else: + data = await self._connection.fetchval(query, *args) + + return json.loads(data) + + @connresource.guarded + async def fetch(self, *args, timeout=None): + r"""Execute the statement and return a list of :class:`Record` objects. + + :param str query: Query text + :param args: Query arguments + :param float timeout: Optional timeout value in seconds. + + :return: A list of :class:`Record` instances. + """ + data = await self.__bind_execute(args, 0, timeout) + return data + + @connresource.guarded + async def fetchval(self, *args, column=0, timeout=None): + """Execute the statement and return a value in the first row. + + :param args: Query arguments. + :param int column: Numeric index within the record of the value to + return (defaults to 0). + :param float timeout: Optional timeout value in seconds. + If not specified, defaults to the value of + ``command_timeout`` argument to the ``Connection`` + instance constructor. + + :return: The value of the specified column of the first record. + """ + data = await self.__bind_execute(args, 1, timeout) + if not data: + return None + return data[0][column] + + @connresource.guarded + async def fetchrow(self, *args, timeout=None): + """Execute the statement and return the first row. + + :param str query: Query text + :param args: Query arguments + :param float timeout: Optional timeout value in seconds. + + :return: The first row as a :class:`Record` instance. + """ + data = await self.__bind_execute(args, 1, timeout) + if not data: + return None + return data[0] + + @connresource.guarded + async def fetchmany(self, args, *, timeout=None): + """Execute the statement and return a list of :class:`Record` objects. + + :param args: Query arguments. + :param float timeout: Optional timeout value in seconds. + + :return: A list of :class:`Record` instances. + + .. versionadded:: 0.30.0 + """ + return await self.__do_execute( + lambda protocol: protocol.bind_execute_many( + self._state, + args, + portal_name='', + timeout=timeout, + return_rows=True, + ) + ) + + @connresource.guarded + async def executemany(self, args, *, timeout: typing.Optional[float]=None): + """Execute the statement for each sequence of arguments in *args*. + + :param args: An iterable containing sequences of arguments. + :param float timeout: Optional timeout value in seconds. + :return None: This method discards the results of the operations. + + .. versionadded:: 0.22.0 + """ + return await self.__do_execute( + lambda protocol: protocol.bind_execute_many( + self._state, + args, + portal_name='', + timeout=timeout, + return_rows=False, + )) + + async def __do_execute(self, executor): + protocol = self._connection._protocol + try: + return await executor(protocol) + except exceptions.OutdatedSchemaCacheError: + await self._connection.reload_schema_state() + # We can not find all manually created prepared statements, so just + # drop known cached ones in the `self._connection`. + # Other manually created prepared statements will fail and + # invalidate themselves (unfortunately, clearing caches again). + self._state.mark_closed() + raise + + async def __bind_execute(self, args, limit, timeout): + data, status, _ = await self.__do_execute( + lambda protocol: protocol.bind_execute( + self._state, args, '', limit, True, timeout)) + self._last_status = status + return data + + def _check_open(self, meth_name): + if self._state.closed: + raise exceptions.InterfaceError( + 'cannot call PreparedStmt.{}(): ' + 'the prepared statement is closed'.format(meth_name)) + + def _check_conn_validity(self, meth_name): + self._check_open(meth_name) + super()._check_conn_validity(meth_name) + + def __del__(self): + self._state.detach() + self._connection._maybe_gc_stmt(self._state) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/__init__.py b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/__init__.py new file mode 100755 index 0000000..043454d --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/__init__.py @@ -0,0 +1,12 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + +# flake8: NOQA + +from __future__ import annotations + +from .protocol import Protocol, NO_TIMEOUT, BUILTIN_TYPE_NAME_MAP +from .record import Record diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/__init__.py b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/array.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/array.pyx new file mode 100755 index 0000000..f8f9b8d --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/array.pyx @@ -0,0 +1,875 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +from collections.abc import (Iterable as IterableABC, + Mapping as MappingABC, + Sized as SizedABC) + +from asyncpg import exceptions + + +DEF ARRAY_MAXDIM = 6 # defined in postgresql/src/includes/c.h + +# "NULL" +cdef Py_UCS4 *APG_NULL = [0x004E, 0x0055, 0x004C, 0x004C, 0x0000] + + +ctypedef object (*encode_func_ex)(ConnectionSettings settings, + WriteBuffer buf, + object obj, + const void *arg) + + +ctypedef object (*decode_func_ex)(ConnectionSettings settings, + FRBuffer *buf, + const void *arg) + + +cdef inline bint _is_trivial_container(object obj): + return cpython.PyUnicode_Check(obj) or cpython.PyBytes_Check(obj) or \ + cpythonx.PyByteArray_Check(obj) or cpythonx.PyMemoryView_Check(obj) + + +cdef inline _is_array_iterable(object obj): + return ( + isinstance(obj, IterableABC) and + isinstance(obj, SizedABC) and + not _is_trivial_container(obj) and + not isinstance(obj, MappingABC) + ) + + +cdef inline _is_sub_array_iterable(object obj): + # Sub-arrays have a specialized check, because we treat + # nested tuples as records. + return _is_array_iterable(obj) and not cpython.PyTuple_Check(obj) + + +cdef _get_array_shape(object obj, int32_t *dims, int32_t *ndims): + cdef: + ssize_t mylen = len(obj) + ssize_t elemlen = -2 + object it + + if mylen > _MAXINT32: + raise ValueError('too many elements in array value') + + if ndims[0] > ARRAY_MAXDIM: + raise ValueError( + 'number of array dimensions ({}) exceed the maximum expected ({})'. + format(ndims[0], ARRAY_MAXDIM)) + + dims[ndims[0] - 1] = mylen + + for elem in obj: + if _is_sub_array_iterable(elem): + if elemlen == -2: + elemlen = len(elem) + if elemlen > _MAXINT32: + raise ValueError('too many elements in array value') + ndims[0] += 1 + _get_array_shape(elem, dims, ndims) + else: + if len(elem) != elemlen: + raise ValueError('non-homogeneous array') + else: + if elemlen >= 0: + raise ValueError('non-homogeneous array') + else: + elemlen = -1 + + +cdef _write_array_data(ConnectionSettings settings, object obj, int32_t ndims, + int32_t dim, WriteBuffer elem_data, + encode_func_ex encoder, const void *encoder_arg): + if dim < ndims - 1: + for item in obj: + _write_array_data(settings, item, ndims, dim + 1, elem_data, + encoder, encoder_arg) + else: + for item in obj: + if item is None: + elem_data.write_int32(-1) + else: + try: + encoder(settings, elem_data, item, encoder_arg) + except TypeError as e: + raise ValueError( + 'invalid array element: {}'.format(e.args[0])) from None + + +cdef inline array_encode(ConnectionSettings settings, WriteBuffer buf, + object obj, uint32_t elem_oid, + encode_func_ex encoder, const void *encoder_arg): + cdef: + WriteBuffer elem_data + int32_t dims[ARRAY_MAXDIM] + int32_t ndims = 1 + int32_t i + + if not _is_array_iterable(obj): + raise TypeError( + 'a sized iterable container expected (got type {!r})'.format( + type(obj).__name__)) + + _get_array_shape(obj, dims, &ndims) + + elem_data = WriteBuffer.new() + + if ndims > 1: + _write_array_data(settings, obj, ndims, 0, elem_data, + encoder, encoder_arg) + else: + for i, item in enumerate(obj): + if item is None: + elem_data.write_int32(-1) + else: + try: + encoder(settings, elem_data, item, encoder_arg) + except TypeError as e: + raise ValueError( + 'invalid array element at index {}: {}'.format( + i, e.args[0])) from None + + buf.write_int32(12 + 8 * ndims + elem_data.len()) + # Number of dimensions + buf.write_int32(ndims) + # flags + buf.write_int32(0) + # element type + buf.write_int32(elem_oid) + # upper / lower bounds + for i in range(ndims): + buf.write_int32(dims[i]) + buf.write_int32(1) + # element data + buf.write_buffer(elem_data) + + +cdef _write_textarray_data(ConnectionSettings settings, object obj, + int32_t ndims, int32_t dim, WriteBuffer array_data, + encode_func_ex encoder, const void *encoder_arg, + Py_UCS4 typdelim): + cdef: + ssize_t i = 0 + int8_t delim = typdelim + WriteBuffer elem_data + Py_buffer pybuf + const char *elem_str + char ch + ssize_t elem_len + ssize_t quoted_elem_len + bint need_quoting + + array_data.write_byte(b'{') + + if dim < ndims - 1: + for item in obj: + if i > 0: + array_data.write_byte(delim) + array_data.write_byte(b' ') + _write_textarray_data(settings, item, ndims, dim + 1, array_data, + encoder, encoder_arg, typdelim) + i += 1 + else: + for item in obj: + elem_data = WriteBuffer.new() + + if i > 0: + array_data.write_byte(delim) + array_data.write_byte(b' ') + + if item is None: + array_data.write_bytes(b'NULL') + i += 1 + continue + else: + try: + encoder(settings, elem_data, item, encoder_arg) + except TypeError as e: + raise ValueError( + 'invalid array element: {}'.format( + e.args[0])) from None + + # element string length (first four bytes are the encoded length.) + elem_len = elem_data.len() - 4 + + if elem_len == 0: + # Empty string + array_data.write_bytes(b'""') + else: + cpython.PyObject_GetBuffer( + elem_data, &pybuf, cpython.PyBUF_SIMPLE) + + elem_str = (pybuf.buf) + 4 + + try: + if not apg_strcasecmp_char(elem_str, b'NULL'): + array_data.write_byte(b'"') + array_data.write_cstr(elem_str, 4) + array_data.write_byte(b'"') + else: + quoted_elem_len = elem_len + need_quoting = False + + for i in range(elem_len): + ch = elem_str[i] + if ch == b'"' or ch == b'\\': + # Quotes and backslashes need escaping. + quoted_elem_len += 1 + need_quoting = True + elif (ch == b'{' or ch == b'}' or ch == delim or + apg_ascii_isspace(ch)): + need_quoting = True + + if need_quoting: + array_data.write_byte(b'"') + + if quoted_elem_len == elem_len: + array_data.write_cstr(elem_str, elem_len) + else: + # Escaping required. + for i in range(elem_len): + ch = elem_str[i] + if ch == b'"' or ch == b'\\': + array_data.write_byte(b'\\') + array_data.write_byte(ch) + + array_data.write_byte(b'"') + else: + array_data.write_cstr(elem_str, elem_len) + finally: + cpython.PyBuffer_Release(&pybuf) + + i += 1 + + array_data.write_byte(b'}') + + +cdef inline textarray_encode(ConnectionSettings settings, WriteBuffer buf, + object obj, encode_func_ex encoder, + const void *encoder_arg, Py_UCS4 typdelim): + cdef: + WriteBuffer array_data + int32_t dims[ARRAY_MAXDIM] + int32_t ndims = 1 + int32_t i + + if not _is_array_iterable(obj): + raise TypeError( + 'a sized iterable container expected (got type {!r})'.format( + type(obj).__name__)) + + _get_array_shape(obj, dims, &ndims) + + array_data = WriteBuffer.new() + _write_textarray_data(settings, obj, ndims, 0, array_data, + encoder, encoder_arg, typdelim) + buf.write_int32(array_data.len()) + buf.write_buffer(array_data) + + +cdef inline array_decode(ConnectionSettings settings, FRBuffer *buf, + decode_func_ex decoder, const void *decoder_arg): + cdef: + int32_t ndims = hton.unpack_int32(frb_read(buf, 4)) + int32_t flags = hton.unpack_int32(frb_read(buf, 4)) + uint32_t elem_oid = hton.unpack_int32(frb_read(buf, 4)) + list result + int i + int32_t elem_len + int32_t elem_count = 1 + FRBuffer elem_buf + int32_t dims[ARRAY_MAXDIM] + Codec elem_codec + + if ndims == 0: + return [] + + if ndims > ARRAY_MAXDIM: + raise exceptions.ProtocolError( + 'number of array dimensions ({}) exceed the maximum expected ({})'. + format(ndims, ARRAY_MAXDIM)) + elif ndims < 0: + raise exceptions.ProtocolError( + 'unexpected array dimensions value: {}'.format(ndims)) + + for i in range(ndims): + dims[i] = hton.unpack_int32(frb_read(buf, 4)) + if dims[i] < 0: + raise exceptions.ProtocolError( + 'unexpected array dimension size: {}'.format(dims[i])) + # Ignore the lower bound information + frb_read(buf, 4) + + if ndims == 1: + # Fast path for flat arrays + elem_count = dims[0] + result = cpython.PyList_New(elem_count) + + for i in range(elem_count): + elem_len = hton.unpack_int32(frb_read(buf, 4)) + if elem_len == -1: + elem = None + else: + frb_slice_from(&elem_buf, buf, elem_len) + elem = decoder(settings, &elem_buf, decoder_arg) + + cpython.Py_INCREF(elem) + cpython.PyList_SET_ITEM(result, i, elem) + + else: + result = _nested_array_decode(settings, buf, + decoder, decoder_arg, ndims, dims, + &elem_buf) + + return result + + +cdef _nested_array_decode(ConnectionSettings settings, + FRBuffer *buf, + decode_func_ex decoder, + const void *decoder_arg, + int32_t ndims, int32_t *dims, + FRBuffer *elem_buf): + + cdef: + int32_t elem_len + int64_t i, j + int64_t array_len = 1 + object elem, stride + # An array of pointers to lists for each current array level. + void *strides[ARRAY_MAXDIM] + # An array of current positions at each array level. + int32_t indexes[ARRAY_MAXDIM] + + for i in range(ndims): + array_len *= dims[i] + indexes[i] = 0 + strides[i] = NULL + + if array_len == 0: + # A multidimensional array with a zero-sized dimension? + return [] + + elif array_len < 0: + # Array length overflow + raise exceptions.ProtocolError('array length overflow') + + for i in range(array_len): + # Decode the element. + elem_len = hton.unpack_int32(frb_read(buf, 4)) + if elem_len == -1: + elem = None + else: + elem = decoder(settings, + frb_slice_from(elem_buf, buf, elem_len), + decoder_arg) + + # Take an explicit reference for PyList_SET_ITEM in the below + # loop expects this. + cpython.Py_INCREF(elem) + + # Iterate over array dimentions and put the element in + # the correctly nested sublist. + for j in reversed(range(ndims)): + if indexes[j] == 0: + # Allocate the list for this array level. + stride = cpython.PyList_New(dims[j]) + + strides[j] = stride + # Take an explicit reference for PyList_SET_ITEM below + # expects this. + cpython.Py_INCREF(stride) + + stride = strides[j] + cpython.PyList_SET_ITEM(stride, indexes[j], elem) + indexes[j] += 1 + + if indexes[j] == dims[j] and j != 0: + # This array level is full, continue the + # ascent in the dimensions so that this level + # sublist will be appened to the parent list. + elem = stride + # Reset the index, this will cause the + # new list to be allocated on the next + # iteration on this array axis. + indexes[j] = 0 + else: + break + + stride = strides[0] + # Since each element in strides has a refcount of 1, + # returning strides[0] will increment it to 2, so + # balance that. + cpython.Py_DECREF(stride) + return stride + + +cdef textarray_decode(ConnectionSettings settings, FRBuffer *buf, + decode_func_ex decoder, const void *decoder_arg, + Py_UCS4 typdelim): + cdef: + Py_UCS4 *array_text + str s + + # Make a copy of array data since we will be mutating it for + # the purposes of element decoding. + s = pgproto.text_decode(settings, buf) + array_text = cpythonx.PyUnicode_AsUCS4Copy(s) + + try: + return _textarray_decode( + settings, array_text, decoder, decoder_arg, typdelim) + except ValueError as e: + raise exceptions.ProtocolError( + 'malformed array literal {!r}: {}'.format(s, e.args[0])) + finally: + cpython.PyMem_Free(array_text) + + +cdef _textarray_decode(ConnectionSettings settings, + Py_UCS4 *array_text, + decode_func_ex decoder, + const void *decoder_arg, + Py_UCS4 typdelim): + + cdef: + bytearray array_bytes + list result + list new_stride + Py_UCS4 *ptr + int32_t ndims = 0 + int32_t ubound = 0 + int32_t lbound = 0 + int32_t dims[ARRAY_MAXDIM] + int32_t inferred_dims[ARRAY_MAXDIM] + int32_t inferred_ndims = 0 + void *strides[ARRAY_MAXDIM] + int32_t indexes[ARRAY_MAXDIM] + int32_t nest_level = 0 + int32_t item_level = 0 + bint end_of_array = False + + bint end_of_item = False + bint has_quoting = False + bint strip_spaces = False + bint in_quotes = False + Py_UCS4 *item_start + Py_UCS4 *item_ptr + Py_UCS4 *item_end + + int i + object item + str item_text + FRBuffer item_buf + char *pg_item_str + ssize_t pg_item_len + + ptr = array_text + + while True: + while apg_ascii_isspace(ptr[0]): + ptr += 1 + + if ptr[0] != '[': + # Finished parsing dimensions spec. + break + + ptr += 1 # '[' + + if ndims > ARRAY_MAXDIM: + raise ValueError( + 'number of array dimensions ({}) exceed the ' + 'maximum expected ({})'.format(ndims, ARRAY_MAXDIM)) + + ptr = apg_parse_int32(ptr, &ubound) + if ptr == NULL: + raise ValueError('missing array dimension value') + + if ptr[0] == ':': + ptr += 1 + lbound = ubound + + # [lower:upper] spec. We disregard the lbound for decoding. + ptr = apg_parse_int32(ptr, &ubound) + if ptr == NULL: + raise ValueError('missing array dimension value') + else: + lbound = 1 + + if ptr[0] != ']': + raise ValueError('missing \']\' after array dimensions') + + ptr += 1 # ']' + + dims[ndims] = ubound - lbound + 1 + ndims += 1 + + if ndims != 0: + # If dimensions were given, the '=' token is expected. + if ptr[0] != '=': + raise ValueError('missing \'=\' after array dimensions') + + ptr += 1 # '=' + + # Skip any whitespace after the '=', whitespace + # before was consumed in the above loop. + while apg_ascii_isspace(ptr[0]): + ptr += 1 + + # Infer the dimensions from the brace structure in the + # array literal body, and check that it matches the explicit + # spec. This also validates that the array literal is sane. + _infer_array_dims(ptr, typdelim, inferred_dims, &inferred_ndims) + + if inferred_ndims != ndims: + raise ValueError( + 'specified array dimensions do not match array content') + + for i in range(ndims): + if inferred_dims[i] != dims[i]: + raise ValueError( + 'specified array dimensions do not match array content') + else: + # Infer the dimensions from the brace structure in the array literal + # body. This also validates that the array literal is sane. + _infer_array_dims(ptr, typdelim, dims, &ndims) + + while not end_of_array: + # We iterate over the literal character by character + # and modify the string in-place removing the array-specific + # quoting and determining the boundaries of each element. + end_of_item = has_quoting = in_quotes = False + strip_spaces = True + + # Pointers to array element start, end, and the current pointer + # tracking the position where characters are written when + # escaping is folded. + item_start = item_end = item_ptr = ptr + item_level = 0 + + while not end_of_item: + if ptr[0] == '"': + in_quotes = not in_quotes + if in_quotes: + strip_spaces = False + else: + item_end = item_ptr + has_quoting = True + + elif ptr[0] == '\\': + # Quoted character, collapse the backslash. + ptr += 1 + has_quoting = True + item_ptr[0] = ptr[0] + item_ptr += 1 + strip_spaces = False + item_end = item_ptr + + elif in_quotes: + # Consume the string until we see the closing quote. + item_ptr[0] = ptr[0] + item_ptr += 1 + + elif ptr[0] == '{': + # Nesting level increase. + nest_level += 1 + + indexes[nest_level - 1] = 0 + new_stride = cpython.PyList_New(dims[nest_level - 1]) + strides[nest_level - 1] = \ + (new_stride) + + if nest_level > 1: + cpython.Py_INCREF(new_stride) + cpython.PyList_SET_ITEM( + strides[nest_level - 2], + indexes[nest_level - 2], + new_stride) + else: + result = new_stride + + elif ptr[0] == '}': + if item_level == 0: + # Make sure we keep track of which nesting + # level the item belongs to, as the loop + # will continue to consume closing braces + # until the delimiter or the end of input. + item_level = nest_level + + nest_level -= 1 + + if nest_level == 0: + end_of_array = end_of_item = True + + elif ptr[0] == typdelim: + # Array element delimiter, + end_of_item = True + if item_level == 0: + item_level = nest_level + + elif apg_ascii_isspace(ptr[0]): + if not strip_spaces: + item_ptr[0] = ptr[0] + item_ptr += 1 + # Ignore the leading literal whitespace. + + else: + item_ptr[0] = ptr[0] + item_ptr += 1 + strip_spaces = False + item_end = item_ptr + + ptr += 1 + + # end while not end_of_item + + if item_end == item_start: + # Empty array + continue + + item_end[0] = '\0' + + if not has_quoting and apg_strcasecmp(item_start, APG_NULL) == 0: + # NULL element. + item = None + else: + # XXX: find a way to avoid the redundant encode/decode + # cycle here. + item_text = cpythonx.PyUnicode_FromKindAndData( + cpythonx.PyUnicode_4BYTE_KIND, + item_start, + item_end - item_start) + + # Prepare the element buffer and call the text decoder + # for the element type. + pgproto.as_pg_string_and_size( + settings, item_text, &pg_item_str, &pg_item_len) + frb_init(&item_buf, pg_item_str, pg_item_len) + item = decoder(settings, &item_buf, decoder_arg) + + # Place the decoded element in the array. + cpython.Py_INCREF(item) + cpython.PyList_SET_ITEM( + strides[item_level - 1], + indexes[item_level - 1], + item) + + if nest_level > 0: + indexes[nest_level - 1] += 1 + + return result + + +cdef enum _ArrayParseState: + APS_START = 1 + APS_STRIDE_STARTED = 2 + APS_STRIDE_DONE = 3 + APS_STRIDE_DELIMITED = 4 + APS_ELEM_STARTED = 5 + APS_ELEM_DELIMITED = 6 + + +cdef _UnexpectedCharacter(const Py_UCS4 *array_text, const Py_UCS4 *ptr): + return ValueError('unexpected character {!r} at position {}'.format( + cpython.PyUnicode_FromOrdinal(ptr[0]), ptr - array_text + 1)) + + +cdef _infer_array_dims(const Py_UCS4 *array_text, + Py_UCS4 typdelim, + int32_t *dims, + int32_t *ndims): + cdef: + const Py_UCS4 *ptr = array_text + int i + int nest_level = 0 + bint end_of_array = False + bint end_of_item = False + bint in_quotes = False + bint array_is_empty = True + int stride_len[ARRAY_MAXDIM] + int prev_stride_len[ARRAY_MAXDIM] + _ArrayParseState parse_state = APS_START + + for i in range(ARRAY_MAXDIM): + dims[i] = prev_stride_len[i] = 0 + stride_len[i] = 1 + + while not end_of_array: + end_of_item = False + + while not end_of_item: + if ptr[0] == '\0': + raise ValueError('unexpected end of string') + + elif ptr[0] == '"': + if (parse_state not in (APS_STRIDE_STARTED, + APS_ELEM_DELIMITED) and + not (parse_state == APS_ELEM_STARTED and in_quotes)): + raise _UnexpectedCharacter(array_text, ptr) + + in_quotes = not in_quotes + if in_quotes: + parse_state = APS_ELEM_STARTED + array_is_empty = False + + elif ptr[0] == '\\': + if parse_state not in (APS_STRIDE_STARTED, + APS_ELEM_STARTED, + APS_ELEM_DELIMITED): + raise _UnexpectedCharacter(array_text, ptr) + + parse_state = APS_ELEM_STARTED + array_is_empty = False + + if ptr[1] != '\0': + ptr += 1 + else: + raise ValueError('unexpected end of string') + + elif in_quotes: + # Ignore everything inside the quotes. + pass + + elif ptr[0] == '{': + if parse_state not in (APS_START, + APS_STRIDE_STARTED, + APS_STRIDE_DELIMITED): + raise _UnexpectedCharacter(array_text, ptr) + + parse_state = APS_STRIDE_STARTED + if nest_level >= ARRAY_MAXDIM: + raise ValueError( + 'number of array dimensions ({}) exceed the ' + 'maximum expected ({})'.format( + nest_level, ARRAY_MAXDIM)) + + dims[nest_level] = 0 + nest_level += 1 + if ndims[0] < nest_level: + ndims[0] = nest_level + + elif ptr[0] == '}': + if (parse_state not in (APS_ELEM_STARTED, APS_STRIDE_DONE) and + not (nest_level == 1 and + parse_state == APS_STRIDE_STARTED)): + raise _UnexpectedCharacter(array_text, ptr) + + parse_state = APS_STRIDE_DONE + + if nest_level == 0: + raise _UnexpectedCharacter(array_text, ptr) + + nest_level -= 1 + + if (prev_stride_len[nest_level] != 0 and + stride_len[nest_level] != prev_stride_len[nest_level]): + raise ValueError( + 'inconsistent sub-array dimensions' + ' at position {}'.format( + ptr - array_text + 1)) + + prev_stride_len[nest_level] = stride_len[nest_level] + stride_len[nest_level] = 1 + if nest_level == 0: + end_of_array = end_of_item = True + else: + dims[nest_level - 1] += 1 + + elif ptr[0] == typdelim: + if parse_state not in (APS_ELEM_STARTED, APS_STRIDE_DONE): + raise _UnexpectedCharacter(array_text, ptr) + + if parse_state == APS_STRIDE_DONE: + parse_state = APS_STRIDE_DELIMITED + else: + parse_state = APS_ELEM_DELIMITED + end_of_item = True + stride_len[nest_level - 1] += 1 + + elif not apg_ascii_isspace(ptr[0]): + if parse_state not in (APS_STRIDE_STARTED, + APS_ELEM_STARTED, + APS_ELEM_DELIMITED): + raise _UnexpectedCharacter(array_text, ptr) + + parse_state = APS_ELEM_STARTED + array_is_empty = False + + if not end_of_item: + ptr += 1 + + if not array_is_empty: + dims[ndims[0] - 1] += 1 + + ptr += 1 + + # only whitespace is allowed after the closing brace + while ptr[0] != '\0': + if not apg_ascii_isspace(ptr[0]): + raise _UnexpectedCharacter(array_text, ptr) + + ptr += 1 + + if array_is_empty: + ndims[0] = 0 + + +cdef uint4_encode_ex(ConnectionSettings settings, WriteBuffer buf, object obj, + const void *arg): + return pgproto.uint4_encode(settings, buf, obj) + + +cdef uint4_decode_ex(ConnectionSettings settings, FRBuffer *buf, + const void *arg): + return pgproto.uint4_decode(settings, buf) + + +cdef arrayoid_encode(ConnectionSettings settings, WriteBuffer buf, items): + array_encode(settings, buf, items, OIDOID, + &uint4_encode_ex, NULL) + + +cdef arrayoid_decode(ConnectionSettings settings, FRBuffer *buf): + return array_decode(settings, buf, &uint4_decode_ex, NULL) + + +cdef text_encode_ex(ConnectionSettings settings, WriteBuffer buf, object obj, + const void *arg): + return pgproto.text_encode(settings, buf, obj) + + +cdef text_decode_ex(ConnectionSettings settings, FRBuffer *buf, + const void *arg): + return pgproto.text_decode(settings, buf) + + +cdef arraytext_encode(ConnectionSettings settings, WriteBuffer buf, items): + array_encode(settings, buf, items, TEXTOID, + &text_encode_ex, NULL) + + +cdef arraytext_decode(ConnectionSettings settings, FRBuffer *buf): + return array_decode(settings, buf, &text_decode_ex, NULL) + + +cdef init_array_codecs(): + # oid[] and text[] are registered as core codecs + # to make type introspection query work + # + register_core_codec(_OIDOID, + &arrayoid_encode, + &arrayoid_decode, + PG_FORMAT_BINARY) + + register_core_codec(_TEXTOID, + &arraytext_encode, + &arraytext_decode, + PG_FORMAT_BINARY) + +init_array_codecs() diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/base.pxd b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/base.pxd new file mode 100755 index 0000000..f549259 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/base.pxd @@ -0,0 +1,199 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +ctypedef object (*encode_func)(ConnectionSettings settings, + WriteBuffer buf, + object obj) + +ctypedef object (*decode_func)(ConnectionSettings settings, + FRBuffer *buf) + +ctypedef object (*codec_encode_func)(Codec codec, + ConnectionSettings settings, + WriteBuffer buf, + object obj) + +ctypedef object (*codec_decode_func)(Codec codec, + ConnectionSettings settings, + FRBuffer *buf) + + +cdef class CodecMap: + cdef: + void** binary_codec_map + void** text_codec_map + dict extra_codecs + + cdef inline void *get_binary_codec_ptr(self, uint32_t idx) + cdef inline void set_binary_codec_ptr(self, uint32_t idx, void *ptr) + cdef inline void *get_text_codec_ptr(self, uint32_t idx) + cdef inline void set_text_codec_ptr(self, uint32_t idx, void *ptr) + + +cdef enum CodecType: + CODEC_UNDEFINED = 0 + CODEC_C = 1 + CODEC_PY = 2 + CODEC_ARRAY = 3 + CODEC_COMPOSITE = 4 + CODEC_RANGE = 5 + CODEC_MULTIRANGE = 6 + + +cdef enum ServerDataFormat: + PG_FORMAT_ANY = -1 + PG_FORMAT_TEXT = 0 + PG_FORMAT_BINARY = 1 + + +cdef enum ClientExchangeFormat: + PG_XFORMAT_OBJECT = 1 + PG_XFORMAT_TUPLE = 2 + + +cdef class Codec: + cdef: + uint32_t oid + + str name + str schema + str kind + + CodecType type + ServerDataFormat format + ClientExchangeFormat xformat + + encode_func c_encoder + decode_func c_decoder + Codec base_codec + + object py_encoder + object py_decoder + + # arrays + Codec element_codec + Py_UCS4 element_delimiter + + # composite types + tuple element_type_oids + object element_names + object record_desc + list element_codecs + + # Pointers to actual encoder/decoder functions for this codec + codec_encode_func encoder + codec_decode_func decoder + + cdef init(self, str name, str schema, str kind, + CodecType type, ServerDataFormat format, + ClientExchangeFormat xformat, + encode_func c_encoder, decode_func c_decoder, + Codec base_codec, + object py_encoder, object py_decoder, + Codec element_codec, tuple element_type_oids, + object element_names, list element_codecs, + Py_UCS4 element_delimiter) + + cdef encode_scalar(self, ConnectionSettings settings, WriteBuffer buf, + object obj) + + cdef encode_array(self, ConnectionSettings settings, WriteBuffer buf, + object obj) + + cdef encode_array_text(self, ConnectionSettings settings, WriteBuffer buf, + object obj) + + cdef encode_range(self, ConnectionSettings settings, WriteBuffer buf, + object obj) + + cdef encode_multirange(self, ConnectionSettings settings, WriteBuffer buf, + object obj) + + cdef encode_composite(self, ConnectionSettings settings, WriteBuffer buf, + object obj) + + cdef encode_in_python(self, ConnectionSettings settings, WriteBuffer buf, + object obj) + + cdef decode_scalar(self, ConnectionSettings settings, FRBuffer *buf) + + cdef decode_array(self, ConnectionSettings settings, FRBuffer *buf) + + cdef decode_array_text(self, ConnectionSettings settings, FRBuffer *buf) + + cdef decode_range(self, ConnectionSettings settings, FRBuffer *buf) + + cdef decode_multirange(self, ConnectionSettings settings, FRBuffer *buf) + + cdef decode_composite(self, ConnectionSettings settings, FRBuffer *buf) + + cdef decode_in_python(self, ConnectionSettings settings, FRBuffer *buf) + + cdef inline encode(self, + ConnectionSettings settings, + WriteBuffer buf, + object obj) + + cdef inline decode(self, ConnectionSettings settings, FRBuffer *buf) + + cdef has_encoder(self) + cdef has_decoder(self) + cdef is_binary(self) + + cdef inline Codec copy(self) + + @staticmethod + cdef Codec new_array_codec(uint32_t oid, + str name, + str schema, + Codec element_codec, + Py_UCS4 element_delimiter) + + @staticmethod + cdef Codec new_range_codec(uint32_t oid, + str name, + str schema, + Codec element_codec) + + @staticmethod + cdef Codec new_multirange_codec(uint32_t oid, + str name, + str schema, + Codec element_codec) + + @staticmethod + cdef Codec new_composite_codec(uint32_t oid, + str name, + str schema, + ServerDataFormat format, + list element_codecs, + tuple element_type_oids, + object element_names) + + @staticmethod + cdef Codec new_python_codec(uint32_t oid, + str name, + str schema, + str kind, + object encoder, + object decoder, + encode_func c_encoder, + decode_func c_decoder, + Codec base_codec, + ServerDataFormat format, + ClientExchangeFormat xformat) + + +cdef class DataCodecConfig: + cdef: + dict _derived_type_codecs + dict _custom_type_codecs + + cdef inline Codec get_codec(self, uint32_t oid, ServerDataFormat format, + bint ignore_custom_codec=*) + cdef inline Codec get_custom_codec(self, uint32_t oid, + ServerDataFormat format) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/base.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/base.pyx new file mode 100755 index 0000000..009598a --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/base.pyx @@ -0,0 +1,922 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +from collections.abc import Mapping as MappingABC + +import asyncpg +from asyncpg import exceptions + + +# The class indirection is needed because Cython +# does not (as of 3.1.0) store global cdef variables +# in module state. +@cython.final +cdef class CodecMap: + + def __cinit__(self): + self.extra_codecs = {} + self.binary_codec_map = cpython.PyMem_Calloc( + (MAXSUPPORTEDOID + 1) * 2, sizeof(void *)) + self.text_codec_map = cpython.PyMem_Calloc( + (MAXSUPPORTEDOID + 1) * 2, sizeof(void *)) + + cdef inline void *get_binary_codec_ptr(self, uint32_t idx): + return self.binary_codec_map[idx] + + cdef inline void set_binary_codec_ptr(self, uint32_t idx, void *ptr): + self.binary_codec_map[idx] = ptr + + cdef inline void *get_text_codec_ptr(self, uint32_t idx): + return self.text_codec_map[idx] + + cdef inline void set_text_codec_ptr(self, uint32_t idx, void *ptr): + self.text_codec_map[idx] = ptr + + +codec_map = CodecMap() + + +@cython.final +cdef class Codec: + + def __cinit__(self, uint32_t oid): + self.oid = oid + self.type = CODEC_UNDEFINED + + cdef init( + self, + str name, + str schema, + str kind, + CodecType type, + ServerDataFormat format, + ClientExchangeFormat xformat, + encode_func c_encoder, + decode_func c_decoder, + Codec base_codec, + object py_encoder, + object py_decoder, + Codec element_codec, + tuple element_type_oids, + object element_names, + list element_codecs, + Py_UCS4 element_delimiter, + ): + + self.name = name + self.schema = schema + self.kind = kind + self.type = type + self.format = format + self.xformat = xformat + self.c_encoder = c_encoder + self.c_decoder = c_decoder + self.base_codec = base_codec + self.py_encoder = py_encoder + self.py_decoder = py_decoder + self.element_codec = element_codec + self.element_type_oids = element_type_oids + self.element_codecs = element_codecs + self.element_delimiter = element_delimiter + self.element_names = element_names + + if base_codec is not None: + if c_encoder != NULL or c_decoder != NULL: + raise exceptions.InternalClientError( + 'base_codec is mutually exclusive with c_encoder/c_decoder' + ) + + if element_names is not None: + self.record_desc = RecordDescriptor( + element_names, tuple(element_names)) + else: + self.record_desc = None + + if type == CODEC_C: + self.encoder = &self.encode_scalar + self.decoder = &self.decode_scalar + elif type == CODEC_ARRAY: + if format == PG_FORMAT_BINARY: + self.encoder = &self.encode_array + self.decoder = &self.decode_array + else: + self.encoder = &self.encode_array_text + self.decoder = &self.decode_array_text + elif type == CODEC_RANGE: + if format != PG_FORMAT_BINARY: + raise exceptions.UnsupportedClientFeatureError( + 'cannot decode type "{}"."{}": text encoding of ' + 'range types is not supported'.format(schema, name)) + self.encoder = &self.encode_range + self.decoder = &self.decode_range + elif type == CODEC_MULTIRANGE: + if format != PG_FORMAT_BINARY: + raise exceptions.UnsupportedClientFeatureError( + 'cannot decode type "{}"."{}": text encoding of ' + 'range types is not supported'.format(schema, name)) + self.encoder = &self.encode_multirange + self.decoder = &self.decode_multirange + elif type == CODEC_COMPOSITE: + if format != PG_FORMAT_BINARY: + raise exceptions.UnsupportedClientFeatureError( + 'cannot decode type "{}"."{}": text encoding of ' + 'composite types is not supported'.format(schema, name)) + self.encoder = &self.encode_composite + self.decoder = &self.decode_composite + elif type == CODEC_PY: + self.encoder = &self.encode_in_python + self.decoder = &self.decode_in_python + else: + raise exceptions.InternalClientError( + 'unexpected codec type: {}'.format(type)) + + cdef Codec copy(self): + cdef Codec codec + + codec = Codec(self.oid) + codec.init(self.name, self.schema, self.kind, + self.type, self.format, self.xformat, + self.c_encoder, self.c_decoder, self.base_codec, + self.py_encoder, self.py_decoder, + self.element_codec, + self.element_type_oids, self.element_names, + self.element_codecs, self.element_delimiter) + + return codec + + cdef encode_scalar(self, ConnectionSettings settings, WriteBuffer buf, + object obj): + self.c_encoder(settings, buf, obj) + + cdef encode_array(self, ConnectionSettings settings, WriteBuffer buf, + object obj): + array_encode(settings, buf, obj, self.element_codec.oid, + codec_encode_func_ex, + (self.element_codec)) + + cdef encode_array_text(self, ConnectionSettings settings, WriteBuffer buf, + object obj): + return textarray_encode(settings, buf, obj, + codec_encode_func_ex, + (self.element_codec), + self.element_delimiter) + + cdef encode_range(self, ConnectionSettings settings, WriteBuffer buf, + object obj): + range_encode(settings, buf, obj, self.element_codec.oid, + codec_encode_func_ex, + (self.element_codec)) + + cdef encode_multirange(self, ConnectionSettings settings, WriteBuffer buf, + object obj): + multirange_encode(settings, buf, obj, self.element_codec.oid, + codec_encode_func_ex, + (self.element_codec)) + + cdef encode_composite(self, ConnectionSettings settings, WriteBuffer buf, + object obj): + cdef: + WriteBuffer elem_data + int i + list elem_codecs = self.element_codecs + ssize_t count + ssize_t composite_size + tuple rec + + if isinstance(obj, MappingABC): + # Input is dict-like, form a tuple + composite_size = len(self.element_type_oids) + rec = cpython.PyTuple_New(composite_size) + + for i in range(composite_size): + cpython.Py_INCREF(None) + cpython.PyTuple_SET_ITEM(rec, i, None) + + for field in obj: + try: + i = self.element_names[field] + except KeyError: + raise ValueError( + '{!r} is not a valid element of composite ' + 'type {}'.format(field, self.name)) from None + + item = obj[field] + cpython.Py_INCREF(item) + cpython.PyTuple_SET_ITEM(rec, i, item) + + obj = rec + + count = len(obj) + if count > _MAXINT32: + raise ValueError('too many elements in composite type record') + + elem_data = WriteBuffer.new() + i = 0 + for item in obj: + elem_data.write_int32(self.element_type_oids[i]) + if item is None: + elem_data.write_int32(-1) + else: + (elem_codecs[i]).encode(settings, elem_data, item) + i += 1 + + record_encode_frame(settings, buf, elem_data, count) + + cdef encode_in_python(self, ConnectionSettings settings, WriteBuffer buf, + object obj): + data = self.py_encoder(obj) + if self.xformat == PG_XFORMAT_OBJECT: + if self.format == PG_FORMAT_BINARY: + pgproto.bytea_encode(settings, buf, data) + elif self.format == PG_FORMAT_TEXT: + pgproto.text_encode(settings, buf, data) + else: + raise exceptions.InternalClientError( + 'unexpected data format: {}'.format(self.format)) + elif self.xformat == PG_XFORMAT_TUPLE: + if self.base_codec is not None: + self.base_codec.encode(settings, buf, data) + else: + self.c_encoder(settings, buf, data) + else: + raise exceptions.InternalClientError( + 'unexpected exchange format: {}'.format(self.xformat)) + + cdef encode(self, ConnectionSettings settings, WriteBuffer buf, + object obj): + return self.encoder(self, settings, buf, obj) + + cdef decode_scalar(self, ConnectionSettings settings, FRBuffer *buf): + return self.c_decoder(settings, buf) + + cdef decode_array(self, ConnectionSettings settings, FRBuffer *buf): + return array_decode(settings, buf, codec_decode_func_ex, + (self.element_codec)) + + cdef decode_array_text(self, ConnectionSettings settings, + FRBuffer *buf): + return textarray_decode(settings, buf, codec_decode_func_ex, + (self.element_codec), + self.element_delimiter) + + cdef decode_range(self, ConnectionSettings settings, FRBuffer *buf): + return range_decode(settings, buf, codec_decode_func_ex, + (self.element_codec)) + + cdef decode_multirange(self, ConnectionSettings settings, FRBuffer *buf): + return multirange_decode(settings, buf, codec_decode_func_ex, + (self.element_codec)) + + cdef decode_composite(self, ConnectionSettings settings, + FRBuffer *buf): + cdef: + object result + ssize_t elem_count + ssize_t i + int32_t elem_len + uint32_t elem_typ + uint32_t received_elem_typ + Codec elem_codec + FRBuffer elem_buf + + elem_count = hton.unpack_int32(frb_read(buf, 4)) + if elem_count != len(self.element_type_oids): + raise exceptions.OutdatedSchemaCacheError( + 'unexpected number of attributes of composite type: ' + '{}, expected {}' + .format( + elem_count, + len(self.element_type_oids), + ), + schema=self.schema, + data_type=self.name, + ) + result = self.record_desc.make_record(asyncpg.Record, elem_count) + for i in range(elem_count): + elem_typ = self.element_type_oids[i] + received_elem_typ = hton.unpack_int32(frb_read(buf, 4)) + + if received_elem_typ != elem_typ: + raise exceptions.OutdatedSchemaCacheError( + 'unexpected data type of composite type attribute {}: ' + '{!r}, expected {!r}' + .format( + i, + BUILTIN_TYPE_OID_MAP.get( + received_elem_typ, received_elem_typ), + BUILTIN_TYPE_OID_MAP.get( + elem_typ, elem_typ) + ), + schema=self.schema, + data_type=self.name, + position=i, + ) + + elem_len = hton.unpack_int32(frb_read(buf, 4)) + if elem_len == -1: + elem = None + else: + elem_codec = self.element_codecs[i] + elem = elem_codec.decode( + settings, frb_slice_from(&elem_buf, buf, elem_len)) + + cpython.Py_INCREF(elem) + recordcapi.ApgRecord_SET_ITEM(result, i, elem) + + return result + + cdef decode_in_python(self, ConnectionSettings settings, + FRBuffer *buf): + if self.xformat == PG_XFORMAT_OBJECT: + if self.format == PG_FORMAT_BINARY: + data = pgproto.bytea_decode(settings, buf) + elif self.format == PG_FORMAT_TEXT: + data = pgproto.text_decode(settings, buf) + else: + raise exceptions.InternalClientError( + 'unexpected data format: {}'.format(self.format)) + elif self.xformat == PG_XFORMAT_TUPLE: + if self.base_codec is not None: + data = self.base_codec.decode(settings, buf) + else: + data = self.c_decoder(settings, buf) + else: + raise exceptions.InternalClientError( + 'unexpected exchange format: {}'.format(self.xformat)) + + return self.py_decoder(data) + + cdef inline decode(self, ConnectionSettings settings, FRBuffer *buf): + return self.decoder(self, settings, buf) + + cdef inline has_encoder(self): + cdef Codec elem_codec + + if self.c_encoder is not NULL or self.py_encoder is not None: + return True + + elif ( + self.type == CODEC_ARRAY + or self.type == CODEC_RANGE + or self.type == CODEC_MULTIRANGE + ): + return self.element_codec.has_encoder() + + elif self.type == CODEC_COMPOSITE: + for elem_codec in self.element_codecs: + if not elem_codec.has_encoder(): + return False + return True + + else: + return False + + cdef has_decoder(self): + cdef Codec elem_codec + + if self.c_decoder is not NULL or self.py_decoder is not None: + return True + + elif ( + self.type == CODEC_ARRAY + or self.type == CODEC_RANGE + or self.type == CODEC_MULTIRANGE + ): + return self.element_codec.has_decoder() + + elif self.type == CODEC_COMPOSITE: + for elem_codec in self.element_codecs: + if not elem_codec.has_decoder(): + return False + return True + + else: + return False + + cdef is_binary(self): + return self.format == PG_FORMAT_BINARY + + def __repr__(self): + return ''.format( + self.oid, + 'NA' if self.element_codec is None else self.element_codec.oid, + has_core_codec(self.oid)) + + @staticmethod + cdef Codec new_array_codec(uint32_t oid, + str name, + str schema, + Codec element_codec, + Py_UCS4 element_delimiter): + cdef Codec codec + codec = Codec(oid) + codec.init(name, schema, 'array', CODEC_ARRAY, element_codec.format, + PG_XFORMAT_OBJECT, NULL, NULL, None, None, None, + element_codec, None, None, None, element_delimiter) + return codec + + @staticmethod + cdef Codec new_range_codec(uint32_t oid, + str name, + str schema, + Codec element_codec): + cdef Codec codec + codec = Codec(oid) + codec.init(name, schema, 'range', CODEC_RANGE, element_codec.format, + PG_XFORMAT_OBJECT, NULL, NULL, None, None, None, + element_codec, None, None, None, 0) + return codec + + @staticmethod + cdef Codec new_multirange_codec(uint32_t oid, + str name, + str schema, + Codec element_codec): + cdef Codec codec + codec = Codec(oid) + codec.init(name, schema, 'multirange', CODEC_MULTIRANGE, + element_codec.format, PG_XFORMAT_OBJECT, NULL, NULL, None, + None, None, element_codec, None, None, None, 0) + return codec + + @staticmethod + cdef Codec new_composite_codec(uint32_t oid, + str name, + str schema, + ServerDataFormat format, + list element_codecs, + tuple element_type_oids, + object element_names): + cdef Codec codec + codec = Codec(oid) + codec.init(name, schema, 'composite', CODEC_COMPOSITE, + format, PG_XFORMAT_OBJECT, NULL, NULL, None, None, None, + None, element_type_oids, element_names, element_codecs, 0) + return codec + + @staticmethod + cdef Codec new_python_codec(uint32_t oid, + str name, + str schema, + str kind, + object encoder, + object decoder, + encode_func c_encoder, + decode_func c_decoder, + Codec base_codec, + ServerDataFormat format, + ClientExchangeFormat xformat): + cdef Codec codec + codec = Codec(oid) + codec.init(name, schema, kind, CODEC_PY, format, xformat, + c_encoder, c_decoder, base_codec, encoder, decoder, + None, None, None, None, 0) + return codec + + +# Encode callback for arrays +cdef codec_encode_func_ex(ConnectionSettings settings, WriteBuffer buf, + object obj, const void *arg): + return (arg).encode(settings, buf, obj) + + +# Decode callback for arrays +cdef codec_decode_func_ex(ConnectionSettings settings, FRBuffer *buf, + const void *arg): + return (arg).decode(settings, buf) + + +cdef uint32_t pylong_as_oid(val) except? 0xFFFFFFFFl: + cdef: + int64_t oid = 0 + bint overflow = False + + try: + oid = cpython.PyLong_AsLongLong(val) + except OverflowError: + overflow = True + + if overflow or (oid < 0 or oid > UINT32_MAX): + raise OverflowError('OID value too large: {!r}'.format(val)) + + return val + + +cdef class DataCodecConfig: + def __init__(self): + # Codec instance cache for derived types: + # composites, arrays, ranges, domains and their combinations. + self._derived_type_codecs = {} + # Codec instances set up by the user for the connection. + self._custom_type_codecs = {} + + def add_types(self, types): + cdef: + Codec elem_codec + list comp_elem_codecs + ServerDataFormat format + ServerDataFormat elem_format + bint has_text_elements + Py_UCS4 elem_delim + + for ti in types: + oid = ti['oid'] + + if self.get_codec(oid, PG_FORMAT_ANY) is not None: + continue + + name = ti['name'] + schema = ti['ns'] + array_element_oid = ti['elemtype'] + range_subtype_oid = ti['range_subtype'] + if ti['attrtypoids']: + comp_type_attrs = tuple(ti['attrtypoids']) + else: + comp_type_attrs = None + base_type = ti['basetype'] + + if array_element_oid: + # Array type (note, there is no separate 'kind' for arrays) + + # Canonicalize type name to "elemtype[]" + if name.startswith('_'): + name = name[1:] + name = '{}[]'.format(name) + + elem_codec = self.get_codec(array_element_oid, PG_FORMAT_ANY) + if elem_codec is None: + elem_codec = self.declare_fallback_codec( + array_element_oid, ti['elemtype_name'], schema) + + elem_delim = ti['elemdelim'][0] + + self._derived_type_codecs[oid, elem_codec.format] = \ + Codec.new_array_codec( + oid, name, schema, elem_codec, elem_delim) + + elif ti['kind'] == b'c': + # Composite type + + if not comp_type_attrs: + raise exceptions.InternalClientError( + f'type record missing field types for composite {oid}') + + comp_elem_codecs = [] + has_text_elements = False + + for typoid in comp_type_attrs: + elem_codec = self.get_codec(typoid, PG_FORMAT_ANY) + if elem_codec is None: + raise exceptions.InternalClientError( + f'no codec for composite attribute type {typoid}') + if elem_codec.format is PG_FORMAT_TEXT: + has_text_elements = True + comp_elem_codecs.append(elem_codec) + + element_names = collections.OrderedDict() + for i, attrname in enumerate(ti['attrnames']): + element_names[attrname] = i + + # If at least one element is text-encoded, we must + # encode the whole composite as text. + if has_text_elements: + elem_format = PG_FORMAT_TEXT + else: + elem_format = PG_FORMAT_BINARY + + self._derived_type_codecs[oid, elem_format] = \ + Codec.new_composite_codec( + oid, name, schema, elem_format, comp_elem_codecs, + comp_type_attrs, element_names) + + elif ti['kind'] == b'd': + # Domain type + + if not base_type: + raise exceptions.InternalClientError( + f'type record missing base type for domain {oid}') + + elem_codec = self.get_codec(base_type, PG_FORMAT_ANY) + if elem_codec is None: + elem_codec = self.declare_fallback_codec( + base_type, ti['basetype_name'], schema) + + self._derived_type_codecs[oid, elem_codec.format] = elem_codec + + elif ti['kind'] == b'r': + # Range type + + if not range_subtype_oid: + raise exceptions.InternalClientError( + f'type record missing base type for range {oid}') + + elem_codec = self.get_codec(range_subtype_oid, PG_FORMAT_ANY) + if elem_codec is None: + elem_codec = self.declare_fallback_codec( + range_subtype_oid, ti['range_subtype_name'], schema) + + self._derived_type_codecs[oid, elem_codec.format] = \ + Codec.new_range_codec(oid, name, schema, elem_codec) + + elif ti['kind'] == b'm': + # Multirange type + + if not range_subtype_oid: + raise exceptions.InternalClientError( + f'type record missing base type for multirange {oid}') + + elem_codec = self.get_codec(range_subtype_oid, PG_FORMAT_ANY) + if elem_codec is None: + elem_codec = self.declare_fallback_codec( + range_subtype_oid, ti['range_subtype_name'], schema) + + self._derived_type_codecs[oid, elem_codec.format] = \ + Codec.new_multirange_codec(oid, name, schema, elem_codec) + + elif ti['kind'] == b'e': + # Enum types are essentially text + self._set_builtin_type_codec(oid, name, schema, 'scalar', + TEXTOID, PG_FORMAT_ANY) + else: + self.declare_fallback_codec(oid, name, schema) + + def add_python_codec(self, typeoid, typename, typeschema, typekind, + typeinfos, encoder, decoder, format, xformat): + cdef: + Codec core_codec = None + encode_func c_encoder = NULL + decode_func c_decoder = NULL + Codec base_codec = None + uint32_t oid = pylong_as_oid(typeoid) + bint codec_set = False + + # Clear all previous overrides (this also clears type cache). + self.remove_python_codec(typeoid, typename, typeschema) + + if typeinfos: + self.add_types(typeinfos) + + if format == PG_FORMAT_ANY: + formats = (PG_FORMAT_TEXT, PG_FORMAT_BINARY) + else: + formats = (format,) + + for fmt in formats: + if xformat == PG_XFORMAT_TUPLE: + if typekind == "scalar": + core_codec = get_core_codec(oid, fmt, xformat) + if core_codec is None: + continue + c_encoder = core_codec.c_encoder + c_decoder = core_codec.c_decoder + elif typekind == "composite": + base_codec = self.get_codec(oid, fmt) + if base_codec is None: + continue + + self._custom_type_codecs[typeoid, fmt] = \ + Codec.new_python_codec(oid, typename, typeschema, typekind, + encoder, decoder, c_encoder, c_decoder, + base_codec, fmt, xformat) + codec_set = True + + if not codec_set: + raise exceptions.InterfaceError( + "{} type does not support the 'tuple' exchange format".format( + typename)) + + def remove_python_codec(self, typeoid, typename, typeschema): + for fmt in (PG_FORMAT_BINARY, PG_FORMAT_TEXT): + self._custom_type_codecs.pop((typeoid, fmt), None) + self.clear_type_cache() + + def _set_builtin_type_codec(self, typeoid, typename, typeschema, typekind, + alias_to, format=PG_FORMAT_ANY): + cdef: + Codec codec + Codec target_codec + uint32_t oid = pylong_as_oid(typeoid) + uint32_t alias_oid = 0 + bint codec_set = False + + if format == PG_FORMAT_ANY: + formats = (PG_FORMAT_BINARY, PG_FORMAT_TEXT) + else: + formats = (format,) + + if isinstance(alias_to, int): + alias_oid = pylong_as_oid(alias_to) + else: + alias_oid = BUILTIN_TYPE_NAME_MAP.get(alias_to, 0) + + for format in formats: + if alias_oid != 0: + target_codec = self.get_codec(alias_oid, format) + else: + target_codec = get_extra_codec(alias_to, format) + + if target_codec is None: + continue + + codec = target_codec.copy() + codec.oid = typeoid + codec.name = typename + codec.schema = typeschema + codec.kind = typekind + + self._custom_type_codecs[typeoid, format] = codec + codec_set = True + + if not codec_set: + if format == PG_FORMAT_BINARY: + codec_str = 'binary' + elif format == PG_FORMAT_TEXT: + codec_str = 'text' + else: + codec_str = 'text or binary' + + raise exceptions.InterfaceError( + f'cannot alias {typename} to {alias_to}: ' + f'there is no {codec_str} codec for {alias_to}') + + def set_builtin_type_codec(self, typeoid, typename, typeschema, typekind, + alias_to, format=PG_FORMAT_ANY): + self._set_builtin_type_codec(typeoid, typename, typeschema, typekind, + alias_to, format) + self.clear_type_cache() + + def clear_type_cache(self): + self._derived_type_codecs.clear() + + def declare_fallback_codec(self, uint32_t oid, str name, str schema): + cdef Codec codec + + if oid <= MAXBUILTINOID: + # This is a BKI type, for which asyncpg has no + # defined codec. This should only happen for newly + # added builtin types, for which this version of + # asyncpg is lacking support. + # + raise exceptions.UnsupportedClientFeatureError( + f'unhandled standard data type {name!r} (OID {oid})') + else: + # This is a non-BKI type, and as such, has no + # stable OID, so no possibility of a builtin codec. + # In this case, fallback to text format. Applications + # can avoid this by specifying a codec for this type + # using Connection.set_type_codec(). + # + self._set_builtin_type_codec(oid, name, schema, 'scalar', + TEXTOID, PG_FORMAT_TEXT) + + codec = self.get_codec(oid, PG_FORMAT_TEXT) + + return codec + + cdef inline Codec get_codec(self, uint32_t oid, ServerDataFormat format, + bint ignore_custom_codec=False): + cdef Codec codec + + if format == PG_FORMAT_ANY: + codec = self.get_codec( + oid, PG_FORMAT_BINARY, ignore_custom_codec) + if codec is None: + codec = self.get_codec( + oid, PG_FORMAT_TEXT, ignore_custom_codec) + return codec + else: + if not ignore_custom_codec: + codec = self.get_custom_codec(oid, PG_FORMAT_ANY) + if codec is not None: + if codec.format != format: + # The codec for this OID has been overridden by + # set_{builtin}_type_codec with a different format. + # We must respect that and not return a core codec. + return None + else: + return codec + + codec = get_core_codec(oid, format) + if codec is not None: + return codec + else: + try: + return self._derived_type_codecs[oid, format] + except KeyError: + return None + + cdef inline Codec get_custom_codec( + self, + uint32_t oid, + ServerDataFormat format + ): + cdef Codec codec + + if format == PG_FORMAT_ANY: + codec = self.get_custom_codec(oid, PG_FORMAT_BINARY) + if codec is None: + codec = self.get_custom_codec(oid, PG_FORMAT_TEXT) + else: + codec = self._custom_type_codecs.get((oid, format)) + + return codec + + +cdef inline Codec get_core_codec( + uint32_t oid, ServerDataFormat format, + ClientExchangeFormat xformat=PG_XFORMAT_OBJECT): + cdef: + void *ptr = NULL + + if oid > MAXSUPPORTEDOID: + return None + if format == PG_FORMAT_BINARY: + ptr = (codec_map).get_binary_codec_ptr(oid * xformat) + elif format == PG_FORMAT_TEXT: + ptr = (codec_map).get_text_codec_ptr(oid * xformat) + + if ptr is NULL: + return None + else: + return ptr + + +cdef inline Codec get_any_core_codec( + uint32_t oid, ServerDataFormat format, + ClientExchangeFormat xformat=PG_XFORMAT_OBJECT): + """A version of get_core_codec that accepts PG_FORMAT_ANY.""" + cdef: + Codec codec + + if format == PG_FORMAT_ANY: + codec = get_core_codec(oid, PG_FORMAT_BINARY, xformat) + if codec is None: + codec = get_core_codec(oid, PG_FORMAT_TEXT, xformat) + else: + codec = get_core_codec(oid, format, xformat) + + return codec + + +cdef inline int has_core_codec(uint32_t oid): + return ( + (codec_map).get_binary_codec_ptr(oid) != NULL + or (codec_map).get_text_codec_ptr(oid) != NULL + ) + + +cdef register_core_codec(uint32_t oid, + encode_func encode, + decode_func decode, + ServerDataFormat format, + ClientExchangeFormat xformat=PG_XFORMAT_OBJECT): + + if oid > MAXSUPPORTEDOID: + raise exceptions.InternalClientError( + 'cannot register core codec for OID {}: it is greater ' + 'than MAXSUPPORTEDOID ({})'.format(oid, MAXSUPPORTEDOID)) + + cdef: + Codec codec + str name + str kind + + name = BUILTIN_TYPE_OID_MAP[oid] + kind = 'array' if oid in ARRAY_TYPES else 'scalar' + + codec = Codec(oid) + codec.init(name, 'pg_catalog', kind, CODEC_C, format, xformat, + encode, decode, None, None, None, None, None, None, None, 0) + cpython.Py_INCREF(codec) # immortalize + + if format == PG_FORMAT_BINARY: + (codec_map).set_binary_codec_ptr(oid * xformat, codec) + elif format == PG_FORMAT_TEXT: + (codec_map).set_text_codec_ptr(oid * xformat, codec) + else: + raise exceptions.InternalClientError( + 'invalid data format: {}'.format(format)) + + +cdef register_extra_codec(str name, + encode_func encode, + decode_func decode, + ServerDataFormat format): + cdef: + Codec codec + str kind + + kind = 'scalar' + + codec = Codec(INVALIDOID) + codec.init(name, None, kind, CODEC_C, format, PG_XFORMAT_OBJECT, + encode, decode, None, None, None, None, None, None, None, 0) + (codec_map).extra_codecs[name, format] = codec + + +cdef inline Codec get_extra_codec(str name, ServerDataFormat format): + return (codec_map).extra_codecs.get((name, format)) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/pgproto.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/pgproto.pyx new file mode 100755 index 0000000..51d650d --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/pgproto.pyx @@ -0,0 +1,484 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cdef init_bits_codecs(): + register_core_codec(BITOID, + pgproto.bits_encode, + pgproto.bits_decode, + PG_FORMAT_BINARY) + + register_core_codec(VARBITOID, + pgproto.bits_encode, + pgproto.bits_decode, + PG_FORMAT_BINARY) + + +cdef init_bytea_codecs(): + register_core_codec(BYTEAOID, + pgproto.bytea_encode, + pgproto.bytea_decode, + PG_FORMAT_BINARY) + + register_core_codec(CHAROID, + pgproto.bytea_encode, + pgproto.bytea_decode, + PG_FORMAT_BINARY) + + +cdef init_datetime_codecs(): + register_core_codec(DATEOID, + pgproto.date_encode, + pgproto.date_decode, + PG_FORMAT_BINARY) + + register_core_codec(DATEOID, + pgproto.date_encode_tuple, + pgproto.date_decode_tuple, + PG_FORMAT_BINARY, + PG_XFORMAT_TUPLE) + + register_core_codec(TIMEOID, + pgproto.time_encode, + pgproto.time_decode, + PG_FORMAT_BINARY) + + register_core_codec(TIMEOID, + pgproto.time_encode_tuple, + pgproto.time_decode_tuple, + PG_FORMAT_BINARY, + PG_XFORMAT_TUPLE) + + register_core_codec(TIMETZOID, + pgproto.timetz_encode, + pgproto.timetz_decode, + PG_FORMAT_BINARY) + + register_core_codec(TIMETZOID, + pgproto.timetz_encode_tuple, + pgproto.timetz_decode_tuple, + PG_FORMAT_BINARY, + PG_XFORMAT_TUPLE) + + register_core_codec(TIMESTAMPOID, + pgproto.timestamp_encode, + pgproto.timestamp_decode, + PG_FORMAT_BINARY) + + register_core_codec(TIMESTAMPOID, + pgproto.timestamp_encode_tuple, + pgproto.timestamp_decode_tuple, + PG_FORMAT_BINARY, + PG_XFORMAT_TUPLE) + + register_core_codec(TIMESTAMPTZOID, + pgproto.timestamptz_encode, + pgproto.timestamptz_decode, + PG_FORMAT_BINARY) + + register_core_codec(TIMESTAMPTZOID, + pgproto.timestamp_encode_tuple, + pgproto.timestamp_decode_tuple, + PG_FORMAT_BINARY, + PG_XFORMAT_TUPLE) + + register_core_codec(INTERVALOID, + pgproto.interval_encode, + pgproto.interval_decode, + PG_FORMAT_BINARY) + + register_core_codec(INTERVALOID, + pgproto.interval_encode_tuple, + pgproto.interval_decode_tuple, + PG_FORMAT_BINARY, + PG_XFORMAT_TUPLE) + + # For obsolete abstime/reltime/tinterval, we do not bother to + # interpret the value, and simply return and pass it as text. + # + register_core_codec(ABSTIMEOID, + pgproto.text_encode, + pgproto.text_decode, + PG_FORMAT_TEXT) + + register_core_codec(RELTIMEOID, + pgproto.text_encode, + pgproto.text_decode, + PG_FORMAT_TEXT) + + register_core_codec(TINTERVALOID, + pgproto.text_encode, + pgproto.text_decode, + PG_FORMAT_TEXT) + + +cdef init_float_codecs(): + register_core_codec(FLOAT4OID, + pgproto.float4_encode, + pgproto.float4_decode, + PG_FORMAT_BINARY) + + register_core_codec(FLOAT8OID, + pgproto.float8_encode, + pgproto.float8_decode, + PG_FORMAT_BINARY) + + +cdef init_geometry_codecs(): + register_core_codec(BOXOID, + pgproto.box_encode, + pgproto.box_decode, + PG_FORMAT_BINARY) + + register_core_codec(LINEOID, + pgproto.line_encode, + pgproto.line_decode, + PG_FORMAT_BINARY) + + register_core_codec(LSEGOID, + pgproto.lseg_encode, + pgproto.lseg_decode, + PG_FORMAT_BINARY) + + register_core_codec(POINTOID, + pgproto.point_encode, + pgproto.point_decode, + PG_FORMAT_BINARY) + + register_core_codec(PATHOID, + pgproto.path_encode, + pgproto.path_decode, + PG_FORMAT_BINARY) + + register_core_codec(POLYGONOID, + pgproto.poly_encode, + pgproto.poly_decode, + PG_FORMAT_BINARY) + + register_core_codec(CIRCLEOID, + pgproto.circle_encode, + pgproto.circle_decode, + PG_FORMAT_BINARY) + + +cdef init_hstore_codecs(): + register_extra_codec('pg_contrib.hstore', + pgproto.hstore_encode, + pgproto.hstore_decode, + PG_FORMAT_BINARY) + + +cdef init_json_codecs(): + register_core_codec(JSONOID, + pgproto.text_encode, + pgproto.text_decode, + PG_FORMAT_BINARY) + register_core_codec(JSONBOID, + pgproto.jsonb_encode, + pgproto.jsonb_decode, + PG_FORMAT_BINARY) + register_core_codec(JSONPATHOID, + pgproto.jsonpath_encode, + pgproto.jsonpath_decode, + PG_FORMAT_BINARY) + + +cdef init_int_codecs(): + + register_core_codec(BOOLOID, + pgproto.bool_encode, + pgproto.bool_decode, + PG_FORMAT_BINARY) + + register_core_codec(INT2OID, + pgproto.int2_encode, + pgproto.int2_decode, + PG_FORMAT_BINARY) + + register_core_codec(INT4OID, + pgproto.int4_encode, + pgproto.int4_decode, + PG_FORMAT_BINARY) + + register_core_codec(INT8OID, + pgproto.int8_encode, + pgproto.int8_decode, + PG_FORMAT_BINARY) + + +cdef init_pseudo_codecs(): + # Void type is returned by SELECT void_returning_function() + register_core_codec(VOIDOID, + pgproto.void_encode, + pgproto.void_decode, + PG_FORMAT_BINARY) + + # Unknown type, always decoded as text + register_core_codec(UNKNOWNOID, + pgproto.text_encode, + pgproto.text_decode, + PG_FORMAT_TEXT) + + # OID and friends + oid_types = [ + OIDOID, XIDOID, CIDOID + ] + + for oid_type in oid_types: + register_core_codec(oid_type, + pgproto.uint4_encode, + pgproto.uint4_decode, + PG_FORMAT_BINARY) + + # 64-bit OID types + oid8_types = [ + XID8OID, + ] + + for oid_type in oid8_types: + register_core_codec(oid_type, + pgproto.uint8_encode, + pgproto.uint8_decode, + PG_FORMAT_BINARY) + + # reg* types -- these are really system catalog OIDs, but + # allow the catalog object name as an input. We could just + # decode these as OIDs, but handling them as text seems more + # useful. + # + reg_types = [ + REGPROCOID, REGPROCEDUREOID, REGOPEROID, REGOPERATOROID, + REGCLASSOID, REGTYPEOID, REGCONFIGOID, REGDICTIONARYOID, + REGNAMESPACEOID, REGROLEOID, REFCURSOROID, REGCOLLATIONOID, + ] + + for reg_type in reg_types: + register_core_codec(reg_type, + pgproto.text_encode, + pgproto.text_decode, + PG_FORMAT_TEXT) + + # cstring type is used by Postgres' I/O functions + register_core_codec(CSTRINGOID, + pgproto.text_encode, + pgproto.text_decode, + PG_FORMAT_BINARY) + + # various system pseudotypes with no I/O + no_io_types = [ + ANYOID, TRIGGEROID, EVENT_TRIGGEROID, LANGUAGE_HANDLEROID, + FDW_HANDLEROID, TSM_HANDLEROID, INTERNALOID, OPAQUEOID, + ANYELEMENTOID, ANYNONARRAYOID, ANYCOMPATIBLEOID, + ANYCOMPATIBLEARRAYOID, ANYCOMPATIBLENONARRAYOID, + ANYCOMPATIBLERANGEOID, ANYCOMPATIBLEMULTIRANGEOID, + ANYRANGEOID, ANYMULTIRANGEOID, ANYARRAYOID, + PG_DDL_COMMANDOID, INDEX_AM_HANDLEROID, TABLE_AM_HANDLEROID, + ] + + register_core_codec(ANYENUMOID, + NULL, + pgproto.text_decode, + PG_FORMAT_TEXT) + + for no_io_type in no_io_types: + register_core_codec(no_io_type, + NULL, + NULL, + PG_FORMAT_BINARY) + + # ACL specification string + register_core_codec(ACLITEMOID, + pgproto.text_encode, + pgproto.text_decode, + PG_FORMAT_TEXT) + + # Postgres' serialized expression tree type + register_core_codec(PG_NODE_TREEOID, + NULL, + pgproto.text_decode, + PG_FORMAT_TEXT) + + # pg_lsn type -- a pointer to a location in the XLOG. + register_core_codec(PG_LSNOID, + pgproto.int8_encode, + pgproto.int8_decode, + PG_FORMAT_BINARY) + + register_core_codec(SMGROID, + pgproto.text_encode, + pgproto.text_decode, + PG_FORMAT_TEXT) + + # pg_dependencies and pg_ndistinct are special types + # used in pg_statistic_ext columns. + register_core_codec(PG_DEPENDENCIESOID, + pgproto.text_encode, + pgproto.text_decode, + PG_FORMAT_TEXT) + + register_core_codec(PG_NDISTINCTOID, + pgproto.text_encode, + pgproto.text_decode, + PG_FORMAT_TEXT) + + # pg_mcv_list is a special type used in pg_statistic_ext_data + # system catalog + register_core_codec(PG_MCV_LISTOID, + pgproto.bytea_encode, + pgproto.bytea_decode, + PG_FORMAT_BINARY) + + # These two are internal to BRIN index support and are unlikely + # to be sent, but since I/O functions for these exist, add decoders + # nonetheless. + register_core_codec(PG_BRIN_BLOOM_SUMMARYOID, + NULL, + pgproto.bytea_decode, + PG_FORMAT_BINARY) + + register_core_codec(PG_BRIN_MINMAX_MULTI_SUMMARYOID, + NULL, + pgproto.bytea_decode, + PG_FORMAT_BINARY) + + +cdef init_text_codecs(): + textoids = [ + NAMEOID, + BPCHAROID, + VARCHAROID, + TEXTOID, + XMLOID + ] + + for oid in textoids: + register_core_codec(oid, + pgproto.text_encode, + pgproto.text_decode, + PG_FORMAT_BINARY) + + register_core_codec(oid, + pgproto.text_encode, + pgproto.text_decode, + PG_FORMAT_TEXT) + + +cdef init_tid_codecs(): + register_core_codec(TIDOID, + pgproto.tid_encode, + pgproto.tid_decode, + PG_FORMAT_BINARY) + + +cdef init_txid_codecs(): + register_core_codec(TXID_SNAPSHOTOID, + pgproto.pg_snapshot_encode, + pgproto.pg_snapshot_decode, + PG_FORMAT_BINARY) + + register_core_codec(PG_SNAPSHOTOID, + pgproto.pg_snapshot_encode, + pgproto.pg_snapshot_decode, + PG_FORMAT_BINARY) + + +cdef init_tsearch_codecs(): + ts_oids = [ + TSQUERYOID, + TSVECTOROID, + ] + + for oid in ts_oids: + register_core_codec(oid, + pgproto.text_encode, + pgproto.text_decode, + PG_FORMAT_TEXT) + + register_core_codec(GTSVECTOROID, + NULL, + pgproto.text_decode, + PG_FORMAT_TEXT) + + +cdef init_uuid_codecs(): + register_core_codec(UUIDOID, + pgproto.uuid_encode, + pgproto.uuid_decode, + PG_FORMAT_BINARY) + + +cdef init_numeric_codecs(): + register_core_codec(NUMERICOID, + pgproto.numeric_encode_text, + pgproto.numeric_decode_text, + PG_FORMAT_TEXT) + + register_core_codec(NUMERICOID, + pgproto.numeric_encode_binary, + pgproto.numeric_decode_binary, + PG_FORMAT_BINARY) + + +cdef init_network_codecs(): + register_core_codec(CIDROID, + pgproto.cidr_encode, + pgproto.cidr_decode, + PG_FORMAT_BINARY) + + register_core_codec(INETOID, + pgproto.inet_encode, + pgproto.inet_decode, + PG_FORMAT_BINARY) + + register_core_codec(MACADDROID, + pgproto.text_encode, + pgproto.text_decode, + PG_FORMAT_TEXT) + + register_core_codec(MACADDR8OID, + pgproto.text_encode, + pgproto.text_decode, + PG_FORMAT_TEXT) + + +cdef init_monetary_codecs(): + moneyoids = [ + MONEYOID, + ] + + for oid in moneyoids: + register_core_codec(oid, + pgproto.text_encode, + pgproto.text_decode, + PG_FORMAT_TEXT) + + +cdef init_all_pgproto_codecs(): + # Builtin types, in lexicographical order. + init_bits_codecs() + init_bytea_codecs() + init_datetime_codecs() + init_float_codecs() + init_geometry_codecs() + init_int_codecs() + init_json_codecs() + init_monetary_codecs() + init_network_codecs() + init_numeric_codecs() + init_text_codecs() + init_tid_codecs() + init_tsearch_codecs() + init_txid_codecs() + init_uuid_codecs() + + # Various pseudotypes and system types + init_pseudo_codecs() + + # contrib + init_hstore_codecs() + + +init_all_pgproto_codecs() diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/range.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/range.pyx new file mode 100755 index 0000000..1038c18 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/range.pyx @@ -0,0 +1,207 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +from asyncpg import types as apg_types + +from collections.abc import Sequence as SequenceABC + +# defined in postgresql/src/include/utils/rangetypes.h +DEF RANGE_EMPTY = 0x01 # range is empty +DEF RANGE_LB_INC = 0x02 # lower bound is inclusive +DEF RANGE_UB_INC = 0x04 # upper bound is inclusive +DEF RANGE_LB_INF = 0x08 # lower bound is -infinity +DEF RANGE_UB_INF = 0x10 # upper bound is +infinity + + +cdef enum _RangeArgumentType: + _RANGE_ARGUMENT_INVALID = 0 + _RANGE_ARGUMENT_TUPLE = 1 + _RANGE_ARGUMENT_RANGE = 2 + + +cdef inline bint _range_has_lbound(uint8_t flags): + return not (flags & (RANGE_EMPTY | RANGE_LB_INF)) + + +cdef inline bint _range_has_ubound(uint8_t flags): + return not (flags & (RANGE_EMPTY | RANGE_UB_INF)) + + +cdef inline _RangeArgumentType _range_type(object obj): + if cpython.PyTuple_Check(obj) or cpython.PyList_Check(obj): + return _RANGE_ARGUMENT_TUPLE + elif isinstance(obj, apg_types.Range): + return _RANGE_ARGUMENT_RANGE + else: + return _RANGE_ARGUMENT_INVALID + + +cdef range_encode(ConnectionSettings settings, WriteBuffer buf, + object obj, uint32_t elem_oid, + encode_func_ex encoder, const void *encoder_arg): + cdef: + ssize_t obj_len + uint8_t flags = 0 + object lower = None + object upper = None + WriteBuffer bounds_data = WriteBuffer.new() + _RangeArgumentType arg_type = _range_type(obj) + + if arg_type == _RANGE_ARGUMENT_INVALID: + raise TypeError( + 'list, tuple or Range object expected (got type {})'.format( + type(obj))) + + elif arg_type == _RANGE_ARGUMENT_TUPLE: + obj_len = len(obj) + if obj_len == 2: + lower = obj[0] + upper = obj[1] + + if lower is None: + flags |= RANGE_LB_INF + + if upper is None: + flags |= RANGE_UB_INF + + flags |= RANGE_LB_INC | RANGE_UB_INC + + elif obj_len == 1: + lower = obj[0] + flags |= RANGE_LB_INC | RANGE_UB_INF + + elif obj_len == 0: + flags |= RANGE_EMPTY + + else: + raise ValueError( + 'expected 0, 1 or 2 elements in range (got {})'.format( + obj_len)) + + else: + if obj.isempty: + flags |= RANGE_EMPTY + else: + lower = obj.lower + upper = obj.upper + + if obj.lower_inc: + flags |= RANGE_LB_INC + elif lower is None: + flags |= RANGE_LB_INF + + if obj.upper_inc: + flags |= RANGE_UB_INC + elif upper is None: + flags |= RANGE_UB_INF + + if _range_has_lbound(flags): + encoder(settings, bounds_data, lower, encoder_arg) + + if _range_has_ubound(flags): + encoder(settings, bounds_data, upper, encoder_arg) + + buf.write_int32(1 + bounds_data.len()) + buf.write_byte(flags) + buf.write_buffer(bounds_data) + + +cdef range_decode(ConnectionSettings settings, FRBuffer *buf, + decode_func_ex decoder, const void *decoder_arg): + cdef: + uint8_t flags = frb_read(buf, 1)[0] + int32_t bound_len + object lower = None + object upper = None + FRBuffer bound_buf + + if _range_has_lbound(flags): + bound_len = hton.unpack_int32(frb_read(buf, 4)) + if bound_len == -1: + lower = None + else: + frb_slice_from(&bound_buf, buf, bound_len) + lower = decoder(settings, &bound_buf, decoder_arg) + + if _range_has_ubound(flags): + bound_len = hton.unpack_int32(frb_read(buf, 4)) + if bound_len == -1: + upper = None + else: + frb_slice_from(&bound_buf, buf, bound_len) + upper = decoder(settings, &bound_buf, decoder_arg) + + return apg_types.Range(lower=lower, upper=upper, + lower_inc=(flags & RANGE_LB_INC) != 0, + upper_inc=(flags & RANGE_UB_INC) != 0, + empty=(flags & RANGE_EMPTY) != 0) + + +cdef multirange_encode(ConnectionSettings settings, WriteBuffer buf, + object obj, uint32_t elem_oid, + encode_func_ex encoder, const void *encoder_arg): + cdef: + WriteBuffer elem_data + ssize_t elem_data_len + ssize_t elem_count + + if not isinstance(obj, SequenceABC): + raise TypeError( + 'expected a sequence (got type {!r})'.format(type(obj).__name__) + ) + + elem_data = WriteBuffer.new() + + for elem in obj: + range_encode(settings, elem_data, elem, elem_oid, encoder, encoder_arg) + + elem_count = len(obj) + if elem_count > INT32_MAX: + raise OverflowError(f'too many elements in multirange value') + + elem_data_len = elem_data.len() + if elem_data_len > INT32_MAX - 4: + raise OverflowError( + f'size of encoded multirange datum exceeds the maximum allowed' + f' {INT32_MAX - 4} bytes') + + # Datum length + buf.write_int32(4 + elem_data_len) + # Number of elements in multirange + buf.write_int32(elem_count) + buf.write_buffer(elem_data) + + +cdef multirange_decode(ConnectionSettings settings, FRBuffer *buf, + decode_func_ex decoder, const void *decoder_arg): + cdef: + int32_t nelems = hton.unpack_int32(frb_read(buf, 4)) + FRBuffer elem_buf + int32_t elem_len + int i + list result + + if nelems == 0: + return [] + + if nelems < 0: + raise exceptions.ProtocolError( + 'unexpected multirange size value: {}'.format(nelems)) + + result = cpython.PyList_New(nelems) + for i in range(nelems): + elem_len = hton.unpack_int32(frb_read(buf, 4)) + if elem_len == -1: + raise exceptions.ProtocolError( + 'unexpected NULL element in multirange value') + else: + frb_slice_from(&elem_buf, buf, elem_len) + elem = range_decode(settings, &elem_buf, decoder, decoder_arg) + cpython.Py_INCREF(elem) + cpython.PyList_SET_ITEM(result, i, elem) + + return result diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/record.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/record.pyx new file mode 100755 index 0000000..6446f2d --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/record.pyx @@ -0,0 +1,71 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +from asyncpg import exceptions + + +cdef inline record_encode_frame(ConnectionSettings settings, WriteBuffer buf, + WriteBuffer elem_data, int32_t elem_count): + buf.write_int32(4 + elem_data.len()) + # attribute count + buf.write_int32(elem_count) + # encoded attribute data + buf.write_buffer(elem_data) + + +cdef anonymous_record_decode(ConnectionSettings settings, FRBuffer *buf): + cdef: + tuple result + ssize_t elem_count + ssize_t i + int32_t elem_len + uint32_t elem_typ + Codec elem_codec + FRBuffer elem_buf + + elem_count = hton.unpack_int32(frb_read(buf, 4)) + result = cpython.PyTuple_New(elem_count) + + for i in range(elem_count): + elem_typ = hton.unpack_int32(frb_read(buf, 4)) + elem_len = hton.unpack_int32(frb_read(buf, 4)) + + if elem_len == -1: + elem = None + else: + elem_codec = settings.get_data_codec(elem_typ) + if elem_codec is None or not elem_codec.has_decoder(): + raise exceptions.InternalClientError( + 'no decoder for composite type element in ' + 'position {} of type OID {}'.format(i, elem_typ)) + elem = elem_codec.decode(settings, + frb_slice_from(&elem_buf, buf, elem_len)) + + cpython.Py_INCREF(elem) + cpython.PyTuple_SET_ITEM(result, i, elem) + + return result + + +cdef anonymous_record_encode(ConnectionSettings settings, WriteBuffer buf, obj): + raise exceptions.UnsupportedClientFeatureError( + 'input of anonymous composite types is not supported', + hint=( + 'Consider declaring an explicit composite type and ' + 'using it to cast the argument.' + ), + detail='PostgreSQL does not implement anonymous composite type input.' + ) + + +cdef init_record_codecs(): + register_core_codec(RECORDOID, + anonymous_record_encode, + anonymous_record_decode, + PG_FORMAT_BINARY) + +init_record_codecs() diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/textutils.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/textutils.pyx new file mode 100755 index 0000000..dfaf29e --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/codecs/textutils.pyx @@ -0,0 +1,99 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cdef inline uint32_t _apg_tolower(uint32_t c): + if c >= 'A' and c <= 'Z': + return c + 'a' - 'A' + else: + return c + + +cdef int apg_strcasecmp(const Py_UCS4 *s1, const Py_UCS4 *s2): + cdef: + uint32_t c1 + uint32_t c2 + int i = 0 + + while True: + c1 = s1[i] + c2 = s2[i] + + if c1 != c2: + c1 = _apg_tolower(c1) + c2 = _apg_tolower(c2) + if c1 != c2: + return c1 - c2 + + if c1 == 0 or c2 == 0: + break + + i += 1 + + return 0 + + +cdef int apg_strcasecmp_char(const char *s1, const char *s2): + cdef: + uint8_t c1 + uint8_t c2 + int i = 0 + + while True: + c1 = s1[i] + c2 = s2[i] + + if c1 != c2: + c1 = _apg_tolower(c1) + c2 = _apg_tolower(c2) + if c1 != c2: + return c1 - c2 + + if c1 == 0 or c2 == 0: + break + + i += 1 + + return 0 + + +cdef inline bint apg_ascii_isspace(Py_UCS4 ch): + return ( + ch == ' ' or + ch == '\n' or + ch == '\r' or + ch == '\t' or + ch == '\v' or + ch == '\f' + ) + + +cdef Py_UCS4 *apg_parse_int32(Py_UCS4 *buf, int32_t *num): + cdef: + Py_UCS4 *p + int32_t n = 0 + int32_t neg = 0 + + if buf[0] == '-': + neg = 1 + buf += 1 + elif buf[0] == '+': + buf += 1 + + p = buf + while p[0] >= '0' and p[0] <= '9': + n = 10 * n - (p[0] - '0') + p += 1 + + if p == buf: + return NULL + + if not neg: + n = -n + + num[0] = n + + return p diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/consts.pxi b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/consts.pxi new file mode 100755 index 0000000..e1f8726 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/consts.pxi @@ -0,0 +1,12 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +DEF _MAXINT32 = 2**31 - 1 +DEF _COPY_BUFFER_SIZE = 524288 +DEF _COPY_SIGNATURE = b"PGCOPY\n\377\r\n\0" +DEF _EXECUTE_MANY_BUF_NUM = 4 +DEF _EXECUTE_MANY_BUF_SIZE = 32768 diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/coreproto.pxd b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/coreproto.pxd new file mode 100755 index 0000000..34c7c71 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/coreproto.pxd @@ -0,0 +1,192 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +include "scram.pxd" + + +cdef enum ConnectionStatus: + CONNECTION_OK = 1 + CONNECTION_BAD = 2 + CONNECTION_STARTED = 3 # Waiting for connection to be made. + + +cdef enum ProtocolState: + PROTOCOL_IDLE = 0 + + PROTOCOL_FAILED = 1 + PROTOCOL_ERROR_CONSUME = 2 + PROTOCOL_CANCELLED = 3 + PROTOCOL_TERMINATING = 4 + + PROTOCOL_AUTH = 10 + PROTOCOL_PREPARE = 11 + PROTOCOL_BIND_EXECUTE = 12 + PROTOCOL_BIND_EXECUTE_MANY = 13 + PROTOCOL_CLOSE_STMT_PORTAL = 14 + PROTOCOL_SIMPLE_QUERY = 15 + PROTOCOL_EXECUTE = 16 + PROTOCOL_BIND = 17 + PROTOCOL_COPY_OUT = 18 + PROTOCOL_COPY_OUT_DATA = 19 + PROTOCOL_COPY_OUT_DONE = 20 + PROTOCOL_COPY_IN = 21 + PROTOCOL_COPY_IN_DATA = 22 + + +cdef enum AuthenticationMessage: + AUTH_SUCCESSFUL = 0 + AUTH_REQUIRED_KERBEROS = 2 + AUTH_REQUIRED_PASSWORD = 3 + AUTH_REQUIRED_PASSWORDMD5 = 5 + AUTH_REQUIRED_SCMCRED = 6 + AUTH_REQUIRED_GSS = 7 + AUTH_REQUIRED_GSS_CONTINUE = 8 + AUTH_REQUIRED_SSPI = 9 + AUTH_REQUIRED_SASL = 10 + AUTH_SASL_CONTINUE = 11 + AUTH_SASL_FINAL = 12 + + +cdef enum ResultType: + RESULT_OK = 1 + RESULT_FAILED = 2 + + +cdef enum TransactionStatus: + PQTRANS_IDLE = 0 # connection idle + PQTRANS_ACTIVE = 1 # command in progress + PQTRANS_INTRANS = 2 # idle, within transaction block + PQTRANS_INERROR = 3 # idle, within failed transaction + PQTRANS_UNKNOWN = 4 # cannot determine status + + +ctypedef object (*decode_row_method)(object, const char*, ssize_t) + + +cdef class CoreProtocol: + cdef: + ReadBuffer buffer + bint _skip_discard + bint _discard_data + + # executemany support data + object _execute_iter + str _execute_portal_name + str _execute_stmt_name + + ConnectionStatus con_status + ProtocolState state + TransactionStatus xact_status + + str encoding + + object transport + + object address + # Instance of _ConnectionParameters + object con_params + # Instance of SCRAMAuthentication + SCRAMAuthentication scram + # Instance of gssapi.SecurityContext or sspilib.SecurityContext + object gss_ctx + + readonly int32_t backend_pid + readonly int32_t backend_secret + + ## Result + ResultType result_type + object result + bytes result_param_desc + bytes result_row_desc + bytes result_status_msg + + # True - completed, False - suspended + bint result_execute_completed + + cpdef is_in_transaction(self) + cdef _process__auth(self, char mtype) + cdef _process__prepare(self, char mtype) + cdef _process__bind_execute(self, char mtype) + cdef _process__bind_execute_many(self, char mtype) + cdef _process__close_stmt_portal(self, char mtype) + cdef _process__simple_query(self, char mtype) + cdef _process__bind(self, char mtype) + cdef _process__copy_out(self, char mtype) + cdef _process__copy_out_data(self, char mtype) + cdef _process__copy_in(self, char mtype) + cdef _process__copy_in_data(self, char mtype) + + cdef _parse_msg_authentication(self) + cdef _parse_msg_parameter_status(self) + cdef _parse_msg_notification(self) + cdef _parse_msg_backend_key_data(self) + cdef _parse_msg_ready_for_query(self) + cdef _parse_data_msgs(self) + cdef _parse_copy_data_msgs(self) + cdef _parse_msg_error_response(self, is_error) + cdef _parse_msg_command_complete(self) + + cdef _write_copy_data_msg(self, object data) + cdef _write_copy_done_msg(self) + cdef _write_copy_fail_msg(self, str cause) + + cdef _auth_password_message_cleartext(self) + cdef _auth_password_message_md5(self, bytes salt) + cdef _auth_password_message_sasl_initial(self, list sasl_auth_methods) + cdef _auth_password_message_sasl_continue(self, bytes server_response) + cdef _auth_gss_init_gssapi(self) + cdef _auth_gss_init_sspi(self, bint negotiate) + cdef _auth_gss_get_service(self) + cdef _auth_gss_step(self, bytes server_response) + + cdef _write(self, buf) + cdef _writelines(self, list buffers) + + cdef _read_server_messages(self) + + cdef _push_result(self) + cdef _reset_result(self) + cdef _set_state(self, ProtocolState new_state) + + cdef _ensure_connected(self) + + cdef WriteBuffer _build_parse_message(self, str stmt_name, str query) + cdef WriteBuffer _build_bind_message(self, str portal_name, + str stmt_name, + WriteBuffer bind_data) + cdef WriteBuffer _build_empty_bind_data(self) + cdef WriteBuffer _build_execute_message(self, str portal_name, + int32_t limit) + + + cdef _connect(self) + cdef _prepare_and_describe(self, str stmt_name, str query) + cdef _send_parse_message(self, str stmt_name, str query) + cdef _send_bind_message(self, str portal_name, str stmt_name, + WriteBuffer bind_data, int32_t limit) + cdef _bind_execute(self, str portal_name, str stmt_name, + WriteBuffer bind_data, int32_t limit) + cdef bint _bind_execute_many(self, str portal_name, str stmt_name, + object bind_data, bint return_rows) + cdef bint _bind_execute_many_more(self, bint first=*) + cdef _bind_execute_many_fail(self, object error, bint first=*) + cdef _bind(self, str portal_name, str stmt_name, + WriteBuffer bind_data) + cdef _execute(self, str portal_name, int32_t limit) + cdef _close(self, str name, bint is_portal) + cdef _simple_query(self, str query) + cdef _copy_out(self, str copy_stmt) + cdef _copy_in(self, str copy_stmt) + cdef _terminate(self) + + cdef _decode_row(self, const char* buf, ssize_t buf_len) + + cdef _on_result(self) + cdef _on_notification(self, pid, channel, payload) + cdef _on_notice(self, parsed) + cdef _set_server_parameter(self, name, val) + cdef _on_connection_lost(self, exc) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/coreproto.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/coreproto.pyx new file mode 100755 index 0000000..da96c41 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/coreproto.pyx @@ -0,0 +1,1233 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +import hashlib + + +include "scram.pyx" + + +AUTH_METHOD_NAME = { + AUTH_REQUIRED_KERBEROS: 'kerberosv5', + AUTH_REQUIRED_PASSWORD: 'password', + AUTH_REQUIRED_PASSWORDMD5: 'md5', + AUTH_REQUIRED_GSS: 'gss', + AUTH_REQUIRED_SASL: 'scram-sha-256', + AUTH_REQUIRED_SSPI: 'sspi', +} + + +cdef class CoreProtocol: + + def __init__(self, addr, con_params): + self.address = addr + # type of `con_params` is `_ConnectionParameters` + self.buffer = ReadBuffer() + self.user = con_params.user + self.password = con_params.password + self.auth_msg = None + self.con_params = con_params + self.con_status = CONNECTION_BAD + self.state = PROTOCOL_IDLE + self.xact_status = PQTRANS_IDLE + self.encoding = 'utf-8' + # type of `scram` is `SCRAMAuthentcation` + self.scram = None + # type of `gss_ctx` is `gssapi.SecurityContext` or + # `sspilib.SecurityContext` + self.gss_ctx = None + + self._reset_result() + + cpdef is_in_transaction(self): + # PQTRANS_INTRANS = idle, within transaction block + # PQTRANS_INERROR = idle, within failed transaction + return self.xact_status in (PQTRANS_INTRANS, PQTRANS_INERROR) + + cdef _read_server_messages(self): + cdef: + char mtype + ProtocolState state + pgproto.take_message_method take_message = \ + self.buffer.take_message + pgproto.get_message_type_method get_message_type= \ + self.buffer.get_message_type + + while take_message(self.buffer) == 1: + mtype = get_message_type(self.buffer) + state = self.state + + try: + if mtype == b'S': + # ParameterStatus + self._parse_msg_parameter_status() + + elif mtype == b'A': + # NotificationResponse + self._parse_msg_notification() + + elif mtype == b'N': + # 'N' - NoticeResponse + self._on_notice(self._parse_msg_error_response(False)) + + elif state == PROTOCOL_AUTH: + self._process__auth(mtype) + + elif state == PROTOCOL_PREPARE: + self._process__prepare(mtype) + + elif state == PROTOCOL_BIND_EXECUTE: + self._process__bind_execute(mtype) + + elif state == PROTOCOL_BIND_EXECUTE_MANY: + self._process__bind_execute_many(mtype) + + elif state == PROTOCOL_EXECUTE: + self._process__bind_execute(mtype) + + elif state == PROTOCOL_BIND: + self._process__bind(mtype) + + elif state == PROTOCOL_CLOSE_STMT_PORTAL: + self._process__close_stmt_portal(mtype) + + elif state == PROTOCOL_SIMPLE_QUERY: + self._process__simple_query(mtype) + + elif state == PROTOCOL_COPY_OUT: + self._process__copy_out(mtype) + + elif (state == PROTOCOL_COPY_OUT_DATA or + state == PROTOCOL_COPY_OUT_DONE): + self._process__copy_out_data(mtype) + + elif state == PROTOCOL_COPY_IN: + self._process__copy_in(mtype) + + elif state == PROTOCOL_COPY_IN_DATA: + self._process__copy_in_data(mtype) + + elif state == PROTOCOL_CANCELLED: + # discard all messages until the sync message + if mtype == b'E': + self._parse_msg_error_response(True) + elif mtype == b'Z': + self._parse_msg_ready_for_query() + self._push_result() + else: + self.buffer.discard_message() + + elif state == PROTOCOL_ERROR_CONSUME: + # Error in protocol (on asyncpg side); + # discard all messages until sync message + + if mtype == b'Z': + # Sync point, self to push the result + if self.result_type != RESULT_FAILED: + self.result_type = RESULT_FAILED + self.result = apg_exc.InternalClientError( + 'unknown error in protocol implementation') + + self._parse_msg_ready_for_query() + self._push_result() + + else: + self.buffer.discard_message() + + elif state == PROTOCOL_TERMINATING: + # The connection is being terminated. + # discard all messages until connection + # termination. + self.buffer.discard_message() + + else: + raise apg_exc.InternalClientError( + f'cannot process message {chr(mtype)!r}: ' + f'protocol is in an unexpected state {state!r}.') + + except Exception as ex: + self.result_type = RESULT_FAILED + self.result = ex + + if mtype == b'Z': + self._push_result() + else: + self.state = PROTOCOL_ERROR_CONSUME + + finally: + self.buffer.finish_message() + + cdef _process__auth(self, char mtype): + if mtype == b'R': + # Authentication... + try: + self._parse_msg_authentication() + except Exception as ex: + # Exception in authentication parsing code + # is usually either malformed authentication data + # or missing support for cryptographic primitives + # in the hashlib module. + self.result_type = RESULT_FAILED + self.result = apg_exc.InternalClientError( + f"unexpected error while performing authentication: {ex}") + self.result.__cause__ = ex + self.con_status = CONNECTION_BAD + self._push_result() + else: + if self.result_type != RESULT_OK: + self.con_status = CONNECTION_BAD + self._push_result() + + elif self.auth_msg is not None: + # Server wants us to send auth data, so do that. + self._write(self.auth_msg) + self.auth_msg = None + + elif mtype == b'K': + # BackendKeyData + self._parse_msg_backend_key_data() + + elif mtype == b'E': + # ErrorResponse + self.con_status = CONNECTION_BAD + self._parse_msg_error_response(True) + self._push_result() + + elif mtype == b'Z': + # ReadyForQuery + self._parse_msg_ready_for_query() + self.con_status = CONNECTION_OK + self._push_result() + + cdef _process__prepare(self, char mtype): + if mtype == b't': + # Parameters description + self.result_param_desc = self.buffer.consume_message() + + elif mtype == b'1': + # ParseComplete + self.buffer.discard_message() + + elif mtype == b'T': + # Row description + self.result_row_desc = self.buffer.consume_message() + self._push_result() + + elif mtype == b'E': + # ErrorResponse + self._parse_msg_error_response(True) + # we don't send a sync during the parse/describe sequence + # but send a FLUSH instead. If an error happens we need to + # send a SYNC explicitly in order to mark the end of the transaction. + # this effectively clears the error and we then wait until we get a + # ready for new query message + self._write(SYNC_MESSAGE) + self.state = PROTOCOL_ERROR_CONSUME + + elif mtype == b'n': + # NoData + self.buffer.discard_message() + self._push_result() + + cdef _process__bind_execute(self, char mtype): + if mtype == b'D': + # DataRow + self._parse_data_msgs() + + elif mtype == b's': + # PortalSuspended + self.buffer.discard_message() + + elif mtype == b'C': + # CommandComplete + self.result_execute_completed = True + self._parse_msg_command_complete() + + elif mtype == b'E': + # ErrorResponse + self._parse_msg_error_response(True) + + elif mtype == b'1': + # ParseComplete, in case `_bind_execute()` is reparsing + self.buffer.discard_message() + + elif mtype == b'2': + # BindComplete + self.buffer.discard_message() + + elif mtype == b'Z': + # ReadyForQuery + self._parse_msg_ready_for_query() + self._push_result() + + elif mtype == b'I': + # EmptyQueryResponse + self.buffer.discard_message() + + cdef _process__bind_execute_many(self, char mtype): + cdef WriteBuffer buf + + if mtype == b'D': + # DataRow + self._parse_data_msgs() + + elif mtype == b's': + # PortalSuspended + self.buffer.discard_message() + + elif mtype == b'C': + # CommandComplete + self._parse_msg_command_complete() + + elif mtype == b'E': + # ErrorResponse + self._parse_msg_error_response(True) + + elif mtype == b'1': + # ParseComplete, in case `_bind_execute_many()` is reparsing + self.buffer.discard_message() + + elif mtype == b'2': + # BindComplete + self.buffer.discard_message() + + elif mtype == b'Z': + # ReadyForQuery + self._parse_msg_ready_for_query() + self._push_result() + + elif mtype == b'I': + # EmptyQueryResponse + self.buffer.discard_message() + + elif mtype == b'1': + # ParseComplete + self.buffer.discard_message() + + cdef _process__bind(self, char mtype): + if mtype == b'E': + # ErrorResponse + self._parse_msg_error_response(True) + + elif mtype == b'2': + # BindComplete + self.buffer.discard_message() + + elif mtype == b'Z': + # ReadyForQuery + self._parse_msg_ready_for_query() + self._push_result() + + cdef _process__close_stmt_portal(self, char mtype): + if mtype == b'E': + # ErrorResponse + self._parse_msg_error_response(True) + + elif mtype == b'3': + # CloseComplete + self.buffer.discard_message() + + elif mtype == b'Z': + # ReadyForQuery + self._parse_msg_ready_for_query() + self._push_result() + + cdef _process__simple_query(self, char mtype): + if mtype in {b'D', b'I', b'T'}: + # 'D' - DataRow + # 'I' - EmptyQueryResponse + # 'T' - RowDescription + self.buffer.discard_message() + + elif mtype == b'E': + # ErrorResponse + self._parse_msg_error_response(True) + + elif mtype == b'Z': + # ReadyForQuery + self._parse_msg_ready_for_query() + self._push_result() + + elif mtype == b'C': + # CommandComplete + self._parse_msg_command_complete() + + else: + # We don't really care about COPY IN etc + self.buffer.discard_message() + + cdef _process__copy_out(self, char mtype): + if mtype == b'E': + self._parse_msg_error_response(True) + + elif mtype == b'H': + # CopyOutResponse + self._set_state(PROTOCOL_COPY_OUT_DATA) + self.buffer.discard_message() + + elif mtype == b'Z': + # ReadyForQuery + self._parse_msg_ready_for_query() + self._push_result() + + cdef _process__copy_out_data(self, char mtype): + if mtype == b'E': + self._parse_msg_error_response(True) + + elif mtype == b'd': + # CopyData + self._parse_copy_data_msgs() + + elif mtype == b'c': + # CopyDone + self.buffer.discard_message() + self._set_state(PROTOCOL_COPY_OUT_DONE) + + elif mtype == b'C': + # CommandComplete + self._parse_msg_command_complete() + + elif mtype == b'Z': + # ReadyForQuery + self._parse_msg_ready_for_query() + self._push_result() + + cdef _process__copy_in(self, char mtype): + if mtype == b'E': + self._parse_msg_error_response(True) + + elif mtype == b'G': + # CopyInResponse + self._set_state(PROTOCOL_COPY_IN_DATA) + self.buffer.discard_message() + + elif mtype == b'Z': + # ReadyForQuery + self._parse_msg_ready_for_query() + self._push_result() + + cdef _process__copy_in_data(self, char mtype): + if mtype == b'E': + self._parse_msg_error_response(True) + + elif mtype == b'C': + # CommandComplete + self._parse_msg_command_complete() + + elif mtype == b'Z': + # ReadyForQuery + self._parse_msg_ready_for_query() + self._push_result() + + cdef _parse_msg_command_complete(self): + cdef: + const char* cbuf + ssize_t cbuf_len + + cbuf = self.buffer.try_consume_message(&cbuf_len) + if cbuf != NULL and cbuf_len > 0: + msg = cpython.PyBytes_FromStringAndSize(cbuf, cbuf_len - 1) + else: + msg = self.buffer.read_null_str() + self.result_status_msg = msg + + cdef _parse_copy_data_msgs(self): + cdef: + ReadBuffer buf = self.buffer + + self.result = buf.consume_messages(b'd') + + # By this point we have consumed all CopyData messages + # in the inbound buffer. If there are no messages left + # in the buffer, we need to push the accumulated data + # out to the caller in anticipation of the new CopyData + # batch. If there _are_ non-CopyData messages left, + # we must not push the result here and let the + # _process__copy_out_data subprotocol do the job. + if not buf.take_message(): + self._on_result() + self.result = None + else: + # If there is a message in the buffer, put it back to + # be processed by the next protocol iteration. + buf.put_message() + + cdef _write_copy_data_msg(self, object data): + cdef: + WriteBuffer buf + object mview + Py_buffer *pybuf + + mview = cpythonx.PyMemoryView_GetContiguous( + data, cpython.PyBUF_READ, b'C') + + try: + pybuf = cpythonx.PyMemoryView_GET_BUFFER(mview) + + buf = WriteBuffer.new_message(b'd') + buf.write_cstr(pybuf.buf, pybuf.len) + buf.end_message() + finally: + mview.release() + + self._write(buf) + + cdef _write_copy_done_msg(self): + cdef: + WriteBuffer buf + + buf = WriteBuffer.new_message(b'c') + buf.end_message() + self._write(buf) + + cdef _write_copy_fail_msg(self, str cause): + cdef: + WriteBuffer buf + + buf = WriteBuffer.new_message(b'f') + buf.write_str(cause or '', self.encoding) + buf.end_message() + self._write(buf) + + cdef _parse_data_msgs(self): + cdef: + ReadBuffer buf = self.buffer + list rows + + decode_row_method decoder = self._decode_row + pgproto.try_consume_message_method try_consume_message = \ + buf.try_consume_message + pgproto.take_message_type_method take_message_type = \ + buf.take_message_type + + const char* cbuf + ssize_t cbuf_len + object row + bytes mem + + if PG_DEBUG: + if buf.get_message_type() != b'D': + raise apg_exc.InternalClientError( + '_parse_data_msgs: first message is not "D"') + + if self._discard_data: + while take_message_type(buf, b'D'): + buf.discard_message() + return + + if PG_DEBUG: + if type(self.result) is not list: + raise apg_exc.InternalClientError( + '_parse_data_msgs: result is not a list, but {!r}'. + format(self.result)) + + rows = self.result + while take_message_type(buf, b'D'): + cbuf = try_consume_message(buf, &cbuf_len) + if cbuf != NULL: + row = decoder(self, cbuf, cbuf_len) + else: + mem = buf.consume_message() + row = decoder( + self, + cpython.PyBytes_AS_STRING(mem), + cpython.PyBytes_GET_SIZE(mem)) + + cpython.PyList_Append(rows, row) + + cdef _parse_msg_backend_key_data(self): + self.backend_pid = self.buffer.read_int32() + self.backend_secret = self.buffer.read_int32() + + cdef _parse_msg_parameter_status(self): + name = self.buffer.read_null_str() + name = name.decode(self.encoding) + + val = self.buffer.read_null_str() + val = val.decode(self.encoding) + + self._set_server_parameter(name, val) + + cdef _parse_msg_notification(self): + pid = self.buffer.read_int32() + channel = self.buffer.read_null_str().decode(self.encoding) + payload = self.buffer.read_null_str().decode(self.encoding) + self._on_notification(pid, channel, payload) + + cdef _parse_msg_authentication(self): + cdef: + int32_t status + bytes md5_salt + list sasl_auth_methods + list unsupported_sasl_auth_methods + + status = self.buffer.read_int32() + + if status == AUTH_SUCCESSFUL: + # AuthenticationOk + self.result_type = RESULT_OK + + elif status == AUTH_REQUIRED_PASSWORD: + # AuthenticationCleartextPassword + self.result_type = RESULT_OK + self.auth_msg = self._auth_password_message_cleartext() + + elif status == AUTH_REQUIRED_PASSWORDMD5: + # AuthenticationMD5Password + # Note: MD5 salt is passed as a four-byte sequence + md5_salt = self.buffer.read_bytes(4) + self.auth_msg = self._auth_password_message_md5(md5_salt) + + elif status == AUTH_REQUIRED_SASL: + # AuthenticationSASL + # This requires making additional requests to the server in order + # to follow the SCRAM protocol defined in RFC 5802. + # get the SASL authentication methods that the server is providing + sasl_auth_methods = [] + unsupported_sasl_auth_methods = [] + # determine if the advertised authentication methods are supported, + # and if so, add them to the list + auth_method = self.buffer.read_null_str() + while auth_method: + if auth_method in SCRAMAuthentication.AUTHENTICATION_METHODS: + sasl_auth_methods.append(auth_method) + else: + unsupported_sasl_auth_methods.append(auth_method) + auth_method = self.buffer.read_null_str() + + # if none of the advertised authentication methods are supported, + # raise an error + # otherwise, initialize the SASL authentication exchange + if not sasl_auth_methods: + unsupported_sasl_auth_methods = [m.decode("ascii") + for m in unsupported_sasl_auth_methods] + self.result_type = RESULT_FAILED + self.result = apg_exc.InterfaceError( + 'unsupported SASL Authentication methods requested by the ' + 'server: {!r}'.format( + ", ".join(unsupported_sasl_auth_methods))) + else: + self.auth_msg = self._auth_password_message_sasl_initial( + sasl_auth_methods) + + elif status == AUTH_SASL_CONTINUE: + # AUTH_SASL_CONTINUE + # this requeires sending the second part of the SASL exchange, where + # the client parses information back from the server and determines + # if this is valid. + # The client builds a challenge response to the server + server_response = self.buffer.consume_message() + self.auth_msg = self._auth_password_message_sasl_continue( + server_response) + + elif status == AUTH_SASL_FINAL: + # AUTH_SASL_FINAL + server_response = self.buffer.consume_message() + if not self.scram.verify_server_final_message(server_response): + self.result_type = RESULT_FAILED + self.result = apg_exc.InterfaceError( + 'could not verify server signature for ' + 'SCRAM authentciation: scram-sha-256', + ) + self.scram = None + + elif status in (AUTH_REQUIRED_GSS, AUTH_REQUIRED_SSPI): + # AUTH_REQUIRED_SSPI is the same as AUTH_REQUIRED_GSS, except that + # it uses protocol negotiation with SSPI clients. Both methods use + # AUTH_REQUIRED_GSS_CONTINUE for subsequent authentication steps. + if self.gss_ctx is not None: + self.result_type = RESULT_FAILED + self.result = apg_exc.InterfaceError( + 'duplicate GSSAPI/SSPI authentication request') + else: + if self.con_params.gsslib == 'gssapi': + self._auth_gss_init_gssapi() + else: + self._auth_gss_init_sspi(status == AUTH_REQUIRED_SSPI) + self.auth_msg = self._auth_gss_step(None) + + elif status == AUTH_REQUIRED_GSS_CONTINUE: + server_response = self.buffer.consume_message() + self.auth_msg = self._auth_gss_step(server_response) + + else: + self.result_type = RESULT_FAILED + self.result = apg_exc.InterfaceError( + 'unsupported authentication method requested by the ' + 'server: {!r}'.format(AUTH_METHOD_NAME.get(status, status))) + + if status not in (AUTH_SASL_CONTINUE, AUTH_SASL_FINAL, + AUTH_REQUIRED_GSS_CONTINUE): + self.buffer.discard_message() + + cdef _auth_password_message_cleartext(self): + cdef: + WriteBuffer msg + + msg = WriteBuffer.new_message(b'p') + msg.write_bytestring(self.password.encode(self.encoding)) + msg.end_message() + + return msg + + cdef _auth_password_message_md5(self, bytes salt): + cdef: + WriteBuffer msg + + msg = WriteBuffer.new_message(b'p') + + # 'md5' + md5(md5(password + username) + salt)) + userpass = (self.password or '') + (self.user or '') + md5_1 = hashlib.md5(userpass.encode(self.encoding)).hexdigest() + md5_2 = hashlib.md5(md5_1.encode('ascii') + salt).hexdigest() + + msg.write_bytestring(b'md5' + md5_2.encode('ascii')) + msg.end_message() + + return msg + + cdef _auth_password_message_sasl_initial(self, list sasl_auth_methods): + cdef: + WriteBuffer msg + + # use the first supported advertized mechanism + self.scram = SCRAMAuthentication(sasl_auth_methods[0]) + # this involves a call and response with the server + msg = WriteBuffer.new_message(b'p') + msg.write_bytes(self.scram.create_client_first_message(self.user or '')) + msg.end_message() + + return msg + + cdef _auth_password_message_sasl_continue(self, bytes server_response): + cdef: + WriteBuffer msg + + # determine if there is a valid server response + self.scram.parse_server_first_message(server_response) + # this involves a call and response with the server + msg = WriteBuffer.new_message(b'p') + client_final_message = self.scram.create_client_final_message( + self.password or '') + msg.write_bytes(client_final_message) + msg.end_message() + + return msg + + cdef _auth_gss_init_gssapi(self): + try: + import gssapi + except ModuleNotFoundError: + raise apg_exc.InterfaceError( + 'gssapi module not found; please install asyncpg[gssauth] to ' + 'use asyncpg with Kerberos/GSSAPI/SSPI authentication' + ) from None + + service_name, host = self._auth_gss_get_service() + self.gss_ctx = gssapi.SecurityContext( + name=gssapi.Name( + f'{service_name}@{host}', gssapi.NameType.hostbased_service), + usage='initiate') + + cdef _auth_gss_init_sspi(self, bint negotiate): + try: + import sspilib + except ModuleNotFoundError: + raise apg_exc.InterfaceError( + 'sspilib module not found; please install asyncpg[gssauth] to ' + 'use asyncpg with Kerberos/GSSAPI/SSPI authentication' + ) from None + + service_name, host = self._auth_gss_get_service() + self.gss_ctx = sspilib.ClientSecurityContext( + target_name=f'{service_name}/{host}', + credential=sspilib.UserCredential( + protocol='Negotiate' if negotiate else 'Kerberos')) + + cdef _auth_gss_get_service(self): + service_name = self.con_params.krbsrvname or 'postgres' + if isinstance(self.address, str): + raise apg_exc.InternalClientError( + 'GSSAPI/SSPI authentication is only supported for TCP/IP ' + 'connections') + + return service_name, self.address[0] + + cdef _auth_gss_step(self, bytes server_response): + cdef: + WriteBuffer msg + + token = self.gss_ctx.step(server_response) + if not token: + self.gss_ctx = None + return None + msg = WriteBuffer.new_message(b'p') + msg.write_bytes(token) + msg.end_message() + + return msg + + cdef _parse_msg_ready_for_query(self): + cdef char status = self.buffer.read_byte() + + if status == b'I': + self.xact_status = PQTRANS_IDLE + elif status == b'T': + self.xact_status = PQTRANS_INTRANS + elif status == b'E': + self.xact_status = PQTRANS_INERROR + else: + self.xact_status = PQTRANS_UNKNOWN + + cdef _parse_msg_error_response(self, is_error): + cdef: + char code + bytes message + dict parsed = {} + + while True: + code = self.buffer.read_byte() + if code == 0: + break + + message = self.buffer.read_null_str() + + parsed[chr(code)] = message.decode() + + if is_error: + self.result_type = RESULT_FAILED + self.result = parsed + else: + return parsed + + cdef _push_result(self): + try: + self._on_result() + finally: + self._set_state(PROTOCOL_IDLE) + self._reset_result() + + cdef _reset_result(self): + self.result_type = RESULT_OK + self.result = None + self.result_param_desc = None + self.result_row_desc = None + self.result_status_msg = None + self.result_execute_completed = False + self._discard_data = False + + # executemany support data + self._execute_iter = None + self._execute_portal_name = None + self._execute_stmt_name = None + + cdef _set_state(self, ProtocolState new_state): + if new_state == PROTOCOL_IDLE: + if self.state == PROTOCOL_FAILED: + raise apg_exc.InternalClientError( + 'cannot switch to "idle" state; ' + 'protocol is in the "failed" state') + elif self.state == PROTOCOL_IDLE: + pass + else: + self.state = new_state + + elif new_state == PROTOCOL_FAILED: + self.state = PROTOCOL_FAILED + + elif new_state == PROTOCOL_CANCELLED: + self.state = PROTOCOL_CANCELLED + + elif new_state == PROTOCOL_TERMINATING: + self.state = PROTOCOL_TERMINATING + + else: + if self.state == PROTOCOL_IDLE: + self.state = new_state + + elif (self.state == PROTOCOL_COPY_OUT and + new_state == PROTOCOL_COPY_OUT_DATA): + self.state = new_state + + elif (self.state == PROTOCOL_COPY_OUT_DATA and + new_state == PROTOCOL_COPY_OUT_DONE): + self.state = new_state + + elif (self.state == PROTOCOL_COPY_IN and + new_state == PROTOCOL_COPY_IN_DATA): + self.state = new_state + + elif self.state == PROTOCOL_FAILED: + raise apg_exc.InternalClientError( + 'cannot switch to state {}; ' + 'protocol is in the "failed" state'.format(new_state)) + else: + raise apg_exc.InternalClientError( + 'cannot switch to state {}; ' + 'another operation ({}) is in progress'.format( + new_state, self.state)) + + cdef _ensure_connected(self): + if self.con_status != CONNECTION_OK: + raise apg_exc.InternalClientError('not connected') + + cdef WriteBuffer _build_parse_message(self, str stmt_name, str query): + cdef WriteBuffer buf + + buf = WriteBuffer.new_message(b'P') + buf.write_str(stmt_name, self.encoding) + buf.write_str(query, self.encoding) + buf.write_int16(0) + + buf.end_message() + return buf + + cdef WriteBuffer _build_bind_message(self, str portal_name, + str stmt_name, + WriteBuffer bind_data): + cdef WriteBuffer buf + + buf = WriteBuffer.new_message(b'B') + buf.write_str(portal_name, self.encoding) + buf.write_str(stmt_name, self.encoding) + + # Arguments + buf.write_buffer(bind_data) + + buf.end_message() + return buf + + cdef WriteBuffer _build_empty_bind_data(self): + cdef WriteBuffer buf + buf = WriteBuffer.new() + buf.write_int16(0) # The number of parameter format codes + buf.write_int16(0) # The number of parameter values + buf.write_int16(0) # The number of result-column format codes + return buf + + cdef WriteBuffer _build_execute_message(self, str portal_name, + int32_t limit): + cdef WriteBuffer buf + + buf = WriteBuffer.new_message(b'E') + buf.write_str(portal_name, self.encoding) # name of the portal + buf.write_int32(limit) # number of rows to return; 0 - all + + buf.end_message() + return buf + + # API for subclasses + + cdef _connect(self): + cdef: + WriteBuffer buf + WriteBuffer outbuf + + if self.con_status != CONNECTION_BAD: + raise apg_exc.InternalClientError('already connected') + + self._set_state(PROTOCOL_AUTH) + self.con_status = CONNECTION_STARTED + + # Assemble a startup message + buf = WriteBuffer() + + # protocol version + buf.write_int16(3) + buf.write_int16(0) + + buf.write_bytestring(b'client_encoding') + buf.write_bytestring("'{}'".format(self.encoding).encode('ascii')) + + buf.write_str('user', self.encoding) + buf.write_str(self.con_params.user, self.encoding) + + buf.write_str('database', self.encoding) + buf.write_str(self.con_params.database, self.encoding) + + if self.con_params.server_settings is not None: + for k, v in self.con_params.server_settings.items(): + buf.write_str(k, self.encoding) + buf.write_str(v, self.encoding) + + buf.write_bytestring(b'') + + # Send the buffer + outbuf = WriteBuffer() + outbuf.write_int32(buf.len() + 4) + outbuf.write_buffer(buf) + self._write(outbuf) + + cdef _send_parse_message(self, str stmt_name, str query): + cdef: + WriteBuffer msg + + self._ensure_connected() + msg = self._build_parse_message(stmt_name, query) + self._write(msg) + + cdef _prepare_and_describe(self, str stmt_name, str query): + cdef: + WriteBuffer packet + WriteBuffer buf + + self._ensure_connected() + self._set_state(PROTOCOL_PREPARE) + + packet = self._build_parse_message(stmt_name, query) + + buf = WriteBuffer.new_message(b'D') + buf.write_byte(b'S') + buf.write_str(stmt_name, self.encoding) + buf.end_message() + packet.write_buffer(buf) + + packet.write_bytes(FLUSH_MESSAGE) + + self._write(packet) + + cdef _send_bind_message(self, str portal_name, str stmt_name, + WriteBuffer bind_data, int32_t limit): + + cdef: + WriteBuffer packet + WriteBuffer buf + + buf = self._build_bind_message(portal_name, stmt_name, bind_data) + packet = buf + + buf = self._build_execute_message(portal_name, limit) + packet.write_buffer(buf) + + packet.write_bytes(SYNC_MESSAGE) + + self._write(packet) + + cdef _bind_execute(self, str portal_name, str stmt_name, + WriteBuffer bind_data, int32_t limit): + + cdef WriteBuffer buf + + self._ensure_connected() + self._set_state(PROTOCOL_BIND_EXECUTE) + + self.result = [] + + self._send_bind_message(portal_name, stmt_name, bind_data, limit) + + cdef bint _bind_execute_many(self, str portal_name, str stmt_name, + object bind_data, bint return_rows): + self._ensure_connected() + self._set_state(PROTOCOL_BIND_EXECUTE_MANY) + + self.result = [] if return_rows else None + self._discard_data = not return_rows + self._execute_iter = bind_data + self._execute_portal_name = portal_name + self._execute_stmt_name = stmt_name + return self._bind_execute_many_more(True) + + cdef bint _bind_execute_many_more(self, bint first=False): + cdef: + WriteBuffer packet + WriteBuffer buf + list buffers = [] + + # as we keep sending, the server may return an error early + if self.result_type == RESULT_FAILED: + self._write(SYNC_MESSAGE) + return False + + # collect up to four 32KB buffers to send + # https://github.com/MagicStack/asyncpg/pull/289#issuecomment-391215051 + while len(buffers) < _EXECUTE_MANY_BUF_NUM: + packet = WriteBuffer.new() + + # fill one 32KB buffer + while packet.len() < _EXECUTE_MANY_BUF_SIZE: + try: + # grab one item from the input + buf = next(self._execute_iter) + + # reached the end of the input + except StopIteration: + if first: + # if we never send anything, simply set the result + self._push_result() + else: + # otherwise, append SYNC and send the buffers + packet.write_bytes(SYNC_MESSAGE) + buffers.append(memoryview(packet)) + self._writelines(buffers) + return False + + # error in input, give up the buffers and cleanup + except Exception as ex: + self._bind_execute_many_fail(ex, first) + return False + + # all good, write to the buffer + first = False + packet.write_buffer( + self._build_bind_message( + self._execute_portal_name, + self._execute_stmt_name, + buf, + ) + ) + packet.write_buffer( + self._build_execute_message(self._execute_portal_name, 0, + ) + ) + + # collected one buffer + buffers.append(memoryview(packet)) + + # write to the wire, and signal the caller for more to send + self._writelines(buffers) + return True + + cdef _bind_execute_many_fail(self, object error, bint first=False): + cdef WriteBuffer buf + + self.result_type = RESULT_FAILED + self.result = error + if first: + self._push_result() + elif self.is_in_transaction(): + # we're in an explicit transaction, just SYNC + self._write(SYNC_MESSAGE) + else: + # In an implicit transaction, if `ignore_till_sync` is set, + # `ROLLBACK` will be ignored and `Sync` will restore the state; + # or the transaction will be rolled back with a warning saying + # that there was no transaction, but rollback is done anyway, + # so we could safely ignore this warning. + # GOTCHA: cannot use simple query message here, because it is + # ignored if `ignore_till_sync` is set. + buf = self._build_parse_message('', 'ROLLBACK') + buf.write_buffer(self._build_bind_message( + '', '', self._build_empty_bind_data())) + buf.write_buffer(self._build_execute_message('', 0)) + buf.write_bytes(SYNC_MESSAGE) + self._write(buf) + + cdef _execute(self, str portal_name, int32_t limit): + cdef WriteBuffer buf + + self._ensure_connected() + self._set_state(PROTOCOL_EXECUTE) + + self.result = [] + + buf = self._build_execute_message(portal_name, limit) + + buf.write_bytes(SYNC_MESSAGE) + + self._write(buf) + + cdef _bind(self, str portal_name, str stmt_name, + WriteBuffer bind_data): + + cdef WriteBuffer buf + + self._ensure_connected() + self._set_state(PROTOCOL_BIND) + + buf = self._build_bind_message(portal_name, stmt_name, bind_data) + + buf.write_bytes(SYNC_MESSAGE) + + self._write(buf) + + cdef _close(self, str name, bint is_portal): + cdef WriteBuffer buf + + self._ensure_connected() + self._set_state(PROTOCOL_CLOSE_STMT_PORTAL) + + buf = WriteBuffer.new_message(b'C') + + if is_portal: + buf.write_byte(b'P') + else: + buf.write_byte(b'S') + + buf.write_str(name, self.encoding) + buf.end_message() + + buf.write_bytes(SYNC_MESSAGE) + + self._write(buf) + + cdef _simple_query(self, str query): + cdef WriteBuffer buf + self._ensure_connected() + self._set_state(PROTOCOL_SIMPLE_QUERY) + buf = WriteBuffer.new_message(b'Q') + buf.write_str(query, self.encoding) + buf.end_message() + self._write(buf) + + cdef _copy_out(self, str copy_stmt): + cdef WriteBuffer buf + + self._ensure_connected() + self._set_state(PROTOCOL_COPY_OUT) + + # Send the COPY .. TO STDOUT using the SimpleQuery protocol. + buf = WriteBuffer.new_message(b'Q') + buf.write_str(copy_stmt, self.encoding) + buf.end_message() + self._write(buf) + + cdef _copy_in(self, str copy_stmt): + cdef WriteBuffer buf + + self._ensure_connected() + self._set_state(PROTOCOL_COPY_IN) + + buf = WriteBuffer.new_message(b'Q') + buf.write_str(copy_stmt, self.encoding) + buf.end_message() + self._write(buf) + + cdef _terminate(self): + cdef WriteBuffer buf + self._ensure_connected() + self._set_state(PROTOCOL_TERMINATING) + buf = WriteBuffer.new_message(b'X') + buf.end_message() + self._write(buf) + + cdef _write(self, buf): + raise NotImplementedError + + cdef _writelines(self, list buffers): + raise NotImplementedError + + cdef _decode_row(self, const char* buf, ssize_t buf_len): + pass + + cdef _set_server_parameter(self, name, val): + pass + + cdef _on_result(self): + pass + + cdef _on_notice(self, parsed): + pass + + cdef _on_notification(self, pid, channel, payload): + pass + + cdef _on_connection_lost(self, exc): + pass + + +SYNC_MESSAGE = bytes(WriteBuffer.new_message(b'S').end_message()) +FLUSH_MESSAGE = bytes(WriteBuffer.new_message(b'H').end_message()) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/cpythonx.pxd b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/cpythonx.pxd new file mode 100755 index 0000000..1c72988 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/cpythonx.pxd @@ -0,0 +1,19 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cdef extern from "Python.h": + int PyByteArray_Check(object) + + int PyMemoryView_Check(object) + Py_buffer *PyMemoryView_GET_BUFFER(object) + object PyMemoryView_GetContiguous(object, int buffertype, char order) + + Py_UCS4* PyUnicode_AsUCS4Copy(object) except NULL + object PyUnicode_FromKindAndData( + int kind, const void *buffer, Py_ssize_t size) + + int PyUnicode_4BYTE_KIND diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/encodings.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/encodings.pyx new file mode 100755 index 0000000..1463dbe --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/encodings.pyx @@ -0,0 +1,63 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +'''Map PostgreSQL encoding names to Python encoding names + +https://www.postgresql.org/docs/current/static/multibyte.html#CHARSET-TABLE +''' + +ENCODINGS_MAP = { + 'abc': 'cp1258', + 'alt': 'cp866', + 'euc_cn': 'euccn', + 'euc_jp': 'eucjp', + 'euc_kr': 'euckr', + 'koi8r': 'koi8_r', + 'koi8u': 'koi8_u', + 'shift_jis_2004': 'euc_jis_2004', + 'sjis': 'shift_jis', + 'sql_ascii': 'ascii', + 'vscii': 'cp1258', + 'tcvn': 'cp1258', + 'tcvn5712': 'cp1258', + 'unicode': 'utf_8', + 'win': 'cp1521', + 'win1250': 'cp1250', + 'win1251': 'cp1251', + 'win1252': 'cp1252', + 'win1253': 'cp1253', + 'win1254': 'cp1254', + 'win1255': 'cp1255', + 'win1256': 'cp1256', + 'win1257': 'cp1257', + 'win1258': 'cp1258', + 'win866': 'cp866', + 'win874': 'cp874', + 'win932': 'cp932', + 'win936': 'cp936', + 'win949': 'cp949', + 'win950': 'cp950', + 'windows1250': 'cp1250', + 'windows1251': 'cp1251', + 'windows1252': 'cp1252', + 'windows1253': 'cp1253', + 'windows1254': 'cp1254', + 'windows1255': 'cp1255', + 'windows1256': 'cp1256', + 'windows1257': 'cp1257', + 'windows1258': 'cp1258', + 'windows866': 'cp866', + 'windows874': 'cp874', + 'windows932': 'cp932', + 'windows936': 'cp936', + 'windows949': 'cp949', + 'windows950': 'cp950', +} + + +cdef get_python_encoding(pg_encoding): + return ENCODINGS_MAP.get(pg_encoding.lower(), pg_encoding.lower()) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/pgtypes.pxi b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/pgtypes.pxi new file mode 100755 index 0000000..86f8e66 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/pgtypes.pxi @@ -0,0 +1,266 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +# GENERATED FROM pg_catalog.pg_type +# DO NOT MODIFY, use tools/generate_type_map.py to update + +DEF INVALIDOID = 0 +DEF MAXBUILTINOID = 9999 +DEF MAXSUPPORTEDOID = 5080 + +DEF BOOLOID = 16 +DEF BYTEAOID = 17 +DEF CHAROID = 18 +DEF NAMEOID = 19 +DEF INT8OID = 20 +DEF INT2OID = 21 +DEF INT4OID = 23 +DEF REGPROCOID = 24 +DEF TEXTOID = 25 +DEF OIDOID = 26 +DEF TIDOID = 27 +DEF XIDOID = 28 +DEF CIDOID = 29 +DEF PG_DDL_COMMANDOID = 32 +DEF JSONOID = 114 +DEF XMLOID = 142 +DEF PG_NODE_TREEOID = 194 +DEF SMGROID = 210 +DEF TABLE_AM_HANDLEROID = 269 +DEF INDEX_AM_HANDLEROID = 325 +DEF POINTOID = 600 +DEF LSEGOID = 601 +DEF PATHOID = 602 +DEF BOXOID = 603 +DEF POLYGONOID = 604 +DEF LINEOID = 628 +DEF CIDROID = 650 +DEF FLOAT4OID = 700 +DEF FLOAT8OID = 701 +DEF ABSTIMEOID = 702 +DEF RELTIMEOID = 703 +DEF TINTERVALOID = 704 +DEF UNKNOWNOID = 705 +DEF CIRCLEOID = 718 +DEF MACADDR8OID = 774 +DEF MONEYOID = 790 +DEF MACADDROID = 829 +DEF INETOID = 869 +DEF _TEXTOID = 1009 +DEF _OIDOID = 1028 +DEF ACLITEMOID = 1033 +DEF BPCHAROID = 1042 +DEF VARCHAROID = 1043 +DEF DATEOID = 1082 +DEF TIMEOID = 1083 +DEF TIMESTAMPOID = 1114 +DEF TIMESTAMPTZOID = 1184 +DEF INTERVALOID = 1186 +DEF TIMETZOID = 1266 +DEF BITOID = 1560 +DEF VARBITOID = 1562 +DEF NUMERICOID = 1700 +DEF REFCURSOROID = 1790 +DEF REGPROCEDUREOID = 2202 +DEF REGOPEROID = 2203 +DEF REGOPERATOROID = 2204 +DEF REGCLASSOID = 2205 +DEF REGTYPEOID = 2206 +DEF RECORDOID = 2249 +DEF CSTRINGOID = 2275 +DEF ANYOID = 2276 +DEF ANYARRAYOID = 2277 +DEF VOIDOID = 2278 +DEF TRIGGEROID = 2279 +DEF LANGUAGE_HANDLEROID = 2280 +DEF INTERNALOID = 2281 +DEF OPAQUEOID = 2282 +DEF ANYELEMENTOID = 2283 +DEF ANYNONARRAYOID = 2776 +DEF UUIDOID = 2950 +DEF TXID_SNAPSHOTOID = 2970 +DEF FDW_HANDLEROID = 3115 +DEF PG_LSNOID = 3220 +DEF TSM_HANDLEROID = 3310 +DEF PG_NDISTINCTOID = 3361 +DEF PG_DEPENDENCIESOID = 3402 +DEF ANYENUMOID = 3500 +DEF TSVECTOROID = 3614 +DEF TSQUERYOID = 3615 +DEF GTSVECTOROID = 3642 +DEF REGCONFIGOID = 3734 +DEF REGDICTIONARYOID = 3769 +DEF JSONBOID = 3802 +DEF ANYRANGEOID = 3831 +DEF EVENT_TRIGGEROID = 3838 +DEF JSONPATHOID = 4072 +DEF REGNAMESPACEOID = 4089 +DEF REGROLEOID = 4096 +DEF REGCOLLATIONOID = 4191 +DEF ANYMULTIRANGEOID = 4537 +DEF ANYCOMPATIBLEMULTIRANGEOID = 4538 +DEF PG_BRIN_BLOOM_SUMMARYOID = 4600 +DEF PG_BRIN_MINMAX_MULTI_SUMMARYOID = 4601 +DEF PG_MCV_LISTOID = 5017 +DEF PG_SNAPSHOTOID = 5038 +DEF XID8OID = 5069 +DEF ANYCOMPATIBLEOID = 5077 +DEF ANYCOMPATIBLEARRAYOID = 5078 +DEF ANYCOMPATIBLENONARRAYOID = 5079 +DEF ANYCOMPATIBLERANGEOID = 5080 + +ARRAY_TYPES = {_TEXTOID, _OIDOID} + +BUILTIN_TYPE_OID_MAP = { + ABSTIMEOID: 'abstime', + ACLITEMOID: 'aclitem', + ANYARRAYOID: 'anyarray', + ANYCOMPATIBLEARRAYOID: 'anycompatiblearray', + ANYCOMPATIBLEMULTIRANGEOID: 'anycompatiblemultirange', + ANYCOMPATIBLENONARRAYOID: 'anycompatiblenonarray', + ANYCOMPATIBLEOID: 'anycompatible', + ANYCOMPATIBLERANGEOID: 'anycompatiblerange', + ANYELEMENTOID: 'anyelement', + ANYENUMOID: 'anyenum', + ANYMULTIRANGEOID: 'anymultirange', + ANYNONARRAYOID: 'anynonarray', + ANYOID: 'any', + ANYRANGEOID: 'anyrange', + BITOID: 'bit', + BOOLOID: 'bool', + BOXOID: 'box', + BPCHAROID: 'bpchar', + BYTEAOID: 'bytea', + CHAROID: 'char', + CIDOID: 'cid', + CIDROID: 'cidr', + CIRCLEOID: 'circle', + CSTRINGOID: 'cstring', + DATEOID: 'date', + EVENT_TRIGGEROID: 'event_trigger', + FDW_HANDLEROID: 'fdw_handler', + FLOAT4OID: 'float4', + FLOAT8OID: 'float8', + GTSVECTOROID: 'gtsvector', + INDEX_AM_HANDLEROID: 'index_am_handler', + INETOID: 'inet', + INT2OID: 'int2', + INT4OID: 'int4', + INT8OID: 'int8', + INTERNALOID: 'internal', + INTERVALOID: 'interval', + JSONBOID: 'jsonb', + JSONOID: 'json', + JSONPATHOID: 'jsonpath', + LANGUAGE_HANDLEROID: 'language_handler', + LINEOID: 'line', + LSEGOID: 'lseg', + MACADDR8OID: 'macaddr8', + MACADDROID: 'macaddr', + MONEYOID: 'money', + NAMEOID: 'name', + NUMERICOID: 'numeric', + OIDOID: 'oid', + OPAQUEOID: 'opaque', + PATHOID: 'path', + PG_BRIN_BLOOM_SUMMARYOID: 'pg_brin_bloom_summary', + PG_BRIN_MINMAX_MULTI_SUMMARYOID: 'pg_brin_minmax_multi_summary', + PG_DDL_COMMANDOID: 'pg_ddl_command', + PG_DEPENDENCIESOID: 'pg_dependencies', + PG_LSNOID: 'pg_lsn', + PG_MCV_LISTOID: 'pg_mcv_list', + PG_NDISTINCTOID: 'pg_ndistinct', + PG_NODE_TREEOID: 'pg_node_tree', + PG_SNAPSHOTOID: 'pg_snapshot', + POINTOID: 'point', + POLYGONOID: 'polygon', + RECORDOID: 'record', + REFCURSOROID: 'refcursor', + REGCLASSOID: 'regclass', + REGCOLLATIONOID: 'regcollation', + REGCONFIGOID: 'regconfig', + REGDICTIONARYOID: 'regdictionary', + REGNAMESPACEOID: 'regnamespace', + REGOPERATOROID: 'regoperator', + REGOPEROID: 'regoper', + REGPROCEDUREOID: 'regprocedure', + REGPROCOID: 'regproc', + REGROLEOID: 'regrole', + REGTYPEOID: 'regtype', + RELTIMEOID: 'reltime', + SMGROID: 'smgr', + TABLE_AM_HANDLEROID: 'table_am_handler', + TEXTOID: 'text', + TIDOID: 'tid', + TIMEOID: 'time', + TIMESTAMPOID: 'timestamp', + TIMESTAMPTZOID: 'timestamptz', + TIMETZOID: 'timetz', + TINTERVALOID: 'tinterval', + TRIGGEROID: 'trigger', + TSM_HANDLEROID: 'tsm_handler', + TSQUERYOID: 'tsquery', + TSVECTOROID: 'tsvector', + TXID_SNAPSHOTOID: 'txid_snapshot', + UNKNOWNOID: 'unknown', + UUIDOID: 'uuid', + VARBITOID: 'varbit', + VARCHAROID: 'varchar', + VOIDOID: 'void', + XID8OID: 'xid8', + XIDOID: 'xid', + XMLOID: 'xml', + _OIDOID: 'oid[]', + _TEXTOID: 'text[]' +} + +BUILTIN_TYPE_NAME_MAP = {v: k for k, v in BUILTIN_TYPE_OID_MAP.items()} + +BUILTIN_TYPE_NAME_MAP['smallint'] = \ + BUILTIN_TYPE_NAME_MAP['int2'] + +BUILTIN_TYPE_NAME_MAP['int'] = \ + BUILTIN_TYPE_NAME_MAP['int4'] + +BUILTIN_TYPE_NAME_MAP['integer'] = \ + BUILTIN_TYPE_NAME_MAP['int4'] + +BUILTIN_TYPE_NAME_MAP['bigint'] = \ + BUILTIN_TYPE_NAME_MAP['int8'] + +BUILTIN_TYPE_NAME_MAP['decimal'] = \ + BUILTIN_TYPE_NAME_MAP['numeric'] + +BUILTIN_TYPE_NAME_MAP['real'] = \ + BUILTIN_TYPE_NAME_MAP['float4'] + +BUILTIN_TYPE_NAME_MAP['double precision'] = \ + BUILTIN_TYPE_NAME_MAP['float8'] + +BUILTIN_TYPE_NAME_MAP['timestamp with timezone'] = \ + BUILTIN_TYPE_NAME_MAP['timestamptz'] + +BUILTIN_TYPE_NAME_MAP['timestamp without timezone'] = \ + BUILTIN_TYPE_NAME_MAP['timestamp'] + +BUILTIN_TYPE_NAME_MAP['time with timezone'] = \ + BUILTIN_TYPE_NAME_MAP['timetz'] + +BUILTIN_TYPE_NAME_MAP['time without timezone'] = \ + BUILTIN_TYPE_NAME_MAP['time'] + +BUILTIN_TYPE_NAME_MAP['char'] = \ + BUILTIN_TYPE_NAME_MAP['bpchar'] + +BUILTIN_TYPE_NAME_MAP['character'] = \ + BUILTIN_TYPE_NAME_MAP['bpchar'] + +BUILTIN_TYPE_NAME_MAP['character varying'] = \ + BUILTIN_TYPE_NAME_MAP['varchar'] + +BUILTIN_TYPE_NAME_MAP['bit varying'] = \ + BUILTIN_TYPE_NAME_MAP['varbit'] diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/prepared_stmt.pxd b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/prepared_stmt.pxd new file mode 100755 index 0000000..369db73 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/prepared_stmt.pxd @@ -0,0 +1,39 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cdef class PreparedStatementState: + cdef: + readonly str name + readonly str query + readonly bint closed + readonly bint prepared + readonly int refs + readonly type record_class + readonly bint ignore_custom_codec + + + list row_desc + list parameters_desc + + ConnectionSettings settings + + int16_t args_num + bint have_text_args + tuple args_codecs + + int16_t cols_num + object cols_desc + bint have_text_cols + tuple rows_codecs + + cdef _encode_bind_msg(self, args, int seqno = ?) + cpdef _init_codecs(self) + cdef _ensure_rows_decoder(self) + cdef _ensure_args_encoder(self) + cdef _set_row_desc(self, object desc) + cdef _set_args_desc(self, object desc) + cdef _decode_row(self, const char* cbuf, ssize_t buf_len) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/prepared_stmt.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/prepared_stmt.pyx new file mode 100755 index 0000000..4145c66 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/prepared_stmt.pyx @@ -0,0 +1,395 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +from asyncpg import exceptions + + +@cython.final +cdef class PreparedStatementState: + + def __cinit__( + self, + str name, + str query, + BaseProtocol protocol, + type record_class, + bint ignore_custom_codec + ): + self.name = name + self.query = query + self.settings = protocol.settings + self.row_desc = self.parameters_desc = None + self.args_codecs = self.rows_codecs = None + self.args_num = self.cols_num = 0 + self.cols_desc = None + self.closed = False + self.prepared = True + self.refs = 0 + self.record_class = record_class + self.ignore_custom_codec = ignore_custom_codec + + def _get_parameters(self): + cdef Codec codec + + result = [] + for oid in self.parameters_desc: + codec = self.settings.get_data_codec(oid) + if codec is None: + raise exceptions.InternalClientError( + 'missing codec information for OID {}'.format(oid)) + result.append(apg_types.Type( + oid, codec.name, codec.kind, codec.schema)) + + return tuple(result) + + def _get_attributes(self): + cdef Codec codec + + if not self.row_desc: + return () + + result = [] + for d in self.row_desc: + name = d[0] + oid = d[3] + + codec = self.settings.get_data_codec(oid) + if codec is None: + raise exceptions.InternalClientError( + 'missing codec information for OID {}'.format(oid)) + + name = name.decode(self.settings._encoding) + + result.append( + apg_types.Attribute(name, + apg_types.Type(oid, codec.name, codec.kind, codec.schema))) + + return tuple(result) + + def _init_types(self): + cdef: + Codec codec + set missing = set() + + if self.parameters_desc: + for p_oid in self.parameters_desc: + codec = self.settings.get_data_codec(p_oid) + if codec is None or not codec.has_encoder(): + missing.add(p_oid) + + if self.row_desc: + for rdesc in self.row_desc: + codec = self.settings.get_data_codec((rdesc[3])) + if codec is None or not codec.has_decoder(): + missing.add(rdesc[3]) + + return missing + + cpdef _init_codecs(self): + self._ensure_args_encoder() + self._ensure_rows_decoder() + + def attach(self): + self.refs += 1 + + def detach(self): + self.refs -= 1 + + def mark_closed(self): + self.closed = True + + def mark_unprepared(self): + if self.name: + raise exceptions.InternalClientError( + "named prepared statements cannot be marked unprepared") + self.prepared = False + + cdef _encode_bind_msg(self, args, int seqno = -1): + cdef: + int idx + WriteBuffer writer + Codec codec + + if not cpython.PySequence_Check(args): + if seqno >= 0: + raise exceptions.DataError( + f'invalid input in executemany() argument sequence ' + f'element #{seqno}: expected a sequence, got ' + f'{type(args).__name__}' + ) + else: + # Non executemany() callers do not pass user input directly, + # so bad input is a bug. + raise exceptions.InternalClientError( + f'Bind: expected a sequence, got {type(args).__name__}') + + if len(args) > 32767: + raise exceptions.InterfaceError( + 'the number of query arguments cannot exceed 32767') + + writer = WriteBuffer.new() + + num_args_passed = len(args) + if self.args_num != num_args_passed: + hint = 'Check the query against the passed list of arguments.' + + if self.args_num == 0: + # If the server was expecting zero arguments, it is likely + # that the user tried to parametrize a statement that does + # not support parameters. + hint += (r' Note that parameters are supported only in' + r' SELECT, INSERT, UPDATE, DELETE, MERGE and VALUES' + r' statements, and will *not* work in statements ' + r' like CREATE VIEW or DECLARE CURSOR.') + + raise exceptions.InterfaceError( + 'the server expects {x} argument{s} for this query, ' + '{y} {w} passed'.format( + x=self.args_num, s='s' if self.args_num != 1 else '', + y=num_args_passed, + w='was' if num_args_passed == 1 else 'were'), + hint=hint) + + if self.have_text_args: + writer.write_int16(self.args_num) + for idx in range(self.args_num): + codec = (self.args_codecs[idx]) + writer.write_int16(codec.format) + else: + # All arguments are in binary format + writer.write_int32(0x00010001) + + writer.write_int16(self.args_num) + + for idx in range(self.args_num): + arg = args[idx] + if arg is None: + writer.write_int32(-1) + else: + codec = (self.args_codecs[idx]) + try: + codec.encode(self.settings, writer, arg) + except (AssertionError, exceptions.InternalClientError): + # These are internal errors and should raise as-is. + raise + except exceptions.InterfaceError as e: + # This is already a descriptive error, but annotate + # with argument name for clarity. + pos = f'${idx + 1}' + if seqno >= 0: + pos = ( + f'{pos} in element #{seqno} of' + f' executemany() sequence' + ) + raise e.with_msg( + f'query argument {pos}: {e.args[0]}' + ) from None + except Exception as e: + # Everything else is assumed to be an encoding error + # due to invalid input. + pos = f'${idx + 1}' + if seqno >= 0: + pos = ( + f'{pos} in element #{seqno} of' + f' executemany() sequence' + ) + value_repr = repr(arg) + if len(value_repr) > 40: + value_repr = value_repr[:40] + '...' + + raise exceptions.DataError( + f'invalid input for query argument' + f' {pos}: {value_repr} ({e})' + ) from e + + if self.have_text_cols: + writer.write_int16(self.cols_num) + for idx in range(self.cols_num): + codec = (self.rows_codecs[idx]) + writer.write_int16(codec.format) + else: + # All columns are in binary format + writer.write_int32(0x00010001) + + return writer + + cdef _ensure_rows_decoder(self): + cdef: + list cols_names + object cols_mapping + tuple row + uint32_t oid + Codec codec + list codecs + + if self.cols_desc is not None: + return + + if self.cols_num == 0: + self.cols_desc = RecordDescriptor({}, ()) + return + + cols_mapping = collections.OrderedDict() + cols_names = [] + codecs = [] + for i from 0 <= i < self.cols_num: + row = self.row_desc[i] + col_name = row[0].decode(self.settings._encoding) + cols_mapping[col_name] = i + cols_names.append(col_name) + oid = row[3] + codec = self.settings.get_data_codec( + oid, ignore_custom_codec=self.ignore_custom_codec) + if codec is None or not codec.has_decoder(): + raise exceptions.InternalClientError( + 'no decoder for OID {}'.format(oid)) + if not codec.is_binary(): + self.have_text_cols = True + + codecs.append(codec) + + self.cols_desc = RecordDescriptor( + cols_mapping, tuple(cols_names)) + + self.rows_codecs = tuple(codecs) + + cdef _ensure_args_encoder(self): + cdef: + uint32_t p_oid + Codec codec + list codecs = [] + + if self.args_num == 0 or self.args_codecs is not None: + return + + for i from 0 <= i < self.args_num: + p_oid = self.parameters_desc[i] + codec = self.settings.get_data_codec( + p_oid, ignore_custom_codec=self.ignore_custom_codec) + if codec is None or not codec.has_encoder(): + raise exceptions.InternalClientError( + 'no encoder for OID {}'.format(p_oid)) + if codec.type not in {}: + self.have_text_args = True + + codecs.append(codec) + + self.args_codecs = tuple(codecs) + + cdef _set_row_desc(self, object desc): + self.row_desc = _decode_row_desc(desc) + self.cols_num = (len(self.row_desc)) + + cdef _set_args_desc(self, object desc): + self.parameters_desc = _decode_parameters_desc(desc) + self.args_num = (len(self.parameters_desc)) + + cdef _decode_row(self, const char* cbuf, ssize_t buf_len): + cdef: + Codec codec + int16_t fnum + int32_t flen + object dec_row + tuple rows_codecs = self.rows_codecs + ConnectionSettings settings = self.settings + int32_t i + FRBuffer rbuf + ssize_t bl + + frb_init(&rbuf, cbuf, buf_len) + + fnum = hton.unpack_int16(frb_read(&rbuf, 2)) + + if fnum != self.cols_num: + raise exceptions.ProtocolError( + 'the number of columns in the result row ({}) is ' + 'different from what was described ({})'.format( + fnum, self.cols_num)) + + dec_row = self.cols_desc.make_record(self.record_class, fnum) + for i in range(fnum): + flen = hton.unpack_int32(frb_read(&rbuf, 4)) + + if flen == -1: + val = None + else: + # Clamp buffer size to that of the reported field length + # to make sure that codecs can rely on read_all() working + # properly. + bl = frb_get_len(&rbuf) + if flen > bl: + frb_check(&rbuf, flen) + frb_set_len(&rbuf, flen) + codec = cpython.PyTuple_GET_ITEM(rows_codecs, i) + val = codec.decode(settings, &rbuf) + if frb_get_len(&rbuf) != 0: + raise BufferError( + 'unexpected trailing {} bytes in buffer'.format( + frb_get_len(&rbuf))) + frb_set_len(&rbuf, bl - flen) + + cpython.Py_INCREF(val) + recordcapi.ApgRecord_SET_ITEM(dec_row, i, val) + + if frb_get_len(&rbuf) != 0: + raise BufferError('unexpected trailing {} bytes in buffer'.format( + frb_get_len(&rbuf))) + + return dec_row + + +cdef _decode_parameters_desc(object desc): + cdef: + ReadBuffer reader + int16_t nparams + uint32_t p_oid + list result = [] + + reader = ReadBuffer.new_message_parser(desc) + nparams = reader.read_int16() + + for i from 0 <= i < nparams: + p_oid = reader.read_int32() + result.append(p_oid) + + return result + + +cdef _decode_row_desc(object desc): + cdef: + ReadBuffer reader + + int16_t nfields + + bytes f_name + uint32_t f_table_oid + int16_t f_column_num + uint32_t f_dt_oid + int16_t f_dt_size + int32_t f_dt_mod + int16_t f_format + + list result + + reader = ReadBuffer.new_message_parser(desc) + nfields = reader.read_int16() + result = [] + + for i from 0 <= i < nfields: + f_name = reader.read_null_str() + f_table_oid = reader.read_int32() + f_column_num = reader.read_int16() + f_dt_oid = reader.read_int32() + f_dt_size = reader.read_int16() + f_dt_mod = reader.read_int32() + f_format = reader.read_int16() + + result.append( + (f_name, f_table_oid, f_column_num, f_dt_oid, + f_dt_size, f_dt_mod, f_format)) + + return result diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/protocol.cpython-312-x86_64-linux-gnu.so b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/protocol.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000..8959ece Binary files /dev/null and b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/protocol.cpython-312-x86_64-linux-gnu.so differ diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/protocol.pxd b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/protocol.pxd new file mode 100755 index 0000000..cd221fb --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/protocol.pxd @@ -0,0 +1,77 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +from libc.stdint cimport int16_t, int32_t, uint16_t, \ + uint32_t, int64_t, uint64_t + +from asyncpg.pgproto.debug cimport PG_DEBUG + +from asyncpg.pgproto.pgproto cimport ( + WriteBuffer, + ReadBuffer, + FRBuffer, +) + +from asyncpg.pgproto cimport pgproto + +include "consts.pxi" +include "pgtypes.pxi" + +include "codecs/base.pxd" +include "settings.pxd" +include "coreproto.pxd" +include "prepared_stmt.pxd" + + +cdef class BaseProtocol(CoreProtocol): + + cdef: + object loop + ConnectionSettings settings + object cancel_sent_waiter + object cancel_waiter + object waiter + bint return_extra + object create_future + object timeout_handle + object conref + type record_class + bint is_reading + + str last_query + + bint writing_paused + bint closing + + readonly uint64_t queries_count + + bint _is_ssl + + PreparedStatementState statement + + cdef get_connection(self) + + cdef _get_timeout_impl(self, timeout) + cdef _check_state(self) + cdef _new_waiter(self, timeout) + cdef _coreproto_error(self) + + cdef _on_result__connect(self, object waiter) + cdef _on_result__prepare(self, object waiter) + cdef _on_result__bind_and_exec(self, object waiter) + cdef _on_result__close_stmt_or_portal(self, object waiter) + cdef _on_result__simple_query(self, object waiter) + cdef _on_result__bind(self, object waiter) + cdef _on_result__copy_out(self, object waiter) + cdef _on_result__copy_in(self, object waiter) + + cdef _handle_waiter_on_connection_lost(self, cause) + + cdef _dispatch_result(self) + + cdef inline resume_reading(self) + cdef inline pause_reading(self) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/protocol.pyi b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/protocol.pyi new file mode 100755 index 0000000..34db644 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/protocol.pyi @@ -0,0 +1,282 @@ +import asyncio +import asyncio.protocols +import hmac +from codecs import CodecInfo +from collections.abc import Callable, Iterable, Sequence +from hashlib import md5, sha256 +from typing import ( + Any, + ClassVar, + Final, + Generic, + Literal, + NewType, + TypeVar, + final, + overload, +) +from typing_extensions import TypeAlias + +import asyncpg.pgproto.pgproto + +from ..connect_utils import _ConnectionParameters +from ..pgproto.pgproto import WriteBuffer +from ..types import Attribute, Type +from .record import Record + +_Record = TypeVar('_Record', bound=Record) +_OtherRecord = TypeVar('_OtherRecord', bound=Record) +_PreparedStatementState = TypeVar( + '_PreparedStatementState', bound=PreparedStatementState[Any] +) + +_NoTimeoutType = NewType('_NoTimeoutType', object) +_TimeoutType: TypeAlias = float | None | _NoTimeoutType + +BUILTIN_TYPE_NAME_MAP: Final[dict[str, int]] +BUILTIN_TYPE_OID_MAP: Final[dict[int, str]] +NO_TIMEOUT: Final[_NoTimeoutType] + +hashlib_md5 = md5 + +@final +class ConnectionSettings(asyncpg.pgproto.pgproto.CodecContext): + __pyx_vtable__: Any + def __init__(self, conn_key: object) -> None: ... + def add_python_codec( + self, + typeoid: int, + typename: str, + typeschema: str, + typeinfos: Iterable[object], + typekind: str, + encoder: Callable[[Any], Any], + decoder: Callable[[Any], Any], + format: object, + ) -> Any: ... + def clear_type_cache(self) -> None: ... + def get_data_codec( + self, oid: int, format: object = ..., ignore_custom_codec: bool = ... + ) -> Any: ... + def get_text_codec(self) -> CodecInfo: ... + def register_data_types(self, types: Iterable[object]) -> None: ... + def remove_python_codec( + self, typeoid: int, typename: str, typeschema: str + ) -> None: ... + def set_builtin_type_codec( + self, + typeoid: int, + typename: str, + typeschema: str, + typekind: str, + alias_to: str, + format: object = ..., + ) -> Any: ... + def __getattr__(self, name: str) -> Any: ... + def __reduce__(self) -> Any: ... + +@final +class PreparedStatementState(Generic[_Record]): + closed: bool + prepared: bool + name: str + query: str + refs: int + record_class: type[_Record] + ignore_custom_codec: bool + __pyx_vtable__: Any + def __init__( + self, + name: str, + query: str, + protocol: BaseProtocol[Any], + record_class: type[_Record], + ignore_custom_codec: bool, + ) -> None: ... + def _get_parameters(self) -> tuple[Type, ...]: ... + def _get_attributes(self) -> tuple[Attribute, ...]: ... + def _init_types(self) -> set[int]: ... + def _init_codecs(self) -> None: ... + def attach(self) -> None: ... + def detach(self) -> None: ... + def mark_closed(self) -> None: ... + def mark_unprepared(self) -> None: ... + def __reduce__(self) -> Any: ... + +class CoreProtocol: + backend_pid: Any + backend_secret: Any + __pyx_vtable__: Any + def __init__(self, addr: object, con_params: _ConnectionParameters) -> None: ... + def is_in_transaction(self) -> bool: ... + def __reduce__(self) -> Any: ... + +class BaseProtocol(CoreProtocol, Generic[_Record]): + queries_count: Any + is_ssl: bool + __pyx_vtable__: Any + def __init__( + self, + addr: object, + connected_fut: object, + con_params: _ConnectionParameters, + record_class: type[_Record], + loop: object, + ) -> None: ... + def set_connection(self, connection: object) -> None: ... + def get_server_pid(self, *args: object, **kwargs: object) -> int: ... + def get_settings(self, *args: object, **kwargs: object) -> ConnectionSettings: ... + def get_record_class(self) -> type[_Record]: ... + def abort(self) -> None: ... + async def bind( + self, + state: PreparedStatementState[_OtherRecord], + args: Sequence[object], + portal_name: str, + timeout: _TimeoutType, + ) -> Any: ... + @overload + async def bind_execute( + self, + state: PreparedStatementState[_OtherRecord], + args: Sequence[object], + portal_name: str, + limit: int, + return_extra: Literal[False], + timeout: _TimeoutType, + ) -> list[_OtherRecord]: ... + @overload + async def bind_execute( + self, + state: PreparedStatementState[_OtherRecord], + args: Sequence[object], + portal_name: str, + limit: int, + return_extra: Literal[True], + timeout: _TimeoutType, + ) -> tuple[list[_OtherRecord], bytes, bool]: ... + @overload + async def bind_execute( + self, + state: PreparedStatementState[_OtherRecord], + args: Sequence[object], + portal_name: str, + limit: int, + return_extra: bool, + timeout: _TimeoutType, + ) -> list[_OtherRecord] | tuple[list[_OtherRecord], bytes, bool]: ... + async def bind_execute_many( + self, + state: PreparedStatementState[_OtherRecord], + args: Iterable[Sequence[object]], + portal_name: str, + timeout: _TimeoutType, + ) -> None: ... + async def close(self, timeout: _TimeoutType) -> None: ... + def _get_timeout(self, timeout: _TimeoutType) -> float | None: ... + def _is_cancelling(self) -> bool: ... + async def _wait_for_cancellation(self) -> None: ... + async def close_statement( + self, state: PreparedStatementState[_OtherRecord], timeout: _TimeoutType + ) -> Any: ... + async def copy_in(self, *args: object, **kwargs: object) -> str: ... + async def copy_out(self, *args: object, **kwargs: object) -> str: ... + async def execute(self, *args: object, **kwargs: object) -> Any: ... + def is_closed(self, *args: object, **kwargs: object) -> Any: ... + def is_connected(self, *args: object, **kwargs: object) -> Any: ... + def data_received(self, data: object) -> None: ... + def connection_made(self, transport: object) -> None: ... + def connection_lost(self, exc: Exception | None) -> None: ... + def pause_writing(self, *args: object, **kwargs: object) -> Any: ... + @overload + async def prepare( + self, + stmt_name: str, + query: str, + timeout: float | None = ..., + *, + state: _PreparedStatementState, + ignore_custom_codec: bool = ..., + record_class: None, + ) -> _PreparedStatementState: ... + @overload + async def prepare( + self, + stmt_name: str, + query: str, + timeout: float | None = ..., + *, + state: None = ..., + ignore_custom_codec: bool = ..., + record_class: type[_OtherRecord], + ) -> PreparedStatementState[_OtherRecord]: ... + async def close_portal(self, portal_name: str, timeout: _TimeoutType) -> None: ... + async def query(self, *args: object, **kwargs: object) -> str: ... + def resume_writing(self, *args: object, **kwargs: object) -> Any: ... + def __reduce__(self) -> Any: ... + +@final +class Codec: + __pyx_vtable__: Any + def __reduce__(self) -> Any: ... + +class DataCodecConfig: + __pyx_vtable__: Any + def __init__(self) -> None: ... + def add_python_codec( + self, + typeoid: int, + typename: str, + typeschema: str, + typekind: str, + typeinfos: Iterable[object], + encoder: Callable[[ConnectionSettings, WriteBuffer, object], object], + decoder: Callable[..., object], + format: object, + xformat: object, + ) -> Any: ... + def add_types(self, types: Iterable[object]) -> Any: ... + def clear_type_cache(self) -> None: ... + def declare_fallback_codec(self, oid: int, name: str, schema: str) -> Codec: ... + def remove_python_codec( + self, typeoid: int, typename: str, typeschema: str + ) -> Any: ... + def set_builtin_type_codec( + self, + typeoid: int, + typename: str, + typeschema: str, + typekind: str, + alias_to: str, + format: object = ..., + ) -> Any: ... + def __reduce__(self) -> Any: ... + +class Protocol(BaseProtocol[_Record], asyncio.protocols.Protocol): ... + +class Timer: + def __init__(self, budget: float | None) -> None: ... + def __enter__(self) -> None: ... + def __exit__(self, et: object, e: object, tb: object) -> None: ... + def get_remaining_budget(self) -> float: ... + def has_budget_greater_than(self, amount: float) -> bool: ... + +@final +class SCRAMAuthentication: + AUTHENTICATION_METHODS: ClassVar[list[str]] + DEFAULT_CLIENT_NONCE_BYTES: ClassVar[int] + DIGEST = sha256 + REQUIREMENTS_CLIENT_FINAL_MESSAGE: ClassVar[list[str]] + REQUIREMENTS_CLIENT_PROOF: ClassVar[list[str]] + SASLPREP_PROHIBITED: ClassVar[tuple[Callable[[str], bool], ...]] + authentication_method: bytes + authorization_message: bytes | None + client_channel_binding: bytes + client_first_message_bare: bytes | None + client_nonce: bytes | None + client_proof: bytes | None + password_salt: bytes | None + password_iterations: int + server_first_message: bytes | None + server_key: hmac.HMAC | None + server_nonce: bytes | None diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/protocol.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/protocol.pyx new file mode 100755 index 0000000..acce4e9 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/protocol.pyx @@ -0,0 +1,1051 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +# cython: language_level=3 + +cimport cython +cimport cpython + +import asyncio +import builtins +import codecs +import collections.abc +import socket +import time +import weakref + +from asyncpg.pgproto.pgproto cimport ( + WriteBuffer, + ReadBuffer, + + FRBuffer, + frb_init, + frb_read, + frb_read_all, + frb_slice_from, + frb_check, + frb_set_len, + frb_get_len, +) + +from asyncpg.pgproto cimport pgproto +from asyncpg.protocol cimport cpythonx +from asyncpg.protocol cimport recordcapi + +from libc.stdint cimport int8_t, uint8_t, int16_t, uint16_t, \ + int32_t, uint32_t, int64_t, uint64_t, \ + INT32_MAX, UINT32_MAX + +from asyncpg.exceptions import _base as apg_exc_base +from asyncpg import compat +from asyncpg import types as apg_types +from asyncpg import exceptions as apg_exc + +from asyncpg.pgproto cimport hton +from asyncpg.protocol.record import Record, RecordDescriptor + + +include "consts.pxi" +include "pgtypes.pxi" + +include "encodings.pyx" +include "settings.pyx" + +include "codecs/base.pyx" +include "codecs/textutils.pyx" + +# register codecs provided by pgproto +include "codecs/pgproto.pyx" + +# nonscalar +include "codecs/array.pyx" +include "codecs/range.pyx" +include "codecs/record.pyx" + +include "coreproto.pyx" +include "prepared_stmt.pyx" + + +NO_TIMEOUT = object() + + +cdef class BaseProtocol(CoreProtocol): + def __init__(self, addr, connected_fut, con_params, record_class: type, loop): + # type of `con_params` is `_ConnectionParameters` + CoreProtocol.__init__(self, addr, con_params) + + self.loop = loop + self.transport = None + self.waiter = connected_fut + self.cancel_waiter = None + self.cancel_sent_waiter = None + + self.settings = ConnectionSettings((addr, con_params.database)) + self.record_class = record_class + + self.statement = None + self.return_extra = False + + self.last_query = None + + self.closing = False + self.is_reading = True + self.writing_allowed = asyncio.Event() + self.writing_allowed.set() + + self.timeout_handle = None + + self.queries_count = 0 + + self._is_ssl = False + + try: + self.create_future = loop.create_future + except AttributeError: + self.create_future = self._create_future_fallback + + def set_connection(self, connection): + self.conref = weakref.ref(connection) + + cdef get_connection(self): + if self.conref is not None: + return self.conref() + else: + return None + + def get_server_pid(self): + return self.backend_pid + + def get_settings(self): + return self.settings + + def get_record_class(self): + return self.record_class + + cdef inline resume_reading(self): + if not self.is_reading: + self.is_reading = True + self.transport.resume_reading() + + cdef inline pause_reading(self): + if self.is_reading: + self.is_reading = False + self.transport.pause_reading() + + async def prepare(self, stmt_name, query, timeout, + *, + PreparedStatementState state=None, + ignore_custom_codec=False, + record_class): + if self.cancel_waiter is not None: + await self.cancel_waiter + if self.cancel_sent_waiter is not None: + await self.cancel_sent_waiter + self.cancel_sent_waiter = None + + self._check_state() + timeout = self._get_timeout_impl(timeout) + + waiter = self._new_waiter(timeout) + try: + self._prepare_and_describe(stmt_name, query) # network op + self.last_query = query + if state is None: + state = PreparedStatementState( + stmt_name, query, self, record_class, ignore_custom_codec) + self.statement = state + except Exception as ex: + waiter.set_exception(ex) + self._coreproto_error() + finally: + return await waiter + + async def bind_execute( + self, + state: PreparedStatementState, + args, + portal_name: str, + limit: int, + return_extra: bool, + timeout, + ): + if self.cancel_waiter is not None: + await self.cancel_waiter + if self.cancel_sent_waiter is not None: + await self.cancel_sent_waiter + self.cancel_sent_waiter = None + + self._check_state() + timeout = self._get_timeout_impl(timeout) + args_buf = state._encode_bind_msg(args) + + waiter = self._new_waiter(timeout) + try: + if not state.prepared: + self._send_parse_message(state.name, state.query) + + self._bind_execute( + portal_name, + state.name, + args_buf, + limit) # network op + + self.last_query = state.query + self.statement = state + self.return_extra = return_extra + self.queries_count += 1 + except Exception as ex: + waiter.set_exception(ex) + self._coreproto_error() + finally: + return await waiter + + async def bind_execute_many( + self, + state: PreparedStatementState, + args, + portal_name: str, + timeout, + return_rows: bool, + ): + if self.cancel_waiter is not None: + await self.cancel_waiter + if self.cancel_sent_waiter is not None: + await self.cancel_sent_waiter + self.cancel_sent_waiter = None + + self._check_state() + timeout = self._get_timeout_impl(timeout) + timer = Timer(timeout) + + # Make sure the argument sequence is encoded lazily with + # this generator expression to keep the memory pressure under + # control. + data_gen = (state._encode_bind_msg(b, i) for i, b in enumerate(args)) + arg_bufs = iter(data_gen) + + waiter = self._new_waiter(timeout) + try: + if not state.prepared: + self._send_parse_message(state.name, state.query) + + more = self._bind_execute_many( + portal_name, + state.name, + arg_bufs, + return_rows) # network op + + self.last_query = state.query + self.statement = state + self.return_extra = False + self.queries_count += 1 + + while more: + with timer: + await compat.wait_for( + self.writing_allowed.wait(), + timeout=timer.get_remaining_budget()) + # On Windows the above event somehow won't allow context + # switch, so forcing one with sleep(0) here + await asyncio.sleep(0) + if not timer.has_budget_greater_than(0): + raise asyncio.TimeoutError + more = self._bind_execute_many_more() # network op + + except asyncio.TimeoutError as e: + self._bind_execute_many_fail(e) # network op + + except Exception as ex: + waiter.set_exception(ex) + self._coreproto_error() + finally: + return await waiter + + async def bind(self, PreparedStatementState state, args, + str portal_name, timeout): + + if self.cancel_waiter is not None: + await self.cancel_waiter + if self.cancel_sent_waiter is not None: + await self.cancel_sent_waiter + self.cancel_sent_waiter = None + + self._check_state() + timeout = self._get_timeout_impl(timeout) + args_buf = state._encode_bind_msg(args) + + waiter = self._new_waiter(timeout) + try: + self._bind( + portal_name, + state.name, + args_buf) # network op + + self.last_query = state.query + self.statement = state + except Exception as ex: + waiter.set_exception(ex) + self._coreproto_error() + finally: + return await waiter + + async def execute(self, PreparedStatementState state, + str portal_name, int limit, return_extra, + timeout): + + if self.cancel_waiter is not None: + await self.cancel_waiter + if self.cancel_sent_waiter is not None: + await self.cancel_sent_waiter + self.cancel_sent_waiter = None + + self._check_state() + timeout = self._get_timeout_impl(timeout) + + waiter = self._new_waiter(timeout) + try: + self._execute( + portal_name, + limit) # network op + + self.last_query = state.query + self.statement = state + self.return_extra = return_extra + self.queries_count += 1 + except Exception as ex: + waiter.set_exception(ex) + self._coreproto_error() + finally: + return await waiter + + async def close_portal(self, str portal_name, timeout): + + if self.cancel_waiter is not None: + await self.cancel_waiter + if self.cancel_sent_waiter is not None: + await self.cancel_sent_waiter + self.cancel_sent_waiter = None + + self._check_state() + timeout = self._get_timeout_impl(timeout) + + waiter = self._new_waiter(timeout) + try: + self._close( + portal_name, + True) # network op + except Exception as ex: + waiter.set_exception(ex) + self._coreproto_error() + finally: + return await waiter + + async def query(self, query, timeout): + if self.cancel_waiter is not None: + await self.cancel_waiter + if self.cancel_sent_waiter is not None: + await self.cancel_sent_waiter + self.cancel_sent_waiter = None + + self._check_state() + # query() needs to call _get_timeout instead of _get_timeout_impl + # for consistent validation, as it is called differently from + # prepare/bind/execute methods. + timeout = self._get_timeout(timeout) + + waiter = self._new_waiter(timeout) + try: + self._simple_query(query) # network op + self.last_query = query + self.queries_count += 1 + except Exception as ex: + waiter.set_exception(ex) + self._coreproto_error() + finally: + return await waiter + + async def copy_out(self, copy_stmt, sink, timeout): + if self.cancel_waiter is not None: + await self.cancel_waiter + if self.cancel_sent_waiter is not None: + await self.cancel_sent_waiter + self.cancel_sent_waiter = None + + self._check_state() + + timeout = self._get_timeout_impl(timeout) + timer = Timer(timeout) + + # The copy operation is guarded by a single timeout + # on the top level. + waiter = self._new_waiter(timer.get_remaining_budget()) + + self._copy_out(copy_stmt) + + try: + while True: + self.resume_reading() + + with timer: + buffer, done, status_msg = await waiter + + # buffer will be empty if CopyDone was received apart from + # the last CopyData message. + if buffer: + try: + with timer: + await compat.wait_for( + sink(buffer), + timeout=timer.get_remaining_budget()) + except (Exception, asyncio.CancelledError) as ex: + # Abort the COPY operation on any error in + # output sink. + self._request_cancel() + # Make asyncio shut up about unretrieved + # QueryCanceledError + waiter.add_done_callback(lambda f: f.exception()) + raise + + # done will be True upon receipt of CopyDone. + if done: + break + + waiter = self._new_waiter(timer.get_remaining_budget()) + + finally: + self.resume_reading() + + return status_msg + + async def copy_in(self, copy_stmt, reader, data, + records, PreparedStatementState record_stmt, timeout): + cdef: + WriteBuffer wbuf + ssize_t num_cols + Codec codec + + if self.cancel_waiter is not None: + await self.cancel_waiter + if self.cancel_sent_waiter is not None: + await self.cancel_sent_waiter + self.cancel_sent_waiter = None + + self._check_state() + + timeout = self._get_timeout_impl(timeout) + timer = Timer(timeout) + + waiter = self._new_waiter(timer.get_remaining_budget()) + + # Initiate COPY IN. + self._copy_in(copy_stmt) + + try: + if record_stmt is not None: + # copy_in_records in binary mode + wbuf = WriteBuffer.new() + # Signature + wbuf.write_bytes(_COPY_SIGNATURE) + # Flags field + wbuf.write_int32(0) + # No header extension + wbuf.write_int32(0) + + record_stmt._ensure_rows_decoder() + codecs = record_stmt.rows_codecs + num_cols = len(codecs) + settings = self.settings + + for codec in codecs: + if (not codec.has_encoder() or + codec.format != PG_FORMAT_BINARY): + raise apg_exc.InternalClientError( + 'no binary format encoder for ' + 'type {} (OID {})'.format(codec.name, codec.oid)) + + if isinstance(records, collections.abc.AsyncIterable): + async for row in records: + # Tuple header + wbuf.write_int16(num_cols) + # Tuple data + for i in range(num_cols): + item = row[i] + if item is None: + wbuf.write_int32(-1) + else: + codec = cpython.PyTuple_GET_ITEM( + codecs, i) + codec.encode(settings, wbuf, item) + + if wbuf.len() >= _COPY_BUFFER_SIZE: + with timer: + await self.writing_allowed.wait() + self._write_copy_data_msg(wbuf) + wbuf = WriteBuffer.new() + else: + for row in records: + # Tuple header + wbuf.write_int16(num_cols) + # Tuple data + for i in range(num_cols): + item = row[i] + if item is None: + wbuf.write_int32(-1) + else: + codec = cpython.PyTuple_GET_ITEM( + codecs, i) + codec.encode(settings, wbuf, item) + + if wbuf.len() >= _COPY_BUFFER_SIZE: + with timer: + await self.writing_allowed.wait() + self._write_copy_data_msg(wbuf) + wbuf = WriteBuffer.new() + + # End of binary copy. + wbuf.write_int16(-1) + self._write_copy_data_msg(wbuf) + + elif reader is not None: + try: + aiter = reader.__aiter__ + except AttributeError: + raise TypeError('reader is not an asynchronous iterable') + else: + iterator = aiter() + + try: + while True: + # We rely on protocol flow control to moderate the + # rate of data messages. + with timer: + await self.writing_allowed.wait() + with timer: + chunk = await compat.wait_for( + iterator.__anext__(), + timeout=timer.get_remaining_budget()) + self._write_copy_data_msg(chunk) + except builtins.StopAsyncIteration: + pass + else: + # Buffer passed in directly. + await self.writing_allowed.wait() + self._write_copy_data_msg(data) + + except asyncio.TimeoutError: + self._write_copy_fail_msg('TimeoutError') + self._on_timeout(self.waiter) + try: + await waiter + except TimeoutError: + raise + else: + raise apg_exc.InternalClientError('TimoutError was not raised') + + except (Exception, asyncio.CancelledError) as e: + self._write_copy_fail_msg(str(e)) + self._request_cancel() + # Make asyncio shut up about unretrieved QueryCanceledError + waiter.add_done_callback(lambda f: f.exception()) + raise + + self._write_copy_done_msg() + + status_msg = await waiter + + return status_msg + + async def close_statement(self, PreparedStatementState state, timeout): + if self.cancel_waiter is not None: + await self.cancel_waiter + if self.cancel_sent_waiter is not None: + await self.cancel_sent_waiter + self.cancel_sent_waiter = None + + self._check_state() + + if state.refs != 0: + raise apg_exc.InternalClientError( + 'cannot close prepared statement; refs == {} != 0'.format( + state.refs)) + + timeout = self._get_timeout_impl(timeout) + waiter = self._new_waiter(timeout) + try: + self._close(state.name, False) # network op + state.closed = True + except Exception as ex: + waiter.set_exception(ex) + self._coreproto_error() + finally: + return await waiter + + def is_closed(self): + return self.closing + + def is_connected(self): + return not self.closing and self.con_status == CONNECTION_OK + + def abort(self): + if self.closing: + return + self.closing = True + self._handle_waiter_on_connection_lost(None) + self._terminate() + self.transport.abort() + self.transport = None + + async def close(self, timeout): + if self.closing: + return + + self.closing = True + + if self.cancel_sent_waiter is not None: + await self.cancel_sent_waiter + self.cancel_sent_waiter = None + + if self.cancel_waiter is not None: + await self.cancel_waiter + + if self.waiter is not None: + # If there is a query running, cancel it + self._request_cancel() + await self.cancel_sent_waiter + self.cancel_sent_waiter = None + if self.cancel_waiter is not None: + await self.cancel_waiter + + assert self.waiter is None + + timeout = self._get_timeout_impl(timeout) + + # Ask the server to terminate the connection and wait for it + # to drop. + self.waiter = self._new_waiter(timeout) + self._terminate() + try: + await self.waiter + except ConnectionResetError: + # There appears to be a difference in behaviour of asyncio + # in Windows, where, instead of calling protocol.connection_lost() + # a ConnectionResetError will be thrown into the task. + pass + finally: + self.waiter = None + self.transport.abort() + + def _request_cancel(self): + self.cancel_waiter = self.create_future() + self.cancel_sent_waiter = self.create_future() + + con = self.get_connection() + if con is not None: + # if 'con' is None it means that the connection object has been + # garbage collected and that the transport will soon be aborted. + con._cancel_current_command(self.cancel_sent_waiter) + else: + self.loop.call_exception_handler({ + 'message': 'asyncpg.Protocol has no reference to its ' + 'Connection object and yet a cancellation ' + 'was requested. Please report this at ' + 'github.com/magicstack/asyncpg.' + }) + self.abort() + + if self.state == PROTOCOL_PREPARE: + # we need to send a SYNC to server if we cancel during the PREPARE phase + # because the PREPARE sequence does not send a SYNC itself. + # we cannot send this extra SYNC if we are not in PREPARE phase, + # because then we would issue two SYNCs and we would get two ReadyForQuery + # replies, which our current state machine implementation cannot handle + self._write(SYNC_MESSAGE) + self._set_state(PROTOCOL_CANCELLED) + + def _on_timeout(self, fut): + if self.waiter is not fut or fut.done() or \ + self.cancel_waiter is not None or \ + self.timeout_handle is None: + return + self._request_cancel() + self.waiter.set_exception(asyncio.TimeoutError()) + + def _on_waiter_completed(self, fut): + if self.timeout_handle: + self.timeout_handle.cancel() + self.timeout_handle = None + if fut is not self.waiter or self.cancel_waiter is not None: + return + if fut.cancelled(): + self._request_cancel() + + def _create_future_fallback(self): + return asyncio.Future(loop=self.loop) + + cdef _handle_waiter_on_connection_lost(self, cause): + if self.waiter is not None and not self.waiter.done(): + exc = apg_exc.ConnectionDoesNotExistError( + 'connection was closed in the middle of ' + 'operation') + if cause is not None: + exc.__cause__ = cause + self.waiter.set_exception(exc) + self.waiter = None + + cdef _set_server_parameter(self, name, val): + self.settings.add_setting(name, val) + + def _get_timeout(self, timeout): + if timeout is not None: + try: + if type(timeout) is bool: + raise ValueError + timeout = float(timeout) + except ValueError: + raise ValueError( + 'invalid timeout value: expected non-negative float ' + '(got {!r})'.format(timeout)) from None + + return self._get_timeout_impl(timeout) + + cdef inline _get_timeout_impl(self, timeout): + if timeout is None: + timeout = self.get_connection()._config.command_timeout + elif timeout is NO_TIMEOUT: + timeout = None + else: + timeout = float(timeout) + + if timeout is not None and timeout <= 0: + raise asyncio.TimeoutError() + return timeout + + cdef _check_state(self): + if self.cancel_waiter is not None: + raise apg_exc.InterfaceError( + 'cannot perform operation: another operation is cancelling') + if self.closing: + raise apg_exc.InterfaceError( + 'cannot perform operation: connection is closed') + if self.waiter is not None or self.timeout_handle is not None: + raise apg_exc.InterfaceError( + 'cannot perform operation: another operation is in progress') + + def _is_cancelling(self): + return ( + self.cancel_waiter is not None or + self.cancel_sent_waiter is not None + ) + + async def _wait_for_cancellation(self): + if self.cancel_sent_waiter is not None: + await self.cancel_sent_waiter + self.cancel_sent_waiter = None + if self.cancel_waiter is not None: + await self.cancel_waiter + + cdef _coreproto_error(self): + try: + if self.waiter is not None: + if not self.waiter.done(): + raise apg_exc.InternalClientError( + 'waiter is not done while handling critical ' + 'protocol error') + self.waiter = None + finally: + self.abort() + + cdef _new_waiter(self, timeout): + if self.waiter is not None: + raise apg_exc.InterfaceError( + 'cannot perform operation: another operation is in progress') + self.waiter = self.create_future() + if timeout is not None: + self.timeout_handle = self.loop.call_later( + timeout, self._on_timeout, self.waiter) + self.waiter.add_done_callback(self._on_waiter_completed) + return self.waiter + + cdef _on_result__connect(self, object waiter): + waiter.set_result(True) + + cdef _on_result__prepare(self, object waiter): + if PG_DEBUG: + if self.statement is None: + raise apg_exc.InternalClientError( + '_on_result__prepare: statement is None') + + if self.result_param_desc is not None: + self.statement._set_args_desc(self.result_param_desc) + if self.result_row_desc is not None: + self.statement._set_row_desc(self.result_row_desc) + waiter.set_result(self.statement) + + cdef _on_result__bind_and_exec(self, object waiter): + if self.return_extra: + waiter.set_result(( + self.result, + self.result_status_msg, + self.result_execute_completed)) + else: + waiter.set_result(self.result) + + cdef _on_result__bind(self, object waiter): + waiter.set_result(self.result) + + cdef _on_result__close_stmt_or_portal(self, object waiter): + waiter.set_result(self.result) + + cdef _on_result__simple_query(self, object waiter): + waiter.set_result(self.result_status_msg.decode(self.encoding)) + + cdef _on_result__copy_out(self, object waiter): + cdef bint copy_done = self.state == PROTOCOL_COPY_OUT_DONE + if copy_done: + status_msg = self.result_status_msg.decode(self.encoding) + else: + status_msg = None + + # We need to put some backpressure on Postgres + # here in case the sink is slow to process the output. + self.pause_reading() + + waiter.set_result((self.result, copy_done, status_msg)) + + cdef _on_result__copy_in(self, object waiter): + status_msg = self.result_status_msg.decode(self.encoding) + waiter.set_result(status_msg) + + cdef _decode_row(self, const char* buf, ssize_t buf_len): + if PG_DEBUG: + if self.statement is None: + raise apg_exc.InternalClientError( + '_decode_row: statement is None') + + return self.statement._decode_row(buf, buf_len) + + cdef _dispatch_result(self): + waiter = self.waiter + self.waiter = None + + if PG_DEBUG: + if waiter is None: + raise apg_exc.InternalClientError('_on_result: waiter is None') + + if waiter.cancelled(): + return + + if waiter.done(): + raise apg_exc.InternalClientError('_on_result: waiter is done') + + if self.result_type == RESULT_FAILED: + if isinstance(self.result, dict): + exc = apg_exc_base.PostgresError.new( + self.result, query=self.last_query) + else: + exc = self.result + waiter.set_exception(exc) + return + + try: + if self.state == PROTOCOL_AUTH: + self._on_result__connect(waiter) + + elif self.state == PROTOCOL_PREPARE: + self._on_result__prepare(waiter) + + elif self.state == PROTOCOL_BIND_EXECUTE: + self._on_result__bind_and_exec(waiter) + + elif self.state == PROTOCOL_BIND_EXECUTE_MANY: + self._on_result__bind_and_exec(waiter) + + elif self.state == PROTOCOL_EXECUTE: + self._on_result__bind_and_exec(waiter) + + elif self.state == PROTOCOL_BIND: + self._on_result__bind(waiter) + + elif self.state == PROTOCOL_CLOSE_STMT_PORTAL: + self._on_result__close_stmt_or_portal(waiter) + + elif self.state == PROTOCOL_SIMPLE_QUERY: + self._on_result__simple_query(waiter) + + elif (self.state == PROTOCOL_COPY_OUT_DATA or + self.state == PROTOCOL_COPY_OUT_DONE): + self._on_result__copy_out(waiter) + + elif self.state == PROTOCOL_COPY_IN_DATA: + self._on_result__copy_in(waiter) + + elif self.state == PROTOCOL_TERMINATING: + # We are waiting for the connection to drop, so + # ignore any stray results at this point. + pass + + else: + raise apg_exc.InternalClientError( + 'got result for unknown protocol state {}'. + format(self.state)) + + except Exception as exc: + waiter.set_exception(exc) + + cdef _on_result(self): + if self.timeout_handle is not None: + self.timeout_handle.cancel() + self.timeout_handle = None + + if self.cancel_waiter is not None: + # We have received the result of a cancelled command. + if not self.cancel_waiter.done(): + # The cancellation future might have been cancelled + # by the cancellation of the entire task running the query. + self.cancel_waiter.set_result(None) + self.cancel_waiter = None + if self.waiter is not None and self.waiter.done(): + self.waiter = None + if self.waiter is None: + return + + try: + self._dispatch_result() + finally: + self.statement = None + self.last_query = None + self.return_extra = False + + cdef _on_notice(self, parsed): + con = self.get_connection() + if con is not None: + con._process_log_message(parsed, self.last_query) + + cdef _on_notification(self, pid, channel, payload): + con = self.get_connection() + if con is not None: + con._process_notification(pid, channel, payload) + + cdef _on_connection_lost(self, exc): + if self.closing: + # The connection was lost because + # Protocol.close() was called + if self.waiter is not None and not self.waiter.done(): + if exc is None: + self.waiter.set_result(None) + else: + self.waiter.set_exception(exc) + self.waiter = None + else: + # The connection was lost because it was + # terminated or due to another error; + # Throw an error in any awaiting waiter. + self.closing = True + # Cleanup the connection resources, including, possibly, + # releasing the pool holder. + con = self.get_connection() + if con is not None: + con._cleanup() + self._handle_waiter_on_connection_lost(exc) + + cdef _write(self, buf): + self.transport.write(memoryview(buf)) + + cdef _writelines(self, list buffers): + self.transport.writelines(buffers) + + # asyncio callbacks: + + def data_received(self, data): + self.buffer.feed_data(data) + self._read_server_messages() + + def connection_made(self, transport): + self.transport = transport + + sock = transport.get_extra_info('socket') + if (sock is not None and + (not hasattr(socket, 'AF_UNIX') + or sock.family != socket.AF_UNIX)): + sock.setsockopt(socket.IPPROTO_TCP, + socket.TCP_NODELAY, 1) + + try: + self._connect() + except Exception as ex: + transport.abort() + self.con_status = CONNECTION_BAD + self._set_state(PROTOCOL_FAILED) + self._on_error(ex) + + def connection_lost(self, exc): + self.con_status = CONNECTION_BAD + self._set_state(PROTOCOL_FAILED) + self._on_connection_lost(exc) + + def pause_writing(self): + self.writing_allowed.clear() + + def resume_writing(self): + self.writing_allowed.set() + + @property + def is_ssl(self): + return self._is_ssl + + @is_ssl.setter + def is_ssl(self, value): + self._is_ssl = value + + +class Timer: + def __init__(self, budget): + self._budget = budget + self._started = 0 + + def __enter__(self): + if self._budget is not None: + self._started = time.monotonic() + + def __exit__(self, et, e, tb): + if self._budget is not None: + self._budget -= time.monotonic() - self._started + + def get_remaining_budget(self): + return self._budget + + def has_budget_greater_than(self, amount): + if self._budget is None: + # Unlimited budget. + return True + else: + return self._budget > amount + + +class Protocol(BaseProtocol, asyncio.Protocol): + pass + + +def _create_record(object mapping, tuple elems): + # Exposed only for testing purposes. + + cdef: + object rec + int32_t i + + if mapping is None: + desc = RecordDescriptor({}, ()) + else: + desc = RecordDescriptor( + mapping, tuple(mapping) if mapping else ()) + + rec = desc.make_record(Record, len(elems)) + for i in range(len(elems)): + elem = elems[i] + cpython.Py_INCREF(elem) + recordcapi.ApgRecord_SET_ITEM(rec, i, elem) + return rec diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/record.cpython-312-x86_64-linux-gnu.so b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/record.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000..18c0f70 Binary files /dev/null and b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/record.cpython-312-x86_64-linux-gnu.so differ diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/record.pyi b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/record.pyi new file mode 100755 index 0000000..308f310 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/record.pyi @@ -0,0 +1,29 @@ +from typing import ( + Any, + TypeVar, + overload, +) + +from collections.abc import Iterator + + +_T = TypeVar("_T") + + +class Record: + @overload + def get(self, key: str) -> Any | None: ... + @overload + def get(self, key: str, default: _T) -> Any | _T: ... + def items(self) -> Iterator[tuple[str, Any]]: ... + def keys(self) -> Iterator[str]: ... + def values(self) -> Iterator[Any]: ... + @overload + def __getitem__(self, index: str) -> Any: ... + @overload + def __getitem__(self, index: int) -> Any: ... + @overload + def __getitem__(self, index: slice) -> tuple[Any, ...]: ... + def __iter__(self) -> Iterator[Any]: ... + def __contains__(self, x: object) -> bool: ... + def __len__(self) -> int: ... diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/recordcapi.pxd b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/recordcapi.pxd new file mode 100755 index 0000000..e52798f --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/recordcapi.pxd @@ -0,0 +1,14 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cimport cpython + + +cdef extern from "record/recordobj.h": + + void ApgRecord_SET_ITEM(object, int, object) + object RecordDescriptor(object, object) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/scram.pxd b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/scram.pxd new file mode 100755 index 0000000..5421429 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/scram.pxd @@ -0,0 +1,31 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cdef class SCRAMAuthentication: + cdef: + readonly bytes authentication_method + readonly bytes authorization_message + readonly bytes client_channel_binding + readonly bytes client_first_message_bare + readonly bytes client_nonce + readonly bytes client_proof + readonly bytes password_salt + readonly int password_iterations + readonly bytes server_first_message + # server_key is an instance of hmac.HAMC + readonly object server_key + readonly bytes server_nonce + + cdef create_client_first_message(self, str username) + cdef create_client_final_message(self, str password) + cdef parse_server_first_message(self, bytes server_response) + cdef verify_server_final_message(self, bytes server_final_message) + cdef _bytes_xor(self, bytes a, bytes b) + cdef _generate_client_nonce(self, int num_bytes) + cdef _generate_client_proof(self, str password) + cdef _generate_salted_password(self, str password, bytes salt, int iterations) + cdef _normalize_password(self, str original_password) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/scram.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/scram.pyx new file mode 100755 index 0000000..9b485ae --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/scram.pyx @@ -0,0 +1,341 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +import base64 +import hashlib +import hmac +import re +import secrets +import stringprep +import unicodedata + + +@cython.final +cdef class SCRAMAuthentication: + """Contains the protocol for generating and a SCRAM hashed password. + + Since PostgreSQL 10, the option to hash passwords using the SCRAM-SHA-256 + method was added. This module follows the defined protocol, which can be + referenced from here: + + https://www.postgresql.org/docs/current/sasl-authentication.html#SASL-SCRAM-SHA-256 + + libpq references the following RFCs that it uses for implementation: + + * RFC 5802 + * RFC 5803 + * RFC 7677 + + The protocol works as such: + + - A client connets to the server. The server requests the client to begin + SASL authentication using SCRAM and presents a client with the methods it + supports. At present, those are SCRAM-SHA-256, and, on servers that are + built with OpenSSL and + are PG11+, SCRAM-SHA-256-PLUS (which supports channel binding, more on that + below) + + - The client sends a "first message" to the server, where it chooses which + method to authenticate with, and sends, along with the method, an indication + of channel binding (we disable for now), a nonce, and the username. + (Technically, PostgreSQL ignores the username as it already has it from the + initical connection, but we add it for completeness) + + - The server responds with a "first message" in which it extends the nonce, + as well as a password salt and the number of iterations to hash the password + with. The client validates that the new nonce contains the first part of the + client's original nonce + + - The client generates a salted password, but does not sent this up to the + server. Instead, the client follows the SCRAM algorithm (RFC5802) to + generate a proof. This proof is sent aspart of a client "final message" to + the server for it to validate. + + - The server validates the proof. If it is valid, the server sends a + verification code for the client to verify that the server came to the same + proof the client did. PostgreSQL immediately sends an AuthenticationOK + response right after a valid negotiation. If the password the client + provided was invalid, then authentication fails. + + (The beauty of this is that the salted password is never transmitted over + the wire!) + + PostgreSQL 11 added support for the channel binding (i.e. + SCRAM-SHA-256-PLUS) but to do some ongoing discussion, there is a conscious + decision by several driver authors to not support it as of yet. As such, the + channel binding parameter is hard-coded to "n" for now, but can be updated + to support other channel binding methos in the future + """ + AUTHENTICATION_METHODS = [b"SCRAM-SHA-256"] + DEFAULT_CLIENT_NONCE_BYTES = 24 + DIGEST = hashlib.sha256 + REQUIREMENTS_CLIENT_FINAL_MESSAGE = ['client_channel_binding', + 'server_nonce'] + REQUIREMENTS_CLIENT_PROOF = ['password_iterations', 'password_salt', + 'server_first_message', 'server_nonce'] + SASLPREP_PROHIBITED = ( + stringprep.in_table_a1, # PostgreSQL treats this as prohibited + stringprep.in_table_c12, + stringprep.in_table_c21_c22, + stringprep.in_table_c3, + stringprep.in_table_c4, + stringprep.in_table_c5, + stringprep.in_table_c6, + stringprep.in_table_c7, + stringprep.in_table_c8, + stringprep.in_table_c9, + ) + + def __cinit__(self, bytes authentication_method): + self.authentication_method = authentication_method + self.authorization_message = None + # channel binding is turned off for the time being + self.client_channel_binding = b"n,," + self.client_first_message_bare = None + self.client_nonce = None + self.client_proof = None + self.password_salt = None + # self.password_iterations = None + self.server_first_message = None + self.server_key = None + self.server_nonce = None + + cdef create_client_first_message(self, str username): + """Create the initial client message for SCRAM authentication""" + cdef: + bytes msg + bytes client_first_message + + self.client_nonce = \ + self._generate_client_nonce(self.DEFAULT_CLIENT_NONCE_BYTES) + # set the client first message bare here, as it's used in a later step + self.client_first_message_bare = b"n=" + username.encode("utf-8") + \ + b",r=" + self.client_nonce + # put together the full message here + msg = bytes() + msg += self.authentication_method + b"\0" + client_first_message = self.client_channel_binding + \ + self.client_first_message_bare + msg += (len(client_first_message)).to_bytes(4, byteorder='big') + \ + client_first_message + return msg + + cdef create_client_final_message(self, str password): + """Create the final client message as part of SCRAM authentication""" + cdef: + bytes msg + + if any([getattr(self, val) is None for val in + self.REQUIREMENTS_CLIENT_FINAL_MESSAGE]): + raise Exception( + "you need values from server to generate a client proof") + + # normalize the password using the SASLprep algorithm in RFC 4013 + password = self._normalize_password(password) + + # generate the client proof + self.client_proof = self._generate_client_proof(password=password) + msg = bytes() + msg += b"c=" + base64.b64encode(self.client_channel_binding) + \ + b",r=" + self.server_nonce + \ + b",p=" + base64.b64encode(self.client_proof) + return msg + + cdef parse_server_first_message(self, bytes server_response): + """Parse the response from the first message from the server""" + self.server_first_message = server_response + try: + self.server_nonce = re.search(b'r=([^,]+),', + self.server_first_message).group(1) + except IndexError: + raise Exception("could not get nonce") + if not self.server_nonce.startswith(self.client_nonce): + raise Exception("invalid nonce") + try: + self.password_salt = re.search(b',s=([^,]+),', + self.server_first_message).group(1) + except IndexError: + raise Exception("could not get salt") + try: + self.password_iterations = int(re.search(b',i=(\d+),?', + self.server_first_message).group(1)) + except (IndexError, TypeError, ValueError): + raise Exception("could not get iterations") + + cdef verify_server_final_message(self, bytes server_final_message): + """Verify the final message from the server""" + cdef: + bytes server_signature + + try: + server_signature = re.search(b'v=([^,]+)', + server_final_message).group(1) + except IndexError: + raise Exception("could not get server signature") + + verify_server_signature = hmac.new(self.server_key.digest(), + self.authorization_message, self.DIGEST) + # validate the server signature against the verifier + return server_signature == base64.b64encode( + verify_server_signature.digest()) + + cdef _bytes_xor(self, bytes a, bytes b): + """XOR two bytestrings together""" + return bytes(a_i ^ b_i for a_i, b_i in zip(a, b)) + + cdef _generate_client_nonce(self, int num_bytes): + cdef: + bytes token + + token = secrets.token_bytes(num_bytes) + + return base64.b64encode(token) + + cdef _generate_client_proof(self, str password): + """need to ensure a server response exists, i.e. """ + cdef: + bytes salted_password + + if any([getattr(self, val) is None for val in + self.REQUIREMENTS_CLIENT_PROOF]): + raise Exception( + "you need values from server to generate a client proof") + # generate a salt password + salted_password = self._generate_salted_password(password, + self.password_salt, self.password_iterations) + # client key is derived from the salted password + client_key = hmac.new(salted_password, b"Client Key", self.DIGEST) + # this allows us to compute the stored key that is residing on the server + stored_key = self.DIGEST(client_key.digest()) + # as well as compute the server key + self.server_key = hmac.new(salted_password, b"Server Key", self.DIGEST) + # build the authorization message that will be used in the + # client signature + # the "c=" portion is for the channel binding, but this is not + # presently implemented + self.authorization_message = self.client_first_message_bare + b"," + \ + self.server_first_message + b",c=" + \ + base64.b64encode(self.client_channel_binding) + \ + b",r=" + self.server_nonce + # sign! + client_signature = hmac.new(stored_key.digest(), + self.authorization_message, self.DIGEST) + # and the proof + return self._bytes_xor(client_key.digest(), client_signature.digest()) + + cdef _generate_salted_password(self, str password, bytes salt, int iterations): + """This follows the "Hi" algorithm specified in RFC5802""" + cdef: + bytes p + bytes s + bytes u + + # convert the password to a binary string - UTF8 is safe for SASL + # (though there are SASLPrep rules) + p = password.encode("utf8") + # the salt needs to be base64 decoded -- full binary must be used + s = base64.b64decode(salt) + # the initial signature is the salt with a terminator of a 32-bit string + # ending in 1 + ui = hmac.new(p, s + b'\x00\x00\x00\x01', self.DIGEST) + # grab the initial digest + u = ui.digest() + # for X number of iterations, recompute the HMAC signature against the + # password and the latest iteration of the hash, and XOR it with the + # previous version + for x in range(iterations - 1): + ui = hmac.new(p, ui.digest(), hashlib.sha256) + # this is a fancy way of XORing two byte strings together + u = self._bytes_xor(u, ui.digest()) + return u + + cdef _normalize_password(self, str original_password): + """Normalize the password using the SASLprep from RFC4013""" + cdef: + str normalized_password + + # Note: Per the PostgreSQL documentation, PostgreSWL does not require + # UTF-8 to be used for the password, but will perform SASLprep on the + # password regardless. + # If the password is not valid UTF-8, PostgreSQL will then **not** use + # SASLprep processing. + # If the password fails SASLprep, the password should still be sent + # See: https://www.postgresql.org/docs/current/sasl-authentication.html + # and + # https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/common/saslprep.c + # using the `pg_saslprep` function + normalized_password = original_password + # if the original password is an ASCII string or fails to encode as a + # UTF-8 string, then no further action is needed + try: + original_password.encode("ascii") + except UnicodeEncodeError: + pass + else: + return original_password + + # Step 1 of SASLPrep: Map. Per the algorithm, we map non-ascii space + # characters to ASCII spaces (\x20 or \u0020, but we will use ' ') and + # commonly mapped to nothing characters are removed + # Table C.1.2 -- non-ASCII spaces + # Table B.1 -- "Commonly mapped to nothing" + normalized_password = u"".join( + ' ' if stringprep.in_table_c12(c) else c + for c in tuple(normalized_password) if not stringprep.in_table_b1(c) + ) + + # If at this point the password is empty, PostgreSQL uses the original + # password + if not normalized_password: + return original_password + + # Step 2 of SASLPrep: Normalize. Normalize the password using the + # Unicode normalization algorithm to NFKC form + normalized_password = unicodedata.normalize('NFKC', normalized_password) + + # If the password is not empty, PostgreSQL uses the original password + if not normalized_password: + return original_password + + normalized_password_tuple = tuple(normalized_password) + + # Step 3 of SASLPrep: Prohobited characters. If PostgreSQL detects any + # of the prohibited characters in SASLPrep, it will use the original + # password + # We also include "unassigned code points" in the prohibited character + # category as PostgreSQL does the same + for c in normalized_password_tuple: + if any( + in_prohibited_table(c) + for in_prohibited_table in self.SASLPREP_PROHIBITED + ): + return original_password + + # Step 4 of SASLPrep: Bi-directional characters. PostgreSQL follows the + # rules for bi-directional characters laid on in RFC3454 Sec. 6 which + # are: + # 1. Characters in RFC 3454 Sec 5.8 are prohibited (C.8) + # 2. If a string contains a RandALCat character, it cannot containy any + # LCat character + # 3. If the string contains any RandALCat character, an RandALCat + # character must be the first and last character of the string + # RandALCat characters are found in table D.1, whereas LCat are in D.2 + if any(stringprep.in_table_d1(c) for c in normalized_password_tuple): + # if the first character or the last character are not in D.1, + # return the original password + if not (stringprep.in_table_d1(normalized_password_tuple[0]) and + stringprep.in_table_d1(normalized_password_tuple[-1])): + return original_password + + # if any characters are in D.2, use the original password + if any( + stringprep.in_table_d2(c) for c in normalized_password_tuple + ): + return original_password + + # return the normalized password + return normalized_password diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/settings.pxd b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/settings.pxd new file mode 100755 index 0000000..0a1a5f6 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/settings.pxd @@ -0,0 +1,30 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +cdef class ConnectionSettings(pgproto.CodecContext): + cdef: + str _encoding + object _codec + dict _settings + bint _is_utf8 + DataCodecConfig _data_codecs + + cdef add_setting(self, str name, str val) + cdef is_encoding_utf8(self) + cpdef get_text_codec(self) + cpdef inline register_data_types(self, types) + cpdef inline add_python_codec( + self, typeoid, typename, typeschema, typeinfos, typekind, encoder, + decoder, format) + cpdef inline remove_python_codec( + self, typeoid, typename, typeschema) + cpdef inline clear_type_cache(self) + cpdef inline set_builtin_type_codec( + self, typeoid, typename, typeschema, typekind, alias_to, format) + cpdef inline Codec get_data_codec( + self, uint32_t oid, ServerDataFormat format=*, + bint ignore_custom_codec=*) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/settings.pyx b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/settings.pyx new file mode 100755 index 0000000..2b53566 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/protocol/settings.pyx @@ -0,0 +1,106 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +from asyncpg import exceptions + + +@cython.final +cdef class ConnectionSettings(pgproto.CodecContext): + + def __cinit__(self): + self._encoding = 'utf-8' + self._is_utf8 = True + self._settings = {} + self._codec = codecs.lookup('utf-8') + self._data_codecs = DataCodecConfig() + + cdef add_setting(self, str name, str val): + self._settings[name] = val + if name == 'client_encoding': + py_enc = get_python_encoding(val) + self._codec = codecs.lookup(py_enc) + self._encoding = self._codec.name + self._is_utf8 = self._encoding == 'utf-8' + + cdef is_encoding_utf8(self): + return self._is_utf8 + + cpdef get_text_codec(self): + return self._codec + + cpdef inline register_data_types(self, types): + self._data_codecs.add_types(types) + + cpdef inline add_python_codec(self, typeoid, typename, typeschema, + typeinfos, typekind, encoder, decoder, + format): + cdef: + ServerDataFormat _format + ClientExchangeFormat xformat + + if format == 'binary': + _format = PG_FORMAT_BINARY + xformat = PG_XFORMAT_OBJECT + elif format == 'text': + _format = PG_FORMAT_TEXT + xformat = PG_XFORMAT_OBJECT + elif format == 'tuple': + _format = PG_FORMAT_ANY + xformat = PG_XFORMAT_TUPLE + else: + raise exceptions.InterfaceError( + 'invalid `format` argument, expected {}, got {!r}'.format( + "'text', 'binary' or 'tuple'", format + )) + + self._data_codecs.add_python_codec(typeoid, typename, typeschema, + typekind, typeinfos, + encoder, decoder, + _format, xformat) + + cpdef inline remove_python_codec(self, typeoid, typename, typeschema): + self._data_codecs.remove_python_codec(typeoid, typename, typeschema) + + cpdef inline clear_type_cache(self): + self._data_codecs.clear_type_cache() + + cpdef inline set_builtin_type_codec(self, typeoid, typename, typeschema, + typekind, alias_to, format): + cdef: + ServerDataFormat _format + + if format is None: + _format = PG_FORMAT_ANY + elif format == 'binary': + _format = PG_FORMAT_BINARY + elif format == 'text': + _format = PG_FORMAT_TEXT + else: + raise exceptions.InterfaceError( + 'invalid `format` argument, expected {}, got {!r}'.format( + "'text' or 'binary'", format + )) + + self._data_codecs.set_builtin_type_codec(typeoid, typename, typeschema, + typekind, alias_to, _format) + + cpdef inline Codec get_data_codec(self, uint32_t oid, + ServerDataFormat format=PG_FORMAT_ANY, + bint ignore_custom_codec=False): + return self._data_codecs.get_codec(oid, format, ignore_custom_codec) + + def __getattr__(self, name): + if not name.startswith('_'): + try: + return self._settings[name] + except KeyError: + raise AttributeError(name) from None + + return object.__getattribute__(self, name) + + def __repr__(self): + return ''.format(self._settings) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/serverversion.py b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/serverversion.py new file mode 100755 index 0000000..ee9647b --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/serverversion.py @@ -0,0 +1,70 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + +from __future__ import annotations + +import re +import typing + +from .types import ServerVersion + +version_regex: typing.Final = re.compile( + r"(Postgre[^\s]*)?\s*" + r"(?P[0-9]+)\.?" + r"((?P[0-9]+)\.?)?" + r"(?P[0-9]+)?" + r"(?P[a-z]+)?" + r"(?P[0-9]+)?" +) + + +class _VersionDict(typing.TypedDict): + major: int + minor: int | None + micro: int | None + releaselevel: str | None + serial: int | None + + +def split_server_version_string(version_string: str) -> ServerVersion: + version_match = version_regex.search(version_string) + + if version_match is None: + raise ValueError( + "Unable to parse Postgres " + f'version from "{version_string}"' + ) + + version: _VersionDict = version_match.groupdict() # type: ignore[assignment] # noqa: E501 + for ver_key, ver_value in version.items(): + # Cast all possible versions parts to int + try: + version[ver_key] = int(ver_value) # type: ignore[literal-required, call-overload] # noqa: E501 + except (TypeError, ValueError): + pass + + if version["major"] < 10: + return ServerVersion( + version["major"], + version.get("minor") or 0, + version.get("micro") or 0, + version.get("releaselevel") or "final", + version.get("serial") or 0, + ) + + # Since PostgreSQL 10 the versioning scheme has changed. + # 10.x really means 10.0.x. While parsing 10.1 + # as (10, 1) may seem less confusing, in practice most + # version checks are written as version[:2], and we + # want to keep that behaviour consistent, i.e not fail + # a major version check due to a bugfix release. + return ServerVersion( + version["major"], + 0, + version.get("minor") or 0, + version.get("releaselevel") or "final", + version.get("serial") or 0, + ) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/transaction.py b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/transaction.py new file mode 100755 index 0000000..562811e --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/transaction.py @@ -0,0 +1,246 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +import enum + +from . import connresource +from . import exceptions as apg_errors + + +class TransactionState(enum.Enum): + NEW = 0 + STARTED = 1 + COMMITTED = 2 + ROLLEDBACK = 3 + FAILED = 4 + + +ISOLATION_LEVELS = { + 'read_committed', + 'read_uncommitted', + 'serializable', + 'repeatable_read', +} +ISOLATION_LEVELS_BY_VALUE = { + 'read committed': 'read_committed', + 'read uncommitted': 'read_uncommitted', + 'serializable': 'serializable', + 'repeatable read': 'repeatable_read', +} + + +class Transaction(connresource.ConnectionResource): + """Represents a transaction or savepoint block. + + Transactions are created by calling the + :meth:`Connection.transaction() ` + function. + """ + + __slots__ = ('_connection', '_isolation', '_readonly', '_deferrable', + '_state', '_nested', '_id', '_managed') + + def __init__(self, connection, isolation, readonly, deferrable): + super().__init__(connection) + + if isolation and isolation not in ISOLATION_LEVELS: + raise ValueError( + 'isolation is expected to be either of {}, ' + 'got {!r}'.format(ISOLATION_LEVELS, isolation)) + + self._isolation = isolation + self._readonly = readonly + self._deferrable = deferrable + self._state = TransactionState.NEW + self._nested = False + self._id = None + self._managed = False + + async def __aenter__(self): + if self._managed: + raise apg_errors.InterfaceError( + 'cannot enter context: already in an `async with` block') + self._managed = True + await self.start() + + async def __aexit__(self, extype, ex, tb): + try: + self._check_conn_validity('__aexit__') + except apg_errors.InterfaceError: + if extype is GeneratorExit: + # When a PoolAcquireContext is being exited, and there + # is an open transaction in an async generator that has + # not been iterated fully, there is a possibility that + # Pool.release() would race with this __aexit__(), since + # both would be in concurrent tasks. In such case we + # yield to Pool.release() to do the ROLLBACK for us. + # See https://github.com/MagicStack/asyncpg/issues/232 + # for an example. + return + else: + raise + + try: + if extype is not None: + await self.__rollback() + else: + await self.__commit() + finally: + self._managed = False + + @connresource.guarded + async def start(self): + """Enter the transaction or savepoint block.""" + self.__check_state_base('start') + if self._state is TransactionState.STARTED: + raise apg_errors.InterfaceError( + 'cannot start; the transaction is already started') + + con = self._connection + + if con._top_xact is None: + if con._protocol.is_in_transaction(): + raise apg_errors.InterfaceError( + 'cannot use Connection.transaction() in ' + 'a manually started transaction') + con._top_xact = self + else: + # Nested transaction block + if self._isolation: + top_xact_isolation = con._top_xact._isolation + if top_xact_isolation is None: + top_xact_isolation = ISOLATION_LEVELS_BY_VALUE[ + await self._connection.fetchval( + 'SHOW transaction_isolation;')] + if self._isolation != top_xact_isolation: + raise apg_errors.InterfaceError( + 'nested transaction has a different isolation level: ' + 'current {!r} != outer {!r}'.format( + self._isolation, top_xact_isolation)) + self._nested = True + + if self._nested: + self._id = con._get_unique_id('savepoint') + query = 'SAVEPOINT {};'.format(self._id) + else: + query = 'BEGIN' + if self._isolation == 'read_committed': + query += ' ISOLATION LEVEL READ COMMITTED' + elif self._isolation == 'read_uncommitted': + query += ' ISOLATION LEVEL READ UNCOMMITTED' + elif self._isolation == 'repeatable_read': + query += ' ISOLATION LEVEL REPEATABLE READ' + elif self._isolation == 'serializable': + query += ' ISOLATION LEVEL SERIALIZABLE' + if self._readonly: + query += ' READ ONLY' + if self._deferrable: + query += ' DEFERRABLE' + query += ';' + + try: + await self._connection.execute(query) + except BaseException: + self._state = TransactionState.FAILED + raise + else: + self._state = TransactionState.STARTED + + def __check_state_base(self, opname): + if self._state is TransactionState.COMMITTED: + raise apg_errors.InterfaceError( + 'cannot {}; the transaction is already committed'.format( + opname)) + if self._state is TransactionState.ROLLEDBACK: + raise apg_errors.InterfaceError( + 'cannot {}; the transaction is already rolled back'.format( + opname)) + if self._state is TransactionState.FAILED: + raise apg_errors.InterfaceError( + 'cannot {}; the transaction is in error state'.format( + opname)) + + def __check_state(self, opname): + if self._state is not TransactionState.STARTED: + if self._state is TransactionState.NEW: + raise apg_errors.InterfaceError( + 'cannot {}; the transaction is not yet started'.format( + opname)) + self.__check_state_base(opname) + + async def __commit(self): + self.__check_state('commit') + + if self._connection._top_xact is self: + self._connection._top_xact = None + + if self._nested: + query = 'RELEASE SAVEPOINT {};'.format(self._id) + else: + query = 'COMMIT;' + + try: + await self._connection.execute(query) + except BaseException: + self._state = TransactionState.FAILED + raise + else: + self._state = TransactionState.COMMITTED + + async def __rollback(self): + self.__check_state('rollback') + + if self._connection._top_xact is self: + self._connection._top_xact = None + + if self._nested: + query = 'ROLLBACK TO {};'.format(self._id) + else: + query = 'ROLLBACK;' + + try: + await self._connection.execute(query) + except BaseException: + self._state = TransactionState.FAILED + raise + else: + self._state = TransactionState.ROLLEDBACK + + @connresource.guarded + async def commit(self): + """Exit the transaction or savepoint block and commit changes.""" + if self._managed: + raise apg_errors.InterfaceError( + 'cannot manually commit from within an `async with` block') + await self.__commit() + + @connresource.guarded + async def rollback(self): + """Exit the transaction or savepoint block and rollback changes.""" + if self._managed: + raise apg_errors.InterfaceError( + 'cannot manually rollback from within an `async with` block') + await self.__rollback() + + def __repr__(self): + attrs = [] + attrs.append('state:{}'.format(self._state.name.lower())) + + if self._isolation is not None: + attrs.append(self._isolation) + if self._readonly: + attrs.append('readonly') + if self._deferrable: + attrs.append('deferrable') + + if self.__class__.__module__.startswith('asyncpg.'): + mod = 'asyncpg' + else: + mod = self.__class__.__module__ + + return '<{}.{} {} {:#x}>'.format( + mod, self.__class__.__name__, ' '.join(attrs), id(self)) diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/types.py b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/types.py new file mode 100755 index 0000000..c4b66b4 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/types.py @@ -0,0 +1,223 @@ +# Copyright (C) 2016-present the asyncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + +from __future__ import annotations + +import typing + +from asyncpg.pgproto.types import ( + BitString, Point, Path, Polygon, + Box, Line, LineSegment, Circle, +) + +if typing.TYPE_CHECKING: + from typing_extensions import Self + + +__all__ = ( + 'Type', 'Attribute', 'Range', 'BitString', 'Point', 'Path', 'Polygon', + 'Box', 'Line', 'LineSegment', 'Circle', 'ServerVersion', +) + + +class Type(typing.NamedTuple): + oid: int + name: str + kind: str + schema: str + + +Type.__doc__ = 'Database data type.' +Type.oid.__doc__ = 'OID of the type.' +Type.name.__doc__ = 'Type name. For example "int2".' +Type.kind.__doc__ = \ + 'Type kind. Can be "scalar", "array", "composite" or "range".' +Type.schema.__doc__ = 'Name of the database schema that defines the type.' + + +class Attribute(typing.NamedTuple): + name: str + type: Type + + +Attribute.__doc__ = 'Database relation attribute.' +Attribute.name.__doc__ = 'Attribute name.' +Attribute.type.__doc__ = 'Attribute data type :class:`asyncpg.types.Type`.' + + +class ServerVersion(typing.NamedTuple): + major: int + minor: int + micro: int + releaselevel: str + serial: int + + +ServerVersion.__doc__ = 'PostgreSQL server version tuple.' + + +class _RangeValue(typing.Protocol): + def __eq__(self, __value: object) -> bool: + ... + + def __lt__(self, __other: Self, /) -> bool: + ... + + def __gt__(self, __other: Self, /) -> bool: + ... + + +_RV = typing.TypeVar('_RV', bound=_RangeValue) + + +class Range(typing.Generic[_RV]): + """Immutable representation of PostgreSQL `range` type.""" + + __slots__ = ('_lower', '_upper', '_lower_inc', '_upper_inc', '_empty') + + _lower: _RV | None + _upper: _RV | None + _lower_inc: bool + _upper_inc: bool + _empty: bool + + def __init__( + self, + lower: _RV | None = None, + upper: _RV | None = None, + *, + lower_inc: bool = True, + upper_inc: bool = False, + empty: bool = False + ) -> None: + self._empty = empty + if empty: + self._lower = self._upper = None + self._lower_inc = self._upper_inc = False + else: + self._lower = lower + self._upper = upper + self._lower_inc = lower is not None and lower_inc + self._upper_inc = upper is not None and upper_inc + + @property + def lower(self) -> _RV | None: + return self._lower + + @property + def lower_inc(self) -> bool: + return self._lower_inc + + @property + def lower_inf(self) -> bool: + return self._lower is None and not self._empty + + @property + def upper(self) -> _RV | None: + return self._upper + + @property + def upper_inc(self) -> bool: + return self._upper_inc + + @property + def upper_inf(self) -> bool: + return self._upper is None and not self._empty + + @property + def isempty(self) -> bool: + return self._empty + + def _issubset_lower(self, other: Self) -> bool: + if other._lower is None: + return True + if self._lower is None: + return False + + return self._lower > other._lower or ( + self._lower == other._lower + and (other._lower_inc or not self._lower_inc) + ) + + def _issubset_upper(self, other: Self) -> bool: + if other._upper is None: + return True + if self._upper is None: + return False + + return self._upper < other._upper or ( + self._upper == other._upper + and (other._upper_inc or not self._upper_inc) + ) + + def issubset(self, other: Self) -> bool: + if self._empty: + return True + if other._empty: + return False + + return self._issubset_lower(other) and self._issubset_upper(other) + + def issuperset(self, other: Self) -> bool: + return other.issubset(self) + + def __bool__(self) -> bool: + return not self._empty + + def __eq__(self, other: object) -> bool: + if not isinstance(other, Range): + return NotImplemented + + return ( + self._lower, + self._upper, + self._lower_inc, + self._upper_inc, + self._empty + ) == ( + other._lower, # pyright: ignore [reportUnknownMemberType] + other._upper, # pyright: ignore [reportUnknownMemberType] + other._lower_inc, + other._upper_inc, + other._empty + ) + + def __hash__(self) -> int: + return hash(( + self._lower, + self._upper, + self._lower_inc, + self._upper_inc, + self._empty + )) + + def __repr__(self) -> str: + if self._empty: + desc = 'empty' + else: + if self._lower is None or not self._lower_inc: + lb = '(' + else: + lb = '[' + + if self._lower is not None: + lb += repr(self._lower) + + if self._upper is not None: + ub = repr(self._upper) + else: + ub = '' + + if self._upper is None or not self._upper_inc: + ub += ')' + else: + ub += ']' + + desc = '{}, {}'.format(lb, ub) + + return ''.format(desc) + + __str__ = __repr__ diff --git a/code-server-config/.local/lib/python3.12/site-packages/asyncpg/utils.py b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/utils.py new file mode 100755 index 0000000..5c1ca69 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/asyncpg/utils.py @@ -0,0 +1,52 @@ +# Copyright (C) 2016-present the ayncpg authors and contributors +# +# +# This module is part of asyncpg and is released under +# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0 + + +import re + + +def _quote_ident(ident): + return '"{}"'.format(ident.replace('"', '""')) + + +def _quote_literal(string): + return "'{}'".format(string.replace("'", "''")) + + +async def _mogrify(conn, query, args): + """Safely inline arguments to query text.""" + # Introspect the target query for argument types and + # build a list of safely-quoted fully-qualified type names. + ps = await conn.prepare(query) + paramtypes = [] + for t in ps.get_parameters(): + if t.name.endswith('[]'): + pname = '_' + t.name[:-2] + else: + pname = t.name + + paramtypes.append('{}.{}'.format( + _quote_ident(t.schema), _quote_ident(pname))) + del ps + + # Use Postgres to convert arguments to text representation + # by casting each value to text. + cols = ['quote_literal(${}::{}::text)'.format(i, t) + for i, t in enumerate(paramtypes, start=1)] + + textified = await conn.fetchrow( + 'SELECT {cols}'.format(cols=', '.join(cols)), *args) + + # Finally, replace $n references with text values. + return re.sub( + r"\$(\d+)\b", + lambda m: ( + textified[int(m.group(1)) - 1] + if textified[int(m.group(1)) - 1] is not None + else "NULL" + ), + query, + ) diff --git a/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/INSTALLER b/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/INSTALLER new file mode 100755 index 0000000..a1b589e --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/METADATA b/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/METADATA new file mode 100755 index 0000000..7fd97b7 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/METADATA @@ -0,0 +1,123 @@ +Metadata-Version: 2.4 +Name: beautifulsoup4 +Version: 4.14.3 +Summary: Screen-scraping library +Project-URL: Download, https://www.crummy.com/software/BeautifulSoup/bs4/download/ +Project-URL: Homepage, https://www.crummy.com/software/BeautifulSoup/bs4/ +Author-email: Leonard Richardson +License: MIT License +License-File: AUTHORS +License-File: LICENSE +Keywords: HTML,XML,parse,soup +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup :: HTML +Classifier: Topic :: Text Processing :: Markup :: SGML +Classifier: Topic :: Text Processing :: Markup :: XML +Requires-Python: >=3.7.0 +Requires-Dist: soupsieve>=1.6.1 +Requires-Dist: typing-extensions>=4.0.0 +Provides-Extra: cchardet +Requires-Dist: cchardet; extra == 'cchardet' +Provides-Extra: chardet +Requires-Dist: chardet; extra == 'chardet' +Provides-Extra: charset-normalizer +Requires-Dist: charset-normalizer; extra == 'charset-normalizer' +Provides-Extra: html5lib +Requires-Dist: html5lib; extra == 'html5lib' +Provides-Extra: lxml +Requires-Dist: lxml; extra == 'lxml' +Description-Content-Type: text/markdown + +Beautiful Soup is a library that makes it easy to scrape information +from web pages. It sits atop an HTML or XML parser, providing Pythonic +idioms for iterating, searching, and modifying the parse tree. + +# Quick start + +``` +>>> from bs4 import BeautifulSoup +>>> soup = BeautifulSoup("

SomebadHTML") +>>> print(soup.prettify()) + + +

+ Some + + bad + + HTML + + +

+ + +>>> soup.find(string="bad") +'bad' +>>> soup.i +HTML +# +>>> soup = BeautifulSoup("SomebadXML", "xml") +# +>>> print(soup.prettify()) + + + Some + + bad + + XML + + +``` + +To go beyond the basics, [comprehensive documentation is available](https://www.crummy.com/software/BeautifulSoup/bs4/doc/). + +# Links + +* [Homepage](https://www.crummy.com/software/BeautifulSoup/bs4/) +* [Documentation](https://www.crummy.com/software/BeautifulSoup/bs4/doc/) +* [Discussion group](https://groups.google.com/group/beautifulsoup/) +* [Development](https://code.launchpad.net/beautifulsoup/) +* [Bug tracker](https://bugs.launchpad.net/beautifulsoup/) +* [Complete changelog](https://git.launchpad.net/beautifulsoup/tree/CHANGELOG) + +# Note on Python 2 sunsetting + +Beautiful Soup's support for Python 2 was discontinued on December 31, +2020: one year after the sunset date for Python 2 itself. From this +point onward, new Beautiful Soup development will exclusively target +Python 3. The final release of Beautiful Soup 4 to support Python 2 +was 4.9.3. + +# Supporting the project + +If you use Beautiful Soup as part of your professional work, please consider a +[Tidelift subscription](https://tidelift.com/subscription/pkg/pypi-beautifulsoup4?utm_source=pypi-beautifulsoup4&utm_medium=referral&utm_campaign=readme). +This will support many of the free software projects your organization +depends on, not just Beautiful Soup. + +If you use Beautiful Soup for personal projects, the best way to say +thank you is to read +[Tool Safety](https://www.crummy.com/software/BeautifulSoup/zine/), a zine I +wrote about what Beautiful Soup has taught me about software +development. + +# Building the documentation + +The bs4/doc/ directory contains full documentation in Sphinx +format. Run `make html` in that directory to create HTML +documentation. + +# Running the unit tests + +Beautiful Soup supports unit test discovery using Pytest: + +``` +$ pytest +``` + diff --git a/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/RECORD b/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/RECORD new file mode 100755 index 0000000..252891d --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/RECORD @@ -0,0 +1,38 @@ +beautifulsoup4-4.14.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +beautifulsoup4-4.14.3.dist-info/METADATA,sha256=Ac93vA8Xp9FtgOcKXFM8ESfVdztimUfJ3WUpVlhKtsY,3812 +beautifulsoup4-4.14.3.dist-info/RECORD,, +beautifulsoup4-4.14.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +beautifulsoup4-4.14.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87 +beautifulsoup4-4.14.3.dist-info/licenses/AUTHORS,sha256=uYkjiRjh_aweRnF8tAW2PpJJeickE68NmJwd9siry28,2201 +beautifulsoup4-4.14.3.dist-info/licenses/LICENSE,sha256=VbTY1LHlvIbRDvrJG3TIe8t3UmsPW57a-LnNKtxzl7I,1441 +bs4/__init__.py,sha256=E7wiVp7oQK0JhdAYxpehZa8drv3W_sJv5oeTFiBfR5o,44386 +bs4/__pycache__/__init__.cpython-312.pyc,, +bs4/__pycache__/_deprecation.cpython-312.pyc,, +bs4/__pycache__/_typing.cpython-312.pyc,, +bs4/__pycache__/_warnings.cpython-312.pyc,, +bs4/__pycache__/css.cpython-312.pyc,, +bs4/__pycache__/dammit.cpython-312.pyc,, +bs4/__pycache__/diagnose.cpython-312.pyc,, +bs4/__pycache__/element.cpython-312.pyc,, +bs4/__pycache__/exceptions.cpython-312.pyc,, +bs4/__pycache__/filter.cpython-312.pyc,, +bs4/__pycache__/formatter.cpython-312.pyc,, +bs4/_deprecation.py,sha256=niHJCk37APg8KEuFOa57ZXaxLdBmc_2V6uuaJqu7r30,2408 +bs4/_typing.py,sha256=zNcx7R1yCTK8WwtumP28hc7CJ3pMyZXj_VAeYaNXMZA,7549 +bs4/_warnings.py,sha256=ZuOETgcnEbZgw2N0nnNXn6wvtrn2ut7AF0d98bvkMFc,4711 +bs4/builder/__init__.py,sha256=Rl4qjOXvdyyyjayOFqbkgoUoo81IgoyKD-RwWeVK59g,31194 +bs4/builder/__pycache__/__init__.cpython-312.pyc,, +bs4/builder/__pycache__/_html5lib.cpython-312.pyc,, +bs4/builder/__pycache__/_htmlparser.cpython-312.pyc,, +bs4/builder/__pycache__/_lxml.cpython-312.pyc,, +bs4/builder/_html5lib.py,sha256=hL6xUk4_I2i5CMguFoYFlrI26cY4Dut7fOEQrUctHIM,23607 +bs4/builder/_htmlparser.py,sha256=CnULPQV2rm4vLojJABpQ7Xm9diddnEZx2Wcz_VTC1Mg,17445 +bs4/builder/_lxml.py,sha256=ks1e8boA_nOA2oomAhxeudccR6ThbEE-EllFqHRoPLA,18969 +bs4/css.py,sha256=_m_l_4SGWHnY620VJ21j_qQH1RX3p91sYVemgKxaLsM,12713 +bs4/dammit.py,sha256=ZJWa9K32X6N2imFHleqUq0ekf592weU1lvULN_WYWYk,57024 +bs4/diagnose.py,sha256=at98iuxyOrqec4V8iwkTIbNUqBCsq9Lr3fDAQx2129Y,7846 +bs4/element.py,sha256=oXmj7LG_2NpsDK90mq73q0PMK0FjFBIGSeTTJLVwwTc,120237 +bs4/exceptions.py,sha256=Q9FOadNe8QRvzDMaKSXe2Wtl8JK_oAZW7mbFZBVP_GE,951 +bs4/filter.py,sha256=rw8ZNhTDLEJVCEiSifou5tZR_3zBLeuvAyouY82qU_E,29201 +bs4/formatter.py,sha256=uBT0k6W8O5kJ9PCuJYjra97yoUqC-dlM9D_v-oRM0r8,10478 +bs4/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/REQUESTED b/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/REQUESTED new file mode 100755 index 0000000..e69de29 diff --git a/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/WHEEL b/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/WHEEL new file mode 100755 index 0000000..12228d4 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: hatchling 1.27.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/licenses/AUTHORS b/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/licenses/AUTHORS new file mode 100755 index 0000000..18926c2 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/licenses/AUTHORS @@ -0,0 +1,49 @@ +Behold, mortal, the origins of Beautiful Soup... +================================================ + +Leonard Richardson is the primary maintainer. + +Aaron DeVore, Isaac Muse and Chris Papademetrious have made +significant contributions to the code base. + +Mark Pilgrim provided the encoding detection code that forms the base +of UnicodeDammit. + +Thomas Kluyver and Ezio Melotti finished the work of getting Beautiful +Soup 4 working under Python 3. + +Simon Willison wrote soupselect, which was used to make Beautiful Soup +support CSS selectors. Isaac Muse wrote SoupSieve, which made it +possible to _remove_ the CSS selector code from Beautiful Soup. + +Sam Ruby helped with a lot of edge cases. + +Jonathan Ellis was awarded the prestigious Beau Potage D'Or for his +work in solving the nestable tags conundrum. + +An incomplete list of people have contributed patches to Beautiful +Soup: + + Istvan Albert, Andrew Lin, Anthony Baxter, Oliver Beattie, Andrew +Boyko, Tony Chang, Francisco Canas, "Delong", Zephyr Fang, Fuzzy, +Roman Gaufman, Yoni Gilad, Richie Hindle, Toshihiro Kamiya, Peteris +Krumins, Kent Johnson, Marek Kapolka, Andreas Kostyrka, Roel Kramer, +Ben Last, Robert Leftwich, Stefaan Lippens, "liquider", Staffan +Malmgren, Ksenia Marasanova, JP Moins, Adam Monsen, John Nagle, "Jon", +Ed Oskiewicz, Martijn Peters, Greg Phillips, Giles Radford, Stefano +Revera, Arthur Rudolph, Marko Samastur, James Salter, Jouni Seppänen, +Alexander Schmolck, Tim Shirley, Geoffrey Sneddon, Ville Skyttä, +"Vikas", Jens Svalgaard, Andy Theyers, Eric Weiser, Glyn Webster, John +Wiseman, Paul Wright, Danny Yoo + +An incomplete list of people who made suggestions or found bugs or +found ways to break Beautiful Soup: + + Hanno Böck, Matteo Bertini, Chris Curvey, Simon Cusack, Bruce Eckel, + Matt Ernst, Michael Foord, Tom Harris, Bill de hOra, Donald Howes, + Matt Patterson, Scott Roberts, Steve Strassmann, Mike Williams, + warchild at redho dot com, Sami Kuisma, Carlos Rocha, Bob Hutchison, + Joren Mc, Michal Migurski, John Kleven, Tim Heaney, Tripp Lilley, Ed + Summers, Dennis Sutch, Chris Smith, Aaron Swartz, Stuart + Turner, Greg Edwards, Kevin J Kalupson, Nikos Kouremenos, Artur de + Sousa Rocha, Yichun Wei, Per Vognsen diff --git a/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/licenses/LICENSE b/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/licenses/LICENSE new file mode 100755 index 0000000..08e3a9c --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/beautifulsoup4-4.14.3.dist-info/licenses/LICENSE @@ -0,0 +1,31 @@ +Beautiful Soup is made available under the MIT license: + + Copyright (c) Leonard Richardson + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + +Beautiful Soup incorporates code from the html5lib library, which is +also made available under the MIT license. Copyright (c) James Graham +and other contributors + +Beautiful Soup has an optional dependency on the soupsieve library, +which is also made available under the MIT license. Copyright (c) +Isaac Muse diff --git a/code-server-config/.local/lib/python3.12/site-packages/bs4/__init__.py b/code-server-config/.local/lib/python3.12/site-packages/bs4/__init__.py new file mode 100755 index 0000000..19b7c0e --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/bs4/__init__.py @@ -0,0 +1,1174 @@ +"""Beautiful Soup Elixir and Tonic - "The Screen-Scraper's Friend". + +http://www.crummy.com/software/BeautifulSoup/ + +Beautiful Soup uses a pluggable XML or HTML parser to parse a +(possibly invalid) document into a tree representation. Beautiful Soup +provides methods and Pythonic idioms that make it easy to navigate, +search, and modify the parse tree. + +Beautiful Soup works with Python 3.7 and up. It works better if lxml +and/or html5lib is installed, but they are not required. + +For more than you ever wanted to know about Beautiful Soup, see the +documentation: http://www.crummy.com/software/BeautifulSoup/bs4/doc/ +""" + +__author__ = "Leonard Richardson (leonardr@segfault.org)" +__version__ = "4.14.3" +__copyright__ = "Copyright (c) 2004-2025 Leonard Richardson" +# Use of this source code is governed by the MIT license. +__license__ = "MIT" + +__all__ = [ + "AttributeResemblesVariableWarning", + "BeautifulSoup", + "Comment", + "Declaration", + "ProcessingInstruction", + "ResultSet", + "CSS", + "Script", + "Stylesheet", + "Tag", + "TemplateString", + "ElementFilter", + "UnicodeDammit", + "CData", + "Doctype", + + # Exceptions + "FeatureNotFound", + "ParserRejectedMarkup", + "StopParsing", + + # Warnings + "AttributeResemblesVariableWarning", + "GuessedAtParserWarning", + "MarkupResemblesLocatorWarning", + "UnusualUsageWarning", + "XMLParsedAsHTMLWarning", +] + +from collections import Counter +import io +import sys +import warnings + +# The very first thing we do is give a useful error if someone is +# running this code under Python 2. +if sys.version_info.major < 3: + raise ImportError( + "You are trying to use a Python 3-specific version of Beautiful Soup under Python 2. This will not work. The final version of Beautiful Soup to support Python 2 was 4.9.3." + ) + +from .builder import ( + builder_registry, + TreeBuilder, +) +from .builder._htmlparser import HTMLParserTreeBuilder +from .dammit import UnicodeDammit +from .css import CSS +from ._deprecation import ( + _deprecated, +) +from .element import ( + CData, + Comment, + DEFAULT_OUTPUT_ENCODING, + Declaration, + Doctype, + NavigableString, + PageElement, + ProcessingInstruction, + PYTHON_SPECIFIC_ENCODINGS, + ResultSet, + Script, + Stylesheet, + Tag, + TemplateString, +) +from .formatter import Formatter +from .filter import ( + ElementFilter, + SoupStrainer, +) +from typing import ( + Any, + cast, + Counter as CounterType, + Dict, + Iterator, + List, + Sequence, + Sized, + Optional, + Type, + Union, +) + +from bs4._typing import ( + _Encoding, + _Encodings, + _IncomingMarkup, + _InsertableElement, + _RawAttributeValue, + _RawAttributeValues, + _RawMarkup, +) + +# Import all warnings and exceptions into the main package. +from bs4.exceptions import ( + FeatureNotFound, + ParserRejectedMarkup, + StopParsing, +) +from bs4._warnings import ( + AttributeResemblesVariableWarning, + GuessedAtParserWarning, + MarkupResemblesLocatorWarning, + UnusualUsageWarning, + XMLParsedAsHTMLWarning, +) + + +class BeautifulSoup(Tag): + """A data structure representing a parsed HTML or XML document. + + Most of the methods you'll call on a BeautifulSoup object are inherited from + PageElement or Tag. + + Internally, this class defines the basic interface called by the + tree builders when converting an HTML/XML document into a data + structure. The interface abstracts away the differences between + parsers. To write a new tree builder, you'll need to understand + these methods as a whole. + + These methods will be called by the BeautifulSoup constructor: + * reset() + * feed(markup) + + The tree builder may call these methods from its feed() implementation: + * handle_starttag(name, attrs) # See note about return value + * handle_endtag(name) + * handle_data(data) # Appends to the current data node + * endData(containerClass) # Ends the current data node + + No matter how complicated the underlying parser is, you should be + able to build a tree using 'start tag' events, 'end tag' events, + 'data' events, and "done with data" events. + + If you encounter an empty-element tag (aka a self-closing tag, + like HTML's
tag), call handle_starttag and then + handle_endtag. + """ + + #: Since `BeautifulSoup` subclasses `Tag`, it's possible to treat it as + #: a `Tag` with a `Tag.name`. Hoever, this name makes it clear the + #: `BeautifulSoup` object isn't a real markup tag. + ROOT_TAG_NAME: str = "[document]" + + #: If the end-user gives no indication which tree builder they + #: want, look for one with these features. + DEFAULT_BUILDER_FEATURES: Sequence[str] = ["html", "fast"] + + #: A string containing all ASCII whitespace characters, used in + #: during parsing to detect data chunks that seem 'empty'. + ASCII_SPACES: str = "\x20\x0a\x09\x0c\x0d" + + # FUTURE PYTHON: + element_classes: Dict[Type[PageElement], Type[PageElement]] #: :meta private: + builder: TreeBuilder #: :meta private: + is_xml: bool + known_xml: Optional[bool] + parse_only: Optional[SoupStrainer] #: :meta private: + + # These members are only used while parsing markup. + markup: Optional[_RawMarkup] #: :meta private: + current_data: List[str] #: :meta private: + currentTag: Optional[Tag] #: :meta private: + tagStack: List[Tag] #: :meta private: + open_tag_counter: CounterType[str] #: :meta private: + preserve_whitespace_tag_stack: List[Tag] #: :meta private: + string_container_stack: List[Tag] #: :meta private: + _most_recent_element: Optional[PageElement] #: :meta private: + + #: Beautiful Soup's best guess as to the character encoding of the + #: original document. + original_encoding: Optional[_Encoding] + + #: The character encoding, if any, that was explicitly defined + #: in the original document. This may or may not match + #: `BeautifulSoup.original_encoding`. + declared_html_encoding: Optional[_Encoding] + + #: This is True if the markup that was parsed contains + #: U+FFFD REPLACEMENT_CHARACTER characters which were not present + #: in the original markup. These mark character sequences that + #: could not be represented in Unicode. + contains_replacement_characters: bool + + def __init__( + self, + markup: _IncomingMarkup = "", + features: Optional[Union[str, Sequence[str]]] = None, + builder: Optional[Union[TreeBuilder, Type[TreeBuilder]]] = None, + parse_only: Optional[SoupStrainer] = None, + from_encoding: Optional[_Encoding] = None, + exclude_encodings: Optional[_Encodings] = None, + element_classes: Optional[Dict[Type[PageElement], Type[PageElement]]] = None, + **kwargs: Any, + ): + """Constructor. + + :param markup: A string or a file-like object representing + markup to be parsed. + + :param features: Desirable features of the parser to be + used. This may be the name of a specific parser ("lxml", + "lxml-xml", "html.parser", or "html5lib") or it may be the + type of markup to be used ("html", "html5", "xml"). It's + recommended that you name a specific parser, so that + Beautiful Soup gives you the same results across platforms + and virtual environments. + + :param builder: A TreeBuilder subclass to instantiate (or + instance to use) instead of looking one up based on + `features`. You only need to use this if you've implemented a + custom TreeBuilder. + + :param parse_only: A SoupStrainer. Only parts of the document + matching the SoupStrainer will be considered. This is useful + when parsing part of a document that would otherwise be too + large to fit into memory. + + :param from_encoding: A string indicating the encoding of the + document to be parsed. Pass this in if Beautiful Soup is + guessing wrongly about the document's encoding. + + :param exclude_encodings: A list of strings indicating + encodings known to be wrong. Pass this in if you don't know + the document's encoding but you know Beautiful Soup's guess is + wrong. + + :param element_classes: A dictionary mapping BeautifulSoup + classes like Tag and NavigableString, to other classes you'd + like to be instantiated instead as the parse tree is + built. This is useful for subclassing Tag or NavigableString + to modify default behavior. + + :param kwargs: For backwards compatibility purposes, the + constructor accepts certain keyword arguments used in + Beautiful Soup 3. None of these arguments do anything in + Beautiful Soup 4; they will result in a warning and then be + ignored. + + Apart from this, any keyword arguments passed into the + BeautifulSoup constructor are propagated to the TreeBuilder + constructor. This makes it possible to configure a + TreeBuilder by passing in arguments, not just by saying which + one to use. + """ + if "convertEntities" in kwargs: + del kwargs["convertEntities"] + warnings.warn( + "BS4 does not respect the convertEntities argument to the " + "BeautifulSoup constructor. Entities are always converted " + "to Unicode characters." + ) + + if "markupMassage" in kwargs: + del kwargs["markupMassage"] + warnings.warn( + "BS4 does not respect the markupMassage argument to the " + "BeautifulSoup constructor. The tree builder is responsible " + "for any necessary markup massage." + ) + + if "smartQuotesTo" in kwargs: + del kwargs["smartQuotesTo"] + warnings.warn( + "BS4 does not respect the smartQuotesTo argument to the " + "BeautifulSoup constructor. Smart quotes are always converted " + "to Unicode characters." + ) + + if "selfClosingTags" in kwargs: + del kwargs["selfClosingTags"] + warnings.warn( + "Beautiful Soup 4 does not respect the selfClosingTags argument to the " + "BeautifulSoup constructor. The tree builder is responsible " + "for understanding self-closing tags." + ) + + if "isHTML" in kwargs: + del kwargs["isHTML"] + warnings.warn( + "Beautiful Soup 4 does not respect the isHTML argument to the " + "BeautifulSoup constructor. Suggest you use " + "features='lxml' for HTML and features='lxml-xml' for " + "XML." + ) + + def deprecated_argument(old_name: str, new_name: str) -> Optional[Any]: + if old_name in kwargs: + warnings.warn( + 'The "%s" argument to the BeautifulSoup constructor ' + 'was renamed to "%s" in Beautiful Soup 4.0.0' + % (old_name, new_name), + DeprecationWarning, + stacklevel=3, + ) + return kwargs.pop(old_name) + return None + + parse_only = parse_only or deprecated_argument("parseOnlyThese", "parse_only") + if parse_only is not None: + # Issue a warning if we can tell in advance that + # parse_only will exclude the entire tree. + if parse_only.excludes_everything: + warnings.warn( + f"The given value for parse_only will exclude everything: {parse_only}", + UserWarning, + stacklevel=3, + ) + + from_encoding = from_encoding or deprecated_argument( + "fromEncoding", "from_encoding" + ) + + if from_encoding and isinstance(markup, str): + warnings.warn( + "You provided Unicode markup but also provided a value for from_encoding. Your from_encoding will be ignored." + ) + from_encoding = None + + self.element_classes = element_classes or dict() + + # We need this information to track whether or not the builder + # was specified well enough that we can omit the 'you need to + # specify a parser' warning. + original_builder = builder + original_features = features + + builder_class: Optional[Type[TreeBuilder]] = None + if isinstance(builder, type): + # A builder class was passed in; it needs to be instantiated. + builder_class = builder + builder = None + elif builder is None: + if isinstance(features, str): + features = [features] + if features is None or len(features) == 0: + features = self.DEFAULT_BUILDER_FEATURES + possible_builder_class = builder_registry.lookup(*features) + if possible_builder_class is None: + raise FeatureNotFound( + "Couldn't find a tree builder with the features you " + "requested: %s. Do you need to install a parser library?" + % ",".join(features) + ) + builder_class = possible_builder_class + + # At this point either we have a TreeBuilder instance in + # builder, or we have a builder_class that we can instantiate + # with the remaining **kwargs. + if builder is None: + assert builder_class is not None + builder = builder_class(**kwargs) + if ( + not original_builder + and not ( + original_features == builder.NAME + or ( + isinstance(original_features, str) + and original_features in builder.ALTERNATE_NAMES + ) + ) + and markup + ): + # The user did not tell us which TreeBuilder to use, + # and we had to guess. Issue a warning. + if builder.is_xml: + markup_type = "XML" + else: + markup_type = "HTML" + + # This code adapted from warnings.py so that we get the same line + # of code as our warnings.warn() call gets, even if the answer is wrong + # (as it may be in a multithreading situation). + caller = None + try: + caller = sys._getframe(1) + except ValueError: + pass + if caller: + globals = caller.f_globals + line_number = caller.f_lineno + else: + globals = sys.__dict__ + line_number = 1 + filename = globals.get("__file__") + if filename: + fnl = filename.lower() + if fnl.endswith((".pyc", ".pyo")): + filename = filename[:-1] + if filename: + # If there is no filename at all, the user is most likely in a REPL, + # and the warning is not necessary. + values = dict( + filename=filename, + line_number=line_number, + parser=builder.NAME, + markup_type=markup_type, + ) + warnings.warn( + GuessedAtParserWarning.MESSAGE % values, + GuessedAtParserWarning, + stacklevel=2, + ) + else: + if kwargs: + warnings.warn( + "Keyword arguments to the BeautifulSoup constructor will be ignored. These would normally be passed into the TreeBuilder constructor, but a TreeBuilder instance was passed in as `builder`." + ) + + self.builder = builder + self.is_xml = builder.is_xml + self.known_xml = self.is_xml + self._namespaces = dict() + self.parse_only = parse_only + + if hasattr(markup, "read"): # It's a file-type object. + markup = cast(io.IOBase, markup).read() + elif not isinstance(markup, (bytes, str)) and not hasattr(markup, "__len__"): + raise TypeError( + f"Incoming markup is of an invalid type: {markup!r}. Markup must be a string, a bytestring, or an open filehandle." + ) + elif isinstance(markup, Sized) and len(markup) <= 256 and ( + (isinstance(markup, bytes) and b"<" not in markup and b"\n" not in markup) + or (isinstance(markup, str) and "<" not in markup and "\n" not in markup) + ): + # Issue warnings for a couple beginner problems + # involving passing non-markup to Beautiful Soup. + # Beautiful Soup will still parse the input as markup, + # since that is sometimes the intended behavior. + if not self._markup_is_url(markup): + self._markup_resembles_filename(markup) + + # At this point we know markup is a string or bytestring. If + # it was a file-type object, we've read from it. + markup = cast(_RawMarkup, markup) + + rejections = [] + success = False + for ( + self.markup, + self.original_encoding, + self.declared_html_encoding, + self.contains_replacement_characters, + ) in self.builder.prepare_markup( + markup, from_encoding, exclude_encodings=exclude_encodings + ): + self.reset() + self.builder.initialize_soup(self) + try: + self._feed() + success = True + break + except ParserRejectedMarkup as e: + rejections.append(e) + pass + + if not success: + other_exceptions = [str(e) for e in rejections] + raise ParserRejectedMarkup( + "The markup you provided was rejected by the parser. Trying a different parser or a different encoding may help.\n\nOriginal exception(s) from parser:\n " + + "\n ".join(other_exceptions) + ) + + # Clear out the markup and remove the builder's circular + # reference to this object. + self.markup = None + self.builder.soup = None + + def copy_self(self) -> "BeautifulSoup": + """Create a new BeautifulSoup object with the same TreeBuilder, + but not associated with any markup. + + This is the first step of the deepcopy process. + """ + clone = type(self)("", None, self.builder) + + # Keep track of the encoding of the original document, + # since we won't be parsing it again. + clone.original_encoding = self.original_encoding + return clone + + def __getstate__(self) -> Dict[str, Any]: + # Frequently a tree builder can't be pickled. + d = dict(self.__dict__) + if "builder" in d and d["builder"] is not None and not self.builder.picklable: + d["builder"] = type(self.builder) + # Store the contents as a Unicode string. + d["contents"] = [] + d["markup"] = self.decode() + + # If _most_recent_element is present, it's a Tag object left + # over from initial parse. It might not be picklable and we + # don't need it. + if "_most_recent_element" in d: + del d["_most_recent_element"] + return d + + def __setstate__(self, state: Dict[str, Any]) -> None: + # If necessary, restore the TreeBuilder by looking it up. + self.__dict__ = state + if isinstance(self.builder, type): + self.builder = self.builder() + elif not self.builder: + # We don't know which builder was used to build this + # parse tree, so use a default we know is always available. + self.builder = HTMLParserTreeBuilder() + self.builder.soup = self + self.reset() + self._feed() + + @classmethod + @_deprecated( + replaced_by="nothing (private method, will be removed)", version="4.13.0" + ) + def _decode_markup(cls, markup: _RawMarkup) -> str: + """Ensure `markup` is Unicode so it's safe to send into warnings.warn. + + warnings.warn had this problem back in 2010 but fortunately + not anymore. This has not been used for a long time; I just + noticed that fact while working on 4.13.0. + """ + if isinstance(markup, bytes): + decoded = markup.decode("utf-8", "replace") + else: + decoded = markup + return decoded + + @classmethod + def _markup_is_url(cls, markup: _RawMarkup) -> bool: + """Error-handling method to raise a warning if incoming markup looks + like a URL. + + :param markup: A string of markup. + :return: Whether or not the markup resembled a URL + closely enough to justify issuing a warning. + """ + problem: bool = False + if isinstance(markup, bytes): + problem = ( + any(markup.startswith(prefix) for prefix in (b"http:", b"https:")) + and b" " not in markup + ) + elif isinstance(markup, str): + problem = ( + any(markup.startswith(prefix) for prefix in ("http:", "https:")) + and " " not in markup + ) + else: + return False + + if not problem: + return False + warnings.warn( + MarkupResemblesLocatorWarning.URL_MESSAGE % dict(what="URL"), + MarkupResemblesLocatorWarning, + stacklevel=3, + ) + return True + + @classmethod + def _markup_resembles_filename(cls, markup: _RawMarkup) -> bool: + """Error-handling method to issue a warning if incoming markup + resembles a filename. + + :param markup: A string of markup. + :return: Whether or not the markup resembled a filename + closely enough to justify issuing a warning. + """ + markup_b: bytes + + # We're only checking ASCII characters, so rather than write + # the same tests twice, convert Unicode to a bytestring and + # operate on the bytestring. + if isinstance(markup, str): + markup_b = markup.encode("utf8") + else: + markup_b = markup + + # Step 1: does it end with a common textual file extension? + filelike = False + lower = markup_b.lower() + extensions = [b".html", b".htm", b".xml", b".xhtml", b".txt"] + if any(lower.endswith(ext) for ext in extensions): + filelike = True + if not filelike: + return False + + # Step 2: it _might_ be a file, but there are a few things + # we can look for that aren't very common in filenames. + + # Characters that have special meaning to Unix shells. (< was + # excluded before this method was called.) + # + # Many of these are also reserved characters that cannot + # appear in Windows filenames. + for byte in markup_b: + if byte in b"?*#&;>$|": + return False + + # Two consecutive forward slashes (as seen in a URL) or two + # consecutive spaces (as seen in fixed-width data). + # + # (Paths to Windows network shares contain consecutive + # backslashes, so checking that doesn't seem as helpful.) + if b"//" in markup_b: + return False + if b" " in markup_b: + return False + + # A colon in any position other than position 1 (e.g. after a + # Windows drive letter). + if markup_b.startswith(b":"): + return False + colon_i = markup_b.rfind(b":") + if colon_i not in (-1, 1): + return False + + # Step 3: If it survived all of those checks, it's similar + # enough to a file to justify issuing a warning. + warnings.warn( + MarkupResemblesLocatorWarning.FILENAME_MESSAGE % dict(what="filename"), + MarkupResemblesLocatorWarning, + stacklevel=3, + ) + return True + + def _feed(self) -> None: + """Internal method that parses previously set markup, creating a large + number of Tag and NavigableString objects. + """ + # Convert the document to Unicode. + self.builder.reset() + + if self.markup is not None: + self.builder.feed(self.markup) + # Close out any unfinished strings and close all the open tags. + self.endData() + while ( + self.currentTag is not None and self.currentTag.name != self.ROOT_TAG_NAME + ): + self.popTag() + + def reset(self) -> None: + """Reset this object to a state as though it had never parsed any + markup. + """ + Tag.__init__(self, self, self.builder, self.ROOT_TAG_NAME) + self.hidden = True + self.builder.reset() + self.current_data = [] + self.currentTag = None + self.tagStack = [] + self.open_tag_counter = Counter() + self.preserve_whitespace_tag_stack = [] + self.string_container_stack = [] + self._most_recent_element = None + self.pushTag(self) + + def new_tag( + self, + name: str, + namespace: Optional[str] = None, + nsprefix: Optional[str] = None, + attrs: Optional[_RawAttributeValues] = None, + sourceline: Optional[int] = None, + sourcepos: Optional[int] = None, + string: Optional[str] = None, + **kwattrs: _RawAttributeValue, + ) -> Tag: + """Create a new Tag associated with this BeautifulSoup object. + + :param name: The name of the new Tag. + :param namespace: The URI of the new Tag's XML namespace, if any. + :param prefix: The prefix for the new Tag's XML namespace, if any. + :param attrs: A dictionary of this Tag's attribute values; can + be used instead of ``kwattrs`` for attributes like 'class' + that are reserved words in Python. + :param sourceline: The line number where this tag was + (purportedly) found in its source document. + :param sourcepos: The character position within ``sourceline`` where this + tag was (purportedly) found. + :param string: String content for the new Tag, if any. + :param kwattrs: Keyword arguments for the new Tag's attribute values. + + """ + attr_container = self.builder.attribute_dict_class(**kwattrs) + if attrs is not None: + attr_container.update(attrs) + tag_class = self.element_classes.get(Tag, Tag) + + # Assume that this is either Tag or a subclass of Tag. If not, + # the user brought type-unsafety upon themselves. + tag_class = cast(Type[Tag], tag_class) + tag = tag_class( + None, + self.builder, + name, + namespace, + nsprefix, + attr_container, + sourceline=sourceline, + sourcepos=sourcepos, + ) + + if string is not None: + tag.string = string + return tag + + def string_container( + self, base_class: Optional[Type[NavigableString]] = None + ) -> Type[NavigableString]: + """Find the class that should be instantiated to hold a given kind of + string. + + This may be a built-in Beautiful Soup class or a custom class passed + in to the BeautifulSoup constructor. + """ + container = base_class or NavigableString + + # The user may want us to use some other class (hopefully a + # custom subclass) instead of the one we'd use normally. + container = cast( + Type[NavigableString], self.element_classes.get(container, container) + ) + + # On top of that, we may be inside a tag that needs a special + # container class. + if self.string_container_stack and container is NavigableString: + container = self.builder.string_containers.get( + self.string_container_stack[-1].name, container + ) + return container + + def new_string( + self, s: str, subclass: Optional[Type[NavigableString]] = None + ) -> NavigableString: + """Create a new `NavigableString` associated with this `BeautifulSoup` + object. + + :param s: The string content of the `NavigableString` + :param subclass: The subclass of `NavigableString`, if any, to + use. If a document is being processed, an appropriate + subclass for the current location in the document will + be determined automatically. + """ + container = self.string_container(subclass) + return container(s) + + def insert_before(self, *args: _InsertableElement) -> List[PageElement]: + """This method is part of the PageElement API, but `BeautifulSoup` doesn't implement + it because there is nothing before or after it in the parse tree. + """ + raise NotImplementedError( + "BeautifulSoup objects don't support insert_before()." + ) + + def insert_after(self, *args: _InsertableElement) -> List[PageElement]: + """This method is part of the PageElement API, but `BeautifulSoup` doesn't implement + it because there is nothing before or after it in the parse tree. + """ + raise NotImplementedError("BeautifulSoup objects don't support insert_after().") + + def popTag(self) -> Optional[Tag]: + """Internal method called by _popToTag when a tag is closed. + + :meta private: + """ + if not self.tagStack: + # Nothing to pop. This shouldn't happen. + return None + tag = self.tagStack.pop() + if tag.name in self.open_tag_counter: + self.open_tag_counter[tag.name] -= 1 + if ( + self.preserve_whitespace_tag_stack + and tag == self.preserve_whitespace_tag_stack[-1] + ): + self.preserve_whitespace_tag_stack.pop() + if self.string_container_stack and tag == self.string_container_stack[-1]: + self.string_container_stack.pop() + # print("Pop", tag.name) + if self.tagStack: + self.currentTag = self.tagStack[-1] + return self.currentTag + + def pushTag(self, tag: Tag) -> None: + """Internal method called by handle_starttag when a tag is opened. + + :meta private: + """ + # print("Push", tag.name) + if self.currentTag is not None: + self.currentTag.contents.append(tag) + self.tagStack.append(tag) + self.currentTag = self.tagStack[-1] + if tag.name != self.ROOT_TAG_NAME: + self.open_tag_counter[tag.name] += 1 + if tag.name in self.builder.preserve_whitespace_tags: + self.preserve_whitespace_tag_stack.append(tag) + if tag.name in self.builder.string_containers: + self.string_container_stack.append(tag) + + def endData(self, containerClass: Optional[Type[NavigableString]] = None) -> None: + """Method called by the TreeBuilder when the end of a data segment + occurs. + + :param containerClass: The class to use when incorporating the + data segment into the parse tree. + + :meta private: + """ + if self.current_data: + current_data = "".join(self.current_data) + # If whitespace is not preserved, and this string contains + # nothing but ASCII spaces, replace it with a single space + # or newline. + if not self.preserve_whitespace_tag_stack: + strippable = True + for i in current_data: + if i not in self.ASCII_SPACES: + strippable = False + break + if strippable: + if "\n" in current_data: + current_data = "\n" + else: + current_data = " " + + # Reset the data collector. + self.current_data = [] + + # Should we add this string to the tree at all? + if ( + self.parse_only + and len(self.tagStack) <= 1 + and (not self.parse_only.allow_string_creation(current_data)) + ): + return + + containerClass = self.string_container(containerClass) + o = containerClass(current_data) + self.object_was_parsed(o) + + def object_was_parsed( + self, + o: PageElement, + parent: Optional[Tag] = None, + most_recent_element: Optional[PageElement] = None, + ) -> None: + """Method called by the TreeBuilder to integrate an object into the + parse tree. + + :meta private: + """ + if parent is None: + parent = self.currentTag + assert parent is not None + previous_element: Optional[PageElement] + if most_recent_element is not None: + previous_element = most_recent_element + else: + previous_element = self._most_recent_element + + next_element = previous_sibling = next_sibling = None + if isinstance(o, Tag): + next_element = o.next_element + next_sibling = o.next_sibling + previous_sibling = o.previous_sibling + if previous_element is None: + previous_element = o.previous_element + + fix = parent.next_element is not None + + o.setup(parent, previous_element, next_element, previous_sibling, next_sibling) + + self._most_recent_element = o + parent.contents.append(o) + + # Check if we are inserting into an already parsed node. + if fix: + self._linkage_fixer(parent) + + def _linkage_fixer(self, el: Tag) -> None: + """Make sure linkage of this fragment is sound.""" + + first = el.contents[0] + child = el.contents[-1] + descendant: PageElement = child + + if child is first and el.parent is not None: + # Parent should be linked to first child + el.next_element = child + # We are no longer linked to whatever this element is + prev_el = child.previous_element + if prev_el is not None and prev_el is not el: + prev_el.next_element = None + # First child should be linked to the parent, and no previous siblings. + child.previous_element = el + child.previous_sibling = None + + # We have no sibling as we've been appended as the last. + child.next_sibling = None + + # This index is a tag, dig deeper for a "last descendant" + if isinstance(child, Tag) and child.contents: + # _last_decendant is typed as returning Optional[PageElement], + # but the value can't be None here, because el is a Tag + # which we know has contents. + descendant = cast(PageElement, child._last_descendant(False)) + + # As the final step, link last descendant. It should be linked + # to the parent's next sibling (if found), else walk up the chain + # and find a parent with a sibling. It should have no next sibling. + descendant.next_element = None + descendant.next_sibling = None + + target: Optional[Tag] = el + while True: + if target is None: + break + elif target.next_sibling is not None: + descendant.next_element = target.next_sibling + target.next_sibling.previous_element = child + break + target = target.parent + + def _popToTag( + self, name: str, nsprefix: Optional[str] = None, inclusivePop: bool = True + ) -> Optional[Tag]: + """Pops the tag stack up to and including the most recent + instance of the given tag. + + If there are no open tags with the given name, nothing will be + popped. + + :param name: Pop up to the most recent tag with this name. + :param nsprefix: The namespace prefix that goes with `name`. + :param inclusivePop: It this is false, pops the tag stack up + to but *not* including the most recent instqance of the + given tag. + + :meta private: + """ + # print("Popping to %s" % name) + if name == self.ROOT_TAG_NAME: + # The BeautifulSoup object itself can never be popped. + return None + + most_recently_popped = None + + stack_size = len(self.tagStack) + for i in range(stack_size - 1, 0, -1): + if not self.open_tag_counter.get(name): + break + t = self.tagStack[i] + if name == t.name and nsprefix == t.prefix: + if inclusivePop: + most_recently_popped = self.popTag() + break + most_recently_popped = self.popTag() + + return most_recently_popped + + def handle_starttag( + self, + name: str, + namespace: Optional[str], + nsprefix: Optional[str], + attrs: _RawAttributeValues, + sourceline: Optional[int] = None, + sourcepos: Optional[int] = None, + namespaces: Optional[Dict[str, str]] = None, + ) -> Optional[Tag]: + """Called by the tree builder when a new tag is encountered. + + :param name: Name of the tag. + :param nsprefix: Namespace prefix for the tag. + :param attrs: A dictionary of attribute values. Note that + attribute values are expected to be simple strings; processing + of multi-valued attributes such as "class" comes later. + :param sourceline: The line number where this tag was found in its + source document. + :param sourcepos: The character position within `sourceline` where this + tag was found. + :param namespaces: A dictionary of all namespace prefix mappings + currently in scope in the document. + + If this method returns None, the tag was rejected by an active + `ElementFilter`. You should proceed as if the tag had not occurred + in the document. For instance, if this was a self-closing tag, + don't call handle_endtag. + + :meta private: + """ + # print("Start tag %s: %s" % (name, attrs)) + self.endData() + + if ( + self.parse_only + and len(self.tagStack) <= 1 + and not self.parse_only.allow_tag_creation(nsprefix, name, attrs) + ): + return None + + tag_class = self.element_classes.get(Tag, Tag) + # Assume that this is either Tag or a subclass of Tag. If not, + # the user brought type-unsafety upon themselves. + tag_class = cast(Type[Tag], tag_class) + tag = tag_class( + self, + self.builder, + name, + namespace, + nsprefix, + attrs, + self.currentTag, + self._most_recent_element, + sourceline=sourceline, + sourcepos=sourcepos, + namespaces=namespaces, + ) + if tag is None: + return tag + if self._most_recent_element is not None: + self._most_recent_element.next_element = tag + self._most_recent_element = tag + self.pushTag(tag) + return tag + + def handle_endtag(self, name: str, nsprefix: Optional[str] = None) -> None: + """Called by the tree builder when an ending tag is encountered. + + :param name: Name of the tag. + :param nsprefix: Namespace prefix for the tag. + + :meta private: + """ + # print("End tag: " + name) + self.endData() + self._popToTag(name, nsprefix) + + def handle_data(self, data: str) -> None: + """Called by the tree builder when a chunk of textual data is + encountered. + + :meta private: + """ + self.current_data.append(data) + + def decode( + self, + indent_level: Optional[int] = None, + eventual_encoding: _Encoding = DEFAULT_OUTPUT_ENCODING, + formatter: Union[Formatter, str] = "minimal", + iterator: Optional[Iterator[PageElement]] = None, + **kwargs: Any, + ) -> str: + """Returns a string representation of the parse tree + as a full HTML or XML document. + + :param indent_level: Each line of the rendering will be + indented this many levels. (The ``formatter`` decides what a + 'level' means, in terms of spaces or other characters + output.) This is used internally in recursive calls while + pretty-printing. + :param eventual_encoding: The encoding of the final document. + If this is None, the document will be a Unicode string. + :param formatter: Either a `Formatter` object, or a string naming one of + the standard formatters. + :param iterator: The iterator to use when navigating over the + parse tree. This is only used by `Tag.decode_contents` and + you probably won't need to use it. + """ + if self.is_xml: + # Print the XML declaration + encoding_part = "" + declared_encoding: Optional[str] = eventual_encoding + if eventual_encoding in PYTHON_SPECIFIC_ENCODINGS: + # This is a special Python encoding; it can't actually + # go into an XML document because it means nothing + # outside of Python. + declared_encoding = None + if declared_encoding is not None: + encoding_part = ' encoding="%s"' % declared_encoding + prefix = '\n' % encoding_part + else: + prefix = "" + + # Prior to 4.13.0, the first argument to this method was a + # bool called pretty_print, which gave the method a different + # signature from its superclass implementation, Tag.decode. + # + # The signatures of the two methods now match, but just in + # case someone is still passing a boolean in as the first + # argument to this method (or a keyword argument with the old + # name), we can handle it and put out a DeprecationWarning. + warning: Optional[str] = None + pretty_print: Optional[bool] = None + if isinstance(indent_level, bool): + if indent_level is True: + indent_level = 0 + elif indent_level is False: + indent_level = None + warning = f"As of 4.13.0, the first argument to BeautifulSoup.decode has been changed from bool to int, to match Tag.decode. Pass in a value of {indent_level} instead." + else: + pretty_print = kwargs.pop("pretty_print", None) + assert not kwargs + if pretty_print is not None: + if pretty_print is True: + indent_level = 0 + elif pretty_print is False: + indent_level = None + warning = f"As of 4.13.0, the pretty_print argument to BeautifulSoup.decode has been removed, to match Tag.decode. Pass in a value of indent_level={indent_level} instead." + + if warning: + warnings.warn(warning, DeprecationWarning, stacklevel=2) + elif indent_level is False or pretty_print is False: + indent_level = None + return prefix + super(BeautifulSoup, self).decode( + indent_level, eventual_encoding, formatter, iterator + ) + + +# Aliases to make it easier to get started quickly, e.g. 'from bs4 import _soup' +_s = BeautifulSoup +_soup = BeautifulSoup + + +class BeautifulStoneSoup(BeautifulSoup): + """Deprecated interface to an XML parser.""" + + def __init__(self, *args: Any, **kwargs: Any): + kwargs["features"] = "xml" + warnings.warn( + "The BeautifulStoneSoup class was deprecated in version 4.0.0. Instead of using " + 'it, pass features="xml" into the BeautifulSoup constructor.', + DeprecationWarning, + stacklevel=2, + ) + super(BeautifulStoneSoup, self).__init__(*args, **kwargs) + + +# If this file is run as a script, act as an HTML pretty-printer. +if __name__ == "__main__": + import sys + + soup = BeautifulSoup(sys.stdin) + print((soup.prettify())) diff --git a/code-server-config/.local/lib/python3.12/site-packages/bs4/_deprecation.py b/code-server-config/.local/lib/python3.12/site-packages/bs4/_deprecation.py new file mode 100755 index 0000000..a7b5685 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/bs4/_deprecation.py @@ -0,0 +1,80 @@ +"""Helper functions for deprecation. + +This interface is itself unstable and may change without warning. Do +not use these functions yourself, even as a joke. The underscores are +there for a reason. No support will be given. + +In particular, most of this will go away without warning once +Beautiful Soup drops support for Python 3.11, since Python 3.12 +defines a `@typing.deprecated() +decorator. `_ +""" + +import functools +import warnings + +from typing import ( + Any, + Callable, +) + + +def _deprecated_alias(old_name: str, new_name: str, version: str): + """Alias one attribute name to another for backward compatibility + + :meta private: + """ + + @property # type:ignore + def alias(self) -> Any: + ":meta private:" + warnings.warn( + f"Access to deprecated property {old_name}. (Replaced by {new_name}) -- Deprecated since version {version}.", + DeprecationWarning, + stacklevel=2, + ) + return getattr(self, new_name) + + @alias.setter + def alias(self, value: str) -> None: + ":meta private:" + warnings.warn( + f"Write to deprecated property {old_name}. (Replaced by {new_name}) -- Deprecated since version {version}.", + DeprecationWarning, + stacklevel=2, + ) + return setattr(self, new_name, value) + + return alias + + +def _deprecated_function_alias( + old_name: str, new_name: str, version: str +) -> Callable[[Any], Any]: + def alias(self, *args: Any, **kwargs: Any) -> Any: + ":meta private:" + warnings.warn( + f"Call to deprecated method {old_name}. (Replaced by {new_name}) -- Deprecated since version {version}.", + DeprecationWarning, + stacklevel=2, + ) + return getattr(self, new_name)(*args, **kwargs) + + return alias + + +def _deprecated(replaced_by: str, version: str) -> Callable: + def deprecate(func: Callable) -> Callable: + @functools.wraps(func) + def with_warning(*args: Any, **kwargs: Any) -> Any: + ":meta private:" + warnings.warn( + f"Call to deprecated method {func.__name__}. (Replaced by {replaced_by}) -- Deprecated since version {version}.", + DeprecationWarning, + stacklevel=2, + ) + return func(*args, **kwargs) + + return with_warning + + return deprecate diff --git a/code-server-config/.local/lib/python3.12/site-packages/bs4/_typing.py b/code-server-config/.local/lib/python3.12/site-packages/bs4/_typing.py new file mode 100755 index 0000000..0ab69df --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/bs4/_typing.py @@ -0,0 +1,205 @@ +# Custom type aliases used throughout Beautiful Soup to improve readability. + +# Notes on improvements to the type system in newer versions of Python +# that can be used once Beautiful Soup drops support for older +# versions: +# +# * ClassVar can be put on class variables now. +# * In 3.10, x|y is an accepted shorthand for Union[x,y]. +# * In 3.10, TypeAlias gains capabilities that can be used to +# improve the tree matching types (I don't remember what, exactly). +# * In 3.9 it's possible to specialize the re.Match type, +# e.g. re.Match[str]. In 3.8 there's a typing.re namespace for this, +# but it's removed in 3.12, so to support the widest possible set of +# versions I'm not using it. + +from typing_extensions import ( + runtime_checkable, + Protocol, + TypeAlias, +) +from typing import ( + Any, + Callable, + Dict, + IO, + Iterable, + Mapping, + Optional, + Pattern, + TYPE_CHECKING, + Union, +) + +if TYPE_CHECKING: + from bs4.element import ( + AttributeValueList, + NamespacedAttribute, + NavigableString, + PageElement, + ResultSet, + Tag, + ) + + +@runtime_checkable +class _RegularExpressionProtocol(Protocol): + """A protocol object which can accept either Python's built-in + `re.Pattern` objects, or the similar ``Regex`` objects defined by the + third-party ``regex`` package. + """ + + def search( + self, string: str, pos: int = ..., endpos: int = ... + ) -> Optional[Any]: ... + + @property + def pattern(self) -> str: ... + + +# Aliases for markup in various stages of processing. +# +#: The rawest form of markup: either a string, bytestring, or an open filehandle. +_IncomingMarkup: TypeAlias = Union[str, bytes, IO[str], IO[bytes]] + +#: Markup that is in memory but has (potentially) yet to be converted +#: to Unicode. +_RawMarkup: TypeAlias = Union[str, bytes] + +# Aliases for character encodings +# + +#: A data encoding. +_Encoding: TypeAlias = str + +#: One or more data encodings. +_Encodings: TypeAlias = Iterable[_Encoding] + +# Aliases for XML namespaces +# + +#: The prefix for an XML namespace. +_NamespacePrefix: TypeAlias = str + +#: The URL of an XML namespace +_NamespaceURL: TypeAlias = str + +#: A mapping of prefixes to namespace URLs. +_NamespaceMapping: TypeAlias = Dict[_NamespacePrefix, _NamespaceURL] + +#: A mapping of namespace URLs to prefixes +_InvertedNamespaceMapping: TypeAlias = Dict[_NamespaceURL, _NamespacePrefix] + +# Aliases for the attribute values associated with HTML/XML tags. +# + +#: The value associated with an HTML or XML attribute. This is the +#: relatively unprocessed value Beautiful Soup expects to come from a +#: `TreeBuilder`. +_RawAttributeValue: TypeAlias = str + +#: A dictionary of names to `_RawAttributeValue` objects. This is how +#: Beautiful Soup expects a `TreeBuilder` to represent a tag's +#: attribute values. +_RawAttributeValues: TypeAlias = ( + "Mapping[Union[str, NamespacedAttribute], _RawAttributeValue]" +) + +#: An attribute value in its final form, as stored in the +# `Tag` class, after it has been processed and (in some cases) +# split into a list of strings. +_AttributeValue: TypeAlias = Union[str, "AttributeValueList"] + +#: A dictionary of names to :py:data:`_AttributeValue` objects. This is what +#: a tag's attributes look like after processing. +_AttributeValues: TypeAlias = Dict[str, _AttributeValue] + +#: The methods that deal with turning :py:data:`_RawAttributeValue` into +#: :py:data:`_AttributeValue` may be called several times, even after the values +#: are already processed (e.g. when cloning a tag), so they need to +#: be able to acommodate both possibilities. +_RawOrProcessedAttributeValues: TypeAlias = Union[_RawAttributeValues, _AttributeValues] + +#: A number of tree manipulation methods can take either a `PageElement` or a +#: normal Python string (which will be converted to a `NavigableString`). +_InsertableElement: TypeAlias = Union["PageElement", str] + +# Aliases to represent the many possibilities for matching bits of a +# parse tree. +# +# This is very complicated because we're applying a formal type system +# to some very DWIM code. The types we end up with will be the types +# of the arguments to the SoupStrainer constructor and (more +# familiarly to Beautiful Soup users) the find* methods. + +#: A function that takes a PageElement and returns a yes-or-no answer. +_PageElementMatchFunction: TypeAlias = Callable[["PageElement"], bool] + +#: A function that takes the raw parsed ingredients of a markup tag +#: and returns a yes-or-no answer. +# Not necessary at the moment. +# _AllowTagCreationFunction:TypeAlias = Callable[[Optional[str], str, Optional[_RawAttributeValues]], bool] + +#: A function that takes the raw parsed ingredients of a markup string node +#: and returns a yes-or-no answer. +# Not necessary at the moment. +# _AllowStringCreationFunction:TypeAlias = Callable[[Optional[str]], bool] + +#: A function that takes a `Tag` and returns a yes-or-no answer. +#: A `TagNameMatchRule` expects this kind of function, if you're +#: going to pass it a function. +_TagMatchFunction: TypeAlias = Callable[["Tag"], bool] + +#: A function that takes a string (or None) and returns a yes-or-no +#: answer. An `AttributeValueMatchRule` expects this kind of function, if +#: you're going to pass it a function. +_NullableStringMatchFunction: TypeAlias = Callable[[Optional[str]], bool] + +#: A function that takes a string and returns a yes-or-no answer. A +# `StringMatchRule` expects this kind of function, if you're going to +# pass it a function. +_StringMatchFunction: TypeAlias = Callable[[str], bool] + +#: Either a tag name, an attribute value or a string can be matched +#: against a string, bytestring, regular expression, or a boolean. +_BaseStrainable: TypeAlias = Union[str, bytes, Pattern[str], bool] + +#: A tag can be matched either with the `_BaseStrainable` options, or +#: using a function that takes the `Tag` as its sole argument. +_BaseStrainableElement: TypeAlias = Union[_BaseStrainable, _TagMatchFunction] + +#: A tag's attribute value can be matched either with the +#: `_BaseStrainable` options, or using a function that takes that +#: value as its sole argument. +_BaseStrainableAttribute: TypeAlias = Union[_BaseStrainable, _NullableStringMatchFunction] + +#: A tag can be matched using either a single criterion or a list of +#: criteria. +_StrainableElement: TypeAlias = Union[ + _BaseStrainableElement, Iterable[_BaseStrainableElement] +] + +#: An attribute value can be matched using either a single criterion +#: or a list of criteria. +_StrainableAttribute: TypeAlias = Union[ + _BaseStrainableAttribute, Iterable[_BaseStrainableAttribute] +] + +#: An string can be matched using the same techniques as +#: an attribute value. +_StrainableString: TypeAlias = _StrainableAttribute + +#: A dictionary may be used to match against multiple attribute vlaues at once. +_StrainableAttributes: TypeAlias = Dict[str, _StrainableAttribute] + +#: Many Beautiful soup methods return a PageElement or an ResultSet of +#: PageElements. A PageElement is either a Tag or a NavigableString. +#: These convenience aliases make it easier for IDE users to see which methods +#: are available on the objects they're dealing with. +_OneElement: TypeAlias = Union["PageElement", "Tag", "NavigableString"] +_AtMostOneElement: TypeAlias = Optional[_OneElement] +_AtMostOneTag: TypeAlias = Optional["Tag"] +_AtMostOneNavigableString: TypeAlias = Optional["NavigableString"] +_QueryResults: TypeAlias = "ResultSet[_OneElement]" +_SomeTags: TypeAlias = "ResultSet[Tag]" +_SomeNavigableStrings: TypeAlias = "ResultSet[NavigableString]" diff --git a/code-server-config/.local/lib/python3.12/site-packages/bs4/_warnings.py b/code-server-config/.local/lib/python3.12/site-packages/bs4/_warnings.py new file mode 100755 index 0000000..4309473 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/bs4/_warnings.py @@ -0,0 +1,98 @@ +"""Define some custom warnings.""" + + +class GuessedAtParserWarning(UserWarning): + """The warning issued when BeautifulSoup has to guess what parser to + use -- probably because no parser was specified in the constructor. + """ + + MESSAGE: str = """No parser was explicitly specified, so I'm using the best available %(markup_type)s parser for this system ("%(parser)s"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently. + +The code that caused this warning is on line %(line_number)s of the file %(filename)s. To get rid of this warning, pass the additional argument 'features="%(parser)s"' to the BeautifulSoup constructor. +""" + + +class UnusualUsageWarning(UserWarning): + """A superclass for warnings issued when Beautiful Soup sees + something that is typically the result of a mistake in the calling + code, but might be intentional on the part of the user. If it is + in fact intentional, you can filter the individual warning class + to get rid of the warning. If you don't like Beautiful Soup + second-guessing what you are doing, you can filter the + UnusualUsageWarningclass itself and get rid of these entirely. + """ + + +class MarkupResemblesLocatorWarning(UnusualUsageWarning): + """The warning issued when BeautifulSoup is given 'markup' that + actually looks like a resource locator -- a URL or a path to a file + on disk. + """ + + #: :meta private: + GENERIC_MESSAGE: str = """ + +However, if you want to parse some data that happens to look like a %(what)s, then nothing has gone wrong: you are using Beautiful Soup correctly, and this warning is spurious and can be filtered. To make this warning go away, run this code before calling the BeautifulSoup constructor: + + from bs4 import MarkupResemblesLocatorWarning + import warnings + + warnings.filterwarnings("ignore", category=MarkupResemblesLocatorWarning) + """ + + URL_MESSAGE: str = ( + """The input passed in on this line looks more like a URL than HTML or XML. + +If you meant to use Beautiful Soup to parse the web page found at a certain URL, then something has gone wrong. You should use an Python package like 'requests' to fetch the content behind the URL. Once you have the content as a string, you can feed that string into Beautiful Soup.""" + + GENERIC_MESSAGE + ) + + FILENAME_MESSAGE: str = ( + """The input passed in on this line looks more like a filename than HTML or XML. + +If you meant to use Beautiful Soup to parse the contents of a file on disk, then something has gone wrong. You should open the file first, using code like this: + + filehandle = open(your filename) + +You can then feed the open filehandle into Beautiful Soup instead of using the filename.""" + + GENERIC_MESSAGE + ) + + +class AttributeResemblesVariableWarning(UnusualUsageWarning, SyntaxWarning): + """The warning issued when Beautiful Soup suspects a provided + attribute name may actually be the misspelled name of a Beautiful + Soup variable. Generally speaking, this is only used in cases like + "_class" where it's very unlikely the user would be referencing an + XML attribute with that name. + """ + + MESSAGE: str = """%(original)r is an unusual attribute name and is a common misspelling for %(autocorrect)r. + +If you meant %(autocorrect)r, change your code to use it, and this warning will go away. + +If you really did mean to check the %(original)r attribute, this warning is spurious and can be filtered. To make it go away, run this code before creating your BeautifulSoup object: + + from bs4 import AttributeResemblesVariableWarning + import warnings + + warnings.filterwarnings("ignore", category=AttributeResemblesVariableWarning) +""" + + +class XMLParsedAsHTMLWarning(UnusualUsageWarning): + """The warning issued when an HTML parser is used to parse + XML that is not (as far as we can tell) XHTML. + """ + + MESSAGE: str = """It looks like you're using an HTML parser to parse an XML document. + +Assuming this really is an XML document, what you're doing might work, but you should know that using an XML parser will be more reliable. To parse this document as XML, make sure you have the Python package 'lxml' installed, and pass the keyword argument `features="xml"` into the BeautifulSoup constructor. + +If you want or need to use an HTML parser on this document, you can make this warning go away by filtering it. To do that, run this code before calling the BeautifulSoup constructor: + + from bs4 import XMLParsedAsHTMLWarning + import warnings + + warnings.filterwarnings("ignore", category=XMLParsedAsHTMLWarning) +""" diff --git a/code-server-config/.local/lib/python3.12/site-packages/bs4/builder/__init__.py b/code-server-config/.local/lib/python3.12/site-packages/bs4/builder/__init__.py new file mode 100755 index 0000000..4aae4d3 --- /dev/null +++ b/code-server-config/.local/lib/python3.12/site-packages/bs4/builder/__init__.py @@ -0,0 +1,848 @@ +from __future__ import annotations + +# Use of this source code is governed by the MIT license. +__license__ = "MIT" + +from collections import defaultdict +import re +from types import ModuleType +from typing import ( + Any, + cast, + Dict, + Iterable, + List, + Optional, + Pattern, + Set, + Tuple, + Type, + TYPE_CHECKING, +) +import warnings +import sys +from bs4.element import ( + AttributeDict, + AttributeValueList, + CharsetMetaAttributeValue, + ContentMetaAttributeValue, + RubyParenthesisString, + RubyTextString, + Stylesheet, + Script, + TemplateString, + nonwhitespace_re, +) + +# Exceptions were moved to their own module in 4.13. Import here for +# backwards compatibility. +from bs4.exceptions import ParserRejectedMarkup + +from bs4._typing import ( + _AttributeValues, + _RawAttributeValue, +) + +from bs4._warnings import XMLParsedAsHTMLWarning + +if TYPE_CHECKING: + from bs4 import BeautifulSoup + from bs4.element import ( + NavigableString, + Tag, + ) + from bs4._typing import ( + _AttributeValue, + _Encoding, + _Encodings, + _RawOrProcessedAttributeValues, + _RawMarkup, + ) + +__all__ = [ + "HTMLTreeBuilder", + "SAXTreeBuilder", + "TreeBuilder", + "TreeBuilderRegistry", +] + +# Some useful features for a TreeBuilder to have. +FAST = "fast" +PERMISSIVE = "permissive" +STRICT = "strict" +XML = "xml" +HTML = "html" +HTML_5 = "html5" + +__all__ = [ + "TreeBuilderRegistry", + "TreeBuilder", + "HTMLTreeBuilder", + "DetectsXMLParsedAsHTML", + + "ParserRejectedMarkup", # backwards compatibility only as of 4.13.0 +] + +class TreeBuilderRegistry(object): + """A way of looking up TreeBuilder subclasses by their name or by desired + features. + """ + + builders_for_feature: Dict[str, List[Type[TreeBuilder]]] + builders: List[Type[TreeBuilder]] + + def __init__(self) -> None: + self.builders_for_feature = defaultdict(list) + self.builders = [] + + def register(self, treebuilder_class: type[TreeBuilder]) -> None: + """Register a treebuilder based on its advertised features. + + :param treebuilder_class: A subclass of `TreeBuilder`. its + `TreeBuilder.features` attribute should list its features. + """ + for feature in treebuilder_class.features: + self.builders_for_feature[feature].insert(0, treebuilder_class) + self.builders.insert(0, treebuilder_class) + + def lookup(self, *features: str) -> Optional[Type[TreeBuilder]]: + """Look up a TreeBuilder subclass with the desired features. + + :param features: A list of features to look for. If none are + provided, the most recently registered TreeBuilder subclass + will be used. + :return: A TreeBuilder subclass, or None if there's no + registered subclass with all the requested features. + """ + if len(self.builders) == 0: + # There are no builders at all. + return None + + if len(features) == 0: + # They didn't ask for any features. Give them the most + # recently registered builder. + return self.builders[0] + + # Go down the list of features in order, and eliminate any builders + # that don't match every feature. + feature_list = list(features) + feature_list.reverse() + candidates = None + candidate_set = None + while len(feature_list) > 0: + feature = feature_list.pop() + we_have_the_feature = self.builders_for_feature.get(feature, []) + if len(we_have_the_feature) > 0: + if candidates is None: + candidates = we_have_the_feature + candidate_set = set(candidates) + elif candidate_set is not None: + # Eliminate any candidates that don't have this feature. + candidate_set = candidate_set.intersection(set(we_have_the_feature)) + + # The only valid candidates are the ones in candidate_set. + # Go through the original list of candidates and pick the first one + # that's in candidate_set. + if candidate_set is None or candidates is None: + return None + for candidate in candidates: + if candidate in candidate_set: + return candidate + return None + + +#: The `BeautifulSoup` constructor will take a list of features +#: and use it to look up `TreeBuilder` classes in this registry. +builder_registry: TreeBuilderRegistry = TreeBuilderRegistry() + + +class TreeBuilder(object): + """Turn a textual document into a Beautiful Soup object tree. + + This is an abstract superclass which smooths out the behavior of + different parser libraries into a single, unified interface. + + :param multi_valued_attributes: If this is set to None, the + TreeBuilder will not turn any values for attributes like + 'class' into lists. Setting this to a dictionary will + customize this behavior; look at :py:attr:`bs4.builder.HTMLTreeBuilder.DEFAULT_CDATA_LIST_ATTRIBUTES` + for an example. + + Internally, these are called "CDATA list attributes", but that + probably doesn't make sense to an end-user, so the argument name + is ``multi_valued_attributes``. + + :param preserve_whitespace_tags: A set of tags to treat + the way
 tags are treated in HTML. Tags in this set
+     are immune from pretty-printing; their contents will always be
+     output as-is.
+
+    :param string_containers: A dictionary mapping tag names to
+     the classes that should be instantiated to contain the textual
+     contents of those tags. The default is to use NavigableString
+     for every tag, no matter what the name. You can override the
+     default by changing :py:attr:`DEFAULT_STRING_CONTAINERS`.
+
+    :param store_line_numbers: If the parser keeps track of the line
+     numbers and positions of the original markup, that information
+     will, by default, be stored in each corresponding
+     :py:class:`bs4.element.Tag` object. You can turn this off by
+     passing store_line_numbers=False; then Tag.sourcepos and
+     Tag.sourceline will always be None. If the parser you're using
+     doesn't keep track of this information, then store_line_numbers
+     is irrelevant.
+
+    :param attribute_dict_class: The value of a multi-valued attribute
+      (such as HTML's 'class') willl be stored in an instance of this
+      class.  The default is Beautiful Soup's built-in
+      `AttributeValueList`, which is a normal Python list, and you
+      will probably never need to change it.
+    """
+
+    USE_DEFAULT: Any = object()  #: :meta private:
+
+    def __init__(
+        self,
+        multi_valued_attributes: Dict[str, Set[str]] = USE_DEFAULT,
+        preserve_whitespace_tags: Set[str] = USE_DEFAULT,
+        store_line_numbers: bool = USE_DEFAULT,
+        string_containers: Dict[str, Type[NavigableString]] = USE_DEFAULT,
+        empty_element_tags: Set[str] = USE_DEFAULT,
+        attribute_dict_class: Type[AttributeDict] = AttributeDict,
+        attribute_value_list_class: Type[AttributeValueList] = AttributeValueList,
+    ):
+        self.soup = None
+        if multi_valued_attributes is self.USE_DEFAULT:
+            multi_valued_attributes = self.DEFAULT_CDATA_LIST_ATTRIBUTES
+        self.cdata_list_attributes = multi_valued_attributes
+        if preserve_whitespace_tags is self.USE_DEFAULT:
+            preserve_whitespace_tags = self.DEFAULT_PRESERVE_WHITESPACE_TAGS
+        self.preserve_whitespace_tags = preserve_whitespace_tags
+        if empty_element_tags is self.USE_DEFAULT:
+            self.empty_element_tags = self.DEFAULT_EMPTY_ELEMENT_TAGS
+        else:
+            self.empty_element_tags = empty_element_tags
+        # TODO: store_line_numbers is probably irrelevant now that
+        # the behavior of sourceline and sourcepos has been made consistent
+        # everywhere.
+        if store_line_numbers == self.USE_DEFAULT:
+            store_line_numbers = self.TRACKS_LINE_NUMBERS
+        self.store_line_numbers = store_line_numbers
+        if string_containers == self.USE_DEFAULT:
+            string_containers = self.DEFAULT_STRING_CONTAINERS
+        self.string_containers = string_containers
+        self.attribute_dict_class = attribute_dict_class
+        self.attribute_value_list_class = attribute_value_list_class
+
+    NAME: str = "[Unknown tree builder]"
+    ALTERNATE_NAMES: Iterable[str] = []
+    features: Iterable[str] = []
+
+    is_xml: bool = False
+    picklable: bool = False
+
+    soup: Optional[BeautifulSoup]  #: :meta private:
+
+    #: A tag will be considered an empty-element
+    #: tag when and only when it has no contents.
+    empty_element_tags: Optional[Set[str]] = None  #: :meta private:
+    cdata_list_attributes: Dict[str, Set[str]]  #: :meta private:
+    preserve_whitespace_tags: Set[str]  #: :meta private:
+    string_containers: Dict[str, Type[NavigableString]]  #: :meta private:
+    tracks_line_numbers: bool  #: :meta private:
+
+    #: A value for these tag/attribute combinations is a space- or
+    #: comma-separated list of CDATA, rather than a single CDATA.
+    DEFAULT_CDATA_LIST_ATTRIBUTES: Dict[str, Set[str]] = defaultdict(set)
+
+    #: Whitespace should be preserved inside these tags.
+    DEFAULT_PRESERVE_WHITESPACE_TAGS: Set[str] = set()
+
+    #: The textual contents of tags with these names should be
+    #: instantiated with some class other than `bs4.element.NavigableString`.
+    DEFAULT_STRING_CONTAINERS: Dict[str, Type[bs4.element.NavigableString]] = {} # type:ignore
+
+    #: By default, tags are treated as empty-element tags if they have
+    #: no contents--that is, using XML rules. HTMLTreeBuilder
+    #: defines a different set of DEFAULT_EMPTY_ELEMENT_TAGS based on the
+    #: HTML 4 and HTML5 standards.
+    DEFAULT_EMPTY_ELEMENT_TAGS: Optional[Set[str]] = None
+
+    #: Most parsers don't keep track of line numbers.
+    TRACKS_LINE_NUMBERS: bool = False
+
+    def initialize_soup(self, soup: BeautifulSoup) -> None:
+        """The BeautifulSoup object has been initialized and is now
+        being associated with the TreeBuilder.
+
+        :param soup: A BeautifulSoup object.
+        """
+        self.soup = soup
+
+    def reset(self) -> None:
+        """Do any work necessary to reset the underlying parser
+        for a new document.
+
+        By default, this does nothing.
+        """
+        pass
+
+    def can_be_empty_element(self, tag_name: str) -> bool:
+        """Might a tag with this name be an empty-element tag?
+
+        The final markup may or may not actually present this tag as
+        self-closing.
+
+        For instance: an HTMLBuilder does not consider a 

tag to be + an empty-element tag (it's not in + HTMLBuilder.empty_element_tags). This means an empty

tag + will be presented as "

", not "

" or "

". + + The default implementation has no opinion about which tags are + empty-element tags, so a tag will be presented as an + empty-element tag if and only if it has no children. + "" will become "", and "bar" will + be left alone. + + :param tag_name: The name of a markup tag. + """ + if self.empty_element_tags is None: + return True + return tag_name in self.empty_element_tags + + def feed(self, markup: _RawMarkup) -> None: + """Run incoming markup through some parsing process.""" + raise NotImplementedError() + + def prepare_markup( + self, + markup: _RawMarkup, + user_specified_encoding: Optional[_Encoding] = None, + document_declared_encoding: Optional[_Encoding] = None, + exclude_encodings: Optional[_Encodings] = None, + ) -> Iterable[Tuple[_RawMarkup, Optional[_Encoding], Optional[_Encoding], bool]]: + """Run any preliminary steps necessary to make incoming markup + acceptable to the parser. + + :param markup: The markup that's about to be parsed. + :param user_specified_encoding: The user asked to try this encoding + to convert the markup into a Unicode string. + :param document_declared_encoding: The markup itself claims to be + in this encoding. NOTE: This argument is not used by the + calling code and can probably be removed. + :param exclude_encodings: The user asked *not* to try any of + these encodings. + + :yield: A series of 4-tuples: (markup, encoding, declared encoding, + has undergone character replacement) + + Each 4-tuple represents a strategy that the parser can try + to convert the document to Unicode and parse it. Each + strategy will be tried in turn. + + By default, the only strategy is to parse the markup + as-is. See `LXMLTreeBuilderForXML` and + `HTMLParserTreeBuilder` for implementations that take into + account the quirks of particular parsers. + + :meta private: + + """ + yield markup, None, None, False + + def test_fragment_to_document(self, fragment: str) -> str: + """Wrap an HTML fragment to make it look like a document. + + Different parsers do this differently. For instance, lxml + introduces an empty tag, and html5lib + doesn't. Abstracting this away lets us write simple tests + which run HTML fragments through the parser and compare the + results against other HTML fragments. + + This method should not be used outside of unit tests. + + :param fragment: A fragment of HTML. + :return: A full HTML document. + :meta private: + """ + return fragment + + def set_up_substitutions(self, tag: Tag) -> bool: + """Set up any substitutions that will need to be performed on + a `Tag` when it's output as a string. + + By default, this does nothing. See `HTMLTreeBuilder` for a + case where this is used. + + :return: Whether or not a substitution was performed. + :meta private: + """ + return False + + def _replace_cdata_list_attribute_values( + self, tag_name: str, attrs: _RawOrProcessedAttributeValues + ) -> _AttributeValues: + """When an attribute value is associated with a tag that can + have multiple values for that attribute, convert the string + value to a list of strings. + + Basically, replaces class="foo bar" with class=["foo", "bar"] + + NOTE: This method modifies its input in place. + + :param tag_name: The name of a tag. + :param attrs: A dictionary containing the tag's attributes. + Any appropriate attribute values will be modified in place. + :return: The modified dictionary that was originally passed in. + """ + + # First, cast the attrs dict to _AttributeValues. This might + # not be accurate yet, but it will be by the time this method + # returns. + modified_attrs = cast(_AttributeValues, attrs) + if not modified_attrs or not self.cdata_list_attributes: + # Nothing to do. + return modified_attrs + + # There is at least a possibility that we need to modify one of + # the attribute values. + universal: Set[str] = self.cdata_list_attributes.get("*", set()) + tag_specific = self.cdata_list_attributes.get(tag_name.lower(), None) + for attr in list(modified_attrs.keys()): + modified_value: _AttributeValue + if attr in universal or (tag_specific and attr in tag_specific): + # We have a "class"-type attribute whose string + # value is a whitespace-separated list of + # values. Split it into a list. + original_value: _AttributeValue = modified_attrs[attr] + if isinstance(original_value, _RawAttributeValue): + # This is a _RawAttributeValue (a string) that + # needs to be split and converted to a + # AttributeValueList so it can be an + # _AttributeValue. + modified_value = self.attribute_value_list_class( + nonwhitespace_re.findall(original_value) + ) + else: + # html5lib calls setAttributes twice for the + # same tag when rearranging the parse tree. On + # the second call the attribute value here is + # already a list. This can also happen when a + # Tag object is cloned. If this happens, leave + # the value alone rather than trying to split + # it again. + modified_value = original_value + modified_attrs[attr] = modified_value + return modified_attrs + + +class SAXTreeBuilder(TreeBuilder): + """A Beautiful Soup treebuilder that listens for SAX events. + + This is not currently used for anything, and it will be removed + soon. It was a good idea, but it wasn't properly integrated into the + rest of Beautiful Soup, so there have been long stretches where it + hasn't worked properly. + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + warnings.warn( + "The SAXTreeBuilder class was deprecated in 4.13.0 and will be removed soon thereafter. It is completely untested and probably doesn't work; do not use it.", + DeprecationWarning, + stacklevel=2, + ) + super(SAXTreeBuilder, self).__init__(*args, **kwargs) + + def feed(self, markup: _RawMarkup) -> None: + raise NotImplementedError() + + def close(self) -> None: + pass + + def startElement(self, name: str, attrs: Dict[str, str]) -> None: + attrs = AttributeDict((key[1], value) for key, value in list(attrs.items())) + # print("Start %s, %r" % (name, attrs)) + assert self.soup is not None + self.soup.handle_starttag(name, None, None, attrs) + + def endElement(self, name: str) -> None: + # print("End %s" % name) + assert self.soup is not None + self.soup.handle_endtag(name) + + def startElementNS( + self, nsTuple: Tuple[str, str], nodeName: str, attrs: Dict[str, str] + ) -> None: + # Throw away (ns, nodeName) for now. + self.startElement(nodeName, attrs) + + def endElementNS(self, nsTuple: Tuple[str, str], nodeName: str) -> None: + # Throw away (ns, nodeName) for now. + self.endElement(nodeName) + # handler.endElementNS((ns, node.nodeName), node.nodeName) + + def startPrefixMapping(self, prefix: str, nodeValue: str) -> None: + # Ignore the prefix for now. + pass + + def endPrefixMapping(self, prefix: str) -> None: + # Ignore the prefix for now. + # handler.endPrefixMapping(prefix) + pass + + def characters(self, content: str) -> None: + assert self.soup is not None + self.soup.handle_data(content) + + def startDocument(self) -> None: + pass + + def endDocument(self) -> None: + pass + + +class HTMLTreeBuilder(TreeBuilder): + """This TreeBuilder knows facts about HTML, such as which tags are treated + specially by the HTML standard. + """ + + #: Some HTML tags are defined as having no contents. Beautiful Soup + #: treats these specially. + DEFAULT_EMPTY_ELEMENT_TAGS: Optional[Set[str]] = set( + [ + # These are from HTML5. + "area", + "base", + "br", + "col", + "embed", + "hr", + "img", + "input", + "keygen", + "link", + "menuitem", + "meta", + "param", + "source", + "track", + "wbr", + # These are from earlier versions of HTML and are removed in HTML5. + "basefont", + "bgsound", + "command", + "frame", + "image", + "isindex", + "nextid", + "spacer", + ] + ) + + #: The HTML standard defines these tags as block-level elements. Beautiful + #: Soup does not treat these elements differently from other elements, + #: but it may do so eventually, and this information is available if + #: you need to use it. + DEFAULT_BLOCK_ELEMENTS: Set[str] = set( + [ + "address", + "article", + "aside", + "blockquote", + "canvas", + "dd", + "div", + "dl", + "dt", + "fieldset", + "figcaption", + "figure", + "footer", + "form", + "h1", + "h2", + "h3", + "h4", + "h5", + "h6", + "header", + "hr", + "li", + "main", + "nav", + "noscript", + "ol", + "output", + "p", + "pre", + "section", + "table", + "tfoot", + "ul", + "video", + ] + ) + + #: These HTML tags need special treatment so they can be + #: represented by a string class other than `bs4.element.NavigableString`. + #: + #: For some of these tags, it's because the HTML standard defines + #: an unusual content model for them. I made this list by going + #: through the HTML spec + #: (https://html.spec.whatwg.org/#metadata-content) and looking for + #: "metadata content" elements that can contain strings. + #: + #: The Ruby tags ( and ) are here despite being normal + #: "phrasing content" tags, because the content they contain is + #: qualitatively different from other text in the document, and it + #: can be useful to be able to distinguish it. + #: + #: TODO: Arguably

+ + +
+
+ +
+
+
+
+
+
{{ car.brand }}
{{ car.model }}
+ + +
+
{{ car.plate }}
{{ (car.status !== 'OK' && car.status !== null) ? 'HIBA' : car.role }}
+
+
+
+
+ +
+ +
+
+
+ +
+

{{ selectedCar.brand }} {{ selectedCar.model }}

{{ selectedCar.plate }}ÁLLAPOT: {{ selectedCar.status }}
+
+
+
+ + +
+
+
+
{{ selectedCar.mileage.toLocaleString() }}
Km
+
{{ (selectedCar.status !== 'OK' && selectedCar.status !== null) ? 'HIBA' : 'OK' }}
Állapot
+
{{ formatMoney(selectedCar.year_cost, selectedCar.currency) }}
Idei költés
+
Hiba:

{{ selectedCar.current_issue }}

Nincs hiba
+
+
+
+
Még üres a szervizkönyv.
+
+
+
+
+
+
{{ translateType(item.type) }}+{{ formatMoney(item.amount, item.currency) }}
+

{{ item.description }}

+
{{ item.mileage.toLocaleString() }} kmCsatolmány
+
+
{{ item.date }}
+
+
+
+
+
+
+ + + + +
+
+ + + + + diff --git a/code-server-config/data/User/History/-52e5c41d/83UF.html b/code-server-config/data/User/History/-52e5c41d/83UF.html new file mode 100755 index 0000000..61441b0 --- /dev/null +++ b/code-server-config/data/User/History/-52e5c41d/83UF.html @@ -0,0 +1,242 @@ + + + + + + Service Finder - Flotta Kezelő + + + + + + +
+
+
+

Service Finder

+
+ + + +

Nincs fiókod? Regisztrálj!

+
+
+ + + +

Vissza a belépéshez

+
+
+
+ +
+ + +
+
+
+

Saját Járművek

+ +
+
+
+
+
+
{{ car.brand }}
+
{{ car.model }}
+
+ {{ car.plate }} + +
+
+
+
+
+ +
+ +
+
+
+

{{ selectedCar.brand }} {{ selectedCar.model }}

+ {{ selectedCar.plate }} +
+
+ +
+
+
+ +
+
+
Km állás
{{ selectedCar.mileage }}
+
Idei költség
{{ formatMoney(selectedCar.year_cost, selectedCar.currency) }}
+
Állapot
{{ selectedCar.status }}
+
+
+
+
+
+ + +
+ + + + + \ No newline at end of file diff --git a/code-server-config/data/User/History/-52e5c41d/9eYi.html b/code-server-config/data/User/History/-52e5c41d/9eYi.html new file mode 100755 index 0000000..f2b47ef --- /dev/null +++ b/code-server-config/data/User/History/-52e5c41d/9eYi.html @@ -0,0 +1,216 @@ + + + + + + Service Finder + + + + + + +
+ + +
+ +
+ +
+
+
+
+
+
{{ car.brand }}
{{ car.model }}
+ + +
+
+
{{ car.plate }}
+ {{ (car.status !== 'OK' && car.status !== null) ? 'HIBA' : car.role }} +
+
+
+
+
+ +
+ + +
+
+
+ +
+
+

{{ selectedCar.brand }} {{ selectedCar.model }}

+
+ {{ selectedCar.plate }} + ÁLLAPOT: {{ selectedCar.status }} +
+
+
+
+ + +
+
+ + + +
+
+
+
{{ selectedCar.mileage.toLocaleString() }}
Km
+
{{ (selectedCar.status !== 'OK' && selectedCar.status !== null) ? 'HIBA' : 'OK' }}
Állapot
+
{{ formatMoney(selectedCar.year_cost, selectedCar.currency) }}
Idei költés
+
+
+
Hiba:

{{ selectedCar.current_issue }}

+
+
Nincs hiba
+
+
+
+ +
+
Még üres a szervizkönyv.
+
+
+
+
+
+
+ {{ translateType(item.type) }} + +{{ formatMoney(item.amount, item.currency) }} +
+

{{ item.description }}

+
+ {{ item.mileage.toLocaleString() }} km + + Csatolmány + +
+
+
{{ item.date }}
+
+
+
+
+
+
+ + + + +
+
+ + + + + \ No newline at end of file diff --git a/code-server-config/data/User/History/-52e5c41d/E3XE.html b/code-server-config/data/User/History/-52e5c41d/E3XE.html new file mode 100755 index 0000000..08185a3 --- /dev/null +++ b/code-server-config/data/User/History/-52e5c41d/E3XE.html @@ -0,0 +1,179 @@ + + + + + Szerviz Kereső - Flotta Menedzser + + + + + +
+ + +
+
+

Service Finder

+ +
+ + + +

Nincs még fiókod? Regisztráció

+
+ +
+ + + +

Vissza a belépéshez

+
+
+
+ +
+
+
+

Garázsom

+ +
+ +
+
+
+
+
{{car.brand}}
+ {{car.plate}} +
+
{{car.model}}
+
+ + +
+
+
+
+
+ +
+ +
+

{{selectedCar.brand}} {{selectedCar.model}}

+

Rendszám: {{selectedCar.plate}}

+
+
+
Állapot
Kiváló
+
Szerviz
Aktuális
+
Csapat
1 Sofőr
+
+
+
+
+ + +
+ + + + + \ No newline at end of file diff --git a/code-server-config/data/User/History/-52e5c41d/J4V4.html b/code-server-config/data/User/History/-52e5c41d/J4V4.html new file mode 100755 index 0000000..0af5ede --- /dev/null +++ b/code-server-config/data/User/History/-52e5c41d/J4V4.html @@ -0,0 +1,200 @@ + + + + + + Service Finder + + + + + + +
+ + +
+ +
+ + +
+
+
+
+
+
{{ car.brand }}
{{ car.model }}
+ + +
+
+
{{ car.plate }}
+ + {{ (car.status !== 'OK' && car.status !== null) ? 'HIBA' : car.role }} + +
+
+
+
+

Csapat...

+
+ +
+ + +
+
+
+ +
+
+

{{ selectedCar.brand }} {{ selectedCar.model }}

+
+ {{ selectedCar.plate }} + ÁLLAPOT: {{ selectedCar.status }} +
+
+
+ +
+ +
+
+
+
{{ selectedCar.mileage }}
Km
+
+
+
+
+ + {{ (selectedCar.status !== 'OK' && selectedCar.status !== null) ? 'HIBA' : 'OK' }} +
+
Műszaki állapot
+
+
+ +
+
+
+
+
Nyitott probléma:
+

{{ selectedCar.current_issue }}

+
+ +
+ A javítás rögzítése naplózásra kerül. +
+ +
+ Nincs nyitott hiba. Az autó útra kész. +
+
+
+
+
+ + + +
+
+ + + + + \ No newline at end of file diff --git a/code-server-config/data/User/History/-52e5c41d/JA3R.html b/code-server-config/data/User/History/-52e5c41d/JA3R.html new file mode 100755 index 0000000..3bfffb8 --- /dev/null +++ b/code-server-config/data/User/History/-52e5c41d/JA3R.html @@ -0,0 +1,247 @@ + + + + + + + Service Finder + + + + + + +
+ + +
+ +
+ + +
+
+

Járművek

+ +
+
+
+
+
+ +
+
{{ car.brand }}
{{ car.model }}
+ + +
+
+
{{ car.plate }}
+ + {{ car.has_issues ? 'HIBA' : translateRole(car.role) }} + +
+
+
+
+
+ +
+

Csapat nézet (változatlan)

+ +
+
+ +
+ + + +
+
+
+ +
+
+

{{ selectedCar.brand }} {{ selectedCar.model }}

+
+ {{ selectedCar.plate }} + HIBA JELENTVE + ÁLLAPOT: OK +
+
+
+
+ + +
+
+ + + +
+
+
+
+
{{ selectedCar.mileage ? selectedCar.mileage.toLocaleString() : 0 }} km
+
Aktuális óraállás
+
+
+
+
+
+ + {{ selectedCar.has_issues ? 'HIBA' : 'OK' }} +
+
Műszaki állapot
+
+
+
+
+
Nyitott probléma:
+

{{ selectedCar.last_issue_text }}

+
+ +
+
+
+ Nincs nyitott hiba. Az autó útra kész. +
+
+
+
+
+ + + +
+
+ + + + + \ No newline at end of file diff --git a/code-server-config/data/User/History/-52e5c41d/Rpxl.html b/code-server-config/data/User/History/-52e5c41d/Rpxl.html new file mode 100755 index 0000000..edd7e7d --- /dev/null +++ b/code-server-config/data/User/History/-52e5c41d/Rpxl.html @@ -0,0 +1,208 @@ + + + + + + Service Finder - Garázs + + + + + + +
+ + +
+ +
+
+

Saját Járművek

+ {{ myCars.length }} db +
+ +
+ +
+
+
+
+
+
{{ car.brand }}
+
{{ car.model }}
+
+ + +
+ +
+
{{ car.plate }}
+ + {{ translateRole(car.role) }} + +
+ +
+ Adatlap megnyitása +
+
+
+ +
+
+
+ +
Új jármű
+
+
+
+
+
+ +
+
+

{{ step }} Új rögzítése

+ +
+ +
+
+
+
+
+
+
+
+ +
+
Jármű: {{ form.brand }} {{ form.model.model }}
+
+
+
+
+
+
+
+
+ +
+ +

Sikeres rögzítés!

+ +
+
+ +
+
+ + + + + \ No newline at end of file diff --git a/code-server-config/data/User/History/-52e5c41d/SVyy.html b/code-server-config/data/User/History/-52e5c41d/SVyy.html new file mode 100755 index 0000000..f55b0a0 --- /dev/null +++ b/code-server-config/data/User/History/-52e5c41d/SVyy.html @@ -0,0 +1,241 @@ + + + + + + Service Finder - Flotta Kezelő + + + + + + +
+
+
+

Service Finder

+
+ + + +

Nincs fiókod? Regisztrálj!

+
+
+ + + +

Vissza a belépéshez

+
+
+
+ +
+ + +
+
+
+

Saját Járművek

+ +
+
+
+
+
+
{{ car.brand }}
+
{{ car.model }}
+
+ {{ car.plate }} + +
+
+
+
+
+ +
+ +
+
+
+

{{ selectedCar.brand }} {{ selectedCar.model }}

+ {{ selectedCar.plate }} +
+
+ +
+
+
+ +
+
+
Km állás
{{ selectedCar.mileage }}
+
Idei költség
{{ formatMoney(selectedCar.year_cost, selectedCar.currency) }}
+
Állapot
{{ selectedCar.status }}
+
+
+
+
+
+ + +
+ + + + + \ No newline at end of file diff --git a/code-server-config/data/User/History/-52e5c41d/Smd7.html b/code-server-config/data/User/History/-52e5c41d/Smd7.html new file mode 100755 index 0000000..54223ec --- /dev/null +++ b/code-server-config/data/User/History/-52e5c41d/Smd7.html @@ -0,0 +1,263 @@ + + + + + + + Service Finder + + + + + + +
+ + +
+ +
+ + +
+
+

Járművek

+ +
+
+
+
+
+
+
{{ car.brand }}
{{ car.model }}
+ +
+
+
{{ car.plate }}
+ {{ translateRole(car.role) }} +
+
+
+
+
+ +
+
+

Munkatársak

+ +
+
Nincs adat
+
+ + + + + + + + + + +
NévSzerepkörOrszágCsatlakozott
Munkatárs
{{member.email}}
{{translateRole(member.role)}}{{member.country}}{{member.joined_at ? member.joined_at.split('T')[0] : ''}}
+
+
+
+ +
+ + + +
+
+
+ +
+
+

{{ selectedCar.brand }} {{ selectedCar.model }}

+
+ {{ selectedCar.plate }} + {{ translateRole(selectedCar.role) }} + {{ selectedCar.vin }} +
+
+
+
+ + +
+
+ + + +
+ +
+
+
+
+
{{ selectedCar.mileage.toLocaleString() }} km
+
Aktuális óraállás
+
+
+
+
+
OK
+
Műszaki állapot
+
+
+
+
+
{{ formatCurrency(0, selectedCar.currency) }}
+
Idei költés
+
+
+
+
+
{{ selectedCar.start_date }}
+
Flottába került
+
+
+
+ +
Legutóbbi aktivitás
+
+ + Még nincs rögzített esemény. +
+
+ +
+
+ +
A szerviztörténet üres
+

Rögzíts tankolást vagy szervizt a jobb felső gombbal!

+
+
+ +
+
Veszélyzóna
+
+

Jármű eltávolítása a flottából vagy eladás.

+ +
+ +
+
+ + + +

Varázsló...

+ +
+
+ + + + + \ No newline at end of file diff --git a/code-server-config/data/User/History/-52e5c41d/SxEq.html b/code-server-config/data/User/History/-52e5c41d/SxEq.html new file mode 100755 index 0000000..428427e --- /dev/null +++ b/code-server-config/data/User/History/-52e5c41d/SxEq.html @@ -0,0 +1,228 @@ + + + + + + Service Finder - Flotta Kezelő + + + + + + +
+
+
+

Service Finder

+
+ + + +

Nincs fiókod? Regisztrálj!

+
+
+ + + +

Vissza a belépéshez

+
+
+
+ +
+ + +
+
+
+

Saját Járművek

+ +
+
+
+
+
+
{{ car.brand }}
+
{{ car.model }}
+
+ {{ car.plate }} + +
+
+
+
+
+ +
+ +
+
+
+

{{ selectedCar.brand }} {{ selectedCar.model }}

+ {{ selectedCar.plate }} +
+
+ +
+
+
+ +
+
+
Km állás
{{ selectedCar.mileage }}
+
Idei költség
{{ formatMoney(selectedCar.year_cost, selectedCar.currency) }}
+
Állapot
{{ selectedCar.status }}
+
+
+
+
+
+ + +
+ + + + + \ No newline at end of file diff --git a/code-server-config/data/User/History/-52e5c41d/UAc0.html b/code-server-config/data/User/History/-52e5c41d/UAc0.html new file mode 100755 index 0000000..f5ed49c --- /dev/null +++ b/code-server-config/data/User/History/-52e5c41d/UAc0.html @@ -0,0 +1,142 @@ + + + + + + Service Finder + + + + + + +
+
+
+

Service Finder

+
+ +
+
+ +
+ +

Nincs fiókod? Regisztráció

+
+
+ +
+ + +
+
+

Garázs

+
Üdv: {{ userEmail }}
+
+ +
+ + Még nincsenek járművek a profilodhoz rendelve. +
Használd a pgAdmint vagy az API-t a járművek hozzárendeléséhez az ID: {{ userId }} felhasználóhoz. +
+ +
+
+
+
+
{{ car.brand }}
+
{{ car.model }}
+ {{ car.plate }} +
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/code-server-config/data/User/History/-52e5c41d/UE2n.html b/code-server-config/data/User/History/-52e5c41d/UE2n.html new file mode 100755 index 0000000..61fe69e --- /dev/null +++ b/code-server-config/data/User/History/-52e5c41d/UE2n.html @@ -0,0 +1,203 @@ + + + + + + Service Finder - Profi Flotta + + + + + + +
+
+
+

Service Finder

+ + + +

Regisztráció

+
+
+ +
+ + +
+
+
+

Garázsom

+ +
+
+
+
+
+
{{ car.brand }}
+
{{ car.model }}
+ {{ car.plate }} +
+
+
+
+ +
+ +
+
+
+

{{ selectedCar.brand }} {{ selectedCar.model }}

+ {{ selectedCar.plate }} +
+
+ + +
+
+
+
Km állás
{{ selectedCar.mileage }}
+
Státusz
{{ selectedCar.status }}
+
Idei költség
{{ formatMoney(selectedCar.year_cost, selectedCar.currency) }}
+
+
+
+
+
+ + + + +
+ + + + + \ No newline at end of file diff --git a/code-server-config/data/User/History/-52e5c41d/W3D5.html b/code-server-config/data/User/History/-52e5c41d/W3D5.html new file mode 100755 index 0000000..9e079e0 --- /dev/null +++ b/code-server-config/data/User/History/-52e5c41d/W3D5.html @@ -0,0 +1,280 @@ +Senior PM-ként mondom: Vettem az adást! 📡 A motor (Backend) már duruzsol, most építsük rá a műszerfalat (Frontend). + +Ez a frissítés a rendszer leglátványosabb része lesz. Amikor rákattintasz egy autóra a Garázsban, az nem csak egy sima ablakot nyit meg, hanem egy teljes Jármű Irányítópultot, három fő füllel: + + Áttekintés (Overview): A legfontosabb adatok (Rendszám, Alvázszám, Aktuális km). + + Szervizkönyv (History): (Egyelőre üres, de ide jönnek majd a bejegyzések). + + Beállítások: Itt lehet majd sofőrt cserélni vagy eladni az autót. + +🎨 Frontend 7.0 – A Részletes Adatlap + +Másold be ezt a kódot. Figyeld meg a formatCurrency függvényt a script alján! Ez már felkészült arra, hogy ha a felhasználó német (EUR), akkor úgy írja ki az összegeket, ha magyar (HUF), akkor meg úgy. +Bash + +echo "--- 🖥️ Frontend 7.0: Jármű Részletes Adatlap (Detail View) ---" + +cat < frontend/index.html + + + + + + Service Finder + + + + + + +
+ + +
+ +
+ + +
+
+

Járművek

+ +
+
+
+
+
+
+
{{ car.brand }}
{{ car.model }}
+ +
+
+
{{ car.plate }}
+ {{ translateRole(car.role) }} +
+
+
+
+
+ +
+
+

Munkatársak

+ +
+
Nincs adat
+
+ + + + + + + + + + +
NévSzerepkörOrszágCsatlakozott
Munkatárs
{{member.email}}
{{translateRole(member.role)}}{{member.country}}{{member.joined_at ? member.joined_at.split('T')[0] : ''}}
+
+
+
+ +
+ + + +
+
+
+ +
+
+

{{ selectedCar.brand }} {{ selectedCar.model }}

+
+ {{ selectedCar.plate }} + {{ translateRole(selectedCar.role) }} + {{ selectedCar.vin }} +
+
+
+
+ + +
+
+ + + +
+ +
+
+
+
+
{{ selectedCar.mileage.toLocaleString() }} km
+
Aktuális óraállás
+
+
+
+
+
OK
+
Műszaki állapot
+
+
+
+
+
{{ formatCurrency(0, selectedCar.currency) }}
+
Idei költés
+
+
+
+
+
{{ selectedCar.start_date }}
+
Flottába került
+
+
+
+ +
Legutóbbi aktivitás
+
+ + Még nincs rögzített esemény. +
+
+ +
+
+ +
A szerviztörténet üres
+

Rögzíts tankolást vagy szervizt a jobb felső gombbal!

+
+
+ +
+
Veszélyzóna
+
+

Jármű eltávolítása a flottából vagy eladás.

+ +
+ +
+
+ + + +

Varázsló...

+ +
+
+ + + + + \ No newline at end of file diff --git a/code-server-config/data/User/History/-52e5c41d/Ycqg.html b/code-server-config/data/User/History/-52e5c41d/Ycqg.html new file mode 100755 index 0000000..d84fb57 --- /dev/null +++ b/code-server-config/data/User/History/-52e5c41d/Ycqg.html @@ -0,0 +1,216 @@ + + + + + + Service Finder + + + + + + +
+ + +
+ +
+ +
+
+
+
+
+
{{ car.brand }}
{{ car.model }}
+ + +
+
+
{{ car.plate }}
+ {{ (car.status !== 'OK' && car.status !== null) ? 'HIBA' : car.role }} +
+
+
+
+
+ +
+ + +
+
+
+ +
+
+

{{ selectedCar.brand }} {{ selectedCar.model }}

+
+ {{ selectedCar.plate }} + ÁLLAPOT: {{ selectedCar.status }} +
+
+
+
+ + +
+
+ + + +
+
+
+
{{ selectedCar.mileage.toLocaleString() }}
Km
+
{{ (selectedCar.status !== 'OK' && selectedCar.status !== null) ? 'HIBA' : 'OK' }}
Állapot
+
{{ formatMoney(selectedCar.year_cost, selectedCar.currency) }}
Idei költés
+
+
+
Hiba:

{{ selectedCar.current_issue }}

+
+
Nincs hiba
+
+
+
+ +
+
Még üres a szervizkönyv.
+
+
+
+
+
+
+ {{ translateType(item.type) }} + +{{ formatMoney(item.amount, item.currency) }} +
+

{{ item.description }}

+
+ {{ item.mileage.toLocaleString() }} km + + Csatolmány + +
+
+
{{ item.date }}
+
+
+
+
+
+
+ + + + +
+
+ + + + + \ No newline at end of file diff --git a/code-server-config/data/User/History/-52e5c41d/eRba.html b/code-server-config/data/User/History/-52e5c41d/eRba.html new file mode 100755 index 0000000..428427e --- /dev/null +++ b/code-server-config/data/User/History/-52e5c41d/eRba.html @@ -0,0 +1,228 @@ + + + + + + Service Finder - Flotta Kezelő + + + + + + +
+
+
+

Service Finder

+
+ + + +

Nincs fiókod? Regisztrálj!

+
+
+ + + +

Vissza a belépéshez

+
+
+
+ +
+ + +
+
+
+

Saját Járművek

+ +
+
+
+
+
+
{{ car.brand }}
+
{{ car.model }}
+
+ {{ car.plate }} + +
+
+
+
+
+ +
+ +
+
+
+

{{ selectedCar.brand }} {{ selectedCar.model }}

+ {{ selectedCar.plate }} +
+
+ +
+
+
+ +
+
+
Km állás
{{ selectedCar.mileage }}
+
Idei költség
{{ formatMoney(selectedCar.year_cost, selectedCar.currency) }}
+
Állapot
{{ selectedCar.status }}
+
+
+
+
+
+ + +
+ + + + + \ No newline at end of file diff --git a/code-server-config/data/User/History/-52e5c41d/eVfD.html b/code-server-config/data/User/History/-52e5c41d/eVfD.html new file mode 100755 index 0000000..ff2b3c3 --- /dev/null +++ b/code-server-config/data/User/History/-52e5c41d/eVfD.html @@ -0,0 +1,195 @@ + + + + + + Service Finder + + + + + + +
+ + +
+
+ +
+
+
+
+
+
{{ car.brand }}
{{ car.model }}
+ + +
+
{{ car.plate }}
{{ (car.status !== 'OK' && car.status !== null) ? 'HIBA' : car.role }}
+
+
+
+
+ +
+ +
+
+
+ +
+

{{ selectedCar.brand }} {{ selectedCar.model }}

{{ selectedCar.plate }}ÁLLAPOT: {{ selectedCar.status }}
+
+
+
+ +
+
+
+
{{ selectedCar.mileage.toLocaleString() }}
Km
+
{{ (selectedCar.status !== 'OK' && selectedCar.status !== null) ? 'HIBA' : 'OK' }}
Állapot
+
{{ formatMoney(selectedCar.year_cost, selectedCar.currency) }}
Idei költés
+
+
Hiba:

{{ selectedCar.current_issue }}

Nincs hiba
+
+
+
+
+
Még üres a szervizkönyv.
+
+
+
+
+
+
{{ translateType(item.type) }}+{{ formatMoney(item.amount, item.currency) }}
+

{{ item.description }}

+
{{ item.mileage.toLocaleString() }} kmCsatolmány
+
+
{{ item.date }}
+
+
+
+
+
+
+ + + + +
+
+ + + + + diff --git a/code-server-config/data/User/History/-52e5c41d/eiJs.html b/code-server-config/data/User/History/-52e5c41d/eiJs.html new file mode 100755 index 0000000..12f248e --- /dev/null +++ b/code-server-config/data/User/History/-52e5c41d/eiJs.html @@ -0,0 +1,157 @@ + + + + + + Service Finder + + + + + + +
+ + +
+ +
+ + +
+
+
+
+
+
{{ car.brand }}
{{ car.model }}
+ + +
+
+
{{ car.plate }}
+ + {{ (car.status !== 'OK' && car.status !== null) ? 'HIBA' : car.role }} + +
+
+
+
+

Csapat...

+
+ +
+ + +
+
+
+ +
+
+

{{ selectedCar.brand }} {{ selectedCar.model }}

+
+ {{ selectedCar.plate }} + ÁLLAPOT: {{ selectedCar.status }} +
+
+
+ +
+ +
+
+
{{ selectedCar.mileage }}
Km
+
+
+
+
Jelentett hiba:
+

{{ selectedCar.current_issue }}

+
+
Minden rendben.
+
+
+
+ + + +
+
+ + + + + \ No newline at end of file diff --git a/code-server-config/data/User/History/-52e5c41d/entries.json b/code-server-config/data/User/History/-52e5c41d/entries.json new file mode 100755 index 0000000..db09972 --- /dev/null +++ b/code-server-config/data/User/History/-52e5c41d/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/frontend/index.html","entries":[{"id":"Rpxl.html","timestamp":1768942812487},{"id":"uiHD.html","timestamp":1768944736458},{"id":"W3D5.html","timestamp":1768945170064},{"id":"Smd7.html","timestamp":1768945219838},{"id":"JA3R.html","timestamp":1768945489618},{"id":"eiJs.html","timestamp":1768945771369},{"id":"J4V4.html","timestamp":1768946012393},{"id":"u9Y2.html","timestamp":1768946248437},{"id":"voAw.html","timestamp":1768946585191},{"id":"Ycqg.html","timestamp":1768946927538},{"id":"9eYi.html","timestamp":1768947157813},{"id":"0xVC.html","timestamp":1768948398804},{"id":"eVfD.html","timestamp":1768948761622},{"id":"SxEq.html","timestamp":1768952718461},{"id":"83UF.html","timestamp":1768953098851},{"id":"eRba.html","source":"undoRedo.source","timestamp":1768953103288},{"id":"SVyy.html","timestamp":1768953182984},{"id":"x8lC.html","timestamp":1768953329888},{"id":"UAc0.html","timestamp":1768954114635},{"id":"UE2n.html","timestamp":1768954243537},{"id":"tEyM.html","timestamp":1768954546782},{"id":"iTl3.html","timestamp":1768954770366},{"id":"E3XE.html","timestamp":1768954920487}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/-52e5c41d/iTl3.html b/code-server-config/data/User/History/-52e5c41d/iTl3.html new file mode 100755 index 0000000..3b89684 --- /dev/null +++ b/code-server-config/data/User/History/-52e5c41d/iTl3.html @@ -0,0 +1,207 @@ + + + + + Service Finder - Full Control + + + + + +
+ + +
+
+

Service Finder

+ + + +
+
+ +
+
+
+

Járműveim

+ +
+ +
+
+
+
+
+
{{car.brand}}
+
{{car.model}}
+
+ {{car.plate}} +
+
+
{{formatMoney(car.total_cost)}}
+
+ + +
+
+
+
+
+
+ +
+ +
+
+

{{selectedCar.brand}} {{selectedCar.model}}

+ +
+
+
+
Állapot

Rendben

+
Hibaüzenetek

Nincs

+
Következő szerviz

15,000 km múlva

+
+
+
+
+ + + + +
+ + + + + \ No newline at end of file diff --git a/code-server-config/data/User/History/-52e5c41d/tEyM.html b/code-server-config/data/User/History/-52e5c41d/tEyM.html new file mode 100755 index 0000000..419d382 --- /dev/null +++ b/code-server-config/data/User/History/-52e5c41d/tEyM.html @@ -0,0 +1,122 @@ + + + + + Service Finder - Dinamikus + + + + + +
+
+
+

Service Finder

+ + + +
+
+ +
+
+

Garázsom

+ +
+ +
+
+
+
{{car.brand}}
+
{{car.model}}
+ {{car.plate}} +
+
+
+
+ + +
+ + + + + \ No newline at end of file diff --git a/code-server-config/data/User/History/-52e5c41d/u9Y2.html b/code-server-config/data/User/History/-52e5c41d/u9Y2.html new file mode 100755 index 0000000..46688fc --- /dev/null +++ b/code-server-config/data/User/History/-52e5c41d/u9Y2.html @@ -0,0 +1,296 @@ + + + + + + Service Finder + + + + + + +
+ + +
+ +
+ +
+
+
+
+
+
{{ car.brand }}
{{ car.model }}
+ + +
+
+
{{ car.plate }}
+ + {{ (car.status !== 'OK' && car.status !== null) ? 'HIBA' : car.role }} + +
+
+
+
+
+ +
+ + +
+
+
+ +
+
+

{{ selectedCar.brand }} {{ selectedCar.model }}

+
+ {{ selectedCar.plate }} + ÁLLAPOT: {{ selectedCar.status }} +
+
+
+
+ + +
+
+ + + +
+
+
+
{{ selectedCar.mileage.toLocaleString() }}
Km
+
+
+
{{ (selectedCar.status !== 'OK' && selectedCar.status !== null) ? 'HIBA' : 'OK' }}
Állapot
+
+
+
+
+
+
Hiba:

{{ selectedCar.current_issue }}

+ +
+
+
Nincs nyitott hiba.
+
+
+
+ +
+
+ + Még üres a szervizkönyv. Rögzíts tankolást vagy eseményt! +
+
+
+
+
+
+
+ {{ translateType(item.type) }} + +{{ formatMoney(item.amount, item.currency) }} +
+

{{ item.description }}

+ {{ item.mileage.toLocaleString() }} km +
+
+ {{ item.date }} +
+
+
+
+
+
+
+ + + + + +
+
+ + + + + \ No newline at end of file diff --git a/code-server-config/data/User/History/-52e5c41d/uiHD.html b/code-server-config/data/User/History/-52e5c41d/uiHD.html new file mode 100755 index 0000000..c969375 --- /dev/null +++ b/code-server-config/data/User/History/-52e5c41d/uiHD.html @@ -0,0 +1,233 @@ + + + + + + Service Finder + + + + + + +
+ + +
+ + + +
+
+

Járművek

+ +
+
+
+
+
+
+
{{ car.brand }}
{{ car.model }}
+ +
+
+
{{ car.plate }}
+ {{ translateRole(car.role) }} +
+
+
+
+
+ +
+
+

Munkatársak

+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + +
Név / EmailSzerepkörOrszágCsatlakozottMűveletek
+
+
{{ member.email.charAt(0).toUpperCase() }}
+
+
Munkatárs
+
{{ member.email }}
+
+
+
{{ translateRole(member.role) }}{{ member.country }}{{ member.joined_at ? member.joined_at.split('T')[0] : 'Ma' }} + +
+
+
+ + Még nincs senki a csapatban. Hívj meg valakit! +
+
+
+ + + +
+

Varázsló helye...

+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/code-server-config/data/User/History/-52e5c41d/voAw.html b/code-server-config/data/User/History/-52e5c41d/voAw.html new file mode 100755 index 0000000..3ec50de --- /dev/null +++ b/code-server-config/data/User/History/-52e5c41d/voAw.html @@ -0,0 +1,206 @@ + + + + + + Service Finder + + + + + + +
+ + +
+ +
+ +
+
+
+
+
+
{{ car.brand }}
{{ car.model }}
+ + +
+
+
{{ car.plate }}
+ + {{ (car.status !== 'OK' && car.status !== null) ? 'HIBA' : car.role }} + +
+
+
+
+
+ +
+ + +
+
+
+ +
+
+

{{ selectedCar.brand }} {{ selectedCar.model }}

+
+ {{ selectedCar.plate }} + ÁLLAPOT: {{ selectedCar.status }} +
+
+
+
+ + +
+
+ + + +
+
+
+
+
{{ selectedCar.mileage.toLocaleString() }}
Km
+
+
+
+
{{ (selectedCar.status !== 'OK' && selectedCar.status !== null) ? 'HIBA' : 'OK' }}
+
Műszaki állapot
+
+
+
+
+
{{ formatMoney(selectedCar.year_cost, selectedCar.currency) }}
+
Idei költés
+
+
+
+
+
Hiba:
+

{{ selectedCar.current_issue }}

+ +
+
+
+
Nincs hiba
+
+
+
+
+ +
+
Még üres a szervizkönyv.
+
+
+
+
+
+
+ {{ translateType(item.type) }} + +{{ formatMoney(item.amount, item.currency) }} +
+

{{ item.description }}

+ {{ item.mileage.toLocaleString() }} km +
+
{{ item.date }}
+
+
+
+
+
+
+ + + + +
+
+ + + + + \ No newline at end of file diff --git a/code-server-config/data/User/History/-52e5c41d/x8lC.html b/code-server-config/data/User/History/-52e5c41d/x8lC.html new file mode 100755 index 0000000..8d99b7e --- /dev/null +++ b/code-server-config/data/User/History/-52e5c41d/x8lC.html @@ -0,0 +1,256 @@ + + + + + + Service Finder - Flotta Kezelő + + + + + + +
+
+
+

Service Finder

+ +
+
+ + +
+
+ + +
+ +

Nincs fiókod? Regisztrálj!

+
+ +
+
+ + +
+
+ + +
+ +

Vissza a belépéshez

+
+
+
+ +
+ + +
+
+
+

Saját Járművek

+ +
+
+
+
+
+
{{ car.brand }}
+
{{ car.model }}
+
+ {{ car.plate }} + +
+
+
+
+
+ + A garázsod még üres. +
+
+ +
+ +
+
+
+

{{ selectedCar.brand }} {{ selectedCar.model }}

+ {{ selectedCar.plate }} +
+
+ +
+
+
+
+
Km állás
{{ selectedCar.mileage }}
+
Idei költség
{{ formatMoney(selectedCar.year_cost, selectedCar.currency) }}
+
Állapot
{{ selectedCar.status }}
+
+
+
+
+ + +
+ + + + + \ No newline at end of file diff --git a/code-server-config/data/User/History/-5314da0c/54N2.py b/code-server-config/data/User/History/-5314da0c/54N2.py new file mode 100755 index 0000000..f244e2f --- /dev/null +++ b/code-server-config/data/User/History/-5314da0c/54N2.py @@ -0,0 +1,65 @@ +from contextlib import asynccontextmanager +from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware + +# 1. Konfiguráció importálása +from app.core.config import settings + +# 2. Adatbázis importok (JAVÍTVA) +# A 'Base' tartalmazza a modellek definícióit (app/db/base.py) +from app.db.base import Base +# Az 'engine' kezeli a kapcsolatot (app/db/session.py) +from app.db.session import engine + +# 3. Router importálása +from app.api.v1.router import api_router + +# --- Lifespan (Életciklus) Kezelő --- +# Ez fut le az alkalmazás indulásakor és leállásakor +@asynccontextmanager +async def lifespan(app: FastAPI): + # INDÍTÁS (Startup): Táblák létrehozása fejlesztői módban + async with engine.begin() as conn: + # Fontos: Importálnunk kell a modelleket, hogy a Base tudjon róluk, + # mielőtt létrehozzuk a táblákat! + # Ha vannak új modelljeid (pl. logistics, user), írd hozzá őket ide: + from app.models import social, vehicle, user, logistics + + print("--- Adatbázis táblák ellenőrzése és létrehozása ---") + await conn.run_sync(Base.metadata.create_all) + + yield # Itt fut az alkalmazás... + + # LEÁLLÁS (Shutdown): Erőforrások elengedése + print("--- Traffic Ecosystem SuperApp leállítása ---") + await engine.dispose() + +# --- Alkalmazás Inicializálása --- +app = FastAPI( + title=settings.PROJECT_NAME, + version=settings.VERSION, + openapi_url=f"{settings.API_V1_STR}/openapi.json", + lifespan=lifespan +) + +# --- Middleware (CORS) --- +# Engedélyezzük, hogy a frontend kommunikálhasson az API-val +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], # FIGYELEM: Élesben ezt szigorítani kell (pl. a frontend domainjére)! + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +# --- Routerek csatolása --- +app.include_router(api_router, prefix=settings.API_V1_STR) + +# --- Gyökér végpont --- +@app.get("/") +async def root(): + return { + "message": "Traffic Ecosystem SuperApp API fut", + "version": settings.VERSION, + "docs_url": "/docs" # Segítség a fejlesztőknek + } \ No newline at end of file diff --git a/code-server-config/data/User/History/-5314da0c/9MWC.py b/code-server-config/data/User/History/-5314da0c/9MWC.py new file mode 100755 index 0000000..5f59508 --- /dev/null +++ b/code-server-config/data/User/History/-5314da0c/9MWC.py @@ -0,0 +1,65 @@ +from contextlib import asynccontextmanager +from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware + +# 1. Konfiguráció importálása +from app.core.config import settings + +# 2. Adatbázis importok (JAVÍTVA) +# A 'Base' tartalmazza a modellek definícióit (app/db/base.py) +from app.db.base import Base +# Az 'engine' kezeli a kapcsolatot (app/db/session.py) +from app.db.session import engine + +# 3. Router importálása +from app.api.v1.router import api_router + +# --- Lifespan (Életciklus) Kezelő --- +# Ez fut le az alkalmazás indulásakor és leállásakor +@asynccontextmanager +async def lifespan(app: FastAPI): + # INDÍTÁS (Startup): Táblák létrehozása fejlesztői módban + async with engine.begin() as conn: + # Fontos: Importálnunk kell a modelleket, hogy a Base tudjon róluk, + # mielőtt létrehozzuk a táblákat! + # Ha vannak új modelljeid (pl. logistics, user), írd hozzá őket ide: + from app.models import social, vehicle, user + + print("--- Adatbázis táblák ellenőrzése és létrehozása ---") + await conn.run_sync(Base.metadata.create_all) + + yield # Itt fut az alkalmazás... + + # LEÁLLÁS (Shutdown): Erőforrások elengedése + print("--- Traffic Ecosystem SuperApp leállítása ---") + await engine.dispose() + +# --- Alkalmazás Inicializálása --- +app = FastAPI( + title=settings.PROJECT_NAME, + version=settings.VERSION, + openapi_url=f"{settings.API_V1_STR}/openapi.json", + lifespan=lifespan +) + +# --- Middleware (CORS) --- +# Engedélyezzük, hogy a frontend kommunikálhasson az API-val +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], # FIGYELEM: Élesben ezt szigorítani kell (pl. a frontend domainjére)! + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +# --- Routerek csatolása --- +app.include_router(api_router, prefix=settings.API_V1_STR) + +# --- Gyökér végpont --- +@app.get("/") +async def root(): + return { + "message": "Traffic Ecosystem SuperApp API fut", + "version": settings.VERSION, + "docs_url": "/docs" # Segítség a fejlesztőknek + } \ No newline at end of file diff --git a/code-server-config/data/User/History/-5314da0c/FkfR.py b/code-server-config/data/User/History/-5314da0c/FkfR.py new file mode 100755 index 0000000..0a47d0a --- /dev/null +++ b/code-server-config/data/User/History/-5314da0c/FkfR.py @@ -0,0 +1,54 @@ +from contextlib import asynccontextmanager +from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware + +from app.core.config import settings +from app.core.database import engine, Base +from app.api.v1.router import api_router + +# --- Lifespan Manager (Startup & Shutdown Logic) --- +@asynccontextmanager +async def lifespan(app: FastAPI): + # STARTUP: Adatbázis táblák létrehozása + # Figyelem: Éles környezetben (Production) inkább Alembic migrációt használunk! + async with engine.begin() as conn: + # Betöltjük a modelleket, hogy a metadata tudjon róluk + # Fontos: importálni kell őket, különben nem jönnek létre! + from app.models import social, vehicle, user, logistics + await conn.run_sync(Base.metadata.create_all) + + print("--- Database Tables Checked/Created ---") + + yield # Itt fut az alkalmazás... + + # SHUTDOWN: Erőforrások felszabadítása (ha lenne) + print("--- Shutting down ---") + +# --- App Initialization --- +app = FastAPI( + title=settings.PROJECT_NAME, + version=settings.VERSION, + openapi_url=f"{settings.API_V1_STR}/openapi.json", + lifespan=lifespan +) + +# --- Middleware (CORS) --- +# Engedélyezzük a frontend kommunikációt +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], # Élesben szigorítani kell! + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +# --- Routers --- +app.include_router(api_router, prefix=settings.API_V1_STR) + +@app.get("/") +async def root(): + return { + "message": "Traffic Ecosystem SuperApp API is Running", + "docs_url": "/docs", + "version": settings.VERSION + } \ No newline at end of file diff --git a/code-server-config/data/User/History/-5314da0c/Fp0w.py b/code-server-config/data/User/History/-5314da0c/Fp0w.py new file mode 100755 index 0000000..0e59f48 --- /dev/null +++ b/code-server-config/data/User/History/-5314da0c/Fp0w.py @@ -0,0 +1,68 @@ +from contextlib import asynccontextmanager +from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware + +# 1. Config Import +from app.core.config import settings + +# 2. Database Imports (FIXED PATHS) +# 'Base' contains the model definitions (from app/db/base.py) +from app.db.base import Base +# 'engine' handles the connection (assumed to be in app/db/session.py) +from app.db.session import engine + +# 3. Router Import +from app.api.v1.router import api_router + +# --- Lifespan Manager (Startup & Shutdown Logic) --- +@asynccontextmanager +async def lifespan(app: FastAPI): + """ + Handles application startup and shutdown events. + """ + # STARTUP: Create Database Tables (Development Mode) + # In production, you should use Alembic migrations instead of this. + async with engine.begin() as conn: + # We must import models here so that Base.metadata knows about them + # before we call create_all. + # Ensure these files exist in app/models/ + from app.models import social, vehicle # Add 'user', 'logistics' if created + + print("--- Checking/Creating Database Tables ---") + await conn.run_sync(Base.metadata.create_all) + + yield # The application runs here + + # SHUTDOWN: Cleanup resources + print("--- Shutting down Traffic Ecosystem SuperApp ---") + await engine.dispose() + +# --- App Initialization --- +app = FastAPI( + title=settings.PROJECT_NAME, + version=settings.VERSION, + openapi_url=f"{settings.API_V1_STR}/openapi.json", + lifespan=lifespan +) + +# --- Middleware (CORS) --- +# Allows the frontend to communicate with this API +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], # WARNING: Restrict this in production! + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +# --- Routers --- +app.include_router(api_router, prefix=settings.API_V1_STR) + +# --- Root Endpoint --- +@app.get("/") +async def root(): + return { + "message": "Traffic Ecosystem SuperApp API is Running", + "version": settings.VERSION, + "docs_url": "/docs" + } \ No newline at end of file diff --git a/code-server-config/data/User/History/-5314da0c/MlfW.py b/code-server-config/data/User/History/-5314da0c/MlfW.py new file mode 100755 index 0000000..1689920 --- /dev/null +++ b/code-server-config/data/User/History/-5314da0c/MlfW.py @@ -0,0 +1,100 @@ +from contextlib import asynccontextmanager +from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware +from fastapi.openapi.utils import get_openapi + +# 1. Konfiguráció importálása +from app.core.config import settings + +# 2. Adatbázis importok +from app.db.base import Base +from app.db.session import engine + +# 3. Router importálása +from app.api.v1.router import api_router + +# --- Lifespan (Életciklus) Kezelő --- +@asynccontextmanager +async def lifespan(app: FastAPI): + # INDÍTÁS (Startup): Táblák létrehozása fejlesztői módban + async with engine.begin() as conn: + # Importáljuk a modelleket, hogy a Base tudjon róluk! + from app.models import social, vehicle, user, logistics, expense + + print("--- Adatbázis táblák ellenőrzése és létrehozása ---") + await conn.run_sync(Base.metadata.create_all) + + yield # Itt fut az alkalmazás... + + # LEÁLLÁS (Shutdown): Erőforrások elengedése + print("--- Traffic Ecosystem SuperApp leállítása ---") + await engine.dispose() + +# --- Alkalmazás Inicializálása --- +app = FastAPI( + title=settings.PROJECT_NAME, + version=settings.VERSION, + openapi_url=f"{settings.API_V1_STR}/openapi.json", + lifespan=lifespan, + # Ez a beállítás segít, hogy a lakat megmaradjon frissítés után is + swagger_ui_parameters={"persistAuthorization": True} +) + +# --- OpenAPI Biztonsági Séma (Hogy legyen Authorize gomb!) --- +def custom_openapi(): + if app.openapi_schema: + return app.openapi_schema + + openapi_schema = get_openapi( + title=app.title, + version=app.version, + description="API dokumentáció JWT hitelesítéssel", + routes=app.routes, + ) + + # Itt definiáljuk a lakatot és a JWT formátumot + openapi_schema["components"]["securitySchemes"] = { + "OAuth2PasswordBearer": { + "type": "oauth2", + "flows": { + "password": { + "tokenUrl": "/api/v1/auth/login" + } + } + } + } + + # Globálisan alkalmazzuk minden védett végpontra + for path in openapi_schema["paths"]: + for method in openapi_schema["paths"][path]: + # Csak azokra a kérésekre rakunk lakatot, amik nincsenek a kivételek között + # (Az auth/login és auth/register maradjon nyitva) + if not any(x in path for x in ["/auth/login", "/auth/register"]): + openapi_schema["paths"][path][method]["security"] = [{"OAuth2PasswordBearer": []}] + + app.openapi_schema = openapi_schema + return app.openapi_schema + +# Felülírjuk az alapértelmezett OpenAPI generátort a sajátunkkal +app.openapi = custom_openapi + +# --- Middleware (CORS) --- +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +# --- Routerek csatolása --- +app.include_router(api_router, prefix=settings.API_V1_STR) + +# --- Gyökér végpont --- +@app.get("/") +async def root(): + return { + "message": "Traffic Ecosystem SuperApp API fut", + "version": settings.VERSION, + "docs_url": "/docs" + } \ No newline at end of file diff --git a/code-server-config/data/User/History/-5314da0c/eSN2.py b/code-server-config/data/User/History/-5314da0c/eSN2.py new file mode 100755 index 0000000..08b1366 --- /dev/null +++ b/code-server-config/data/User/History/-5314da0c/eSN2.py @@ -0,0 +1,100 @@ +from contextlib import asynccontextmanager +from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware +from fastapi.openapi.utils import get_openapi + +# 1. Konfiguráció importálása +from app.core.config import settings + +# 2. Adatbázis importok +from app.db.base import Base +from app.db.session import engine + +# 3. Router importálása +from app.api.v1.router import api_router + +# --- Lifespan (Életciklus) Kezelő --- +@asynccontextmanager +async def lifespan(app: FastAPI): + # INDÍTÁS (Startup): Táblák létrehozása fejlesztői módban + async with engine.begin() as conn: + # Importáljuk a modelleket, hogy a Base tudjon róluk! + from app.models import social, vehicle, user, logistics, expense + + print("--- Adatbázis táblák ellenőrzése és létrehozása ---") + await conn.run_sync(Base.metadata.create_all) + + yield # Itt fut az alkalmazás... + + # LEÁLLÁS (Shutdown): Erőforrások elengedése + print("--- Traffic Ecosystem SuperApp leállítása ---") + await engine.dispose() + +# --- Alkalmazás Inicializálása --- +app = FastAPI( + title=settings.PROJECT_NAME, + version=settings.VERSION, + openapi_url=f"{settings.API_V1_STR}/openapi.json", + lifespan=lifespan, + # Ez a beállítás segít, hogy a lakat megmaradjon frissítés után is + swagger_ui_parameters={"persistAuthorization": True} +) + +# --- OpenAPI Biztonsági Séma (Hogy legyen Authorize gomb!) --- +def custom_openapi(): + if app.openapi_schema: + return app.openapi_schema + + openapi_schema = get_openapi( + title=app.title, + version=app.version, + description="API dokumentáció JWT hitelesítéssel", + routes=app.routes, + ) + + # Itt definiáljuk a lakatot és a JWT formátumot + openapi_schema["components"]["securitySchemes"] = { + "OAuth2PasswordBearer": { + "type": "oauth2", + "flows": { + "password": { + "tokenUrl": f"{settings.API_V1_STR}/auth/login" + } + } + } + } + + # Globálisan alkalmazzuk minden védett végpontra + for path in openapi_schema["paths"]: + for method in openapi_schema["paths"][path]: + # Csak azokra a kérésekre rakunk lakatot, amik nincsenek a kivételek között + # (Az auth/login és auth/register maradjon nyitva) + if not any(x in path for x in ["/auth/login", "/auth/register"]): + openapi_schema["paths"][path][method]["security"] = [{"OAuth2PasswordBearer": []}] + + app.openapi_schema = openapi_schema + return app.openapi_schema + +# Felülírjuk az alapértelmezett OpenAPI generátort a sajátunkkal +app.openapi = custom_openapi + +# --- Middleware (CORS) --- +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +# --- Routerek csatolása --- +app.include_router(api_router, prefix=settings.API_V1_STR) + +# --- Gyökér végpont --- +@app.get("/") +async def root(): + return { + "message": "Traffic Ecosystem SuperApp API fut", + "version": settings.VERSION, + "docs_url": "/docs" + } \ No newline at end of file diff --git a/code-server-config/data/User/History/-5314da0c/entries.json b/code-server-config/data/User/History/-5314da0c/entries.json new file mode 100755 index 0000000..1f8af88 --- /dev/null +++ b/code-server-config/data/User/History/-5314da0c/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/backend/app/main.py","entries":[{"id":"FkfR.py","timestamp":1769026236612},{"id":"Fp0w.py","timestamp":1769027988167},{"id":"jmij.py","timestamp":1769028127118},{"id":"9MWC.py","timestamp":1769031896319},{"id":"54N2.py","timestamp":1769032666605},{"id":"eSN2.py","timestamp":1769043761338},{"id":"MlfW.py","timestamp":1769106292762}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/-5314da0c/jmij.py b/code-server-config/data/User/History/-5314da0c/jmij.py new file mode 100755 index 0000000..ed973b7 --- /dev/null +++ b/code-server-config/data/User/History/-5314da0c/jmij.py @@ -0,0 +1,65 @@ +from contextlib import asynccontextmanager +from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware + +# 1. Konfiguráció importálása +from app.core.config import settings + +# 2. Adatbázis importok (JAVÍTVA) +# A 'Base' tartalmazza a modellek definícióit (app/db/base.py) +from app.db.base import Base +# Az 'engine' kezeli a kapcsolatot (app/db/session.py) +from app.db.session import engine + +# 3. Router importálása +from app.api.v1.router import api_router + +# --- Lifespan (Életciklus) Kezelő --- +# Ez fut le az alkalmazás indulásakor és leállásakor +@asynccontextmanager +async def lifespan(app: FastAPI): + # INDÍTÁS (Startup): Táblák létrehozása fejlesztői módban + async with engine.begin() as conn: + # Fontos: Importálnunk kell a modelleket, hogy a Base tudjon róluk, + # mielőtt létrehozzuk a táblákat! + # Ha vannak új modelljeid (pl. logistics, user), írd hozzá őket ide: + from app.models import social, vehicle + + print("--- Adatbázis táblák ellenőrzése és létrehozása ---") + await conn.run_sync(Base.metadata.create_all) + + yield # Itt fut az alkalmazás... + + # LEÁLLÁS (Shutdown): Erőforrások elengedése + print("--- Traffic Ecosystem SuperApp leállítása ---") + await engine.dispose() + +# --- Alkalmazás Inicializálása --- +app = FastAPI( + title=settings.PROJECT_NAME, + version=settings.VERSION, + openapi_url=f"{settings.API_V1_STR}/openapi.json", + lifespan=lifespan +) + +# --- Middleware (CORS) --- +# Engedélyezzük, hogy a frontend kommunikálhasson az API-val +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], # FIGYELEM: Élesben ezt szigorítani kell (pl. a frontend domainjére)! + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +# --- Routerek csatolása --- +app.include_router(api_router, prefix=settings.API_V1_STR) + +# --- Gyökér végpont --- +@app.get("/") +async def root(): + return { + "message": "Traffic Ecosystem SuperApp API fut", + "version": settings.VERSION, + "docs_url": "/docs" # Segítség a fejlesztőknek + } \ No newline at end of file diff --git a/code-server-config/data/User/History/-5bd368a0/0NIq b/code-server-config/data/User/History/-5bd368a0/0NIq new file mode 100755 index 0000000..88dae7b --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/0NIq @@ -0,0 +1,74 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=MiskociA74 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_port=5432 + +# --- ADATBÁZIS ELÉRÉS (A Python kódnak) --- +# Formátum: postgresql+asyncpg://FELHASZNÁLÓ:JELSZÓ@KONTÉNER_NÉV:PORT/ADATBÁZIS_NÉV +# DATABASE_URL=postgresql+asyncpg://kincses:MiskociA74@postgres-db:5432/service_finder +DATABASE_URL=postgresql+asyncpg://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} + + + PM senior +Egyéni gem + +Ez egy kiváló észrevétel. Nagyon jól teszed, hogy ezeket a kritikus kulcsokat (SECRET_KEY, ALGORITHM) is beemeled a biztonságos környezetbe. Ezek felelnek ugyanis azért, hogy a felhasználóid bejelentkezve maradjanak, és a jelszavak biztonságban legyenek. + +Összeraktam neked a TELJES, VÉGLEGES .env fájlt, ami egyesíti a te meglévő beállításaidat az általam javasolt újakkal. +1. A Master .env fájl (Ezt hozd létre) + +Ebben a fájlban definiáljuk az "igazságot". A Docker Compose innen fogja kiolvasni az értékeket. + +Másold be ezt a fájlt a projekt gyökérkönyvtárába (.env néven): +Properties + +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=PASSWORD111 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_PORT=5432 + +# Ez a sor építi fel a teljes kapcsolati stringet a fenti változókból. +# Így ha feljebb átírod a jelszót, a program is tudni fogja. +DATABASE_URL=postgresql+asyncpg://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=szuper_titkos_random_string_amit_senki_nem_tud +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +# ========================================== +# 3. INFRASTRUKTÚRA & CACHE +# ========================================== +# A Redis belső hálózati elérése (a container neve 'redis') +REDIS_URL=redis://redis:6379/0 + +# ========================================== +# 4. MONITORING & TOOLS +# ========================================== +# PgAdmin belépés +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +# Code Server (ha használod a webes VS Code-ot) +CODE_SERVER_PASSWORD=Megeszemakalapom11 diff --git a/code-server-config/data/User/History/-5bd368a0/27fC b/code-server-config/data/User/History/-5bd368a0/27fC new file mode 100755 index 0000000..e1651af --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/27fC @@ -0,0 +1,39 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=PASSWORD111 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_PORT=5432 + +# Ez a sor építi fel a teljes kapcsolati stringet a fenti változókból. +# Így ha feljebb átírod a jelszót, a program is tudni fogja. +DATABASE_URL=postgresql+asyncpg://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +# ========================================== +# 3. INFRASTRUKTÚRA & CACHE +# ========================================== +# A Redis belső hálózati elérése (a container neve 'redis') +REDIS_URL=redis://redis:6379/0 + +# ========================================== +# 4. MONITORING & TOOLS +# ========================================== +# PgAdmin belépés +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + + + +# Code Server (ha használod a webes VS Code-ot) +CODE_SERVER_PASSWORD=Megeszemakalapom11 diff --git a/code-server-config/data/User/History/-5bd368a0/479L b/code-server-config/data/User/History/-5bd368a0/479L new file mode 100755 index 0000000..2078116 --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/479L @@ -0,0 +1,52 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=MiskociA74 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_PORT=5432 + +# Ez a sor építi fel a teljes kapcsolati stringet a fenti változókból. +# Így ha feljebb átírod a jelszót, a program is tudni fogja. +# --- APP KAPCSOLAT (A Pythonnak) --- +# Itt szedjük szét a hosszú sort: +APP_DB_HOST=postgres-db +APP_DB_PORT=5432 +APP_DB_NAME=service_finder +APP_DB_USER=service_finder_app +APP_DB_PASSWORD=Uj_BIZTONSÁGOS_JELSZÓ +DATABASE_URL=postgresql+asyncpg://${APP_DB_USER}:${APP_DB_PASSWORD}@${APP_DB_HOST}:${APP_DB_PORT}/${APP_DB_NAME} +# DATABASE_URL="postgresql+asyncpg://service_finder_app:AppJelszo@postgres-db:5432/service_finder" + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +# ========================================== +# 3. INFRASTRUKTÚRA & CACHE +# ========================================== +# A Redis belső hálózati elérése (a container neve 'redis') +REDIS_URL=redis://redis:6379/0 + +# MinIO (NAS) elérés - A POSTGRES adatait használjuk az egyszerűségért +MINIO_ROOT_USER=${POSTGRES_USER} +MINIO_ROOT_PASSWORD=${POSTGRES_PASSWORD} +MINIO_ENDPOINT=minio:9000 + +# ========================================== +# 4. MONITORING & TOOLS +# ========================================== +# PgAdmin belépés +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + + + +# Code Server (ha használod a webes VS Code-ot) +CODE_SERVER_PASSWORD=Megeszemakalapom11 diff --git a/code-server-config/data/User/History/-5bd368a0/4MYC b/code-server-config/data/User/History/-5bd368a0/4MYC new file mode 100755 index 0000000..22d9942 --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/4MYC @@ -0,0 +1,45 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=MiskociA74 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_PORT=5432 + +# Ez a sor építi fel a teljes kapcsolati stringet a fenti változókból. +# Így ha feljebb átírod a jelszót, a program is tudni fogja. +# DATABASE_URL=postgresql+asyncpg://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} +DATABASE_URL="postgresql+asyncpg://service_finder_app:AppJelszo@postgres-db:5432/service_finder" + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +# ========================================== +# 3. INFRASTRUKTÚRA & CACHE +# ========================================== +# A Redis belső hálózati elérése (a container neve 'redis') +REDIS_URL=redis://redis:6379/0 + +# MinIO (NAS) elérés - A POSTGRES adatait használjuk az egyszerűségért +MINIO_ROOT_USER=${POSTGRES_USER} +MINIO_ROOT_PASSWORD=${POSTGRES_PASSWORD} +MINIO_ENDPOINT=minio:9000 + +# ========================================== +# 4. MONITORING & TOOLS +# ========================================== +# PgAdmin belépés +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + + + +# Code Server (ha használod a webes VS Code-ot) +CODE_SERVER_PASSWORD=Megeszemakalapom11 diff --git a/code-server-config/data/User/History/-5bd368a0/66Rx b/code-server-config/data/User/History/-5bd368a0/66Rx new file mode 100755 index 0000000..1020be9 --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/66Rx @@ -0,0 +1,52 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=MiskociA74 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_PORT=5432 + +# Ez a sor építi fel a teljes kapcsolati stringet a fenti változókból. +# Így ha feljebb átírod a jelszót, a program is tudni fogja. +# --- APP KAPCSOLAT (A Pythonnak) --- +# Itt szedjük szét a hosszú sort: +APP_DB_HOST=postgres-db +APP_DB_PORT=5432 +APP_DB_NAME=service_finder +APP_DB_USER=service_finder_app +APP_DB_PASSWORD=Uj_BIZTONSÁGOS_JELSZÓ +# DATABASE_URL=postgresql+asyncpg://${APP_DB_USER}:${APP_DB_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} +DATABASE_URL="postgresql+asyncpg://service_finder_app:AppJelszo@postgres-db:5432/service_finder" + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +# ========================================== +# 3. INFRASTRUKTÚRA & CACHE +# ========================================== +# A Redis belső hálózati elérése (a container neve 'redis') +REDIS_URL=redis://redis:6379/0 + +# MinIO (NAS) elérés - A POSTGRES adatait használjuk az egyszerűségért +MINIO_ROOT_USER=${POSTGRES_USER} +MINIO_ROOT_PASSWORD=${POSTGRES_PASSWORD} +MINIO_ENDPOINT=minio:9000 + +# ========================================== +# 4. MONITORING & TOOLS +# ========================================== +# PgAdmin belépés +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + + + +# Code Server (ha használod a webes VS Code-ot) +CODE_SERVER_PASSWORD=Megeszemakalapom11 diff --git a/code-server-config/data/User/History/-5bd368a0/6P40 b/code-server-config/data/User/History/-5bd368a0/6P40 new file mode 100755 index 0000000..34b8a35 --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/6P40 @@ -0,0 +1,44 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=PASSWORD111 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_PORT=5432 + +# Ez a sor építi fel a teljes kapcsolati stringet a fenti változókból. +# Így ha feljebb átírod a jelszót, a program is tudni fogja. +DATABASE_URL=postgresql+asyncpg://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +# ========================================== +# 3. INFRASTRUKTÚRA & CACHE +# ========================================== +# A Redis belső hálózati elérése (a container neve 'redis') +REDIS_URL=redis://redis:6379/0 + +# MinIO (NAS) elérés - A POSTGRES adatait használjuk az egyszerűségért +MINIO_ROOT_USER=${POSTGRES_USER} +MINIO_ROOT_PASSWORD=${POSTGRES_PASSWORD} +MINIO_ENDPOINT=minio:9000 + +# ========================================== +# 4. MONITORING & TOOLS +# ========================================== +# PgAdmin belépés +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + + + +# Code Server (ha használod a webes VS Code-ot) +CODE_SERVER_PASSWORD=Megeszemakalapom11 diff --git a/code-server-config/data/User/History/-5bd368a0/8R6W b/code-server-config/data/User/History/-5bd368a0/8R6W new file mode 100755 index 0000000..a49d557 --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/8R6W @@ -0,0 +1,60 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=MiskociA74 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_PORT=5432 + +# Ez a sor építi fel a teljes kapcsolati stringet a fenti változókból. +# Így ha feljebb átírod a jelszót, a program is tudni fogja. +# --- APP KAPCSOLAT (A Pythonnak) --- +# Itt szedjük szét a hosszú sort: +APP_DB_HOST=postgres-db +APP_DB_PORT=5432 +APP_DB_NAME=service_finder +APP_DB_USER=service_finder_app +APP_DB_PASSWORD=AppSafePass_2026 +# DATABASE_URL=postgresql+asyncpg://${APP_DB_USER}:${APP_DB_PASSWORD}@${APP_DB_HOST}:${APP_DB_PORT}/${APP_DB_NAME} +# DATABASE_URL="postgresql+asyncpg://service_finder_app:AppJelszo@postgres-db:5432/service_finder" + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 +REFRESH_TOKEN_EXPIRE_DAYS=30 + +# ========================================== +# 3. INFRASTRUKTÚRA & CACHE +# ========================================== +# A Redis belső hálózati elérése (a container neve 'redis') +REDIS_URL=redis://redis:6379/0 + +# MinIO (NAS) elérés - A POSTGRES adatait használjuk az egyszerűségért +MINIO_ROOT_USER=${POSTGRES_USER} +MINIO_ROOT_PASSWORD=${POSTGRES_PASSWORD} +MINIO_ENDPOINT=minio:9000 + +# ========================================== +# 4. MONITORING & TOOLS +# ========================================== +# PgAdmin belépés +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + + + +# Code Server (ha használod a webes VS Code-ot) +CODE_SERVER_PASSWORD=Megeszemakalapom11 + +SECRET_KEY=SzuperTitkosVéletlenszerűKaraktersorozat_Amit_Csak_Te_Tudsz_2026 + +SECRET_KEY="2e34bfff3e448c6d6f75cbacf65035e3a833e6648053e8e97ce37c6fa82b6525" + +SENDGRID_API_KEY=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 +FROM_EMAIL=info@profibot.hu \ No newline at end of file diff --git a/code-server-config/data/User/History/-5bd368a0/9UOq b/code-server-config/data/User/History/-5bd368a0/9UOq new file mode 100755 index 0000000..0ebae53 --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/9UOq @@ -0,0 +1,52 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=MiskociA74 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_PORT=5432 + +# Ez a sor építi fel a teljes kapcsolati stringet a fenti változókból. +# Így ha feljebb átírod a jelszót, a program is tudni fogja. +# --- APP KAPCSOLAT (A Pythonnak) --- +# Itt szedjük szét a hosszú sort: +APP_DB_HOST=postgres-db +APP_DB_PORT=5432 +APP_DB_NAME=service_finder +APP_DB_USER=service_finder_app +APP_DB_PASSWORD=Uj_BIZTONSÁGOS_JELSZÓ +# DATABASE_URL=postgresql+asyncpg://${APP_DB_USER}:${APP_DB_PASSWORD}@${APP_DB_HOST}:${APP_DB_PORT}/${POSTGRES_DB} +DATABASE_URL="postgresql+asyncpg://service_finder_app:AppJelszo@postgres-db:5432/service_finder" + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +# ========================================== +# 3. INFRASTRUKTÚRA & CACHE +# ========================================== +# A Redis belső hálózati elérése (a container neve 'redis') +REDIS_URL=redis://redis:6379/0 + +# MinIO (NAS) elérés - A POSTGRES adatait használjuk az egyszerűségért +MINIO_ROOT_USER=${POSTGRES_USER} +MINIO_ROOT_PASSWORD=${POSTGRES_PASSWORD} +MINIO_ENDPOINT=minio:9000 + +# ========================================== +# 4. MONITORING & TOOLS +# ========================================== +# PgAdmin belépés +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + + + +# Code Server (ha használod a webes VS Code-ot) +CODE_SERVER_PASSWORD=Megeszemakalapom11 diff --git a/code-server-config/data/User/History/-5bd368a0/BlV7 b/code-server-config/data/User/History/-5bd368a0/BlV7 new file mode 100755 index 0000000..6257f86 --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/BlV7 @@ -0,0 +1,32 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=MiskociA74 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_port=5432 + +# --- ADATBÁZIS ELÉRÉS (A Python kódnak) --- +# Formátum: postgresql+asyncpg://FELHASZNÁLÓ:JELSZÓ@KONTÉNER_NÉV:PORT/ADATBÁZIS_NÉV +# DATABASE_URL=postgresql+asyncpg://kincses:MiskociA74@postgres-db:5432/service_finder +DATABASE_URL=postgresql+asyncpg://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} + + +# --- REDIS (A session kezeléshez) --- +REDIS_URL=redis://redis:6379/0 + +# PgAdmin +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +CODE_SERVER_PASSWORD=Megeszemakalapom11 diff --git a/code-server-config/data/User/History/-5bd368a0/DBmG b/code-server-config/data/User/History/-5bd368a0/DBmG new file mode 100755 index 0000000..1fe1cd1 --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/DBmG @@ -0,0 +1,44 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=MiskociA74 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_PORT=5432 + +# Ez a sor építi fel a teljes kapcsolati stringet a fenti változókból. +# Így ha feljebb átírod a jelszót, a program is tudni fogja. +DATABASE_URL=postgresql+asyncpg://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +# ========================================== +# 3. INFRASTRUKTÚRA & CACHE +# ========================================== +# A Redis belső hálózati elérése (a container neve 'redis') +REDIS_URL=redis://redis:6379/0 + +# MinIO (NAS) elérés - A POSTGRES adatait használjuk az egyszerűségért +MINIO_ROOT_USER=${POSTGRES_USER} +MINIO_ROOT_PASSWORD=${POSTGRES_PASSWORD} +MINIO_ENDPOINT=minio:9000 + +# ========================================== +# 4. MONITORING & TOOLS +# ========================================== +# PgAdmin belépés +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + + + +# Code Server (ha használod a webes VS Code-ot) +CODE_SERVER_PASSWORD=Megeszemakalapom11 diff --git a/code-server-config/data/User/History/-5bd368a0/DqPk b/code-server-config/data/User/History/-5bd368a0/DqPk new file mode 100755 index 0000000..76d504f --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/DqPk @@ -0,0 +1,60 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=MiskociA74 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_PORT=5432 + +# Ez a sor építi fel a teljes kapcsolati stringet a fenti változókból. +# Így ha feljebb átírod a jelszót, a program is tudni fogja. +# --- APP KAPCSOLAT (A Pythonnak) --- +# Itt szedjük szét a hosszú sort: +APP_DB_HOST=postgres-db +APP_DB_PORT=5432 +APP_DB_NAME=service_finder +APP_DB_USER=service_finder_app +APP_DB_PASSWORD=AppSafePass_2026 +# DATABASE_URL=postgresql+asyncpg://${APP_DB_USER}:${APP_DB_PASSWORD}@${APP_DB_HOST}:${APP_DB_PORT}/${APP_DB_NAME} +# DATABASE_URL="postgresql+asyncpg://service_finder_app:AppJelszo@postgres-db:5432/service_finder" + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 +REFRESH_TOKEN_EXPIRE_DAYS=30 + +# ========================================== +# 3. INFRASTRUKTÚRA & CACHE +# ========================================== +# A Redis belső hálózati elérése (a container neve 'redis') +REDIS_URL=redis://redis:6379/0 + +# MinIO (NAS) elérés - A POSTGRES adatait használjuk az egyszerűségért +MINIO_ROOT_USER=${POSTGRES_USER} +MINIO_ROOT_PASSWORD=${POSTGRES_PASSWORD} +MINIO_ENDPOINT=minio:9000 + +# ========================================== +# 4. MONITORING & TOOLS +# ========================================== +# PgAdmin belépés +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + + + +# Code Server (ha használod a webes VS Code-ot) +CODE_SERVER_PASSWORD=Megeszemakalapom11 + +SECRET_KEY=SzuperTitkosVéletlenszerűKaraktersorozat_Amit_Csak_Te_Tudsz_2026 + +SECRET_KEY="2e34bfff3e448c6d6f75cbacf65035e3a833e6648053e8e97ce37c6fa82b6525" +ALGORITHM="HS256" +SENDGRID_API_KEY=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 +FROM_EMAIL=info@profibot.hu \ No newline at end of file diff --git a/code-server-config/data/User/History/-5bd368a0/Dsy9 b/code-server-config/data/User/History/-5bd368a0/Dsy9 new file mode 100755 index 0000000..402fa4a --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/Dsy9 @@ -0,0 +1,26 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=MiskociA74 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_port=5432 + +# --- ADATBÁZIS ELÉRÉS (A Python kódnak) --- +# Formátum: postgresql+asyncpg://FELHASZNÁLÓ:JELSZÓ@KONTÉNER_NÉV:PORT/ADATBÁZIS_NÉV +DATABASE_URL=postgresql+asyncpg://kincses:MiskociA74@postgres-db:5432/service_finder + +# --- REDIS (A session kezeléshez) --- +REDIS_URL=redis://redis:6379/0 + +# PgAdmin +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + +# Backend (FastAPI) +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +CODE_SERVER_PASSWORD=Megeszemakalapom11 diff --git a/code-server-config/data/User/History/-5bd368a0/GwU6 b/code-server-config/data/User/History/-5bd368a0/GwU6 new file mode 100755 index 0000000..9665e2e --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/GwU6 @@ -0,0 +1,52 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=MiskociA74 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_PORT=5432 + +# Ez a sor építi fel a teljes kapcsolati stringet a fenti változókból. +# Így ha feljebb átírod a jelszót, a program is tudni fogja. +# --- APP KAPCSOLAT (A Pythonnak) --- +# Itt szedjük szét a hosszú sort: +APP_DB_HOST=postgres-db +APP_DB_PORT=5432 +APP_DB_NAME=service_finder +APP_DB_USER=service_finder_app +APP_DB_PASSWORD=Uj_BIZTONSÁGOS_JELSZÓ +# +# DATABASE_URL="postgresql+asyncpg://service_finder_app:AppJelszo@postgres-db:5432/service_finder" + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +# ========================================== +# 3. INFRASTRUKTÚRA & CACHE +# ========================================== +# A Redis belső hálózati elérése (a container neve 'redis') +REDIS_URL=redis://redis:6379/0 + +# MinIO (NAS) elérés - A POSTGRES adatait használjuk az egyszerűségért +MINIO_ROOT_USER=${POSTGRES_USER} +MINIO_ROOT_PASSWORD=${POSTGRES_PASSWORD} +MINIO_ENDPOINT=minio:9000 + +# ========================================== +# 4. MONITORING & TOOLS +# ========================================== +# PgAdmin belépés +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + + + +# Code Server (ha használod a webes VS Code-ot) +CODE_SERVER_PASSWORD=Megeszemakalapom11 diff --git a/code-server-config/data/User/History/-5bd368a0/H5Zm b/code-server-config/data/User/History/-5bd368a0/H5Zm new file mode 100755 index 0000000..2078116 --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/H5Zm @@ -0,0 +1,52 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=MiskociA74 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_PORT=5432 + +# Ez a sor építi fel a teljes kapcsolati stringet a fenti változókból. +# Így ha feljebb átírod a jelszót, a program is tudni fogja. +# --- APP KAPCSOLAT (A Pythonnak) --- +# Itt szedjük szét a hosszú sort: +APP_DB_HOST=postgres-db +APP_DB_PORT=5432 +APP_DB_NAME=service_finder +APP_DB_USER=service_finder_app +APP_DB_PASSWORD=Uj_BIZTONSÁGOS_JELSZÓ +DATABASE_URL=postgresql+asyncpg://${APP_DB_USER}:${APP_DB_PASSWORD}@${APP_DB_HOST}:${APP_DB_PORT}/${APP_DB_NAME} +# DATABASE_URL="postgresql+asyncpg://service_finder_app:AppJelszo@postgres-db:5432/service_finder" + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +# ========================================== +# 3. INFRASTRUKTÚRA & CACHE +# ========================================== +# A Redis belső hálózati elérése (a container neve 'redis') +REDIS_URL=redis://redis:6379/0 + +# MinIO (NAS) elérés - A POSTGRES adatait használjuk az egyszerűségért +MINIO_ROOT_USER=${POSTGRES_USER} +MINIO_ROOT_PASSWORD=${POSTGRES_PASSWORD} +MINIO_ENDPOINT=minio:9000 + +# ========================================== +# 4. MONITORING & TOOLS +# ========================================== +# PgAdmin belépés +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + + + +# Code Server (ha használod a webes VS Code-ot) +CODE_SERVER_PASSWORD=Megeszemakalapom11 diff --git a/code-server-config/data/User/History/-5bd368a0/HmdC b/code-server-config/data/User/History/-5bd368a0/HmdC new file mode 100755 index 0000000..fc39d13 --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/HmdC @@ -0,0 +1,52 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=MiskociA74 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_PORT=5432 + +# Ez a sor építi fel a teljes kapcsolati stringet a fenti változókból. +# Így ha feljebb átírod a jelszót, a program is tudni fogja. +# --- APP KAPCSOLAT (A Pythonnak) --- +# Itt szedjük szét a hosszú sort: +APP_DB_HOST=postgres-db +APP_DB_PORT=5432 +APP_DB_NAME=service_finder +APP_DB_USER=service_finder_app +APP_DB_PASSWORD=Uj_BIZTONSÁGOS_JELSZÓ +# DATABASE_URL=postgresql+asyncpg://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} +DATABASE_URL="postgresql+asyncpg://service_finder_app:AppJelszo@postgres-db:5432/service_finder" + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +# ========================================== +# 3. INFRASTRUKTÚRA & CACHE +# ========================================== +# A Redis belső hálózati elérése (a container neve 'redis') +REDIS_URL=redis://redis:6379/0 + +# MinIO (NAS) elérés - A POSTGRES adatait használjuk az egyszerűségért +MINIO_ROOT_USER=${POSTGRES_USER} +MINIO_ROOT_PASSWORD=${POSTGRES_PASSWORD} +MINIO_ENDPOINT=minio:9000 + +# ========================================== +# 4. MONITORING & TOOLS +# ========================================== +# PgAdmin belépés +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + + + +# Code Server (ha használod a webes VS Code-ot) +CODE_SERVER_PASSWORD=Megeszemakalapom11 diff --git a/code-server-config/data/User/History/-5bd368a0/IXdY b/code-server-config/data/User/History/-5bd368a0/IXdY new file mode 100755 index 0000000..98b42b4 --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/IXdY @@ -0,0 +1,46 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=PASSWORD111 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_PORT=5432 + +# Ez a sor építi fel a teljes kapcsolati stringet a fenti változókból. +# Így ha feljebb átírod a jelszót, a program is tudni fogja. +DATABASE_URL=postgresql+asyncpg://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=szuper_titkos_random_string_amit_senki_nem_tud +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +# ========================================== +# 3. INFRASTRUKTÚRA & CACHE +# ========================================== +# A Redis belső hálózati elérése (a container neve 'redis') +REDIS_URL=redis://redis:6379/0 + +# ========================================== +# 4. MONITORING & TOOLS +# ========================================== +# PgAdmin belépés +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +# Code Server (ha használod a webes VS Code-ot) +CODE_SERVER_PASSWORD=Megeszemakalapom11 diff --git a/code-server-config/data/User/History/-5bd368a0/IgjZ b/code-server-config/data/User/History/-5bd368a0/IgjZ new file mode 100755 index 0000000..e293c6b --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/IgjZ @@ -0,0 +1,28 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=MiskociA74 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_port=5432 + +# --- ADATBÁZIS ELÉRÉS (A Python kódnak) --- +# Formátum: postgresql+asyncpg://FELHASZNÁLÓ:JELSZÓ@KONTÉNER_NÉV:PORT/ADATBÁZIS_NÉV +# DATABASE_URL=postgresql+asyncpg://kincses:MiskociA74@postgres-db:5432/service_finder +DATABASE_URL=postgresql+asyncpg://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} + + +# --- REDIS (A session kezeléshez) --- +REDIS_URL=redis://redis:6379/0 + +# PgAdmin +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + +# Backend (FastAPI) +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +CODE_SERVER_PASSWORD=Megeszemakalapom11 diff --git a/code-server-config/data/User/History/-5bd368a0/JyZi b/code-server-config/data/User/History/-5bd368a0/JyZi new file mode 100755 index 0000000..b14a51f --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/JyZi @@ -0,0 +1,25 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=MiskociA74 +POSTGRES_DB=service_finder +POSTGRES_port=5432 + +# --- ADATBÁZIS ELÉRÉS (A Python kódnak) --- +# Formátum: postgresql+asyncpg://FELHASZNÁLÓ:JELSZÓ@KONTÉNER_NÉV:PORT/ADATBÁZIS_NÉV +DATABASE_URL=postgresql+asyncpg://admin:MiskociA74@postgres-db:5432/service_finder + +# --- REDIS (A session kezeléshez) --- +REDIS_URL=redis://redis:6379/0 + +# PgAdmin +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + +# Backend (FastAPI) +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +CODE_SERVER_PASSWORD=Megeszemakalapom11 diff --git a/code-server-config/data/User/History/-5bd368a0/Sl84 b/code-server-config/data/User/History/-5bd368a0/Sl84 new file mode 100755 index 0000000..b272263 --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/Sl84 @@ -0,0 +1,52 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=MiskociA74 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_PORT=5432 + +# Ez a sor építi fel a teljes kapcsolati stringet a fenti változókból. +# Így ha feljebb átírod a jelszót, a program is tudni fogja. +# --- APP KAPCSOLAT (A Pythonnak) --- +# Itt szedjük szét a hosszú sort: +APP_DB_HOST=postgres-db +APP_DB_PORT=5432 +APP_DB_NAME=service_finder +APP_DB_USER=service_finder_app +APP_DB_PASSWORD=Uj_BIZTONSÁGOS_JELSZÓ +# DATABASE_URL=postgresql+asyncpg://${APP_DB_USER}:${APP_DB_PASSWORD}@${APP_DB_HOST}:${APP_DB_PORT}/${APP_DB_NAME} +# DATABASE_URL="postgresql+asyncpg://service_finder_app:AppJelszo@postgres-db:5432/service_finder" + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +# ========================================== +# 3. INFRASTRUKTÚRA & CACHE +# ========================================== +# A Redis belső hálózati elérése (a container neve 'redis') +REDIS_URL=redis://redis:6379/0 + +# MinIO (NAS) elérés - A POSTGRES adatait használjuk az egyszerűségért +MINIO_ROOT_USER=${POSTGRES_USER} +MINIO_ROOT_PASSWORD=${POSTGRES_PASSWORD} +MINIO_ENDPOINT=minio:9000 + +# ========================================== +# 4. MONITORING & TOOLS +# ========================================== +# PgAdmin belépés +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + + + +# Code Server (ha használod a webes VS Code-ot) +CODE_SERVER_PASSWORD=Megeszemakalapom11 diff --git a/code-server-config/data/User/History/-5bd368a0/eSnH b/code-server-config/data/User/History/-5bd368a0/eSnH new file mode 100755 index 0000000..a6c4944 --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/eSnH @@ -0,0 +1,39 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=PASSWORD111 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_PORT=5432 + +# Ez a sor építi fel a teljes kapcsolati stringet a fenti változókból. +# Így ha feljebb átírod a jelszót, a program is tudni fogja. +DATABASE_URL=postgresql+asyncpg://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} + + + +# ========================================== +# 3. INFRASTRUKTÚRA & CACHE +# ========================================== +# A Redis belső hálózati elérése (a container neve 'redis') +REDIS_URL=redis://redis:6379/0 + +# ========================================== +# 4. MONITORING & TOOLS +# ========================================== +# PgAdmin belépés +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +# Code Server (ha használod a webes VS Code-ot) +CODE_SERVER_PASSWORD=Megeszemakalapom11 diff --git a/code-server-config/data/User/History/-5bd368a0/entries.json b/code-server-config/data/User/History/-5bd368a0/entries.json new file mode 100755 index 0000000..7bd0e04 --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/.env","entries":[{"id":"JyZi","timestamp":1769023397317},{"id":"meOw","timestamp":1769023413669},{"id":"Dsy9","timestamp":1769023440910},{"id":"IgjZ","timestamp":1769023484114},{"id":"BlV7","timestamp":1769023497973},{"id":"s8EA","timestamp":1769023523457},{"id":"srWn","timestamp":1769023539158},{"id":"0NIq","timestamp":1769023555060},{"id":"IXdY","timestamp":1769023578147},{"id":"eSnH","timestamp":1769023611510},{"id":"27fC","timestamp":1769023625097},{"id":"6P40","timestamp":1769023637337},{"id":"DBmG","timestamp":1769030384002},{"id":"4MYC","timestamp":1769030519241},{"id":"HmdC","timestamp":1769030581579},{"id":"66Rx","timestamp":1769030663915},{"id":"9UOq","timestamp":1769030684948},{"id":"479L","timestamp":1769030713273},{"id":"GwU6","timestamp":1769031002603},{"id":"H5Zm","source":"undoRedo.source","timestamp":1769031004535},{"id":"Sl84","timestamp":1769031008295},{"id":"tXFs","timestamp":1769031119583},{"id":"wEWX","timestamp":1769031342432},{"id":"udmZ","timestamp":1769031624035},{"id":"oM6T","timestamp":1769040618506},{"id":"eqa5","timestamp":1769041052924},{"id":"8R6W","timestamp":1769041437902},{"id":"DqPk","timestamp":1769041452771}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/-5bd368a0/eqa5 b/code-server-config/data/User/History/-5bd368a0/eqa5 new file mode 100755 index 0000000..22f46ae --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/eqa5 @@ -0,0 +1,59 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=MiskociA74 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_PORT=5432 + +# Ez a sor építi fel a teljes kapcsolati stringet a fenti változókból. +# Így ha feljebb átírod a jelszót, a program is tudni fogja. +# --- APP KAPCSOLAT (A Pythonnak) --- +# Itt szedjük szét a hosszú sort: +APP_DB_HOST=postgres-db +APP_DB_PORT=5432 +APP_DB_NAME=service_finder +APP_DB_USER=service_finder_app +APP_DB_PASSWORD=AppSafePass_2026 +# DATABASE_URL=postgresql+asyncpg://${APP_DB_USER}:${APP_DB_PASSWORD}@${APP_DB_HOST}:${APP_DB_PORT}/${APP_DB_NAME} +# DATABASE_URL="postgresql+asyncpg://service_finder_app:AppJelszo@postgres-db:5432/service_finder" + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 +REFRESH_TOKEN_EXPIRE_DAYS=30 + +# ========================================== +# 3. INFRASTRUKTÚRA & CACHE +# ========================================== +# A Redis belső hálózati elérése (a container neve 'redis') +REDIS_URL=redis://redis:6379/0 + +# MinIO (NAS) elérés - A POSTGRES adatait használjuk az egyszerűségért +MINIO_ROOT_USER=${POSTGRES_USER} +MINIO_ROOT_PASSWORD=${POSTGRES_PASSWORD} +MINIO_ENDPOINT=minio:9000 + +# ========================================== +# 4. MONITORING & TOOLS +# ========================================== +# PgAdmin belépés +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + + + +# Code Server (ha használod a webes VS Code-ot) +CODE_SERVER_PASSWORD=Megeszemakalapom11 + +SECRET_KEY=SzuperTitkosVéletlenszerűKaraktersorozat_Amit_Csak_Te_Tudsz_2026 + + +SENDGRID_API_KEY=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 +FROM_EMAIL=info@profibot.hu \ No newline at end of file diff --git a/code-server-config/data/User/History/-5bd368a0/meOw b/code-server-config/data/User/History/-5bd368a0/meOw new file mode 100755 index 0000000..4e17dd4 --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/meOw @@ -0,0 +1,26 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=MiskociA74 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_port=5432 + +# --- ADATBÁZIS ELÉRÉS (A Python kódnak) --- +# Formátum: postgresql+asyncpg://FELHASZNÁLÓ:JELSZÓ@KONTÉNER_NÉV:PORT/ADATBÁZIS_NÉV +DATABASE_URL=postgresql+asyncpg://admin:MiskociA74@postgres-db:5432/service_finder + +# --- REDIS (A session kezeléshez) --- +REDIS_URL=redis://redis:6379/0 + +# PgAdmin +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + +# Backend (FastAPI) +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +CODE_SERVER_PASSWORD=Megeszemakalapom11 diff --git a/code-server-config/data/User/History/-5bd368a0/oM6T b/code-server-config/data/User/History/-5bd368a0/oM6T new file mode 100755 index 0000000..f3d6691 --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/oM6T @@ -0,0 +1,59 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=MiskociA74 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_PORT=5432 + +# Ez a sor építi fel a teljes kapcsolati stringet a fenti változókból. +# Így ha feljebb átírod a jelszót, a program is tudni fogja. +# --- APP KAPCSOLAT (A Pythonnak) --- +# Itt szedjük szét a hosszú sort: +APP_DB_HOST=postgres-db +APP_DB_PORT=5432 +APP_DB_NAME=service_finder +APP_DB_USER=service_finder_app +APP_DB_PASSWORD=AppSafePass_2026 +# DATABASE_URL=postgresql+asyncpg://${APP_DB_USER}:${APP_DB_PASSWORD}@${APP_DB_HOST}:${APP_DB_PORT}/${APP_DB_NAME} +# DATABASE_URL="postgresql+asyncpg://service_finder_app:AppJelszo@postgres-db:5432/service_finder" + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 +REFRESH_TOKEN_EXPIRE_DAYS=30 + +# ========================================== +# 3. INFRASTRUKTÚRA & CACHE +# ========================================== +# A Redis belső hálózati elérése (a container neve 'redis') +REDIS_URL=redis://redis:6379/0 + +# MinIO (NAS) elérés - A POSTGRES adatait használjuk az egyszerűségért +MINIO_ROOT_USER=${POSTGRES_USER} +MINIO_ROOT_PASSWORD=${POSTGRES_PASSWORD} +MINIO_ENDPOINT=minio:9000 + +# ========================================== +# 4. MONITORING & TOOLS +# ========================================== +# PgAdmin belépés +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + + + +# Code Server (ha használod a webes VS Code-ot) +CODE_SERVER_PASSWORD=Megeszemakalapom11 + +SECRET_KEY=SzuperTitkosVéletlenszerűKaraktersorozat_Amit_Csak_Te_Tudsz_2026 + + +SENDGRID_API_KEY=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 +FROM_EMAIL=kincses@gmail.com \ No newline at end of file diff --git a/code-server-config/data/User/History/-5bd368a0/s8EA b/code-server-config/data/User/History/-5bd368a0/s8EA new file mode 100755 index 0000000..7a63181 --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/s8EA @@ -0,0 +1,70 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=MiskociA74 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_port=5432 + +# --- ADATBÁZIS ELÉRÉS (A Python kódnak) --- +# Formátum: postgresql+asyncpg://FELHASZNÁLÓ:JELSZÓ@KONTÉNER_NÉV:PORT/ADATBÁZIS_NÉV +# DATABASE_URL=postgresql+asyncpg://kincses:MiskociA74@postgres-db:5432/service_finder +DATABASE_URL=postgresql+asyncpg://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} + + + PM senior +Egyéni gem + +Ez egy kiváló észrevétel. Nagyon jól teszed, hogy ezeket a kritikus kulcsokat (SECRET_KEY, ALGORITHM) is beemeled a biztonságos környezetbe. Ezek felelnek ugyanis azért, hogy a felhasználóid bejelentkezve maradjanak, és a jelszavak biztonságban legyenek. + +Összeraktam neked a TELJES, VÉGLEGES .env fájlt, ami egyesíti a te meglévő beállításaidat az általam javasolt újakkal. +1. A Master .env fájl (Ezt hozd létre) + +Ebben a fájlban definiáljuk az "igazságot". A Docker Compose innen fogja kiolvasni az értékeket. + +Másold be ezt a fájlt a projekt gyökérkönyvtárába (.env néven): +Properties + +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=PASSWORD111 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_PORT=5432 + +# Ez a sor építi fel a teljes kapcsolati stringet a fenti változókból. +# Így ha feljebb átírod a jelszót, a program is tudni fogja. +DATABASE_URL=postgresql+asyncpg://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=szuper_titkos_random_string_amit_senki_nem_tud +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +# ========================================== +# 3. INFRASTRUKTÚRA & CACHE +# ========================================== +# A Redis belső hálózati elérése (a container neve 'redis') +REDIS_URL=redis://redis:6379/0 + +# PgAdmin +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +CODE_SERVER_PASSWORD=Megeszemakalapom11 diff --git a/code-server-config/data/User/History/-5bd368a0/srWn b/code-server-config/data/User/History/-5bd368a0/srWn new file mode 100755 index 0000000..81471cc --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/srWn @@ -0,0 +1,73 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=MiskociA74 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_port=5432 + +# --- ADATBÁZIS ELÉRÉS (A Python kódnak) --- +# Formátum: postgresql+asyncpg://FELHASZNÁLÓ:JELSZÓ@KONTÉNER_NÉV:PORT/ADATBÁZIS_NÉV +# DATABASE_URL=postgresql+asyncpg://kincses:MiskociA74@postgres-db:5432/service_finder +DATABASE_URL=postgresql+asyncpg://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} + + + PM senior +Egyéni gem + +Ez egy kiváló észrevétel. Nagyon jól teszed, hogy ezeket a kritikus kulcsokat (SECRET_KEY, ALGORITHM) is beemeled a biztonságos környezetbe. Ezek felelnek ugyanis azért, hogy a felhasználóid bejelentkezve maradjanak, és a jelszavak biztonságban legyenek. + +Összeraktam neked a TELJES, VÉGLEGES .env fájlt, ami egyesíti a te meglévő beállításaidat az általam javasolt újakkal. +1. A Master .env fájl (Ezt hozd létre) + +Ebben a fájlban definiáljuk az "igazságot". A Docker Compose innen fogja kiolvasni az értékeket. + +Másold be ezt a fájlt a projekt gyökérkönyvtárába (.env néven): +Properties + +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=PASSWORD111 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_PORT=5432 + +# Ez a sor építi fel a teljes kapcsolati stringet a fenti változókból. +# Így ha feljebb átírod a jelszót, a program is tudni fogja. +DATABASE_URL=postgresql+asyncpg://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB} + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=szuper_titkos_random_string_amit_senki_nem_tud +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +# ========================================== +# 3. INFRASTRUKTÚRA & CACHE +# ========================================== +# A Redis belső hálózati elérése (a container neve 'redis') +REDIS_URL=redis://redis:6379/0 + +# ========================================== +# 4. MONITORING & TOOLS +# ========================================== +# PgAdmin belépés +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +CODE_SERVER_PASSWORD=Megeszemakalapom11 diff --git a/code-server-config/data/User/History/-5bd368a0/tXFs b/code-server-config/data/User/History/-5bd368a0/tXFs new file mode 100755 index 0000000..e737d66 --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/tXFs @@ -0,0 +1,52 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=MiskociA74 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_PORT=5432 + +# Ez a sor építi fel a teljes kapcsolati stringet a fenti változókból. +# Így ha feljebb átírod a jelszót, a program is tudni fogja. +# --- APP KAPCSOLAT (A Pythonnak) --- +# Itt szedjük szét a hosszú sort: +APP_DB_HOST=postgres-db +APP_DB_PORT=5432 +APP_DB_NAME=service_finder +APP_DB_USER=service_finder_app +APP_DB_PASSWORD=AppSafePass_2026 +# DATABASE_URL=postgresql+asyncpg://${APP_DB_USER}:${APP_DB_PASSWORD}@${APP_DB_HOST}:${APP_DB_PORT}/${APP_DB_NAME} +# DATABASE_URL="postgresql+asyncpg://service_finder_app:AppJelszo@postgres-db:5432/service_finder" + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +# ========================================== +# 3. INFRASTRUKTÚRA & CACHE +# ========================================== +# A Redis belső hálózati elérése (a container neve 'redis') +REDIS_URL=redis://redis:6379/0 + +# MinIO (NAS) elérés - A POSTGRES adatait használjuk az egyszerűségért +MINIO_ROOT_USER=${POSTGRES_USER} +MINIO_ROOT_PASSWORD=${POSTGRES_PASSWORD} +MINIO_ENDPOINT=minio:9000 + +# ========================================== +# 4. MONITORING & TOOLS +# ========================================== +# PgAdmin belépés +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + + + +# Code Server (ha használod a webes VS Code-ot) +CODE_SERVER_PASSWORD=Megeszemakalapom11 diff --git a/code-server-config/data/User/History/-5bd368a0/udmZ b/code-server-config/data/User/History/-5bd368a0/udmZ new file mode 100755 index 0000000..3ca803e --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/udmZ @@ -0,0 +1,55 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=MiskociA74 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_PORT=5432 + +# Ez a sor építi fel a teljes kapcsolati stringet a fenti változókból. +# Így ha feljebb átírod a jelszót, a program is tudni fogja. +# --- APP KAPCSOLAT (A Pythonnak) --- +# Itt szedjük szét a hosszú sort: +APP_DB_HOST=postgres-db +APP_DB_PORT=5432 +APP_DB_NAME=service_finder +APP_DB_USER=service_finder_app +APP_DB_PASSWORD=AppSafePass_2026 +# DATABASE_URL=postgresql+asyncpg://${APP_DB_USER}:${APP_DB_PASSWORD}@${APP_DB_HOST}:${APP_DB_PORT}/${APP_DB_NAME} +# DATABASE_URL="postgresql+asyncpg://service_finder_app:AppJelszo@postgres-db:5432/service_finder" + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 +REFRESH_TOKEN_EXPIRE_DAYS=30 + +# ========================================== +# 3. INFRASTRUKTÚRA & CACHE +# ========================================== +# A Redis belső hálózati elérése (a container neve 'redis') +REDIS_URL=redis://redis:6379/0 + +# MinIO (NAS) elérés - A POSTGRES adatait használjuk az egyszerűségért +MINIO_ROOT_USER=${POSTGRES_USER} +MINIO_ROOT_PASSWORD=${POSTGRES_PASSWORD} +MINIO_ENDPOINT=minio:9000 + +# ========================================== +# 4. MONITORING & TOOLS +# ========================================== +# PgAdmin belépés +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + + + +# Code Server (ha használod a webes VS Code-ot) +CODE_SERVER_PASSWORD=Megeszemakalapom11 + +SECRET_KEY=SzuperTitkosVéletlenszerűKaraktersorozat_Amit_Csak_Te_Tudsz_2026 \ No newline at end of file diff --git a/code-server-config/data/User/History/-5bd368a0/wEWX b/code-server-config/data/User/History/-5bd368a0/wEWX new file mode 100755 index 0000000..b582744 --- /dev/null +++ b/code-server-config/data/User/History/-5bd368a0/wEWX @@ -0,0 +1,53 @@ +# ========================================== +# 1. ADATBÁZIS KONFIGURÁCIÓ (PostgreSQL) +# ========================================== +POSTGRES_USER=kincses +POSTGRES_PASSWORD=MiskociA74 +POSTGRES_DB=service_finder +POSTGRES_HOST=postgres-db +POSTGRES_PORT=5432 + +# Ez a sor építi fel a teljes kapcsolati stringet a fenti változókból. +# Így ha feljebb átírod a jelszót, a program is tudni fogja. +# --- APP KAPCSOLAT (A Pythonnak) --- +# Itt szedjük szét a hosszú sort: +APP_DB_HOST=postgres-db +APP_DB_PORT=5432 +APP_DB_NAME=service_finder +APP_DB_USER=service_finder_app +APP_DB_PASSWORD=AppSafePass_2026 +# DATABASE_URL=postgresql+asyncpg://${APP_DB_USER}:${APP_DB_PASSWORD}@${APP_DB_HOST}:${APP_DB_PORT}/${APP_DB_NAME} +# DATABASE_URL="postgresql+asyncpg://service_finder_app:AppJelszo@postgres-db:5432/service_finder" + +# ========================================== +# 2. BIZTONSÁG & AUTH (FastAPI) +# ========================================== +# A JWT tokenek aláírásához. Ezt SOHA ne add ki senkinek! +# Generálj egy újat linuxon ezzel: openssl rand -hex 32 +SECRET_KEY=GeneraltRandomHosszuStringAmiTitkos +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 +REFRESH_TOKEN_EXPIRE_DAYS=30 + +# ========================================== +# 3. INFRASTRUKTÚRA & CACHE +# ========================================== +# A Redis belső hálózati elérése (a container neve 'redis') +REDIS_URL=redis://redis:6379/0 + +# MinIO (NAS) elérés - A POSTGRES adatait használjuk az egyszerűségért +MINIO_ROOT_USER=${POSTGRES_USER} +MINIO_ROOT_PASSWORD=${POSTGRES_PASSWORD} +MINIO_ENDPOINT=minio:9000 + +# ========================================== +# 4. MONITORING & TOOLS +# ========================================== +# PgAdmin belépés +PGADMIN_EMAIL=kincses@gmail.com +PGADMIN_PASSWORD=MiskociA74 + + + +# Code Server (ha használod a webes VS Code-ot) +CODE_SERVER_PASSWORD=Megeszemakalapom11 diff --git a/code-server-config/data/User/History/-5e83fa91/4Cft.py b/code-server-config/data/User/History/-5e83fa91/4Cft.py new file mode 100755 index 0000000..3788613 --- /dev/null +++ b/code-server-config/data/User/History/-5e83fa91/4Cft.py @@ -0,0 +1,35 @@ +ffrom typing import Optional +from pydantic_settings import BaseSettings, SettingsConfigDict + +class Settings(BaseSettings): + # --- General --- + PROJECT_NAME: str = "Traffic Ecosystem SuperApp" + VERSION: str = "2.0.0" + API_V1_STR: str = "/api/v1" + + # --- Security --- + SECRET_KEY: str # Must be set in .env + ALGORITHM: str = "HS256" + ACCESS_TOKEN_EXPIRE_MINUTES: int = 60 + + # --- Database (Postgres) --- + DATABASE_URL: str # e.g., postgresql+asyncpg://user:pass@db:5432/dbname + + # --- Storage (MinIO) --- + MINIO_ENDPOINT: str # e.g., minio:9000 + MINIO_ACCESS_KEY: str + MINIO_SECRET_KEY: str + MINIO_BUCKET_NAME: str = "fleet-data" + + # --- Cache (Redis) --- + REDIS_URL: str = "redis://redis:6379/0" + + # Pydantic V2 Config + model_config = SettingsConfigDict( + env_file=".env", + env_file_encoding="utf-8", + case_sensitive=True, + extra="ignore" # Ignore extra env vars (like Docker internal vars) + ) + +settings = Settings() \ No newline at end of file diff --git a/code-server-config/data/User/History/-5e83fa91/5GlT.py b/code-server-config/data/User/History/-5e83fa91/5GlT.py new file mode 100755 index 0000000..9c31499 --- /dev/null +++ b/code-server-config/data/User/History/-5e83fa91/5GlT.py @@ -0,0 +1,35 @@ +from typing import Optional +from pydantic_settings import BaseSettings, SettingsConfigDict + +class Settings(BaseSettings): + # --- General --- + PROJECT_NAME: str = "Traffic Ecosystem SuperApp" + VERSION: str = "2.0.0" + API_V1_STR: str = "/api/v1" + + # --- Security --- + SECRET_KEY: str # Must be set in .env + ALGORITHM: str = "HS256" + ACCESS_TOKEN_EXPIRE_MINUTES: int = 60 + + # --- Database (Postgres) --- + DATABASE_URL: str # e.g., postgresql+asyncpg://user:pass@db:5432/dbname + + # --- Storage (MinIO) --- + MINIO_ENDPOINT: str # e.g., minio:9000 + MINIO_ACCESS_KEY: str + MINIO_SECRET_KEY: str + MINIO_BUCKET_NAME: str = "fleet-data" + + # --- Cache (Redis) --- + REDIS_URL: str = "redis://redis:6379/0" + + # Pydantic V2 Config + model_config = SettingsConfigDict( + env_file=".env", + env_file_encoding="utf-8", + case_sensitive=True, + extra="ignore" # Ignore extra env vars (like Docker internal vars) + ) + +settings = Settings() \ No newline at end of file diff --git a/code-server-config/data/User/History/-5e83fa91/entries.json b/code-server-config/data/User/History/-5e83fa91/entries.json new file mode 100755 index 0000000..2c1c44c --- /dev/null +++ b/code-server-config/data/User/History/-5e83fa91/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/backend/app/core/config.py","entries":[{"id":"4Cft.py","timestamp":1769025385175},{"id":"5GlT.py","timestamp":1769027431998}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/-638902d7/2Pxf.py b/code-server-config/data/User/History/-638902d7/2Pxf.py new file mode 100755 index 0000000..303f6f7 --- /dev/null +++ b/code-server-config/data/User/History/-638902d7/2Pxf.py @@ -0,0 +1,114 @@ +import asyncio +import sys +import os + +# Hozzáadjuk az app könyvtárat az útvonalhoz, hogy működjenek az importok +sys.path.append(os.path.join(os.path.dirname(__file__), '..')) + +from app.core.database import SessionLocal # FIGYELEM: Itt a régi vagy új helytől függően ellenőrizd! +# Ha a SessionLocal a db/session.py-ben van: +# from app.db.session import SessionLocal + +from app.models.user import User +from app.models.social import ServiceProvider, Competition, ModerationStatus +from app.services.social_service import vote_for_provider +from sqlalchemy import text +from datetime import datetime, timedelta + +async def run_simulation(): + async with SessionLocal() as db: + print("--- 1. TAKARÍTÁS (Előző tesztadatok törlése) ---") + # Kaszkádolt törlés a data sémában + await db.execute(text("TRUNCATE TABLE data.user_scores, data.votes, data.service_providers, data.competitions, data.users RESTART IDENTITY CASCADE")) + await db.commit() + + print("\n--- 2. SZEREPLŐK LÉTREHOZÁSA ---") + # Admin + admin = User(email="admin@test.com", password_hash="hash", full_name="Admin", is_superuser=True) + # Jófiú (aki valós boltokat tölt fel) + good_user = User(email="good@test.com", password_hash="hash", full_name="Good Guy", reputation_score=5) + # Rosszfiú (aki fake boltokat tölt fel) + bad_user = User(email="bad@test.com", password_hash="hash", full_name="Spammer", reputation_score=-8) # Közel a banhoz + # Szavazóközönség + voter1 = User(email="voter1@test.com", password_hash="hash", full_name="Voter 1") + voter2 = User(email="voter2@test.com", password_hash="hash", full_name="Voter 2") + voter3 = User(email="voter3@test.com", password_hash="hash", full_name="Voter 3") + voter4 = User(email="voter4@test.com", password_hash="hash", full_name="Voter 4") + voter5 = User(email="voter5@test.com", password_hash="hash", full_name="Voter 5") + + db.add_all([admin, good_user, bad_user, voter1, voter2, voter3, voter4, voter5]) + await db.commit() + + # ID-k lekérése + for u in [good_user, bad_user, voter1, voter2, voter3, voter4, voter5]: + await db.refresh(u) + + print("\n--- 3. VERSENY INDÍTÁSA ---") + race = Competition( + name="Nagy Januári Verseny", + description="Töltsd fel a legtöbb boltot!", + start_date=datetime.utcnow() - timedelta(days=1), + end_date=datetime.utcnow() + timedelta(days=30), + is_active=True + ) + db.add(race) + await db.commit() + await db.refresh(race) + + print("\n--- 4. SZCENÁRIÓ A: A JÓ FELHASZNÁLÓ ---") + # Good Guy feltölt egy boltot + good_shop = ServiceProvider( + name="Korrekt Gumiszerviz", + address="Fő utca 1.", + added_by_user_id=good_user.id, + status=ModerationStatus.pending + ) + db.add(good_shop) + await db.commit() + await db.refresh(good_shop) + + # A tömeg megszavazza (Kell 5 pont az elfogadáshoz) + print(f"Szavazás a '{good_shop.name}' boltra...") + await vote_for_provider(db, voter1.id, good_shop.id, 1) + await vote_for_provider(db, voter2.id, good_shop.id, 1) + await vote_for_provider(db, voter3.id, good_shop.id, 1) + await vote_for_provider(db, voter4.id, good_shop.id, 1) + await vote_for_provider(db, voter5.id, good_shop.id, 1) # Itt éri el az 5-öt! + + # Eredmény ellenőrzése + await db.refresh(good_user) + print(f"Good Guy Hírneve (Elvárt: 6): {good_user.reputation_score}") + # Pontszám ellenőrzése közvetlen SQL-el a biztonság kedvéért + points = await db.execute(text(f"SELECT points FROM data.user_scores WHERE user_id={good_user.id}")) + print(f"Good Guy Verseny Pontjai (Elvárt: 10): {points.scalar()}") + + print("\n--- 5. SZCENÁRIÓ B: A ROSSZ FELHASZNÁLÓ (AUTO-BAN TESZT) ---") + # Bad Guy feltölt egy fake boltot + fake_shop = ServiceProvider( + name="KAMU Bolt", + address="Nincs ilyen utca", + added_by_user_id=bad_user.id, + status=ModerationStatus.pending + ) + db.add(fake_shop) + await db.commit() + await db.refresh(fake_shop) + + # A tömeg leszavazza (Kell -3 az elutasításhoz) + print(f"Szavazás a '{fake_shop.name}' boltra...") + await vote_for_provider(db, voter1.id, fake_shop.id, -1) + await vote_for_provider(db, voter2.id, fake_shop.id, -1) + await vote_for_provider(db, voter3.id, fake_shop.id, -1) # Itt éri el a -3-at! + + # Eredmény ellenőrzése + await db.refresh(bad_user) + print(f"Bad User Hírneve (Elvárt: -10): {bad_user.reputation_score}") + print(f"Bad User Aktív? (Elvárt: False/Banned): {bad_user.is_active}") + + if not bad_user.is_active: + print("✅ SIKER: A rendszer automatikusan kitiltotta a csalót!") + else: + print("❌ HIBA: A felhasználó még mindig aktív.") + +if __name__ == "__main__": + asyncio.run(run_simulation()) \ No newline at end of file diff --git a/code-server-config/data/User/History/-638902d7/6Sot.py b/code-server-config/data/User/History/-638902d7/6Sot.py new file mode 100755 index 0000000..b8a090f --- /dev/null +++ b/code-server-config/data/User/History/-638902d7/6Sot.py @@ -0,0 +1,114 @@ +import asyncio +import sys +import os + +# Hozzáadjuk az app könyvtárat az útvonalhoz, hogy működjenek az importok +sys.path.append(os.path.join(os.path.dirname(__file__), '..')) + +from app.db.session import SessionLocal # FIGYELEM: Itt a régi vagy új helytől függően ellenőrizd! +# Ha a SessionLocal a db/session.py-ben van: +# from app.db.session import SessionLocal + +from app.models.user import User +from app.models.social import ServiceProvider, Competition, ModerationStatus +from app.services.social_service import vote_for_provider +from sqlalchemy import text +from datetime import datetime, timedelta + +async def run_simulation(): + async with SessionLocal() as db: + print("--- 1. TAKARÍTÁS (Előző tesztadatok törlése) ---") + # Kaszkádolt törlés a data sémában + await db.execute(text("TRUNCATE TABLE data.user_scores, data.votes, data.service_providers, data.competitions, data.users RESTART IDENTITY CASCADE")) + await db.commit() + + print("\n--- 2. SZEREPLŐK LÉTREHOZÁSA ---") + # Admin + admin = User(email="admin@test.com", password_hash="hash", full_name="Admin", is_superuser=True) + # Jófiú (aki valós boltokat tölt fel) + good_user = User(email="good@test.com", password_hash="hash", full_name="Good Guy", reputation_score=5) + # Rosszfiú (aki fake boltokat tölt fel) + bad_user = User(email="bad@test.com", password_hash="hash", full_name="Spammer", reputation_score=-8) # Közel a banhoz + # Szavazóközönség + voter1 = User(email="voter1@test.com", password_hash="hash", full_name="Voter 1") + voter2 = User(email="voter2@test.com", password_hash="hash", full_name="Voter 2") + voter3 = User(email="voter3@test.com", password_hash="hash", full_name="Voter 3") + voter4 = User(email="voter4@test.com", password_hash="hash", full_name="Voter 4") + voter5 = User(email="voter5@test.com", password_hash="hash", full_name="Voter 5") + + db.add_all([admin, good_user, bad_user, voter1, voter2, voter3, voter4, voter5]) + await db.commit() + + # ID-k lekérése + for u in [good_user, bad_user, voter1, voter2, voter3, voter4, voter5]: + await db.refresh(u) + + print("\n--- 3. VERSENY INDÍTÁSA ---") + race = Competition( + name="Nagy Januári Verseny", + description="Töltsd fel a legtöbb boltot!", + start_date=datetime.utcnow() - timedelta(days=1), + end_date=datetime.utcnow() + timedelta(days=30), + is_active=True + ) + db.add(race) + await db.commit() + await db.refresh(race) + + print("\n--- 4. SZCENÁRIÓ A: A JÓ FELHASZNÁLÓ ---") + # Good Guy feltölt egy boltot + good_shop = ServiceProvider( + name="Korrekt Gumiszerviz", + address="Fő utca 1.", + added_by_user_id=good_user.id, + status=ModerationStatus.pending + ) + db.add(good_shop) + await db.commit() + await db.refresh(good_shop) + + # A tömeg megszavazza (Kell 5 pont az elfogadáshoz) + print(f"Szavazás a '{good_shop.name}' boltra...") + await vote_for_provider(db, voter1.id, good_shop.id, 1) + await vote_for_provider(db, voter2.id, good_shop.id, 1) + await vote_for_provider(db, voter3.id, good_shop.id, 1) + await vote_for_provider(db, voter4.id, good_shop.id, 1) + await vote_for_provider(db, voter5.id, good_shop.id, 1) # Itt éri el az 5-öt! + + # Eredmény ellenőrzése + await db.refresh(good_user) + print(f"Good Guy Hírneve (Elvárt: 6): {good_user.reputation_score}") + # Pontszám ellenőrzése közvetlen SQL-el a biztonság kedvéért + points = await db.execute(text(f"SELECT points FROM data.user_scores WHERE user_id={good_user.id}")) + print(f"Good Guy Verseny Pontjai (Elvárt: 10): {points.scalar()}") + + print("\n--- 5. SZCENÁRIÓ B: A ROSSZ FELHASZNÁLÓ (AUTO-BAN TESZT) ---") + # Bad Guy feltölt egy fake boltot + fake_shop = ServiceProvider( + name="KAMU Bolt", + address="Nincs ilyen utca", + added_by_user_id=bad_user.id, + status=ModerationStatus.pending + ) + db.add(fake_shop) + await db.commit() + await db.refresh(fake_shop) + + # A tömeg leszavazza (Kell -3 az elutasításhoz) + print(f"Szavazás a '{fake_shop.name}' boltra...") + await vote_for_provider(db, voter1.id, fake_shop.id, -1) + await vote_for_provider(db, voter2.id, fake_shop.id, -1) + await vote_for_provider(db, voter3.id, fake_shop.id, -1) # Itt éri el a -3-at! + + # Eredmény ellenőrzése + await db.refresh(bad_user) + print(f"Bad User Hírneve (Elvárt: -10): {bad_user.reputation_score}") + print(f"Bad User Aktív? (Elvárt: False/Banned): {bad_user.is_active}") + + if not bad_user.is_active: + print("✅ SIKER: A rendszer automatikusan kitiltotta a csalót!") + else: + print("❌ HIBA: A felhasználó még mindig aktív.") + +if __name__ == "__main__": + asyncio.run(run_simulation()) \ No newline at end of file diff --git a/code-server-config/data/User/History/-638902d7/YGCT.py b/code-server-config/data/User/History/-638902d7/YGCT.py new file mode 100755 index 0000000..c6e715b --- /dev/null +++ b/code-server-config/data/User/History/-638902d7/YGCT.py @@ -0,0 +1,118 @@ +import asyncio +import sys +import os + +# Útvonal beállítása +sys.path.append(os.path.join(os.path.dirname(__file__), '..')) + +# --- JAVÍTÁS 1: A Helyes Aszinkron Session Importálása --- +from app.db.session import AsyncSessionLocal +# --------------------------------------------------------- + +from app.models.user import User +from app.models.social import ServiceProvider, Competition, ModerationStatus +from app.services.social_service import vote_for_provider +from sqlalchemy import text +from datetime import datetime, timedelta + +async def run_simulation(): + # --- JAVÍTÁS 2: Itt is az AsyncSessionLocal-t használjuk --- + async with AsyncSessionLocal() as db: + # ----------------------------------------------------------- + print("--- 1. TAKARÍTÁS (Előző tesztadatok törlése) ---") + # Kaszkádolt törlés a data sémában + await db.execute(text("TRUNCATE TABLE data.user_scores, data.votes, data.service_providers, data.competitions, data.users RESTART IDENTITY CASCADE")) + await db.commit() + + print("\n--- 2. SZEREPLŐK LÉTREHOZÁSA ---") + # Admin + admin = User(email="admin@test.com", password_hash="hash", full_name="Admin", is_superuser=True) + # Jófiú (aki valós boltokat tölt fel) + good_user = User(email="good@test.com", password_hash="hash", full_name="Good Guy", reputation_score=5) + # Rosszfiú (aki fake boltokat tölt fel) + bad_user = User(email="bad@test.com", password_hash="hash", full_name="Spammer", reputation_score=-8) # Közel a banhoz + # Szavazóközönség + voter1 = User(email="voter1@test.com", password_hash="hash", full_name="Voter 1") + voter2 = User(email="voter2@test.com", password_hash="hash", full_name="Voter 2") + voter3 = User(email="voter3@test.com", password_hash="hash", full_name="Voter 3") + voter4 = User(email="voter4@test.com", password_hash="hash", full_name="Voter 4") + voter5 = User(email="voter5@test.com", password_hash="hash", full_name="Voter 5") + + db.add_all([admin, good_user, bad_user, voter1, voter2, voter3, voter4, voter5]) + await db.commit() + + # ID-k lekérése + for u in [good_user, bad_user, voter1, voter2, voter3, voter4, voter5]: + await db.refresh(u) + + print("\n--- 3. VERSENY INDÍTÁSA ---") + race = Competition( + name="Nagy Januári Verseny", + description="Töltsd fel a legtöbb boltot!", + start_date=datetime.utcnow() - timedelta(days=1), + end_date=datetime.utcnow() + timedelta(days=30), + is_active=True + ) + db.add(race) + await db.commit() + await db.refresh(race) + + print("\n--- 4. SZCENÁRIÓ A: A JÓ FELHASZNÁLÓ ---") + # Good Guy feltölt egy boltot + good_shop = ServiceProvider( + name="Korrekt Gumiszerviz", + address="Fő utca 1.", + added_by_user_id=good_user.id, + status=ModerationStatus.pending + ) + db.add(good_shop) + await db.commit() + await db.refresh(good_shop) + + # A tömeg megszavazza (Kell 5 pont az elfogadáshoz) + print(f"Szavazás a '{good_shop.name}' boltra...") + await vote_for_provider(db, voter1.id, good_shop.id, 1) + await vote_for_provider(db, voter2.id, good_shop.id, 1) + await vote_for_provider(db, voter3.id, good_shop.id, 1) + await vote_for_provider(db, voter4.id, good_shop.id, 1) + await vote_for_provider(db, voter5.id, good_shop.id, 1) # Itt éri el az 5-öt! + + # Eredmény ellenőrzése + await db.refresh(good_user) + print(f"Good Guy Hírneve (Elvárt: 6): {good_user.reputation_score}") + + # Pontszám ellenőrzése + points = await db.execute(text(f"SELECT points FROM data.user_scores WHERE user_id={good_user.id}")) + scalar_points = points.scalar() + print(f"Good Guy Verseny Pontjai (Elvárt: 10): {scalar_points}") + + print("\n--- 5. SZCENÁRIÓ B: A ROSSZ FELHASZNÁLÓ (AUTO-BAN TESZT) ---") + # Bad Guy feltölt egy fake boltot + fake_shop = ServiceProvider( + name="KAMU Bolt", + address="Nincs ilyen utca", + added_by_user_id=bad_user.id, + status=ModerationStatus.pending + ) + db.add(fake_shop) + await db.commit() + await db.refresh(fake_shop) + + # A tömeg leszavazza (Kell -3 az elutasításhoz) + print(f"Szavazás a '{fake_shop.name}' boltra...") + await vote_for_provider(db, voter1.id, fake_shop.id, -1) + await vote_for_provider(db, voter2.id, fake_shop.id, -1) + await vote_for_provider(db, voter3.id, fake_shop.id, -1) # Itt éri el a -3-at! + + # Eredmény ellenőrzése + await db.refresh(bad_user) + print(f"Bad User Hírneve (Elvárt: -10): {bad_user.reputation_score}") + print(f"Bad User Aktív? (Elvárt: False/Banned): {bad_user.is_active}") + + if not bad_user.is_active: + print("✅ SIKER: A rendszer automatikusan kitiltotta a csalót!") + else: + print("❌ HIBA: A felhasználó még mindig aktív.") + +if __name__ == "__main__": + asyncio.run(run_simulation()) \ No newline at end of file diff --git a/code-server-config/data/User/History/-638902d7/entries.json b/code-server-config/data/User/History/-638902d7/entries.json new file mode 100755 index 0000000..7a474fe --- /dev/null +++ b/code-server-config/data/User/History/-638902d7/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/backend/app/seed_data.py","entries":[{"id":"2Pxf.py","timestamp":1769033864915},{"id":"6Sot.py","timestamp":1769034106288},{"id":"YGCT.py","timestamp":1769034335646}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/-6713540d/entries.json b/code-server-config/data/User/History/-6713540d/entries.json new file mode 100755 index 0000000..e4abfb7 --- /dev/null +++ b/code-server-config/data/User/History/-6713540d/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/requirements.txt","entries":[{"id":"xRtx.txt","timestamp":1769025945435}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/-6713540d/xRtx.txt b/code-server-config/data/User/History/-6713540d/xRtx.txt new file mode 100755 index 0000000..0c5c800 --- /dev/null +++ b/code-server-config/data/User/History/-6713540d/xRtx.txt @@ -0,0 +1,8 @@ +fastapi +uvicorn[standard] +psycopg[binary] +python-jose[cryptography] +passlib[bcrypt] +pydantic +pydantic-settings +python-multipart diff --git a/code-server-config/data/User/History/-6f62bdcf/Krug.py b/code-server-config/data/User/History/-6f62bdcf/Krug.py new file mode 100755 index 0000000..68a7f14 --- /dev/null +++ b/code-server-config/data/User/History/-6f62bdcf/Krug.py @@ -0,0 +1,32 @@ +import os +from datetime import datetime, timedelta +from typing import Any, Union +from jose import jwt +from passlib.context import CryptContext + +# Jelszó titkosítás beállítása +pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") + +# Környezeti változók (idővel menjenek a config.py-ba) +SECRET_KEY = os.getenv("SECRET_KEY", "09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7") +ALGORITHM = "HS256" + +def verify_password(plain_password: str, hashed_password: str) -> bool: + """Ellenőrzi, hogy a megadott jelszó egyezik-e a hash-elt változattal.""" + return pwd_context.verify(plain_password, hashed_password) + +def get_password_hash(password: str) -> str: + """Létrehozza a jelszó biztonságos hash-ét.""" + return pwd_context.hash(password) + +def create_access_token(data: dict, expires_delta: Union[timedelta, None] = None) -> str: + """Létrehoz egy JWT tokent.""" + to_encode = data.copy() + if expires_delta: + expire = datetime.utcnow() + expires_delta + else: + expire = datetime.utcnow() + timedelta(minutes=1440) # 1 nap alapértelmezett + + to_encode.update({"exp": expire}) + encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM) + return encoded_jwt diff --git a/code-server-config/data/User/History/-6f62bdcf/entries.json b/code-server-config/data/User/History/-6f62bdcf/entries.json new file mode 100755 index 0000000..237602a --- /dev/null +++ b/code-server-config/data/User/History/-6f62bdcf/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/backend/app/core/security.py","entries":[{"id":"Krug.py","timestamp":1769041965907},{"id":"gq3x.py","timestamp":1769042450084}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/-6f62bdcf/gq3x.py b/code-server-config/data/User/History/-6f62bdcf/gq3x.py new file mode 100755 index 0000000..317e6dd --- /dev/null +++ b/code-server-config/data/User/History/-6f62bdcf/gq3x.py @@ -0,0 +1,36 @@ +import os +import bcrypt +from datetime import datetime, timedelta +from typing import Any, Union +from jose import jwt + +# Titkosítási beállítások +SECRET_KEY = os.getenv("SECRET_KEY", "09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7") +ALGORITHM = "HS256" + +def verify_password(plain_password: str, hashed_password: str) -> bool: + """Ellenőrzi a jelszót közvetlenül a bcrypt használatával.""" + # A bcrypt byte-okat vár, ezért konvertáljuk le + password_bytes = plain_password.encode('utf-8') + hashed_bytes = hashed_password.encode('utf-8') + return bcrypt.checkpw(password_bytes, hashed_bytes) + +def get_password_hash(password: str) -> str: + """Létrehozza a jelszó hash-ét közvetlenül a bcrypt használatával.""" + # Salt generálás és hash-elés + salt = bcrypt.gensalt() + password_bytes = password.encode('utf-8') + hashed = bcrypt.hashpw(password_bytes, salt) + return hashed.decode('utf-8') + +def create_access_token(data: dict, expires_delta: Union[timedelta, None] = None) -> str: + """JWT token generálása.""" + to_encode = data.copy() + if expires_delta: + expire = datetime.utcnow() + expires_delta + else: + expire = datetime.utcnow() + timedelta(minutes=1440) + + to_encode.update({"exp": expire}) + encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM) + return encoded_jwt \ No newline at end of file diff --git a/code-server-config/data/User/History/-706ef310/8tZ1.yml b/code-server-config/data/User/History/-706ef310/8tZ1.yml new file mode 100755 index 0000000..2ad1b0b --- /dev/null +++ b/code-server-config/data/User/History/-706ef310/8tZ1.yml @@ -0,0 +1,94 @@ +services: + # 1. ADATBÁZIS (NAS-ra mentett adatokkal) + postgres-db: + image: postgres:15 + container_name: postgres-db + environment: + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + volumes: + # A perzisztens adatbázis fájlok a NAS-ra kerülnek + - /mnt/nas/app_data/postgres_data:/var/lib/postgresql/data + ports: + - "${POSTGRES_PORT}:${POSTGRES_PORT}" + networks: + - service_finder_net + restart: unless-stopped + + # 2. BACKEND API (NAS-on lévő kódbázissal) + service_finder_api: + build: + context: ./backend + dockerfile: Dockerfile + container_name: service_finder_api + volumes: + # A forráskódot a NAS-ról olvassa be + - /mnt/nas/git_vault/service_finder/backend:/app + command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --proxy-headers --forwarded-allow-ips="*" + ports: + - "8000:8000" + environment: + - PYTHONPATH=/app + - DATABASE_URL=postgresql+asyncpg://${APP_DB_USER}:${APP_DB_PASSWORD}@postgres-db:${APP_DB_PORT}/${APP_DB_NAME} + - SECRET_KEY=${SECRET_KEY} + - ALLOWED_ORIGINS=https://dev.profibot.hu,https://app.profibot.hu + - MINIO_ENDPOINT=minio:9000 + - MINIO_ACCESS_KEY=${POSTGRES_USER} + - MINIO_SECRET_KEY=${POSTGRES_PASSWORD} + depends_on: + - postgres-db + - minio + - redis + networks: + - service_finder_net + + # 3. PGADMIN (Adminisztrációs felület) + pgadmin: + image: dpage/pgadmin4 + container_name: pgadmin_ui + environment: + PGADMIN_DEFAULT_EMAIL: ${PGADMIN_EMAIL} + PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_PASSWORD} + volumes: + # A pgAdmin beállításai is maradjanak meg a NAS-on + - /mnt/nas/app_data/pgadmin_data:/var/lib/pgadmin + ports: + - "5050:80" + depends_on: + - postgres-db + networks: + - service_finder_net + + # 4. MINIO (A fájlok fizikai helye a NAS) + minio: + image: minio/minio + container_name: service_finder_minio + command: server /data --console-address ":9001" + environment: + MINIO_ROOT_USER: ${POSTGRES_USER} + MINIO_ROOT_PASSWORD: ${POSTGRES_PASSWORD} + volumes: + # Ez a legfontosabb: a képek és számlák a NAS-ra mennek + - /mnt/nas/app_data/minio_data:/data + ports: + - "9000:9000" + - "9001:9001" + networks: + - service_finder_net + + # 5. REDIS (Gyorsítótár) + redis: + image: redis:alpine + container_name: service_finder_redis + volumes: + # A Redis snapshot-ok a NAS-ra kerülnek + - /mnt/nas/app_data/redis_data:/data + networks: + - service_finder_net + +networks: + service_finder_net: + driver: bridge + +# Megjegyzés: A lenti volume-okat töröltük, mert "Bind Mount"-ra (direkt útvonalra) váltottunk \ No newline at end of file diff --git a/code-server-config/data/User/History/-706ef310/G0yH.yml b/code-server-config/data/User/History/-706ef310/G0yH.yml new file mode 100755 index 0000000..f9a6668 --- /dev/null +++ b/code-server-config/data/User/History/-706ef310/G0yH.yml @@ -0,0 +1,106 @@ +services: + # 1. ADATBÁZIS (NAS-ra mentett adatokkal) + postgres-db: + image: postgres:15 + container_name: postgres-db + environment: + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + volumes: + # A perzisztens adatbázis fájlok a NAS-ra kerülnek + - /mnt/nas/app_data/postgres_data:/var/lib/postgresql/data + ports: + - "${POSTGRES_PORT}:${POSTGRES_PORT}" + networks: + - service_finder_net + restart: unless-stopped + + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] + interval: 5s + timeout: 5s + retries: 5 + + # 2. BACKEND API (NAS-on lévő kódbázissal) + service_finder_api: + build: + context: ./backend + dockerfile: Dockerfile + container_name: service_finder_api + volumes: + # Ez biztosítja, hogy ha a NAS-on módosítasz egy fájlt, a szerveren futó app azonnal lássa + - /mnt/nas/git_vault/service_finder/backend:/app + command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --proxy-headers --forwarded-allow-ips="*" + ports: + - "8000:8000" + environment: + - PYTHONPATH=/app + # A belső hálózaton a gépnév 'postgres-db', a port pedig fixen 5432 + - DATABASE_URL=postgresql+asyncpg://${APP_DB_USER}:${APP_DB_PASSWORD}@postgres-db:5432/${APP_DB_NAME} + - SECRET_KEY=${SECRET_KEY} + - ALLOWED_ORIGINS=https://dev.profibot.hu,https://app.profibot.hu + - MINIO_ENDPOINT=minio:9000 + - MINIO_ACCESS_KEY=${POSTGRES_USER} + - MINIO_SECRET_KEY=${POSTGRES_PASSWORD} + # SendGrid API kulcs hozzáadása, hogy az email küldés is menjen + - SENDGRID_API_KEY=${SENDGRID_API_KEY} + depends_on: + postgres-db: + condition: service_healthy + minio: + condition: service_started + redis: + condition: service_started + networks: + - service_finder_net + + # 3. PGADMIN (Adminisztrációs felület) + pgadmin: + image: dpage/pgadmin4 + container_name: pgadmin_ui + environment: + PGADMIN_DEFAULT_EMAIL: ${PGADMIN_EMAIL} + PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_PASSWORD} + volumes: + # A pgAdmin beállításai is maradjanak meg a NAS-on + - /mnt/nas/app_data/pgadmin_data:/var/lib/pgadmin + ports: + - "5050:80" + depends_on: + - postgres-db + networks: + - service_finder_net + + # 4. MINIO (A fájlok fizikai helye a NAS) + minio: + image: minio/minio + container_name: service_finder_minio + command: server /data --console-address ":9001" + environment: + MINIO_ROOT_USER: ${POSTGRES_USER} + MINIO_ROOT_PASSWORD: ${POSTGRES_PASSWORD} + volumes: + # Ez a legfontosabb: a képek és számlák a NAS-ra mennek + - /mnt/nas/app_data/minio_data:/data + ports: + - "9000:9000" + - "9001:9001" + networks: + - service_finder_net + + # 5. REDIS (Gyorsítótár) + redis: + image: redis:alpine + container_name: service_finder_redis + volumes: + # A Redis snapshot-ok a NAS-ra kerülnek + - /mnt/nas/app_data/redis_data:/data + networks: + - service_finder_net + +networks: + service_finder_net: + driver: bridge + +# Megjegyzés: A lenti volume-okat töröltük, mert "Bind Mount"-ra (direkt útvonalra) váltottunk \ No newline at end of file diff --git a/code-server-config/data/User/History/-706ef310/entries.json b/code-server-config/data/User/History/-706ef310/entries.json new file mode 100755 index 0000000..47bc755 --- /dev/null +++ b/code-server-config/data/User/History/-706ef310/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/docker-compose.yml","entries":[{"id":"8tZ1.yml","timestamp":1769114735873},{"id":"qmzx.yml","timestamp":1769115408928},{"id":"G0yH.yml","timestamp":1769116109979}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/-706ef310/qmzx.yml b/code-server-config/data/User/History/-706ef310/qmzx.yml new file mode 100755 index 0000000..d3c0745 --- /dev/null +++ b/code-server-config/data/User/History/-706ef310/qmzx.yml @@ -0,0 +1,100 @@ +services: + # 1. ADATBÁZIS (NAS-ra mentett adatokkal) + postgres-db: + image: postgres:15 + container_name: postgres-db + environment: + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + volumes: + # A perzisztens adatbázis fájlok a NAS-ra kerülnek + - /mnt/nas/app_data/postgres_data:/var/lib/postgresql/data + ports: + - "${POSTGRES_PORT}:${POSTGRES_PORT}" + networks: + - service_finder_net + restart: unless-stopped + + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] + interval: 5s + timeout: 5s + retries: 5 + + # 2. BACKEND API (NAS-on lévő kódbázissal) + service_finder_api: + build: + context: ./backend + dockerfile: Dockerfile + container_name: service_finder_api + volumes: + # A forráskódot a NAS-ról olvassa be + - /mnt/nas/git_vault/service_finder/backend:/app + command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --proxy-headers --forwarded-allow-ips="*" + ports: + - "8000:8000" + environment: + - PYTHONPATH=/app + - DATABASE_URL=postgresql+asyncpg://${APP_DB_USER}:${APP_DB_PASSWORD}@postgres-db:${APP_DB_PORT}/${APP_DB_NAME} + - SECRET_KEY=${SECRET_KEY} + - ALLOWED_ORIGINS=https://dev.profibot.hu,https://app.profibot.hu + - MINIO_ENDPOINT=minio:9000 + - MINIO_ACCESS_KEY=${POSTGRES_USER} + - MINIO_SECRET_KEY=${POSTGRES_PASSWORD} + depends_on: + - postgres-db + - minio + - redis + networks: + - service_finder_net + + # 3. PGADMIN (Adminisztrációs felület) + pgadmin: + image: dpage/pgadmin4 + container_name: pgadmin_ui + environment: + PGADMIN_DEFAULT_EMAIL: ${PGADMIN_EMAIL} + PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_PASSWORD} + volumes: + # A pgAdmin beállításai is maradjanak meg a NAS-on + - /mnt/nas/app_data/pgadmin_data:/var/lib/pgadmin + ports: + - "5050:80" + depends_on: + - postgres-db + networks: + - service_finder_net + + # 4. MINIO (A fájlok fizikai helye a NAS) + minio: + image: minio/minio + container_name: service_finder_minio + command: server /data --console-address ":9001" + environment: + MINIO_ROOT_USER: ${POSTGRES_USER} + MINIO_ROOT_PASSWORD: ${POSTGRES_PASSWORD} + volumes: + # Ez a legfontosabb: a képek és számlák a NAS-ra mennek + - /mnt/nas/app_data/minio_data:/data + ports: + - "9000:9000" + - "9001:9001" + networks: + - service_finder_net + + # 5. REDIS (Gyorsítótár) + redis: + image: redis:alpine + container_name: service_finder_redis + volumes: + # A Redis snapshot-ok a NAS-ra kerülnek + - /mnt/nas/app_data/redis_data:/data + networks: + - service_finder_net + +networks: + service_finder_net: + driver: bridge + +# Megjegyzés: A lenti volume-okat töröltük, mert "Bind Mount"-ra (direkt útvonalra) váltottunk \ No newline at end of file diff --git a/code-server-config/data/User/History/-719dbe4/2C3o.json b/code-server-config/data/User/History/-719dbe4/2C3o.json new file mode 100755 index 0000000..b1ed5d4 --- /dev/null +++ b/code-server-config/data/User/History/-719dbe4/2C3o.json @@ -0,0 +1,3 @@ +{ + "keyboard.layout": "0000040E" +} \ No newline at end of file diff --git a/code-server-config/data/User/History/-719dbe4/entries.json b/code-server-config/data/User/History/-719dbe4/entries.json new file mode 100755 index 0000000..6d617b4 --- /dev/null +++ b/code-server-config/data/User/History/-719dbe4/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote:/config/data/User/settings.json","entries":[{"id":"2C3o.json","timestamp":1769021479748}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/-72cc77ef/84BA.py b/code-server-config/data/User/History/-72cc77ef/84BA.py new file mode 100755 index 0000000..ec50041 --- /dev/null +++ b/code-server-config/data/User/History/-72cc77ef/84BA.py @@ -0,0 +1,71 @@ +import asyncio +import os +from sqlalchemy.ext.asyncio import create_async_engine +from sqlalchemy import text +from dotenv import load_dotenv + +load_dotenv() + +raw_url = os.getenv("DATABASE_URL") +if not raw_url: + raw_url = "postgresql://admin:PASSWORD_111@postgres-db:5432/service_finder" +DATABASE_URL = raw_url.replace("postgresql://", "postgresql+asyncpg://").replace("/service_finder_db", "/service_finder") + +async def seed_cost_types(): + engine = create_async_engine(DATABASE_URL) + async with engine.begin() as conn: + print("🔨 Költség típusok tábla létrehozása...") + await conn.execute(text(""" + CREATE TABLE IF NOT EXISTS ref.cost_types ( + code VARCHAR(50) PRIMARY KEY, + name VARCHAR(100) NOT NULL, + parent_code VARCHAR(50) REFERENCES ref.cost_types(code), -- Hierarchia! + is_active BOOLEAN DEFAULT TRUE, + sort_order INTEGER DEFAULT 0 + ); + """)) + + print("📥 Adatok feltöltése...") + # Először a szülők (Főkategóriák) + parents = [ + ('FUEL', '⛽ Tankolás', 10), + ('PURCHASE', '💰 Beszerzés / Pénzügy', 20), + ('INSURANCE', '📄 Biztosítás', 30), + ('TAX', '🏛️ Adó / Illeték', 40), + ('SERVICE', '🔧 Szerviz', 50), + ('OTHER', 'Egyéb', 99) + ] + for p in parents: + await conn.execute(text("INSERT INTO ref.cost_types (code, name, sort_order) VALUES (:c, :n, :s) ON CONFLICT (code) DO NOTHING"), {"c": p[0], "n": p[1], "s": p[2]}) + + # Aztán a gyerekek (Alkategóriák) + children = [ + # Beszerzés + ('PURCHASE_PRICE', 'Vételár', 'PURCHASE'), + ('FINANCE_LEASE', 'Lízing díj', 'PURCHASE'), + ('FINANCE_LOAN', 'Hitel törlesztő', 'PURCHASE'), + ('IMPORT_FEE', 'Honosítás / Regadó', 'PURCHASE'), + # Biztosítás + ('INSURANCE_KGFB', 'Kötelező (KGFB)', 'INSURANCE'), + ('INSURANCE_CASCO', 'Casco', 'INSURANCE'), + ('INSURANCE_GAP', 'GAP', 'INSURANCE'), + ('INSURANCE_ASSIST', 'Assistance', 'INSURANCE'), + # Adó + ('TAX_WEIGHT', 'Gépjárműadó (Súlyadó)', 'TAX'), + ('TAX_COMPANY', 'Cégautóadó', 'TAX'), + ('TAX_TRANSFER', 'Vagyonszerzési illeték', 'TAX'), + ('TAX_OTHER', 'Egyéb adó', 'TAX'), + # Szerviz + ('SERVICE_MAINTENANCE', 'Kötelező karbantartás', 'SERVICE'), + ('SERVICE_REPAIR', 'Javítás', 'SERVICE'), + ('SERVICE_TIRE', 'Gumicsere', 'SERVICE'), + ('SERVICE_MOT', 'Műszaki vizsga', 'SERVICE') + ] + for c in children: + await conn.execute(text("INSERT INTO ref.cost_types (code, name, parent_code) VALUES (:c, :n, :p) ON CONFLICT (code) DO NOTHING"), {"c": c[0], "n": c[1], "p": c[2]}) + + print("✅ KÉSZ! A tudás most már az adatbázisban van, nem a HTML-ben.") + await engine.dispose() + +if __name__ == "__main__": + asyncio.run(seed_cost_types()) \ No newline at end of file diff --git a/code-server-config/data/User/History/-72cc77ef/entries.json b/code-server-config/data/User/History/-72cc77ef/entries.json new file mode 100755 index 0000000..fe7f3c7 --- /dev/null +++ b/code-server-config/data/User/History/-72cc77ef/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/backend/migrate_ref_data.py","entries":[{"id":"84BA.py","timestamp":1768948294644}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/-7a78fe9d/0L8o.py b/code-server-config/data/User/History/-7a78fe9d/0L8o.py new file mode 100755 index 0000000..fe733c7 --- /dev/null +++ b/code-server-config/data/User/History/-7a78fe9d/0L8o.py @@ -0,0 +1,37 @@ +from pydantic import BaseModel, ConfigDict +from typing import Optional, List +from datetime import datetime +from app.models.social import ModerationStatus, SourceType + +# --- Alap Sémák --- + +class ServiceProviderBase(BaseModel): + name: str + address: Optional[str] = None + category: Optional[str] = None + source: SourceType = SourceType.manual + +class ServiceProviderCreate(ServiceProviderBase): + pass + +class ServiceProviderResponse(ServiceProviderBase): + id: int + status: ModerationStatus + validation_score: int # Látni kell a pontszámot + evidence_image_path: Optional[str] = None + added_by_user_id: Optional[int] = None + created_at: datetime + + model_config = ConfigDict(from_attributes=True) + +# --- Voting & Gamification Sémák --- + +class VoteCreate(BaseModel): + vote_value: int # Csak a +1 vagy -1 kell, a user_id jön a tokenből, a provider_id az URL-ből + +class LeaderboardEntry(BaseModel): + username: str + points: int + rank: int + + model_config = ConfigDict(from_attributes=True) \ No newline at end of file diff --git a/code-server-config/data/User/History/-7a78fe9d/O0ij.py b/code-server-config/data/User/History/-7a78fe9d/O0ij.py new file mode 100755 index 0000000..352ab36 --- /dev/null +++ b/code-server-config/data/User/History/-7a78fe9d/O0ij.py @@ -0,0 +1,31 @@ +from pydantic import BaseModel, ConfigDict +from typing import Optional +from datetime import datetime +from app.models.social import ModerationStatus, SourceType + +# --- Alap Sémák --- + +class ServiceProviderBase(BaseModel): + name: str + address: Optional[str] = None + # Fontos: Kisbetűs 'manual', ahogy a modellben is van! + source: SourceType = SourceType.manual + +class ServiceProviderCreate(ServiceProviderBase): + pass + +class ServiceProviderResponse(ServiceProviderBase): + id: int + status: ModerationStatus + validation_score: int # Ezt is visszaadjuk, hogy lássuk a pontokat + evidence_image_path: Optional[str] = None + added_by_user_id: Optional[int] = None + created_at: datetime + + model_config = ConfigDict(from_attributes=True) + +# --- EZ HIÁNYZOTT: A Szavazás Sémája --- +class VoteCreate(BaseModel): + user_id: int + provider_id: int + vote_value: int # +1 vagy -1 \ No newline at end of file diff --git a/code-server-config/data/User/History/-7a78fe9d/Qkh3.py b/code-server-config/data/User/History/-7a78fe9d/Qkh3.py new file mode 100755 index 0000000..03245fb --- /dev/null +++ b/code-server-config/data/User/History/-7a78fe9d/Qkh3.py @@ -0,0 +1,26 @@ +from pydantic import BaseModel, ConfigDict +from typing import Optional +from datetime import datetime +from app.models.social import ModerationStatus, SourceType + +# Közös alapmezők +class ServiceProviderBase(BaseModel): + name: str + address: Optional[str] = None + source: SourceType = SourceType.MANUAL + +# Amit a kliens küld (Létrehozás) +class ServiceProviderCreate(ServiceProviderBase): + pass + # A status-t NEM engedjük itt beállítani, azt a Service réteg kezeli! + +# Amit a kliens visszakap (Válasz) +class ServiceProviderResponse(ServiceProviderBase): + id: int + status: ModerationStatus + evidence_image_path: Optional[str] = None + added_by_user_id: Optional[int] = None + created_at: datetime + + # Ez biztosítja, hogy az SQLAlchemy ORM objektumot át tudja alakítani JSON-né + model_config = ConfigDict(from_attributes=True) \ No newline at end of file diff --git a/code-server-config/data/User/History/-7a78fe9d/X8oQ.py b/code-server-config/data/User/History/-7a78fe9d/X8oQ.py new file mode 100755 index 0000000..3673e82 --- /dev/null +++ b/code-server-config/data/User/History/-7a78fe9d/X8oQ.py @@ -0,0 +1,26 @@ +from pydantic import BaseModel, ConfigDict +from typing import Optional +from datetime import datetime +from app.models.social import ModerationStatus, SourceType + +# Közös alapmezők +class ServiceProviderBase(BaseModel): + name: str + address: Optional[str] = None + source: SourceType = SourceType.manual + +# Amit a kliens küld (Létrehozás) +class ServiceProviderCreate(ServiceProviderBase): + pass + # A status-t NEM engedjük itt beállítani, azt a Service réteg kezeli! + +# Amit a kliens visszakap (Válasz) +class ServiceProviderResponse(ServiceProviderBase): + id: int + status: ModerationStatus + evidence_image_path: Optional[str] = None + added_by_user_id: Optional[int] = None + created_at: datetime + + # Ez biztosítja, hogy az SQLAlchemy ORM objektumot át tudja alakítani JSON-né + model_config = ConfigDict(from_attributes=True) \ No newline at end of file diff --git a/code-server-config/data/User/History/-7a78fe9d/entries.json b/code-server-config/data/User/History/-7a78fe9d/entries.json new file mode 100755 index 0000000..0fb852c --- /dev/null +++ b/code-server-config/data/User/History/-7a78fe9d/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/backend/app/schemas/social.py","entries":[{"id":"Qkh3.py","timestamp":1769026111887},{"id":"X8oQ.py","timestamp":1769032872830},{"id":"O0ij.py","timestamp":1769035431594},{"id":"0L8o.py","timestamp":1769035806952}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/10134b39/0390.py b/code-server-config/data/User/History/10134b39/0390.py new file mode 100755 index 0000000..93900ac --- /dev/null +++ b/code-server-config/data/User/History/10134b39/0390.py @@ -0,0 +1,13 @@ +from fastapi import APIRouter +from app.api.v1 import social, users, fleet, auth + +api_router = APIRouter() + +# Social (Providers, Voting, Competitions) +api_router.include_router(social.router, prefix="/social", tags=["Social & Providers"]) +api_router.include_router(auth.router, prefix="/auth", tags=["Authentication"]) + +# Users (Profile, Me) +api_router.include_router(users.router, prefix="/users", tags=["Users"]) + +api_router.include_router(fleet.router, prefix="/fleet", tags=["Fleet & Logistics"]) \ No newline at end of file diff --git a/code-server-config/data/User/History/10134b39/HsiU.py b/code-server-config/data/User/History/10134b39/HsiU.py new file mode 100755 index 0000000..e7cd636 --- /dev/null +++ b/code-server-config/data/User/History/10134b39/HsiU.py @@ -0,0 +1,10 @@ +from fastapi import APIRouter +from app.api.v1 import social, users, fleet + +api_router = APIRouter() + +# Social (Providers, Voting, Competitions) +api_router.include_router(social.router, prefix="/social", tags=["Social & Providers"]) + +# Users (Profile, Me) +api_router.include_router(users.router, prefix="/users", tags=["Users"]) \ No newline at end of file diff --git a/code-server-config/data/User/History/10134b39/JVpZ.py b/code-server-config/data/User/History/10134b39/JVpZ.py new file mode 100755 index 0000000..a18b049 --- /dev/null +++ b/code-server-config/data/User/History/10134b39/JVpZ.py @@ -0,0 +1,14 @@ +from fastapi import APIRouter +from app.api.v1 import social, users, fleet, auth + +api_router = APIRouter() + +api_router.include_router(auth.router, prefix="/auth", tags=["Authentication"]) + +# Social (Providers, Voting, Competitions) +api_router.include_router(social.router, prefix="/social", tags=["Social & Providers"]) + +# Users (Profile, Me) +api_router.include_router(users.router, prefix="/users", tags=["Users"]) + +api_router.include_router(fleet.router, prefix="/fleet", tags=["Fleet & Logistics"]) \ No newline at end of file diff --git a/code-server-config/data/User/History/10134b39/KxP1.py b/code-server-config/data/User/History/10134b39/KxP1.py new file mode 100755 index 0000000..734be87 --- /dev/null +++ b/code-server-config/data/User/History/10134b39/KxP1.py @@ -0,0 +1,12 @@ +from fastapi import APIRouter +from app.api.v1 import social +# Később: from app.api.v1 import vehicles, auth + +api_router = APIRouter() + +# Social modul becsatolása +api_router.include_router(social.router, prefix="/social", tags=["Social & Service Providers"]) + +# Placeholders (későbbi fázisokhoz) +# api_router.include_router(auth.router, prefix="/auth", tags=["Authentication"]) +# api_router.include_router(vehicles.router, prefix="/vehicles", tags=["Fleet Management"]) \ No newline at end of file diff --git a/code-server-config/data/User/History/10134b39/Umts.py b/code-server-config/data/User/History/10134b39/Umts.py new file mode 100755 index 0000000..0ba618e --- /dev/null +++ b/code-server-config/data/User/History/10134b39/Umts.py @@ -0,0 +1,12 @@ +from fastapi import APIRouter +from app.api.v1 import social, users, fleet + +api_router = APIRouter() + +# Social (Providers, Voting, Competitions) +api_router.include_router(social.router, prefix="/social", tags=["Social & Providers"]) + +# Users (Profile, Me) +api_router.include_router(users.router, prefix="/users", tags=["Users"]) + +api_router.include_router(fleet.router, prefix="/fleet", tags=["Fleet & Logistics"]) \ No newline at end of file diff --git a/code-server-config/data/User/History/10134b39/VKVZ.py b/code-server-config/data/User/History/10134b39/VKVZ.py new file mode 100755 index 0000000..5a95566 --- /dev/null +++ b/code-server-config/data/User/History/10134b39/VKVZ.py @@ -0,0 +1,12 @@ +from fastapi import APIRouter +from app.api.v1 import social, users, fleet, auth + +api_router = APIRouter() + +# Social (Providers, Voting, Competitions) +api_router.include_router(social.router, prefix="/social", tags=["Social & Providers"]) + +# Users (Profile, Me) +api_router.include_router(users.router, prefix="/users", tags=["Users"]) + +api_router.include_router(fleet.router, prefix="/fleet", tags=["Fleet & Logistics"]) \ No newline at end of file diff --git a/code-server-config/data/User/History/10134b39/YgmD.py b/code-server-config/data/User/History/10134b39/YgmD.py new file mode 100755 index 0000000..73d753e --- /dev/null +++ b/code-server-config/data/User/History/10134b39/YgmD.py @@ -0,0 +1,10 @@ +from fastapi import APIRouter +from app.api.v1 import social, users + +api_router = APIRouter() + +# Social (Providers, Voting, Competitions) +api_router.include_router(social.router, prefix="/social", tags=["Social & Providers"]) + +# Users (Profile, Me) +api_router.include_router(users.router, prefix="/users", tags=["Users"]) \ No newline at end of file diff --git a/code-server-config/data/User/History/10134b39/entries.json b/code-server-config/data/User/History/10134b39/entries.json new file mode 100755 index 0000000..9f15be9 --- /dev/null +++ b/code-server-config/data/User/History/10134b39/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/backend/app/api/v1/router.py","entries":[{"id":"KxP1.py","timestamp":1769026197656},{"id":"YgmD.py","timestamp":1769035932510},{"id":"HsiU.py","timestamp":1769038283035},{"id":"Umts.py","timestamp":1769038293184},{"id":"VKVZ.py","timestamp":1769041601756},{"id":"0390.py","timestamp":1769041642033},{"id":"JVpZ.py","timestamp":1769041660836}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/1231c811/7V7m.py b/code-server-config/data/User/History/1231c811/7V7m.py new file mode 100755 index 0000000..0593692 --- /dev/null +++ b/code-server-config/data/User/History/1231c811/7V7m.py @@ -0,0 +1,22 @@ +from sqlalchemy import Column, Integer, String, Boolean, DateTime, Text +from sqlalchemy.sql import func +from app.db.base import Base + +class User(Base): + __tablename__ = "users" + __table_args__ = {"schema": "data"} + + id = Column(Integer, primary_key=True, index=True) + email = Column(String, unique=True, index=True, nullable=False) + password_hash = Column(Text, nullable=False) + + full_name = Column(String, nullable=True) + + # --- ÚJ MEZŐK --- + is_active = Column(Boolean, default=True) # Tiltáshoz (Banning) + is_superuser = Column(Boolean, default=False) + reputation_score = Column(Integer, default=0) # Trust System + # ---------------- + + created_at = Column(DateTime(timezone=True), server_default=func.now()) + updated_at = Column(DateTime(timezone=True), onupdate=func.now()) \ No newline at end of file diff --git a/code-server-config/data/User/History/1231c811/RTDs.py b/code-server-config/data/User/History/1231c811/RTDs.py new file mode 100755 index 0000000..940fcd0 --- /dev/null +++ b/code-server-config/data/User/History/1231c811/RTDs.py @@ -0,0 +1,25 @@ +from sqlalchemy import Column, Integer, String, Boolean, DateTime, Text, Date +from sqlalchemy.sql import func +from app.db.base import Base + +class User(Base): + __tablename__ = "users" + __table_args__ = {"schema": "data"} + + id = Column(Integer, primary_key=True, index=True) + email = Column(String, unique=True, index=True, nullable=False) + password_hash = Column(Text, nullable=False) + full_name = Column(String, nullable=True) + + # --- Social / Trust Fields --- + is_active = Column(Boolean, default=True) + is_superuser = Column(Boolean, default=False) + reputation_score = Column(Integer, default=0) + + # --- Document Tracking (ÚJ MEZŐK) --- + license_expiry_date = Column(Date, nullable=True) # Jogosítvány lejárata + id_card_expiry_date = Column(Date, nullable=True) # Személyi igazolvány lejárata + # ------------------------------------ + + created_at = Column(DateTime(timezone=True), server_default=func.now()) + updated_at = Column(DateTime(timezone=True), onupdate=func.now()) \ No newline at end of file diff --git a/code-server-config/data/User/History/1231c811/entries.json b/code-server-config/data/User/History/1231c811/entries.json new file mode 100755 index 0000000..0504430 --- /dev/null +++ b/code-server-config/data/User/History/1231c811/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/backend/app/models/user.py","entries":[{"id":"mtMZ.py","timestamp":1769031796728},{"id":"7V7m.py","timestamp":1769033736530},{"id":"RTDs.py","timestamp":1769038004563}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/1231c811/mtMZ.py b/code-server-config/data/User/History/1231c811/mtMZ.py new file mode 100755 index 0000000..5b82410 --- /dev/null +++ b/code-server-config/data/User/History/1231c811/mtMZ.py @@ -0,0 +1,18 @@ +from sqlalchemy import Column, Integer, String, Boolean, DateTime, Text +from sqlalchemy.sql import func +from app.db.base import Base + +class User(Base): + __tablename__ = "users" + __table_args__ = {"schema": "data"} + + id = Column(Integer, primary_key=True, index=True) + email = Column(String, unique=True, index=True, nullable=False) + password_hash = Column(Text, nullable=False) + + full_name = Column(String, nullable=True) + is_active = Column(Boolean, default=True) + is_superuser = Column(Boolean, default=False) + + created_at = Column(DateTime(timezone=True), server_default=func.now()) + updated_at = Column(DateTime(timezone=True), onupdate=func.now()) \ No newline at end of file diff --git a/code-server-config/data/User/History/16d1374a/entries.json b/code-server-config/data/User/History/16d1374a/entries.json new file mode 100755 index 0000000..9c8f07c --- /dev/null +++ b/code-server-config/data/User/History/16d1374a/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/backend/update_audit_system.py","entries":[{"id":"gs9K.py","timestamp":1768945677146}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/16d1374a/gs9K.py b/code-server-config/data/User/History/16d1374a/gs9K.py new file mode 100755 index 0000000..271eff7 --- /dev/null +++ b/code-server-config/data/User/History/16d1374a/gs9K.py @@ -0,0 +1,46 @@ +import asyncio +import os +from sqlalchemy.ext.asyncio import create_async_engine +from sqlalchemy import text +from dotenv import load_dotenv + +load_dotenv() + +raw_url = os.getenv("DATABASE_URL") +if not raw_url: + raw_url = "postgresql://admin:PASSWORD_111@postgres-db:5432/service_finder" +DATABASE_URL = raw_url.replace("postgresql://", "postgresql+asyncpg://").replace("/service_finder_db", "/service_finder") + +async def build_audit_system(): + engine = create_async_engine(DATABASE_URL) + + async with engine.begin() as conn: + print("📜 Audit Log tábla létrehozása...") + # Ez a tábla sosem töröl, csak ír! (Append-only) + await conn.execute(text(""" + CREATE TABLE IF NOT EXISTS data.audit_logs ( + id SERIAL PRIMARY KEY, + user_id INTEGER REFERENCES data.users(id), -- KI csinálta? + event_type VARCHAR(50) NOT NULL, -- MIT? (pl. ISSUE_REPORT, MILEAGE_UPDATE) + target_id INTEGER, -- MELYIK autón? (Vehicle ID) + old_value TEXT, -- MI volt előtte? (A visszaállításhoz) + new_value TEXT, -- MI lett utána? + details TEXT, -- Egyéb megjegyzés (pl. hiba leírása) + ip_address VARCHAR(45), -- Honnan? (Biztonság) + created_at TIMESTAMP DEFAULT NOW() + ); + """)) + + print("🚦 Jármű Státusz mezők hozzáadása...") + # Bővítjük a járműveket, hogy tárolják a hibát + await conn.execute(text(""" + ALTER TABLE data.vehicles + ADD COLUMN IF NOT EXISTS status VARCHAR(20) DEFAULT 'OK', -- OK, WARNING, CRITICAL + ADD COLUMN IF NOT EXISTS current_issue TEXT; -- A hiba leírása + """)) + + print("✅ KÉSZ! A mindent látó szem (Audit Log) aktív.") + await engine.dispose() + +if __name__ == "__main__": + asyncio.run(build_audit_system()) \ No newline at end of file diff --git a/code-server-config/data/User/History/2434083a/Jrbf.py b/code-server-config/data/User/History/2434083a/Jrbf.py new file mode 100755 index 0000000..10f9af3 --- /dev/null +++ b/code-server-config/data/User/History/2434083a/Jrbf.py @@ -0,0 +1,50 @@ +import enum +from sqlalchemy import Column, Integer, String, ForeignKey, Enum, DateTime, Boolean, Date, JSON +from sqlalchemy.sql import func +from app.db.base import Base + +# Költség Kategóriák +class ExpenseCategory(str, enum.Enum): + PURCHASE_PRICE = "PURCHASE_PRICE" # Vételár + TRANSFER_TAX = "TRANSFER_TAX" # Vagyonszerzési illeték + ADMIN_FEE = "ADMIN_FEE" # Eredetiség, forgalmi, törzskönyv + VEHICLE_TAX = "VEHICLE_TAX" # Gépjárműadó + INSURANCE = "INSURANCE" # Biztosítás + REFUELING = "REFUELING" # Tankolás + SERVICE = "SERVICE" # Szerviz / Javítás + PARKING = "PARKING" # Parkolás + TOLL = "TOLL" # Autópálya matrica + FINE = "FINE" # Bírság + TUNING_ACCESSORIES = "TUNING_ACCESSORIES" # Extrák + OTHER = "OTHER" # Egyéb + +class VehicleEvent(Base): + __tablename__ = "vehicle_events" + __table_args__ = {"schema": "data"} + + id = Column(Integer, primary_key=True, index=True) + vehicle_id = Column(Integer, ForeignKey("data.vehicles.id"), nullable=False, index=True) + + # Esemény típusa + event_type = Column(Enum(ExpenseCategory, schema="data", name="expense_category_enum"), nullable=False) + + date = Column(Date, nullable=False) + + # Kilométeróra (KÖTELEZŐ!) + odometer_value = Column(Integer, nullable=False) + odometer_anomaly = Column(Boolean, default=False) # Ha csökkenést észlelünk, True lesz + + # Pénzügyek + cost_amount = Column(Integer, nullable=False, default=0) # HUF + + # Leírás és Képek + description = Column(String, nullable=True) + image_paths = Column(JSON, nullable=True) # Lista a feltöltött képek (számla, fotó) útvonalairól + + # Kapcsolat a szolgáltatóval + # Ha is_diy=True, akkor a user maga csinálta. + # Ha is_diy=False és service_provider_id=None, akkor ismeretlen helyen készült. + is_diy = Column(Boolean, default=False) + service_provider_id = Column(Integer, ForeignKey("data.service_providers.id"), nullable=True) + + created_at = Column(DateTime(timezone=True), server_default=func.now()) \ No newline at end of file diff --git a/code-server-config/data/User/History/2434083a/entries.json b/code-server-config/data/User/History/2434083a/entries.json new file mode 100755 index 0000000..587c848 --- /dev/null +++ b/code-server-config/data/User/History/2434083a/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/backend/app/models/expense.py","entries":[{"id":"Jrbf.py","timestamp":1769038074585}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/2e6ecb37/RIji.py b/code-server-config/data/User/History/2e6ecb37/RIji.py new file mode 100755 index 0000000..7efe4af --- /dev/null +++ b/code-server-config/data/User/History/2e6ecb37/RIji.py @@ -0,0 +1,58 @@ +import asyncio +import os +from sqlalchemy.ext.asyncio import create_async_engine +from sqlalchemy import text +from dotenv import load_dotenv + +load_dotenv() + +raw_url = os.getenv("DATABASE_URL") +if not raw_url: + raw_url = "postgresql://admin:PASSWORD_111@postgres-db:5432/service_finder" +DATABASE_URL = raw_url.replace("postgresql://", "postgresql+asyncpg://").replace("/service_finder_db", "/service_finder") + +async def upgrade_invites(): + print(f"🔌 Kapcsolódás...") + engine = create_async_engine(DATABASE_URL) + + async with engine.begin() as conn: + print("📨 Invitations (Meghívók) tábla létrehozása...") + # Ez tárolja a függőben lévő meghívásokat + await conn.execute(text(""" + CREATE TABLE IF NOT EXISTS data.invitations ( + id SERIAL PRIMARY KEY, + email VARCHAR(255) NOT NULL, + inviter_id INTEGER REFERENCES data.users(id), -- Ki hívta meg? (Cég) + role VARCHAR(20) NOT NULL, -- Milyen szerepre? (MANAGER, DRIVER) + access_level VARCHAR(20) DEFAULT 'FULL', -- A/B Sofőr szint + token VARCHAR(100) UNIQUE NOT NULL, -- A titkos link kódja + status VARCHAR(20) DEFAULT 'PENDING', -- PENDING, ACCEPTED, EXPIRED + created_at TIMESTAMP DEFAULT NOW(), + expires_at TIMESTAMP + ); + """)) + + print("🤝 Fleet Members (Többcéges tagság) tábla létrehozása...") + # Ez teszi lehetővé, hogy valaki több céghez is tartozzon + await conn.execute(text(""" + CREATE TABLE IF NOT EXISTS data.fleet_members ( + id SERIAL PRIMARY KEY, + user_id INTEGER REFERENCES data.users(id), -- A Dolgozó + owner_id INTEGER REFERENCES data.users(id), -- A Cég / Tulajdonos + role VARCHAR(20) NOT NULL, -- FLEET_MANAGER, DRIVER + joined_at TIMESTAMP DEFAULT NOW(), + + -- Egy ember egy cégnél csak egyszer szerepelhet + UNIQUE(user_id, owner_id) + ); + """)) + + # Takarítás: A régi 'parent_id' már nem kell, mert a fleet_members kiváltja + # De biztonságból egyelőre csak NULL-ra állítjuk, nem töröljük az oszlopot + # await conn.execute(text("UPDATE data.users SET parent_id = NULL;")) + + print("✅ KÉSZ! A rendszer készen áll a biztonságos meghívókra.") + await engine.dispose() + +if __name__ == "__main__": + asyncio.run(upgrade_invites()) diff --git a/code-server-config/data/User/History/2e6ecb37/entries.json b/code-server-config/data/User/History/2e6ecb37/entries.json new file mode 100755 index 0000000..f6390d6 --- /dev/null +++ b/code-server-config/data/User/History/2e6ecb37/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/backend/update_invitations.py","entries":[{"id":"RIji.py","timestamp":1768944364706}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/30eb9f94/1AIB.py b/code-server-config/data/User/History/30eb9f94/1AIB.py new file mode 100755 index 0000000..b679a19 --- /dev/null +++ b/code-server-config/data/User/History/30eb9f94/1AIB.py @@ -0,0 +1,39 @@ +from fastapi import Depends, HTTPException, status +from fastapi.security import OAuth2PasswordBearer +from jose import jwt, JWTError +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select +import os + +from app.db.session import get_db +from app.models.user import User + +oauth2_scheme = OAuth2PasswordBearer(tokenUrl="api/v1/auth/login") + +SECRET_KEY = os.getenv("SECRET_KEY") +ALGORITHM = os.getenv("ALGORITHM") + +async def get_current_user( + db: AsyncSession = Depends(get_db), + token: str = Depends(oauth2_scheme) +) -> User: + credentials_exception = HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Érvénytelen hitelesítő adatok", + headers={"WWW-Authenticate": "Bearer"}, + ) + try: + payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) + email: str = payload.get("sub") + if email is None: + raise credentials_exception + except JWTError: + raise credentials_exception + + result = await db.execute(select(User).where(User.email == email)) + user = result.scalars().first() + + if user is None or not user.is_active: + raise HTTPException(status_code=403, detail="Felhasználó nem található vagy inaktív") + + return user \ No newline at end of file diff --git a/code-server-config/data/User/History/30eb9f94/entries.json b/code-server-config/data/User/History/30eb9f94/entries.json new file mode 100755 index 0000000..3a4f397 --- /dev/null +++ b/code-server-config/data/User/History/30eb9f94/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/backend/app/api/deps.py","entries":[{"id":"1AIB.py","timestamp":1769041536250}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/359c80de/entries.json b/code-server-config/data/User/History/359c80de/entries.json new file mode 100755 index 0000000..0b2ab9c --- /dev/null +++ b/code-server-config/data/User/History/359c80de/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/backend/app/api/v1/fleet.py","entries":[{"id":"iEZY.py","timestamp":1769038210566}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/359c80de/iEZY.py b/code-server-config/data/User/History/359c80de/iEZY.py new file mode 100755 index 0000000..10eff52 --- /dev/null +++ b/code-server-config/data/User/History/359c80de/iEZY.py @@ -0,0 +1,62 @@ +from fastapi import APIRouter, Depends, HTTPException, status +from sqlalchemy.ext.asyncio import AsyncSession +from typing import List + +from app.db.session import get_db +from app.schemas.fleet import VehicleCreate, VehicleResponse, EventCreate, EventResponse, TCOStats +from app.models.vehicle import Vehicle +from app.services.fleet_service import add_vehicle_event, calculate_tco + +# Mock user dependency (később cserélendő a JWT-re) +async def get_mock_current_user(): + return 2 # Good Guy + +router = APIRouter() + +# --- VEHICLE ENDPOINTS --- + +@router.post("/vehicles", response_model=VehicleResponse, status_code=status.HTTP_201_CREATED) +async def create_vehicle( + vehicle_in: VehicleCreate, + db: AsyncSession = Depends(get_db), + user_id: int = Depends(get_mock_current_user) +): + new_vehicle = Vehicle(**vehicle_in.model_dump(), user_id=user_id, current_odometer=vehicle_in.initial_odometer) + db.add(new_vehicle) + await db.commit() + await db.refresh(new_vehicle) + return new_vehicle + +@router.get("/vehicles", response_model=List[VehicleResponse]) +async def get_my_vehicles( + db: AsyncSession = Depends(get_db), + user_id: int = Depends(get_mock_current_user) +): + from sqlalchemy import select + result = await db.execute(select(Vehicle).where(Vehicle.user_id == user_id)) + return result.scalars().all() + +# --- EVENT / SERVICE BOOK ENDPOINTS --- + +@router.post("/vehicles/{vehicle_id}/events", response_model=EventResponse) +async def add_event( + vehicle_id: int, + event_in: EventCreate, + db: AsyncSession = Depends(get_db), + user_id: int = Depends(get_mock_current_user) +): + """ + Új esemény (szerviz, tankolás) rögzítése. + Automatikusan kezeli a szolgáltatókat és a km óra állást. + """ + result = await add_vehicle_event(db, vehicle_id, event_in, user_id) + + if isinstance(result, dict) and "error" in result: + raise HTTPException(status_code=404, detail=result["error"]) + + return result + +@router.get("/vehicles/{vehicle_id}/stats", response_model=TCOStats) +async def get_vehicle_stats(vehicle_id: int, db: AsyncSession = Depends(get_db)): + """Költségek elemzése és TCO mutatók""" + return await calculate_tco(db, vehicle_id) \ No newline at end of file diff --git a/code-server-config/data/User/History/37941b6f/5wWC.yml b/code-server-config/data/User/History/37941b6f/5wWC.yml new file mode 100755 index 0000000..b02c63e --- /dev/null +++ b/code-server-config/data/User/History/37941b6f/5wWC.yml @@ -0,0 +1,94 @@ +services: + # 1. ADATBÁZIS (A Raktár) + postgres-db: + image: postgres:15 # Később ide jön a postgis/postgis:15-3.3-alpine a térképekhez + container_name: postgres-db + environment: + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + volumes: + - postgres_data:/var/lib/postgresql/data + ports: + - "${POSTGRES_PORT}:${POSTGRES_PORT}" + networks: + - service_finder_net + restart: unless-stopped + + # 2. BACKEND API (Az Agy) + service_finder_api: + build: + context: ./backend + dockerfile: Dockerfile + container_name: service_finder_api + volumes: + - ./backend:/app + # Parancs kiegészítése: meg kell engedni a proxy-tól jövő kéréseket + command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --proxy-headers --forwarded-allow-ips="*" + ports: + - "8000:8000" + environment: + - PYTHONPATH=/app + - DATABASE_URL=postgresql+asyncpg://${APP_DB_USER}:${APP_DB_PASSWORD}@postgres-db:${APP_DB_PORT}/${APP_DB_NAME} + - SECRET_KEY=${SECRET_KEY} + # CORS beállítás: fontos, hogy a domainjeidről engedélyezd a kérést! + - ALLOWED_ORIGINS=https://dev.profibot.hu,https://app.profibot.hu + + # ÚJ: MinIO és Redis beállítások a jövőbeli NAS-hoz (felkészülés) + - MINIO_ENDPOINT=minio:9000 + - MINIO_ACCESS_KEY=${POSTGRES_USER} # Egyszerűség kedvéért most ugyanaz + - MINIO_SECRET_KEY=${POSTGRES_PASSWORD} + depends_on: + - postgres-db + - minio + - redis + networks: + - service_finder_net + + # 3. PGADMIN (A Monitor) + pgadmin: + image: dpage/pgadmin4 + container_name: pgadmin_ui + environment: + PGADMIN_DEFAULT_EMAIL: ${PGADMIN_EMAIL} + PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_PASSWORD} + ports: + - "5050:80" + depends_on: + - postgres-db + networks: + - service_finder_net + + # 4. MINIO (NAS - Dokumentum tároló) - ÚJ! + minio: + image: minio/minio + container_name: service_finder_minio + command: server /data --console-address ":9001" + environment: + MINIO_ROOT_USER: ${POSTGRES_USER} + MINIO_ROOT_PASSWORD: ${POSTGRES_PASSWORD} + volumes: + - minio_data:/data + ports: + - "9000:9000" # API + - "9001:9001" # UI + networks: + - service_finder_net + + # 5. REDIS (Gyorsítótár & Session) - ÚJ! + redis: + image: redis:alpine + container_name: service_finder_redis + volumes: + - redis_data:/data + networks: + - service_finder_net + +networks: + service_finder_net: + driver: bridge + +volumes: + postgres_data: + minio_data: # Itt lesznek a fájlok (számlák, fotók) + redis_data: diff --git a/code-server-config/data/User/History/37941b6f/7GyZ.yml b/code-server-config/data/User/History/37941b6f/7GyZ.yml new file mode 100755 index 0000000..8f0f9ac --- /dev/null +++ b/code-server-config/data/User/History/37941b6f/7GyZ.yml @@ -0,0 +1,92 @@ +services: + # 1. ADATBÁZIS (A Raktár) + postgres-db: + image: postgres:15 # Később ide jön a postgis/postgis:15-3.3-alpine a térképekhez + container_name: postgres-db + environment: + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + volumes: + - postgres_data:/var/lib/postgresql/data + ports: + - "${POSTGRES_PORT}:${POSTGRES_PORT}" + networks: + - service_finder_net + restart: unless-stopped + + # 2. BACKEND API (Az Agy) + service_finder_api: + build: + context: ./backend + dockerfile: Dockerfile + container_name: service_finder_api + # Parancs kiegészítése: meg kell engedni a proxy-tól jövő kéréseket + command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --proxy-headers --forwarded-allow-ips="*" + ports: + - "8000:8000" + environment: + - PYTHONPATH=/app + - DATABASE_URL=postgresql+asyncpg://${APP_DB_USER}:${APP_DB_PASSWORD}@postgres-db:${APP_DB_PORT}/${APP_DB_NAME} + - SECRET_KEY=${SECRET_KEY} + # CORS beállítás: fontos, hogy a domainjeidről engedélyezd a kérést! + - ALLOWED_ORIGINS=https://dev.profibot.hu,https://app.profibot.hu + + # ÚJ: MinIO és Redis beállítások a jövőbeli NAS-hoz (felkészülés) + - MINIO_ENDPOINT=minio:9000 + - MINIO_ACCESS_KEY=${POSTGRES_USER} # Egyszerűség kedvéért most ugyanaz + - MINIO_SECRET_KEY=${POSTGRES_PASSWORD} + depends_on: + - postgres-db + - minio + - redis + networks: + - service_finder_net + + # 3. PGADMIN (A Monitor) + pgadmin: + image: dpage/pgadmin4 + container_name: pgadmin_ui + environment: + PGADMIN_DEFAULT_EMAIL: ${PGADMIN_EMAIL} + PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_PASSWORD} + ports: + - "5050:80" + depends_on: + - postgres-db + networks: + - service_finder_net + + # 4. MINIO (NAS - Dokumentum tároló) - ÚJ! + minio: + image: minio/minio + container_name: service_finder_minio + command: server /data --console-address ":9001" + environment: + MINIO_ROOT_USER: ${POSTGRES_USER} + MINIO_ROOT_PASSWORD: ${POSTGRES_PASSWORD} + volumes: + - minio_data:/data + ports: + - "9000:9000" # API + - "9001:9001" # UI + networks: + - service_finder_net + + # 5. REDIS (Gyorsítótár & Session) - ÚJ! + redis: + image: redis:alpine + container_name: service_finder_redis + volumes: + - redis_data:/data + networks: + - service_finder_net + +networks: + service_finder_net: + driver: bridge + +volumes: + postgres_data: + minio_data: # Itt lesznek a fájlok (számlák, fotók) + redis_data: diff --git a/code-server-config/data/User/History/37941b6f/8e20.yml b/code-server-config/data/User/History/37941b6f/8e20.yml new file mode 100755 index 0000000..1c1a1c7 --- /dev/null +++ b/code-server-config/data/User/History/37941b6f/8e20.yml @@ -0,0 +1,91 @@ +services: + # 1. ADATBÁZIS (A Raktár) + postgres-db: + image: postgres:15 # Később ide jön a postgis/postgis:15-3.3-alpine a térképekhez + container_name: postgres-db + environment: + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + volumes: + - postgres_data:/var/lib/postgresql/data + ports: + - "${POSTGRES_PORT}:${POSTGRES_PORT}" + networks: + - service_finder_net + restart: unless-stopped + + # 2. BACKEND API (Az Agy) + service_finder_api: + build: + context: ./backend + dockerfile: Dockerfile + container_name: service_finder_api + ports: + - "8000:8000" + volumes: + - ./backend:/app/ # Hot-reload fejlesztéshez + - ./frontend:/app/frontend # Statikus fájlok + environment: + - DATABASE_URL=postgresql+asyncpg://${APP_DB_USER}:${APP_DB_PASSWORD}@${APP_DB_HOST}:${APP_DB_PORT}/${APP_DB_NAME} + + - SECRET_KEY=${SECRET_KEY} + + # ÚJ: MinIO és Redis beállítások a jövőbeli NAS-hoz (felkészülés) + - MINIO_ENDPOINT=minio:9000 + - MINIO_ACCESS_KEY=${POSTGRES_USER} # Egyszerűség kedvéért most ugyanaz + - MINIO_SECRET_KEY=${POSTGRES_PASSWORD} + depends_on: + - postgres-db + - minio + - redis + networks: + - service_finder_net + + # 3. PGADMIN (A Monitor) + pgadmin: + image: dpage/pgadmin4 + container_name: pgadmin_ui + environment: + PGADMIN_DEFAULT_EMAIL: ${PGADMIN_EMAIL} + PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_PASSWORD} + ports: + - "5050:80" + depends_on: + - postgres-db + networks: + - service_finder_net + + # 4. MINIO (NAS - Dokumentum tároló) - ÚJ! + minio: + image: minio/minio + container_name: service_finder_minio + command: server /data --console-address ":9001" + environment: + MINIO_ROOT_USER: ${POSTGRES_USER} + MINIO_ROOT_PASSWORD: ${POSTGRES_PASSWORD} + volumes: + - minio_data:/data + ports: + - "9000:9000" # API + - "9001:9001" # UI + networks: + - service_finder_net + + # 5. REDIS (Gyorsítótár & Session) - ÚJ! + redis: + image: redis:alpine + container_name: service_finder_redis + volumes: + - redis_data:/data + networks: + - service_finder_net + +networks: + service_finder_net: + driver: bridge + +volumes: + postgres_data: + minio_data: # Itt lesznek a fájlok (számlák, fotók) + redis_data: diff --git a/code-server-config/data/User/History/37941b6f/KJm1.yml b/code-server-config/data/User/History/37941b6f/KJm1.yml new file mode 100755 index 0000000..4d86ba8 --- /dev/null +++ b/code-server-config/data/User/History/37941b6f/KJm1.yml @@ -0,0 +1,54 @@ +services: + # 1. ADATBÁZIS (A Raktár) + postgres-db: + image: postgres:15 + container_name: postgres-db + environment: + POSTGRES_USER: admin + POSTGRES_PASSWORD: PASSWORD_111 + POSTGRES_DB: service_finder + volumes: + - postgres_data:/var/lib/postgresql/data + ports: + - "5432:5432" + networks: + - service_finder_net + + # 2. BACKEND API (Az Agy) + service_finder_api: + build: + context: ./backend + dockerfile: Dockerfile + container_name: service_finder_api + ports: + - "8000:8000" + volumes: + - ./backend:/app/app + - ./frontend:/app/frontend + environment: + - DATABASE_URL=postgresql+asyncpg://admin:PASSWORD_111@postgres-db:5432/service_finder + depends_on: + - postgres-db + networks: + - service_finder_net + + # 3. PGADMIN (A Monitor - Ezt hiányoltad!) + pgadmin: + image: dpage/pgadmin4 + container_name: pgadmin_ui + environment: + PGADMIN_DEFAULT_EMAIL: kincses@gmail.com + PGADMIN_DEFAULT_PASSWORD: MiskociA74 + ports: + - "5050:80" + depends_on: + - postgres-db + networks: + - service_finder_net + +networks: + service_finder_net: + driver: bridge + +volumes: + postgres_data: diff --git a/code-server-config/data/User/History/37941b6f/b1RX.yml b/code-server-config/data/User/History/37941b6f/b1RX.yml new file mode 100755 index 0000000..2a16370 --- /dev/null +++ b/code-server-config/data/User/History/37941b6f/b1RX.yml @@ -0,0 +1,88 @@ +services: + # 1. ADATBÁZIS (A Raktár) + postgres-db: + image: postgres:15 # Később ide jön a postgis/postgis:15-3.3-alpine a térképekhez + container_name: postgres-db + environment: + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + volumes: + - postgres_data:/var/lib/postgresql/data + ports: + - "${POSTGRES_PORT}:${POSTGRES_PORT}" + networks: + - service_finder_net + restart: unless-stopped + + # 2. BACKEND API (Az Agy) + service_finder_api: + build: + context: ./backend + dockerfile: Dockerfile + container_name: service_finder_api + ports: + - "8000:8000" + volumes: + - ./backend:/app/ # Hot-reload fejlesztéshez + - ./frontend:/app/frontend # Statikus fájlok + environment: + - DATABASE_URL=${DATABASE_URL} + # ÚJ: MinIO és Redis beállítások a jövőbeli NAS-hoz (felkészülés) + - MINIO_ENDPOINT=minio:9000 + - MINIO_ACCESS_KEY=${POSTGRES_USER} # Egyszerűség kedvéért most ugyanaz + - MINIO_SECRET_KEY=${POSTGRES_PASSWORD} + depends_on: + - postgres-db + - minio + - redis + networks: + - service_finder_net + + # 3. PGADMIN (A Monitor) + pgadmin: + image: dpage/pgadmin4 + container_name: pgadmin_ui + environment: + PGADMIN_DEFAULT_EMAIL: ${PGADMIN_EMAIL} + PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_PASSWORD} + ports: + - "5050:80" + depends_on: + - postgres-db + networks: + - service_finder_net + + # 4. MINIO (NAS - Dokumentum tároló) - ÚJ! + minio: + image: minio/minio + container_name: service_finder_minio + command: server /data --console-address ":9001" + environment: + MINIO_ROOT_USER: ${POSTGRES_USER} + MINIO_ROOT_PASSWORD: ${POSTGRES_PASSWORD} + volumes: + - minio_data:/data + ports: + - "9000:9000" # API + - "9001:9001" # UI + networks: + - service_finder_net + + # 5. REDIS (Gyorsítótár & Session) - ÚJ! + redis: + image: redis:alpine + container_name: service_finder_redis + volumes: + - redis_data:/data + networks: + - service_finder_net + +networks: + service_finder_net: + driver: bridge + +volumes: + postgres_data: + minio_data: # Itt lesznek a fájlok (számlák, fotók) + redis_data: diff --git a/code-server-config/data/User/History/37941b6f/entries.json b/code-server-config/data/User/History/37941b6f/entries.json new file mode 100755 index 0000000..35c195f --- /dev/null +++ b/code-server-config/data/User/History/37941b6f/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/docker-compose_NAS_el%C5%91tt.yml","entries":[{"id":"KJm1.yml","timestamp":1768941142773},{"id":"te4Z.yml","timestamp":1768941153007},{"id":"qTnB.yml","timestamp":1768941175024},{"id":"gx07.yml","timestamp":1769023755619},{"id":"b1RX.yml","timestamp":1769026642757},{"id":"ysWr.yml","timestamp":1769031074221},{"id":"8e20.yml","timestamp":1769031651647},{"id":"h3mF.yml","timestamp":1769106194741},{"id":"7GyZ.yml","timestamp":1769107662642},{"id":"5wWC.yml","timestamp":1769108106769},{"id":"qmLz.yml","source":"renamed.source","sourceDescription":"/home/coder/project/docker-compose.yml","timestamp":1769114711041}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/37941b6f/gx07.yml b/code-server-config/data/User/History/37941b6f/gx07.yml new file mode 100755 index 0000000..b24da01 --- /dev/null +++ b/code-server-config/data/User/History/37941b6f/gx07.yml @@ -0,0 +1,88 @@ +services: + # 1. ADATBÁZIS (A Raktár) + postgres-db: + image: postgres:15 # Később ide jön a postgis/postgis:15-3.3-alpine a térképekhez + container_name: postgres-db + environment: + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + volumes: + - postgres_data:/var/lib/postgresql/data + ports: + - "${POSTGRES_PORT}:${POSTGRES_PORT}" + networks: + - service_finder_net + restart: unless-stopped + + # 2. BACKEND API (Az Agy) + service_finder_api: + build: + context: ./backend + dockerfile: Dockerfile + container_name: service_finder_api + ports: + - "8000:8000" + volumes: + - ./backend:/app/app # Hot-reload fejlesztéshez + - ./frontend:/app/frontend # Statikus fájlok + environment: + - DATABASE_URL=${DATABASE_URL} + # ÚJ: MinIO és Redis beállítások a jövőbeli NAS-hoz (felkészülés) + - MINIO_ENDPOINT=minio:9000 + - MINIO_ACCESS_KEY=${POSTGRES_USER} # Egyszerűség kedvéért most ugyanaz + - MINIO_SECRET_KEY=${POSTGRES_PASSWORD} + depends_on: + - postgres-db + - minio + - redis + networks: + - service_finder_net + + # 3. PGADMIN (A Monitor) + pgadmin: + image: dpage/pgadmin4 + container_name: pgadmin_ui + environment: + PGADMIN_DEFAULT_EMAIL: ${PGADMIN_EMAIL} + PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_PASSWORD} + ports: + - "5050:80" + depends_on: + - postgres-db + networks: + - service_finder_net + + # 4. MINIO (NAS - Dokumentum tároló) - ÚJ! + minio: + image: minio/minio + container_name: service_finder_minio + command: server /data --console-address ":9001" + environment: + MINIO_ROOT_USER: ${POSTGRES_USER} + MINIO_ROOT_PASSWORD: ${POSTGRES_PASSWORD} + volumes: + - minio_data:/data + ports: + - "9000:9000" # API + - "9001:9001" # UI + networks: + - service_finder_net + + # 5. REDIS (Gyorsítótár & Session) - ÚJ! + redis: + image: redis:alpine + container_name: service_finder_redis + volumes: + - redis_data:/data + networks: + - service_finder_net + +networks: + service_finder_net: + driver: bridge + +volumes: + postgres_data: + minio_data: # Itt lesznek a fájlok (számlák, fotók) + redis_data: diff --git a/code-server-config/data/User/History/37941b6f/h3mF.yml b/code-server-config/data/User/History/37941b6f/h3mF.yml new file mode 100755 index 0000000..cae7d92 --- /dev/null +++ b/code-server-config/data/User/History/37941b6f/h3mF.yml @@ -0,0 +1,91 @@ +services: + # 1. ADATBÁZIS (A Raktár) + postgres-db: + image: postgres:15 # Később ide jön a postgis/postgis:15-3.3-alpine a térképekhez + container_name: postgres-db + environment: + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + volumes: + - postgres_data:/var/lib/postgresql/data + ports: + - "${POSTGRES_PORT}:${POSTGRES_PORT}" + networks: + - service_finder_net + restart: unless-stopped + + # 2. BACKEND API (Az Agy) + service_finder_api: + build: + context: ./backend + dockerfile: Dockerfile + container_name: service_finder_api + # Parancs kiegészítése: meg kell engedni a proxy-tól jövő kéréseket + command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --proxy-headers --forwarded-allow-ips="*" + ports: + - "8000:8000" + environment: + - DATABASE_URL=postgresql+asyncpg://${APP_DB_USER}:${APP_DB_PASSWORD}@postgres-db:${APP_DB_PORT}/${APP_DB_NAME} + - SECRET_KEY=${SECRET_KEY} + # CORS beállítás: fontos, hogy a domainjeidről engedélyezd a kérést! + - ALLOWED_ORIGINS=https://dev.profibot.hu,https://app.profibot.hu + + # ÚJ: MinIO és Redis beállítások a jövőbeli NAS-hoz (felkészülés) + - MINIO_ENDPOINT=minio:9000 + - MINIO_ACCESS_KEY=${POSTGRES_USER} # Egyszerűség kedvéért most ugyanaz + - MINIO_SECRET_KEY=${POSTGRES_PASSWORD} + depends_on: + - postgres-db + - minio + - redis + networks: + - service_finder_net + + # 3. PGADMIN (A Monitor) + pgadmin: + image: dpage/pgadmin4 + container_name: pgadmin_ui + environment: + PGADMIN_DEFAULT_EMAIL: ${PGADMIN_EMAIL} + PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_PASSWORD} + ports: + - "5050:80" + depends_on: + - postgres-db + networks: + - service_finder_net + + # 4. MINIO (NAS - Dokumentum tároló) - ÚJ! + minio: + image: minio/minio + container_name: service_finder_minio + command: server /data --console-address ":9001" + environment: + MINIO_ROOT_USER: ${POSTGRES_USER} + MINIO_ROOT_PASSWORD: ${POSTGRES_PASSWORD} + volumes: + - minio_data:/data + ports: + - "9000:9000" # API + - "9001:9001" # UI + networks: + - service_finder_net + + # 5. REDIS (Gyorsítótár & Session) - ÚJ! + redis: + image: redis:alpine + container_name: service_finder_redis + volumes: + - redis_data:/data + networks: + - service_finder_net + +networks: + service_finder_net: + driver: bridge + +volumes: + postgres_data: + minio_data: # Itt lesznek a fájlok (számlák, fotók) + redis_data: diff --git a/code-server-config/data/User/History/37941b6f/qTnB.yml b/code-server-config/data/User/History/37941b6f/qTnB.yml new file mode 100755 index 0000000..48bd36d --- /dev/null +++ b/code-server-config/data/User/History/37941b6f/qTnB.yml @@ -0,0 +1,54 @@ +services: + # 1. ADATBÁZIS (A Raktár) + postgres-db: + image: postgres:15 + container_name: postgres-db + environment: + POSTGRES_USER: kincses + POSTGRES_PASSWORD: MiskociA74 + POSTGRES_DB: service_finder + volumes: + - postgres_data:/var/lib/postgresql/data + ports: + - "5432:5432" + networks: + - service_finder_net + + # 2. BACKEND API (Az Agy) + service_finder_api: + build: + context: ./backend + dockerfile: Dockerfile + container_name: service_finder_api + ports: + - "8000:8000" + volumes: + - ./backend:/app/app + - ./frontend:/app/frontend + environment: + - DATABASE_URL=postgresql+asyncpg://admin:MiskociA74@postgres-db:5432/service_finder + depends_on: + - postgres-db + networks: + - service_finder_net + + # 3. PGADMIN (A Monitor - Ezt hiányoltad!) + pgadmin: + image: dpage/pgadmin4 + container_name: pgadmin_ui + environment: + PGADMIN_DEFAULT_EMAIL: kincses@gmail.com + PGADMIN_DEFAULT_PASSWORD: MiskociA74 + ports: + - "5050:80" + depends_on: + - postgres-db + networks: + - service_finder_net + +networks: + service_finder_net: + driver: bridge + +volumes: + postgres_data: diff --git a/code-server-config/data/User/History/37941b6f/qmLz.yml b/code-server-config/data/User/History/37941b6f/qmLz.yml new file mode 100755 index 0000000..b02c63e --- /dev/null +++ b/code-server-config/data/User/History/37941b6f/qmLz.yml @@ -0,0 +1,94 @@ +services: + # 1. ADATBÁZIS (A Raktár) + postgres-db: + image: postgres:15 # Később ide jön a postgis/postgis:15-3.3-alpine a térképekhez + container_name: postgres-db + environment: + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + volumes: + - postgres_data:/var/lib/postgresql/data + ports: + - "${POSTGRES_PORT}:${POSTGRES_PORT}" + networks: + - service_finder_net + restart: unless-stopped + + # 2. BACKEND API (Az Agy) + service_finder_api: + build: + context: ./backend + dockerfile: Dockerfile + container_name: service_finder_api + volumes: + - ./backend:/app + # Parancs kiegészítése: meg kell engedni a proxy-tól jövő kéréseket + command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --proxy-headers --forwarded-allow-ips="*" + ports: + - "8000:8000" + environment: + - PYTHONPATH=/app + - DATABASE_URL=postgresql+asyncpg://${APP_DB_USER}:${APP_DB_PASSWORD}@postgres-db:${APP_DB_PORT}/${APP_DB_NAME} + - SECRET_KEY=${SECRET_KEY} + # CORS beállítás: fontos, hogy a domainjeidről engedélyezd a kérést! + - ALLOWED_ORIGINS=https://dev.profibot.hu,https://app.profibot.hu + + # ÚJ: MinIO és Redis beállítások a jövőbeli NAS-hoz (felkészülés) + - MINIO_ENDPOINT=minio:9000 + - MINIO_ACCESS_KEY=${POSTGRES_USER} # Egyszerűség kedvéért most ugyanaz + - MINIO_SECRET_KEY=${POSTGRES_PASSWORD} + depends_on: + - postgres-db + - minio + - redis + networks: + - service_finder_net + + # 3. PGADMIN (A Monitor) + pgadmin: + image: dpage/pgadmin4 + container_name: pgadmin_ui + environment: + PGADMIN_DEFAULT_EMAIL: ${PGADMIN_EMAIL} + PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_PASSWORD} + ports: + - "5050:80" + depends_on: + - postgres-db + networks: + - service_finder_net + + # 4. MINIO (NAS - Dokumentum tároló) - ÚJ! + minio: + image: minio/minio + container_name: service_finder_minio + command: server /data --console-address ":9001" + environment: + MINIO_ROOT_USER: ${POSTGRES_USER} + MINIO_ROOT_PASSWORD: ${POSTGRES_PASSWORD} + volumes: + - minio_data:/data + ports: + - "9000:9000" # API + - "9001:9001" # UI + networks: + - service_finder_net + + # 5. REDIS (Gyorsítótár & Session) - ÚJ! + redis: + image: redis:alpine + container_name: service_finder_redis + volumes: + - redis_data:/data + networks: + - service_finder_net + +networks: + service_finder_net: + driver: bridge + +volumes: + postgres_data: + minio_data: # Itt lesznek a fájlok (számlák, fotók) + redis_data: diff --git a/code-server-config/data/User/History/37941b6f/te4Z.yml b/code-server-config/data/User/History/37941b6f/te4Z.yml new file mode 100755 index 0000000..a6512cf --- /dev/null +++ b/code-server-config/data/User/History/37941b6f/te4Z.yml @@ -0,0 +1,54 @@ +services: + # 1. ADATBÁZIS (A Raktár) + postgres-db: + image: postgres:15 + container_name: postgres-db + environment: + POSTGRES_USER: admin + POSTGRES_PASSWORD: PASSWORD_111 + POSTGRES_DB: service_finder + volumes: + - postgres_data:/var/lib/postgresql/data + ports: + - "5432:5432" + networks: + - service_finder_net + + # 2. BACKEND API (Az Agy) + service_finder_api: + build: + context: ./backend + dockerfile: Dockerfile + container_name: service_finder_api + ports: + - "8000:8000" + volumes: + - ./backend:/app/app + - ./frontend:/app/frontend + environment: + - DATABASE_URL=postgresql+asyncpg://admin:MiskociA74@postgres-db:5432/service_finder + depends_on: + - postgres-db + networks: + - service_finder_net + + # 3. PGADMIN (A Monitor - Ezt hiányoltad!) + pgadmin: + image: dpage/pgadmin4 + container_name: pgadmin_ui + environment: + PGADMIN_DEFAULT_EMAIL: kincses@gmail.com + PGADMIN_DEFAULT_PASSWORD: MiskociA74 + ports: + - "5050:80" + depends_on: + - postgres-db + networks: + - service_finder_net + +networks: + service_finder_net: + driver: bridge + +volumes: + postgres_data: diff --git a/code-server-config/data/User/History/37941b6f/ysWr.yml b/code-server-config/data/User/History/37941b6f/ysWr.yml new file mode 100755 index 0000000..14ac979 --- /dev/null +++ b/code-server-config/data/User/History/37941b6f/ysWr.yml @@ -0,0 +1,88 @@ +services: + # 1. ADATBÁZIS (A Raktár) + postgres-db: + image: postgres:15 # Később ide jön a postgis/postgis:15-3.3-alpine a térképekhez + container_name: postgres-db + environment: + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + volumes: + - postgres_data:/var/lib/postgresql/data + ports: + - "${POSTGRES_PORT}:${POSTGRES_PORT}" + networks: + - service_finder_net + restart: unless-stopped + + # 2. BACKEND API (Az Agy) + service_finder_api: + build: + context: ./backend + dockerfile: Dockerfile + container_name: service_finder_api + ports: + - "8000:8000" + volumes: + - ./backend:/app/ # Hot-reload fejlesztéshez + - ./frontend:/app/frontend # Statikus fájlok + environment: + - DATABASE_URL=postgresql+asyncpg://${APP_DB_USER}:${APP_DB_PASSWORD}@${APP_DB_HOST}:${APP_DB_PORT}/${APP_DB_NAME} + # ÚJ: MinIO és Redis beállítások a jövőbeli NAS-hoz (felkészülés) + - MINIO_ENDPOINT=minio:9000 + - MINIO_ACCESS_KEY=${POSTGRES_USER} # Egyszerűség kedvéért most ugyanaz + - MINIO_SECRET_KEY=${POSTGRES_PASSWORD} + depends_on: + - postgres-db + - minio + - redis + networks: + - service_finder_net + + # 3. PGADMIN (A Monitor) + pgadmin: + image: dpage/pgadmin4 + container_name: pgadmin_ui + environment: + PGADMIN_DEFAULT_EMAIL: ${PGADMIN_EMAIL} + PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_PASSWORD} + ports: + - "5050:80" + depends_on: + - postgres-db + networks: + - service_finder_net + + # 4. MINIO (NAS - Dokumentum tároló) - ÚJ! + minio: + image: minio/minio + container_name: service_finder_minio + command: server /data --console-address ":9001" + environment: + MINIO_ROOT_USER: ${POSTGRES_USER} + MINIO_ROOT_PASSWORD: ${POSTGRES_PASSWORD} + volumes: + - minio_data:/data + ports: + - "9000:9000" # API + - "9001:9001" # UI + networks: + - service_finder_net + + # 5. REDIS (Gyorsítótár & Session) - ÚJ! + redis: + image: redis:alpine + container_name: service_finder_redis + volumes: + - redis_data:/data + networks: + - service_finder_net + +networks: + service_finder_net: + driver: bridge + +volumes: + postgres_data: + minio_data: # Itt lesznek a fájlok (számlák, fotók) + redis_data: diff --git a/code-server-config/data/User/History/3ae47db8/WFYx b/code-server-config/data/User/History/3ae47db8/WFYx new file mode 100755 index 0000000..9b94eee --- /dev/null +++ b/code-server-config/data/User/History/3ae47db8/WFYx @@ -0,0 +1,13 @@ +FROM python:3.12-slim + +WORKDIR /app + +# Rendszerfüggőségek telepítése +RUN apt-get update && apt-get install -y --no-install-recommends gcc python3-dev && rm -rf /var/lib/apt/lists/* + +# Python csomagok fixálása +RUN pip install --no-cache-dir fastapi uvicorn sqlalchemy asyncpg python-dotenv python-multipart "python-jose[cryptography]" "passlib[bcrypt]" + +# Munkakönyvtár beállítása +ENV PYTHONPATH=/app +CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload", "--reload-dir", "/app/app"] \ No newline at end of file diff --git a/code-server-config/data/User/History/3ae47db8/bsiX b/code-server-config/data/User/History/3ae47db8/bsiX new file mode 100755 index 0000000..d20c85c --- /dev/null +++ b/code-server-config/data/User/History/3ae47db8/bsiX @@ -0,0 +1,33 @@ +FROM python:3.12-slim + +WORKDIR /app + +# Rendszerfüggőségek +RUN apt-get update && apt-get install -y --no-install-recommends \ + gcc \ + python3-dev \ + libpq-dev \ + && rm -rf /var/lib/apt/lists/* + +# Összes szükséges Python csomag (Hozzáadva: sendgrid) +RUN pip install --no-cache-dir \ + fastapi \ + uvicorn \ + sqlalchemy \ + asyncpg \ + python-dotenv \ + python-multipart \ + "python-jose[cryptography]" \ + bcrypt \ + passlib \ + pydantic-settings \ + minio \ + redis \ + email-validator \ + sendgrid + +# Fájlok másolása és elérési út beállítása +COPY . . +ENV PYTHONPATH=/app + +CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"] \ No newline at end of file diff --git a/code-server-config/data/User/History/3ae47db8/eAJ3 b/code-server-config/data/User/History/3ae47db8/eAJ3 new file mode 100755 index 0000000..537ffc9 --- /dev/null +++ b/code-server-config/data/User/History/3ae47db8/eAJ3 @@ -0,0 +1,33 @@ +FROM python:3.12-slim + +WORKDIR /app + +# Rendszerfüggőségek telepítése (libpq-dev fontos a Postgreshez!) +RUN apt-get update && apt-get install -y --no-install-recommends \ + gcc \ + python3-dev \ + libpq-dev \ + && rm -rf /var/lib/apt/lists/* + +# Python csomagok telepítése +# HOZZÁADVA: pydantic-settings (a config-hoz), minio (a NAS-hoz), redis (a cache-hez) +RUN pip install --no-cache-dir \ + fastapi \ + uvicorn \ + sqlalchemy \ + asyncpg \ + python-dotenv \ + python-multipart \ + "python-jose[cryptography]" \ + "passlib[bcrypt]" \ + pydantic-settings \ + minio \ + redis + +# Munkakönyvtár beállítása a Python Path-hoz +ENV PYTHONPATH=/app + +# Indítás +# Fontos: Mivel a backend mappát csatoljuk a /app-ra, az "app.main:app" +# a /app/app/main.py fájlt fogja keresni. Ez így helyes! +CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"] \ No newline at end of file diff --git a/code-server-config/data/User/History/3ae47db8/entries.json b/code-server-config/data/User/History/3ae47db8/entries.json new file mode 100755 index 0000000..54e7bff --- /dev/null +++ b/code-server-config/data/User/History/3ae47db8/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/backend/Dockerfile","entries":[{"id":"WFYx","timestamp":1768952471404},{"id":"eAJ3","timestamp":1769026950466},{"id":"fjXV","timestamp":1769108266719},{"id":"bsiX","timestamp":1769108569963}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/3ae47db8/fjXV b/code-server-config/data/User/History/3ae47db8/fjXV new file mode 100755 index 0000000..0ca5639 --- /dev/null +++ b/code-server-config/data/User/History/3ae47db8/fjXV @@ -0,0 +1,31 @@ +FROM python:3.12-slim + +WORKDIR /app + +# Rendszerfüggőségek +RUN apt-get update && apt-get install -y --no-install-recommends \ + gcc \ + python3-dev \ + libpq-dev \ + && rm -rf /var/lib/apt/lists/* + +# Python csomagok frissített listája +RUN pip install --no-cache-dir \ + fastapi \ + uvicorn \ + sqlalchemy \ + asyncpg \ + python-dotenv \ + python-multipart \ + "python-jose[cryptography]" \ + bcrypt \ + passlib \ + pydantic-settings \ + minio \ + redis \ + email-validator + +# Munkakönyvtár beállítása +ENV PYTHONPATH=/app + +CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"] \ No newline at end of file diff --git a/code-server-config/data/User/History/5144c62f/entries.json b/code-server-config/data/User/History/5144c62f/entries.json new file mode 100755 index 0000000..529ba7b --- /dev/null +++ b/code-server-config/data/User/History/5144c62f/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/backend/app/services/notification_service.py","entries":[{"id":"ySrz.py","timestamp":1769041693523}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/5144c62f/ySrz.py b/code-server-config/data/User/History/5144c62f/ySrz.py new file mode 100755 index 0000000..9d7dc92 --- /dev/null +++ b/code-server-config/data/User/History/5144c62f/ySrz.py @@ -0,0 +1,14 @@ +from datetime import datetime, timedelta +from sqlalchemy import select +from app.models.user import User +from app.models.vehicle import Vehicle +from app.core.email import send_expiry_notification + +async def check_expiring_documents(db: AsyncSession, background_tasks: BackgroundTasks): + # Példa: Műszaki vizsga lejárata 30 napon belül + threshold = datetime.now().date() + timedelta(days=30) + result = await db.execute( + select(Vehicle, User).join(User).where(Vehicle.mot_expiry_date <= threshold) + ) + for vehicle, user in result.all(): + send_expiry_notification(background_tasks, user.email, f"Műszaki vizsga ({vehicle.license_plate})") \ No newline at end of file diff --git a/code-server-config/data/User/History/55969fe3/JlPL.py b/code-server-config/data/User/History/55969fe3/JlPL.py new file mode 100755 index 0000000..cda5b6c --- /dev/null +++ b/code-server-config/data/User/History/55969fe3/JlPL.py @@ -0,0 +1,56 @@ +import asyncio +import os +from sqlalchemy.ext.asyncio import create_async_engine +from sqlalchemy import text +from dotenv import load_dotenv + +load_dotenv() + +raw_url = os.getenv("DATABASE_URL") +if not raw_url: + raw_url = "postgresql://admin:PASSWORD_111@postgres-db:5432/service_finder" +DATABASE_URL = raw_url.replace("postgresql://", "postgresql+asyncpg://").replace("/service_finder_db", "/service_finder") + +async def expand_categories(): + engine = create_async_engine(DATABASE_URL) + async with engine.begin() as conn: + print("📥 Új Főkategóriák beszúrása...") + parents = [ + ('EQUIPMENT', '🛠️ Felszerelés / Extrák', 25), # Vételár után + ('OPERATIONAL', '🅿️ Üzemeltetés / Út', 15), # Tankolás után + ('FINE', '👮 Bírság / Büntetés', 90) + ] + for p in parents: + await conn.execute(text("INSERT INTO ref.cost_types (code, name, sort_order) VALUES (:c, :n, :s) ON CONFLICT (code) DO NOTHING"), {"c": p[0], "n": p[1], "s": p[2]}) + + print("📥 Új Alkategóriák beszúrása...") + children = [ + # Felszerelés (EQUIPMENT) + ('EQUIP_SHELVING', 'Raktérburkolat / Polcrendszer', 'EQUIPMENT'), + ('EQUIP_BRANDING', 'Matricázás / Fóliázás', 'EQUIPMENT'), + ('EQUIP_TOWBAR', 'Vonóhorog / Tetőcsomagtartó', 'EQUIPMENT'), + ('EQUIP_SAFETY', 'Kötelező tartozékok (Eü. csomag)', 'EQUIPMENT'), + ('EQUIP_GPS', 'GPS / Nyomkövető hardver', 'EQUIPMENT'), + ('EQUIP_WINTER_TIRE', 'Téli gumi szett (Beszerzés)', 'EQUIPMENT'), + + # Üzemeltetés (OPERATIONAL) + ('OP_PARKING', 'Parkolás', 'OPERATIONAL'), + ('OP_TOLL', 'Útdíj / Matrica / Behajtás', 'OPERATIONAL'), + ('OP_WASH', 'Mosás / Kozmetika', 'OPERATIONAL'), + ('OP_ADBLUE', 'AdBlue', 'OPERATIONAL'), + ('OP_EV_CHARGE', 'Elektromos töltés', 'OPERATIONAL'), + ('OP_STORAGE', 'Gumi hotel / Tárolás', 'OPERATIONAL'), + + # Bírság (FINE) + ('FINE_SPEEDING', 'Gyorshajtás', 'FINE'), + ('FINE_PARKING', 'Parkolási bírság', 'FINE'), + ('FINE_ADMIN', 'Közigazgatási bírság', 'FINE') + ] + for c in children: + await conn.execute(text("INSERT INTO ref.cost_types (code, name, parent_code) VALUES (:c, :n, :p) ON CONFLICT (code) DO NOTHING"), {"c": c[0], "n": c[1], "p": c[2]}) + + print("✅ KÉSZ! A költséglista most már teljeskörű.") + await engine.dispose() + +if __name__ == "__main__": + asyncio.run(expand_categories()) \ No newline at end of file diff --git a/code-server-config/data/User/History/55969fe3/entries.json b/code-server-config/data/User/History/55969fe3/entries.json new file mode 100755 index 0000000..0dc6cca --- /dev/null +++ b/code-server-config/data/User/History/55969fe3/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/backend/update_cost_categories.py","entries":[{"id":"JlPL.py","timestamp":1768948688691}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/563f6285/entries.json b/code-server-config/data/User/History/563f6285/entries.json new file mode 100755 index 0000000..2e9d793 --- /dev/null +++ b/code-server-config/data/User/History/563f6285/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/backend/app/schemas/user.py","entries":[{"id":"iogF.py","timestamp":1769035839738}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/563f6285/iogF.py b/code-server-config/data/User/History/563f6285/iogF.py new file mode 100755 index 0000000..e8bc247 --- /dev/null +++ b/code-server-config/data/User/History/563f6285/iogF.py @@ -0,0 +1,19 @@ +from pydantic import BaseModel, ConfigDict, EmailStr +from typing import Optional +from datetime import datetime + +class UserBase(BaseModel): + email: EmailStr + full_name: Optional[str] = None + +class UserCreate(UserBase): + password: str + +class UserResponse(UserBase): + id: int + is_active: bool + reputation_score: int # Ez a legfontosabb új mező! + is_superuser: bool + created_at: datetime + + model_config = ConfigDict(from_attributes=True) diff --git a/code-server-config/data/User/History/5bff933a/entries.json b/code-server-config/data/User/History/5bff933a/entries.json new file mode 100755 index 0000000..07e4aef --- /dev/null +++ b/code-server-config/data/User/History/5bff933a/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/backend/app/api/v1/auth.py","entries":[{"id":"j30u.py","timestamp":1769041576002}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/5bff933a/j30u.py b/code-server-config/data/User/History/5bff933a/j30u.py new file mode 100755 index 0000000..508f32a --- /dev/null +++ b/code-server-config/data/User/History/5bff933a/j30u.py @@ -0,0 +1,73 @@ +from fastapi import APIRouter, Depends, HTTPException, status, BackgroundTasks +from fastapi.security import OAuth2PasswordRequestForm +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select +from datetime import timedelta + +from app.db.session import get_db +from app.models.user import User +from app.core.security import get_password_hash, verify_password, create_access_token +from app.core.email import send_verification_email +import os + +router = APIRouter() + +@router.post("/register", status_code=status.HTTP_201_CREATED) +async def register( + background_tasks: BackgroundTasks, + email: str, password: str, full_name: str, + db: AsyncSession = Depends(get_db) +): + # Email ellenőrzés + res = await db.execute(select(User).where(User.email == email)) + if res.scalars().first(): + raise HTTPException(status_code=400, detail="Ez az email már foglalt") + + new_user = User( + email=email, + password_hash=get_password_hash(password), + full_name=full_name, + is_active=False # Aktiválásig inaktív + ) + db.add(new_user) + await db.commit() + + # Aktiváló token (egyszerűség kedvéért most a JWT-t használjuk tokenként) + token = create_access_token(data={"sub": email}, expires_delta=timedelta(hours=24)) + send_verification_email(background_tasks, email, token) + + return {"message": "Sikeres regisztráció! Ellenőrizd az email fiókodat az aktiváláshoz."} + +@router.get("/verify/{token}") +async def verify_account(token: str, db: AsyncSession = Depends(get_db)): + try: + payload = jwt.decode(token, os.getenv("SECRET_KEY"), algorithms=[os.getenv("ALGORITHM")]) + email = payload.get("sub") + except: + raise HTTPException(status_code=400, detail="Érvénytelen vagy lejárt token") + + result = await db.execute(select(User).where(User.email == email)) + user = result.scalars().first() + if not user: + raise HTTPException(status_code=404, detail="Felhasználó nem található") + + user.is_active = True + await db.commit() + return {"message": "Fiók sikeresen aktiválva!"} + +@router.post("/login") +async def login( + form_data: OAuth2PasswordRequestForm = Depends(), + db: AsyncSession = Depends(get_db) +): + result = await db.execute(select(User).where(User.email == form_data.username)) + user = result.scalars().first() + + if not user or not verify_password(form_data.password, user.password_hash): + raise HTTPException(status_code=400, detail="Hibás email vagy jelszó") + + if not user.is_active: + raise HTTPException(status_code=400, detail="Kérjük, aktiváld a fiókodat az emailben küldött linken") + + access_token = create_access_token(data={"sub": user.email}) + return {"access_token": access_token, "token_type": "bearer"} \ No newline at end of file diff --git a/code-server-config/data/User/History/639c2122/entries.json b/code-server-config/data/User/History/639c2122/entries.json new file mode 100755 index 0000000..b84c0fa --- /dev/null +++ b/code-server-config/data/User/History/639c2122/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/backend/update_docs.py","entries":[{"id":"u4bN.py","timestamp":1768946792839}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/639c2122/u4bN.py b/code-server-config/data/User/History/639c2122/u4bN.py new file mode 100755 index 0000000..0ff9347 --- /dev/null +++ b/code-server-config/data/User/History/639c2122/u4bN.py @@ -0,0 +1,26 @@ +import asyncio +import os +from sqlalchemy.ext.asyncio import create_async_engine +from sqlalchemy import text +from dotenv import load_dotenv + +load_dotenv() + +raw_url = os.getenv("DATABASE_URL") +if not raw_url: + raw_url = "postgresql://admin:PASSWORD_111@postgres-db:5432/service_finder" +DATABASE_URL = raw_url.replace("postgresql://", "postgresql+asyncpg://").replace("/service_finder_db", "/service_finder") + +async def add_doc_column(): + engine = create_async_engine(DATABASE_URL) + async with engine.begin() as conn: + print("📄 Dokumentum oszlop hozzáadása a Costs táblához...") + await conn.execute(text(""" + ALTER TABLE data.costs + ADD COLUMN IF NOT EXISTS document_url VARCHAR(255); + """)) + print("✅ KÉSZ! Mehetnek a fájlok.") + await engine.dispose() + +if __name__ == "__main__": + asyncio.run(add_doc_column()) \ No newline at end of file diff --git a/code-server-config/data/User/History/6ca6cf1a/ZFcJ.py b/code-server-config/data/User/History/6ca6cf1a/ZFcJ.py new file mode 100755 index 0000000..a8d3baf --- /dev/null +++ b/code-server-config/data/User/History/6ca6cf1a/ZFcJ.py @@ -0,0 +1,114 @@ +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select, func, desc +from app.models.vehicle import Vehicle +from app.models.expense import VehicleEvent, ExpenseCategory +from app.models.social import ServiceProvider, SourceType, ModerationStatus +from app.schemas.fleet import EventCreate, TCOStats + +async def add_vehicle_event(db: AsyncSession, vehicle_id: int, event_data: EventCreate, user_id: int): + """ + Összetett logika esemény rögzítésére: + 1. Provider kezelés (DIY vs Existing vs New Ad-Hoc) + 2. Odometer integritás ellenőrzés + 3. Mentés és Jármű frissítés + """ + + # 1. Jármű ellenőrzése + vehicle_res = await db.execute(select(Vehicle).where(Vehicle.id == vehicle_id)) + vehicle = vehicle_res.scalars().first() + if not vehicle: + return {"error": "Vehicle not found"} + + # 2. Provider Logika + final_provider_id = event_data.provider_id + + if event_data.is_diy: + # Ha DIY, akkor nincs provider + final_provider_id = None + if not event_data.description: + event_data.description = "Saját javítás (DIY)" + + elif event_data.provider_name and not final_provider_id: + # Ha nevet kaptunk, de ID-t nem -> Keresés vagy Létrehozás + # Megpróbáljuk megkeresni név alapján (case insensitive) + provider_res = await db.execute(select(ServiceProvider).where(func.lower(ServiceProvider.name) == event_data.provider_name.lower())) + existing_provider = provider_res.scalars().first() + + if existing_provider: + final_provider_id = existing_provider.id + else: + # Nem létezik -> Létrehozunk egy "Fantom" szolgáltatót + new_provider = ServiceProvider( + name=event_data.provider_name, + address="Unknown (User Generated)", + status=ModerationStatus.pending, # Ellenőrzésre vár + source=SourceType.manual, + added_by_user_id=user_id + ) + db.add(new_provider) + await db.flush() # Hogy kapjunk ID-t + final_provider_id = new_provider.id + print(f"--- INFO: Created Ad-Hoc Provider: {event_data.provider_name} (ID: {final_provider_id})") + + # 3. Odometer Logika (Biztonság) + anomaly_detected = False + + if event_data.odometer_value < vehicle.current_odometer: + # Figyelmeztetés: Csökkent a kilométerállás! + anomaly_detected = True + print(f"--- WARN: Odometer rollback detected for Vehicle {vehicle_id}!") + + # 4. Esemény mentése + new_event = VehicleEvent( + vehicle_id=vehicle_id, + event_type=event_data.event_type, + date=event_data.date, + odometer_value=event_data.odometer_value, + odometer_anomaly=anomaly_detected, + cost_amount=event_data.cost_amount, + description=event_data.description, + is_diy=event_data.is_diy, + service_provider_id=final_provider_id + ) + + db.add(new_event) + + # 5. Jármű frissítése (Ha nőtt a km, update-eljük a current-et) + if event_data.odometer_value > vehicle.current_odometer: + vehicle.current_odometer = event_data.odometer_value + + await db.commit() + await db.refresh(new_event) + return new_event + +async def calculate_tco(db: AsyncSession, vehicle_id: int) -> TCOStats: + """Teljes költség elemzés (TCO)""" + + # Költségek lekérése kategóriánként + result = await db.execute( + select(VehicleEvent.event_type, func.sum(VehicleEvent.cost_amount)) + .where(VehicleEvent.vehicle_id == vehicle_id) + .group_by(VehicleEvent.event_type) + ) + + breakdown = {row[0]: row[1] for row in result.all()} + total_cost = sum(breakdown.values()) + + # Km futás számítás + vehicle_res = await db.execute(select(Vehicle).where(Vehicle.id == vehicle_id)) + vehicle = vehicle_res.scalars().first() + + km_driven = 0 + cost_per_km = 0.0 + + if vehicle: + km_driven = max(0, vehicle.current_odometer - vehicle.initial_odometer) + if km_driven > 0: + cost_per_km = total_cost / km_driven + + return TCOStats( + vehicle_id=vehicle_id, + total_cost=total_cost, + breakdown=breakdown, + cost_per_km=round(cost_per_km, 2) + ) \ No newline at end of file diff --git a/code-server-config/data/User/History/6ca6cf1a/entries.json b/code-server-config/data/User/History/6ca6cf1a/entries.json new file mode 100755 index 0000000..cd77118 --- /dev/null +++ b/code-server-config/data/User/History/6ca6cf1a/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/backend/app/services/fleet_service.py","entries":[{"id":"ZFcJ.py","timestamp":1769038171956}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/71ceecfb/entries.json b/code-server-config/data/User/History/71ceecfb/entries.json new file mode 100755 index 0000000..e93c1b2 --- /dev/null +++ b/code-server-config/data/User/History/71ceecfb/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/backend/.env","entries":[{"id":"khcD","timestamp":1769029493214}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/71ceecfb/khcD b/code-server-config/data/User/History/71ceecfb/khcD new file mode 100755 index 0000000..8636824 --- /dev/null +++ b/code-server-config/data/User/History/71ceecfb/khcD @@ -0,0 +1,22 @@ +# --- ADATBÁZIS BEÁLLÍTÁSOK --- +# Itt az általad megadott adatokat aszinkron formátumba öntöttük a FastAPI-hoz +DATABASE_URL="postgresql+asyncpg://://service_finder_app:AppSafePass_2026@postgres-db:5432/service_finder" + +# --- REDIS BEÁLLÍTÁSOK --- +# A Redis konténer neve a docker-compose alapján 'redis' +REDIS_URL=redis://redis:6379/0 + +# --- BIZTONSÁG (JWT) --- +# A titkos kulcsot javaslom lecserélni egy egyedire (pl. openssl rand -hex 32) +SECRET_KEY=CHANGE_ME_LONG_RANDOM +ALGORITHM=HS256 + +# Időtartamok percben és napban +ACCESS_TOKEN_EXPIRE_MINUTES=15 +REFRESH_TOKEN_EXPIRE_DAYS=30 + +# --- E-MAIL (Későbbi aktiváláshoz) --- +# MAIL_API_KEY=SG.példa_kulcs +# MAIL_FROM=info@profibot.hu + +CODE_SERVER_PASSWORD=Megeszemalakapom11 diff --git a/code-server-config/data/User/History/97f3a5f/IBcb.py b/code-server-config/data/User/History/97f3a5f/IBcb.py new file mode 100755 index 0000000..fbbf5ff --- /dev/null +++ b/code-server-config/data/User/History/97f3a5f/IBcb.py @@ -0,0 +1,9 @@ +from sqlalchemy.ext.asyncio import AsyncAttrs +from sqlalchemy.orm import DeclarativeBase + +class Base(AsyncAttrs, DeclarativeBase): + """ + Base class for all SQLAlchemy models. + Includes AsyncAttrs to support async attribute access (lazy loading). + """ + pass \ No newline at end of file diff --git a/code-server-config/data/User/History/97f3a5f/entries.json b/code-server-config/data/User/History/97f3a5f/entries.json new file mode 100755 index 0000000..4a1bd43 --- /dev/null +++ b/code-server-config/data/User/History/97f3a5f/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/backend/app/db/base.py","entries":[{"id":"IBcb.py","timestamp":1769025519272}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/e7633ef/9eTf.py b/code-server-config/data/User/History/e7633ef/9eTf.py new file mode 100755 index 0000000..7d9f19f --- /dev/null +++ b/code-server-config/data/User/History/e7633ef/9eTf.py @@ -0,0 +1,71 @@ +import enum +from sqlalchemy import Column, Integer, String, ForeignKey, Enum, DateTime, Boolean, Text, UniqueConstraint +from app.db.base import Base +from datetime import datetime + +# Enums (már schema="data" beállítással a biztonságért) +class ModerationStatus(str, enum.Enum): + pending = "pending" + approved = "approved" + rejected = "rejected" + +class SourceType(str, enum.Enum): + manual = "manual" + ocr = "ocr" + api_import = "import" + +class ServiceProvider(Base): + __tablename__ = "service_providers" + __table_args__ = {"schema": "data"} + + id = Column(Integer, primary_key=True, index=True) + name = Column(String, nullable=False) + address = Column(String, nullable=False) + category = Column(String) + + status = Column(Enum(ModerationStatus, schema="data", name="moderation_status_enum"), default=ModerationStatus.pending, nullable=False) + source = Column(Enum(SourceType, schema="data", name="source_type_enum"), default=SourceType.manual, nullable=False) + + # --- ÚJ MEZŐ --- + validation_score = Column(Integer, default=0) # A közösségi szavazatok összege + # --------------- + + evidence_image_path = Column(String, nullable=True) + added_by_user_id = Column(Integer, ForeignKey("data.users.id")) + created_at = Column(DateTime, default=datetime.utcnow) + +class Vote(Base): + __tablename__ = "votes" + __table_args__ = ( + UniqueConstraint('user_id', 'provider_id', name='uq_user_provider_vote'), + {"schema": "data"} + ) + + id = Column(Integer, primary_key=True) + user_id = Column(Integer, ForeignKey("data.users.id"), nullable=False) + provider_id = Column(Integer, ForeignKey("data.service_providers.id"), nullable=False) + vote_value = Column(Integer, nullable=False) # +1 vagy -1 + +class Competition(Base): + __tablename__ = "competitions" + __table_args__ = {"schema": "data"} + + id = Column(Integer, primary_key=True) + name = Column(String, nullable=False) # Pl: "Januári Feltöltő Verseny" + description = Column(Text) + start_date = Column(DateTime, nullable=False) + end_date = Column(DateTime, nullable=False) + is_active = Column(Boolean, default=True) + +class UserScore(Base): + __tablename__ = "user_scores" + __table_args__ = ( + UniqueConstraint('user_id', 'competition_id', name='uq_user_competition_score'), + {"schema": "data"} + ) + + id = Column(Integer, primary_key=True) + user_id = Column(Integer, ForeignKey("data.users.id")) + competition_id = Column(Integer, ForeignKey("data.competitions.id")) + points = Column(Integer, default=0) + last_updated = Column(DateTime, default=datetime.utcnow) \ No newline at end of file diff --git a/code-server-config/data/User/History/e7633ef/byJh.py b/code-server-config/data/User/History/e7633ef/byJh.py new file mode 100755 index 0000000..e97342b --- /dev/null +++ b/code-server-config/data/User/History/e7633ef/byJh.py @@ -0,0 +1,57 @@ +import enum +from sqlalchemy import Column, Integer, String, ForeignKey, Enum, DateTime, Boolean, Text +from sqlalchemy.orm import relationship +from app.core.database import Base +from datetime import datetime + +# Enums +class ModerationStatus(str, enum.Enum): + pending = "pending" + approved = "approved" + rejected = "rejected" + +class SourceType(str, enum.Enum): + manual = "manual" + ocr = "ocr" + api_import = "import" + +class ServiceProvider(Base): + __tablename__ = "service_providers" + __table_args__ = {"schema": "data"} + + id = Column(Integer, primary_key=True, index=True) + name = Column(String, nullable=False) + address = Column(String, nullable=False) + category = Column(String) + + # --- JAVÍTÁS ITT: schema="data" hozzáadása --- + # Megmondjuk, hogy az Enum típus a 'data' sémába kerüljön + status = Column(Enum(ModerationStatus, schema="data", name="moderation_status_enum"), default=ModerationStatus.pending, nullable=False) + source = Column(Enum(SourceType, schema="data", name="source_type_enum"), default=SourceType.manual, nullable=False) + # --------------------------------------------- + + evidence_image_path = Column(String, nullable=True) + + added_by_user_id = Column(Integer, ForeignKey("data.users.id")) + created_at = Column(DateTime, default=datetime.utcnow) + +class Competition(Base): + __tablename__ = "competitions" + __table_args__ = {"schema": "data"} + + id = Column(Integer, primary_key=True) + name = Column(String, nullable=False) + description = Column(Text) + start_date = Column(DateTime, nullable=False) + end_date = Column(DateTime, nullable=False) + is_active = Column(Boolean, default=True) + +class UserScore(Base): + __tablename__ = "user_scores" + __table_args__ = {"schema": "data"} + + id = Column(Integer, primary_key=True) + user_id = Column(Integer, ForeignKey("data.users.id")) + competition_id = Column(Integer, ForeignKey("data.competitions.id")) + points = Column(Integer, default=0) + last_updated = Column(DateTime, default=datetime.utcnow) \ No newline at end of file diff --git a/code-server-config/data/User/History/e7633ef/dmjc.py b/code-server-config/data/User/History/e7633ef/dmjc.py new file mode 100755 index 0000000..0f58764 --- /dev/null +++ b/code-server-config/data/User/History/e7633ef/dmjc.py @@ -0,0 +1,57 @@ +import enum +from datetime import datetime +from sqlalchemy import Column, Integer, String, Boolean, ForeignKey, DateTime, Enum, Text +from sqlalchemy.orm import relationship +from app.db.base import Base + +# --- Enums for Logic Control --- +class ModerationStatus(str, enum.Enum): + PENDING = "pending" + APPROVED = "approved" + REJECTED = "rejected" + +class SourceType(str, enum.Enum): + MANUAL = "manual" # User uploaded + OCR = "ocr" # Extracted from a receipt + IMPORT = "import" # System import + +# --- Models --- +class ServiceProvider(Base): + __tablename__ = "service_providers" + __table_args__ = {"schema": "data"} + + id = Column(Integer, primary_key=True, index=True) + name = Column(String, nullable=False) + address = Column(String) + + # Moderation Logic + status = Column(Enum(ModerationStatus), default=ModerationStatus.PENDING, nullable=False) + source = Column(Enum(SourceType), default=SourceType.MANUAL, nullable=False) + + # Verification Data + evidence_image_path = Column(String, nullable=True) # Path to MinIO object + + # Audit + added_by_user_id = Column(Integer, ForeignKey("data.users.id")) + created_at = Column(DateTime, default=datetime.utcnow) + +class Competition(Base): + __tablename__ = "competitions" + __table_args__ = {"schema": "data"} + + id = Column(Integer, primary_key=True, index=True) + name = Column(String, nullable=False) + description = Column(Text, nullable=True) + + start_date = Column(DateTime, nullable=False) + end_date = Column(DateTime, nullable=False) + is_active = Column(Boolean, default=True) + +class UserScore(Base): + __tablename__ = "user_scores" + __table_args__ = {"schema": "data"} + + id = Column(Integer, primary_key=True, index=True) + user_id = Column(Integer, ForeignKey("data.users.id")) + competition_id = Column(Integer, ForeignKey("data.competitions.id")) + points = Column(Integer, default=0) \ No newline at end of file diff --git a/code-server-config/data/User/History/e7633ef/entries.json b/code-server-config/data/User/History/e7633ef/entries.json new file mode 100755 index 0000000..4a04ccb --- /dev/null +++ b/code-server-config/data/User/History/e7633ef/entries.json @@ -0,0 +1 @@ +{"version":1,"resource":"vscode-remote://192.168.100.43:8443/home/coder/project/backend/app/models/social.py","entries":[{"id":"dmjc.py","timestamp":1769025543558},{"id":"byJh.py","timestamp":1769032091165},{"id":"vXRG.py","timestamp":1769032472402},{"id":"9eTf.py","timestamp":1769033781363}]} \ No newline at end of file diff --git a/code-server-config/data/User/History/e7633ef/vXRG.py b/code-server-config/data/User/History/e7633ef/vXRG.py new file mode 100755 index 0000000..5ec5d05 --- /dev/null +++ b/code-server-config/data/User/History/e7633ef/vXRG.py @@ -0,0 +1,57 @@ +import enum +from sqlalchemy import Column, Integer, String, ForeignKey, Enum, DateTime, Boolean, Text +from sqlalchemy.orm import relationship +from app.db.base import Base +from datetime import datetime + +# Enums +class ModerationStatus(str, enum.Enum): + pending = "pending" + approved = "approved" + rejected = "rejected" + +class SourceType(str, enum.Enum): + manual = "manual" + ocr = "ocr" + api_import = "import" + +class ServiceProvider(Base): + __tablename__ = "service_providers" + __table_args__ = {"schema": "data"} + + id = Column(Integer, primary_key=True, index=True) + name = Column(String, nullable=False) + address = Column(String, nullable=False) + category = Column(String) + + # --- JAVÍTÁS ITT: schema="data" hozzáadása --- + # Megmondjuk, hogy az Enum típus a 'data' sémába kerüljön + status = Column(Enum(ModerationStatus, schema="data", name="moderation_status_enum"), default=ModerationStatus.pending, nullable=False) + source = Column(Enum(SourceType, schema="data", name="source_type_enum"), default=SourceType.manual, nullable=False) + # --------------------------------------------- + + evidence_image_path = Column(String, nullable=True) + + added_by_user_id = Column(Integer, ForeignKey("data.users.id")) + created_at = Column(DateTime, default=datetime.utcnow) + +class Competition(Base): + __tablename__ = "competitions" + __table_args__ = {"schema": "data"} + + id = Column(Integer, primary_key=True) + name = Column(String, nullable=False) + description = Column(Text) + start_date = Column(DateTime, nullable=False) + end_date = Column(DateTime, nullable=False) + is_active = Column(Boolean, default=True) + +class UserScore(Base): + __tablename__ = "user_scores" + __table_args__ = {"schema": "data"} + + id = Column(Integer, primary_key=True) + user_id = Column(Integer, ForeignKey("data.users.id")) + competition_id = Column(Integer, ForeignKey("data.competitions.id")) + points = Column(Integer, default=0) + last_updated = Column(DateTime, default=datetime.utcnow) \ No newline at end of file diff --git a/code-server-config/data/User/caches/CachedConfigurations/folder/-285bda86/configuration.json b/code-server-config/data/User/caches/CachedConfigurations/folder/-285bda86/configuration.json new file mode 100755 index 0000000..64c1350 --- /dev/null +++ b/code-server-config/data/User/caches/CachedConfigurations/folder/-285bda86/configuration.json @@ -0,0 +1 @@ +{"content":{"settings":"{}","tasks":"{}","launch":"{}","mcp":"{}"}} \ No newline at end of file diff --git a/code-server-config/data/User/caches/CachedConfigurations/folder/-5879b260/configuration.json b/code-server-config/data/User/caches/CachedConfigurations/folder/-5879b260/configuration.json new file mode 100755 index 0000000..64c1350 --- /dev/null +++ b/code-server-config/data/User/caches/CachedConfigurations/folder/-5879b260/configuration.json @@ -0,0 +1 @@ +{"content":{"settings":"{}","tasks":"{}","launch":"{}","mcp":"{}"}} \ No newline at end of file diff --git a/code-server-config/data/User/caches/CachedConfigurations/folder/-5c4fcefd/configuration.json b/code-server-config/data/User/caches/CachedConfigurations/folder/-5c4fcefd/configuration.json new file mode 100755 index 0000000..64c1350 --- /dev/null +++ b/code-server-config/data/User/caches/CachedConfigurations/folder/-5c4fcefd/configuration.json @@ -0,0 +1 @@ +{"content":{"settings":"{}","tasks":"{}","launch":"{}","mcp":"{}"}} \ No newline at end of file diff --git a/code-server-config/data/User/caches/CachedConfigurations/folder/3e658ed7/configuration.json b/code-server-config/data/User/caches/CachedConfigurations/folder/3e658ed7/configuration.json new file mode 100755 index 0000000..64c1350 --- /dev/null +++ b/code-server-config/data/User/caches/CachedConfigurations/folder/3e658ed7/configuration.json @@ -0,0 +1 @@ +{"content":{"settings":"{}","tasks":"{}","launch":"{}","mcp":"{}"}} \ No newline at end of file diff --git a/code-server-config/data/User/customBuiltinExtensionsCache.json b/code-server-config/data/User/customBuiltinExtensionsCache.json new file mode 100755 index 0000000..0637a08 --- /dev/null +++ b/code-server-config/data/User/customBuiltinExtensionsCache.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/code-server-config/data/User/machineid b/code-server-config/data/User/machineid new file mode 100755 index 0000000..9d4c856 --- /dev/null +++ b/code-server-config/data/User/machineid @@ -0,0 +1 @@ +928b99e8-70e9-40fe-b135-2be4457f113f \ No newline at end of file diff --git a/code-server-config/data/User/settings.json b/code-server-config/data/User/settings.json new file mode 100755 index 0000000..b1ed5d4 --- /dev/null +++ b/code-server-config/data/User/settings.json @@ -0,0 +1,3 @@ +{ + "keyboard.layout": "0000040E" +} \ No newline at end of file diff --git a/code-server-config/data/User/systemExtensionsCache.json b/code-server-config/data/User/systemExtensionsCache.json new file mode 100755 index 0000000..0637a08 --- /dev/null +++ b/code-server-config/data/User/systemExtensionsCache.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/2fe3f8f1-90c9-4db0-8659-7ddaaa21ab7c/state.json b/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/2fe3f8f1-90c9-4db0-8659-7ddaaa21ab7c/state.json new file mode 100755 index 0000000..7e77f50 --- /dev/null +++ b/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/2fe3f8f1-90c9-4db0-8659-7ddaaa21ab7c/state.json @@ -0,0 +1 @@ +{"version":2,"initialFileContents":[],"timeline":{"checkpoints":[{"checkpointId":"2476b0e5-bd9f-43c7-a353-87a142effbeb","epoch":0,"label":"Initial State","description":"Starting point before any edits"}],"currentEpoch":1,"fileBaselines":[],"operations":[],"epochCounter":1},"recentSnapshot":{"entries":[]}} \ No newline at end of file diff --git a/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/508a716e-f283-436b-b9c7-f68336e877d2/state.json b/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/508a716e-f283-436b-b9c7-f68336e877d2/state.json new file mode 100755 index 0000000..1562217 --- /dev/null +++ b/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/508a716e-f283-436b-b9c7-f68336e877d2/state.json @@ -0,0 +1 @@ +{"version":2,"initialFileContents":[],"timeline":{"checkpoints":[{"checkpointId":"735b875e-acbc-43af-8bd8-40b3e0aeef99","epoch":0,"label":"Initial State","description":"Starting point before any edits"}],"currentEpoch":1,"fileBaselines":[],"operations":[],"epochCounter":1},"recentSnapshot":{"entries":[]}} \ No newline at end of file diff --git a/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/98c877cb-9c52-4901-988e-890d63101faf/state.json b/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/98c877cb-9c52-4901-988e-890d63101faf/state.json new file mode 100755 index 0000000..28a1834 --- /dev/null +++ b/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/98c877cb-9c52-4901-988e-890d63101faf/state.json @@ -0,0 +1 @@ +{"version":2,"initialFileContents":[],"timeline":{"checkpoints":[{"checkpointId":"cf80df56-9aa7-42c2-bf41-32a9267bae0a","epoch":0,"label":"Initial State","description":"Starting point before any edits"}],"currentEpoch":1,"fileBaselines":[],"operations":[],"epochCounter":1},"recentSnapshot":{"entries":[]}} \ No newline at end of file diff --git a/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/d21d60af-afdf-4015-ac22-8468113828ba/state.json b/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/d21d60af-afdf-4015-ac22-8468113828ba/state.json new file mode 100755 index 0000000..4109398 --- /dev/null +++ b/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/d21d60af-afdf-4015-ac22-8468113828ba/state.json @@ -0,0 +1 @@ +{"version":2,"initialFileContents":[],"timeline":{"checkpoints":[{"checkpointId":"fb90223f-d768-49ac-b71a-9f0787a256f8","epoch":0,"label":"Initial State","description":"Starting point before any edits"}],"currentEpoch":1,"fileBaselines":[],"operations":[],"epochCounter":1},"recentSnapshot":{"entries":[]}} \ No newline at end of file diff --git a/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/daa34a05-12c3-4f1d-b7c1-6dbcf59e3426/state.json b/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/daa34a05-12c3-4f1d-b7c1-6dbcf59e3426/state.json new file mode 100755 index 0000000..4c6e47c --- /dev/null +++ b/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/daa34a05-12c3-4f1d-b7c1-6dbcf59e3426/state.json @@ -0,0 +1 @@ +{"version":2,"initialFileContents":[],"timeline":{"checkpoints":[{"checkpointId":"7ba58696-2131-4e2f-b332-decd8bd7902e","epoch":0,"label":"Initial State","description":"Starting point before any edits"}],"currentEpoch":1,"fileBaselines":[],"operations":[],"epochCounter":1},"recentSnapshot":{"entries":[]}} \ No newline at end of file diff --git a/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/db5da8e2-e0b3-43bd-a73f-59c06d1367d1/state.json b/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/db5da8e2-e0b3-43bd-a73f-59c06d1367d1/state.json new file mode 100755 index 0000000..f6043c3 --- /dev/null +++ b/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/db5da8e2-e0b3-43bd-a73f-59c06d1367d1/state.json @@ -0,0 +1 @@ +{"version":2,"initialFileContents":[],"timeline":{"checkpoints":[{"checkpointId":"0321fd0c-6927-486d-88ef-893e624a53cf","epoch":0,"label":"Initial State","description":"Starting point before any edits"}],"currentEpoch":1,"fileBaselines":[],"operations":[],"epochCounter":1},"recentSnapshot":{"entries":[]}} \ No newline at end of file diff --git a/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/df31879f-7816-4000-922a-1ae16dfa748e/state.json b/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/df31879f-7816-4000-922a-1ae16dfa748e/state.json new file mode 100755 index 0000000..4bb413f --- /dev/null +++ b/code-server-config/data/User/workspaceStorage/-54297bf2/chatEditingSessions/df31879f-7816-4000-922a-1ae16dfa748e/state.json @@ -0,0 +1 @@ +{"version":2,"initialFileContents":[],"timeline":{"checkpoints":[{"checkpointId":"08a5290f-ecb0-4ae1-a93e-1a868942eb2b","epoch":0,"label":"Initial State","description":"Starting point before any edits"}],"currentEpoch":1,"fileBaselines":[],"operations":[],"epochCounter":1},"recentSnapshot":{"entries":[]}} \ No newline at end of file diff --git a/code-server-config/data/User/workspaceStorage/-54297bf2/chatSessions/508a716e-f283-436b-b9c7-f68336e877d2.json b/code-server-config/data/User/workspaceStorage/-54297bf2/chatSessions/508a716e-f283-436b-b9c7-f68336e877d2.json new file mode 100755 index 0000000..5f12f35 --- /dev/null +++ b/code-server-config/data/User/workspaceStorage/-54297bf2/chatSessions/508a716e-f283-436b-b9c7-f68336e877d2.json @@ -0,0 +1,33 @@ +{ + "version": 3, + "responderUsername": "", + "initialLocation": "panel", + "requests": [], + "sessionId": "508a716e-f283-436b-b9c7-f68336e877d2", + "creationDate": 1768866360085, + "lastMessageDate": 1768866360085, + "hasPendingEdits": false, + "inputState": { + "contrib": { + "chatDynamicVariableModel": [] + }, + "attachments": [], + "mode": { + "id": "agent", + "kind": "agent" + }, + "inputText": "", + "selections": [ + { + "startLineNumber": 1, + "startColumn": 1, + "endLineNumber": 1, + "endColumn": 1, + "selectionStartLineNumber": 1, + "selectionStartColumn": 1, + "positionLineNumber": 1, + "positionColumn": 1 + } + ] + } +} \ No newline at end of file diff --git a/code-server-config/data/User/workspaceStorage/-54297bf2/chatSessions/d21d60af-afdf-4015-ac22-8468113828ba.json b/code-server-config/data/User/workspaceStorage/-54297bf2/chatSessions/d21d60af-afdf-4015-ac22-8468113828ba.json new file mode 100755 index 0000000..4e510e8 --- /dev/null +++ b/code-server-config/data/User/workspaceStorage/-54297bf2/chatSessions/d21d60af-afdf-4015-ac22-8468113828ba.json @@ -0,0 +1,33 @@ +{ + "version": 3, + "responderUsername": "", + "initialLocation": "panel", + "requests": [], + "sessionId": "d21d60af-afdf-4015-ac22-8468113828ba", + "creationDate": 1769019639897, + "lastMessageDate": 1769019639897, + "hasPendingEdits": false, + "inputState": { + "contrib": { + "chatDynamicVariableModel": [] + }, + "attachments": [], + "mode": { + "id": "ask", + "kind": "ask" + }, + "inputText": "", + "selections": [ + { + "startLineNumber": 1, + "startColumn": 1, + "endLineNumber": 1, + "endColumn": 1, + "selectionStartLineNumber": 1, + "selectionStartColumn": 1, + "positionLineNumber": 1, + "positionColumn": 1 + } + ] + } +} \ No newline at end of file diff --git a/code-server-config/data/User/workspaceStorage/-54297bf2/chatSessions/daa34a05-12c3-4f1d-b7c1-6dbcf59e3426.json b/code-server-config/data/User/workspaceStorage/-54297bf2/chatSessions/daa34a05-12c3-4f1d-b7c1-6dbcf59e3426.json new file mode 100755 index 0000000..35c5bc9 --- /dev/null +++ b/code-server-config/data/User/workspaceStorage/-54297bf2/chatSessions/daa34a05-12c3-4f1d-b7c1-6dbcf59e3426.json @@ -0,0 +1,33 @@ +{ + "version": 3, + "responderUsername": "", + "initialLocation": "panel", + "requests": [], + "sessionId": "daa34a05-12c3-4f1d-b7c1-6dbcf59e3426", + "creationDate": 1768925284502, + "lastMessageDate": 1768925284502, + "hasPendingEdits": false, + "inputState": { + "contrib": { + "chatDynamicVariableModel": [] + }, + "attachments": [], + "mode": { + "id": "agent", + "kind": "agent" + }, + "inputText": "", + "selections": [ + { + "startLineNumber": 1, + "startColumn": 1, + "endLineNumber": 1, + "endColumn": 1, + "selectionStartLineNumber": 1, + "selectionStartColumn": 1, + "positionLineNumber": 1, + "positionColumn": 1 + } + ] + } +} \ No newline at end of file diff --git a/code-server-config/data/User/workspaceStorage/-54297bf2/chatSessions/df31879f-7816-4000-922a-1ae16dfa748e.json b/code-server-config/data/User/workspaceStorage/-54297bf2/chatSessions/df31879f-7816-4000-922a-1ae16dfa748e.json new file mode 100755 index 0000000..bd61868 --- /dev/null +++ b/code-server-config/data/User/workspaceStorage/-54297bf2/chatSessions/df31879f-7816-4000-922a-1ae16dfa748e.json @@ -0,0 +1,33 @@ +{ + "version": 3, + "responderUsername": "", + "initialLocation": "panel", + "requests": [], + "sessionId": "df31879f-7816-4000-922a-1ae16dfa748e", + "creationDate": 1769105550754, + "lastMessageDate": 1769105550754, + "hasPendingEdits": false, + "inputState": { + "contrib": { + "chatDynamicVariableModel": [] + }, + "attachments": [], + "mode": { + "id": "ask", + "kind": "ask" + }, + "inputText": "", + "selections": [ + { + "startLineNumber": 1, + "startColumn": 1, + "endLineNumber": 1, + "endColumn": 1, + "selectionStartLineNumber": 1, + "selectionStartColumn": 1, + "positionLineNumber": 1, + "positionColumn": 1 + } + ] + } +} \ No newline at end of file diff --git a/code-server-config/data/User/workspaceStorage/-54297bf2/vscode.lock b/code-server-config/data/User/workspaceStorage/-54297bf2/vscode.lock new file mode 100755 index 0000000..e14a7fb --- /dev/null +++ b/code-server-config/data/User/workspaceStorage/-54297bf2/vscode.lock @@ -0,0 +1 @@ +{"pid":196294,"willReleaseAt":0} \ No newline at end of file diff --git a/code-server-config/data/User/workspaceStorage/-63ce429/chatEditingSessions/a91fca11-9919-49b2-9aab-55a4263a881f/state.json b/code-server-config/data/User/workspaceStorage/-63ce429/chatEditingSessions/a91fca11-9919-49b2-9aab-55a4263a881f/state.json new file mode 100755 index 0000000..f4251e7 --- /dev/null +++ b/code-server-config/data/User/workspaceStorage/-63ce429/chatEditingSessions/a91fca11-9919-49b2-9aab-55a4263a881f/state.json @@ -0,0 +1 @@ +{"version":2,"initialFileContents":[],"timeline":{"checkpoints":[{"checkpointId":"20a3c181-93c5-41d7-bb3e-4f08b352c185","epoch":0,"label":"Initial State","description":"Starting point before any edits"}],"currentEpoch":1,"fileBaselines":[],"operations":[],"epochCounter":1},"recentSnapshot":{"entries":[]}} \ No newline at end of file diff --git a/code-server-config/data/User/workspaceStorage/-63ce429/chatSessions/a91fca11-9919-49b2-9aab-55a4263a881f.json b/code-server-config/data/User/workspaceStorage/-63ce429/chatSessions/a91fca11-9919-49b2-9aab-55a4263a881f.json new file mode 100755 index 0000000..5f0245f --- /dev/null +++ b/code-server-config/data/User/workspaceStorage/-63ce429/chatSessions/a91fca11-9919-49b2-9aab-55a4263a881f.json @@ -0,0 +1,33 @@ +{ + "version": 3, + "responderUsername": "", + "initialLocation": "panel", + "requests": [], + "sessionId": "a91fca11-9919-49b2-9aab-55a4263a881f", + "creationDate": 1768866036243, + "lastMessageDate": 1768866036243, + "hasPendingEdits": false, + "inputState": { + "contrib": { + "chatDynamicVariableModel": [] + }, + "attachments": [], + "mode": { + "id": "agent", + "kind": "agent" + }, + "inputText": "", + "selections": [ + { + "startLineNumber": 1, + "startColumn": 1, + "endLineNumber": 1, + "endColumn": 1, + "selectionStartLineNumber": 1, + "selectionStartColumn": 1, + "positionLineNumber": 1, + "positionColumn": 1 + } + ] + } +} \ No newline at end of file diff --git a/code-server-config/data/User/workspaceStorage/64cc123a/chatEditingSessions/ff708a20-4b56-4c2d-8af1-bf0a107df673/state.json b/code-server-config/data/User/workspaceStorage/64cc123a/chatEditingSessions/ff708a20-4b56-4c2d-8af1-bf0a107df673/state.json new file mode 100755 index 0000000..3b5218a --- /dev/null +++ b/code-server-config/data/User/workspaceStorage/64cc123a/chatEditingSessions/ff708a20-4b56-4c2d-8af1-bf0a107df673/state.json @@ -0,0 +1 @@ +{"version":2,"initialFileContents":[],"timeline":{"checkpoints":[{"checkpointId":"c3649f0b-7e7c-4fe7-ace1-c43230ba7099","epoch":0,"label":"Initial State","description":"Starting point before any edits"}],"currentEpoch":1,"fileBaselines":[],"operations":[],"epochCounter":1},"recentSnapshot":{"entries":[]}} \ No newline at end of file diff --git a/code-server-config/data/User/workspaceStorage/64cc123a/chatSessions/ff708a20-4b56-4c2d-8af1-bf0a107df673.json b/code-server-config/data/User/workspaceStorage/64cc123a/chatSessions/ff708a20-4b56-4c2d-8af1-bf0a107df673.json new file mode 100755 index 0000000..b28d4e2 --- /dev/null +++ b/code-server-config/data/User/workspaceStorage/64cc123a/chatSessions/ff708a20-4b56-4c2d-8af1-bf0a107df673.json @@ -0,0 +1,33 @@ +{ + "version": 3, + "responderUsername": "", + "initialLocation": "panel", + "requests": [], + "sessionId": "ff708a20-4b56-4c2d-8af1-bf0a107df673", + "creationDate": 1768865975339, + "lastMessageDate": 1768865975339, + "hasPendingEdits": false, + "inputState": { + "contrib": { + "chatDynamicVariableModel": [] + }, + "attachments": [], + "mode": { + "id": "agent", + "kind": "agent" + }, + "inputText": "", + "selections": [ + { + "startLineNumber": 1, + "startColumn": 1, + "endLineNumber": 1, + "endColumn": 1, + "selectionStartLineNumber": 1, + "selectionStartColumn": 1, + "positionLineNumber": 1, + "positionColumn": 1 + } + ] + } +} \ No newline at end of file diff --git a/code-server-config/data/User/workspaceStorage/64cc123a/meta.json b/code-server-config/data/User/workspaceStorage/64cc123a/meta.json new file mode 100755 index 0000000..93be8ca --- /dev/null +++ b/code-server-config/data/User/workspaceStorage/64cc123a/meta.json @@ -0,0 +1,4 @@ +{ + "id": "64cc123a", + "name": "workspace" +} \ No newline at end of file diff --git a/code-server-config/data/User/workspaceStorage/64cc123a/vscode.lock b/code-server-config/data/User/workspaceStorage/64cc123a/vscode.lock new file mode 100755 index 0000000..833bd4d --- /dev/null +++ b/code-server-config/data/User/workspaceStorage/64cc123a/vscode.lock @@ -0,0 +1 @@ +{"pid":1122,"willReleaseAt":0} \ No newline at end of file diff --git a/code-server-config/data/User/workspaceStorage/787b6db1/chatEditingSessions/d5306add-574b-4ca9-80a2-e738a2954019/state.json b/code-server-config/data/User/workspaceStorage/787b6db1/chatEditingSessions/d5306add-574b-4ca9-80a2-e738a2954019/state.json new file mode 100755 index 0000000..fbc7cda --- /dev/null +++ b/code-server-config/data/User/workspaceStorage/787b6db1/chatEditingSessions/d5306add-574b-4ca9-80a2-e738a2954019/state.json @@ -0,0 +1 @@ +{"version":2,"initialFileContents":[],"timeline":{"checkpoints":[{"checkpointId":"054cba8c-e3bd-4f98-ad33-b143a57a64e7","epoch":0,"label":"Initial State","description":"Starting point before any edits"}],"currentEpoch":1,"fileBaselines":[],"operations":[],"epochCounter":1},"recentSnapshot":{"entries":[]}} \ No newline at end of file diff --git a/code-server-config/data/User/workspaceStorage/787b6db1/chatSessions/d5306add-574b-4ca9-80a2-e738a2954019.json b/code-server-config/data/User/workspaceStorage/787b6db1/chatSessions/d5306add-574b-4ca9-80a2-e738a2954019.json new file mode 100755 index 0000000..9741288 --- /dev/null +++ b/code-server-config/data/User/workspaceStorage/787b6db1/chatSessions/d5306add-574b-4ca9-80a2-e738a2954019.json @@ -0,0 +1,33 @@ +{ + "version": 3, + "responderUsername": "", + "initialLocation": "panel", + "requests": [], + "sessionId": "d5306add-574b-4ca9-80a2-e738a2954019", + "creationDate": 1768891463711, + "lastMessageDate": 1768891463711, + "hasPendingEdits": false, + "inputState": { + "contrib": { + "chatDynamicVariableModel": [] + }, + "attachments": [], + "mode": { + "id": "agent", + "kind": "agent" + }, + "inputText": "", + "selections": [ + { + "startLineNumber": 1, + "startColumn": 1, + "endLineNumber": 1, + "endColumn": 1, + "selectionStartLineNumber": 1, + "selectionStartColumn": 1, + "positionLineNumber": 1, + "positionColumn": 1 + } + ] + } +} \ No newline at end of file diff --git a/code-server-config/data/User/workspaceStorage/787b6db1/meta.json b/code-server-config/data/User/workspaceStorage/787b6db1/meta.json new file mode 100755 index 0000000..d9a7360 --- /dev/null +++ b/code-server-config/data/User/workspaceStorage/787b6db1/meta.json @@ -0,0 +1,4 @@ +{ + "id": "787b6db1", + "name": "project" +} \ No newline at end of file diff --git a/code-server-config/data/coder.json b/code-server-config/data/coder.json new file mode 100755 index 0000000..f954fbd --- /dev/null +++ b/code-server-config/data/coder.json @@ -0,0 +1,9 @@ +{ + "query": { + "folder": "/home/coder/project" + }, + "update": { + "checked": 1769085519465, + "version": "4.108.1" + } +} \ No newline at end of file diff --git a/code-server-config/extensions/extensions.json b/code-server-config/extensions/extensions.json new file mode 100755 index 0000000..0637a08 --- /dev/null +++ b/code-server-config/extensions/extensions.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100755 index 0000000..bc2eb7d --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,239 @@ +# /opt/docker/dev/service_finder/docker-compose.yml +services: + # --- ADATBÁZIS ÉS API --- + migrate: + build: ./backend + container_name: sf_migrate + env_file: .env + volumes: + - ./backend:/app + - /opt/docker/scripts:/opt/docker/scripts + command: > + bash -c "sleep 5 && alembic upgrade head && PYTHONPATH=/app python -m app.tests_internal.fixes.final_admin_fix" + networks: + - sf_net + - shared_db_net + restart: "no" + + api: + build: ./backend + container_name: sf_api + env_file: .env + ports: + - "8000:8000" + volumes: + - ./backend:/app + - /mnt/nas/app_data:/mnt/nas/app_data + - ./static_previews:/app/static/previews + depends_on: + migrate: + condition: service_completed_successfully + networks: + - sf_net + - shared_db_net + restart: unless-stopped + + # --- SZERVIZ HADOSZTÁLY --- + service_scout: + build: ./backend + container_name: sf_service_scout + command: python -u -m app.workers.service.service_robot_1_scout_osm + env_file: .env + depends_on: + migrate: + condition: service_completed_successfully + networks: + - sf_net + - shared_db_net + restart: unless-stopped + + service_hunter: + build: ./backend + container_name: sf_service_hunter + command: python -u -m app.workers.service.service_robot_0_hunter + env_file: .env + depends_on: + migrate: + condition: service_completed_successfully + networks: + - sf_net + - shared_db_net + restart: unless-stopped + # profiles: ["disabled"] # Ezzel a sorral letilthatod, hogy automatikusan elinduljon! + + service_researcher: + build: ./backend + command: python -u -m app.workers.service.service_robot_2_researcher + deploy: + replicas: 2 + env_file: .env + depends_on: + migrate: + condition: service_completed_successfully + networks: + - sf_net + - shared_db_net + restart: unless-stopped + + service_enricher: + build: ./backend + container_name: sf_service_enricher + command: python -u -m app.workers.service.service_robot_3_enricher + env_file: .env + depends_on: + migrate: + condition: service_completed_successfully + networks: + - sf_net + - shared_db_net + restart: unless-stopped + + service_validator: + build: ./backend + container_name: sf_service_validator + command: python -u -m app.workers.service.service_robot_4_validator_google + env_file: .env + depends_on: + migrate: + condition: service_completed_successfully + networks: + - sf_net + - shared_db_net + restart: unless-stopped + + # --- JÁRMŰ HADOSZTÁLY --- + vehicle_discovery: + build: ./backend + container_name: sf_vehicle_discovery + command: python -u -m app.workers.vehicle.vehicle_robot_0_discovery_engine + env_file: .env + depends_on: + migrate: + condition: service_completed_successfully + networks: + - sf_net + - shared_db_net + restart: unless-stopped + + vehicle_hunter: + build: ./backend + container_name: sf_vehicle_hunter + command: python -u -m app.workers.vehicle.vehicle_robot_1_catalog_hunter + env_file: .env + depends_on: + migrate: + condition: service_completed_successfully + networks: + - sf_net + - shared_db_net + restart: unless-stopped + + vehicle_researcher: + build: ./backend + # container_name: sf_vehicle_researcher + command: python -u -m app.workers.vehicle.vehicle_robot_2_researcher + deploy: + replicas: 2 + env_file: .env + depends_on: + migrate: + condition: service_completed_successfully + networks: + - sf_net + - shared_db_net + restart: unless-stopped + + vehicle_alchemist: + build: ./backend + container_name: sf_vehicle_alchemist + command: python -u -m app.workers.vehicle.vehicle_robot_3_alchemist_pro + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: 1 + capabilities: [gpu] + env_file: .env + depends_on: + migrate: + condition: service_completed_successfully + networks: + - sf_net + - shared_db_net + restart: unless-stopped + + vehicle_vin_auditor: + build: ./backend + container_name: sf_vehicle_vin_auditor + command: python -u -m app.workers.vehicle.vehicle_robot_4_vin_auditor + env_file: .env + depends_on: + migrate: + condition: service_completed_successfully + networks: + - sf_net + - shared_db_net + restart: unless-stopped + + # --- GB (ANGOL) JÁRMŰ HADOSZTÁLY --- + gb_vehicle_discovery: + build: ./backend + container_name: sf_gb_vehicle_discovery + command: python -u -m app.workers.vehicle.vehicle_robot_0_gb_discovery + env_file: .env + depends_on: + migrate: + condition: service_completed_successfully + networks: + - sf_net + - shared_db_net + restart: unless-stopped + + gb_vehicle_hunter: + build: ./backend + container_name: sf_gb_vehicle_hunter + command: python -u -m app.workers.vehicle.vehicle_robot_1_gb_hunter + env_file: .env + depends_on: + migrate: + condition: service_completed_successfully + networks: + - sf_net + - shared_db_net + restart: unless-stopped + + # --- RENDSZER HADOSZTÁLY --- + system_ocr: + build: ./backend + container_name: sf_system_ocr + command: python -u -m app.workers.ocr.robot_1_ocr_processor + env_file: .env + depends_on: + migrate: + condition: service_completed_successfully + networks: + - sf_net + - shared_db_net + volumes: + - /mnt/nas/app_data:/mnt/nas/app_data + restart: unless-stopped + + system_auditor: + build: ./backend + container_name: sf_system_auditor + command: python -u -m app.workers.system.system_robot_2_service_auditor + env_file: .env + depends_on: + migrate: + condition: service_completed_successfully + networks: + - sf_net + - shared_db_net + restart: unless-stopped + +networks: + sf_net: + driver: bridge + shared_db_net: + external: true \ No newline at end of file diff --git a/docker-compose_1.9.9.yml.old b/docker-compose_1.9.9.yml.old new file mode 100755 index 0000000..1e827ea --- /dev/null +++ b/docker-compose_1.9.9.yml.old @@ -0,0 +1,239 @@ +services: + # 1. ADATBÁZIS MIGRÁCIÓ (Alembic) + migrate: + build: + context: ./backend + dockerfile: Dockerfile + container_name: service_finder_migrate + env_file: .env + volumes: + - ./backend:/app + environment: + - PYTHONPATH=/app + command: > + bash -c "alembic upgrade head" + networks: + - default + - shared_db_net + restart: "no" + + # 2. BACKEND API (FastAPI) + service_finder_api: + build: + context: ./backend + dockerfile: Dockerfile + container_name: service_finder_api + env_file: .env + ports: + - "8000:8000" + volumes: + - ./backend:/app + - /mnt/nas/app_data:/mnt/nas/app_data + - ./static_previews:/app/static/previews + environment: + - PYTHONPATH=/app + depends_on: + migrate: + condition: service_completed_successfully + minio: + condition: service_started + redis: + condition: service_started + networks: + - default + - shared_db_net + restart: unless-stopped + + # 3. MINIO (Object Storage) + minio: + image: minio/minio + container_name: service_finder_minio + env_file: .env + command: server /data --console-address ":9001" + volumes: + - /mnt/nas/app_data/minio_data:/data + networks: + - default + restart: unless-stopped + + # 4. REDIS (Cache & Queue) + redis: + image: redis:alpine + container_name: service_finder_redis + volumes: + - /mnt/nas/app_data/redis_data:/data + networks: + - default + restart: unless-stopped + + # 5. FRONTEND + service_frontend: + build: + context: ./frontend + container_name: service_finder_frontend + env_file: .env + ports: + - "3001:80" + networks: + - default + depends_on: + service_finder_api: + condition: service_started + restart: unless-stopped + + # 6. KATALÓGUS ROBOT (Discovery) + catalog_robot: + build: ./backend + command: python -u -m app.workers.catalog_robot + deploy: + replicas: 1 + volumes: + - ./backend:/app + env_file: .env + depends_on: + migrate: + condition: service_completed_successfully + networks: + - default + - shared_db_net + restart: always + + # 7. SERVICE HUNTER (Web Scraping) + service_hunter: + build: ./backend + container_name: service_finder_robot_hunter + command: python -u -m app.workers.service_hunter + volumes: + - ./backend:/app + env_file: .env + depends_on: + migrate: + condition: service_completed_successfully + networks: + - default + - shared_db_net + restart: always + + # 8. n8n AUTOMATIZÁCIÓ + n8n: + image: n8nio/n8n:latest + container_name: service_finder_n8n + restart: unless-stopped + ports: + - "5678:5678" + env_file: .env + volumes: + - ./n8n/data:/home/node/.n8n + networks: + - default + - shared_db_net + depends_on: + - n8n_db + + n8n_db: + image: postgres:15-alpine + container_name: service_finder_n8n_db + restart: unless-stopped + env_file: .env + volumes: + - ./n8n/db_data:/var/lib/postgresql/data + networks: + - default + + # 9. BROWSERLESS + browserless: + image: browserless/chrome:latest + container_name: service_finder_browserless + restart: unless-stopped + ports: + - "3005:3000" + networks: + - default + + # 10. ROBOT 2.1 - RESEARCHER (Porszívó - Hálózati kutató) + # Mivel I/O bound (netre vár), futtathatjuk több példányban (pl. 3 szálon) + robot_researcher: + build: ./backend + command: python -u -m app.workers.researcher_v2_1 + deploy: + replicas: 3 + volumes: + - ./backend:/app + env_file: .env + depends_on: + migrate: + condition: service_completed_successfully + networks: + - default + - shared_db_net + restart: always + + # 11. ROBOT 2.2 - ALCHEMIST (Vegyész - GPU AI dúsító) + # Ez használja a GPU-t, ebből általában 1 példány elég a VRAM miatt + robot_alchemist: + build: ./backend + command: python -u -m app.workers.alchemist_v2_2 + deploy: + replicas: 1 + resources: + reservations: + devices: + - driver: nvidia + count: 1 + capabilities: [gpu] + volumes: + - ./backend:/app + env_file: .env + depends_on: + migrate: + condition: service_completed_successfully + ollama: + condition: service_started + networks: + - default + - shared_db_net + restart: always + + # 12. AI a szerveren :) + ollama: + image: ollama/ollama:latest + container_name: service_finder_ollama + restart: always + volumes: + - ./ollama_data:/root/.ollama + ports: + - "11434:11434" + environment: + - OLLAMA_KEEP_ALIVE=24h + - OLLAMA_ORIGINS="*" + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: 1 + capabilities: [gpu] + networks: + - default + - shared_db_net + + # 13. VIN AUDITOR + vin_auditor: + build: ./backend + container_name: service_finder_vin_auditor + command: python -u -m app.workers.vin_auditor + restart: always + env_file: .env + depends_on: + ollama: + condition: service_started + networks: + - default + - shared_db_net + + +networks: + default: + driver: bridge + shared_db_net: + external: true \ No newline at end of file diff --git a/docker-compose_sentinel.yml.old b/docker-compose_sentinel.yml.old new file mode 100755 index 0000000..a41680b --- /dev/null +++ b/docker-compose_sentinel.yml.old @@ -0,0 +1,144 @@ +# /opt/docker/dev/service_finder/docker-compose.yml +services: + # --- ADATBÁZIS KEZELÉS --- + migrate: + build: ./backend + container_name: sentinel_migrate + env_file: .env + volumes: + - ./backend:/app + command: > + bash -c "sleep 5 && alembic upgrade head && python -m app.final_admin_fix" + networks: + - sentinel_net + - shared_db_net + restart: "no" + + # --- KÖZPONTI API --- + api: + build: ./backend + container_name: sentinel_api + env_file: .env + ports: + - "8000:8000" + volumes: + - ./backend:/app + - /mnt/nas/app_data:/mnt/nas/app_data + - ./static_previews:/app/static/previews + depends_on: + migrate: { condition: service_completed_successfully } + redis: { condition: service_started } + networks: + - sentinel_net + - shared_db_net + restart: unless-stopped + + # --- SZERVIZ HADOSZTÁLY (Service Robots) --- + + # Robot 1: Felfedező (OSM & Hunt) + service_scout: + build: ./backend + container_name: sentinel_service_scout + command: python -u -m app.workers.service.service_robot_1_scout_osm + env_file: .env + depends_on: + api: { condition: service_started } + networks: + - sentinel_net + - shared_db_net + + # Robot 2: Kutató (Adat pontosító - több példányban) + service_researcher: + build: ./backend + container_name: sentinel_service_researcher + command: python -u -m app.workers.service.service_robot_2_researcher + deploy: + replicas: 2 + env_file: .env + networks: + - sentinel_net + - shared_db_net + + # Robot 3: Szakértő (AI dúsító - ExpertiseTags) + service_enricher: + build: ./backend + container_name: sentinel_service_enricher + command: python -u -m app.workers.service.service_robot_3_enricher + env_file: .env + networks: + - sentinel_net + - shared_db_net + + # --- JÁRMŰ HADOSZTÁLY (Vehicle Robots) --- + + # Robot 2: Alkimista (Technikai pontosítás - GPU igényes) + vehicle_alchemist: + build: ./backend + container_name: sentinel_vehicle_alchemist + command: python -u -m app.workers.vehicle.vehicle_robot_2_spec_fix + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: 1 + capabilities: [gpu] + env_file: .env + depends_on: + ollama: { condition: service_started } + networks: + - sentinel_net + - shared_db_net + + # --- RENDSZER HADOSZTÁLY (System Robots) --- + + # Robot 1: Dokumentum feldolgozó (OCR) + system_ocr: + build: ./backend + container_name: sentinel_system_ocr + command: python -u -m app.workers.system.robot_1_ocr_processor + env_file: .env + networks: + - sentinel_net + volumes: + - /mnt/nas/app_data:/mnt/nas/app_data + + # --- AI MAG & INFRA --- + ollama: + image: ollama/ollama:latest + container_name: sentinel_ollama + volumes: + - ./ollama_data:/root/.ollama + ports: + - "11434:11434" + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: 1 + capabilities: [gpu] + networks: + - sentinel_net + + redis: + image: redis:alpine + container_name: sentinel_redis + networks: + - sentinel_net + + minio: + image: minio/minio + container_name: sentinel_minio + env_file: .env + command: server /data --console-address ":9001" + volumes: + - /mnt/nas/app_data/minio_data:/data + networks: + - sentinel_net + +networks: + sentinel_net: + driver: bridge + shared_db_net: + external: true \ No newline at end of file diff --git a/docs/V02/000_Fejlesztendő_pontok.md b/docs/V02/000_Fejlesztendő_pontok.md new file mode 100755 index 0000000..27fd1c4 --- /dev/null +++ b/docs/V02/000_Fejlesztendő_pontok.md @@ -0,0 +1,222 @@ +Íme a hiányzó láncszemek, amiket ki kell dolgoznunk: + +🔗 1. Ajánlatkérés és Időpontfoglalás (Booking & Quoting Flow) +A V01-ben: A 01-es dokumentum említi: "Marketplace: Szervizkereső, Ajánlatkérés, Időpontfoglalás." + +A Hiány: Az adatbázisban van service_profiles, branches, sőt pending_actions is, de nincs dedikált tábla/logika a foglalásokra és árajánlatokra. + +Amit meg kell írni: Hogyan kér a User ajánlatot? (Kiválasztja az autóját a garázsból -> leírja a hibát -> a rendszer kiküldi a 10 km-en belüli megfelelő expertise_tags-el rendelkező szervizeknek -> a szerviz ajánlatot ad -> User elfogadja -> bekerül az asset_events-be, mint jövőbeli esemény). + +🔗 2. Költség-taxonómia és "Munkába járás" (TCO & Accounting) +A V01-ben: TCO (Total Cost of Ownership) számítás szerepel a PREMIUM csomagnál. Említetted a munkába járás elszámolását is. + +A Hiány: A data.asset_costs tábla létezik, de nincs definiálva a szigorú Költségkategória fa (üzemanyag, javítás, autópálya-matrica, biztosítás, értékcsökkenés). + +Amit meg kell írni: Fix kategória ID-k definiálása a frontend drop-down menüjéhez, illetve a Munkába járás modul logikája (Otthon-Munkahely távolság x Munkanapok száma x Állami/NAV norma = Havi adómentes térítés kalkulációja a B2B flottáknak). + +🔗 3. Az "Evidence Store" és az OCR Robot (Robot 3) Folyamata +A V01-ben: A 22-es fájl említi a Robot 3-at (OCR & Document AI), ami feldolgozza a számlákat. + +A Hiány: Nincs technikai leírás arról, hogyan lesz a MinIO-ba feltöltött fotóból hitelesített szervizbejegyzés. + +Amit meg kell írni: A fotó feltöltésre kerül a documents táblába -> A Robot 3 (Gemini 2.0 Multimodal) kiolvassa a dátumot, összeget, km-órát és szerviz nevét -> Létrehoz egy asset_events rekordot unverified státusszal -> Összeköti a számlán lévő szervizt a service_profiles táblával -> Megadja a Gamification pontokat a Usernek. + +🔗 4. B2B Flotta Szerepkörök (Organization Members Logika) +A V01-ben: A "Mindenki flottatulajdonos" elv megvan (Privát vs Céges flotta). + +A Hiány: A data.organization_members táblád létezik, de nincsenek definiálva a Flottán belüli szerepkörök. + +Amit meg kell írni: Ki mit láthat egy cégen belül? + +Fleet Manager (Admin): Látja az összes autót, minden költséget, ő veszi a Krediteket. + +Driver (Sofőr): Csak a rá szignált (asset_assignments) autót látja, tud tankolást (költséget) rögzíteni, de a cég egyenlegéhez nem fér hozzá. + +🔗 5. Telemetria és Futásteljesítmény (Odometer Tracking) +A V01-ben: A data.asset_telemetry tábla bent van az adatbázisban, és a Prediktív naptárhoz (Robot 2.3) kell a km-óra állás. + +A Hiány: Honnan jön a km-óra állás, ha nincs OBD2 hardver bedugva az autóba? + +Amit meg kell írni: Az "Okos becslés" (Smart Odometer) algoritmusa. Minden tankolásnál (asset_costs) és szerviznél (asset_events) kötelező megadni a km-állást. A rendszer ebből számol egy napi átlagos futást, és ha hetekig nincs új adat, a háttérben "pörgeti" az órát, hogy a Robot 2.3 tudja, mikor kell szólni az olajcsere miatt. + +🚀 FEJLESZTÉSI IRÁNYTŰ ÉS ÜZLETI MODELL (V2.0) + +Ez a dokumentum rögzíti, hogy mit építünk meg azonnal az induláshoz (MVP), és mit hagyunk a skálázódási fázisra. +I. FÁZIS: AZ INDULÓ CSOMAG (MVP - Minimum Viable Product) + +Ezek kellenek ahhoz, hogy a rendszer elinduljon, pénzt termeljen, és napi szinten használják a magánszemélyek és a KKV-k. +1. Onboarding és Garázs (Asset Creation) + +Az első benyomás a legfontosabb. A felhasználó itt adja hozzá a járművét és az adatait. + + FREE (Ingyenes): * Maximum 1 jármű rögzítése. + + Adatok manuális bevitele (Rendszám / VIN alapján keresés a katalógusban). + + Okmányok lejárati dátumának manuális rögzítése. + + PREMIUM: + + Több jármű (pl. 3-5 db) rögzítése. + + Robot 3 "Magic Scan": A forgalmi engedély és a jogosítvány lefotózása -> az AI mindent automatikusan kitölt. + + Dokumentumok titkosított tárolása a MinIO "Privát Széfben" (digitalizált irattárca). + +2. Smart Trip Logger & Munkába járás (A napi horog) + +Ez adja a napi használatot (DAU) és a KKV-k számára a fő értéket. + + FREE: * Kézi Start/Stop gomb az utakhoz (GPS koordináták mentése). + + Alapvető havi statisztika (megtett út km-ben). + + PREMIUM: + + Automata Munkába Járás Riport: A megadott Otthon-Munkahely cím alapján a ledolgozott napokból a hónap végén NAV-kompatibilis, adómentes költségtérítési PDF generálása. + + Adaptív GPS útvonalrögzítés (ahogy korábban átbeszéltük). + + Költségek (TCO) és tankolások kézi rögzítésének analitikája. + +3. Guardian & Gamification (Őrangyal és Játékosítás) + +A bizalomépítés és a proaktív segítség. + + FREE: * Értesítés az okmányok (Jogsi, Forgalmi) lejártáról 30 nappal előtte. + + Alap "Clean History" Badge (ha mindent kitölt). + + PREMIUM: + + Okos Szerviz Naptár: A Robot 2.3 a napi átlag futásból kiszámolja (Predikció), mikor kell olajat cserélni, és időben szól. + + Napi/Heti "Checklist" értesítések (Mérj guminyomást!) -> Sikeres elvégzés esetén XP és Kredit jutalom (Gamification). + +⚙️ A PÉNZÜGYI MOTOR (The Economy Engine) - MVP Követelmény + +Ahogy említetted, az elv megvan (Triple Wallet), de a motort meg kell írni. Ennek a Backendben egy atombiztos, önálló modulként kell futnia (app/services/billing_engine.py). + +A Pénzügyi Motor 3 fő komponense: + + A Stripe Webhook Receiver: * Amikor a User kifizeti a csomagot bankkártyával, a Stripe küld egy jelet a Backendnek (checkout.session.completed). + + A motor ekkor felébred. + + Az Atomi Tranzakció (Double-Entry Ledger): + + A motor nem csak átírja a Wallet egyenlegét, hanem először beír egy sort a data.financial_ledger táblába (Főkönyv): "+5000 HUF befizetés, Stripe_ID_xyz". + + Ezután hozzáadja a Krediteket a wallets.purchased_credits mezőhöz. A két lépés egy adatbázis-tranzakcióban (SQL COMMIT) fut: ha az egyik elszáll, a másik is visszagurul (Rollback). Nincs elveszett pénz. + + A Subscription Cron-Job (Az Éjjeli Őr): + + Egy ütemezett feladat minden éjjel 00:01-kor végignézi a users táblában a subscription_expires_at dátumokat. + + Akinél lejárt a PREMIUM, annak a rendszer automatikusan leveszi a rangját FREE-re, kikapcsolja a PDF generálást, és zárolja a 2. és 3. autóját (Read-only módba teszi). + +II. FÁZIS: POST-LAUNCH (A skálázódás és a Szerviz-Szimbiózis) + +Ezek a funkciók elengedhetetlenek a vízióhoz, de az indulás napján nem kellenek. Akkor kezdjük el fejleszteni őket, amikor már van 1000+ aktív autósunk az adatokkal. +4. Marketplace: Ajánlatkérés és Szervizkereső + + Funkció: A User a Garázsból egy gombnyomással elküldi a hibát (pl. "Fékcsere") a 20 km-es körzetben lévő megbízható szervizeknek. + + PREMIUM előny: A Premium userek ajánlatkérései "VIP" jelzéssel, a lista elején jelennek meg a szervizeknek. + +5. Service Pro Modul (A szerelők felülete) + + Funkció: A szerelő beírja a rendszámot, és a Robot 2.2 által gyűjtött "Arany Adatok" (olajmennyiség, nyomatékok) megjelennek neki (Quick-Scan). + + Kölcsönhatás: A szerelő nálunk rögzíti a munkalapot, ami azonnal bekerül az autó Hitelesített Digitális Szervizkönyvébe. Ezzel az autó "Trust Score"-ja (bizalmi indexe) az egekbe szökik. + +6. Deep Tech: Telemetria és AI Diagnosztika + + Funkció: OBDII csatlakozó integráció a valós km-óra állás és hibakódok (DTC) olvasásához. + + Kísérleti: G-erő mérése telefonnal (Vezetési stílus analitika) és AI Audio Engine (indítási hangból önindító/akku hiba predikciója). Ezt külön "Add-on" csomagként lehet értékesíteni a Flottakezelőknek. + + 🚀 FEJLESZTÉSI IRÁNYTŰ ÉS ÜZLETI MODELL (V2.0) + +Ez a dokumentum rögzíti, hogy mit építünk meg azonnal az induláshoz (MVP), és mit hagyunk a skálázódási fázisra. +I. FÁZIS: AZ INDULÓ CSOMAG (MVP - Minimum Viable Product) + +Ezek kellenek ahhoz, hogy a rendszer elinduljon, pénzt termeljen, és napi szinten használják a magánszemélyek és a KKV-k. +1. Onboarding és Garázs (Asset Creation) + +Az első benyomás a legfontosabb. A felhasználó itt adja hozzá a járművét és az adatait. + + FREE (Ingyenes): * Maximum 1 jármű rögzítése. + + Adatok manuális bevitele (Rendszám / VIN alapján keresés a katalógusban). + + Okmányok lejárati dátumának manuális rögzítése. + + PREMIUM: + + Több jármű (pl. 3-5 db) rögzítése. + + Robot 3 "Magic Scan": A forgalmi engedély és a jogosítvány lefotózása -> az AI mindent automatikusan kitölt. + + Dokumentumok titkosított tárolása a MinIO "Privát Széfben" (digitalizált irattárca). + +2. Smart Trip Logger & Munkába járás (A napi horog) + +Ez adja a napi használatot (DAU) és a KKV-k számára a fő értéket. + + FREE: * Kézi Start/Stop gomb az utakhoz (GPS koordináták mentése). + + Alapvető havi statisztika (megtett út km-ben). + + PREMIUM: + + Automata Munkába Járás Riport: A megadott Otthon-Munkahely cím alapján a ledolgozott napokból a hónap végén NAV-kompatibilis, adómentes költségtérítési PDF generálása. + + Adaptív GPS útvonalrögzítés (ahogy korábban átbeszéltük). + + Költségek (TCO) és tankolások kézi rögzítésének analitikája. + +3. Guardian & Gamification (Őrangyal és Játékosítás) + +A bizalomépítés és a proaktív segítség. + + FREE: * Értesítés az okmányok (Jogsi, Forgalmi) lejártáról 30 nappal előtte. + + Alap "Clean History" Badge (ha mindent kitölt). + + PREMIUM: + + Okos Szerviz Naptár: A Robot 2.3 a napi átlag futásból kiszámolja (Predikció), mikor kell olajat cserélni, és időben szól. + + Napi/Heti "Checklist" értesítések (Mérj guminyomást!) -> Sikeres elvégzés esetén XP és Kredit jutalom (Gamification). + +⚙️ A PÉNZÜGYI MOTOR (The Economy Engine) - MVP Követelmény + +Ahogy említetted, az elv megvan (Triple Wallet), de a motort meg kell írni. Ennek a Backendben egy atombiztos, önálló modulként kell futnia (app/services/billing_engine.py). + +A Pénzügyi Motor 3 fő komponense: + + A Stripe Webhook Receiver: * Amikor a User kifizeti a csomagot bankkártyával, a Stripe küld egy jelet a Backendnek (checkout.session.completed). + + A motor ekkor felébred. + + Az Atomi Tranzakció (Double-Entry Ledger): + + A motor nem csak átírja a Wallet egyenlegét, hanem először beír egy sort a data.financial_ledger táblába (Főkönyv): "+5000 HUF befizetés, Stripe_ID_xyz". + + Ezután hozzáadja a Krediteket a wallets.purchased_credits mezőhöz. A két lépés egy adatbázis-tranzakcióban (SQL COMMIT) fut: ha az egyik elszáll, a másik is visszagurul (Rollback). Nincs elveszett pénz. + + A Subscription Cron-Job (Az Éjjeli Őr): + + Egy ütemezett feladat minden éjjel 00:01-kor végignézi a users táblában a subscription_expires_at dátumokat. + + Akinél lejárt a PREMIUM, annak a rendszer automatikusan leveszi a rangját FREE-re, kikapcsolja a PDF generálást, és zárolja a 2. és 3. autóját (Read-only módba teszi). + +II. FÁZIS: POST-LAUNCH (A skálázódás és a Szerviz-Szimbiózis) + +Ezek a funkciók elengedhetetlenek a vízióhoz, de az indulás napján nem kellenek. Akkor kezdjük el fejleszteni őket, amikor már van 1000+ aktív autósunk az adatokkal. +4. Marketplace: Ajánlatkérés és Szervizkereső + + Funkció: A User a Garázsból egy gombnyomással elküldi a hibát (pl. "Fékcsere") a 20 km-es körzetben lévő megbízható szervizeknek. + + PREMIUM előny: A Premium userek ajánlatkérései "VIP" jelzéssel, a lista elején jelennek meg a szervizeknek. diff --git a/docs/V02/00_README.md b/docs/V02/00_README.md new file mode 100755 index 0000000..66cbdab --- /dev/null +++ b/docs/V02/00_README.md @@ -0,0 +1,92 @@ +# 📘 SERVICE FINDER - MASTER BOOK 2.0 (v2.0) +**Traffic Ecosystem SuperApp - Single Source of Truth** + +Ez a dokumentáció a rendszer véglegesített, konszolidált tudásbázisa. Minden korábbi verziót felülír. A fejlesztés során kizárólag az itt hivatkozott szabályok és struktúrák érvényesek. + +## 🚀 1. A Rendszer Alapjai (Core Documentation) +A teljes tudásbázis 8 db, logikailag elkülönített "könyvbe" (modulba) lett szervezve: + +| Fájl | Tartalom / Felelősségi kör | +| :--- | :--- | +| **[03_Infrastructure_Operations_2.0](./03_Infrastructure_Operations_2.0.md)** | **DevOps:** Docker Stack, Hálózatok, MinIO, Biztonsági mentés. | +| **[05_Identity_Auth_MDM](./05_Identity_Auth_MDM.md)** | **Core:** Person vs User, Auth Flow, Master Data Management (Deduplikáció). | +| **[06_Economy_Fleet_Marketplace_2.0](./06_Economy_Fleet_Marketplace_2.0.md)** | **Business:** Triple Wallet, Csomagok (Tiers), Szerviz Életciklus (Ghost/Active). | +| **[07_API_Communication_2.0](./07_API_Communication_2.0.md)** | **Interface:** API Végpontok, Admin Panel, i18n, Security (Sentinel). | +| **[12_Automated_Events_Notifications_2.0](./12_Automated_Events_Notifications_2.0.md)** | **Events:** Értesítési központ, Lejáratok figyelése, Push/Email triggerek. | +| **[13_Roadmap_Testing_Pitfalls_2.0](./13_Roadmap_Testing_Pitfalls_2.0.md)** | **DevGuide:** Jövőkép, Tech Debt (JSONB), Fejlesztői buktatók. | +| **[19_Permissions_Tiers_Branches_2.0](./19_Permissions_Tiers_Branches_2.0.md)** | **Access:** RBAC (L0-L3), Sales Agent rendszer, Telephely hierarchia. | +| **[22_Robot_Ecosystem_2.0](./22_Robot_Ecosystem_2.0.md)** | **AI/Robots:** R1-R4 Robotok specifikációja, AI Search RAG, Safe-Merge logika. | + +--- + +## 🗺️ 2. Kód & Dokumentáció Térkép (Code Mapping) +Hol találod a kódban azt, amiről a dokumentáció beszél? + +### 🤖 Robotok & AI +| Dokumentáció | Implementáció (File Path) | +| :--- | :--- | +| **Robot 1 (Catalog)** | `app/workers/catalog_scout.py` (vagy releváns worker) | +| **Robot 2 (Enricher)** | `app/workers/technical_enricher.py` (v1.2.6) | +| **AI Service (RAG)** | `app/services/ai_service.py` (v1.2.5) | +| **OCR Robot** | `app/workers/ocr_robot.py` (v1.0) | + +### 🏢 Üzleti Logika & Modellek +| Dokumentáció | Implementáció (File Path) | +| :--- | :--- | +| **Identity (Person)** | `app/models/identity.py` | +| **Wallet & Ledger** | `app/models/audit.py` / `app/models/identity.py` | +| **RBAC & Security** | `app/core/security.py` / `app/services/auth_service.py` | +| **MDM / Assets** | `app/models/vehicle_definitions.py` / `app/models/asset.py` | + +--- + +## 🧹 3. Archiválási Jegyzőkönyv (Cleanup Log) +A Master Book 2.0 létrejöttével az alábbi korábbi (v1.0) állományok elavulttá váltak. Javasolt az `_archive/` mappába mozgatásuk vagy törlésük. + +- `00_README.md` (Régi index) +- `01_Project_Overview.md` (Beépült a 05/06-ba) +- `02_Architecture_System_Context.md` (Beépült a 03-ba) +- `03_Dev_Environment_Runbook.md` (Beépült a 03-ba) +- `04_Infrastructure_Docker_Stack.md` (Beépült a 03-ba) +- `05_AUTH_AND_IDENTITY_SPEC.md` (Beépült a 05-be) +- `06_Database_Guide.md` (Beépült a 05-be) +- `07_API_Guide.md` & `07_REGISTRATION...` (Beépült a 07-be) +- `08_Frontend_Guide.md` (Tartalma elavult, UI refaktorra vár) +- `09_Admin_API_Guide.md` (Beépült a 07/19-be) +- `10_Billing_Credits_Subscriptions.md` (Beépült a 06-ba) +- `11_Gamification_Social.md` (Beépült a 06/19-be) +- `12_Operations_Backup_Monitoring.md` (Beépült a 03-ba) +- `13_Roadmap_Tech_Debt.md` (Beépült a 13-ba) +- `15_Changelog.md` (Beépült a 13-ba / Git history) +- `16_TESTING...` & `17_DEVELOPER...` (Beépült a 13-ba) +- `18_ASSET...` & `20_Service_Finder...` (Beépült a 06-ba) +- `19_ADMIN...` & `23_BRANCH...` (Beépült a 19-be) +- `21_DEEP_ASSET...` (Beépült a 05-be) +- `22_ROBOT_ÖKOSZISZTÉMA.md` (Beépült a 22-be) + +--- + +## 🚦 4. Gyorsindítás (Quick Start) +A rendszer indítása a v2.0 infrastruktúra alapján: + +```bash +# 1. Környezeti változók ellenőrzése +cat .env + +# 2. Konténerek indítása (V2 parancs) +docker compose up -d --build + +# 3. Logok követése (Robot Enricher) +docker logs -f service_finder_robot_enricher + +--- + +### 🏛️ Architekti Zárszó + +Ezzel a lépéssel a projekt átlépett a "Kísérleti" fázisból az **"Ipari"** fázisba. +1. A dokumentáció tiszta, nem redundáns. +2. A fejlesztők pontosan tudják, hova nyúljanak. +3. A robotok logikája "kőbe van vésve". + +**Mi legyen a következő technikai lépés?** +Most, hogy a könyvtár rendben van, javaslom, hogy térjünk vissza a kódhoz és kezdjük el a **Fuzzy Search API** (kereső) fejlesztését, vagy a **Frontend (UI)** felzárkóztatását az új adatokhoz? \ No newline at end of file diff --git a/docs/V02/00_Összefoglaló_2026.02.23.md b/docs/V02/00_Összefoglaló_2026.02.23.md new file mode 100755 index 0000000..b1eac31 --- /dev/null +++ b/docs/V02/00_Összefoglaló_2026.02.23.md @@ -0,0 +1,69 @@ +🧠 1. Belső Fejlesztői Összefoglaló (A "Soha többé ne csináljuk újra" jegyzet) + +Ezt a részt azért készítettem, hogy ha 3 hónap múlva ránézel a kódra, pontosan tudd, mik a Master Book 2.0 (MB2.0) alappillérei, és mik azok a régi hibák, amiket kigyomláltunk. + + Séma-Izoláció (Szeparáció): Megszüntettük a "minden egy táblában" káoszt. A felhasználók és jelszavak az identity sémában élnek, a rendszerbeállítások a system-ben, az üzleti adatok (flotta, szervizek) pedig a data sémában. Ez az adatvédelem (GDPR) alapja. + + 100% Aszinkron Működés: Száműztük a blokkoló psycopg2 és urllib hívásokat. Minden adatbázis-kapcsolat (AsyncSessionLocal) és hálózati kérés (httpx) aszinkron. A rendszer most már nem fagy le, ha egy robot épp a Google API-ra vár. + + Robot-Ökoszisztéma Konszolidáció: Az elszórt, egymásról nem tudó "seed" és "bot" scripteket (pl. seed_discovery.py, seed_models.py, discovery_bot.py) likvidáltuk vagy betettük az OLD mappába. A tudásukat integráltuk a központi app/workers/ mappába. A robotok most már futószalagon (Pipeline) adják át egymásnak az adatokat a Staging táblákon keresztül. + + Idempotens Seederek: Az inicializáló scriptek (seed_system.py, seed_test_scenario.py) most már okosak. Bármikor újra lefuttathatók, nem dobnak hibát és nem duplikálnak adatot (ON CONFLICT DO NOTHING, UUID-k, létezés-ellenőrzés). + + Person-Identity Szétválasztás: Egy felhasználó (User) már csak egy hitelesítési kapu. A valódi fizikai entitás a Person, a cég pedig az Organization. + + 📊 2. Részletes Rendszer-Specifikáció (Kézikönyvhöz és Prezentációhoz) + +Ez a rész használható a termék bemutatásakor a befektetőknek, vagy a szoftver dokumentációjának alapjaként. +I. Core Architektúra és Biztonság + +A rendszer alapja egy mikroszolgáltatás-orientált, elosztott hálózat, amely képes a masszív terhelés kezelésére. + + Technológiai Stack: FastAPI (Python 3.12), PostgreSQL (SQLAlchemy 2.0 Aszinkron ORM), Redis (Cache), MinIO (S3 kompatibilis fájltárolás). + + Hitelesítés és Jogosultság: JWT alapú munkamenet-kezelés, beépített Google OAuth támogatással. Szigorú szerepkörök (Superadmin, Admin, User) és szervezet-szintű (Owner, Member) jogosultságok. + + Nyelvek és Lokalizáció (i18n): Adatbázis-vezérelt, memóriában gyorsítótárazott (Redis/RAM) hierarchikus fordítási rendszer, amely azonnal képes nyelvet váltani a felhasználói profil alapján. + + Sentinel Diagnosztika: Beépített öndiagnosztikai modul (diagnose_system.py), amely egy gombnyomásra ellenőrzi az adatbázis sémák épségét, a nyelvi motor állapotát és a robotok várólistáit. + +II. Az Autonóm Robot Hadsereg (AI & Data Pipeline) + +A platform legfőbb értéke a "Zero-Data-Entry" filozófia. A felhasználóknak nem kell adatokat gépelniük; a robotok feltérképezik és validálják a piacot. +Egység Kódnév Feladat és Képességek +Robot 0 Strategist RDW API-ra kötött globális márka-felfedező. Automatikusan felismeri, ha új járműmárka jelenik meg az EU piacán, és felteszi a várólistára. +Robot 1 Continental Scout Rács-alapú (Grid Search) térképészeti robot. Képes egy egész várost lefedni a Google Places API és az OpenStreetMap hibrid használatával. Ujjlenyomat-alapú (Fingerprint) deduplikációval szűri a szervizeket. +Robot 2.1 Researcher Szöveges kontextus-gyűjtő. DuckDuckGo motorral fésüli át az internetet technikai leírások (olajmennyiség, gumiméret) után, ha a belső adatbázis hiányos. +Robot 2.2 Alchemist (AI) A rendszer "Agya". Lokális GPU-n futó LLM (Ollama) vagy Cloud AI segítségével a nyers internetes adatokat strukturált, technikai "Arany Adatokká" (Gold Data) alakítja. Beépített hallucináció-szűrővel (Sanity Check) rendelkezik. +Robot 3 OCR Engine Dokumentum-digitalizáló. A feltöltött számlákat és forgalmi engedélyeket olvassa le mesterséges intelligencia (Computer Vision) segítségével. +III. Közösségi Moderáció és Gamification (Játékosítás) + +A rendszer önfenntartó: a rosszindulatú adatokat a közösség szűri ki, a hasznos munkát a rendszer jutalmazza. + + Reputation System (Hírnév): Minden felhasználónak van egy hírnév-pontszáma. Ha hamis szervizt tölt fel, a közösség leszavazza (-3 pontnál a rendszer automatikusan kitiltja, "Auto-Ban"). Ha hasznos adatot ad meg, pozitív pontokat kap. + + XP és Szintek: Az elvégzett feladatokért (pl. jármű értékelése, OCR feltöltés, szerviz validálása) XP jár. A felhasználók szinteket léphetnek (Kezdő Sofőr -> Flotta Mester -> Sentinel Legenda). + + Főkönyv (Points Ledger): Minden pontmozgás tranzakciószerűen, megmásíthatatlanul rögzítésre kerül. + +IV. Flotta és Asset Management (TCO Motor) + +A járművek és gépek teljes életciklus-kezelése. + + Digital Twin (Digitális Iker): Minden jármű a katalógusból (Gold Data) kapja az alapadatait, ami kiegészül a saját, egyedi futásteljesítményével (Telemetria) és pénzügyi profiljával. + + TCO Költségszintetizátor: A rendszer 9 standardizált kategóriában (Üzemanyag, Szerviz, Gumi, Adó, Bírság stb.) képes rögzíteni és elemezni a költségeket. + + Szervezeti Tárolók (Vaults): A magánszemélyek és a cégek teljesen elkülönített, titkosított mappákban (Folder Slug) kezelhetik a járműveiket és a hozzájuk tartozó dokumentumokat. + + Előfizetési Szintek (Tiers): MVP szinten beépített limitációk (Free, Premium, Fleet) a maximális járműszám és az AI funkciók (pl. OCR) elérésére. + +🚧 Mi az, ami jelenleg NINCS még kész? (Következő lépések) + +Bármilyen prezentáció előtt fontos tudni, hol vannak a határok. A backend motorja és adatbázisa készen áll, de: + + API Végpontok (Routes): A main.py be van kötve, de az app/api/v1/endpoints/ mappában még meg kell írni azokat a CRUD műveleteket (GET, POST), amiken keresztül a Frontend ténylegesen beszélget az adatbázissal. + + Alembic Migrációk Generálása: A modellek megvannak, de az alembic revision --autogenerate parancsot még le kell futtatni az induláskor, hogy a PostgreSQL táblák fizikailag is létrejöjjenek a kód alapján. + + Frontend Csatlakozás: A React/Vue felületet még rá kell kötni ezekre a végpontokra. \ No newline at end of file diff --git a/docs/V02/01_Project_Overview.md b/docs/V02/01_Project_Overview.md new file mode 100755 index 0000000..e69de29 diff --git a/docs/V02/02_Architecture.md b/docs/V02/02_Architecture.md new file mode 100755 index 0000000..e69de29 diff --git a/docs/V02/03_Infrastructure_Operations.md b/docs/V02/03_Infrastructure_Operations.md new file mode 100755 index 0000000..ec643d0 --- /dev/null +++ b/docs/V02/03_Infrastructure_Operations.md @@ -0,0 +1,26 @@ +# 03. Infrastructure, Docker Stack & Operations (v2.0) + +Ez a dokumentum a rendszer futtatókörnyezetét, a konténer-architektúrát és a biztonsági mentési protokollokat írja le. + +## 3.1 Docker Stack & Hálózati Architektúra +A rendszer konténerizált, modern Docker Engine-re (Compose V2) optimalizált környezetben fut. + +- **Hálózatok:** - `shared_db_net`: Izolált hálózat az adatbázis és a backend modulok között [cite: 2026-02-13]. + - `bridge`: Külső eléréshez (Nginx, API elérés) [cite: 2026-02-13]. +- **DNS Fallback:** A konténerek a belső névfeloldás mellett Google DNS-t használnak a hálózati beragadások elkerülésére [cite: 2026-02-13]. + + + +## 3.2 Tárolás & Objektumtár (MinIO / NAS) +Az adatok és médiaállományok szigorúan elkülönített struktúrában tárolódnak: +- **Objektumtár (MinIO):** `/assets/{uuid}` és `/organizations/{id}` mappaszerkezet az automatikus izolációhoz. +- **Helyi Tárolás:** `/static/locales` a nyelvi szinkronhoz, Docker jogosultságokkal védve. + +## 3.3 Üzemeltetési Runbook +- **Konfiguráció:** Minden változó a `.env` fájlból töltődik be, a hardkódolt IP-k tilosak. +- **Dinamikus beállítások:** A `system_configs` tábla JSONB mezői vezérlik a rendszert (pl. jutalékok, árfolyamok) a kód módosítása nélkül. +- **Monitorozás:** Az n8n Dashboard és a Robot `ProcessLog` táblája biztosítja a valós idejű felügyeletet. + +## 3.4 Biztonsági Mentés & Recovery +- **Adatbázis:** Napi automatikus dump a `shared-postgres` konténerből. +- **Circuit Breaker:** A robotok automata vészleállítóval rendelkeznek, ha a CPU > 70% vagy külső API tiltás (Ban-Detection) történik. \ No newline at end of file diff --git a/docs/V02/04_TCO_Költség-Taxonómia_&_Telemetria.md b/docs/V02/04_TCO_Költség-Taxonómia_&_Telemetria.md new file mode 100755 index 0000000..1a630ed --- /dev/null +++ b/docs/V02/04_TCO_Költség-Taxonómia_&_Telemetria.md @@ -0,0 +1,25 @@ +# 24. TCO, Költség-Taxonómia & Telemetria (v2.0) + +Ez a dokumentum a járművek üzemeltetési költségeinek (Total Cost of Ownership), a telemetriai adatoknak és a speciális elszámolásoknak (pl. munkába járás) a logikáját rögzíti. + +## 24.1 Költség-Taxonómia (`data.asset_costs`) +A rendszer szigorú kategóriarendszert használ a kiadások követésére. A frontend számára ezek a kategóriák fix azonosítóval (ID) rendelkeznek: + +1. **Üzemanyag & Töltés (Fuel & EV):** Tankolások, villámtöltések. +2. **Karbantartás (Maintenance):** Kötelező szervizek, alkatrészek, munkadíjak. +3. **Adók & Díjak (Taxes & Fees):** Gépjárműadó, autópálya-matrica, biztosítás (KGFB, CASCO). +4. **Bírságok & Parkolás (Legal & Parking):** Parkolási díjak, gyorshajtás, pótdíjak. +5. **Értékcsökkenés (Depreciation):** Rendszer által becsült, vagy manuálisan megadott értékvesztés (csak PREMIUM/VIP szinten). + +## 24.2 "Munkába Járás" Modul (Commuting Allowance) +A rendszer automatikusan számolja a munkavállalók adómentes költségtérítését a magánjármű céges használata után. +- **Bemenet:** A `users` táblában rögzített Otthoni és Munkahelyi cím távolsága (Google Maps API / OSM alapján). +- **Triggelés:** A felhasználó a naptárban (vagy gombnyomással) kijelöli az adott hónapban ledolgozott munkanapokat. +- **Kalkuláció:** `Napi oda-vissza távolság (km) × Ledolgozott napok × Állami Norma (HUF/km)`. +- **Kimenet:** Hó végén egy automatikus, exportálható PDF riport a bérszámfejtésnek. + +## 24.3 Smart Odometer (Okos Futásteljesítmény) +Mivel nincs kötelező OBD2 hardver, a rendszer a `data.asset_telemetry` táblában egy okos algoritmust használ a kilométeróra állás (ODO) követésére: +- **Horgonypontok:** Minden tankolás, szerviz vagy vizsga alkalmával kötelező/ajánlott megadni az aktuális km-állást. +- **Napi Átlag (Daily Average):** A rendszer kiszámolja a két horgonypont között megtett napi átlagos távolságot. +- **Predikció (Ghost Telemetry):** Ha 14 napig nincs új adat, a rendszer a Napi Átlag alapján "láthatatlanul pörgeti" az órát, hogy a Robot 2.3 (Guardian) időben tudja küldeni a szervizértesítéseket. \ No newline at end of file diff --git a/docs/V02/05_Identity_Auth.md b/docs/V02/05_Identity_Auth.md new file mode 100755 index 0000000..67e8f3a --- /dev/null +++ b/docs/V02/05_Identity_Auth.md @@ -0,0 +1,36 @@ +# 05. Identity, Authentication & Master Data Management (v2.0) + +Ez a dokumentum a rendszer két legfontosabb oszlopát írja le: ki a felhasználó (Identitás) és hogyan kezeljük az adatokat (MDM). + +## 5.1 Az Identitás Filozófiája (The Dual Entity Rule) +A rendszer megkülönbözteti a hús-vér embert a technikai fióktól. + +1. **Person (A DNS):** A természetes személy, aki "örök". GDPR törlés esetén csak anonimizálódik, de a rendszer integritása miatt megmarad. + - **Identity Hash:** SHA256 lenyomat (Anyja neve + Születési hely + Idő) a duplikációk ellen. + - **Lifetime XP:** Az egyén életút pontjai, amelyek minden USER fiókján átívelnek. +2. **User (A Kulcs):** Technikai belépési fiók (email/jelszó). Bármikor törölhető. + +## 5.2 Onboarding Folyamat (3-Step Flow) +A regisztráció szakaszos, hogy csökkentse a lemorzsolódást: +- **Step 1 (Lite):** Alap adatok, `is_active=False`. +- **Step 2 (KYC):** Személyazonosság igazolása (Identity Docs), Wallet nyitása és a Privát Flotta létrehozása. +- **Step 3 (Service Setup):** Opcionális profilalkotás szolgáltatók (Providers) számára. + +## 5.3 Master Data Management (MDM) Logika +A járműadatok tisztaságát a Robot 2 (Technical Enricher) garantálja. + +### A Deduplikáció Szabályai: +A rendszer csak akkor von össze két járművet (Master-Merge), ha: +- A gyártó (`make`) egyezik. +- A technikai kód (`technical_code`) azonos és nem 'N/A'. +- A hengerűrtartalom (`engine_capacity`) megegyezik. + +### Biztonsági kódgenerálás (Fallbacks): +Ha nem azonosítható a jármű, a rendszer egyedi kódokat generál a `NOT NULL` kényszer miatt: +- `N/A-{id}`: Ha az AI nem talál kódot. +- `UNKNOWN-{id}`: Ha az AI lekérdezés sikertelen. + +## 5.4 Adatintegritási Szabályok +- **Soft Delete:** Nincs fizikai törlés. A `data.users` tábla e-mail címe felszabadul törléskor, de az adatok archiválódnak. +- **Séma Izoláció:** Minden üzleti tábla a `data` sémában található, a `public` csak metaadatokat tartalmaz. +- **Audit:** Minden pénzügyi mozgás a `financial_ledger` táblába, minden biztonsági esemény a `security_audit_logs` táblába kerül. \ No newline at end of file diff --git a/docs/V02/06_Database_MDM.md b/docs/V02/06_Database_MDM.md new file mode 100755 index 0000000..00d826a --- /dev/null +++ b/docs/V02/06_Database_MDM.md @@ -0,0 +1,77 @@ +# 06. Economy, Fleet Ecosystem & Marketplace (v2.0) + +Ez a dokumentum a rendszer bevételi logikáját, az eszközök (Assets) életútját és a szervizkereső (Service Finder) működési szabályait rögzíti. + +## 6.1 A Gazdasági Motor (The Triple Wallet) +A pénzügyi stabilitást és a B2B/B2C szétválasztást a háromszintű pénztárca-modell biztosítja. + +- **Earned Credits:** Validálással, tartalomgyártással vagy Referral jutalékból szerzett kredit. Prémium előfizetésre beváltható. +- **Purchased Credits:** Valódi pénzért vásárolt egyenleg. Szolgáltatások igénybevételére és Prémiumra fordítható. +- **Service Coins:** Tisztán B2B egység. Szolgáltatók (Providers) használják kiemelésre és hirdetésre. Nem váltható vissza lakossági Prémiumra. + +### Pénzügyi Integritás: +- **Financial Ledger:** Minden tranzakció (Kredit/Coin/HUF) megmásíthatatlan főkönyvi bejegyzést generál. +- **Multi-Currency:** A rendszer helyi valutában rögzít, de EUR alapon is tárolja az adatokat a rögzítéskori váltószámmal: $$Cost_{EUR} = Cost_{Local} \cdot ExchangeRate$$. + +## 6.2 Flotta és Asset DNS +A járművek nem egyszerű rekordok, hanem **Digital Twin** entitások, amelyek életútja követhető a tulajdonosváltásokon keresztül is. + +- **Asset típusok:** `Individual` (magánszemélyé, nem átruházható flotta) és `Fleet Owner/Service` (céges, átruházható tulajdonjoggal). +- **Tulajdonjog (Transferability):** Eladáskor a jármű teljes előélete (Evidence Store: fotók, számlák, OCR-ezett adatok) átkerül az új tulajdonoshoz. +- **Telemetria:** A rendszer kezeli a futásteljesítményt (km/miles/hours) és a technikai eseményeket. + +## 6.2.1 Flotta és Asset DNS - Átruházási Szabályok +A jármű eladásakor a tulajdonjog átruházása **korlátozott**. + +- **Ami átkerül:** A jármű technikai életútja, szerviztörténete és a dúsított MDM adatok (Digital Twin history). +- **Ami NEM kerül át:** A korábbi tulajdonos által feltöltött privát fotók, dokumentum-állományok és minden pénzügyi/számlázási adat. Ezek az eredeti entitáshoz (Cég vagy Person) maradnak kötve. +- **Szerviz-kapcsolat:** A szervizbejegyzések és a karbantartási napló elválaszthatatlanul a **járműhöz** (Asset ID) vannak láncolva, függetlenül az aktuális tulajdonostól. + +## 6.3 Service Finder & Marketplace +A Marketplace tisztaságát a Robot 2 (Auditor) és a Trust Engine szimbiózisa adja. + +### Szerviz Állapotok (Lifecycle): +| Állapot | Jelentés | Láthatóság | +| :--- | :--- | :--- | +| **Ghost** | Bot által talált, nem hitelesített rekord. | Megjelenik "Nem megerősített" jelzéssel. | +| **Active** | Validált, hivatalos szolgáltató. | Teljes láthatóság, Trust Badge. | +| **Flagged** | Gyanús vagy ellentmondásos adatú hely. | Felülvizsgálatig korlátozott. | +| **Inactive** | Igazoltan megszűnt vagy Soft-deleted. | Rejtett a kereső elől. | + +### Audit Ciklus: +A Robot 2 (Auditor) 90 naponta keresztellenőrzi a szolgáltatók állapotát külső forrásokkal (Google Places/OSM). Ha a hely bezárt, automatikusan `inactive` státuszba helyezi. + +## 6.4 Gamifikáció és Jutalomrendszer +- **XP Korlát:** Csak természetes személyek (`Person`) gyűjthetnek XP-t és social pontokat. Cégek nem kapnak gamifikált jutalmakat. +- **Social-to-Credit:** Meghatározott XP szint elérésekor a rendszer automatikusan Kreditet ír jóvá a Walletbe. +- **Referral Szintek:** 10-5-2% jutalékrendszer a meghívottak költései után. + +## 6.5 Trust & Evaluation Engine (Az Öt Pillér) +A rendszerben minden entitás saját, hitelesített értékeléssel rendelkezik a bizalom maximalizálása érdekében. + +1. **Person (Sofőr/Tulajdonos):** Megbízhatósági mutató (pl. időpontok betartása, fizetési fegyelem). +2. **Provider (Szolgáltató):** Szakmai minőségi mutató a felhasználói visszajelzések alapján. +3. **Vehicle - Technical Rating:** A jármű "egészségügyi" állapota, amely kizárólag a **verifikált szervizelések** és karbantartások alapján kalkulálódik. +4. **Vehicle - Social Rating:** Közkedveltségi mutató. Azt méri, mennyire népszerű vagy preferált az adott típus/példány a közösségben. +5. **Validator Rating:** Az adatok ellenőrzését végző szakértők hitelességi pontszáma. + +## 6.6 Felhasználói Csomagok (Tiers) és Szolgáltatások +A rendszer 5+1 szintű csomagstruktúrát alkalmaz, amely meghatározza a járműnyilvántartási kapacitást és az elérhető funkciókat. + +| Csomag | Célcsoport | Járműszám | Főbb funkciók | +| :--- | :--- | :--- | :--- | +| **FREE** | Magánszemély (Hobby) | 1 db | Alap költségkövetés, szervizkereső. | +| **PREMIUM** | Aktív autós/motoros | Több (Pl. 3) | OCR dokumentumkezelés, hirdetésmentesség. | +| **PREMIUM+** | Gyűjtők / Családok | Bővített | Telemetria adatok, részletes szerviznapló. | +| **VIP** | KKV / Nagyobb flotta | 5-10+ db | Flotta menedzsment, exportok, kimutatások. | +| **VIP+** | Vállalati flotta | Korlátlan / Egyedi | Több telephely kezelése, egyedi kimutatások. | +| **SERVICE** | Szolgáltatók | N/A | Ügyfélkezelés, ajánlatadás, profilkiemelés. | + +### Kreditalapú skálázás: +A csomagkorlátokon felül a felhasználóknak lehetőségük van **kreditért** extra járműhelyeket vásárolni a nyilvántartásukhoz, anélkül, hogy teljes csomagot kellene váltaniuk. + +## 6.7 VIP és Céges Flottakezelés +A VIP (céges) előfizetők számára a rendszer dedikált modult biztosít a flotta hatékony üzemeltetéséhez: +- **Automatizált Kimutatások:** Üzemanyag-fogyasztás, TCO (teljes birtoklási költség) és szervizköltség elemzések. +- **Csoportos Műveletek:** Adatrögzítés és dokumentumkezelés egyszerre több járműre. +- **Flotta-Audit:** A járművek műszaki állapotának és vizsgáinak központi felügyelete. \ No newline at end of file diff --git a/docs/V02/07_API_Service.md b/docs/V02/07_API_Service.md new file mode 100755 index 0000000..65576df --- /dev/null +++ b/docs/V02/07_API_Service.md @@ -0,0 +1,34 @@ +# 07. API Architecture, Security & Admin Control (v2.0) + +Ez a dokumentum az interfészek felépítését, a jogosultságkezelést (RBAC) és az Admin felügyeleti eszközöket írja le. + +## 7.1 API Alapelvek & Biztonság +- **Standard:** FastAPI v2, aszinkron végpontok. +- **JWT & RBAC:** A tokenek tartalmazzák a `rank`, `scope_level` és `scope_id` mezőket az azonnali jogosultság-ellenőrzéshez. +- **Sentinel System (Dual Control):** A kiemelt műveletekhez (pl. pénzügy, VIP státusz) kötelező a "Négy szem elv" (Dual Control) és a `ConfirmedAction` rögzítése. + +## 7.2 Moduláris Végpontok (Core Endpoints) +A korábbi monolitikus struktúrát szétbontottuk a jobb skálázhatóság érdekében: +1. **Identity API:** `/auth`, `/complete-kyc`. +2. **Asset API:** `/identity`, `/costs`, `/telemetry` bontásban. +3. **Marketplace API:** Szervizkeresés (`/search`) és Autocomplete (`/suggest-street`). + + + +## 7.3 Admin & i18n Szinkronizáció +Az Adminisztrátori felület nem csupán egy technikai eszköz, hanem a rendszer üzleti és biztonsági felügyeleti központja, amely négy szinten (Globális, Ország, Régió, Egyedi entitás) teszi lehetővé a beavatkozást. +- **Admin Kontroll Panel:** Központi végpontok a függőben lévő műveletek jóváhagyásához és a vészleállításhoz. +- **i18n Service:** Adatbázis-alapú fordításkezelés szerveroldali cache-sel. A `/admin/translations/sync` végpont exportálja a JSON fájlokat a Frontend számára. + +### 7.3.1 Főbb Adminisztrátori funkciók: +- **Dinamikus Paraméterezés:** Új rendszerértékek, jutalékok, árfolyamok és globális változók beállítása és ellenőrzése a `system_parameters` táblán keresztül. +- **Hierarchikus Jogosultságkezelés (RBAC):** A validációs jogok és hozzáférések finomhangolása globális vagy akár egyedi (Individual) szinten is. +- **Validáció és Audit:** A botok által gyűjtött (Ghost) adatok felülvizsgálata, a `PendingAction` kérések jóváhagyása és a biztonsági riasztások kezelése. +- **Regionális Kontroll:** Ország- és régióspecifikus szabályok (pl. adózási kulcsok, pénznemek, nyelvi készletek) aktiválása és felügyelete. + +### 7.3.2 Sentinel System (Dual Control): +A kiemelt műveletekhez (pl. pénzügyi keretek módosítása, Admin rang adása) továbbra is kötelező a "Négy szem elv" (Dual Control), ahol a műveletet végző és a jóváhagyó személynek el kell különülnie. + +## 7.4 Jövőbeli Interfészek (Roadmap) +- **Fuzzy Search:** A `synonyms` mezőre épülő `tsvector` alapú intelligens keresőmotor. +- **Service Hunter API:** A Robot 4 által talált ajánlatok lekérdezése. \ No newline at end of file diff --git a/docs/V02/08_Marketplace_Ajánlatkérés_és_Időpontfoglalás.md b/docs/V02/08_Marketplace_Ajánlatkérés_és_Időpontfoglalás.md new file mode 100755 index 0000000..9ebc4f6 --- /dev/null +++ b/docs/V02/08_Marketplace_Ajánlatkérés_és_Időpontfoglalás.md @@ -0,0 +1,19 @@ +# 25. Marketplace: Ajánlatkérés és Időpontfoglalás (v2.0) + +Ez a modul írja le a Szervizkeresőből kiinduló tranzakciós folyamatot, amely összeköti a járműtulajdonost a szolgáltatókkal. + +## 25.1 A Foglalási Folyamat (Booking Flow) +A kommunikáció aszinkron, és a `data.pending_actions` táblára épül. + +1. **Igény (Service Request):** - A User kiválasztja az autóját a Garázsból (`asset_id`). + - Kiválasztja a probléma típusát (pl. "Fékcsere", "Éves szerviz") a `service_specialties` fa alapján. + - Csatolhat fotót vagy hangüzenetet (MinIO). +2. **Geofenced Broadcast:** - A rendszer megkeresi a User által megadott sugáron belül (pl. 20 km) lévő, a megfelelő `expertise_tags`-el rendelkező szervizeket (`branches`). + - A szervizek (Providers) push/email értesítést kapnak: "Új ajánlatkérés a közeledben". +3. **Ajánlatadás (Quoting):** - A Provider megad egy árat, egy időpontot és egy validálási lejárati időt. +4. **Elfogadás & Esemény (Acceptance):** - A User elfogadja az egyik ajánlatot. + - Létrejön egy jövőbeli `asset_events` bejegyzés `status='scheduled'` jelzéssel. + +## 25.2 Trust és Lemondási Logika +- **No-Show védelem:** Ha a User nem jelenik meg, a szerviz "No-show" gombot nyomhat. Ez 1 Penalty Point-ot ad a Person rekordhoz (csökkenti a Trust Score-t). +- **Service Cancellation:** Ha a szerviz mondja le az utolsó pillanatban, a szerviz kap levonást az értékeléséből, a User pedig kompenzációs Kreditet kap. \ No newline at end of file diff --git a/docs/V02/09_Evidence_Store_&_Robot 3_(OCR_AI).md b/docs/V02/09_Evidence_Store_&_Robot 3_(OCR_AI).md new file mode 100755 index 0000000..79b9fda --- /dev/null +++ b/docs/V02/09_Evidence_Store_&_Robot 3_(OCR_AI).md @@ -0,0 +1,18 @@ +# 26. Evidence Store & Robot 3 (OCR AI) (v2.0) + +A jármű történetének hitelesítése (Digitális Szervizkönyv) a bizonyítékokon (Evidence) alapul. + +## 26.1 A Bizonyítékok Életciklusa +1. **Feltöltés:** A User lefotózza a számlát/munkalapot. A fájl titkosítva bekerül a MinIO objektumtárba, az adatbázisban pedig létrejön egy rekord a `data.documents` táblában. +2. **Feldolgozás (Robot 3):** A feltöltés egy eseményt (Webhook) indít az n8n felé, ami felébreszti a Robot 3-at (Gemini 2.0 Multimodal). +3. **Kinyerés (Extraction):** Az AI az alábbi adatokat bányássza ki a képből: + - `date`: A szerviz dátuma. + - `total_cost`: Bruttó végösszeg. + - `odometer`: Kilométeróra állása. + - `service_name / tax_number`: A szolgáltató adószáma vagy neve. + +## 26.2 Validációs Háló (Trust Matching) +Miután a Robot 3 kinyerte az adatokat, a rendszer megpróbálja összekötni azokat a meglévő adatbázissal: +- **Partner Match:** Ha a kibányászott adószám/név szerepel a `data.organizations` táblában (Regisztrált Szerviz), a rendszer azonnal értesíti a szervizt. Ha a szerviz jóváhagyja ("Igen, nálunk járt"), a bejegyzés **High Trust (Verified)** státuszt kap. +- **Sufni / Non-Partner Match:** Ha a szerviz nincs a rendszerben, a bejegyzés **Medium Trust** státuszt kap (bizonyíték van, de nem partner). +- **Gamification Jutalmazás:** Ha a feltöltés sikeres adatkinyerést eredményezett, a User +10 XP-t (Earned Credits) kap az adatrögzítésért. \ No newline at end of file diff --git a/docs/V02/10_Economy_Social.md b/docs/V02/10_Economy_Social.md new file mode 100755 index 0000000..e69de29 diff --git a/docs/V02/11_B2B_Flotta_és_Szervezeti_Szerepkörök.md b/docs/V02/11_B2B_Flotta_és_Szervezeti_Szerepkörök.md new file mode 100755 index 0000000..16adc16 --- /dev/null +++ b/docs/V02/11_B2B_Flotta_és_Szervezeti_Szerepkörök.md @@ -0,0 +1,20 @@ +# 27. B2B Flotta és Szervezeti Szerepkörök (v2.0) + +A rendszerben a privát flotta és a több ezer autós céges flotta technológiailag azonos (`data.organizations`), a különbséget a `data.organization_members` táblában lévő jogosultsági szintek adják. + +## 27.1 Céges Szerepkörök (Roles) +Egy szervezeten (Company) belül az alábbi három fő szerepkör értelmezett: + +1. **Owner (Cégtulajdonos / CEO):** + - Mindenhez hozzáfér, ő kötheti össze a céget a Stripe (fizetési) fiókkal. + - Látja a cég teljes egyenlegét (`wallets`), vehet Krediteket és oszthat ki Fleet Manager jogokat. +2. **Fleet Manager (Flottakezelő):** + - Látja a céghez rendelt összes járművet (`asset_assignments`). + - Látja a telemetriát, a költségeket (`asset_costs`) és a jövőbeli karbantartásokat. + - Új autót vehet fel a flottába, de Krediteket (pénzt) alapértelmezetten nem vásárolhat. +3. **Driver (Sofőr):** + - Kizárólag azokat az autókat látja, amelyek kifejezetten hozzá vannak rendelve az `asset_assignments` táblában (`driver_id`). + - Rögzíthet tankolást, feltölthet számlát (Evidence), de nem látja a cég többi autóját, és nincs hozzáférése a cég Pénztárcájához. + +## 27.2 Privát Szféra Izolációja +Ha egy felhasználó (User) Driver-ként van hozzárendelve egy céges autóhoz, az ő saját, személyes autói (Privát Széf) teljesen láthatatlanok maradnak a Fleet Manager és a cégtulajdonos számára. A céges és privát adatok szigorú falakkal vannak elválasztva az API szintjén. \ No newline at end of file diff --git a/docs/V02/12_Automated_Events_Notifications_2.0.md b/docs/V02/12_Automated_Events_Notifications_2.0.md new file mode 100755 index 0000000..94178d1 --- /dev/null +++ b/docs/V02/12_Automated_Events_Notifications_2.0.md @@ -0,0 +1,28 @@ +# 12. Automated Events & Notification System (v2.0) + +Ez a modul felelős a felhasználók időbeni tájékoztatásáért a járművekkel és az előfizetésekkel kapcsolatos kritikus eseményekről. + +## 12.1 Értesítési Típusok és Triggerek +A rendszer automatikusan figyeli a határidőket és értesítést küld az alábbi esetekben: + +### Jármű és Okmány Események: +- **Lejáró Okmányok:** Személyi igazolvány, jogosítvány vagy útlevél lejárata (Person profil adatai alapján). +- **Műszaki Vizsga (MOT):** A jármű következő vizsgájának esedékessége. +- **Biztosítás:** Kötelező vagy CASCO biztosítás fordulónapja és lejárata. + +### Karbantartási Értesítések: +- **Szervizintervallum:** Időalapú (pl. éves szerviz) vagy futásteljesítmény-alapú (pl. 15,000 km-enkénti olajcsere) figyelmeztetések. +- **Gumiabroncs csere:** Szezonális váltás (téli/nyári) esedékessége. + +### Rendszer és Üzleti Értesítések: +- **Előfizetés:** A választott csomag (Premium, VIP) lejárata vagy a következő számlázási ciklus kezdete. +- **Kredit egyenleg:** Alacsony egyenleg figyelmeztetés. + +## 12.2 Értesítési Csatornák +Az értesítések prioritástól és beállítástól függően több csatornán érkezhetnek: +1. **Push Notification:** Azonnali üzenet a mobilalkalmazásban. +2. **In-App Message:** Értesítési központ a webes felületen. +3. **E-mail:** Heti összefoglalók vagy kritikus figyelmeztetések. + +## 12.3 Értesítési Beállítások (Preference Center) +A felhasználók a `data.users.notification_settings` mezőben (JSONB) szabályozhatják, hogy mely eseményekről és milyen csatornán kérnek tájékoztatást. \ No newline at end of file diff --git a/docs/V02/13_Roadmap_Testing_Pitfalls_2.0.md b/docs/V02/13_Roadmap_Testing_Pitfalls_2.0.md new file mode 100755 index 0000000..995cfec --- /dev/null +++ b/docs/V02/13_Roadmap_Testing_Pitfalls_2.0.md @@ -0,0 +1,25 @@ +# 13. Roadmap, Testing & Developer Knowledge Base (v2.0) + +Ez a dokumentum rögzíti a projekt jövőbeni irányait, a minőségbiztosítási folyamatokat és a fejlesztés során azonosított kritikus hibalehetőségeket (Pitfalls). + +## 13.1 Stratégiai Roadmap (Azonnali prioritások) +A rendszer stabilitása után az alábbi modulok fejlesztése élvez elsőbbséget: + +1. **Intelligens Kereső API (Fuzzy Search):** A `synonyms` mező indexelése PostgreSQL GIN indexekkel a "Google-szerű" találati pontosságért. +2. **Média Kezelés & MinIO:** Automata bot fejlesztése gyári járműfotók bányászatára és tárolására. +3. **Robot 4 (Service Hunter):** A dúsított `specifications` adatok (olaj, gyertya) alapján szervizajánlatok generálása. + +## 13.2 Technikai Adósság (Tech Debt) +- **JSONB Migráció:** A `JSON` típusú mezők (synonyms, specifications) átállítása `JSONB`-re a gyorsabb szűrés és indexelés érdekében. +- **N/A Kódok Tisztítása:** Manuális felülvizsgálati felület kialakítása a robot által generált `N/A-{id}` kódok valódi gyári kódokra cseréléséhez. +- **AI Regex Parsing:** Amint a Gemini API engedi a Search + Controlled JSON használatát, a törékeny Regex tisztítást natív megoldásra kell cserélni. + +## 13.3 Tesztelési Protokoll és Telepítés +- **Automatizált tesztek:** Minden új végpontnál kötelező a Pydantic sémák validációja és az aszinkron adatbázis-kapcsolat ellenőrzése. +- **CI/CD:** A Docker Compose V2 használata kötelező a ContainerConfig hibák elkerülésére. + +## 13.4 Ismert Buktatók (Developer Pitfalls) +A fejlesztés során azonosított, kerülendő megoldások: +- **Postgres Enum:** A `userrole` típus kisbetűérzékeny. A Python kódból érkező értékeket (pl. `User`) kényszerítve kisbetűvel kell rögzíteni. +- **SQLAlchemy Async:** Körkörös importok elkerülése érdekében a modellek közötti kapcsolatokat (relationship) string-alapú hivatkozással kell definiálni. +- **Database URL:** Alembic migrációkor ellenőrizni kell, hogy az `.env` fájl beolvasása sikeres volt-e, különben "Empty database URL" hiba lép fel. \ No newline at end of file diff --git a/docs/V02/19_Permissions_Tiers_Branches_2.0.md b/docs/V02/19_Permissions_Tiers_Branches_2.0.md new file mode 100755 index 0000000..bc4272d --- /dev/null +++ b/docs/V02/19_Permissions_Tiers_Branches_2.0.md @@ -0,0 +1,54 @@ +# 19. Permissions, User Tiers & Branch Hierarchy (v2.0) + +Ez a dokumentum a jogosultsági szinteket, a bizalmi rangsorolást és a telephelyek földrajzi-adminisztratív hiearchiáját rögzíti. + +## 19.1 Felhasználói Rangok és Előfizetési Tiers +A rendszer megkülönbözteti a technikai előfizetést (User) és a közösségi megbízhatóságot (Person). + +- **Trust Tiers:** - **Tier 1 (Lite):** Csak email verifikált. Korlátozott hozzáférés. + - **Tier 2 (Active):** KYC (személyazonosítás) befejezve. Teljes Marketplace hozzáférés, saját flotta kezelése. +- **Subscription Plans (User szint):** - **FREE:** Alapszintű költségkövetés, hirdetésekkel. + - **PREMIUM:** Reklámmentesség, részletes TCO elemzések, prioritásos szervizkeresés. + - **VIP:** Egyedi üzleti funkciók, Sales Agent támogatás. + +## 19.2 Hierarchikus RBAC (Role-Based Access Control) +Az adminisztráció és a látókör (Scope) négy szinten különül el: + +| Szint (Scope) | Megnevezés | Hatókör | +| :--- | :--- | :--- | +| **L0** | **Global Admin** | A teljes ökoszisztéma, rendszerparaméterek és "Kill-switch". | +| **L1** | **Country Manager** | Adott ország (ISO kód) összes régiója, pénznemek, adókulcsok. | +| **L2** | **Regional Admin** | Megyei vagy kerületi szintű felügyelet. | +| **L3** | **Branch Manager** | Konkrét telephely, szervizpont vagy flottaegység irányítása. | + + + +## 19.3 Bírói Rendszer és Büntetések (Judge & Penalty) +A közösség tisztaságát a `GamificationService` által vezérelt "Bíró" modul védi. + +- **Penalty Points:** Visszaélés vagy hibás validáció esetén 0-3 szintű büntetőpont adható. +- **Restriction Levels:** A büntetések automatikusan korlátozzák a funkciókat (pl. nem tölthet fel számlát, nem validálhat másokat). +- **Multipliers:** A büntetett felhasználók kevesebb XP-t és kreditet kapnak ugyanazért a munkáért (Admin-vezérelt szorzók). + +## 19.4 Telephelyek és Földrajzi Hierarchia (Branches) +A rendszer kezeli a multi-tenant telephelyeket, ahol egy címen több jogi entitás is létezhet [cite: 2026-02-13]. + +- **Normalizált Címek:** Minden telephely az egységes `data.addresses` táblához kapcsolódik (UUID alapú hivatkozás). +- **PostGIS Integráció:** Minden telephely rendelkezik pontos GPS koordinátával (Point), amely lehetővé teszi a térképi alapú szűrést. +- **Sales Assignments:** A cégek (Organizations) és telephelyek üzletkötőkhöz (Sales Agents) rendelhetőek "Hunting" vagy "Farming" jutalék céljából. + +## 19.5 Biztonsági Protokoll (Sentinel & Four-Eyes) +A kiemelt műveleteknél (pl. VIP rang kiosztása, büntetés törlése, kifizetés) a rendszer kényszeríti a "Négy szem elvét": egy Admin kezdeményezi, de egy másik L1+ szintű Adminnak kell jóváhagynia a `ConfirmedAction` modulon keresztül. + +## 19.6 Üzletkötői és Hirdetésszervezői Rendszer +A rendszer támogatja a külső értékesítési partnereket a "Hunting & Farming" jutalékmodell alapján. + +- **Sales Agents (Üzletkötők):** A `persons` és `users` tábla kapcsolatán keresztül azonosított partnerek, akik szervizeket és cégeket hoznak be a rendszerbe. +- **Hunting Jutalék:** Egyszeri bónusz egy új szolgáltató vagy céges flotta sikeres regisztrációja és aktiválása után. +- **Farming Jutalék:** Folyamatos, százalékos bevétel a kezelt partnerek havidíjaiból vagy forgalmából. +- **Hirdetésszervezés:** Speciális jogosultsági kör a szervizek hirdetéseinek és kiemeléseinek kezelésére. + +## 19.7 Rugalmas RBAC Bővíthetőség +Bár az alaprendszer az L0-L3 hierarchiát követi, a technikai architektúra fel van készítve a jogosultságok dinamikus bővítésére: +- **Custom Permissions:** A `users` tábla `custom_permissions` (JSONB) mezője lehetővé teszi egyedi engedélyek hozzáadását anélkül, hogy új rangot kellene definiálni. +- **Bővíthető Szintek:** Az RBAC rendszer úgy lett tervezve, hogy a jövőben új köztes szintek (pl. kistérségi koordinátor) is bevezethetőek legyenek a `scope_level` skálázásával. \ No newline at end of file diff --git a/docs/V02/22_Robot_Ecosystem.md b/docs/V02/22_Robot_Ecosystem.md new file mode 100755 index 0000000..96f0d30 --- /dev/null +++ b/docs/V02/22_Robot_Ecosystem.md @@ -0,0 +1,93 @@ +# 22. Robot Ökoszisztéma & AI Intelligence (v2.0) + +Ez a dokumentum az autonóm ágensek technikai specifikációját és koordinációját tartalmazza. + +## 22.1 Robot 1: Catalog Scout (The Discovery) +- **Feladat:** Új járműmodellek importálása külső forrásokból (RDW, NHTSA). +- **Működés:** `unverified` státuszú alaprekordokat hoz létre. Ha a forrás blokkol (Ban-Detection), a robot automatikusan "Silent Mode"-ba vált. + +## 22.2 Robot 2: Technical Enricher (The Detective v1.2.6) +A legfejlettebb modul, amely a nyers adatokat master-adatokká dúsítja. + +### AI Search RAG (Retrieval-Augmented Generation): +- Mivel a Google Search tool használatakor a Gemini letiltja a kényszerített JSON formátumot, a robot **Regex-alapú JSON bányászatot** alkalmaz a nyers válaszból. +- **Cél:** Modellkódok, évjáratok és szervizintervallumok kinyerése közvetlenül az internetről. + +### Safe-Merge & Not-Null védelem: +- **Fallback Kódok:** Ha az AI nem talál kódot, a robot `N/A-{id}` vagy `UNKNOWN-{id}` ál-kódokat generál az SQL kényszerek (Unique, Not-Null) betartása érdekében. +- **Deduplikáció:** Csak akkor von össze rekordokat, ha a technikai kód ÉS a hengerűrtartalom (CCM) is megegyezik. + +## 22.3 Robot 3: OCR & Multimodal Document AI +- **Feladat:** Számlák, forgalmik és kilométerórák elemzése. +- **Integráció:** A felismerés során kinyert szervizadatokat keresztellenőrzi a `data.organizations` táblával. Ha ellentmondást talál, a szervizt `flagged` státuszba teszi. + +## 22.4 Robot 4: Service Hunter (Tervezett) +- **Cél:** A dúsított technikai adatok alapján szerviz-csomagok és árak automatizált keresése. +- **Működés:** A `specifications` mezőben tárolt folyadékmennyiségek és alkatrész-típusok alapján generál ajánlat-tervezeteket. + +## 22.5 Robot Koordináció (Orchestration) +A robotok az adatbázist használják "jelzőtáblának", elkerülve az ütközéseket: +1. **R1** rögzíti az alapot. +2. **R2** dúsít és validál. +3. **R3** (OCR) bizonyítékokat csatol a jármű életútjához. +4. Minden művelet a `ProcessLog` táblában kerül rögzítésre az auditálhatóság érdekében. + + +2026.02.18 Frissített Robot 2.0 Dúsítés több példányban +# 🤖 TechEnricher Robot (v1.2.6) - Dokumentáció + +## 1. Célkitűzés +A TechEnricher feladata a `data.vehicle_model_definitions` táblában található nyers, tisztítatlan járműadatok automatizált dúsítása technikai adatokkal (CCM, kW, Évjárat, Szervizintervallumok) és a duplikációk intelligens felszámolása. + +## 2. Technikai Architektúra +- **Motor:** Python 3.10+ Asynchronous IO +- **AI Integráció:** Google Gemini 2.0 Flash +- **Adatbázis Logika:** SQLAlchemy 2.0 + PostgreSQL Row Level Locking +- **Deduplikációs Kulcs:** `make` + `technical_code` + `vehicle_type` + + + +## 3. Kulcsfunkciók + +### 🛡️ Manuális Védelem (Manual Override) +A robot soha nem írja felül a manuálisan rögzített adatokat. Ha a rekord `is_manual` mezője `true`, a folyamat érintetlenül hagyja azt. + +### 🔗 Intelligens Összefűzés (Smart Merge) +Az egyediségi kényszerek (Unique Constraints) megsértése helyett a robot felismeri az ütközéseket: +- Ha a technikai kód alapján már létezik rekord, az új bejegyzést `duplicate` státuszba helyezi. +- Létrehozza a kapcsolatot a `parent_id` mezőn keresztül. +- A Master rekord `synonyms` mezőjét automatikusan bővíti az új elnevezéssel. + +### 🛑 Anti-Loop és Hibakezelés +- **Attempts:** Minden rekord maximum 3 esélyt kap. +- **Last Error:** A hibás tranzakciók okát a robot elmenti a rekordhoz. +- **Circuit Breaker:** 10 egymást követő kritikus hiba esetén a robot 15 percre "alvó üzemmódba" vált az API-kvóta védelme érdekében. + + + +## 4. Működési Sorrend (Logic Flow) +1. **Fetch:** 20 rekord lekérése `SKIP LOCKED` módban. +2. **Pre-Map:** Adatok kimentése memóriába (Greenlet védelem). +3. **Group:** Csoportosítás márkák/modellek szerint. +4. **Enrich:** AI vagy Belső Cache hívás. +5. **Validate:** Sanity check a technikai adatokra. +6. **Commit:** Tranzakció mentése (Master/Duplicate logika szerint). + +## 5. Skálázás +A robot felkészített a horizontális skálázásra: +```bash +docker compose up -d --scale enricher_robot=3 + +🤖 22.0 Robot 0: The Strategist (Market Prioritizer)Cél: A feldolgozási sorrend optimalizálása a piaci relevancia alapján.Logika: Lekéri a külső források (pl. RDW) statisztikáit, és darabszám szerint rangsorolja a márkákat.Működés: 1. Kategóriákra bont (Személyautó > Motor > Teherautó > Egyéb).2. Feltölti/Frissíti a data.catalog_discovery táblát.3. Biztosítja, hogy a Robot 1 a legnépszerűbb modellekkel kezdjen. + +🤖 22.1 Robot 1: The Hunter (Paginator v2.4)Cél: Strukturált jármű-variánsok tömeges importálása.Működés: - Recon: Megszámolja az adott márkához tartozó összes rekordot ($select=count(*)).Paging: 1000-es csomagokban, módszeresen végiglapozza a teljes adatbázist.Deduplikáció: Csak az egyedi technikai variánsokat (Márka + Modell + ccm + kW) menti el a data.vehicle_model_definitions táblába. + +🤖 22.2 Robot 2.1: The Researcher (Industrial-v2.1)Cél: Technikai kontextus és szervizspecifikációk "porszívózása" az internetről.Működés:DuckDuckGo/Google Search segítségével adatokat gyűjt: olajmennyiség, viszkozitás, gumiabroncs nyomás, vezérlés csereperiódus, gyújtógyertya típus.A nyers szöveget a raw_search_context mezőben tárolja el a későbbi feldolgozáshoz. + +🤖 22.3 Robot 2.2: The Alchemist (AI-Gold v2.2)Cél: A kutatott szövegek strukturált JSON-ná (Arannyá) alakítása.Működés:LLM (Ollama/Gemini) segítségével kinyeri a technikai adatokat a kutatási kontextusból.Factory Data Mapping: Betölti a data.vehicle_catalog táblába a végleges adatokat.Validation: Ha az adat ellentmondásos, manual_review státuszba helyezi a rekordot. + +🤖 22.4 Robot 2.3: The Guardian (Predictive Notifier)Cél: Napi monitorozás és prediktív értesítések generálása (07:00-08:00 UTC).Logika: - Okmányfigyelő: Figyeli a data.assets és data.persons táblák lejárati dátumait (Műszaki, Biztosítás, Adó, Orvosi).Karbantartási Naptár: Összeveti az utolsó szerviz óta eltelt időt/kilométert a factory_data intervallumaival.Értesítési Mátrix: - 30 nappal / 1000 km-rel előbb: Emlékeztető (Lite).7 nappal / 200 km-rel előbb: Sürgető (Action Required).Lejárat napján: Kritikus riasztás.Kimenet: Bejegyzés a data.notification_queue táblába (Email/Push). + +🛠 22.5 Adatminőség & Validációs RangsorA rendszer megkülönbözteti az adatok forrását, ami befolyásolja a jármű "Trust Score"-ját:ForrásHitelességi szintHatása az Asset-rePartner SzervizHigh (Verified)Digitális szervizkönyv pecsétet kap.User (Számlával)MediumFeltöltött dokumentumhoz kötött, admin jóváhagyásra várhat.User (Csak adat)LowTájékoztató jellegű, a jármű értékét nem növeli hivatalosan. + +💰 22.6 Költségcsoportosítás & Elszámolás (TCO)A költségek a data.asset_costs táblában rögzülnek az alábbi csoportosításban:Üzemanyag: Tankolások, fogyasztásmérés.Karbantartás: Alkatrész, munkadíj.Adók & Díjak: Biztosítás, adó, matrica.Munkába járás: Automatikus kalkuláció a munkanapok és a rögzített távolság alapján (NAV/Helyi norma szerinti térítés). \ No newline at end of file diff --git a/docs/V02/99_Adattarolás.md b/docs/V02/99_Adattarolás.md new file mode 100755 index 0000000..aa820e1 --- /dev/null +++ b/docs/V02/99_Adattarolás.md @@ -0,0 +1,378 @@ +Járműről tárolandó adatok: +Jármű fajták (osztály) + Személygépjármű + motorkerékpár + kishaszon gépjármű + haszongépjármű + munkagép + pótkocsi/utánfutó + Autóbusz + Lakókocsi/lakóautó + hajó + repülőgép + + +*** Személygépjármű *** + Márka + modell + kivitel (pickup, terepjáró, egyeterű, családi, sport, sedán) + üzemanyag (benzin, diesel, elektromos, etanol, gáz + gyátási évjárat tól - ig + típusjel + felszereltségi szint + km óra állás (egyedi) + motor hengerűrtartalom + teljesítmény + nyomaték + henger elrendezés + saját tömeg + össztömeg + csomagtartó mérete (x,Y) + környezetvédelmi besorolás + Tető fajtája ( Lemeztető, Vászontető, Nyitható keménytető, Harmonikatető, Targatető, Fix üvegtető, Panorámatető, Fix napfénytető, Nyitható napfénytető, Elhúzható napfénytető, Motoros napfénytető, Nyitható panorámatető) + állapot (értékelés 0-100 ig) + ajtók száma + ülések száma + sebességváltó (kézi, autómata fokozatok száma, felező) + klíma fajtája (nincs, manuális, autómata, digitális, kétzónás, hőszivattyús) + tempomat + hajtás( első, hátső, összkerék) + Elektromos meghajtárnál + Akku kapacitás, jelenlegi kapacitás (%), AC töltő típusa, töltési teljesítmény, DC csatlakozó típusa, töltési teljesítmény, WLTP hatótáv, Autópálya - Téli hatótáv, + villámtöltés/gyorstöltés, zöld rendszám + Veterán (boolean) + **Műszaki adatok** (bekanyarodási asszisztens, éjjellátó asszisztens, fáradtságérzékelő, hátsó keresztirányú forgalomra figyelmeztetés + holttér-figyelő rendszer, koccanásgátló, lejtmenet asszisztens, parkolóasszisztens, radaros fékasszisztens, sávtartó rendszer + sávváltó asszisztens, távolságtartó tempomat, tempomat, vészfék asszisztens, visszagurulás-gátló, ABS (blokkolásgátló), ADS (adaptív lengéscsillapító), ARD (automatikus távolságtartó) + ASR (kipörgésgátló), automatikus segélyhívó, EBD/EBV (elektronikus fékerő-elosztó), EDS (elektronikus differenciálzár), elektronikus rögzítőfék, ESP (menetstabilizátor), fékasszisztens + GPS nyomkövető, guminyomás-ellenőrző rendszer, indításgátló (immobiliser), MSR (motorféknyomaték szabályzás), rablásgátló, tábla-felismerő funkció, ütközés veszélyre felkészítő rendszer, 4WS - összkerékkormányzás + állítható felfüggesztés, automatikus hengerlekapcsolás, centrálzár, chiptuning, EDC (elektronikus lengéscsillapítás vezérlés), kerámia féktárcsák, pót üzemanyagtartály, részecskeszűrő + riasztó, sebességfüggő szervókormány, sperr differenciálmű, sportfutómű, start-stop/motormegállító rendszer + szervokormány, vonóhorog - elektromosan kihajtható, vonóhorog - levehető fejjel, 230V csatlakozó hátul, 360 fokos kamerarendszer, elektronikus futómű hangolás + első-hátsó parkolóradar, kulcsnélküli indítás, kulcsnélküli nyitórendszer, távolsági fényszóró asszisztens,tolatókamera, tolatóradar, otthoni hálózati töltő, Type2 töltőkábel) + + **Beltér** (függönylégzsák, hátsó oldal légzsák, kikapcsolható légzsák, középső légzsák elöl, oldallégzsák, térdlégzsák + utasoldali légzsák, vezetőoldali légzsák, beépített gyerekülés, bukócső, csomag rögzítő, hátsó fejtámlák, ISOFIX rendszer, sebességváltó zár, full extra, állófűtés, fűthető első és hátsó ülések, fűthető első ülés, + fűthető kormány, álló helyzeti klíma, hűthető kartámasz, hűthető kesztyűtartó, üléshűtés/szellőztetés, bőr belső, műbőr-kárpit, velúr kárpit, Alcantara kárpit, állítható combtámasz, állítható hátsó ülések + automatikusan sötétedő belső tükör, bőr-szövet huzat, bőrkormány, deréktámasz, digitális műszeregység, dönthető utasülések, elektromos ülésállítás utasoldal, elektromos ülésállítás vezetőoldal, elektromosan állítható fejtámlák, faberakás + garázsajtó távirányító, gesztusvezérlés, hangvezérlés, középső kartámasz, masszírozós ülés, memóriás utasülés, memóriás vezetőülés, multifunkciós kormánykerék, plüss kárpit, távirányítással ledönthető hátsó üléstámla + ülésmagasság állítás, állítható kormány, fedélzeti komputer, HUD / Head-Up Display, HUD / Head-Up Display kiterjesztett valóság funkcióval + kormányváltó, sportülések) + +**Kültér** (gyalogos légzsák, automata fényszórókapcsolás, automata távfény, bekanyarodási segédfény, bi-xenon fényszóró, bukólámpa, fényszóró magasságállítás, fényszórómosó, kanyarkövető fényszóró, kiegészítő fényszóró, ködlámpa, LED fényszóró, LED mátrix fényszóró, menetfény, xenon fényszóró, defekttűrő abroncsok, esőszenzor, fűthető ablakmosó fúvókák, fűtőszálas szélvédő, ajtószervó, automatikusan sötétedő külső tükör, elektromos csomagtérajtó-mozgatás, elektromosan behajtható külső tükrök, defektjavító készlet, pótkerék, tetőcsomagtartó, tetőre szerelhető kerékpártartó, vonóhorgos kerékpártartó, elektromos ablak elöl, elektromos ablak hátul, elektromos tükör, fűthető tükör, kétoldali tolóajtó, könnyűfém felni, króm felni, színezett üveg, tolóajtó, tolótető - elektromos, tolótető (napfénytető) + vonóhorog) + + **Multimédia / Navigáció** + (autótelefon, CD-s autórádió, DVD, GPS (navigáció), HIFI, rádió, rádiós magnó, TV, 1 DIN, 2 DIN, 2 hangszóró, 4 hangszóró, 5 hangszóró, 6 hangszóró, 7 hangszóró, 8 hangszóró, 9 hangszóró, 10 hangszóró, 11 hangszóró, 12 hangszóró, mélynyomó, CD tár, MP3 lejátszás, MP4 lejátszás, WMA lejátszás, analóg TV tuner, AUX csatlakozó, bluetooth-os kihangosító, DVB tuner, DVB-T tuner, erősítő kimenet, FM transzmitter, HDMI bemenet,iPhone/iPod csatlakozó, kihangosító, memóriakártya-olvasó, merevlemez, mikrofon bemenet, tolatókamera bemenet, USB csatlakozó, érintőkijelző, erősítő, fejtámlamonitor, gyári erősítő, kormányra szerelhető távirányító, távirányító, tetőmonitor, Android Auto, Apple CarPlay, kormányról vezérelhető hifi, multifunkcionális kijelző, vezeték nélküli telefontöltés, WiFi Hotspot) + + **Egyéb autópiaci adatok**(Egyéb információ, garanciális, amerikai modell, azonnal elvihető, bemutató jármű, jobbkormányos, rendelhető, ÁFA visszaigényelhető, autóbeszámítás lehetséges, első forgalomba helyezés Magyarországon, első tulajdonostól, frissen szervizelt, garantált km futás, garázsban tartott, hölgy tulajdonostól, keveset futott, második tulajdonostól, motorbeszámítás lehetséges, mozgássérült, nem dohányzó, rendszeresen karbantartott, taxi, törzskönyv, végig vezetett szervizkönyv, vezetett szervizkönyv) + + *** Motorkerékpár *** + Márka + modell + kivitel Chopper,Cruiser,Custom,Épített chopper,Classic/veterán,Cross,Cross,Pitbike,Enduro,Gyerekmotor,Gyorsasági/sport,Oldalkocsis,Quad,Quad,ATV,Gyerekquad,RUV,SSV (Side-by-side),UTV,Robogó,Robogó,Nagyrobogó,Túrarobogó,Segédmotoros kerékpár,Segédmotoros kerékpár,Moped,Supermoto,Trial,Trike,Túra,Túra,Naked,Túra-sport,Túraenduro,Versenymotor,Versenymotor,Dragbike,Épített versenymotor,Pályamotor,Pocket-bike,Streetfighter,Egyéb) + Általános adatok +Évjárat (-tól -ig) +Állapot (Normál,Kitűnő,Megkímélt,Újszerű,Sérülésmentes,Sérült,Sérült,Enyhén sérült,Eleje sérült,Hátulja sérült,Baloldala sérült,Jobboldala sérült,Hiányos,Fődarab hibás,Fődarab hibás,Motorhibás,Váltóhibás,Elektronika hibás,Fékhibás,Futómű hibás) +Veterán (30 évnél öregebb,Eredeti alkatrészekkel,Nem,Restaurálandó,Veterán vizsga) +Km. óra állás/Üzemóra +Akkumulátor és hatótáv adatok +Akkukapacitás (Jelenlegi akkukapacitás, Hatótáv +**Műszaki adatok** +Üzemanyag (Benzin,Dízel,Elektromos) +Hengerűrtartalom +Motor teljesítménye kW +Munkaütem (2,4) +Hengerek száma(1,2,3,4,5,6) +Henger elrendezés (Álló,Boxer,Fekvő,Soros,V) +Keverékképzés (Injektor,Karburátor,Közvetlen befecskendezés) +Szelepek száma (szelep / henger) +Hajtás (Direkt,Kardán,Lánc,Szíj) +Hűtés (Lég,Levegő-olaj,Víz) +Szállítható szem. száma +Saját tömeg +Össztömeg +Sebességváltó (Automata,Automata (1 fokozatú),Automata (2 fokozatú),Automata (3 fokozatú),Automata (4 ,okozatú),Automata (5 fokozatú),Automata (6 fokozatú),Automata (7 fokozatú),Szekvenciális,Szekvenciális,Szekvenciális (1 fokozatú),Szekvenciális (2 fokozatú),Szekvenciális (3 fokozatú),Szekvenciális (4 fokozatú),Szekvenciális (5 fokozatú),Szekvenciális (6 fokozatú),Szekvenciális (7 ,okozatú),Fokozatmentes automata) + +**Műszaki** + dupla tárcsafék elöl, tárcsafék elöl, tárcsafék hátul, chip tuning, elektromos futómű állítás,fedélzeti computer, fém fékcső, fordulatszámmérő, immobiliser, katalizátor, önindító, összkerékhajtás, riasztó, sport kipufogó, sport légszűrő, tempomat, turbó, 12 V rendszer, markolat ,űtés, ABS (blokkolásgátló), biztonsági öv, DTC, ködlámpa, légzsák, xenon fényszóró + **Váz / Idom** + full extra, bőrülés, fűthető ülés, háttámla, középsztender, lábtartó, motoros szélvédő, plexi, tankpad, tankvédő bőr, ülésmagasság állítás, bukócső / bukógomba, kézvédők, fűthető tükör, vonóhorog + **Táska / Doboz** + gyári dobozok, hátsó doboz, oldalsó dobozok, zárható doboz, oldaltáska, tank táska, táskatartó konzol, villatáska + **Multimédia / Navigáció** + CD tár, GPS (navigáció), HIFI, rádiós magnó, információs kijelző + **Egyéb információ** + garanciális, amerikai modell, azonnal elvihető, bemutató jármű, rendelhető, autóbeszámítás lehetséges, első tulajdonostól, garázsban tartott, hölgy tulajdonostól, keveset futott, második ,ulajdonostól, motorbeszámítás lehetséges, pályaidom, rendszeresen karbantartott, szervizkönyv, törzskönyv + + *** kishaszon gépjármű *** + + Márka +Modell +Típusjel +**Általános adatok** +Km. óra állás +Évjárat +Kivitel(Alváz dupla kabinnal,Duplakabinos autómentő,Duplakabinos billenőplatós,Duplakabinos darus,Duplakabinos dobozos (koffer),Duplakabinos dobozos-emelőhátfalas,Duplakabinos emelőkosaras,Duplakabinos létrás,Duplakabinos platós,Duplakabinos ponyvás,Duplakabinos ponyvás-emelőhátfalas,Alváz ,zimpla kabinnal,Alváz szimpla kabinnal,Autómentő,Billenőplatós,Darus,Dobozos (emelőhátfalas),Dobozos (koffer),Duplakabinos élőállat-szállító,Emelőkosaras,Hűtős alváz,Létrás,Mozgóbolt, büfékocsi,Platós,Ponyvás,Ponyvás (emelőhátfalas),ATV,Darus billenőplatós,Élőállat-szállító,Halottas,Konténeres,Mentő,Páncélozott,Pickup,Pickup,Duplakabinos pickup,Szimplakabinos pickup,Terepjáró,Tűzoltó,Zárt,Zárt,Cargo,Félig ablakos,Furgon,Hűtős (zárt),Körbeüvegezett,Van,Egyéb) +Állapot(Normál,Kitűnő,Megkímélt,Újszerű,Sérülésmentes,Sérült,Sérült,Enyhén sérült,Eleje sérült,Hátulja sérült,Baloldala sérült,Jobboldala sérült,Hiányos,Fődarab hibás,Fődarab hibás,Motorhibás,Váltóhibás,Elektronika hibás,Fékhibás,Futómű hibá) +Veterán(30 évnél öregebb,Eredeti alkatrészekkel,Nem Restaurálandó,Veterán vizsga) +**Akkumulátor és hatótáv adatok** +Akkukapacitás ,Jelenlegi akkukapacitás,AC töltőcsatlakozó típusa,AC töltési teljesítmény, AC töltőcsatlakozó típusa, DC töltési teljesítmény,WLTP hatótáv,Autópálya hatótáv ,Téli hatótáv + Villámtöltés, Zöld rendszám + +**Műszaki adatok** +Üzemanyag (Benzin, Gázolaj, Benzin/Gáz,LPG,CNG,Dízel/Gáz,Dízel/Gáz,LPG/dízel,CNG/dízel,Hibrid,Hibrid,Hibrid (Benzin),Hibrid (Dízel),Elektromos,Etanol,Biodízel,Gáz) +Hengerűrtartalom +Motor teljesítménye kW +Nyomaték +Saját tömeg +Össztömeg +Ajtók száma +Szállítható személyek +**Raktér adatok** +Raktér térfogat +Raktér hossza +Raktér szélessége +Raktér magassága +Doblemez-távolság +**Sebességváltó, hajtás** +Sebességváltó (Manuális,Manuális (3 fokozatú),Manuális (4 fokozatú),Manuális (5 fokozatú),Manuális (6 ,okozatú),Manuális (7 fokozatú),Automata,Automata (3 fokozatú),Automata (4 fokozatú),Automata (5 ,okozatú),Automata (6 fokozatú),Automata (7 fokozatú),Automata (8 fokozatú),Automata (9 fokozatú),Automata (10 fokozatú),Szekvenciális,Szekvenciális (4 fokozatú),Szekvenciális (5 fokozatú),Szekvenciális (6 fokozatú),Szekvenciális (7 fokozatú),Szekvenciális (8 fokozatú),Fokozatmentes utomata,Tiptronic,Tiptronic,Automata (4 fokozatú tiptronic],Automata (5 fokozatú tiptronic],Automata ,6 fokozatú tiptronic],Automata (7 fokozatú tiptronic],Automata (8 fokozatú tiptronic],Automata (9 ,okozatú tiptronic),Félautomata, Felező váltó,Hajtás) +Felező váltó +Hajtás (Első kerék,Hátsó kerék,Összkerék,Összkerék,Állandó összkerék, kapcsolható összkerék) +**Klíma fajtája** + Nincs + Manuális klíma + Automata klíma + Digitális klíma + Digitális kétzónás klíma + Digitális többzónás klíma + Hőszivattyús klíma + +**Műszaki** + ABS (blokkolásgátló), ASR (kipörgésgátló), GPS nyomkövető, immobiliser, riasztó, tempomat, tolatóradar + **Beltér** + függöny légzsák, hátsó oldal légzsák, kikapcsolható légzsák, oldal légzsák, utasoldali légzsák, ,ezetőoldali légzsák, bukócső, csomag rögzítő, isofix rendszer, full extra, állófűtés, bőr belső, ,űthető ülés, térelválasztó, ülésmagasság állítás, állítható kormány, centrálzár, fedélzeti komputer, szervokormány + **Kültér** + elektromos ablak, elektromos tükör, fűthető tükör, könnyűfém felni, színezett üveg, vonóhorog, ,lektromos tető, ködlámpa, xenon fényszóró + **Multimédia / Navigáció** + CD tár, CD-s autórádió, GPS (navigáció), HIFI, rádiós magnó, + **Egyéb információ** + garanciális, amerikai modell, azonnal elvihető, bemutató jármű, jobbkormányos, rendelhető, ,utóbeszámítás lehetséges, első tulajdonostól, garázsban tartott, keveset futott, második ,ulajdonostól, motorbeszámítás lehetséges, nem dohányzó, szervizkönyv, törzskönyv + + *** Haszonjármű *** + + **Haszonjármű alkategóriák** + Tehergépjármű + Kommunális gépjármű + **felépítmény típusok** + + **Általános adatok** +Évjárat +Kivitel (emeletes busz,halottas,hotel busz,lakóautó,lakóbusz,mentő,mozgássérülteknek,mozgó bisztró,mozgó kórház,mozgó szűrőállomás,mozgóbolt,tárgyaló autóbusz,turista autóbusz,városi autóbusz,városnéző autóbusz) +Állapot(Normál,Normál,Kitűnő,Megkímélt,Újszerű,Sérülésmentes,Sérült,Sérült,Enyhén sérült,Eleje sérült,Hátulja sérült,Baloldala sérült,Jobboldala sérült,Hiányos,Fődarab hibás,Fődarab hibás,Motorhibás,Váltóhibás,Elektronika hibás,Fékhibás,Futómű hibás) +Veterán +**Teljesítmény adatok** +Km. óra állás +Üzemóra +Hengerűrtartalom +Üzemanyag (Benzin,Benzin/Gáz,Benzin/Gáz,CNG,LPG,Biodízel,Dízel,Dízel/Gáz,Dízel/Gáz,CNG/dízel,LPG/dízel,Elektromos,Etanol,Gáz,Hibrid,Hibrid,Hibrid (Benzin)) +osztály (EUR 1-6) +Motor teljesítménye kW +Nyomaték +**Tömeg és munka adatok** +Saját tömeg +Össztömeg +Teherbírás, terhelhet. +Munkaszélesség +Emelési magasság +Hasmagasság +**Raktér adatok** +Raktér térfogata +Raktér hossza +Raktér szélessége +Raktér magassága +Doblemez-távolság +**Tengelyek, hajtás** +Tengelyek száma +Hajtott tengelyek száma +Sebességváltó (Automata,Automata felezős,Félautomata,Félautomata felezős,Fokozatmentes váltó,Manuális,Manuális aszinkron,Manuális felezős) +Kihajtás (front, motorra szerelt, váltóra szerelt) +Összkerékhajtás (hajtott tengelyenként egyszerre, hajott tengelyenként külön) +Differenciálzár (Autómata, csak állóhelyzetben kapcsolható, manuálisan kapcsolható, menet közben kapcsolható) +**Fülke** +Ajtók száma,Szállítható szem. szám,Fekvőhelyek száma +**Klíma fajtája** + Nincs, Manuális klíma, Automata klíma, Digitális klíma, Digitális kétzónás klíma, Digitális ,öbbzónás klíma, Hőszivattyús klíma, +**Műszaki / Munkavégzés** + elektromos retarder, hidraulikus retarder, olajos retarder, csörlő, hashúzó, immobiliser, intarder,joystick vezérlés, kerék súly, könnyűfém felni, központi zsírzó, légfék, légrugó, motor előmelegítés, pótkocsi fék, riasztó, rugózott elsőhíd, tárcsafék, tempomat, tolató kamera, vonóhorog, abroncsnyomás szabályozó, ABS (blokkolásgátló), AdBlue, állítható vonóhorog, ASR ,kipörgésgátló), automata hólánc, automata vonóhorog, automatizált kormányzás, gumihevederessé ,tszerelhető, iker elsőkerék, iker hátsókerék, kéz/láb vezérlés, központi zsírzó, megnövelt ,hidraulika teljesítmény, önszintezés, orr súly, összkerék kormányzás, tengelyenkénti kormányzás,tolatóradar + **Fülke** + függöny légzsák, utasoldali légzsák, vezetőoldali légzsák, biztonsági öv, bukócső, ködlámpa, xenon ,ényszóró, állítható kormány, állófűtés, centrálzár, elektromos ablak, elektromos tükör, fedélzeti ,omputer, fűthető tükör, légrugós ülés, szervokormány, színezett üveg, állítható magasságú kartámasz, ,őr belső, fellépő, fűthető ülés, hálófülke, hátsó ablaktörlő, hűtőszekrény, klimatizált ,omfortülés, komfortülés, lábtartó, megfordítható vezetőállás, munkalámpa, páncélszekrény,pneumatikus fülkefelfüggesztés, pótülés, roló, súlyhoz állítható vezetőülés, tachográf, ülésmagasság állítás, + **Multimédia / Navigáció** + CD tár, CD-s autórádió, GPS (navigáció), GPS irányítás, HIFI, rádiós magnó, TV, + **Egyéb információ** + garanciális, azonnal elvihető, bemutató jármű, jobbkormányos, rendelhető, autóbeszámítás lehetséges, ,lső tulajdonostól, keveset futott, második tulajdonostól, nem dohányzó, szervizkönyv, törzskönyv + +*** Költség nyílvántartás *** + +**I. Beszerzési szakasz** # (aktiválás előtti és aktivált tételek) +***1. Vételár és aktiválandó költségek*** +(Ezek növelik a bekerülési értéket, számviteli aktiválás alá esnek) + +Vételár (nettó/bruttó – ÁFA kezeléssel) +Regisztrációs adó +Vagyonszerzési illeték +Forgalomba helyezési díj +Eredetiségvizsgálat +Szállítási költség +Üzembe helyezési költségek +Kötelező tartozékok +Átírási költségek +Rendszám +Üzembe helyezés előtti átalakítások + +👉 Ezek képezik az aktivált bruttó értéket. + +***2. Finanszírozási költségek*** +a) Saját forrás esetén +Nincs kamatköltség +Alternatív költség (opportunity cost – kontrolling célra) +b) Hitel esetén +Tőketartozás +Kamatköltség +Kezelési költség +Szerződéskötési díj +Előtörlesztési díj +c) Lízing esetén +Zárt végű pénzügyi lízing +Nyílt végű lízing +Maradványérték +Lízingdíj tőkerésze +Lízingdíj kamatrésze + +***II. Üzemeltetési költségek*** (operatív időszak) +*1. Fix költségek* (időalapú) +Kötelező gépjármű-felelősségbiztosítás +Casco +Gépjárműadó +Cégautóadó +Teljesítményadó +Parkolási bérlet +Garázsbérlet +Úthasználati jogosultság (pl. e-matrica) +Flottakezelési díj + +*2. Változó költségek* (használatfüggő) +Üzemanyag +Elektromos töltés (EV esetén) +AdBlue +Motorolaj +Folyadékok +Autómosás +Takarítás +Gumiabroncs csere +Szezonális gumi tárolás + +*3. Karbantartás és javítás* +Tervezett karbantartás: +Időszakos szerviz +Olajcsere +Szűrők +Fékcsere +Vezérléscsere + +Nem tervezett javítás: +Meghibásodások +Baleseti javítás +Karosszéria javítás +Alkatrész csere + +*4. Egyéb üzemeltetési költségek* +Autópálya díj +Külföldi útdíj +Bírság (külön kimutatva!) +Adminisztrációs költség +GPS előfizetés +Flotta szoftver + +***III. Személyi jellegű kapcsolódó költségek*** + +Ha releváns: +Sofőr bére (ha dedikált jármű) +Járulékok +Képzés +Munkaruha + +***IV. Értékcsökkenés*** (amortizáció) + +Számviteli és adózási bontásban: +Lineáris értékcsökkenés +Maradványérték +Gyorsított leírás (ha alkalmazható) +Terven felüli értékcsökkenés (káresemény) +Ez kulcsfontosságú a valódi TCO számításához. + +***V. Káresemények és biztosítási térítések*** +Önrész +Biztosítói térítés +Totálkár elszámolás +Kártérítési bevétel + +***VI. Adózási sajátosságok*** +ÁFA levonhatóság (személyautó vs teherautó) +50%-os ÁFA szabály +Üzemanyag ÁFA kezelése +Cégautóadó negyedéves nyilvántartás +Kiküldetési rendelvény vs útnyilvántartás + +***VII. Értékesítés / Kivezetés*** +*1. Eladási bevétel* +Nettó eladási ár +ÁFA kezelése + +*2. Könyv szerinti érték* +Nettó érték (bruttó érték – halmozott amortizáció) + +*3. Eredmény* +Eladási ár – könyv szerinti érték += nyereség / veszteség + +***VIII. Mutatók (kontrolling nézőpont)*** +Járművenként számolnám: +Ft/km költség +Havi átlagköltség +Teljes élettartam költség +Értékvesztési ráta +Biztosítás/kár arány +Karbantartási ráta +Finanszírozási ráta +ROI (ha bevételtermelő eszköz) + +***IX. Nyilvántartási struktúra (adatbázis szemlélet)*** +Javasolt fő táblák: +Jármű törzsadat +Beszerzési adatok +Finanszírozás +Biztosítás +Adók +Üzemanyag +Szerviz +Javítás +Gumi nyilvántartás +Káresemény +Értékcsökkenés +Értékesítés + +***X. Speciális bontás (ha futárrendszerhez készül)*** +Mivel nálad futár rendszer is cél, külön bontanám: +Bevétel/jármű +Költség/jármű +Profit/jármű +Profit/km +Profit/óra + +*** Összegzés – Könyvelői elv *** + +A nyilvántartásnak három szintet kell kiszolgálnia: +Számvitel (jogszabályi megfelelés) +Adózás (optimalizálás) +Kontrolling (valódi nyereség számítás) \ No newline at end of file diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100755 index 0000000..a547bf3 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/frontend/.vscode/extensions.json b/frontend/.vscode/extensions.json new file mode 100755 index 0000000..a7cea0b --- /dev/null +++ b/frontend/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100755 index 0000000..65a7d71 --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,22 @@ +# 1. szakasz: Build (lefordítja a kódot) +FROM node:20-slim as build-stage +WORKDIR /app +COPY package*.json ./ +RUN npm install +COPY . . +RUN npm run build + +# 2. szakasz: Kiszolgálás (Nginx) +FROM nginx:stable-alpine as production-stage +COPY --from=build-stage /app/dist /usr/share/nginx/html +# Nginx konfiguráció, hogy kezelje a Vue router-t +RUN echo 'server { \ + listen 80; \ + location / { \ + root /usr/share/nginx/html; \ + index index.html; \ + try_files $uri $uri/ /index.html; \ + } \ +}' > /etc/nginx/conf.d/default.conf +EXPOSE 80 +CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/frontend/README.md b/frontend/README.md new file mode 100755 index 0000000..1511959 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,5 @@ +# Vue 3 + Vite + +This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 ` + + diff --git a/frontend/nginx.conf b/frontend/nginx.conf new file mode 100755 index 0000000..4e96dc5 --- /dev/null +++ b/frontend/nginx.conf @@ -0,0 +1,29 @@ +worker_processes 4; # Itt korlátozzuk a 108 helyett! + +events { + worker_connections 1024; +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + server { + listen 80; + server_name localhost; + + root /usr/share/nginx/html; # Itt keresi a fájlokat + index index.html; + + location / { + try_files $uri $uri/ /index.html; # SPA (Vue/React) támogatás + } + + # API kérések továbbküldése a backendnek (opcionális, ha a frontend kéri) + location /api/ { + proxy_pass http://service_finder_api:8000/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } + } +} \ No newline at end of file diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100755 index 0000000..44849b5 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,2971 @@ +{ + "name": "frontend", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "frontend", + "version": "0.0.0", + "dependencies": { + "@tailwindcss/postcss": "^4.1.18", + "axios": "^1.13.4", + "chart.js": "^4.5.1", + "pinia": "^3.0.4", + "vue": "^3.5.24", + "vue-chartjs": "^5.3.3", + "vue-router": "^5.0.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^6.0.1", + "autoprefixer": "^10.4.23", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.18", + "vite": "^7.2.4" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@kurkle/color": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "license": "MIT" + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz", + "integrity": "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.0.tgz", + "integrity": "sha512-tPgXB6cDTndIe1ah7u6amCI1T0SsnlOuKgg10Xh3uizJk4e5M1JGaUMk7J4ciuAUcFpbOiNhm2XIjP9ON0dUqA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.0.tgz", + "integrity": "sha512-sa4LyseLLXr1onr97StkU1Nb7fWcg6niokTwEVNOO7awaKaoRObQ54+V/hrF/BP1noMEaaAW6Fg2d/CfLiq3Mg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.0.tgz", + "integrity": "sha512-/NNIj9A7yLjKdmkx5dC2XQ9DmjIECpGpwHoGmA5E1AhU0fuICSqSWScPhN1yLCkEdkCwJIDu2xIeLPs60MNIVg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.0.tgz", + "integrity": "sha512-xoh8abqgPrPYPr7pTYipqnUi1V3em56JzE/HgDgitTqZBZ3yKCWI+7KUkceM6tNweyUKYru1UMi7FC060RyKwA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.0.tgz", + "integrity": "sha512-PCkMh7fNahWSbA0OTUQ2OpYHpjZZr0hPr8lId8twD7a7SeWrvT3xJVyza+dQwXSSq4yEQTMoXgNOfMCsn8584g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.0.tgz", + "integrity": "sha512-1j3stGx+qbhXql4OCDZhnK7b01s6rBKNybfsX+TNrEe9JNq4DLi1yGiR1xW+nL+FNVvI4D02PUnl6gJ/2y6WJA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.0.tgz", + "integrity": "sha512-eyrr5W08Ms9uM0mLcKfM/Uzx7hjhz2bcjv8P2uynfj0yU8GGPdz8iYrBPhiLOZqahoAMB8ZiolRZPbbU2MAi6Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.0.tgz", + "integrity": "sha512-Xds90ITXJCNyX9pDhqf85MKWUI4lqjiPAipJ8OLp8xqI2Ehk+TCVhF9rvOoN8xTbcafow3QOThkNnrM33uCFQA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.0.tgz", + "integrity": "sha512-Xws2KA4CLvZmXjy46SQaXSejuKPhwVdaNinldoYfqruZBaJHqVo6hnRa8SDo9z7PBW5x84SH64+izmldCgbezw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.0.tgz", + "integrity": "sha512-hrKXKbX5FdaRJj7lTMusmvKbhMJSGWJ+w++4KmjiDhpTgNlhYobMvKfDoIWecy4O60K6yA4SnztGuNTQF+Lplw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.0.tgz", + "integrity": "sha512-6A+nccfSDGKsPm00d3xKcrsBcbqzCTAukjwWK6rbuAnB2bHaL3r9720HBVZ/no7+FhZLz/U3GwwZZEh6tOSI8Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.0.tgz", + "integrity": "sha512-4P1VyYUe6XAJtQH1Hh99THxr0GKMMwIXsRNOceLrJnaHTDgk1FTcTimDgneRJPvB3LqDQxUmroBclQ1S0cIJwQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.0.tgz", + "integrity": "sha512-8Vv6pLuIZCMcgXre6c3nOPhE0gjz1+nZP6T+hwWjr7sVH8k0jRkH+XnfjjOTglyMBdSKBPPz54/y1gToSKwrSQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.0.tgz", + "integrity": "sha512-r1te1M0Sm2TBVD/RxBPC6RZVwNqUTwJTA7w+C/IW5v9Ssu6xmxWEi+iJQlpBhtUiT1raJ5b48pI8tBvEjEFnFA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.0.tgz", + "integrity": "sha512-say0uMU/RaPm3CDQLxUUTF2oNWL8ysvHkAjcCzV2znxBr23kFfaxocS9qJm+NdkRhF8wtdEEAJuYcLPhSPbjuQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.0.tgz", + "integrity": "sha512-/MU7/HizQGsnBREtRpcSbSV1zfkoxSTR7wLsRmBPQ8FwUj5sykrP1MyJTvsxP5KBq9SyE6kH8UQQQwa0ASeoQQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.0.tgz", + "integrity": "sha512-Q9eh+gUGILIHEaJf66aF6a414jQbDnn29zeu0eX3dHMuysnhTvsUvZTCAyZ6tJhUjnvzBKE4FtuaYxutxRZpOg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.0.tgz", + "integrity": "sha512-OR5p5yG5OKSxHReWmwvM0P+VTPMwoBS45PXTMYaskKQqybkS3Kmugq1W+YbNWArF8/s7jQScgzXUhArzEQ7x0A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.0.tgz", + "integrity": "sha512-XeatKzo4lHDsVEbm1XDHZlhYZZSQYym6dg2X/Ko0kSFgio+KXLsxwJQprnR48GvdIKDOpqWqssC3iBCjoMcMpw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.0.tgz", + "integrity": "sha512-Lu71y78F5qOfYmubYLHPcJm74GZLU6UJ4THkf/a1K7Tz2ycwC2VUbsqbJAXaR6Bx70SRdlVrt2+n5l7F0agTUw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.0.tgz", + "integrity": "sha512-v5xwKDWcu7qhAEcsUubiav7r+48Uk/ENWdr82MBZZRIm7zThSxCIVDfb3ZeRRq9yqk+oIzMdDo6fCcA5DHfMyA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.0.tgz", + "integrity": "sha512-XnaaaSMGSI6Wk8F4KK3QP7GfuuhjGchElsVerCplUuxRIzdvZ7hRBpLR0omCmw+kI2RFJB80nenhOoGXlJ5TfQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.0.tgz", + "integrity": "sha512-3K1lP+3BXY4t4VihLw5MEg6IZD3ojSYzqzBG571W3kNQe4G4CcFpSUQVgurYgib5d+YaCjeFow8QivWp8vuSvA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.0.tgz", + "integrity": "sha512-MDk610P/vJGc5L5ImE4k5s+GZT3en0KoK1MKPXCRgzmksAMk79j4h3k1IerxTNqwDLxsGxStEZVBqG0gIqZqoA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.0.tgz", + "integrity": "sha512-Zv7v6q6aV+VslnpwzqKAmrk5JdVkLUzok2208ZXGipjb+msxBr/fJPZyeEXiFgH7k62Ak0SLIfxQRZQvTuf7rQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", + "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", + "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-x64": "4.1.18", + "@tailwindcss/oxide-freebsd-x64": "4.1.18", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-x64-musl": "4.1.18", + "@tailwindcss/oxide-wasm32-wasi": "4.1.18", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", + "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", + "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", + "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", + "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", + "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", + "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", + "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", + "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", + "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", + "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.0", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", + "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", + "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.18.tgz", + "integrity": "sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.18", + "@tailwindcss/oxide": "4.1.18", + "postcss": "^8.4.41", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.3.tgz", + "integrity": "sha512-TlGPkLFLVOY3T7fZrwdvKpjprR3s4fxRln0ORDo1VQ7HHyxJwTlrjKU3kpVWTlaAjIEuCTokmjkZnr8Tpc925w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-beta.53" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue-macros/common": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-3.1.2.tgz", + "integrity": "sha512-h9t4ArDdniO9ekYHAD95t9AZcAbb19lEGK+26iAjUODOIJKmObDNBSe4+6ELQAA3vtYiFPPBtHh7+cQCKi3Dng==", + "license": "MIT", + "dependencies": { + "@vue/compiler-sfc": "^3.5.22", + "ast-kit": "^2.1.2", + "local-pkg": "^1.1.2", + "magic-string-ast": "^1.0.2", + "unplugin-utils": "^0.3.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/vue-macros" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.2.25" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.27.tgz", + "integrity": "sha512-gnSBQjZA+//qDZen+6a2EdHqJ68Z7uybrMf3SPjEGgG4dicklwDVmMC1AeIHxtLVPT7sn6sH1KOO+tS6gwOUeQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/shared": "3.5.27", + "entities": "^7.0.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.27.tgz", + "integrity": "sha512-oAFea8dZgCtVVVTEC7fv3T5CbZW9BxpFzGGxC79xakTr6ooeEqmRuvQydIiDAkglZEAd09LgVf1RoDnL54fu5w==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.27", + "@vue/shared": "3.5.27" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.27.tgz", + "integrity": "sha512-sHZu9QyDPeDmN/MRoshhggVOWE5WlGFStKFwu8G52swATgSny27hJRWteKDSUUzUH+wp+bmeNbhJnEAel/auUQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/compiler-core": "3.5.27", + "@vue/compiler-dom": "3.5.27", + "@vue/compiler-ssr": "3.5.27", + "@vue/shared": "3.5.27", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.27.tgz", + "integrity": "sha512-Sj7h+JHt512fV1cTxKlYhg7qxBvack+BGncSpH+8vnN+KN95iPIcqB5rsbblX40XorP+ilO7VIKlkuu3Xq2vjw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.27", + "@vue/shared": "3.5.27" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.9.tgz", + "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.9" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", + "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.9", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", + "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.27.tgz", + "integrity": "sha512-vvorxn2KXfJ0nBEnj4GYshSgsyMNFnIQah/wczXlsNXt+ijhugmW+PpJ2cNPe4V6jpnBcs0MhCODKllWG+nvoQ==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.27" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.27.tgz", + "integrity": "sha512-fxVuX/fzgzeMPn/CLQecWeDIFNt3gQVhxM0rW02Tvp/YmZfXQgcTXlakq7IMutuZ/+Ogbn+K0oct9J3JZfyk3A==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.27", + "@vue/shared": "3.5.27" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.27.tgz", + "integrity": "sha512-/QnLslQgYqSJ5aUmb5F0z0caZPGHRB8LEAQ1s81vHFM5CBfnun63rxhvE/scVb/j3TbBuoZwkJyiLCkBluMpeg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.27", + "@vue/runtime-core": "3.5.27", + "@vue/shared": "3.5.27", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.27.tgz", + "integrity": "sha512-qOz/5thjeP1vAFc4+BY3Nr6wxyLhpeQgAE/8dDtKo6a6xdk+L4W46HDZgNmLOBUDEkFXV3G7pRiUqxjX0/2zWA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.27", + "@vue/shared": "3.5.27" + }, + "peerDependencies": { + "vue": "3.5.27" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.27.tgz", + "integrity": "sha512-dXr/3CgqXsJkZ0n9F3I4elY8wM9jMJpP3pvRG52r6m0tu/MsAFIe6JpXVGeNMd/D9F4hQynWT8Rfuj0bdm9kFQ==", + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ast-kit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-2.2.0.tgz", + "integrity": "sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "pathe": "^2.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/ast-walker-scope": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.8.3.tgz", + "integrity": "sha512-cbdCP0PGOBq0ASG+sjnKIoYkWMKhhz+F/h9pRexUdX2Hd38+WOlBkRKlqkGOSm0YQpcFMQBJeK4WspUAkwsEdg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "ast-kit": "^2.1.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.23", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", + "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001760", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.4.tgz", + "integrity": "sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001766", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", + "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chart.js": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", + "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", + "license": "MIT", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", + "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", + "license": "MIT", + "dependencies": { + "is-what": "^5.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.282", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.282.tgz", + "integrity": "sha512-FCPkJtpst28UmFzd903iU7PdeVTfY0KAeJy+Lk0GLZRwgwYHn/irRcaCbQQOmr5Vytc/7rcavsYLvTM8RiHYhQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "node_modules/is-what": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", + "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/local-pkg": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magic-string-ast": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-1.0.3.tgz", + "integrity": "sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==", + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.19" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, + "node_modules/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pinia": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.4.tgz", + "integrity": "sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^7.7.7" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.5.0", + "vue": "^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.0.tgz", + "integrity": "sha512-e5lPJi/aui4TO1LpAXIRLySmwXSE8k3b9zoGfd42p67wzxog4WHjiZF3M2uheQih4DGyc25QEV4yRBbpueNiUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.57.0", + "@rollup/rollup-android-arm64": "4.57.0", + "@rollup/rollup-darwin-arm64": "4.57.0", + "@rollup/rollup-darwin-x64": "4.57.0", + "@rollup/rollup-freebsd-arm64": "4.57.0", + "@rollup/rollup-freebsd-x64": "4.57.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.0", + "@rollup/rollup-linux-arm-musleabihf": "4.57.0", + "@rollup/rollup-linux-arm64-gnu": "4.57.0", + "@rollup/rollup-linux-arm64-musl": "4.57.0", + "@rollup/rollup-linux-loong64-gnu": "4.57.0", + "@rollup/rollup-linux-loong64-musl": "4.57.0", + "@rollup/rollup-linux-ppc64-gnu": "4.57.0", + "@rollup/rollup-linux-ppc64-musl": "4.57.0", + "@rollup/rollup-linux-riscv64-gnu": "4.57.0", + "@rollup/rollup-linux-riscv64-musl": "4.57.0", + "@rollup/rollup-linux-s390x-gnu": "4.57.0", + "@rollup/rollup-linux-x64-gnu": "4.57.0", + "@rollup/rollup-linux-x64-musl": "4.57.0", + "@rollup/rollup-openbsd-x64": "4.57.0", + "@rollup/rollup-openharmony-arm64": "4.57.0", + "@rollup/rollup-win32-arm64-msvc": "4.57.0", + "@rollup/rollup-win32-ia32-msvc": "4.57.0", + "@rollup/rollup-win32-x64-gnu": "4.57.0", + "@rollup/rollup-win32-x64-msvc": "4.57.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/superjson": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", + "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", + "license": "MIT", + "dependencies": { + "copy-anything": "^4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "license": "MIT" + }, + "node_modules/unplugin": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unplugin-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.1.tgz", + "integrity": "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==", + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.27.tgz", + "integrity": "sha512-aJ/UtoEyFySPBGarREmN4z6qNKpbEguYHMmXSiOGk69czc+zhs0NF6tEFrY8TZKAl8N/LYAkd4JHVd5E/AsSmw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.27", + "@vue/compiler-sfc": "3.5.27", + "@vue/runtime-dom": "3.5.27", + "@vue/server-renderer": "3.5.27", + "@vue/shared": "3.5.27" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-chartjs": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/vue-chartjs/-/vue-chartjs-5.3.3.tgz", + "integrity": "sha512-jqxtL8KZ6YJ5NTv6XzrzLS7osyegOi28UGNZW0h9OkDL7Sh1396ht4Dorh04aKrl2LiSalQ84WtqiG0RIJb0tA==", + "license": "MIT", + "peerDependencies": { + "chart.js": "^4.1.1", + "vue": "^3.0.0-0 || ^2.7.0" + } + }, + "node_modules/vue-router": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-5.0.0.tgz", + "integrity": "sha512-xWHlps4o1ScODWqvyapl0v1uGy0g7ozmsTSO/dguyGb/9RL6oSU2HfN/8oMXnoFOH1BuTaAkbiOz4OWdkfjcZg==", + "license": "MIT", + "dependencies": { + "@babel/generator": "^7.28.6", + "@vue-macros/common": "^3.1.1", + "@vue/devtools-api": "^8.0.0", + "ast-walker-scope": "^0.8.3", + "chokidar": "^5.0.0", + "json5": "^2.2.3", + "local-pkg": "^1.1.2", + "magic-string": "^0.30.21", + "mlly": "^1.8.0", + "muggle-string": "^0.4.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "scule": "^1.3.0", + "tinyglobby": "^0.2.15", + "unplugin": "^2.3.11", + "unplugin-utils": "^0.3.1", + "yaml": "^2.8.2" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@pinia/colada": "^0.18.1", + "@vue/compiler-sfc": "^3.5.17", + "pinia": "^3.0.4", + "vue": "^3.5.0" + }, + "peerDependenciesMeta": { + "@pinia/colada": { + "optional": true + }, + "@vue/compiler-sfc": { + "optional": true + }, + "pinia": { + "optional": true + } + } + }, + "node_modules/vue-router/node_modules/@vue/devtools-api": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.0.5.tgz", + "integrity": "sha512-DgVcW8H/Nral7LgZEecYFFYXnAvGuN9C3L3DtWekAncFBedBczpNW8iHKExfaM559Zm8wQWrwtYZ9lXthEHtDw==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^8.0.5" + } + }, + "node_modules/vue-router/node_modules/@vue/devtools-kit": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.0.5.tgz", + "integrity": "sha512-q2VV6x1U3KJMTQPUlRMyWEKVbcHuxhqJdSr6Jtjz5uAThAIrfJ6WVZdGZm5cuO63ZnSUz0RCsVwiUUb0mDV0Yg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^8.0.5", + "birpc": "^2.6.1", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^2.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/vue-router/node_modules/@vue/devtools-shared": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.0.5.tgz", + "integrity": "sha512-bRLn6/spxpmgLk+iwOrR29KrYnJjG9DGpHGkDFG82UM21ZpJ39ztUT9OXX3g+usW7/b2z+h46I9ZiYyB07XMXg==", + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/vue-router/node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "license": "MIT" + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "license": "MIT" + }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100755 index 0000000..c77b525 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,27 @@ +{ + "name": "frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@tailwindcss/postcss": "^4.1.18", + "axios": "^1.13.4", + "chart.js": "^4.5.1", + "pinia": "^3.0.4", + "vue": "^3.5.24", + "vue-chartjs": "^5.3.3", + "vue-router": "^5.0.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^6.0.1", + "autoprefixer": "^10.4.23", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.18", + "vite": "^7.2.4" + } +} diff --git a/frontend/postcss.config.js b/frontend/postcss.config.js new file mode 100755 index 0000000..af9d8dc --- /dev/null +++ b/frontend/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + '@tailwindcss/postcss': {}, + autoprefixer: {}, + }, +} \ No newline at end of file diff --git a/frontend/public/vite.svg b/frontend/public/vite.svg new file mode 100755 index 0000000..e7b8dfb --- /dev/null +++ b/frontend/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/App.vue b/frontend/src/App.vue new file mode 100755 index 0000000..3e049f0 --- /dev/null +++ b/frontend/src/App.vue @@ -0,0 +1,99 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/assets/vue.svg b/frontend/src/assets/vue.svg new file mode 100755 index 0000000..770e9d3 --- /dev/null +++ b/frontend/src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/components/HelloWorld.vue b/frontend/src/components/HelloWorld.vue new file mode 100755 index 0000000..546ebbc --- /dev/null +++ b/frontend/src/components/HelloWorld.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/frontend/src/main.js b/frontend/src/main.js new file mode 100755 index 0000000..d191115 --- /dev/null +++ b/frontend/src/main.js @@ -0,0 +1,10 @@ +import { createApp } from 'vue' +import { createPinia } from 'pinia' +import router from './router' +import './style.css' +import App from './App.vue' + +const app = createApp(App) +app.use(createPinia()) +app.use(router) +app.mount('#app') \ No newline at end of file diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js new file mode 100755 index 0000000..285064c --- /dev/null +++ b/frontend/src/router/index.js @@ -0,0 +1,57 @@ +import { createRouter, createWebHistory } from 'vue-router'; + +// Nézetek importálása +import Dashboard from '../views/Dashboard.vue'; +import Expenses from '../views/Expenses.vue'; +import AddExpense from '../views/AddExpense.vue'; +import Login from '../views/Login.vue'; +import Register from '../views/Register.vue'; +import ForgotPassword from '../views/ForgotPassword.vue'; +import ResetPassword from '../views/ResetPassword.vue'; +import AddVehicle from '../views/AddVehicle.vue'; +import AdminStats from '../views/admin/AdminStats.vue'; + +const routes = [ + // Védett útvonalak + { path: '/', name: 'Dashboard', component: Dashboard, meta: { requiresAuth: true } }, + { path: '/expenses', name: 'Expenses', component: Expenses, meta: { requiresAuth: true } }, + { path: '/expenses/add', name: 'AddExpense', component: AddExpense, meta: { requiresAuth: true } }, + { path: '/vehicles/add', name: 'AddVehicle', component: AddVehicle, meta: { requiresAuth: true } }, + + // ADMIN útvonal + { + path: '/admin', + name: 'Admin', + component: AdminStats, + meta: { requiresAuth: true, requiresAdmin: true } + }, + + // Nyilvános útvonalak + { path: '/login', name: 'Login', component: Login }, + { path: '/register', name: 'Register', component: Register }, + { path: '/forgot-password', name: 'ForgotPassword', component: ForgotPassword }, + { path: '/reset-password', name: 'ResetPassword', component: ResetPassword }, +]; + +const router = createRouter({ + history: createWebHistory(), + routes +}); + +// A "SOROMPÓ" (Auth Guard) LOGIKA +router.beforeEach((to, from, next) => { + const token = localStorage.getItem('token'); + // Egyszerűsített admin check (később a JWT-ből decodoljuk) + const isAdmin = localStorage.getItem('is_admin') === 'true'; + + if (to.meta.requiresAuth && !token) { + next('/login'); + } else if (to.meta.requiresAdmin && !isAdmin) { + // Ha admin oldalra menne, de nem admin, dobja a főoldalra + next('/'); + } else { + next(); + } +}); + +export default router; \ No newline at end of file diff --git a/frontend/src/style.css b/frontend/src/style.css new file mode 100755 index 0000000..4b81c29 --- /dev/null +++ b/frontend/src/style.css @@ -0,0 +1,8 @@ +@import "tailwindcss"; + +/* Tiszta CSS-t használunk a body-hoz a hiba elkerülése végett */ +body { + background-color: #f9fafb; /* gray-50 */ + margin: 0; + font-family: sans-serif; +} \ No newline at end of file diff --git a/frontend/src/views/AddExpense.vue b/frontend/src/views/AddExpense.vue new file mode 100755 index 0000000..b59b302 --- /dev/null +++ b/frontend/src/views/AddExpense.vue @@ -0,0 +1,56 @@ + + + \ No newline at end of file diff --git a/frontend/src/views/AddVehicle.vue b/frontend/src/views/AddVehicle.vue new file mode 100755 index 0000000..62e0ca3 --- /dev/null +++ b/frontend/src/views/AddVehicle.vue @@ -0,0 +1,68 @@ + + + \ No newline at end of file diff --git a/frontend/src/views/Dashboard.vue b/frontend/src/views/Dashboard.vue new file mode 100755 index 0000000..680c4e2 --- /dev/null +++ b/frontend/src/views/Dashboard.vue @@ -0,0 +1,33 @@ + + + \ No newline at end of file diff --git a/frontend/src/views/Expenses.vue b/frontend/src/views/Expenses.vue new file mode 100755 index 0000000..87e941d --- /dev/null +++ b/frontend/src/views/Expenses.vue @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/frontend/src/views/ForgotPassword.vue b/frontend/src/views/ForgotPassword.vue new file mode 100755 index 0000000..db77b17 --- /dev/null +++ b/frontend/src/views/ForgotPassword.vue @@ -0,0 +1,33 @@ + + + \ No newline at end of file diff --git a/frontend/src/views/Login.vue b/frontend/src/views/Login.vue new file mode 100755 index 0000000..2f52e83 --- /dev/null +++ b/frontend/src/views/Login.vue @@ -0,0 +1,87 @@ + + + \ No newline at end of file diff --git a/frontend/src/views/Register.vue b/frontend/src/views/Register.vue new file mode 100755 index 0000000..8ed701a --- /dev/null +++ b/frontend/src/views/Register.vue @@ -0,0 +1,36 @@ + + + \ No newline at end of file diff --git a/frontend/src/views/ResetPassword.vue b/frontend/src/views/ResetPassword.vue new file mode 100755 index 0000000..4fabfe8 --- /dev/null +++ b/frontend/src/views/ResetPassword.vue @@ -0,0 +1,43 @@ + + + \ No newline at end of file diff --git a/frontend/src/views/admin/AdminStats.vue b/frontend/src/views/admin/AdminStats.vue new file mode 100755 index 0000000..84b8d0b --- /dev/null +++ b/frontend/src/views/admin/AdminStats.vue @@ -0,0 +1,48 @@ + \ No newline at end of file diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js new file mode 100755 index 0000000..ff48818 --- /dev/null +++ b/frontend/tailwind.config.js @@ -0,0 +1,11 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: [ + "./index.html", + "./src/**/*.{vue,js,ts,jsx,tsx}", + ], + theme: { + extend: {}, + }, + plugins: [], +} \ No newline at end of file diff --git a/frontend/vite.config.js b/frontend/vite.config.js new file mode 100755 index 0000000..bbcf80c --- /dev/null +++ b/frontend/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [vue()], +}) diff --git a/full_schema_backup_2026-02-14.sql b/full_schema_backup_2026-02-14.sql new file mode 100755 index 0000000..bd7b8e2 --- /dev/null +++ b/full_schema_backup_2026-02-14.sql @@ -0,0 +1,3437 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 15.8 +-- Dumped by pg_dump version 15.8 + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +-- +-- Name: data; Type: SCHEMA; Schema: -; Owner: service_finder_app +-- + +CREATE SCHEMA data; + + +ALTER SCHEMA data OWNER TO service_finder_app; + +-- +-- Name: public; Type: SCHEMA; Schema: -; Owner: service_finder_app +-- + +-- *not* creating schema, since initdb creates it + + +ALTER SCHEMA public OWNER TO service_finder_app; + +-- +-- Name: postgis; Type: EXTENSION; Schema: -; Owner: - +-- + +CREATE EXTENSION IF NOT EXISTS postgis WITH SCHEMA data; + + +-- +-- Name: EXTENSION postgis; Type: COMMENT; Schema: -; Owner: +-- + +COMMENT ON EXTENSION postgis IS 'PostGIS geometry and geography spatial types and functions'; + + +-- +-- Name: actionstatus; Type: TYPE; Schema: data; Owner: service_finder_app +-- + +CREATE TYPE data.actionstatus AS ENUM ( + 'pending', + 'approved', + 'rejected', + 'expired' +); + + +ALTER TYPE data.actionstatus OWNER TO service_finder_app; + +-- +-- Name: logseverity; Type: TYPE; Schema: data; Owner: kincses +-- + +CREATE TYPE data.logseverity AS ENUM ( + 'info', + 'warning', + 'critical', + 'emergency' +); + + +ALTER TYPE data.logseverity OWNER TO kincses; + +-- +-- Name: orgtype; Type: TYPE; Schema: data; Owner: service_finder_app +-- + +CREATE TYPE data.orgtype AS ENUM ( + 'individual', + 'service', + 'service_provider', + 'fleet_owner', + 'club', + 'business' +); + + +ALTER TYPE data.orgtype OWNER TO service_finder_app; + +-- +-- Name: orguserrole; Type: TYPE; Schema: data; Owner: service_finder_app +-- + +CREATE TYPE data.orguserrole AS ENUM ( + 'OWNER', + 'ADMIN', + 'FLEET_MANAGER', + 'DRIVER', + 'MECHANIC', + 'RECEPTIONIST' +); + + +ALTER TYPE data.orguserrole OWNER TO service_finder_app; + +-- +-- Name: userrole; Type: TYPE; Schema: data; Owner: service_finder_app +-- + +CREATE TYPE data.userrole AS ENUM ( + 'admin', + 'user', + 'service', + 'fleet_manager', + 'driver', + 'superadmin' +); + + +ALTER TYPE data.userrole OWNER TO service_finder_app; + +-- +-- Name: emailtype; Type: TYPE; Schema: public; Owner: kincses +-- + +CREATE TYPE public.emailtype AS ENUM ( + 'REGISTRATION', + 'PASSWORD_RESET', + 'GDPR_NOTICE' +); + + +ALTER TYPE public.emailtype OWNER TO kincses; + +-- +-- Name: orgtype; Type: TYPE; Schema: public; Owner: kincses +-- + +CREATE TYPE public.orgtype AS ENUM ( + 'PRIVATE', + 'COMPANY', + 'SERVICE' +); + + +ALTER TYPE public.orgtype OWNER TO kincses; + +-- +-- Name: orguserrole; Type: TYPE; Schema: public; Owner: kincses +-- + +CREATE TYPE public.orguserrole AS ENUM ( + 'OWNER', + 'ADMIN', + 'FLEET_MANAGER', + 'DRIVER', + 'owner', + 'manager', + 'driver', + 'service' +); + + +ALTER TYPE public.orguserrole OWNER TO kincses; + +-- +-- Name: uitheme; Type: TYPE; Schema: public; Owner: kincses +-- + +CREATE TYPE public.uitheme AS ENUM ( + 'LIGHT', + 'DARK', + 'SYSTEM' +); + + +ALTER TYPE public.uitheme OWNER TO kincses; + +-- +-- Name: userrole; Type: TYPE; Schema: public; Owner: kincses +-- + +CREATE TYPE public.userrole AS ENUM ( + 'owner_old', + 'ADMIN', + 'FLEET_MANAGER', + 'DRIVER', + 'owner', + 'admin', + 'user' +); + + +ALTER TYPE public.userrole OWNER TO kincses; + +-- +-- Name: validationstatus; Type: TYPE; Schema: public; Owner: kincses +-- + +CREATE TYPE public.validationstatus AS ENUM ( + 'NOT_VALIDATED', + 'PENDING', + 'VALIDATED', + 'REJECTED' +); + + +ALTER TYPE public.validationstatus OWNER TO kincses; + +SET default_tablespace = ''; + +SET default_table_access_method = heap; + +-- +-- Name: addresses; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.addresses ( + id uuid NOT NULL, + postal_code_id integer, + street_name character varying(200) NOT NULL, + street_type character varying(50) NOT NULL, + house_number character varying(50) NOT NULL, + stairwell character varying(20), + floor character varying(20), + door character varying(20), + parcel_id character varying(50), + full_address_text text, + created_at timestamp with time zone DEFAULT now(), + latitude double precision, + longitude double precision +); + + +ALTER TABLE data.addresses OWNER TO service_finder_app; + +-- +-- Name: asset_assignments; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.asset_assignments ( + id uuid NOT NULL, + asset_id uuid NOT NULL, + organization_id integer NOT NULL, + assigned_at timestamp with time zone DEFAULT now(), + released_at timestamp with time zone, + status character varying(30) +); + + +ALTER TABLE data.asset_assignments OWNER TO service_finder_app; + +-- +-- Name: asset_costs; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.asset_costs ( + id uuid NOT NULL, + asset_id uuid NOT NULL, + organization_id integer NOT NULL, + driver_id integer, + cost_type character varying(50) NOT NULL, + date timestamp with time zone DEFAULT now(), + mileage_at_cost integer, + data jsonb DEFAULT '{}'::jsonb, + amount_local numeric(18,2) NOT NULL, + currency_local character varying(3) NOT NULL, + amount_eur numeric(18,2), + net_amount_local numeric(18,2), + vat_rate numeric(5,2), + exchange_rate_used numeric(18,6) +); + + +ALTER TABLE data.asset_costs OWNER TO service_finder_app; + +-- +-- Name: asset_events; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.asset_events ( + id uuid NOT NULL, + asset_id uuid NOT NULL, + event_type character varying(50) NOT NULL, + recorded_mileage integer, + data jsonb DEFAULT '{}'::jsonb +); + + +ALTER TABLE data.asset_events OWNER TO service_finder_app; + +-- +-- Name: asset_financials; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.asset_financials ( + id integer NOT NULL, + asset_id uuid, + acquisition_price numeric(18,2), + acquisition_date timestamp without time zone, + financing_type character varying, + residual_value_estimate numeric(18,2) +); + + +ALTER TABLE data.asset_financials OWNER TO service_finder_app; + +-- +-- Name: asset_financials_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.asset_financials_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.asset_financials_id_seq OWNER TO service_finder_app; + +-- +-- Name: asset_financials_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.asset_financials_id_seq OWNED BY data.asset_financials.id; + + +-- +-- Name: asset_reviews; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.asset_reviews ( + id integer NOT NULL, + asset_id uuid NOT NULL, + user_id integer NOT NULL, + overall_rating integer, + criteria_scores jsonb DEFAULT '{}'::jsonb, + comment text, + created_at timestamp with time zone DEFAULT now() +); + + +ALTER TABLE data.asset_reviews OWNER TO service_finder_app; + +-- +-- Name: asset_reviews_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.asset_reviews_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.asset_reviews_id_seq OWNER TO service_finder_app; + +-- +-- Name: asset_reviews_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.asset_reviews_id_seq OWNED BY data.asset_reviews.id; + + +-- +-- Name: asset_telemetry; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.asset_telemetry ( + id integer NOT NULL, + asset_id uuid, + current_mileage integer, + mileage_unit character varying(10), + vqi_score numeric(5,2), + dbs_score numeric(5,2) +); + + +ALTER TABLE data.asset_telemetry OWNER TO service_finder_app; + +-- +-- Name: asset_telemetry_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.asset_telemetry_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.asset_telemetry_id_seq OWNER TO service_finder_app; + +-- +-- Name: asset_telemetry_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.asset_telemetry_id_seq OWNED BY data.asset_telemetry.id; + + +-- +-- Name: assets; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.assets ( + id uuid NOT NULL, + vin character varying(17) NOT NULL, + license_plate character varying(20), + name character varying, + year_of_manufacture integer, + catalog_id integer, + is_verified boolean, + status character varying(20), + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone, + current_organization_id integer, + verification_method character varying(20), + verification_notes text, + catalog_match_score numeric(5,2) +); + + +ALTER TABLE data.assets OWNER TO service_finder_app; + +-- +-- Name: audit_logs; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.audit_logs ( + id integer NOT NULL, + user_id integer, + target_type character varying, + target_id character varying, + action character varying NOT NULL, + "timestamp" timestamp with time zone DEFAULT now(), + severity data.logseverity NOT NULL, + old_data json, + new_data json, + ip_address character varying(45), + user_agent text +); + + +ALTER TABLE data.audit_logs OWNER TO service_finder_app; + +-- +-- Name: audit_logs_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.audit_logs_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.audit_logs_id_seq OWNER TO service_finder_app; + +-- +-- Name: audit_logs_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.audit_logs_id_seq OWNED BY data.audit_logs.id; + + +-- +-- Name: badges; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.badges ( + id integer NOT NULL, + name character varying NOT NULL, + description character varying NOT NULL, + icon_url character varying +); + + +ALTER TABLE data.badges OWNER TO service_finder_app; + +-- +-- Name: badges_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.badges_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.badges_id_seq OWNER TO service_finder_app; + +-- +-- Name: badges_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.badges_id_seq OWNED BY data.badges.id; + + +-- +-- Name: credit_logs; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.credit_logs ( + id integer NOT NULL, + org_id integer, + amount numeric(10,2), + description character varying, + created_at timestamp without time zone DEFAULT now() +); + + +ALTER TABLE data.credit_logs OWNER TO service_finder_app; + +-- +-- Name: credit_logs_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.credit_logs_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.credit_logs_id_seq OWNER TO service_finder_app; + +-- +-- Name: credit_logs_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.credit_logs_id_seq OWNED BY data.credit_logs.id; + + +-- +-- Name: documents; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.documents ( + id uuid NOT NULL, + parent_type character varying(20) NOT NULL, + parent_id character varying(50) NOT NULL, + doc_type character varying(50), + original_name character varying(255) NOT NULL, + file_hash character varying(64) NOT NULL, + file_ext character varying(10), + mime_type character varying(100), + file_size integer, + has_thumbnail boolean, + thumbnail_path character varying(255), + uploaded_by integer, + created_at timestamp with time zone DEFAULT now() +); + + +ALTER TABLE data.documents OWNER TO service_finder_app; + +-- +-- Name: exchange_rates; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.exchange_rates ( + id integer NOT NULL, + base_currency character varying(3), + target_currency character varying(3), + rate numeric(18,6) NOT NULL +); + + +ALTER TABLE data.exchange_rates OWNER TO service_finder_app; + +-- +-- Name: exchange_rates_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.exchange_rates_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.exchange_rates_id_seq OWNER TO service_finder_app; + +-- +-- Name: exchange_rates_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.exchange_rates_id_seq OWNED BY data.exchange_rates.id; + + +-- +-- Name: expertise_tags; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.expertise_tags ( + id integer NOT NULL, + key character varying(50), + name_hu character varying(100), + category character varying(30) +); + + +ALTER TABLE data.expertise_tags OWNER TO service_finder_app; + +-- +-- Name: expertise_tags_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.expertise_tags_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.expertise_tags_id_seq OWNER TO service_finder_app; + +-- +-- Name: expertise_tags_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.expertise_tags_id_seq OWNED BY data.expertise_tags.id; + + +-- +-- Name: geo_postal_codes; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.geo_postal_codes ( + id integer NOT NULL, + country_code character varying(5), + zip_code character varying(10) NOT NULL, + city character varying(100) NOT NULL +); + + +ALTER TABLE data.geo_postal_codes OWNER TO service_finder_app; + +-- +-- Name: geo_postal_codes_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.geo_postal_codes_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.geo_postal_codes_id_seq OWNER TO service_finder_app; + +-- +-- Name: geo_postal_codes_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.geo_postal_codes_id_seq OWNED BY data.geo_postal_codes.id; + + +-- +-- Name: geo_street_types; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.geo_street_types ( + id integer NOT NULL, + name character varying(50) NOT NULL +); + + +ALTER TABLE data.geo_street_types OWNER TO service_finder_app; + +-- +-- Name: geo_street_types_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.geo_street_types_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.geo_street_types_id_seq OWNER TO service_finder_app; + +-- +-- Name: geo_street_types_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.geo_street_types_id_seq OWNED BY data.geo_street_types.id; + + +-- +-- Name: geo_streets; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.geo_streets ( + id integer NOT NULL, + postal_code_id integer, + name character varying(200) NOT NULL +); + + +ALTER TABLE data.geo_streets OWNER TO service_finder_app; + +-- +-- Name: geo_streets_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.geo_streets_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.geo_streets_id_seq OWNER TO service_finder_app; + +-- +-- Name: geo_streets_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.geo_streets_id_seq OWNED BY data.geo_streets.id; + + +-- +-- Name: level_configs; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.level_configs ( + id integer NOT NULL, + level_number integer NOT NULL, + min_points integer NOT NULL, + rank_name character varying NOT NULL +); + + +ALTER TABLE data.level_configs OWNER TO service_finder_app; + +-- +-- Name: level_configs_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.level_configs_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.level_configs_id_seq OWNER TO service_finder_app; + +-- +-- Name: level_configs_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.level_configs_id_seq OWNED BY data.level_configs.id; + + +-- +-- Name: org_subscriptions; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.org_subscriptions ( + id integer NOT NULL, + org_id integer, + tier_id integer, + valid_from timestamp without time zone DEFAULT now(), + valid_until timestamp without time zone, + is_active boolean +); + + +ALTER TABLE data.org_subscriptions OWNER TO service_finder_app; + +-- +-- Name: org_subscriptions_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.org_subscriptions_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.org_subscriptions_id_seq OWNER TO service_finder_app; + +-- +-- Name: org_subscriptions_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.org_subscriptions_id_seq OWNED BY data.org_subscriptions.id; + + +-- +-- Name: organization_financials; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.organization_financials ( + id integer NOT NULL, + organization_id integer NOT NULL, + year integer NOT NULL, + turnover numeric(18,2), + profit numeric(18,2), + employee_count integer, + source character varying(50), + updated_at timestamp with time zone DEFAULT now() +); + + +ALTER TABLE data.organization_financials OWNER TO service_finder_app; + +-- +-- Name: organization_financials_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.organization_financials_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.organization_financials_id_seq OWNER TO service_finder_app; + +-- +-- Name: organization_financials_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.organization_financials_id_seq OWNED BY data.organization_financials.id; + + +-- +-- Name: organization_members; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.organization_members ( + id integer NOT NULL, + organization_id integer NOT NULL, + user_id integer, + role data.orguserrole, + permissions json DEFAULT '{}'::jsonb, + person_id bigint, + is_permanent boolean, + is_verified boolean +); + + +ALTER TABLE data.organization_members OWNER TO service_finder_app; + +-- +-- Name: organization_members_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.organization_members_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.organization_members_id_seq OWNER TO service_finder_app; + +-- +-- Name: organization_members_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.organization_members_id_seq OWNED BY data.organization_members.id; + + +-- +-- Name: organizations; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.organizations ( + id integer NOT NULL, + address_id uuid, + full_name character varying NOT NULL, + name character varying NOT NULL, + display_name character varying(50), + default_currency character varying(3), + country_code character varying(2), + language character varying(5), + address_zip character varying(10), + address_city character varying(100), + address_street_name character varying(150), + address_street_type character varying(50), + address_house_number character varying(20), + address_hrsz character varying(50), + tax_number character varying(20), + reg_number character varying(50), + org_type data.orgtype, + status character varying(30), + is_deleted boolean, + notification_settings json DEFAULT '{"notify_owner": true, "alert_days_before": [30, 15, 7, 1]}'::jsonb, + external_integration_config json DEFAULT '{}'::jsonb, + owner_id integer, + is_active boolean, + is_verified boolean, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone, + folder_slug character varying(12) +); + + +ALTER TABLE data.organizations OWNER TO service_finder_app; + +-- +-- Name: organizations_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.organizations_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.organizations_id_seq OWNER TO service_finder_app; + +-- +-- Name: organizations_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.organizations_id_seq OWNED BY data.organizations.id; + + +-- +-- Name: pending_actions; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.pending_actions ( + id integer NOT NULL, + requester_id integer NOT NULL, + approver_id integer, + status data.actionstatus NOT NULL, + action_type character varying(50) NOT NULL, + payload json NOT NULL, + reason character varying(255) NOT NULL, + created_at timestamp with time zone DEFAULT now(), + expires_at timestamp with time zone, + processed_at timestamp with time zone +); + + +ALTER TABLE data.pending_actions OWNER TO service_finder_app; + +-- +-- Name: pending_actions_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.pending_actions_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.pending_actions_id_seq OWNER TO service_finder_app; + +-- +-- Name: pending_actions_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.pending_actions_id_seq OWNED BY data.pending_actions.id; + + +-- +-- Name: persons; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.persons ( + id bigint NOT NULL, + id_uuid uuid NOT NULL, + address_id uuid, + last_name character varying NOT NULL, + first_name character varying NOT NULL, + phone character varying, + identity_docs json DEFAULT '{}'::jsonb, + is_active boolean NOT NULL, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone, + mothers_last_name character varying, + mothers_first_name character varying, + birth_place character varying, + birth_date timestamp without time zone, + ice_contact json DEFAULT '{}'::jsonb, + is_ghost boolean DEFAULT true NOT NULL +); + + +ALTER TABLE data.persons OWNER TO service_finder_app; + +-- +-- Name: persons_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.persons_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.persons_id_seq OWNER TO service_finder_app; + +-- +-- Name: persons_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.persons_id_seq OWNED BY data.persons.id; + + +-- +-- Name: point_rules; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.point_rules ( + id integer NOT NULL, + action_key character varying NOT NULL, + points integer NOT NULL, + description character varying, + is_active boolean NOT NULL +); + + +ALTER TABLE data.point_rules OWNER TO service_finder_app; + +-- +-- Name: point_rules_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.point_rules_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.point_rules_id_seq OWNER TO service_finder_app; + +-- +-- Name: point_rules_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.point_rules_id_seq OWNED BY data.point_rules.id; + + +-- +-- Name: points_ledger; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.points_ledger ( + id integer NOT NULL, + user_id integer NOT NULL, + points integer NOT NULL, + reason character varying NOT NULL, + created_at timestamp without time zone NOT NULL, + penalty_change integer DEFAULT 0 NOT NULL +); + + +ALTER TABLE data.points_ledger OWNER TO service_finder_app; + +-- +-- Name: points_ledger_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.points_ledger_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.points_ledger_id_seq OWNER TO service_finder_app; + +-- +-- Name: points_ledger_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.points_ledger_id_seq OWNED BY data.points_ledger.id; + + +-- +-- Name: ratings; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.ratings ( + id uuid NOT NULL, + author_id integer NOT NULL, + target_type character varying(20) NOT NULL, + target_id uuid NOT NULL, + score integer NOT NULL, + comment character varying +); + + +ALTER TABLE data.ratings OWNER TO service_finder_app; + +-- +-- Name: regional_settings; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.regional_settings ( + id integer NOT NULL, + country_code character varying NOT NULL, + currency character varying NOT NULL, + is_active boolean NOT NULL +); + + +ALTER TABLE data.regional_settings OWNER TO service_finder_app; + +-- +-- Name: regional_settings_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.regional_settings_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.regional_settings_id_seq OWNER TO service_finder_app; + +-- +-- Name: regional_settings_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.regional_settings_id_seq OWNED BY data.regional_settings.id; + + +-- +-- Name: service_expertises; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.service_expertises ( + service_id integer NOT NULL, + expertise_id integer NOT NULL, + validation_level integer DEFAULT 0 +); + + +ALTER TABLE data.service_expertises OWNER TO service_finder_app; + +-- +-- Name: service_profiles; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.service_profiles ( + id integer NOT NULL, + organization_id integer, + location data.geometry(Point,4326), + trust_score integer DEFAULT 30, + is_verified boolean DEFAULT false, + verification_log json DEFAULT '{}'::jsonb, + opening_hours json DEFAULT '{}'::jsonb, + contact_phone character varying, + website character varying, + bio text, + status character varying(20) DEFAULT 'ghost'::character varying, + last_audit_at timestamp with time zone DEFAULT now(), + google_place_id character varying(100), + rating double precision, + user_ratings_total integer, + specialization_tags jsonb DEFAULT '{}'::jsonb +); + + +ALTER TABLE data.service_profiles OWNER TO service_finder_app; + +-- +-- Name: service_profiles_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.service_profiles_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.service_profiles_id_seq OWNER TO service_finder_app; + +-- +-- Name: service_profiles_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.service_profiles_id_seq OWNED BY data.service_profiles.id; + + +-- +-- Name: service_specialties; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.service_specialties ( + id integer NOT NULL, + parent_id integer, + name character varying NOT NULL, + slug character varying +); + + +ALTER TABLE data.service_specialties OWNER TO service_finder_app; + +-- +-- Name: service_specialties_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.service_specialties_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.service_specialties_id_seq OWNER TO service_finder_app; + +-- +-- Name: service_specialties_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.service_specialties_id_seq OWNED BY data.service_specialties.id; + + +-- +-- Name: social_accounts; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.social_accounts ( + id integer NOT NULL, + user_id integer NOT NULL, + provider character varying(50) NOT NULL, + social_id character varying(255) NOT NULL, + email character varying(255) NOT NULL, + extra_data json DEFAULT '{}'::jsonb, + created_at timestamp with time zone DEFAULT now() +); + + +ALTER TABLE data.social_accounts OWNER TO service_finder_app; + +-- +-- Name: social_accounts_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.social_accounts_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.social_accounts_id_seq OWNER TO service_finder_app; + +-- +-- Name: social_accounts_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.social_accounts_id_seq OWNED BY data.social_accounts.id; + + +-- +-- Name: subscription_tiers; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.subscription_tiers ( + id integer NOT NULL, + name character varying, + rules json, + is_custom boolean +); + + +ALTER TABLE data.subscription_tiers OWNER TO service_finder_app; + +-- +-- Name: subscription_tiers_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.subscription_tiers_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.subscription_tiers_id_seq OWNER TO service_finder_app; + +-- +-- Name: subscription_tiers_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.subscription_tiers_id_seq OWNED BY data.subscription_tiers.id; + + +-- +-- Name: system_parameters; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.system_parameters ( + key character varying(50) NOT NULL, + value json NOT NULL, + is_active boolean, + description character varying, + updated_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP +); + + +ALTER TABLE data.system_parameters OWNER TO service_finder_app; + +-- +-- Name: translations; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.translations ( + id integer NOT NULL, + key character varying(100) NOT NULL, + lang_code character varying(5) NOT NULL, + value text NOT NULL, + is_published boolean +); + + +ALTER TABLE data.translations OWNER TO service_finder_app; + +-- +-- Name: translations_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.translations_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.translations_id_seq OWNER TO service_finder_app; + +-- +-- Name: translations_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.translations_id_seq OWNED BY data.translations.id; + + +-- +-- Name: user_badges; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.user_badges ( + id integer NOT NULL, + user_id integer NOT NULL, + badge_id integer NOT NULL, + earned_at timestamp without time zone NOT NULL +); + + +ALTER TABLE data.user_badges OWNER TO service_finder_app; + +-- +-- Name: user_badges_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.user_badges_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.user_badges_id_seq OWNER TO service_finder_app; + +-- +-- Name: user_badges_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.user_badges_id_seq OWNED BY data.user_badges.id; + + +-- +-- Name: user_stats; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.user_stats ( + user_id integer NOT NULL, + total_xp integer NOT NULL, + social_points integer NOT NULL, + current_level integer NOT NULL, + updated_at timestamp without time zone NOT NULL, + penalty_points integer DEFAULT 0 NOT NULL, + restriction_level integer DEFAULT 0 NOT NULL +); + + +ALTER TABLE data.user_stats OWNER TO service_finder_app; + +-- +-- Name: users; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.users ( + id integer NOT NULL, + email character varying NOT NULL, + hashed_password character varying, + role data.userrole, + is_active boolean, + is_deleted boolean, + person_id bigint, + created_at timestamp with time zone DEFAULT now(), + scope_level character varying(30) DEFAULT 'individual'::character varying, + scope_id character varying(50), + custom_permissions json DEFAULT '{}'::jsonb, + preferred_language character varying(5) DEFAULT 'hu'::character varying, + region_code character varying(5) DEFAULT 'HU'::character varying, + folder_slug character varying(12), + refresh_token_hash character varying(255), + two_factor_secret character varying(100), + two_factor_enabled boolean, + preferred_currency character varying(3) DEFAULT 'HUF'::character varying +); + + +ALTER TABLE data.users OWNER TO service_finder_app; + +-- +-- Name: users_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.users_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.users_id_seq OWNER TO service_finder_app; + +-- +-- Name: users_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.users_id_seq OWNED BY data.users.id; + + +-- +-- Name: vehicle_catalog; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.vehicle_catalog ( + id integer NOT NULL, + make character varying NOT NULL, + model character varying NOT NULL, + generation character varying, + year_from integer, + year_to integer, + vehicle_class character varying, + fuel_type character varying, + engine_code character varying, + factory_data jsonb DEFAULT '{}'::jsonb, + engine_variant character varying +); + + +ALTER TABLE data.vehicle_catalog OWNER TO service_finder_app; + +-- +-- Name: vehicle_catalog_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.vehicle_catalog_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.vehicle_catalog_id_seq OWNER TO service_finder_app; + +-- +-- Name: vehicle_catalog_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.vehicle_catalog_id_seq OWNED BY data.vehicle_catalog.id; + + +-- +-- Name: vehicle_ownerships; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.vehicle_ownerships ( + id integer NOT NULL, + vehicle_id uuid NOT NULL, + user_id integer NOT NULL, + start_date date NOT NULL, + end_date date, + notes text +); + + +ALTER TABLE data.vehicle_ownerships OWNER TO service_finder_app; + +-- +-- Name: vehicle_ownerships_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.vehicle_ownerships_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.vehicle_ownerships_id_seq OWNER TO service_finder_app; + +-- +-- Name: vehicle_ownerships_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.vehicle_ownerships_id_seq OWNED BY data.vehicle_ownerships.id; + + +-- +-- Name: verification_tokens; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.verification_tokens ( + id integer NOT NULL, + token uuid NOT NULL, + user_id integer NOT NULL, + token_type character varying(20) NOT NULL, + created_at timestamp with time zone DEFAULT now(), + expires_at timestamp with time zone NOT NULL, + is_used boolean +); + + +ALTER TABLE data.verification_tokens OWNER TO service_finder_app; + +-- +-- Name: verification_tokens_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.verification_tokens_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.verification_tokens_id_seq OWNER TO service_finder_app; + +-- +-- Name: verification_tokens_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.verification_tokens_id_seq OWNED BY data.verification_tokens.id; + + +-- +-- Name: wallets; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.wallets ( + id integer NOT NULL, + user_id integer, + coin_balance numeric(18,2), + credit_balance numeric(18,2), + currency character varying(3) +); + + +ALTER TABLE data.wallets OWNER TO service_finder_app; + +-- +-- Name: wallets_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.wallets_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.wallets_id_seq OWNER TO service_finder_app; + +-- +-- Name: wallets_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.wallets_id_seq OWNED BY data.wallets.id; + + +-- +-- Name: alembic_version; Type: TABLE; Schema: public; Owner: service_finder_app +-- + +CREATE TABLE public.alembic_version ( + version_num character varying(32) NOT NULL +); + + +ALTER TABLE public.alembic_version OWNER TO service_finder_app; + +-- +-- Name: asset_financials id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_financials ALTER COLUMN id SET DEFAULT nextval('data.asset_financials_id_seq'::regclass); + + +-- +-- Name: asset_reviews id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_reviews ALTER COLUMN id SET DEFAULT nextval('data.asset_reviews_id_seq'::regclass); + + +-- +-- Name: asset_telemetry id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_telemetry ALTER COLUMN id SET DEFAULT nextval('data.asset_telemetry_id_seq'::regclass); + + +-- +-- Name: audit_logs id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.audit_logs ALTER COLUMN id SET DEFAULT nextval('data.audit_logs_id_seq'::regclass); + + +-- +-- Name: badges id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.badges ALTER COLUMN id SET DEFAULT nextval('data.badges_id_seq'::regclass); + + +-- +-- Name: credit_logs id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.credit_logs ALTER COLUMN id SET DEFAULT nextval('data.credit_logs_id_seq'::regclass); + + +-- +-- Name: exchange_rates id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.exchange_rates ALTER COLUMN id SET DEFAULT nextval('data.exchange_rates_id_seq'::regclass); + + +-- +-- Name: expertise_tags id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.expertise_tags ALTER COLUMN id SET DEFAULT nextval('data.expertise_tags_id_seq'::regclass); + + +-- +-- Name: geo_postal_codes id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.geo_postal_codes ALTER COLUMN id SET DEFAULT nextval('data.geo_postal_codes_id_seq'::regclass); + + +-- +-- Name: geo_street_types id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.geo_street_types ALTER COLUMN id SET DEFAULT nextval('data.geo_street_types_id_seq'::regclass); + + +-- +-- Name: geo_streets id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.geo_streets ALTER COLUMN id SET DEFAULT nextval('data.geo_streets_id_seq'::regclass); + + +-- +-- Name: level_configs id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.level_configs ALTER COLUMN id SET DEFAULT nextval('data.level_configs_id_seq'::regclass); + + +-- +-- Name: org_subscriptions id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.org_subscriptions ALTER COLUMN id SET DEFAULT nextval('data.org_subscriptions_id_seq'::regclass); + + +-- +-- Name: organization_financials id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.organization_financials ALTER COLUMN id SET DEFAULT nextval('data.organization_financials_id_seq'::regclass); + + +-- +-- Name: organization_members id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.organization_members ALTER COLUMN id SET DEFAULT nextval('data.organization_members_id_seq'::regclass); + + +-- +-- Name: organizations id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.organizations ALTER COLUMN id SET DEFAULT nextval('data.organizations_id_seq'::regclass); + + +-- +-- Name: pending_actions id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.pending_actions ALTER COLUMN id SET DEFAULT nextval('data.pending_actions_id_seq'::regclass); + + +-- +-- Name: persons id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.persons ALTER COLUMN id SET DEFAULT nextval('data.persons_id_seq'::regclass); + + +-- +-- Name: point_rules id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.point_rules ALTER COLUMN id SET DEFAULT nextval('data.point_rules_id_seq'::regclass); + + +-- +-- Name: points_ledger id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.points_ledger ALTER COLUMN id SET DEFAULT nextval('data.points_ledger_id_seq'::regclass); + + +-- +-- Name: regional_settings id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.regional_settings ALTER COLUMN id SET DEFAULT nextval('data.regional_settings_id_seq'::regclass); + + +-- +-- Name: service_profiles id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_profiles ALTER COLUMN id SET DEFAULT nextval('data.service_profiles_id_seq'::regclass); + + +-- +-- Name: service_specialties id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_specialties ALTER COLUMN id SET DEFAULT nextval('data.service_specialties_id_seq'::regclass); + + +-- +-- Name: social_accounts id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.social_accounts ALTER COLUMN id SET DEFAULT nextval('data.social_accounts_id_seq'::regclass); + + +-- +-- Name: subscription_tiers id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.subscription_tiers ALTER COLUMN id SET DEFAULT nextval('data.subscription_tiers_id_seq'::regclass); + + +-- +-- Name: translations id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.translations ALTER COLUMN id SET DEFAULT nextval('data.translations_id_seq'::regclass); + + +-- +-- Name: user_badges id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.user_badges ALTER COLUMN id SET DEFAULT nextval('data.user_badges_id_seq'::regclass); + + +-- +-- Name: users id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.users ALTER COLUMN id SET DEFAULT nextval('data.users_id_seq'::regclass); + + +-- +-- Name: vehicle_catalog id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.vehicle_catalog ALTER COLUMN id SET DEFAULT nextval('data.vehicle_catalog_id_seq'::regclass); + + +-- +-- Name: vehicle_ownerships id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.vehicle_ownerships ALTER COLUMN id SET DEFAULT nextval('data.vehicle_ownerships_id_seq'::regclass); + + +-- +-- Name: verification_tokens id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.verification_tokens ALTER COLUMN id SET DEFAULT nextval('data.verification_tokens_id_seq'::regclass); + + +-- +-- Name: wallets id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.wallets ALTER COLUMN id SET DEFAULT nextval('data.wallets_id_seq'::regclass); + + +-- +-- Name: addresses addresses_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.addresses + ADD CONSTRAINT addresses_pkey PRIMARY KEY (id); + + +-- +-- Name: asset_assignments asset_assignments_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_assignments + ADD CONSTRAINT asset_assignments_pkey PRIMARY KEY (id); + + +-- +-- Name: asset_costs asset_costs_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_costs + ADD CONSTRAINT asset_costs_pkey PRIMARY KEY (id); + + +-- +-- Name: asset_events asset_events_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_events + ADD CONSTRAINT asset_events_pkey PRIMARY KEY (id); + + +-- +-- Name: asset_financials asset_financials_asset_id_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_financials + ADD CONSTRAINT asset_financials_asset_id_key UNIQUE (asset_id); + + +-- +-- Name: asset_financials asset_financials_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_financials + ADD CONSTRAINT asset_financials_pkey PRIMARY KEY (id); + + +-- +-- Name: asset_reviews asset_reviews_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_reviews + ADD CONSTRAINT asset_reviews_pkey PRIMARY KEY (id); + + +-- +-- Name: asset_telemetry asset_telemetry_asset_id_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_telemetry + ADD CONSTRAINT asset_telemetry_asset_id_key UNIQUE (asset_id); + + +-- +-- Name: asset_telemetry asset_telemetry_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_telemetry + ADD CONSTRAINT asset_telemetry_pkey PRIMARY KEY (id); + + +-- +-- Name: assets assets_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.assets + ADD CONSTRAINT assets_pkey PRIMARY KEY (id); + + +-- +-- Name: audit_logs audit_logs_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.audit_logs + ADD CONSTRAINT audit_logs_pkey PRIMARY KEY (id); + + +-- +-- Name: badges badges_name_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.badges + ADD CONSTRAINT badges_name_key UNIQUE (name); + + +-- +-- Name: badges badges_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.badges + ADD CONSTRAINT badges_pkey PRIMARY KEY (id); + + +-- +-- Name: credit_logs credit_logs_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.credit_logs + ADD CONSTRAINT credit_logs_pkey PRIMARY KEY (id); + + +-- +-- Name: documents documents_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.documents + ADD CONSTRAINT documents_pkey PRIMARY KEY (id); + + +-- +-- Name: exchange_rates exchange_rates_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.exchange_rates + ADD CONSTRAINT exchange_rates_pkey PRIMARY KEY (id); + + +-- +-- Name: exchange_rates exchange_rates_target_currency_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.exchange_rates + ADD CONSTRAINT exchange_rates_target_currency_key UNIQUE (target_currency); + + +-- +-- Name: expertise_tags expertise_tags_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.expertise_tags + ADD CONSTRAINT expertise_tags_pkey PRIMARY KEY (id); + + +-- +-- Name: geo_postal_codes geo_postal_codes_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.geo_postal_codes + ADD CONSTRAINT geo_postal_codes_pkey PRIMARY KEY (id); + + +-- +-- Name: geo_street_types geo_street_types_name_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.geo_street_types + ADD CONSTRAINT geo_street_types_name_key UNIQUE (name); + + +-- +-- Name: geo_street_types geo_street_types_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.geo_street_types + ADD CONSTRAINT geo_street_types_pkey PRIMARY KEY (id); + + +-- +-- Name: geo_streets geo_streets_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.geo_streets + ADD CONSTRAINT geo_streets_pkey PRIMARY KEY (id); + + +-- +-- Name: level_configs level_configs_level_number_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.level_configs + ADD CONSTRAINT level_configs_level_number_key UNIQUE (level_number); + + +-- +-- Name: level_configs level_configs_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.level_configs + ADD CONSTRAINT level_configs_pkey PRIMARY KEY (id); + + +-- +-- Name: org_subscriptions org_subscriptions_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.org_subscriptions + ADD CONSTRAINT org_subscriptions_pkey PRIMARY KEY (id); + + +-- +-- Name: organization_financials organization_financials_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.organization_financials + ADD CONSTRAINT organization_financials_pkey PRIMARY KEY (id); + + +-- +-- Name: organization_members organization_members_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.organization_members + ADD CONSTRAINT organization_members_pkey PRIMARY KEY (id); + + +-- +-- Name: organizations organizations_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.organizations + ADD CONSTRAINT organizations_pkey PRIMARY KEY (id); + + +-- +-- Name: pending_actions pending_actions_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.pending_actions + ADD CONSTRAINT pending_actions_pkey PRIMARY KEY (id); + + +-- +-- Name: persons persons_id_uuid_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.persons + ADD CONSTRAINT persons_id_uuid_key UNIQUE (id_uuid); + + +-- +-- Name: persons persons_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.persons + ADD CONSTRAINT persons_pkey PRIMARY KEY (id); + + +-- +-- Name: point_rules point_rules_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.point_rules + ADD CONSTRAINT point_rules_pkey PRIMARY KEY (id); + + +-- +-- Name: points_ledger points_ledger_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.points_ledger + ADD CONSTRAINT points_ledger_pkey PRIMARY KEY (id); + + +-- +-- Name: ratings ratings_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.ratings + ADD CONSTRAINT ratings_pkey PRIMARY KEY (id); + + +-- +-- Name: regional_settings regional_settings_country_code_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.regional_settings + ADD CONSTRAINT regional_settings_country_code_key UNIQUE (country_code); + + +-- +-- Name: regional_settings regional_settings_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.regional_settings + ADD CONSTRAINT regional_settings_pkey PRIMARY KEY (id); + + +-- +-- Name: service_expertises service_expertises_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_expertises + ADD CONSTRAINT service_expertises_pkey PRIMARY KEY (service_id, expertise_id); + + +-- +-- Name: service_profiles service_profiles_google_place_id_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_profiles + ADD CONSTRAINT service_profiles_google_place_id_key UNIQUE (google_place_id); + + +-- +-- Name: service_profiles service_profiles_organization_id_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_profiles + ADD CONSTRAINT service_profiles_organization_id_key UNIQUE (organization_id); + + +-- +-- Name: service_profiles service_profiles_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_profiles + ADD CONSTRAINT service_profiles_pkey PRIMARY KEY (id); + + +-- +-- Name: service_specialties service_specialties_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_specialties + ADD CONSTRAINT service_specialties_pkey PRIMARY KEY (id); + + +-- +-- Name: service_specialties service_specialties_slug_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_specialties + ADD CONSTRAINT service_specialties_slug_key UNIQUE (slug); + + +-- +-- Name: social_accounts social_accounts_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.social_accounts + ADD CONSTRAINT social_accounts_pkey PRIMARY KEY (id); + + +-- +-- Name: subscription_tiers subscription_tiers_name_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.subscription_tiers + ADD CONSTRAINT subscription_tiers_name_key UNIQUE (name); + + +-- +-- Name: subscription_tiers subscription_tiers_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.subscription_tiers + ADD CONSTRAINT subscription_tiers_pkey PRIMARY KEY (id); + + +-- +-- Name: system_parameters system_parameters_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.system_parameters + ADD CONSTRAINT system_parameters_pkey PRIMARY KEY (key); + + +-- +-- Name: translations translations_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.translations + ADD CONSTRAINT translations_pkey PRIMARY KEY (id); + + +-- +-- Name: social_accounts uix_social_provider_id; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.social_accounts + ADD CONSTRAINT uix_social_provider_id UNIQUE (provider, social_id); + + +-- +-- Name: vehicle_catalog uix_vehicle_catalog_full; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.vehicle_catalog + ADD CONSTRAINT uix_vehicle_catalog_full UNIQUE (make, model, year_from, engine_variant, fuel_type); + + +-- +-- Name: translations uq_translation_key_lang; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.translations + ADD CONSTRAINT uq_translation_key_lang UNIQUE (key, lang_code); + + +-- +-- Name: user_badges user_badges_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.user_badges + ADD CONSTRAINT user_badges_pkey PRIMARY KEY (id); + + +-- +-- Name: user_stats user_stats_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.user_stats + ADD CONSTRAINT user_stats_pkey PRIMARY KEY (user_id); + + +-- +-- Name: users users_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.users + ADD CONSTRAINT users_pkey PRIMARY KEY (id); + + +-- +-- Name: vehicle_catalog vehicle_catalog_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.vehicle_catalog + ADD CONSTRAINT vehicle_catalog_pkey PRIMARY KEY (id); + + +-- +-- Name: vehicle_ownerships vehicle_ownerships_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.vehicle_ownerships + ADD CONSTRAINT vehicle_ownerships_pkey PRIMARY KEY (id); + + +-- +-- Name: verification_tokens verification_tokens_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.verification_tokens + ADD CONSTRAINT verification_tokens_pkey PRIMARY KEY (id); + + +-- +-- Name: verification_tokens verification_tokens_token_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.verification_tokens + ADD CONSTRAINT verification_tokens_token_key UNIQUE (token); + + +-- +-- Name: wallets wallets_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.wallets + ADD CONSTRAINT wallets_pkey PRIMARY KEY (id); + + +-- +-- Name: wallets wallets_user_id_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.wallets + ADD CONSTRAINT wallets_user_id_key UNIQUE (user_id); + + +-- +-- Name: alembic_version alembic_version_pkc; Type: CONSTRAINT; Schema: public; Owner: service_finder_app +-- + +ALTER TABLE ONLY public.alembic_version + ADD CONSTRAINT alembic_version_pkc PRIMARY KEY (version_num); + + +-- +-- Name: idx_service_profiles_location; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX idx_service_profiles_location ON data.service_profiles USING gist (location); + + +-- +-- Name: ix_data_assets_license_plate; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_assets_license_plate ON data.assets USING btree (license_plate); + + +-- +-- Name: ix_data_assets_vin; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE UNIQUE INDEX ix_data_assets_vin ON data.assets USING btree (vin); + + +-- +-- Name: ix_data_audit_logs_action; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_audit_logs_action ON data.audit_logs USING btree (action); + + +-- +-- Name: ix_data_audit_logs_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_audit_logs_id ON data.audit_logs USING btree (id); + + +-- +-- Name: ix_data_audit_logs_ip_address; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_audit_logs_ip_address ON data.audit_logs USING btree (ip_address); + + +-- +-- Name: ix_data_audit_logs_target_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_audit_logs_target_id ON data.audit_logs USING btree (target_id); + + +-- +-- Name: ix_data_audit_logs_target_type; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_audit_logs_target_type ON data.audit_logs USING btree (target_type); + + +-- +-- Name: ix_data_audit_logs_timestamp; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_audit_logs_timestamp ON data.audit_logs USING btree ("timestamp"); + + +-- +-- Name: ix_data_badges_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_badges_id ON data.badges USING btree (id); + + +-- +-- Name: ix_data_expertise_tags_key; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE UNIQUE INDEX ix_data_expertise_tags_key ON data.expertise_tags USING btree (key); + + +-- +-- Name: ix_data_level_configs_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_level_configs_id ON data.level_configs USING btree (id); + + +-- +-- Name: ix_data_organization_financials_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_organization_financials_id ON data.organization_financials USING btree (id); + + +-- +-- Name: ix_data_organization_members_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_organization_members_id ON data.organization_members USING btree (id); + + +-- +-- Name: ix_data_organizations_folder_slug; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE UNIQUE INDEX ix_data_organizations_folder_slug ON data.organizations USING btree (folder_slug); + + +-- +-- Name: ix_data_organizations_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_organizations_id ON data.organizations USING btree (id); + + +-- +-- Name: ix_data_organizations_tax_number; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE UNIQUE INDEX ix_data_organizations_tax_number ON data.organizations USING btree (tax_number); + + +-- +-- Name: ix_data_pending_actions_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_pending_actions_id ON data.pending_actions USING btree (id); + + +-- +-- Name: ix_data_persons_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_persons_id ON data.persons USING btree (id); + + +-- +-- Name: ix_data_point_rules_action_key; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE UNIQUE INDEX ix_data_point_rules_action_key ON data.point_rules USING btree (action_key); + + +-- +-- Name: ix_data_point_rules_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_point_rules_id ON data.point_rules USING btree (id); + + +-- +-- Name: ix_data_points_ledger_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_points_ledger_id ON data.points_ledger USING btree (id); + + +-- +-- Name: ix_data_regional_settings_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_regional_settings_id ON data.regional_settings USING btree (id); + + +-- +-- Name: ix_data_service_profiles_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_service_profiles_id ON data.service_profiles USING btree (id); + + +-- +-- Name: ix_data_service_profiles_location; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_service_profiles_location ON data.service_profiles USING btree (location); + + +-- +-- Name: ix_data_service_profiles_status; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_service_profiles_status ON data.service_profiles USING btree (status); + + +-- +-- Name: ix_data_social_accounts_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_social_accounts_id ON data.social_accounts USING btree (id); + + +-- +-- Name: ix_data_social_accounts_social_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_social_accounts_social_id ON data.social_accounts USING btree (social_id); + + +-- +-- Name: ix_data_system_parameters_key; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_system_parameters_key ON data.system_parameters USING btree (key); + + +-- +-- Name: ix_data_translations_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_translations_id ON data.translations USING btree (id); + + +-- +-- Name: ix_data_translations_key; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_translations_key ON data.translations USING btree (key); + + +-- +-- Name: ix_data_translations_lang_code; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_translations_lang_code ON data.translations USING btree (lang_code); + + +-- +-- Name: ix_data_user_badges_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_user_badges_id ON data.user_badges USING btree (id); + + +-- +-- Name: ix_data_users_email; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE UNIQUE INDEX ix_data_users_email ON data.users USING btree (email); + + +-- +-- Name: ix_data_users_folder_slug; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE UNIQUE INDEX ix_data_users_folder_slug ON data.users USING btree (folder_slug); + + +-- +-- Name: ix_data_users_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_users_id ON data.users USING btree (id); + + +-- +-- Name: ix_data_vehicle_catalog_engine_variant; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_vehicle_catalog_engine_variant ON data.vehicle_catalog USING btree (engine_variant); + + +-- +-- Name: ix_data_vehicle_catalog_fuel_type; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_vehicle_catalog_fuel_type ON data.vehicle_catalog USING btree (fuel_type); + + +-- +-- Name: ix_data_vehicle_catalog_generation; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_vehicle_catalog_generation ON data.vehicle_catalog USING btree (generation); + + +-- +-- Name: ix_data_vehicle_catalog_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_vehicle_catalog_id ON data.vehicle_catalog USING btree (id); + + +-- +-- Name: ix_data_vehicle_catalog_make; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_vehicle_catalog_make ON data.vehicle_catalog USING btree (make); + + +-- +-- Name: ix_data_vehicle_catalog_model; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_vehicle_catalog_model ON data.vehicle_catalog USING btree (model); + + +-- +-- Name: ix_data_vehicle_ownerships_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_vehicle_ownerships_id ON data.vehicle_ownerships USING btree (id); + + +-- +-- Name: ix_data_verification_tokens_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_verification_tokens_id ON data.verification_tokens USING btree (id); + + +-- +-- Name: ix_data_wallets_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_wallets_id ON data.wallets USING btree (id); + + +-- +-- Name: addresses addresses_postal_code_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.addresses + ADD CONSTRAINT addresses_postal_code_id_fkey FOREIGN KEY (postal_code_id) REFERENCES data.geo_postal_codes(id); + + +-- +-- Name: asset_assignments asset_assignments_asset_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_assignments + ADD CONSTRAINT asset_assignments_asset_id_fkey FOREIGN KEY (asset_id) REFERENCES data.assets(id); + + +-- +-- Name: asset_assignments asset_assignments_organization_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_assignments + ADD CONSTRAINT asset_assignments_organization_id_fkey FOREIGN KEY (organization_id) REFERENCES data.organizations(id); + + +-- +-- Name: asset_costs asset_costs_asset_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_costs + ADD CONSTRAINT asset_costs_asset_id_fkey FOREIGN KEY (asset_id) REFERENCES data.assets(id); + + +-- +-- Name: asset_costs asset_costs_driver_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_costs + ADD CONSTRAINT asset_costs_driver_id_fkey FOREIGN KEY (driver_id) REFERENCES data.users(id); + + +-- +-- Name: asset_costs asset_costs_organization_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_costs + ADD CONSTRAINT asset_costs_organization_id_fkey FOREIGN KEY (organization_id) REFERENCES data.organizations(id); + + +-- +-- Name: asset_events asset_events_asset_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_events + ADD CONSTRAINT asset_events_asset_id_fkey FOREIGN KEY (asset_id) REFERENCES data.assets(id); + + +-- +-- Name: asset_financials asset_financials_asset_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_financials + ADD CONSTRAINT asset_financials_asset_id_fkey FOREIGN KEY (asset_id) REFERENCES data.assets(id); + + +-- +-- Name: asset_reviews asset_reviews_asset_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_reviews + ADD CONSTRAINT asset_reviews_asset_id_fkey FOREIGN KEY (asset_id) REFERENCES data.assets(id); + + +-- +-- Name: asset_reviews asset_reviews_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_reviews + ADD CONSTRAINT asset_reviews_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id); + + +-- +-- Name: asset_telemetry asset_telemetry_asset_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.asset_telemetry + ADD CONSTRAINT asset_telemetry_asset_id_fkey FOREIGN KEY (asset_id) REFERENCES data.assets(id); + + +-- +-- Name: assets assets_catalog_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.assets + ADD CONSTRAINT assets_catalog_id_fkey FOREIGN KEY (catalog_id) REFERENCES data.vehicle_catalog(id); + + +-- +-- Name: assets assets_current_organization_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.assets + ADD CONSTRAINT assets_current_organization_id_fkey FOREIGN KEY (current_organization_id) REFERENCES data.organizations(id); + + +-- +-- Name: audit_logs audit_logs_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.audit_logs + ADD CONSTRAINT audit_logs_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id); + + +-- +-- Name: credit_logs credit_logs_org_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.credit_logs + ADD CONSTRAINT credit_logs_org_id_fkey FOREIGN KEY (org_id) REFERENCES data.organizations(id); + + +-- +-- Name: documents documents_uploaded_by_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.documents + ADD CONSTRAINT documents_uploaded_by_fkey FOREIGN KEY (uploaded_by) REFERENCES data.users(id); + + +-- +-- Name: geo_streets geo_streets_postal_code_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.geo_streets + ADD CONSTRAINT geo_streets_postal_code_id_fkey FOREIGN KEY (postal_code_id) REFERENCES data.geo_postal_codes(id); + + +-- +-- Name: org_subscriptions org_subscriptions_org_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.org_subscriptions + ADD CONSTRAINT org_subscriptions_org_id_fkey FOREIGN KEY (org_id) REFERENCES data.organizations(id); + + +-- +-- Name: org_subscriptions org_subscriptions_tier_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.org_subscriptions + ADD CONSTRAINT org_subscriptions_tier_id_fkey FOREIGN KEY (tier_id) REFERENCES data.subscription_tiers(id); + + +-- +-- Name: organization_financials organization_financials_organization_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.organization_financials + ADD CONSTRAINT organization_financials_organization_id_fkey FOREIGN KEY (organization_id) REFERENCES data.organizations(id); + + +-- +-- Name: organization_members organization_members_organization_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.organization_members + ADD CONSTRAINT organization_members_organization_id_fkey FOREIGN KEY (organization_id) REFERENCES data.organizations(id); + + +-- +-- Name: organization_members organization_members_person_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.organization_members + ADD CONSTRAINT organization_members_person_id_fkey FOREIGN KEY (person_id) REFERENCES data.persons(id); + + +-- +-- Name: organization_members organization_members_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.organization_members + ADD CONSTRAINT organization_members_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id); + + +-- +-- Name: organizations organizations_address_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.organizations + ADD CONSTRAINT organizations_address_id_fkey FOREIGN KEY (address_id) REFERENCES data.addresses(id); + + +-- +-- Name: organizations organizations_owner_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.organizations + ADD CONSTRAINT organizations_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES data.users(id); + + +-- +-- Name: pending_actions pending_actions_approver_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.pending_actions + ADD CONSTRAINT pending_actions_approver_id_fkey FOREIGN KEY (approver_id) REFERENCES data.users(id); + + +-- +-- Name: pending_actions pending_actions_requester_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.pending_actions + ADD CONSTRAINT pending_actions_requester_id_fkey FOREIGN KEY (requester_id) REFERENCES data.users(id); + + +-- +-- Name: persons persons_address_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.persons + ADD CONSTRAINT persons_address_id_fkey FOREIGN KEY (address_id) REFERENCES data.addresses(id); + + +-- +-- Name: points_ledger points_ledger_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.points_ledger + ADD CONSTRAINT points_ledger_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id); + + +-- +-- Name: ratings ratings_author_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.ratings + ADD CONSTRAINT ratings_author_id_fkey FOREIGN KEY (author_id) REFERENCES data.users(id); + + +-- +-- Name: service_expertises service_expertises_expertise_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_expertises + ADD CONSTRAINT service_expertises_expertise_id_fkey FOREIGN KEY (expertise_id) REFERENCES data.expertise_tags(id); + + +-- +-- Name: service_expertises service_expertises_service_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_expertises + ADD CONSTRAINT service_expertises_service_id_fkey FOREIGN KEY (service_id) REFERENCES data.service_profiles(id); + + +-- +-- Name: service_profiles service_profiles_organization_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_profiles + ADD CONSTRAINT service_profiles_organization_id_fkey FOREIGN KEY (organization_id) REFERENCES data.organizations(id); + + +-- +-- Name: service_specialties service_specialties_parent_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_specialties + ADD CONSTRAINT service_specialties_parent_id_fkey FOREIGN KEY (parent_id) REFERENCES data.service_specialties(id); + + +-- +-- Name: social_accounts social_accounts_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.social_accounts + ADD CONSTRAINT social_accounts_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id) ON DELETE CASCADE; + + +-- +-- Name: user_badges user_badges_badge_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.user_badges + ADD CONSTRAINT user_badges_badge_id_fkey FOREIGN KEY (badge_id) REFERENCES data.badges(id); + + +-- +-- Name: user_badges user_badges_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.user_badges + ADD CONSTRAINT user_badges_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id); + + +-- +-- Name: user_stats user_stats_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.user_stats + ADD CONSTRAINT user_stats_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id); + + +-- +-- Name: users users_person_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.users + ADD CONSTRAINT users_person_id_fkey FOREIGN KEY (person_id) REFERENCES data.persons(id); + + +-- +-- Name: vehicle_ownerships vehicle_ownerships_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.vehicle_ownerships + ADD CONSTRAINT vehicle_ownerships_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id); + + +-- +-- Name: vehicle_ownerships vehicle_ownerships_vehicle_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.vehicle_ownerships + ADD CONSTRAINT vehicle_ownerships_vehicle_id_fkey FOREIGN KEY (vehicle_id) REFERENCES data.assets(id); + + +-- +-- Name: verification_tokens verification_tokens_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.verification_tokens + ADD CONSTRAINT verification_tokens_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id) ON DELETE CASCADE; + + +-- +-- Name: wallets wallets_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.wallets + ADD CONSTRAINT wallets_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id); + + +-- +-- Name: SCHEMA data; Type: ACL; Schema: -; Owner: service_finder_app +-- + +GRANT USAGE ON SCHEMA data TO n8n_hunter; +GRANT USAGE ON SCHEMA data TO PUBLIC; + + +-- +-- Name: TABLE addresses; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.addresses TO n8n_hunter; +GRANT ALL ON TABLE data.addresses TO PUBLIC; + + +-- +-- Name: TABLE asset_assignments; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.asset_assignments TO n8n_hunter; +GRANT ALL ON TABLE data.asset_assignments TO PUBLIC; + + +-- +-- Name: TABLE asset_costs; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.asset_costs TO n8n_hunter; +GRANT ALL ON TABLE data.asset_costs TO PUBLIC; + + +-- +-- Name: TABLE asset_events; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.asset_events TO n8n_hunter; +GRANT ALL ON TABLE data.asset_events TO PUBLIC; + + +-- +-- Name: TABLE asset_financials; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.asset_financials TO n8n_hunter; +GRANT ALL ON TABLE data.asset_financials TO PUBLIC; + + +-- +-- Name: TABLE asset_reviews; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.asset_reviews TO n8n_hunter; +GRANT ALL ON TABLE data.asset_reviews TO PUBLIC; + + +-- +-- Name: TABLE asset_telemetry; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.asset_telemetry TO n8n_hunter; +GRANT ALL ON TABLE data.asset_telemetry TO PUBLIC; + + +-- +-- Name: TABLE assets; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.assets TO n8n_hunter; +GRANT ALL ON TABLE data.assets TO PUBLIC; + + +-- +-- Name: TABLE audit_logs; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.audit_logs TO n8n_hunter; +GRANT ALL ON TABLE data.audit_logs TO PUBLIC; + + +-- +-- Name: TABLE badges; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.badges TO n8n_hunter; +GRANT ALL ON TABLE data.badges TO PUBLIC; + + +-- +-- Name: TABLE credit_logs; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.credit_logs TO n8n_hunter; +GRANT ALL ON TABLE data.credit_logs TO PUBLIC; + + +-- +-- Name: TABLE documents; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.documents TO n8n_hunter; +GRANT ALL ON TABLE data.documents TO PUBLIC; + + +-- +-- Name: TABLE exchange_rates; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.exchange_rates TO n8n_hunter; +GRANT ALL ON TABLE data.exchange_rates TO PUBLIC; + + +-- +-- Name: TABLE expertise_tags; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.expertise_tags TO n8n_hunter; +GRANT ALL ON TABLE data.expertise_tags TO PUBLIC; + + +-- +-- Name: TABLE geo_postal_codes; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.geo_postal_codes TO n8n_hunter; +GRANT ALL ON TABLE data.geo_postal_codes TO PUBLIC; + + +-- +-- Name: TABLE geo_street_types; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.geo_street_types TO n8n_hunter; +GRANT ALL ON TABLE data.geo_street_types TO PUBLIC; + + +-- +-- Name: TABLE geo_streets; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.geo_streets TO n8n_hunter; +GRANT ALL ON TABLE data.geo_streets TO PUBLIC; + + +-- +-- Name: TABLE geography_columns; Type: ACL; Schema: data; Owner: service_finder_app +-- + +REVOKE ALL ON TABLE data.geography_columns FROM kincses; +REVOKE ALL ON TABLE data.geography_columns FROM service_finder_app; +REVOKE SELECT ON TABLE data.geography_columns FROM PUBLIC; +GRANT ALL ON TABLE data.geography_columns TO service_finder_app; +GRANT ALL ON TABLE data.geography_columns TO PUBLIC; +GRANT ALL ON TABLE data.geography_columns TO n8n_hunter; + + +-- +-- Name: TABLE geometry_columns; Type: ACL; Schema: data; Owner: service_finder_app +-- + +REVOKE ALL ON TABLE data.geometry_columns FROM kincses; +REVOKE ALL ON TABLE data.geometry_columns FROM service_finder_app; +REVOKE SELECT ON TABLE data.geometry_columns FROM PUBLIC; +GRANT ALL ON TABLE data.geometry_columns TO service_finder_app; +GRANT ALL ON TABLE data.geometry_columns TO PUBLIC; +GRANT ALL ON TABLE data.geometry_columns TO n8n_hunter; + + +-- +-- Name: TABLE level_configs; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.level_configs TO n8n_hunter; +GRANT ALL ON TABLE data.level_configs TO PUBLIC; + + +-- +-- Name: TABLE org_subscriptions; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.org_subscriptions TO n8n_hunter; +GRANT ALL ON TABLE data.org_subscriptions TO PUBLIC; + + +-- +-- Name: TABLE organization_financials; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.organization_financials TO n8n_hunter; +GRANT ALL ON TABLE data.organization_financials TO PUBLIC; + + +-- +-- Name: TABLE organization_members; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.organization_members TO n8n_hunter; +GRANT ALL ON TABLE data.organization_members TO PUBLIC; + + +-- +-- Name: TABLE organizations; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.organizations TO n8n_hunter; +GRANT ALL ON TABLE data.organizations TO PUBLIC; + + +-- +-- Name: TABLE pending_actions; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.pending_actions TO n8n_hunter; +GRANT ALL ON TABLE data.pending_actions TO PUBLIC; + + +-- +-- Name: TABLE persons; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.persons TO n8n_hunter; +GRANT ALL ON TABLE data.persons TO PUBLIC; + + +-- +-- Name: TABLE point_rules; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.point_rules TO n8n_hunter; +GRANT ALL ON TABLE data.point_rules TO PUBLIC; + + +-- +-- Name: TABLE points_ledger; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.points_ledger TO n8n_hunter; +GRANT ALL ON TABLE data.points_ledger TO PUBLIC; + + +-- +-- Name: TABLE ratings; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.ratings TO n8n_hunter; +GRANT ALL ON TABLE data.ratings TO PUBLIC; + + +-- +-- Name: TABLE regional_settings; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.regional_settings TO n8n_hunter; +GRANT ALL ON TABLE data.regional_settings TO PUBLIC; + + +-- +-- Name: TABLE service_expertises; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.service_expertises TO n8n_hunter; +GRANT ALL ON TABLE data.service_expertises TO PUBLIC; + + +-- +-- Name: TABLE service_profiles; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.service_profiles TO n8n_hunter; +GRANT ALL ON TABLE data.service_profiles TO PUBLIC; + + +-- +-- Name: TABLE service_specialties; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.service_specialties TO n8n_hunter; +GRANT ALL ON TABLE data.service_specialties TO PUBLIC; + + +-- +-- Name: TABLE social_accounts; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.social_accounts TO n8n_hunter; +GRANT ALL ON TABLE data.social_accounts TO PUBLIC; + + +-- +-- Name: TABLE spatial_ref_sys; Type: ACL; Schema: data; Owner: service_finder_app +-- + +REVOKE ALL ON TABLE data.spatial_ref_sys FROM kincses; +REVOKE ALL ON TABLE data.spatial_ref_sys FROM service_finder_app; +REVOKE SELECT ON TABLE data.spatial_ref_sys FROM PUBLIC; +GRANT ALL ON TABLE data.spatial_ref_sys TO service_finder_app; +GRANT ALL ON TABLE data.spatial_ref_sys TO PUBLIC; +GRANT ALL ON TABLE data.spatial_ref_sys TO n8n_hunter; + + +-- +-- Name: TABLE subscription_tiers; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.subscription_tiers TO n8n_hunter; +GRANT ALL ON TABLE data.subscription_tiers TO PUBLIC; + + +-- +-- Name: TABLE system_parameters; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.system_parameters TO n8n_hunter; +GRANT ALL ON TABLE data.system_parameters TO PUBLIC; + + +-- +-- Name: TABLE translations; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.translations TO n8n_hunter; +GRANT ALL ON TABLE data.translations TO PUBLIC; + + +-- +-- Name: TABLE user_badges; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.user_badges TO n8n_hunter; +GRANT ALL ON TABLE data.user_badges TO PUBLIC; + + +-- +-- Name: TABLE user_stats; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.user_stats TO n8n_hunter; +GRANT ALL ON TABLE data.user_stats TO PUBLIC; + + +-- +-- Name: TABLE users; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.users TO n8n_hunter; +GRANT ALL ON TABLE data.users TO PUBLIC; + + +-- +-- Name: TABLE vehicle_catalog; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.vehicle_catalog TO n8n_hunter; +GRANT ALL ON TABLE data.vehicle_catalog TO PUBLIC; + + +-- +-- Name: TABLE vehicle_ownerships; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.vehicle_ownerships TO n8n_hunter; +GRANT ALL ON TABLE data.vehicle_ownerships TO PUBLIC; + + +-- +-- Name: TABLE verification_tokens; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.verification_tokens TO n8n_hunter; +GRANT ALL ON TABLE data.verification_tokens TO PUBLIC; + + +-- +-- Name: TABLE wallets; Type: ACL; Schema: data; Owner: service_finder_app +-- + +GRANT ALL ON TABLE data.wallets TO n8n_hunter; +GRANT ALL ON TABLE data.wallets TO PUBLIC; + + +-- +-- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: data; Owner: kincses +-- + +ALTER DEFAULT PRIVILEGES FOR ROLE kincses IN SCHEMA data GRANT ALL ON SEQUENCES TO service_finder_app; + + +-- +-- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: data; Owner: kincses +-- + +ALTER DEFAULT PRIVILEGES FOR ROLE kincses IN SCHEMA data GRANT ALL ON TABLES TO service_finder_app; +ALTER DEFAULT PRIVILEGES FOR ROLE kincses IN SCHEMA data GRANT ALL ON TABLES TO n8n_hunter; + + +-- +-- PostgreSQL database dump complete +-- + diff --git a/pgadmin_data/sessions/159f1157-2d9c-482f-96f2-92bb36a5cf6b b/pgadmin_data/sessions/159f1157-2d9c-482f-96f2-92bb36a5cf6b new file mode 100755 index 0000000..9553b8c Binary files /dev/null and b/pgadmin_data/sessions/159f1157-2d9c-482f-96f2-92bb36a5cf6b differ diff --git a/pgadmin_data/sessions/1b243d10-470d-4d87-b602-e55a413b3cea b/pgadmin_data/sessions/1b243d10-470d-4d87-b602-e55a413b3cea new file mode 100755 index 0000000..e690122 Binary files /dev/null and b/pgadmin_data/sessions/1b243d10-470d-4d87-b602-e55a413b3cea differ diff --git a/pgadmin_data/sessions/210fc1f6-f42c-42af-93c9-e5f42e49a852 b/pgadmin_data/sessions/210fc1f6-f42c-42af-93c9-e5f42e49a852 new file mode 100755 index 0000000..bac44f4 Binary files /dev/null and b/pgadmin_data/sessions/210fc1f6-f42c-42af-93c9-e5f42e49a852 differ diff --git a/pgadmin_data/sessions/5df8b875-e2e7-4614-9046-cb329aa83169 b/pgadmin_data/sessions/5df8b875-e2e7-4614-9046-cb329aa83169 new file mode 100755 index 0000000..834f617 Binary files /dev/null and b/pgadmin_data/sessions/5df8b875-e2e7-4614-9046-cb329aa83169 differ diff --git a/pgadmin_data/sessions/9cf7ead4-70bf-4788-992d-87e1969539af b/pgadmin_data/sessions/9cf7ead4-70bf-4788-992d-87e1969539af new file mode 100755 index 0000000..b42864a Binary files /dev/null and b/pgadmin_data/sessions/9cf7ead4-70bf-4788-992d-87e1969539af differ diff --git a/pgadmin_data/sessions/d3893232-05b2-4bff-9a92-4a7a0d394a8a b/pgadmin_data/sessions/d3893232-05b2-4bff-9a92-4a7a0d394a8a new file mode 100755 index 0000000..a96b300 Binary files /dev/null and b/pgadmin_data/sessions/d3893232-05b2-4bff-9a92-4a7a0d394a8a differ diff --git a/pgadmin_data/sessions/f3274d22-c918-4c15-9235-38f09a0984e9 b/pgadmin_data/sessions/f3274d22-c918-4c15-9235-38f09a0984e9 new file mode 100755 index 0000000..a8a5c16 Binary files /dev/null and b/pgadmin_data/sessions/f3274d22-c918-4c15-9235-38f09a0984e9 differ diff --git a/pgadmin_data/sessions/f71a6056-cca2-410e-a5df-5b625adb6e3c b/pgadmin_data/sessions/f71a6056-cca2-410e-a5df-5b625adb6e3c new file mode 100755 index 0000000..fa8508f Binary files /dev/null and b/pgadmin_data/sessions/f71a6056-cca2-410e-a5df-5b625adb6e3c differ diff --git a/postgres/data/PG_VERSION b/postgres/data/PG_VERSION new file mode 100755 index 0000000..98d9bcb --- /dev/null +++ b/postgres/data/PG_VERSION @@ -0,0 +1 @@ +17 diff --git a/postgres/data/base/1/112 b/postgres/data/base/1/112 new file mode 100755 index 0000000..9531ca8 Binary files /dev/null and b/postgres/data/base/1/112 differ diff --git a/postgres/data/base/1/113 b/postgres/data/base/1/113 new file mode 100755 index 0000000..f92630d Binary files /dev/null and b/postgres/data/base/1/113 differ diff --git a/postgres/data/base/1/1247 b/postgres/data/base/1/1247 new file mode 100755 index 0000000..540213e Binary files /dev/null and b/postgres/data/base/1/1247 differ diff --git a/postgres/data/base/1/1247_fsm b/postgres/data/base/1/1247_fsm new file mode 100755 index 0000000..fd57308 Binary files /dev/null and b/postgres/data/base/1/1247_fsm differ diff --git a/postgres/data/base/1/1247_vm b/postgres/data/base/1/1247_vm new file mode 100755 index 0000000..8ccc3c7 Binary files /dev/null and b/postgres/data/base/1/1247_vm differ diff --git a/postgres/data/base/1/1249 b/postgres/data/base/1/1249 new file mode 100755 index 0000000..9b8eeab Binary files /dev/null and b/postgres/data/base/1/1249 differ diff --git a/postgres/data/base/1/1249_fsm b/postgres/data/base/1/1249_fsm new file mode 100755 index 0000000..e0ed4b0 Binary files /dev/null and b/postgres/data/base/1/1249_fsm differ diff --git a/postgres/data/base/1/1249_vm b/postgres/data/base/1/1249_vm new file mode 100755 index 0000000..affcf7f Binary files /dev/null and b/postgres/data/base/1/1249_vm differ diff --git a/postgres/data/base/1/1255 b/postgres/data/base/1/1255 new file mode 100755 index 0000000..23ff105 Binary files /dev/null and b/postgres/data/base/1/1255 differ diff --git a/postgres/data/base/1/1255_fsm b/postgres/data/base/1/1255_fsm new file mode 100755 index 0000000..062bfc5 Binary files /dev/null and b/postgres/data/base/1/1255_fsm differ diff --git a/postgres/data/base/1/1255_vm b/postgres/data/base/1/1255_vm new file mode 100755 index 0000000..7ac0ecc Binary files /dev/null and b/postgres/data/base/1/1255_vm differ diff --git a/postgres/data/base/1/1259 b/postgres/data/base/1/1259 new file mode 100755 index 0000000..8b483b3 Binary files /dev/null and b/postgres/data/base/1/1259 differ diff --git a/postgres/data/base/1/1259_fsm b/postgres/data/base/1/1259_fsm new file mode 100755 index 0000000..2077a7b Binary files /dev/null and b/postgres/data/base/1/1259_fsm differ diff --git a/postgres/data/base/1/1259_vm b/postgres/data/base/1/1259_vm new file mode 100755 index 0000000..c44f30c Binary files /dev/null and b/postgres/data/base/1/1259_vm differ diff --git a/postgres/data/base/1/13463 b/postgres/data/base/1/13463 new file mode 100755 index 0000000..5ac7a42 Binary files /dev/null and b/postgres/data/base/1/13463 differ diff --git a/postgres/data/base/1/13463_fsm b/postgres/data/base/1/13463_fsm new file mode 100755 index 0000000..45338f1 Binary files /dev/null and b/postgres/data/base/1/13463_fsm differ diff --git a/postgres/data/base/1/13463_vm b/postgres/data/base/1/13463_vm new file mode 100755 index 0000000..dd38365 Binary files /dev/null and b/postgres/data/base/1/13463_vm differ diff --git a/postgres/data/base/1/13466 b/postgres/data/base/1/13466 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/13467 b/postgres/data/base/1/13467 new file mode 100755 index 0000000..f572c60 Binary files /dev/null and b/postgres/data/base/1/13467 differ diff --git a/postgres/data/base/1/13468 b/postgres/data/base/1/13468 new file mode 100755 index 0000000..1c39b02 Binary files /dev/null and b/postgres/data/base/1/13468 differ diff --git a/postgres/data/base/1/13468_fsm b/postgres/data/base/1/13468_fsm new file mode 100755 index 0000000..70d16ce Binary files /dev/null and b/postgres/data/base/1/13468_fsm differ diff --git a/postgres/data/base/1/13468_vm b/postgres/data/base/1/13468_vm new file mode 100755 index 0000000..a990030 Binary files /dev/null and b/postgres/data/base/1/13468_vm differ diff --git a/postgres/data/base/1/13471 b/postgres/data/base/1/13471 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/13472 b/postgres/data/base/1/13472 new file mode 100755 index 0000000..c1b4577 Binary files /dev/null and b/postgres/data/base/1/13472 differ diff --git a/postgres/data/base/1/13473 b/postgres/data/base/1/13473 new file mode 100755 index 0000000..7722593 Binary files /dev/null and b/postgres/data/base/1/13473 differ diff --git a/postgres/data/base/1/13473_fsm b/postgres/data/base/1/13473_fsm new file mode 100755 index 0000000..0673ada Binary files /dev/null and b/postgres/data/base/1/13473_fsm differ diff --git a/postgres/data/base/1/13473_vm b/postgres/data/base/1/13473_vm new file mode 100755 index 0000000..076d693 Binary files /dev/null and b/postgres/data/base/1/13473_vm differ diff --git a/postgres/data/base/1/13476 b/postgres/data/base/1/13476 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/13477 b/postgres/data/base/1/13477 new file mode 100755 index 0000000..a2b6d05 Binary files /dev/null and b/postgres/data/base/1/13477 differ diff --git a/postgres/data/base/1/13478 b/postgres/data/base/1/13478 new file mode 100755 index 0000000..fe52a6c Binary files /dev/null and b/postgres/data/base/1/13478 differ diff --git a/postgres/data/base/1/13478_fsm b/postgres/data/base/1/13478_fsm new file mode 100755 index 0000000..a836ddf Binary files /dev/null and b/postgres/data/base/1/13478_fsm differ diff --git a/postgres/data/base/1/13478_vm b/postgres/data/base/1/13478_vm new file mode 100755 index 0000000..a69a78d Binary files /dev/null and b/postgres/data/base/1/13478_vm differ diff --git a/postgres/data/base/1/13481 b/postgres/data/base/1/13481 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/13482 b/postgres/data/base/1/13482 new file mode 100755 index 0000000..fbe1432 Binary files /dev/null and b/postgres/data/base/1/13482 differ diff --git a/postgres/data/base/1/1417 b/postgres/data/base/1/1417 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/1418 b/postgres/data/base/1/1418 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/174 b/postgres/data/base/1/174 new file mode 100755 index 0000000..4f4d8be Binary files /dev/null and b/postgres/data/base/1/174 differ diff --git a/postgres/data/base/1/175 b/postgres/data/base/1/175 new file mode 100755 index 0000000..98fd8de Binary files /dev/null and b/postgres/data/base/1/175 differ diff --git a/postgres/data/base/1/2187 b/postgres/data/base/1/2187 new file mode 100755 index 0000000..d2cd30b Binary files /dev/null and b/postgres/data/base/1/2187 differ diff --git a/postgres/data/base/1/2224 b/postgres/data/base/1/2224 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/2228 b/postgres/data/base/1/2228 new file mode 100755 index 0000000..bfecf01 Binary files /dev/null and b/postgres/data/base/1/2228 differ diff --git a/postgres/data/base/1/2328 b/postgres/data/base/1/2328 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/2336 b/postgres/data/base/1/2336 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/2337 b/postgres/data/base/1/2337 new file mode 100755 index 0000000..2c0b13d Binary files /dev/null and b/postgres/data/base/1/2337 differ diff --git a/postgres/data/base/1/2579 b/postgres/data/base/1/2579 new file mode 100755 index 0000000..e8e73a2 Binary files /dev/null and b/postgres/data/base/1/2579 differ diff --git a/postgres/data/base/1/2600 b/postgres/data/base/1/2600 new file mode 100755 index 0000000..9dfd1a8 Binary files /dev/null and b/postgres/data/base/1/2600 differ diff --git a/postgres/data/base/1/2600_fsm b/postgres/data/base/1/2600_fsm new file mode 100755 index 0000000..c542a78 Binary files /dev/null and b/postgres/data/base/1/2600_fsm differ diff --git a/postgres/data/base/1/2600_vm b/postgres/data/base/1/2600_vm new file mode 100755 index 0000000..c298c06 Binary files /dev/null and b/postgres/data/base/1/2600_vm differ diff --git a/postgres/data/base/1/2601 b/postgres/data/base/1/2601 new file mode 100755 index 0000000..d8001c8 Binary files /dev/null and b/postgres/data/base/1/2601 differ diff --git a/postgres/data/base/1/2601_fsm b/postgres/data/base/1/2601_fsm new file mode 100755 index 0000000..d388044 Binary files /dev/null and b/postgres/data/base/1/2601_fsm differ diff --git a/postgres/data/base/1/2601_vm b/postgres/data/base/1/2601_vm new file mode 100755 index 0000000..ce3bf93 Binary files /dev/null and b/postgres/data/base/1/2601_vm differ diff --git a/postgres/data/base/1/2602 b/postgres/data/base/1/2602 new file mode 100755 index 0000000..4a27b0a Binary files /dev/null and b/postgres/data/base/1/2602 differ diff --git a/postgres/data/base/1/2602_fsm b/postgres/data/base/1/2602_fsm new file mode 100755 index 0000000..23170d8 Binary files /dev/null and b/postgres/data/base/1/2602_fsm differ diff --git a/postgres/data/base/1/2602_vm b/postgres/data/base/1/2602_vm new file mode 100755 index 0000000..3b5e257 Binary files /dev/null and b/postgres/data/base/1/2602_vm differ diff --git a/postgres/data/base/1/2603 b/postgres/data/base/1/2603 new file mode 100755 index 0000000..d511af5 Binary files /dev/null and b/postgres/data/base/1/2603 differ diff --git a/postgres/data/base/1/2603_fsm b/postgres/data/base/1/2603_fsm new file mode 100755 index 0000000..949bd18 Binary files /dev/null and b/postgres/data/base/1/2603_fsm differ diff --git a/postgres/data/base/1/2603_vm b/postgres/data/base/1/2603_vm new file mode 100755 index 0000000..7df4f59 Binary files /dev/null and b/postgres/data/base/1/2603_vm differ diff --git a/postgres/data/base/1/2604 b/postgres/data/base/1/2604 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/2605 b/postgres/data/base/1/2605 new file mode 100755 index 0000000..eeaa7ea Binary files /dev/null and b/postgres/data/base/1/2605 differ diff --git a/postgres/data/base/1/2605_fsm b/postgres/data/base/1/2605_fsm new file mode 100755 index 0000000..f3b92bf Binary files /dev/null and b/postgres/data/base/1/2605_fsm differ diff --git a/postgres/data/base/1/2605_vm b/postgres/data/base/1/2605_vm new file mode 100755 index 0000000..a95fe7b Binary files /dev/null and b/postgres/data/base/1/2605_vm differ diff --git a/postgres/data/base/1/2606 b/postgres/data/base/1/2606 new file mode 100755 index 0000000..0e4c5a3 Binary files /dev/null and b/postgres/data/base/1/2606 differ diff --git a/postgres/data/base/1/2606_fsm b/postgres/data/base/1/2606_fsm new file mode 100755 index 0000000..267454e Binary files /dev/null and b/postgres/data/base/1/2606_fsm differ diff --git a/postgres/data/base/1/2606_vm b/postgres/data/base/1/2606_vm new file mode 100755 index 0000000..6b0159f Binary files /dev/null and b/postgres/data/base/1/2606_vm differ diff --git a/postgres/data/base/1/2607 b/postgres/data/base/1/2607 new file mode 100755 index 0000000..bfad49a Binary files /dev/null and b/postgres/data/base/1/2607 differ diff --git a/postgres/data/base/1/2607_fsm b/postgres/data/base/1/2607_fsm new file mode 100755 index 0000000..80ac8b1 Binary files /dev/null and b/postgres/data/base/1/2607_fsm differ diff --git a/postgres/data/base/1/2607_vm b/postgres/data/base/1/2607_vm new file mode 100755 index 0000000..7c2c53d Binary files /dev/null and b/postgres/data/base/1/2607_vm differ diff --git a/postgres/data/base/1/2608 b/postgres/data/base/1/2608 new file mode 100755 index 0000000..7f6f529 Binary files /dev/null and b/postgres/data/base/1/2608 differ diff --git a/postgres/data/base/1/2608_fsm b/postgres/data/base/1/2608_fsm new file mode 100755 index 0000000..4b19785 Binary files /dev/null and b/postgres/data/base/1/2608_fsm differ diff --git a/postgres/data/base/1/2608_vm b/postgres/data/base/1/2608_vm new file mode 100755 index 0000000..6e5e572 Binary files /dev/null and b/postgres/data/base/1/2608_vm differ diff --git a/postgres/data/base/1/2609 b/postgres/data/base/1/2609 new file mode 100755 index 0000000..f22fe32 Binary files /dev/null and b/postgres/data/base/1/2609 differ diff --git a/postgres/data/base/1/2609_fsm b/postgres/data/base/1/2609_fsm new file mode 100755 index 0000000..7be5dc7 Binary files /dev/null and b/postgres/data/base/1/2609_fsm differ diff --git a/postgres/data/base/1/2609_vm b/postgres/data/base/1/2609_vm new file mode 100755 index 0000000..40974d4 Binary files /dev/null and b/postgres/data/base/1/2609_vm differ diff --git a/postgres/data/base/1/2610 b/postgres/data/base/1/2610 new file mode 100755 index 0000000..2b6e6ed Binary files /dev/null and b/postgres/data/base/1/2610 differ diff --git a/postgres/data/base/1/2610_fsm b/postgres/data/base/1/2610_fsm new file mode 100755 index 0000000..ecbcb5f Binary files /dev/null and b/postgres/data/base/1/2610_fsm differ diff --git a/postgres/data/base/1/2610_vm b/postgres/data/base/1/2610_vm new file mode 100755 index 0000000..6a8139e Binary files /dev/null and b/postgres/data/base/1/2610_vm differ diff --git a/postgres/data/base/1/2611 b/postgres/data/base/1/2611 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/2612 b/postgres/data/base/1/2612 new file mode 100755 index 0000000..024d951 Binary files /dev/null and b/postgres/data/base/1/2612 differ diff --git a/postgres/data/base/1/2612_fsm b/postgres/data/base/1/2612_fsm new file mode 100755 index 0000000..877976a Binary files /dev/null and b/postgres/data/base/1/2612_fsm differ diff --git a/postgres/data/base/1/2612_vm b/postgres/data/base/1/2612_vm new file mode 100755 index 0000000..66d693c Binary files /dev/null and b/postgres/data/base/1/2612_vm differ diff --git a/postgres/data/base/1/2613 b/postgres/data/base/1/2613 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/2615 b/postgres/data/base/1/2615 new file mode 100755 index 0000000..add2690 Binary files /dev/null and b/postgres/data/base/1/2615 differ diff --git a/postgres/data/base/1/2615_fsm b/postgres/data/base/1/2615_fsm new file mode 100755 index 0000000..d041693 Binary files /dev/null and b/postgres/data/base/1/2615_fsm differ diff --git a/postgres/data/base/1/2615_vm b/postgres/data/base/1/2615_vm new file mode 100755 index 0000000..5ca7f9c Binary files /dev/null and b/postgres/data/base/1/2615_vm differ diff --git a/postgres/data/base/1/2616 b/postgres/data/base/1/2616 new file mode 100755 index 0000000..0d60d79 Binary files /dev/null and b/postgres/data/base/1/2616 differ diff --git a/postgres/data/base/1/2616_fsm b/postgres/data/base/1/2616_fsm new file mode 100755 index 0000000..cb924c9 Binary files /dev/null and b/postgres/data/base/1/2616_fsm differ diff --git a/postgres/data/base/1/2616_vm b/postgres/data/base/1/2616_vm new file mode 100755 index 0000000..67dd5a6 Binary files /dev/null and b/postgres/data/base/1/2616_vm differ diff --git a/postgres/data/base/1/2617 b/postgres/data/base/1/2617 new file mode 100755 index 0000000..bcdfc18 Binary files /dev/null and b/postgres/data/base/1/2617 differ diff --git a/postgres/data/base/1/2617_fsm b/postgres/data/base/1/2617_fsm new file mode 100755 index 0000000..29d6066 Binary files /dev/null and b/postgres/data/base/1/2617_fsm differ diff --git a/postgres/data/base/1/2617_vm b/postgres/data/base/1/2617_vm new file mode 100755 index 0000000..5b871b4 Binary files /dev/null and b/postgres/data/base/1/2617_vm differ diff --git a/postgres/data/base/1/2618 b/postgres/data/base/1/2618 new file mode 100755 index 0000000..a413ce8 Binary files /dev/null and b/postgres/data/base/1/2618 differ diff --git a/postgres/data/base/1/2618_fsm b/postgres/data/base/1/2618_fsm new file mode 100755 index 0000000..6cf107f Binary files /dev/null and b/postgres/data/base/1/2618_fsm differ diff --git a/postgres/data/base/1/2618_vm b/postgres/data/base/1/2618_vm new file mode 100755 index 0000000..598a6a2 Binary files /dev/null and b/postgres/data/base/1/2618_vm differ diff --git a/postgres/data/base/1/2619 b/postgres/data/base/1/2619 new file mode 100755 index 0000000..5b7521a Binary files /dev/null and b/postgres/data/base/1/2619 differ diff --git a/postgres/data/base/1/2619_fsm b/postgres/data/base/1/2619_fsm new file mode 100755 index 0000000..7eaf8a8 Binary files /dev/null and b/postgres/data/base/1/2619_fsm differ diff --git a/postgres/data/base/1/2619_vm b/postgres/data/base/1/2619_vm new file mode 100755 index 0000000..f63aa88 Binary files /dev/null and b/postgres/data/base/1/2619_vm differ diff --git a/postgres/data/base/1/2620 b/postgres/data/base/1/2620 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/2650 b/postgres/data/base/1/2650 new file mode 100755 index 0000000..042d761 Binary files /dev/null and b/postgres/data/base/1/2650 differ diff --git a/postgres/data/base/1/2651 b/postgres/data/base/1/2651 new file mode 100755 index 0000000..35590f4 Binary files /dev/null and b/postgres/data/base/1/2651 differ diff --git a/postgres/data/base/1/2652 b/postgres/data/base/1/2652 new file mode 100755 index 0000000..adf7b05 Binary files /dev/null and b/postgres/data/base/1/2652 differ diff --git a/postgres/data/base/1/2653 b/postgres/data/base/1/2653 new file mode 100755 index 0000000..7ef9b49 Binary files /dev/null and b/postgres/data/base/1/2653 differ diff --git a/postgres/data/base/1/2654 b/postgres/data/base/1/2654 new file mode 100755 index 0000000..e4e182f Binary files /dev/null and b/postgres/data/base/1/2654 differ diff --git a/postgres/data/base/1/2655 b/postgres/data/base/1/2655 new file mode 100755 index 0000000..0a0d565 Binary files /dev/null and b/postgres/data/base/1/2655 differ diff --git a/postgres/data/base/1/2656 b/postgres/data/base/1/2656 new file mode 100755 index 0000000..8507f4c Binary files /dev/null and b/postgres/data/base/1/2656 differ diff --git a/postgres/data/base/1/2657 b/postgres/data/base/1/2657 new file mode 100755 index 0000000..f62a61d Binary files /dev/null and b/postgres/data/base/1/2657 differ diff --git a/postgres/data/base/1/2658 b/postgres/data/base/1/2658 new file mode 100755 index 0000000..04c0fab Binary files /dev/null and b/postgres/data/base/1/2658 differ diff --git a/postgres/data/base/1/2659 b/postgres/data/base/1/2659 new file mode 100755 index 0000000..7a038de Binary files /dev/null and b/postgres/data/base/1/2659 differ diff --git a/postgres/data/base/1/2660 b/postgres/data/base/1/2660 new file mode 100755 index 0000000..8a83211 Binary files /dev/null and b/postgres/data/base/1/2660 differ diff --git a/postgres/data/base/1/2661 b/postgres/data/base/1/2661 new file mode 100755 index 0000000..17613f7 Binary files /dev/null and b/postgres/data/base/1/2661 differ diff --git a/postgres/data/base/1/2662 b/postgres/data/base/1/2662 new file mode 100755 index 0000000..06ddd60 Binary files /dev/null and b/postgres/data/base/1/2662 differ diff --git a/postgres/data/base/1/2663 b/postgres/data/base/1/2663 new file mode 100755 index 0000000..8c7204d Binary files /dev/null and b/postgres/data/base/1/2663 differ diff --git a/postgres/data/base/1/2664 b/postgres/data/base/1/2664 new file mode 100755 index 0000000..1a7c9a4 Binary files /dev/null and b/postgres/data/base/1/2664 differ diff --git a/postgres/data/base/1/2665 b/postgres/data/base/1/2665 new file mode 100755 index 0000000..a636b34 Binary files /dev/null and b/postgres/data/base/1/2665 differ diff --git a/postgres/data/base/1/2666 b/postgres/data/base/1/2666 new file mode 100755 index 0000000..35015fc Binary files /dev/null and b/postgres/data/base/1/2666 differ diff --git a/postgres/data/base/1/2667 b/postgres/data/base/1/2667 new file mode 100755 index 0000000..0e8a194 Binary files /dev/null and b/postgres/data/base/1/2667 differ diff --git a/postgres/data/base/1/2668 b/postgres/data/base/1/2668 new file mode 100755 index 0000000..5fd6734 Binary files /dev/null and b/postgres/data/base/1/2668 differ diff --git a/postgres/data/base/1/2669 b/postgres/data/base/1/2669 new file mode 100755 index 0000000..659c1e8 Binary files /dev/null and b/postgres/data/base/1/2669 differ diff --git a/postgres/data/base/1/2670 b/postgres/data/base/1/2670 new file mode 100755 index 0000000..affe09d Binary files /dev/null and b/postgres/data/base/1/2670 differ diff --git a/postgres/data/base/1/2673 b/postgres/data/base/1/2673 new file mode 100755 index 0000000..e8d4f2f Binary files /dev/null and b/postgres/data/base/1/2673 differ diff --git a/postgres/data/base/1/2674 b/postgres/data/base/1/2674 new file mode 100755 index 0000000..42f14c1 Binary files /dev/null and b/postgres/data/base/1/2674 differ diff --git a/postgres/data/base/1/2675 b/postgres/data/base/1/2675 new file mode 100755 index 0000000..632859e Binary files /dev/null and b/postgres/data/base/1/2675 differ diff --git a/postgres/data/base/1/2678 b/postgres/data/base/1/2678 new file mode 100755 index 0000000..dd6c349 Binary files /dev/null and b/postgres/data/base/1/2678 differ diff --git a/postgres/data/base/1/2679 b/postgres/data/base/1/2679 new file mode 100755 index 0000000..67c09dd Binary files /dev/null and b/postgres/data/base/1/2679 differ diff --git a/postgres/data/base/1/2680 b/postgres/data/base/1/2680 new file mode 100755 index 0000000..e8a9ce2 Binary files /dev/null and b/postgres/data/base/1/2680 differ diff --git a/postgres/data/base/1/2681 b/postgres/data/base/1/2681 new file mode 100755 index 0000000..0a64099 Binary files /dev/null and b/postgres/data/base/1/2681 differ diff --git a/postgres/data/base/1/2682 b/postgres/data/base/1/2682 new file mode 100755 index 0000000..b758a97 Binary files /dev/null and b/postgres/data/base/1/2682 differ diff --git a/postgres/data/base/1/2683 b/postgres/data/base/1/2683 new file mode 100755 index 0000000..b1e1410 Binary files /dev/null and b/postgres/data/base/1/2683 differ diff --git a/postgres/data/base/1/2684 b/postgres/data/base/1/2684 new file mode 100755 index 0000000..d1a4d71 Binary files /dev/null and b/postgres/data/base/1/2684 differ diff --git a/postgres/data/base/1/2685 b/postgres/data/base/1/2685 new file mode 100755 index 0000000..f9f0e52 Binary files /dev/null and b/postgres/data/base/1/2685 differ diff --git a/postgres/data/base/1/2686 b/postgres/data/base/1/2686 new file mode 100755 index 0000000..afdb6ec Binary files /dev/null and b/postgres/data/base/1/2686 differ diff --git a/postgres/data/base/1/2687 b/postgres/data/base/1/2687 new file mode 100755 index 0000000..6c5d318 Binary files /dev/null and b/postgres/data/base/1/2687 differ diff --git a/postgres/data/base/1/2688 b/postgres/data/base/1/2688 new file mode 100755 index 0000000..cbd8118 Binary files /dev/null and b/postgres/data/base/1/2688 differ diff --git a/postgres/data/base/1/2689 b/postgres/data/base/1/2689 new file mode 100755 index 0000000..785afe1 Binary files /dev/null and b/postgres/data/base/1/2689 differ diff --git a/postgres/data/base/1/2690 b/postgres/data/base/1/2690 new file mode 100755 index 0000000..a570b25 Binary files /dev/null and b/postgres/data/base/1/2690 differ diff --git a/postgres/data/base/1/2691 b/postgres/data/base/1/2691 new file mode 100755 index 0000000..260039e Binary files /dev/null and b/postgres/data/base/1/2691 differ diff --git a/postgres/data/base/1/2692 b/postgres/data/base/1/2692 new file mode 100755 index 0000000..375c9df Binary files /dev/null and b/postgres/data/base/1/2692 differ diff --git a/postgres/data/base/1/2693 b/postgres/data/base/1/2693 new file mode 100755 index 0000000..2c89d92 Binary files /dev/null and b/postgres/data/base/1/2693 differ diff --git a/postgres/data/base/1/2696 b/postgres/data/base/1/2696 new file mode 100755 index 0000000..d0eaffa Binary files /dev/null and b/postgres/data/base/1/2696 differ diff --git a/postgres/data/base/1/2699 b/postgres/data/base/1/2699 new file mode 100755 index 0000000..250c5ff Binary files /dev/null and b/postgres/data/base/1/2699 differ diff --git a/postgres/data/base/1/2701 b/postgres/data/base/1/2701 new file mode 100755 index 0000000..e47c5c0 Binary files /dev/null and b/postgres/data/base/1/2701 differ diff --git a/postgres/data/base/1/2702 b/postgres/data/base/1/2702 new file mode 100755 index 0000000..bd5ceed Binary files /dev/null and b/postgres/data/base/1/2702 differ diff --git a/postgres/data/base/1/2703 b/postgres/data/base/1/2703 new file mode 100755 index 0000000..cb5f63e Binary files /dev/null and b/postgres/data/base/1/2703 differ diff --git a/postgres/data/base/1/2704 b/postgres/data/base/1/2704 new file mode 100755 index 0000000..03220f7 Binary files /dev/null and b/postgres/data/base/1/2704 differ diff --git a/postgres/data/base/1/2753 b/postgres/data/base/1/2753 new file mode 100755 index 0000000..3c16dff Binary files /dev/null and b/postgres/data/base/1/2753 differ diff --git a/postgres/data/base/1/2753_fsm b/postgres/data/base/1/2753_fsm new file mode 100755 index 0000000..642bce3 Binary files /dev/null and b/postgres/data/base/1/2753_fsm differ diff --git a/postgres/data/base/1/2753_vm b/postgres/data/base/1/2753_vm new file mode 100755 index 0000000..4d40b45 Binary files /dev/null and b/postgres/data/base/1/2753_vm differ diff --git a/postgres/data/base/1/2754 b/postgres/data/base/1/2754 new file mode 100755 index 0000000..dff15d8 Binary files /dev/null and b/postgres/data/base/1/2754 differ diff --git a/postgres/data/base/1/2755 b/postgres/data/base/1/2755 new file mode 100755 index 0000000..4b09f63 Binary files /dev/null and b/postgres/data/base/1/2755 differ diff --git a/postgres/data/base/1/2756 b/postgres/data/base/1/2756 new file mode 100755 index 0000000..8d0e774 Binary files /dev/null and b/postgres/data/base/1/2756 differ diff --git a/postgres/data/base/1/2757 b/postgres/data/base/1/2757 new file mode 100755 index 0000000..3df6dd2 Binary files /dev/null and b/postgres/data/base/1/2757 differ diff --git a/postgres/data/base/1/2830 b/postgres/data/base/1/2830 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/2831 b/postgres/data/base/1/2831 new file mode 100755 index 0000000..260051f Binary files /dev/null and b/postgres/data/base/1/2831 differ diff --git a/postgres/data/base/1/2832 b/postgres/data/base/1/2832 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/2833 b/postgres/data/base/1/2833 new file mode 100755 index 0000000..d178cca Binary files /dev/null and b/postgres/data/base/1/2833 differ diff --git a/postgres/data/base/1/2834 b/postgres/data/base/1/2834 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/2835 b/postgres/data/base/1/2835 new file mode 100755 index 0000000..db2ba3a Binary files /dev/null and b/postgres/data/base/1/2835 differ diff --git a/postgres/data/base/1/2836 b/postgres/data/base/1/2836 new file mode 100755 index 0000000..cdd2d05 Binary files /dev/null and b/postgres/data/base/1/2836 differ diff --git a/postgres/data/base/1/2836_fsm b/postgres/data/base/1/2836_fsm new file mode 100755 index 0000000..ed42b8e Binary files /dev/null and b/postgres/data/base/1/2836_fsm differ diff --git a/postgres/data/base/1/2836_vm b/postgres/data/base/1/2836_vm new file mode 100755 index 0000000..99187e0 Binary files /dev/null and b/postgres/data/base/1/2836_vm differ diff --git a/postgres/data/base/1/2837 b/postgres/data/base/1/2837 new file mode 100755 index 0000000..cb88bcb Binary files /dev/null and b/postgres/data/base/1/2837 differ diff --git a/postgres/data/base/1/2838 b/postgres/data/base/1/2838 new file mode 100755 index 0000000..c8b4486 Binary files /dev/null and b/postgres/data/base/1/2838 differ diff --git a/postgres/data/base/1/2838_fsm b/postgres/data/base/1/2838_fsm new file mode 100755 index 0000000..2916af2 Binary files /dev/null and b/postgres/data/base/1/2838_fsm differ diff --git a/postgres/data/base/1/2838_vm b/postgres/data/base/1/2838_vm new file mode 100755 index 0000000..16cff1a Binary files /dev/null and b/postgres/data/base/1/2838_vm differ diff --git a/postgres/data/base/1/2839 b/postgres/data/base/1/2839 new file mode 100755 index 0000000..7e75c82 Binary files /dev/null and b/postgres/data/base/1/2839 differ diff --git a/postgres/data/base/1/2840 b/postgres/data/base/1/2840 new file mode 100755 index 0000000..7c28280 Binary files /dev/null and b/postgres/data/base/1/2840 differ diff --git a/postgres/data/base/1/2840_fsm b/postgres/data/base/1/2840_fsm new file mode 100755 index 0000000..4d77f0e Binary files /dev/null and b/postgres/data/base/1/2840_fsm differ diff --git a/postgres/data/base/1/2840_vm b/postgres/data/base/1/2840_vm new file mode 100755 index 0000000..16fba54 Binary files /dev/null and b/postgres/data/base/1/2840_vm differ diff --git a/postgres/data/base/1/2841 b/postgres/data/base/1/2841 new file mode 100755 index 0000000..981b48e Binary files /dev/null and b/postgres/data/base/1/2841 differ diff --git a/postgres/data/base/1/2995 b/postgres/data/base/1/2995 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/2996 b/postgres/data/base/1/2996 new file mode 100755 index 0000000..7bcbf8f Binary files /dev/null and b/postgres/data/base/1/2996 differ diff --git a/postgres/data/base/1/3079 b/postgres/data/base/1/3079 new file mode 100755 index 0000000..36eda3e Binary files /dev/null and b/postgres/data/base/1/3079 differ diff --git a/postgres/data/base/1/3079_fsm b/postgres/data/base/1/3079_fsm new file mode 100755 index 0000000..7732d22 Binary files /dev/null and b/postgres/data/base/1/3079_fsm differ diff --git a/postgres/data/base/1/3079_vm b/postgres/data/base/1/3079_vm new file mode 100755 index 0000000..6f69ead Binary files /dev/null and b/postgres/data/base/1/3079_vm differ diff --git a/postgres/data/base/1/3080 b/postgres/data/base/1/3080 new file mode 100755 index 0000000..ee41e6b Binary files /dev/null and b/postgres/data/base/1/3080 differ diff --git a/postgres/data/base/1/3081 b/postgres/data/base/1/3081 new file mode 100755 index 0000000..8a32370 Binary files /dev/null and b/postgres/data/base/1/3081 differ diff --git a/postgres/data/base/1/3085 b/postgres/data/base/1/3085 new file mode 100755 index 0000000..e75db0c Binary files /dev/null and b/postgres/data/base/1/3085 differ diff --git a/postgres/data/base/1/3118 b/postgres/data/base/1/3118 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/3119 b/postgres/data/base/1/3119 new file mode 100755 index 0000000..059d8b6 Binary files /dev/null and b/postgres/data/base/1/3119 differ diff --git a/postgres/data/base/1/3164 b/postgres/data/base/1/3164 new file mode 100755 index 0000000..4392a6c Binary files /dev/null and b/postgres/data/base/1/3164 differ diff --git a/postgres/data/base/1/3256 b/postgres/data/base/1/3256 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/3257 b/postgres/data/base/1/3257 new file mode 100755 index 0000000..fbf5bbe Binary files /dev/null and b/postgres/data/base/1/3257 differ diff --git a/postgres/data/base/1/3258 b/postgres/data/base/1/3258 new file mode 100755 index 0000000..e6ea9ce Binary files /dev/null and b/postgres/data/base/1/3258 differ diff --git a/postgres/data/base/1/3350 b/postgres/data/base/1/3350 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/3351 b/postgres/data/base/1/3351 new file mode 100755 index 0000000..afd5efa Binary files /dev/null and b/postgres/data/base/1/3351 differ diff --git a/postgres/data/base/1/3379 b/postgres/data/base/1/3379 new file mode 100755 index 0000000..faaee39 Binary files /dev/null and b/postgres/data/base/1/3379 differ diff --git a/postgres/data/base/1/3380 b/postgres/data/base/1/3380 new file mode 100755 index 0000000..01e9984 Binary files /dev/null and b/postgres/data/base/1/3380 differ diff --git a/postgres/data/base/1/3381 b/postgres/data/base/1/3381 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/3394 b/postgres/data/base/1/3394 new file mode 100755 index 0000000..8429b20 Binary files /dev/null and b/postgres/data/base/1/3394 differ diff --git a/postgres/data/base/1/3394_fsm b/postgres/data/base/1/3394_fsm new file mode 100755 index 0000000..ffa8644 Binary files /dev/null and b/postgres/data/base/1/3394_fsm differ diff --git a/postgres/data/base/1/3394_vm b/postgres/data/base/1/3394_vm new file mode 100755 index 0000000..b30d0e5 Binary files /dev/null and b/postgres/data/base/1/3394_vm differ diff --git a/postgres/data/base/1/3395 b/postgres/data/base/1/3395 new file mode 100755 index 0000000..79b711c Binary files /dev/null and b/postgres/data/base/1/3395 differ diff --git a/postgres/data/base/1/3429 b/postgres/data/base/1/3429 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/3430 b/postgres/data/base/1/3430 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/3431 b/postgres/data/base/1/3431 new file mode 100755 index 0000000..13c10cb Binary files /dev/null and b/postgres/data/base/1/3431 differ diff --git a/postgres/data/base/1/3433 b/postgres/data/base/1/3433 new file mode 100755 index 0000000..ffe926f Binary files /dev/null and b/postgres/data/base/1/3433 differ diff --git a/postgres/data/base/1/3439 b/postgres/data/base/1/3439 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/3440 b/postgres/data/base/1/3440 new file mode 100755 index 0000000..cfae4df Binary files /dev/null and b/postgres/data/base/1/3440 differ diff --git a/postgres/data/base/1/3455 b/postgres/data/base/1/3455 new file mode 100755 index 0000000..b58ddf0 Binary files /dev/null and b/postgres/data/base/1/3455 differ diff --git a/postgres/data/base/1/3456 b/postgres/data/base/1/3456 new file mode 100755 index 0000000..caa5712 Binary files /dev/null and b/postgres/data/base/1/3456 differ diff --git a/postgres/data/base/1/3456_fsm b/postgres/data/base/1/3456_fsm new file mode 100755 index 0000000..3cb165f Binary files /dev/null and b/postgres/data/base/1/3456_fsm differ diff --git a/postgres/data/base/1/3456_vm b/postgres/data/base/1/3456_vm new file mode 100755 index 0000000..405e3b7 Binary files /dev/null and b/postgres/data/base/1/3456_vm differ diff --git a/postgres/data/base/1/3466 b/postgres/data/base/1/3466 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/3467 b/postgres/data/base/1/3467 new file mode 100755 index 0000000..6344b94 Binary files /dev/null and b/postgres/data/base/1/3467 differ diff --git a/postgres/data/base/1/3468 b/postgres/data/base/1/3468 new file mode 100755 index 0000000..6a2b6b1 Binary files /dev/null and b/postgres/data/base/1/3468 differ diff --git a/postgres/data/base/1/3501 b/postgres/data/base/1/3501 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/3502 b/postgres/data/base/1/3502 new file mode 100755 index 0000000..eb0b32a Binary files /dev/null and b/postgres/data/base/1/3502 differ diff --git a/postgres/data/base/1/3503 b/postgres/data/base/1/3503 new file mode 100755 index 0000000..32a3055 Binary files /dev/null and b/postgres/data/base/1/3503 differ diff --git a/postgres/data/base/1/3534 b/postgres/data/base/1/3534 new file mode 100755 index 0000000..7676fd8 Binary files /dev/null and b/postgres/data/base/1/3534 differ diff --git a/postgres/data/base/1/3541 b/postgres/data/base/1/3541 new file mode 100755 index 0000000..40869ad Binary files /dev/null and b/postgres/data/base/1/3541 differ diff --git a/postgres/data/base/1/3541_fsm b/postgres/data/base/1/3541_fsm new file mode 100755 index 0000000..a3a2de4 Binary files /dev/null and b/postgres/data/base/1/3541_fsm differ diff --git a/postgres/data/base/1/3541_vm b/postgres/data/base/1/3541_vm new file mode 100755 index 0000000..8bc4d54 Binary files /dev/null and b/postgres/data/base/1/3541_vm differ diff --git a/postgres/data/base/1/3542 b/postgres/data/base/1/3542 new file mode 100755 index 0000000..bb83580 Binary files /dev/null and b/postgres/data/base/1/3542 differ diff --git a/postgres/data/base/1/3574 b/postgres/data/base/1/3574 new file mode 100755 index 0000000..b026df1 Binary files /dev/null and b/postgres/data/base/1/3574 differ diff --git a/postgres/data/base/1/3575 b/postgres/data/base/1/3575 new file mode 100755 index 0000000..bdec532 Binary files /dev/null and b/postgres/data/base/1/3575 differ diff --git a/postgres/data/base/1/3576 b/postgres/data/base/1/3576 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/3596 b/postgres/data/base/1/3596 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/3597 b/postgres/data/base/1/3597 new file mode 100755 index 0000000..8963738 Binary files /dev/null and b/postgres/data/base/1/3597 differ diff --git a/postgres/data/base/1/3598 b/postgres/data/base/1/3598 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/3599 b/postgres/data/base/1/3599 new file mode 100755 index 0000000..67582c2 Binary files /dev/null and b/postgres/data/base/1/3599 differ diff --git a/postgres/data/base/1/3600 b/postgres/data/base/1/3600 new file mode 100755 index 0000000..ecb95aa Binary files /dev/null and b/postgres/data/base/1/3600 differ diff --git a/postgres/data/base/1/3600_fsm b/postgres/data/base/1/3600_fsm new file mode 100755 index 0000000..cebec19 Binary files /dev/null and b/postgres/data/base/1/3600_fsm differ diff --git a/postgres/data/base/1/3600_vm b/postgres/data/base/1/3600_vm new file mode 100755 index 0000000..2a81cd7 Binary files /dev/null and b/postgres/data/base/1/3600_vm differ diff --git a/postgres/data/base/1/3601 b/postgres/data/base/1/3601 new file mode 100755 index 0000000..04c846e Binary files /dev/null and b/postgres/data/base/1/3601 differ diff --git a/postgres/data/base/1/3601_fsm b/postgres/data/base/1/3601_fsm new file mode 100755 index 0000000..7732d22 Binary files /dev/null and b/postgres/data/base/1/3601_fsm differ diff --git a/postgres/data/base/1/3601_vm b/postgres/data/base/1/3601_vm new file mode 100755 index 0000000..fa97895 Binary files /dev/null and b/postgres/data/base/1/3601_vm differ diff --git a/postgres/data/base/1/3602 b/postgres/data/base/1/3602 new file mode 100755 index 0000000..72fa641 Binary files /dev/null and b/postgres/data/base/1/3602 differ diff --git a/postgres/data/base/1/3602_fsm b/postgres/data/base/1/3602_fsm new file mode 100755 index 0000000..d7897de Binary files /dev/null and b/postgres/data/base/1/3602_fsm differ diff --git a/postgres/data/base/1/3602_vm b/postgres/data/base/1/3602_vm new file mode 100755 index 0000000..86d1c5b Binary files /dev/null and b/postgres/data/base/1/3602_vm differ diff --git a/postgres/data/base/1/3603 b/postgres/data/base/1/3603 new file mode 100755 index 0000000..3e8d72a Binary files /dev/null and b/postgres/data/base/1/3603 differ diff --git a/postgres/data/base/1/3603_fsm b/postgres/data/base/1/3603_fsm new file mode 100755 index 0000000..c28dd4f Binary files /dev/null and b/postgres/data/base/1/3603_fsm differ diff --git a/postgres/data/base/1/3603_vm b/postgres/data/base/1/3603_vm new file mode 100755 index 0000000..80a425d Binary files /dev/null and b/postgres/data/base/1/3603_vm differ diff --git a/postgres/data/base/1/3604 b/postgres/data/base/1/3604 new file mode 100755 index 0000000..6f5a0aa Binary files /dev/null and b/postgres/data/base/1/3604 differ diff --git a/postgres/data/base/1/3605 b/postgres/data/base/1/3605 new file mode 100755 index 0000000..0f77325 Binary files /dev/null and b/postgres/data/base/1/3605 differ diff --git a/postgres/data/base/1/3606 b/postgres/data/base/1/3606 new file mode 100755 index 0000000..698e6d0 Binary files /dev/null and b/postgres/data/base/1/3606 differ diff --git a/postgres/data/base/1/3607 b/postgres/data/base/1/3607 new file mode 100755 index 0000000..1d023e0 Binary files /dev/null and b/postgres/data/base/1/3607 differ diff --git a/postgres/data/base/1/3608 b/postgres/data/base/1/3608 new file mode 100755 index 0000000..b52499e Binary files /dev/null and b/postgres/data/base/1/3608 differ diff --git a/postgres/data/base/1/3609 b/postgres/data/base/1/3609 new file mode 100755 index 0000000..e8a1432 Binary files /dev/null and b/postgres/data/base/1/3609 differ diff --git a/postgres/data/base/1/3712 b/postgres/data/base/1/3712 new file mode 100755 index 0000000..2c8258b Binary files /dev/null and b/postgres/data/base/1/3712 differ diff --git a/postgres/data/base/1/3764 b/postgres/data/base/1/3764 new file mode 100755 index 0000000..8364b26 Binary files /dev/null and b/postgres/data/base/1/3764 differ diff --git a/postgres/data/base/1/3764_fsm b/postgres/data/base/1/3764_fsm new file mode 100755 index 0000000..f64db4d Binary files /dev/null and b/postgres/data/base/1/3764_fsm differ diff --git a/postgres/data/base/1/3764_vm b/postgres/data/base/1/3764_vm new file mode 100755 index 0000000..6bafd97 Binary files /dev/null and b/postgres/data/base/1/3764_vm differ diff --git a/postgres/data/base/1/3766 b/postgres/data/base/1/3766 new file mode 100755 index 0000000..67ec2eb Binary files /dev/null and b/postgres/data/base/1/3766 differ diff --git a/postgres/data/base/1/3767 b/postgres/data/base/1/3767 new file mode 100755 index 0000000..a279a5f Binary files /dev/null and b/postgres/data/base/1/3767 differ diff --git a/postgres/data/base/1/3997 b/postgres/data/base/1/3997 new file mode 100755 index 0000000..46564a3 Binary files /dev/null and b/postgres/data/base/1/3997 differ diff --git a/postgres/data/base/1/4143 b/postgres/data/base/1/4143 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/4144 b/postgres/data/base/1/4144 new file mode 100755 index 0000000..64af764 Binary files /dev/null and b/postgres/data/base/1/4144 differ diff --git a/postgres/data/base/1/4145 b/postgres/data/base/1/4145 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/4146 b/postgres/data/base/1/4146 new file mode 100755 index 0000000..1f029ea Binary files /dev/null and b/postgres/data/base/1/4146 differ diff --git a/postgres/data/base/1/4147 b/postgres/data/base/1/4147 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/4148 b/postgres/data/base/1/4148 new file mode 100755 index 0000000..5959a95 Binary files /dev/null and b/postgres/data/base/1/4148 differ diff --git a/postgres/data/base/1/4149 b/postgres/data/base/1/4149 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/4150 b/postgres/data/base/1/4150 new file mode 100755 index 0000000..5e11d49 Binary files /dev/null and b/postgres/data/base/1/4150 differ diff --git a/postgres/data/base/1/4151 b/postgres/data/base/1/4151 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/4152 b/postgres/data/base/1/4152 new file mode 100755 index 0000000..8acd468 Binary files /dev/null and b/postgres/data/base/1/4152 differ diff --git a/postgres/data/base/1/4153 b/postgres/data/base/1/4153 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/4154 b/postgres/data/base/1/4154 new file mode 100755 index 0000000..e597f61 Binary files /dev/null and b/postgres/data/base/1/4154 differ diff --git a/postgres/data/base/1/4155 b/postgres/data/base/1/4155 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/4156 b/postgres/data/base/1/4156 new file mode 100755 index 0000000..d653113 Binary files /dev/null and b/postgres/data/base/1/4156 differ diff --git a/postgres/data/base/1/4157 b/postgres/data/base/1/4157 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/4158 b/postgres/data/base/1/4158 new file mode 100755 index 0000000..355910c Binary files /dev/null and b/postgres/data/base/1/4158 differ diff --git a/postgres/data/base/1/4159 b/postgres/data/base/1/4159 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/4160 b/postgres/data/base/1/4160 new file mode 100755 index 0000000..7d09bfa Binary files /dev/null and b/postgres/data/base/1/4160 differ diff --git a/postgres/data/base/1/4163 b/postgres/data/base/1/4163 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/4164 b/postgres/data/base/1/4164 new file mode 100755 index 0000000..97adb95 Binary files /dev/null and b/postgres/data/base/1/4164 differ diff --git a/postgres/data/base/1/4165 b/postgres/data/base/1/4165 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/4166 b/postgres/data/base/1/4166 new file mode 100755 index 0000000..c0e3e5b Binary files /dev/null and b/postgres/data/base/1/4166 differ diff --git a/postgres/data/base/1/4167 b/postgres/data/base/1/4167 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/4168 b/postgres/data/base/1/4168 new file mode 100755 index 0000000..ddcb560 Binary files /dev/null and b/postgres/data/base/1/4168 differ diff --git a/postgres/data/base/1/4169 b/postgres/data/base/1/4169 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/4170 b/postgres/data/base/1/4170 new file mode 100755 index 0000000..5812a8e Binary files /dev/null and b/postgres/data/base/1/4170 differ diff --git a/postgres/data/base/1/4171 b/postgres/data/base/1/4171 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/4172 b/postgres/data/base/1/4172 new file mode 100755 index 0000000..84c04d6 Binary files /dev/null and b/postgres/data/base/1/4172 differ diff --git a/postgres/data/base/1/4173 b/postgres/data/base/1/4173 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/4174 b/postgres/data/base/1/4174 new file mode 100755 index 0000000..9b12bec Binary files /dev/null and b/postgres/data/base/1/4174 differ diff --git a/postgres/data/base/1/5002 b/postgres/data/base/1/5002 new file mode 100755 index 0000000..aefa40d Binary files /dev/null and b/postgres/data/base/1/5002 differ diff --git a/postgres/data/base/1/548 b/postgres/data/base/1/548 new file mode 100755 index 0000000..64fdefd Binary files /dev/null and b/postgres/data/base/1/548 differ diff --git a/postgres/data/base/1/549 b/postgres/data/base/1/549 new file mode 100755 index 0000000..3734cc2 Binary files /dev/null and b/postgres/data/base/1/549 differ diff --git a/postgres/data/base/1/6102 b/postgres/data/base/1/6102 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/6104 b/postgres/data/base/1/6104 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/6106 b/postgres/data/base/1/6106 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/6110 b/postgres/data/base/1/6110 new file mode 100755 index 0000000..42e1920 Binary files /dev/null and b/postgres/data/base/1/6110 differ diff --git a/postgres/data/base/1/6111 b/postgres/data/base/1/6111 new file mode 100755 index 0000000..d012727 Binary files /dev/null and b/postgres/data/base/1/6111 differ diff --git a/postgres/data/base/1/6112 b/postgres/data/base/1/6112 new file mode 100755 index 0000000..293367c Binary files /dev/null and b/postgres/data/base/1/6112 differ diff --git a/postgres/data/base/1/6113 b/postgres/data/base/1/6113 new file mode 100755 index 0000000..542f8fa Binary files /dev/null and b/postgres/data/base/1/6113 differ diff --git a/postgres/data/base/1/6116 b/postgres/data/base/1/6116 new file mode 100755 index 0000000..787d5d1 Binary files /dev/null and b/postgres/data/base/1/6116 differ diff --git a/postgres/data/base/1/6117 b/postgres/data/base/1/6117 new file mode 100755 index 0000000..2b5656b Binary files /dev/null and b/postgres/data/base/1/6117 differ diff --git a/postgres/data/base/1/6175 b/postgres/data/base/1/6175 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/6176 b/postgres/data/base/1/6176 new file mode 100755 index 0000000..6e5bcd6 Binary files /dev/null and b/postgres/data/base/1/6176 differ diff --git a/postgres/data/base/1/6228 b/postgres/data/base/1/6228 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/6229 b/postgres/data/base/1/6229 new file mode 100755 index 0000000..fae8f44 Binary files /dev/null and b/postgres/data/base/1/6229 differ diff --git a/postgres/data/base/1/6237 b/postgres/data/base/1/6237 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/6238 b/postgres/data/base/1/6238 new file mode 100755 index 0000000..e7c0e8c Binary files /dev/null and b/postgres/data/base/1/6238 differ diff --git a/postgres/data/base/1/6239 b/postgres/data/base/1/6239 new file mode 100755 index 0000000..6c60b50 Binary files /dev/null and b/postgres/data/base/1/6239 differ diff --git a/postgres/data/base/1/826 b/postgres/data/base/1/826 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/1/827 b/postgres/data/base/1/827 new file mode 100755 index 0000000..f102efd Binary files /dev/null and b/postgres/data/base/1/827 differ diff --git a/postgres/data/base/1/828 b/postgres/data/base/1/828 new file mode 100755 index 0000000..e97c210 Binary files /dev/null and b/postgres/data/base/1/828 differ diff --git a/postgres/data/base/1/PG_VERSION b/postgres/data/base/1/PG_VERSION new file mode 100755 index 0000000..98d9bcb --- /dev/null +++ b/postgres/data/base/1/PG_VERSION @@ -0,0 +1 @@ +17 diff --git a/postgres/data/base/1/pg_filenode.map b/postgres/data/base/1/pg_filenode.map new file mode 100755 index 0000000..4fc801a Binary files /dev/null and b/postgres/data/base/1/pg_filenode.map differ diff --git a/postgres/data/base/16384/112 b/postgres/data/base/16384/112 new file mode 100755 index 0000000..11201ef Binary files /dev/null and b/postgres/data/base/16384/112 differ diff --git a/postgres/data/base/16384/113 b/postgres/data/base/16384/113 new file mode 100755 index 0000000..cf7ec41 Binary files /dev/null and b/postgres/data/base/16384/113 differ diff --git a/postgres/data/base/16384/1247 b/postgres/data/base/16384/1247 new file mode 100755 index 0000000..160bb55 Binary files /dev/null and b/postgres/data/base/16384/1247 differ diff --git a/postgres/data/base/16384/1247_fsm b/postgres/data/base/16384/1247_fsm new file mode 100755 index 0000000..eb09a2d Binary files /dev/null and b/postgres/data/base/16384/1247_fsm differ diff --git a/postgres/data/base/16384/1247_vm b/postgres/data/base/16384/1247_vm new file mode 100755 index 0000000..b88850d Binary files /dev/null and b/postgres/data/base/16384/1247_vm differ diff --git a/postgres/data/base/16384/1249 b/postgres/data/base/16384/1249 new file mode 100755 index 0000000..1fa0969 Binary files /dev/null and b/postgres/data/base/16384/1249 differ diff --git a/postgres/data/base/16384/1249_fsm b/postgres/data/base/16384/1249_fsm new file mode 100755 index 0000000..cde35d8 Binary files /dev/null and b/postgres/data/base/16384/1249_fsm differ diff --git a/postgres/data/base/16384/1249_vm b/postgres/data/base/16384/1249_vm new file mode 100755 index 0000000..a5192d2 Binary files /dev/null and b/postgres/data/base/16384/1249_vm differ diff --git a/postgres/data/base/16384/1255 b/postgres/data/base/16384/1255 new file mode 100755 index 0000000..63d3f57 Binary files /dev/null and b/postgres/data/base/16384/1255 differ diff --git a/postgres/data/base/16384/1255_fsm b/postgres/data/base/16384/1255_fsm new file mode 100755 index 0000000..561b9ba Binary files /dev/null and b/postgres/data/base/16384/1255_fsm differ diff --git a/postgres/data/base/16384/1255_vm b/postgres/data/base/16384/1255_vm new file mode 100755 index 0000000..f8257db Binary files /dev/null and b/postgres/data/base/16384/1255_vm differ diff --git a/postgres/data/base/16384/1259 b/postgres/data/base/16384/1259 new file mode 100755 index 0000000..3b198c8 Binary files /dev/null and b/postgres/data/base/16384/1259 differ diff --git a/postgres/data/base/16384/1259_fsm b/postgres/data/base/16384/1259_fsm new file mode 100755 index 0000000..d507619 Binary files /dev/null and b/postgres/data/base/16384/1259_fsm differ diff --git a/postgres/data/base/16384/1259_vm b/postgres/data/base/16384/1259_vm new file mode 100755 index 0000000..536b099 Binary files /dev/null and b/postgres/data/base/16384/1259_vm differ diff --git a/postgres/data/base/16384/13463 b/postgres/data/base/16384/13463 new file mode 100755 index 0000000..e1c2169 Binary files /dev/null and b/postgres/data/base/16384/13463 differ diff --git a/postgres/data/base/16384/13463_fsm b/postgres/data/base/16384/13463_fsm new file mode 100755 index 0000000..b5a0768 Binary files /dev/null and b/postgres/data/base/16384/13463_fsm differ diff --git a/postgres/data/base/16384/13463_vm b/postgres/data/base/16384/13463_vm new file mode 100755 index 0000000..2d5ef48 Binary files /dev/null and b/postgres/data/base/16384/13463_vm differ diff --git a/postgres/data/base/16384/13466 b/postgres/data/base/16384/13466 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/13467 b/postgres/data/base/16384/13467 new file mode 100755 index 0000000..943fd98 Binary files /dev/null and b/postgres/data/base/16384/13467 differ diff --git a/postgres/data/base/16384/13468 b/postgres/data/base/16384/13468 new file mode 100755 index 0000000..536dd73 Binary files /dev/null and b/postgres/data/base/16384/13468 differ diff --git a/postgres/data/base/16384/13468_fsm b/postgres/data/base/16384/13468_fsm new file mode 100755 index 0000000..6ba1dc8 Binary files /dev/null and b/postgres/data/base/16384/13468_fsm differ diff --git a/postgres/data/base/16384/13468_vm b/postgres/data/base/16384/13468_vm new file mode 100755 index 0000000..0b7eef8 Binary files /dev/null and b/postgres/data/base/16384/13468_vm differ diff --git a/postgres/data/base/16384/13471 b/postgres/data/base/16384/13471 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/13472 b/postgres/data/base/16384/13472 new file mode 100755 index 0000000..734907e Binary files /dev/null and b/postgres/data/base/16384/13472 differ diff --git a/postgres/data/base/16384/13473 b/postgres/data/base/16384/13473 new file mode 100755 index 0000000..fe71daf Binary files /dev/null and b/postgres/data/base/16384/13473 differ diff --git a/postgres/data/base/16384/13473_fsm b/postgres/data/base/16384/13473_fsm new file mode 100755 index 0000000..ce4162e Binary files /dev/null and b/postgres/data/base/16384/13473_fsm differ diff --git a/postgres/data/base/16384/13473_vm b/postgres/data/base/16384/13473_vm new file mode 100755 index 0000000..0aa53a3 Binary files /dev/null and b/postgres/data/base/16384/13473_vm differ diff --git a/postgres/data/base/16384/13476 b/postgres/data/base/16384/13476 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/13477 b/postgres/data/base/16384/13477 new file mode 100755 index 0000000..2d2ded8 Binary files /dev/null and b/postgres/data/base/16384/13477 differ diff --git a/postgres/data/base/16384/13478 b/postgres/data/base/16384/13478 new file mode 100755 index 0000000..e2d95dc Binary files /dev/null and b/postgres/data/base/16384/13478 differ diff --git a/postgres/data/base/16384/13478_fsm b/postgres/data/base/16384/13478_fsm new file mode 100755 index 0000000..ba2fdcf Binary files /dev/null and b/postgres/data/base/16384/13478_fsm differ diff --git a/postgres/data/base/16384/13478_vm b/postgres/data/base/16384/13478_vm new file mode 100755 index 0000000..6446774 Binary files /dev/null and b/postgres/data/base/16384/13478_vm differ diff --git a/postgres/data/base/16384/13481 b/postgres/data/base/16384/13481 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/13482 b/postgres/data/base/16384/13482 new file mode 100755 index 0000000..41f613b Binary files /dev/null and b/postgres/data/base/16384/13482 differ diff --git a/postgres/data/base/16384/1417 b/postgres/data/base/16384/1417 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/1418 b/postgres/data/base/16384/1418 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/16407 b/postgres/data/base/16384/16407 new file mode 100755 index 0000000..6cb8c0d Binary files /dev/null and b/postgres/data/base/16384/16407 differ diff --git a/postgres/data/base/16384/16408 b/postgres/data/base/16384/16408 new file mode 100755 index 0000000..b1f6c18 Binary files /dev/null and b/postgres/data/base/16384/16408 differ diff --git a/postgres/data/base/16384/16412 b/postgres/data/base/16384/16412 new file mode 100755 index 0000000..0324c49 Binary files /dev/null and b/postgres/data/base/16384/16412 differ diff --git a/postgres/data/base/16384/16414 b/postgres/data/base/16384/16414 new file mode 100755 index 0000000..d1223ed Binary files /dev/null and b/postgres/data/base/16384/16414 differ diff --git a/postgres/data/base/16384/16435 b/postgres/data/base/16384/16435 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/16439 b/postgres/data/base/16384/16439 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/16440 b/postgres/data/base/16384/16440 new file mode 100755 index 0000000..d6d5528 Binary files /dev/null and b/postgres/data/base/16384/16440 differ diff --git a/postgres/data/base/16384/16441 b/postgres/data/base/16384/16441 new file mode 100755 index 0000000..8b1d88d Binary files /dev/null and b/postgres/data/base/16384/16441 differ diff --git a/postgres/data/base/16384/16448 b/postgres/data/base/16384/16448 new file mode 100755 index 0000000..5a65d4a Binary files /dev/null and b/postgres/data/base/16384/16448 differ diff --git a/postgres/data/base/16384/16449 b/postgres/data/base/16384/16449 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/16453 b/postgres/data/base/16384/16453 new file mode 100755 index 0000000..aab33b0 Binary files /dev/null and b/postgres/data/base/16384/16453 differ diff --git a/postgres/data/base/16384/16455 b/postgres/data/base/16384/16455 new file mode 100755 index 0000000..c5f45e7 Binary files /dev/null and b/postgres/data/base/16384/16455 differ diff --git a/postgres/data/base/16384/16462 b/postgres/data/base/16384/16462 new file mode 100755 index 0000000..34a230c Binary files /dev/null and b/postgres/data/base/16384/16462 differ diff --git a/postgres/data/base/16384/16463 b/postgres/data/base/16384/16463 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/16469 b/postgres/data/base/16384/16469 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/16470 b/postgres/data/base/16384/16470 new file mode 100755 index 0000000..1c4c738 Binary files /dev/null and b/postgres/data/base/16384/16470 differ diff --git a/postgres/data/base/16384/16471 b/postgres/data/base/16384/16471 new file mode 100755 index 0000000..3259282 Binary files /dev/null and b/postgres/data/base/16384/16471 differ diff --git a/postgres/data/base/16384/16473 b/postgres/data/base/16384/16473 new file mode 100755 index 0000000..23e1ee9 Binary files /dev/null and b/postgres/data/base/16384/16473 differ diff --git a/postgres/data/base/16384/16475 b/postgres/data/base/16384/16475 new file mode 100755 index 0000000..1369da5 Binary files /dev/null and b/postgres/data/base/16384/16475 differ diff --git a/postgres/data/base/16384/16476 b/postgres/data/base/16384/16476 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/16482 b/postgres/data/base/16384/16482 new file mode 100755 index 0000000..4f748ff Binary files /dev/null and b/postgres/data/base/16384/16482 differ diff --git a/postgres/data/base/16384/16484 b/postgres/data/base/16384/16484 new file mode 100755 index 0000000..c52b273 Binary files /dev/null and b/postgres/data/base/16384/16484 differ diff --git a/postgres/data/base/16384/16518 b/postgres/data/base/16384/16518 new file mode 100755 index 0000000..362c599 Binary files /dev/null and b/postgres/data/base/16384/16518 differ diff --git a/postgres/data/base/16384/16519 b/postgres/data/base/16384/16519 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/16525 b/postgres/data/base/16384/16525 new file mode 100755 index 0000000..1ef5e0c Binary files /dev/null and b/postgres/data/base/16384/16525 differ diff --git a/postgres/data/base/16384/174 b/postgres/data/base/16384/174 new file mode 100755 index 0000000..7c23e48 Binary files /dev/null and b/postgres/data/base/16384/174 differ diff --git a/postgres/data/base/16384/175 b/postgres/data/base/16384/175 new file mode 100755 index 0000000..414ab4d Binary files /dev/null and b/postgres/data/base/16384/175 differ diff --git a/postgres/data/base/16384/18403 b/postgres/data/base/16384/18403 new file mode 100755 index 0000000..79b9a3f Binary files /dev/null and b/postgres/data/base/16384/18403 differ diff --git a/postgres/data/base/16384/18404 b/postgres/data/base/16384/18404 new file mode 100755 index 0000000..b57f041 Binary files /dev/null and b/postgres/data/base/16384/18404 differ diff --git a/postgres/data/base/16384/18409 b/postgres/data/base/16384/18409 new file mode 100755 index 0000000..7bfe6cc Binary files /dev/null and b/postgres/data/base/16384/18409 differ diff --git a/postgres/data/base/16384/18411 b/postgres/data/base/16384/18411 new file mode 100755 index 0000000..16445be Binary files /dev/null and b/postgres/data/base/16384/18411 differ diff --git a/postgres/data/base/16384/18413 b/postgres/data/base/16384/18413 new file mode 100755 index 0000000..7ec318b Binary files /dev/null and b/postgres/data/base/16384/18413 differ diff --git a/postgres/data/base/16384/18414 b/postgres/data/base/16384/18414 new file mode 100755 index 0000000..3916b59 Binary files /dev/null and b/postgres/data/base/16384/18414 differ diff --git a/postgres/data/base/16384/18419 b/postgres/data/base/16384/18419 new file mode 100755 index 0000000..4e480bf Binary files /dev/null and b/postgres/data/base/16384/18419 differ diff --git a/postgres/data/base/16384/18421 b/postgres/data/base/16384/18421 new file mode 100755 index 0000000..7a8db56 Binary files /dev/null and b/postgres/data/base/16384/18421 differ diff --git a/postgres/data/base/16384/18428 b/postgres/data/base/16384/18428 new file mode 100755 index 0000000..fba21a7 Binary files /dev/null and b/postgres/data/base/16384/18428 differ diff --git a/postgres/data/base/16384/18429 b/postgres/data/base/16384/18429 new file mode 100755 index 0000000..68425ae Binary files /dev/null and b/postgres/data/base/16384/18429 differ diff --git a/postgres/data/base/16384/18438 b/postgres/data/base/16384/18438 new file mode 100755 index 0000000..fbbf23f Binary files /dev/null and b/postgres/data/base/16384/18438 differ diff --git a/postgres/data/base/16384/18455 b/postgres/data/base/16384/18455 new file mode 100755 index 0000000..67e300d Binary files /dev/null and b/postgres/data/base/16384/18455 differ diff --git a/postgres/data/base/16384/18456 b/postgres/data/base/16384/18456 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/18462 b/postgres/data/base/16384/18462 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/18463 b/postgres/data/base/16384/18463 new file mode 100755 index 0000000..336718e Binary files /dev/null and b/postgres/data/base/16384/18463 differ diff --git a/postgres/data/base/16384/18464 b/postgres/data/base/16384/18464 new file mode 100755 index 0000000..2996ab7 Binary files /dev/null and b/postgres/data/base/16384/18464 differ diff --git a/postgres/data/base/16384/18476 b/postgres/data/base/16384/18476 new file mode 100755 index 0000000..9539f8b Binary files /dev/null and b/postgres/data/base/16384/18476 differ diff --git a/postgres/data/base/16384/18477 b/postgres/data/base/16384/18477 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/18484 b/postgres/data/base/16384/18484 new file mode 100755 index 0000000..43383d0 Binary files /dev/null and b/postgres/data/base/16384/18484 differ diff --git a/postgres/data/base/16384/18486 b/postgres/data/base/16384/18486 new file mode 100755 index 0000000..60ea475 Binary files /dev/null and b/postgres/data/base/16384/18486 differ diff --git a/postgres/data/base/16384/18493 b/postgres/data/base/16384/18493 new file mode 100755 index 0000000..3c6e70f Binary files /dev/null and b/postgres/data/base/16384/18493 differ diff --git a/postgres/data/base/16384/18494 b/postgres/data/base/16384/18494 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/18502 b/postgres/data/base/16384/18502 new file mode 100755 index 0000000..af73811 Binary files /dev/null and b/postgres/data/base/16384/18502 differ diff --git a/postgres/data/base/16384/18504 b/postgres/data/base/16384/18504 new file mode 100755 index 0000000..4ca1602 Binary files /dev/null and b/postgres/data/base/16384/18504 differ diff --git a/postgres/data/base/16384/18505 b/postgres/data/base/16384/18505 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/18512 b/postgres/data/base/16384/18512 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/18513 b/postgres/data/base/16384/18513 new file mode 100755 index 0000000..d7a96e6 Binary files /dev/null and b/postgres/data/base/16384/18513 differ diff --git a/postgres/data/base/16384/18514 b/postgres/data/base/16384/18514 new file mode 100755 index 0000000..75728b6 Binary files /dev/null and b/postgres/data/base/16384/18514 differ diff --git a/postgres/data/base/16384/18524 b/postgres/data/base/16384/18524 new file mode 100755 index 0000000..8568b56 Binary files /dev/null and b/postgres/data/base/16384/18524 differ diff --git a/postgres/data/base/16384/18525 b/postgres/data/base/16384/18525 new file mode 100755 index 0000000..fd3ac6f Binary files /dev/null and b/postgres/data/base/16384/18525 differ diff --git a/postgres/data/base/16384/18530 b/postgres/data/base/16384/18530 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/18531 b/postgres/data/base/16384/18531 new file mode 100755 index 0000000..f899145 Binary files /dev/null and b/postgres/data/base/16384/18531 differ diff --git a/postgres/data/base/16384/18532 b/postgres/data/base/16384/18532 new file mode 100755 index 0000000..93d4a63 Binary files /dev/null and b/postgres/data/base/16384/18532 differ diff --git a/postgres/data/base/16384/18534 b/postgres/data/base/16384/18534 new file mode 100755 index 0000000..ddaa69f Binary files /dev/null and b/postgres/data/base/16384/18534 differ diff --git a/postgres/data/base/16384/18536 b/postgres/data/base/16384/18536 new file mode 100755 index 0000000..9349337 Binary files /dev/null and b/postgres/data/base/16384/18536 differ diff --git a/postgres/data/base/16384/18537 b/postgres/data/base/16384/18537 new file mode 100755 index 0000000..3cb2b23 Binary files /dev/null and b/postgres/data/base/16384/18537 differ diff --git a/postgres/data/base/16384/18542 b/postgres/data/base/16384/18542 new file mode 100755 index 0000000..77e8955 Binary files /dev/null and b/postgres/data/base/16384/18542 differ diff --git a/postgres/data/base/16384/2187 b/postgres/data/base/16384/2187 new file mode 100755 index 0000000..4ca9bfd Binary files /dev/null and b/postgres/data/base/16384/2187 differ diff --git a/postgres/data/base/16384/2224 b/postgres/data/base/16384/2224 new file mode 100755 index 0000000..e155f77 Binary files /dev/null and b/postgres/data/base/16384/2224 differ diff --git a/postgres/data/base/16384/2228 b/postgres/data/base/16384/2228 new file mode 100755 index 0000000..9e62b61 Binary files /dev/null and b/postgres/data/base/16384/2228 differ diff --git a/postgres/data/base/16384/2328 b/postgres/data/base/16384/2328 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/2336 b/postgres/data/base/16384/2336 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/2337 b/postgres/data/base/16384/2337 new file mode 100755 index 0000000..0d54d2e Binary files /dev/null and b/postgres/data/base/16384/2337 differ diff --git a/postgres/data/base/16384/2579 b/postgres/data/base/16384/2579 new file mode 100755 index 0000000..f91467d Binary files /dev/null and b/postgres/data/base/16384/2579 differ diff --git a/postgres/data/base/16384/2600 b/postgres/data/base/16384/2600 new file mode 100755 index 0000000..d4f18a6 Binary files /dev/null and b/postgres/data/base/16384/2600 differ diff --git a/postgres/data/base/16384/2600_fsm b/postgres/data/base/16384/2600_fsm new file mode 100755 index 0000000..e9dd1c0 Binary files /dev/null and b/postgres/data/base/16384/2600_fsm differ diff --git a/postgres/data/base/16384/2600_vm b/postgres/data/base/16384/2600_vm new file mode 100755 index 0000000..ad035d8 Binary files /dev/null and b/postgres/data/base/16384/2600_vm differ diff --git a/postgres/data/base/16384/2601 b/postgres/data/base/16384/2601 new file mode 100755 index 0000000..8f392b8 Binary files /dev/null and b/postgres/data/base/16384/2601 differ diff --git a/postgres/data/base/16384/2601_fsm b/postgres/data/base/16384/2601_fsm new file mode 100755 index 0000000..60ac026 Binary files /dev/null and b/postgres/data/base/16384/2601_fsm differ diff --git a/postgres/data/base/16384/2601_vm b/postgres/data/base/16384/2601_vm new file mode 100755 index 0000000..8d2d6cf Binary files /dev/null and b/postgres/data/base/16384/2601_vm differ diff --git a/postgres/data/base/16384/2602 b/postgres/data/base/16384/2602 new file mode 100755 index 0000000..1ee643f Binary files /dev/null and b/postgres/data/base/16384/2602 differ diff --git a/postgres/data/base/16384/2602_fsm b/postgres/data/base/16384/2602_fsm new file mode 100755 index 0000000..d16f4bc Binary files /dev/null and b/postgres/data/base/16384/2602_fsm differ diff --git a/postgres/data/base/16384/2602_vm b/postgres/data/base/16384/2602_vm new file mode 100755 index 0000000..e40d4d3 Binary files /dev/null and b/postgres/data/base/16384/2602_vm differ diff --git a/postgres/data/base/16384/2603 b/postgres/data/base/16384/2603 new file mode 100755 index 0000000..d38f1bf Binary files /dev/null and b/postgres/data/base/16384/2603 differ diff --git a/postgres/data/base/16384/2603_fsm b/postgres/data/base/16384/2603_fsm new file mode 100755 index 0000000..86cb2a1 Binary files /dev/null and b/postgres/data/base/16384/2603_fsm differ diff --git a/postgres/data/base/16384/2603_vm b/postgres/data/base/16384/2603_vm new file mode 100755 index 0000000..9a933d7 Binary files /dev/null and b/postgres/data/base/16384/2603_vm differ diff --git a/postgres/data/base/16384/2604 b/postgres/data/base/16384/2604 new file mode 100755 index 0000000..2d329ec Binary files /dev/null and b/postgres/data/base/16384/2604 differ diff --git a/postgres/data/base/16384/2604_fsm b/postgres/data/base/16384/2604_fsm new file mode 100755 index 0000000..47f131b Binary files /dev/null and b/postgres/data/base/16384/2604_fsm differ diff --git a/postgres/data/base/16384/2605 b/postgres/data/base/16384/2605 new file mode 100755 index 0000000..3de7c18 Binary files /dev/null and b/postgres/data/base/16384/2605 differ diff --git a/postgres/data/base/16384/2605_fsm b/postgres/data/base/16384/2605_fsm new file mode 100755 index 0000000..e8c48da Binary files /dev/null and b/postgres/data/base/16384/2605_fsm differ diff --git a/postgres/data/base/16384/2605_vm b/postgres/data/base/16384/2605_vm new file mode 100755 index 0000000..00bc081 Binary files /dev/null and b/postgres/data/base/16384/2605_vm differ diff --git a/postgres/data/base/16384/2606 b/postgres/data/base/16384/2606 new file mode 100755 index 0000000..5e76323 Binary files /dev/null and b/postgres/data/base/16384/2606 differ diff --git a/postgres/data/base/16384/2606_fsm b/postgres/data/base/16384/2606_fsm new file mode 100755 index 0000000..7c2c1ae Binary files /dev/null and b/postgres/data/base/16384/2606_fsm differ diff --git a/postgres/data/base/16384/2606_vm b/postgres/data/base/16384/2606_vm new file mode 100755 index 0000000..3203aec Binary files /dev/null and b/postgres/data/base/16384/2606_vm differ diff --git a/postgres/data/base/16384/2607 b/postgres/data/base/16384/2607 new file mode 100755 index 0000000..c6faef3 Binary files /dev/null and b/postgres/data/base/16384/2607 differ diff --git a/postgres/data/base/16384/2607_fsm b/postgres/data/base/16384/2607_fsm new file mode 100755 index 0000000..3d457fb Binary files /dev/null and b/postgres/data/base/16384/2607_fsm differ diff --git a/postgres/data/base/16384/2607_vm b/postgres/data/base/16384/2607_vm new file mode 100755 index 0000000..33a9c12 Binary files /dev/null and b/postgres/data/base/16384/2607_vm differ diff --git a/postgres/data/base/16384/2608 b/postgres/data/base/16384/2608 new file mode 100755 index 0000000..5c163aa Binary files /dev/null and b/postgres/data/base/16384/2608 differ diff --git a/postgres/data/base/16384/2608_fsm b/postgres/data/base/16384/2608_fsm new file mode 100755 index 0000000..61241ac Binary files /dev/null and b/postgres/data/base/16384/2608_fsm differ diff --git a/postgres/data/base/16384/2608_vm b/postgres/data/base/16384/2608_vm new file mode 100755 index 0000000..9fa8da6 Binary files /dev/null and b/postgres/data/base/16384/2608_vm differ diff --git a/postgres/data/base/16384/2609 b/postgres/data/base/16384/2609 new file mode 100755 index 0000000..6e348d7 Binary files /dev/null and b/postgres/data/base/16384/2609 differ diff --git a/postgres/data/base/16384/2609_fsm b/postgres/data/base/16384/2609_fsm new file mode 100755 index 0000000..d1dd644 Binary files /dev/null and b/postgres/data/base/16384/2609_fsm differ diff --git a/postgres/data/base/16384/2609_vm b/postgres/data/base/16384/2609_vm new file mode 100755 index 0000000..a4d83c1 Binary files /dev/null and b/postgres/data/base/16384/2609_vm differ diff --git a/postgres/data/base/16384/2610 b/postgres/data/base/16384/2610 new file mode 100755 index 0000000..b4f0cb5 Binary files /dev/null and b/postgres/data/base/16384/2610 differ diff --git a/postgres/data/base/16384/2610_fsm b/postgres/data/base/16384/2610_fsm new file mode 100755 index 0000000..1c6ee29 Binary files /dev/null and b/postgres/data/base/16384/2610_fsm differ diff --git a/postgres/data/base/16384/2610_vm b/postgres/data/base/16384/2610_vm new file mode 100755 index 0000000..ee8fcb6 Binary files /dev/null and b/postgres/data/base/16384/2610_vm differ diff --git a/postgres/data/base/16384/2611 b/postgres/data/base/16384/2611 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/2612 b/postgres/data/base/16384/2612 new file mode 100755 index 0000000..0e1786c Binary files /dev/null and b/postgres/data/base/16384/2612 differ diff --git a/postgres/data/base/16384/2612_fsm b/postgres/data/base/16384/2612_fsm new file mode 100755 index 0000000..4c247dc Binary files /dev/null and b/postgres/data/base/16384/2612_fsm differ diff --git a/postgres/data/base/16384/2612_vm b/postgres/data/base/16384/2612_vm new file mode 100755 index 0000000..a6a6b92 Binary files /dev/null and b/postgres/data/base/16384/2612_vm differ diff --git a/postgres/data/base/16384/2613 b/postgres/data/base/16384/2613 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/2615 b/postgres/data/base/16384/2615 new file mode 100755 index 0000000..08ca449 Binary files /dev/null and b/postgres/data/base/16384/2615 differ diff --git a/postgres/data/base/16384/2615_fsm b/postgres/data/base/16384/2615_fsm new file mode 100755 index 0000000..c5dc50f Binary files /dev/null and b/postgres/data/base/16384/2615_fsm differ diff --git a/postgres/data/base/16384/2615_vm b/postgres/data/base/16384/2615_vm new file mode 100755 index 0000000..ccb6cf6 Binary files /dev/null and b/postgres/data/base/16384/2615_vm differ diff --git a/postgres/data/base/16384/2616 b/postgres/data/base/16384/2616 new file mode 100755 index 0000000..5461be2 Binary files /dev/null and b/postgres/data/base/16384/2616 differ diff --git a/postgres/data/base/16384/2616_fsm b/postgres/data/base/16384/2616_fsm new file mode 100755 index 0000000..80998ac Binary files /dev/null and b/postgres/data/base/16384/2616_fsm differ diff --git a/postgres/data/base/16384/2616_vm b/postgres/data/base/16384/2616_vm new file mode 100755 index 0000000..3a6eb54 Binary files /dev/null and b/postgres/data/base/16384/2616_vm differ diff --git a/postgres/data/base/16384/2617 b/postgres/data/base/16384/2617 new file mode 100755 index 0000000..9106731 Binary files /dev/null and b/postgres/data/base/16384/2617 differ diff --git a/postgres/data/base/16384/2617_fsm b/postgres/data/base/16384/2617_fsm new file mode 100755 index 0000000..dd05894 Binary files /dev/null and b/postgres/data/base/16384/2617_fsm differ diff --git a/postgres/data/base/16384/2617_vm b/postgres/data/base/16384/2617_vm new file mode 100755 index 0000000..2b14890 Binary files /dev/null and b/postgres/data/base/16384/2617_vm differ diff --git a/postgres/data/base/16384/2618 b/postgres/data/base/16384/2618 new file mode 100755 index 0000000..3ddb859 Binary files /dev/null and b/postgres/data/base/16384/2618 differ diff --git a/postgres/data/base/16384/2618_fsm b/postgres/data/base/16384/2618_fsm new file mode 100755 index 0000000..8c0af73 Binary files /dev/null and b/postgres/data/base/16384/2618_fsm differ diff --git a/postgres/data/base/16384/2618_vm b/postgres/data/base/16384/2618_vm new file mode 100755 index 0000000..b1de471 Binary files /dev/null and b/postgres/data/base/16384/2618_vm differ diff --git a/postgres/data/base/16384/2619 b/postgres/data/base/16384/2619 new file mode 100755 index 0000000..ff776d2 Binary files /dev/null and b/postgres/data/base/16384/2619 differ diff --git a/postgres/data/base/16384/2619_fsm b/postgres/data/base/16384/2619_fsm new file mode 100755 index 0000000..8e7418b Binary files /dev/null and b/postgres/data/base/16384/2619_fsm differ diff --git a/postgres/data/base/16384/2619_vm b/postgres/data/base/16384/2619_vm new file mode 100755 index 0000000..80e6fed Binary files /dev/null and b/postgres/data/base/16384/2619_vm differ diff --git a/postgres/data/base/16384/2620 b/postgres/data/base/16384/2620 new file mode 100755 index 0000000..db8c74e Binary files /dev/null and b/postgres/data/base/16384/2620 differ diff --git a/postgres/data/base/16384/2620_fsm b/postgres/data/base/16384/2620_fsm new file mode 100755 index 0000000..0707a4d Binary files /dev/null and b/postgres/data/base/16384/2620_fsm differ diff --git a/postgres/data/base/16384/2620_vm b/postgres/data/base/16384/2620_vm new file mode 100755 index 0000000..61a2832 Binary files /dev/null and b/postgres/data/base/16384/2620_vm differ diff --git a/postgres/data/base/16384/2650 b/postgres/data/base/16384/2650 new file mode 100755 index 0000000..dc3014c Binary files /dev/null and b/postgres/data/base/16384/2650 differ diff --git a/postgres/data/base/16384/2651 b/postgres/data/base/16384/2651 new file mode 100755 index 0000000..e9b2036 Binary files /dev/null and b/postgres/data/base/16384/2651 differ diff --git a/postgres/data/base/16384/2652 b/postgres/data/base/16384/2652 new file mode 100755 index 0000000..e131e29 Binary files /dev/null and b/postgres/data/base/16384/2652 differ diff --git a/postgres/data/base/16384/2653 b/postgres/data/base/16384/2653 new file mode 100755 index 0000000..935d748 Binary files /dev/null and b/postgres/data/base/16384/2653 differ diff --git a/postgres/data/base/16384/2654 b/postgres/data/base/16384/2654 new file mode 100755 index 0000000..b81b4a2 Binary files /dev/null and b/postgres/data/base/16384/2654 differ diff --git a/postgres/data/base/16384/2655 b/postgres/data/base/16384/2655 new file mode 100755 index 0000000..8eeccd4 Binary files /dev/null and b/postgres/data/base/16384/2655 differ diff --git a/postgres/data/base/16384/2656 b/postgres/data/base/16384/2656 new file mode 100755 index 0000000..6043e9c Binary files /dev/null and b/postgres/data/base/16384/2656 differ diff --git a/postgres/data/base/16384/2657 b/postgres/data/base/16384/2657 new file mode 100755 index 0000000..fa16b75 Binary files /dev/null and b/postgres/data/base/16384/2657 differ diff --git a/postgres/data/base/16384/2658 b/postgres/data/base/16384/2658 new file mode 100755 index 0000000..3c1a911 Binary files /dev/null and b/postgres/data/base/16384/2658 differ diff --git a/postgres/data/base/16384/2659 b/postgres/data/base/16384/2659 new file mode 100755 index 0000000..26150a8 Binary files /dev/null and b/postgres/data/base/16384/2659 differ diff --git a/postgres/data/base/16384/2660 b/postgres/data/base/16384/2660 new file mode 100755 index 0000000..59f3f58 Binary files /dev/null and b/postgres/data/base/16384/2660 differ diff --git a/postgres/data/base/16384/2661 b/postgres/data/base/16384/2661 new file mode 100755 index 0000000..44dc805 Binary files /dev/null and b/postgres/data/base/16384/2661 differ diff --git a/postgres/data/base/16384/2662 b/postgres/data/base/16384/2662 new file mode 100755 index 0000000..fa940de Binary files /dev/null and b/postgres/data/base/16384/2662 differ diff --git a/postgres/data/base/16384/2663 b/postgres/data/base/16384/2663 new file mode 100755 index 0000000..1ae0bb4 Binary files /dev/null and b/postgres/data/base/16384/2663 differ diff --git a/postgres/data/base/16384/2664 b/postgres/data/base/16384/2664 new file mode 100755 index 0000000..c3127ac Binary files /dev/null and b/postgres/data/base/16384/2664 differ diff --git a/postgres/data/base/16384/2665 b/postgres/data/base/16384/2665 new file mode 100755 index 0000000..51ded23 Binary files /dev/null and b/postgres/data/base/16384/2665 differ diff --git a/postgres/data/base/16384/2666 b/postgres/data/base/16384/2666 new file mode 100755 index 0000000..46ae04b Binary files /dev/null and b/postgres/data/base/16384/2666 differ diff --git a/postgres/data/base/16384/2667 b/postgres/data/base/16384/2667 new file mode 100755 index 0000000..b993ceb Binary files /dev/null and b/postgres/data/base/16384/2667 differ diff --git a/postgres/data/base/16384/2668 b/postgres/data/base/16384/2668 new file mode 100755 index 0000000..aa2bf8b Binary files /dev/null and b/postgres/data/base/16384/2668 differ diff --git a/postgres/data/base/16384/2669 b/postgres/data/base/16384/2669 new file mode 100755 index 0000000..d7997ca Binary files /dev/null and b/postgres/data/base/16384/2669 differ diff --git a/postgres/data/base/16384/2670 b/postgres/data/base/16384/2670 new file mode 100755 index 0000000..59e83bf Binary files /dev/null and b/postgres/data/base/16384/2670 differ diff --git a/postgres/data/base/16384/2673 b/postgres/data/base/16384/2673 new file mode 100755 index 0000000..6c25b5c Binary files /dev/null and b/postgres/data/base/16384/2673 differ diff --git a/postgres/data/base/16384/2674 b/postgres/data/base/16384/2674 new file mode 100755 index 0000000..3c63eff Binary files /dev/null and b/postgres/data/base/16384/2674 differ diff --git a/postgres/data/base/16384/2675 b/postgres/data/base/16384/2675 new file mode 100755 index 0000000..6fcdce0 Binary files /dev/null and b/postgres/data/base/16384/2675 differ diff --git a/postgres/data/base/16384/2678 b/postgres/data/base/16384/2678 new file mode 100755 index 0000000..68dd32c Binary files /dev/null and b/postgres/data/base/16384/2678 differ diff --git a/postgres/data/base/16384/2679 b/postgres/data/base/16384/2679 new file mode 100755 index 0000000..4fa9818 Binary files /dev/null and b/postgres/data/base/16384/2679 differ diff --git a/postgres/data/base/16384/2680 b/postgres/data/base/16384/2680 new file mode 100755 index 0000000..2ded4f5 Binary files /dev/null and b/postgres/data/base/16384/2680 differ diff --git a/postgres/data/base/16384/2681 b/postgres/data/base/16384/2681 new file mode 100755 index 0000000..147835c Binary files /dev/null and b/postgres/data/base/16384/2681 differ diff --git a/postgres/data/base/16384/2682 b/postgres/data/base/16384/2682 new file mode 100755 index 0000000..d3d575f Binary files /dev/null and b/postgres/data/base/16384/2682 differ diff --git a/postgres/data/base/16384/2683 b/postgres/data/base/16384/2683 new file mode 100755 index 0000000..909435b Binary files /dev/null and b/postgres/data/base/16384/2683 differ diff --git a/postgres/data/base/16384/2684 b/postgres/data/base/16384/2684 new file mode 100755 index 0000000..c498415 Binary files /dev/null and b/postgres/data/base/16384/2684 differ diff --git a/postgres/data/base/16384/2685 b/postgres/data/base/16384/2685 new file mode 100755 index 0000000..4d7e633 Binary files /dev/null and b/postgres/data/base/16384/2685 differ diff --git a/postgres/data/base/16384/2686 b/postgres/data/base/16384/2686 new file mode 100755 index 0000000..849ebc6 Binary files /dev/null and b/postgres/data/base/16384/2686 differ diff --git a/postgres/data/base/16384/2687 b/postgres/data/base/16384/2687 new file mode 100755 index 0000000..965a43b Binary files /dev/null and b/postgres/data/base/16384/2687 differ diff --git a/postgres/data/base/16384/2688 b/postgres/data/base/16384/2688 new file mode 100755 index 0000000..1d2fab9 Binary files /dev/null and b/postgres/data/base/16384/2688 differ diff --git a/postgres/data/base/16384/2689 b/postgres/data/base/16384/2689 new file mode 100755 index 0000000..7975d30 Binary files /dev/null and b/postgres/data/base/16384/2689 differ diff --git a/postgres/data/base/16384/2690 b/postgres/data/base/16384/2690 new file mode 100755 index 0000000..99e770e Binary files /dev/null and b/postgres/data/base/16384/2690 differ diff --git a/postgres/data/base/16384/2691 b/postgres/data/base/16384/2691 new file mode 100755 index 0000000..a824dba Binary files /dev/null and b/postgres/data/base/16384/2691 differ diff --git a/postgres/data/base/16384/2692 b/postgres/data/base/16384/2692 new file mode 100755 index 0000000..4d05d75 Binary files /dev/null and b/postgres/data/base/16384/2692 differ diff --git a/postgres/data/base/16384/2693 b/postgres/data/base/16384/2693 new file mode 100755 index 0000000..4e62759 Binary files /dev/null and b/postgres/data/base/16384/2693 differ diff --git a/postgres/data/base/16384/2696 b/postgres/data/base/16384/2696 new file mode 100755 index 0000000..9042034 Binary files /dev/null and b/postgres/data/base/16384/2696 differ diff --git a/postgres/data/base/16384/2699 b/postgres/data/base/16384/2699 new file mode 100755 index 0000000..4774477 Binary files /dev/null and b/postgres/data/base/16384/2699 differ diff --git a/postgres/data/base/16384/2701 b/postgres/data/base/16384/2701 new file mode 100755 index 0000000..7f93146 Binary files /dev/null and b/postgres/data/base/16384/2701 differ diff --git a/postgres/data/base/16384/2702 b/postgres/data/base/16384/2702 new file mode 100755 index 0000000..ee30e2e Binary files /dev/null and b/postgres/data/base/16384/2702 differ diff --git a/postgres/data/base/16384/2703 b/postgres/data/base/16384/2703 new file mode 100755 index 0000000..2d957c8 Binary files /dev/null and b/postgres/data/base/16384/2703 differ diff --git a/postgres/data/base/16384/2704 b/postgres/data/base/16384/2704 new file mode 100755 index 0000000..71e4d55 Binary files /dev/null and b/postgres/data/base/16384/2704 differ diff --git a/postgres/data/base/16384/2753 b/postgres/data/base/16384/2753 new file mode 100755 index 0000000..7190df7 Binary files /dev/null and b/postgres/data/base/16384/2753 differ diff --git a/postgres/data/base/16384/2753_fsm b/postgres/data/base/16384/2753_fsm new file mode 100755 index 0000000..e8bd4e0 Binary files /dev/null and b/postgres/data/base/16384/2753_fsm differ diff --git a/postgres/data/base/16384/2753_vm b/postgres/data/base/16384/2753_vm new file mode 100755 index 0000000..2a2e36f Binary files /dev/null and b/postgres/data/base/16384/2753_vm differ diff --git a/postgres/data/base/16384/2754 b/postgres/data/base/16384/2754 new file mode 100755 index 0000000..2cb9696 Binary files /dev/null and b/postgres/data/base/16384/2754 differ diff --git a/postgres/data/base/16384/2755 b/postgres/data/base/16384/2755 new file mode 100755 index 0000000..a658d52 Binary files /dev/null and b/postgres/data/base/16384/2755 differ diff --git a/postgres/data/base/16384/2756 b/postgres/data/base/16384/2756 new file mode 100755 index 0000000..294a409 Binary files /dev/null and b/postgres/data/base/16384/2756 differ diff --git a/postgres/data/base/16384/2757 b/postgres/data/base/16384/2757 new file mode 100755 index 0000000..bc6c6b3 Binary files /dev/null and b/postgres/data/base/16384/2757 differ diff --git a/postgres/data/base/16384/2830 b/postgres/data/base/16384/2830 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/2831 b/postgres/data/base/16384/2831 new file mode 100755 index 0000000..29e3d32 Binary files /dev/null and b/postgres/data/base/16384/2831 differ diff --git a/postgres/data/base/16384/2832 b/postgres/data/base/16384/2832 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/2833 b/postgres/data/base/16384/2833 new file mode 100755 index 0000000..8f5d799 Binary files /dev/null and b/postgres/data/base/16384/2833 differ diff --git a/postgres/data/base/16384/2834 b/postgres/data/base/16384/2834 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/2835 b/postgres/data/base/16384/2835 new file mode 100755 index 0000000..2040f4b Binary files /dev/null and b/postgres/data/base/16384/2835 differ diff --git a/postgres/data/base/16384/2836 b/postgres/data/base/16384/2836 new file mode 100755 index 0000000..b829af4 Binary files /dev/null and b/postgres/data/base/16384/2836 differ diff --git a/postgres/data/base/16384/2836_fsm b/postgres/data/base/16384/2836_fsm new file mode 100755 index 0000000..2b3f3a1 Binary files /dev/null and b/postgres/data/base/16384/2836_fsm differ diff --git a/postgres/data/base/16384/2836_vm b/postgres/data/base/16384/2836_vm new file mode 100755 index 0000000..4066fa1 Binary files /dev/null and b/postgres/data/base/16384/2836_vm differ diff --git a/postgres/data/base/16384/2837 b/postgres/data/base/16384/2837 new file mode 100755 index 0000000..c2076b1 Binary files /dev/null and b/postgres/data/base/16384/2837 differ diff --git a/postgres/data/base/16384/2838 b/postgres/data/base/16384/2838 new file mode 100755 index 0000000..d5156db Binary files /dev/null and b/postgres/data/base/16384/2838 differ diff --git a/postgres/data/base/16384/2838_fsm b/postgres/data/base/16384/2838_fsm new file mode 100755 index 0000000..95ebfae Binary files /dev/null and b/postgres/data/base/16384/2838_fsm differ diff --git a/postgres/data/base/16384/2838_vm b/postgres/data/base/16384/2838_vm new file mode 100755 index 0000000..5b2c90a Binary files /dev/null and b/postgres/data/base/16384/2838_vm differ diff --git a/postgres/data/base/16384/2839 b/postgres/data/base/16384/2839 new file mode 100755 index 0000000..4ba7810 Binary files /dev/null and b/postgres/data/base/16384/2839 differ diff --git a/postgres/data/base/16384/2840 b/postgres/data/base/16384/2840 new file mode 100755 index 0000000..4b4f348 Binary files /dev/null and b/postgres/data/base/16384/2840 differ diff --git a/postgres/data/base/16384/2840_fsm b/postgres/data/base/16384/2840_fsm new file mode 100755 index 0000000..8578974 Binary files /dev/null and b/postgres/data/base/16384/2840_fsm differ diff --git a/postgres/data/base/16384/2840_vm b/postgres/data/base/16384/2840_vm new file mode 100755 index 0000000..748d6ae Binary files /dev/null and b/postgres/data/base/16384/2840_vm differ diff --git a/postgres/data/base/16384/2841 b/postgres/data/base/16384/2841 new file mode 100755 index 0000000..c3446c5 Binary files /dev/null and b/postgres/data/base/16384/2841 differ diff --git a/postgres/data/base/16384/2995 b/postgres/data/base/16384/2995 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/2996 b/postgres/data/base/16384/2996 new file mode 100755 index 0000000..91590a5 Binary files /dev/null and b/postgres/data/base/16384/2996 differ diff --git a/postgres/data/base/16384/3079 b/postgres/data/base/16384/3079 new file mode 100755 index 0000000..78fffe3 Binary files /dev/null and b/postgres/data/base/16384/3079 differ diff --git a/postgres/data/base/16384/3079_fsm b/postgres/data/base/16384/3079_fsm new file mode 100755 index 0000000..8a551b7 Binary files /dev/null and b/postgres/data/base/16384/3079_fsm differ diff --git a/postgres/data/base/16384/3079_vm b/postgres/data/base/16384/3079_vm new file mode 100755 index 0000000..190ed23 Binary files /dev/null and b/postgres/data/base/16384/3079_vm differ diff --git a/postgres/data/base/16384/3080 b/postgres/data/base/16384/3080 new file mode 100755 index 0000000..9e04957 Binary files /dev/null and b/postgres/data/base/16384/3080 differ diff --git a/postgres/data/base/16384/3081 b/postgres/data/base/16384/3081 new file mode 100755 index 0000000..b0f4b3a Binary files /dev/null and b/postgres/data/base/16384/3081 differ diff --git a/postgres/data/base/16384/3085 b/postgres/data/base/16384/3085 new file mode 100755 index 0000000..a2a748b Binary files /dev/null and b/postgres/data/base/16384/3085 differ diff --git a/postgres/data/base/16384/3118 b/postgres/data/base/16384/3118 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/3119 b/postgres/data/base/16384/3119 new file mode 100755 index 0000000..fc5e2ff Binary files /dev/null and b/postgres/data/base/16384/3119 differ diff --git a/postgres/data/base/16384/3164 b/postgres/data/base/16384/3164 new file mode 100755 index 0000000..2990da9 Binary files /dev/null and b/postgres/data/base/16384/3164 differ diff --git a/postgres/data/base/16384/3256 b/postgres/data/base/16384/3256 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/3257 b/postgres/data/base/16384/3257 new file mode 100755 index 0000000..3c0ce10 Binary files /dev/null and b/postgres/data/base/16384/3257 differ diff --git a/postgres/data/base/16384/3258 b/postgres/data/base/16384/3258 new file mode 100755 index 0000000..18b70ba Binary files /dev/null and b/postgres/data/base/16384/3258 differ diff --git a/postgres/data/base/16384/3350 b/postgres/data/base/16384/3350 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/3351 b/postgres/data/base/16384/3351 new file mode 100755 index 0000000..aac5957 Binary files /dev/null and b/postgres/data/base/16384/3351 differ diff --git a/postgres/data/base/16384/3379 b/postgres/data/base/16384/3379 new file mode 100755 index 0000000..96ad3f4 Binary files /dev/null and b/postgres/data/base/16384/3379 differ diff --git a/postgres/data/base/16384/3380 b/postgres/data/base/16384/3380 new file mode 100755 index 0000000..a33ee18 Binary files /dev/null and b/postgres/data/base/16384/3380 differ diff --git a/postgres/data/base/16384/3381 b/postgres/data/base/16384/3381 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/3394 b/postgres/data/base/16384/3394 new file mode 100755 index 0000000..cdd97e4 Binary files /dev/null and b/postgres/data/base/16384/3394 differ diff --git a/postgres/data/base/16384/3394_fsm b/postgres/data/base/16384/3394_fsm new file mode 100755 index 0000000..b6def1a Binary files /dev/null and b/postgres/data/base/16384/3394_fsm differ diff --git a/postgres/data/base/16384/3394_vm b/postgres/data/base/16384/3394_vm new file mode 100755 index 0000000..78221e6 Binary files /dev/null and b/postgres/data/base/16384/3394_vm differ diff --git a/postgres/data/base/16384/3395 b/postgres/data/base/16384/3395 new file mode 100755 index 0000000..9378f83 Binary files /dev/null and b/postgres/data/base/16384/3395 differ diff --git a/postgres/data/base/16384/3429 b/postgres/data/base/16384/3429 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/3430 b/postgres/data/base/16384/3430 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/3431 b/postgres/data/base/16384/3431 new file mode 100755 index 0000000..39ed847 Binary files /dev/null and b/postgres/data/base/16384/3431 differ diff --git a/postgres/data/base/16384/3433 b/postgres/data/base/16384/3433 new file mode 100755 index 0000000..3e3e191 Binary files /dev/null and b/postgres/data/base/16384/3433 differ diff --git a/postgres/data/base/16384/3439 b/postgres/data/base/16384/3439 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/3440 b/postgres/data/base/16384/3440 new file mode 100755 index 0000000..0f4a693 Binary files /dev/null and b/postgres/data/base/16384/3440 differ diff --git a/postgres/data/base/16384/3455 b/postgres/data/base/16384/3455 new file mode 100755 index 0000000..57ba49d Binary files /dev/null and b/postgres/data/base/16384/3455 differ diff --git a/postgres/data/base/16384/3456 b/postgres/data/base/16384/3456 new file mode 100755 index 0000000..4325f42 Binary files /dev/null and b/postgres/data/base/16384/3456 differ diff --git a/postgres/data/base/16384/3456_fsm b/postgres/data/base/16384/3456_fsm new file mode 100755 index 0000000..14ca7db Binary files /dev/null and b/postgres/data/base/16384/3456_fsm differ diff --git a/postgres/data/base/16384/3456_vm b/postgres/data/base/16384/3456_vm new file mode 100755 index 0000000..3c25cd5 Binary files /dev/null and b/postgres/data/base/16384/3456_vm differ diff --git a/postgres/data/base/16384/3466 b/postgres/data/base/16384/3466 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/3467 b/postgres/data/base/16384/3467 new file mode 100755 index 0000000..239440b Binary files /dev/null and b/postgres/data/base/16384/3467 differ diff --git a/postgres/data/base/16384/3468 b/postgres/data/base/16384/3468 new file mode 100755 index 0000000..0118401 Binary files /dev/null and b/postgres/data/base/16384/3468 differ diff --git a/postgres/data/base/16384/3501 b/postgres/data/base/16384/3501 new file mode 100755 index 0000000..46a9fe0 Binary files /dev/null and b/postgres/data/base/16384/3501 differ diff --git a/postgres/data/base/16384/3502 b/postgres/data/base/16384/3502 new file mode 100755 index 0000000..a70ac45 Binary files /dev/null and b/postgres/data/base/16384/3502 differ diff --git a/postgres/data/base/16384/3503 b/postgres/data/base/16384/3503 new file mode 100755 index 0000000..aa48319 Binary files /dev/null and b/postgres/data/base/16384/3503 differ diff --git a/postgres/data/base/16384/3534 b/postgres/data/base/16384/3534 new file mode 100755 index 0000000..dee5f13 Binary files /dev/null and b/postgres/data/base/16384/3534 differ diff --git a/postgres/data/base/16384/3541 b/postgres/data/base/16384/3541 new file mode 100755 index 0000000..023011e Binary files /dev/null and b/postgres/data/base/16384/3541 differ diff --git a/postgres/data/base/16384/3541_fsm b/postgres/data/base/16384/3541_fsm new file mode 100755 index 0000000..52132a6 Binary files /dev/null and b/postgres/data/base/16384/3541_fsm differ diff --git a/postgres/data/base/16384/3541_vm b/postgres/data/base/16384/3541_vm new file mode 100755 index 0000000..87e33b2 Binary files /dev/null and b/postgres/data/base/16384/3541_vm differ diff --git a/postgres/data/base/16384/3542 b/postgres/data/base/16384/3542 new file mode 100755 index 0000000..65ea9c8 Binary files /dev/null and b/postgres/data/base/16384/3542 differ diff --git a/postgres/data/base/16384/3574 b/postgres/data/base/16384/3574 new file mode 100755 index 0000000..6014ac2 Binary files /dev/null and b/postgres/data/base/16384/3574 differ diff --git a/postgres/data/base/16384/3575 b/postgres/data/base/16384/3575 new file mode 100755 index 0000000..d914990 Binary files /dev/null and b/postgres/data/base/16384/3575 differ diff --git a/postgres/data/base/16384/3576 b/postgres/data/base/16384/3576 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/3596 b/postgres/data/base/16384/3596 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/3597 b/postgres/data/base/16384/3597 new file mode 100755 index 0000000..ec04946 Binary files /dev/null and b/postgres/data/base/16384/3597 differ diff --git a/postgres/data/base/16384/3598 b/postgres/data/base/16384/3598 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/3599 b/postgres/data/base/16384/3599 new file mode 100755 index 0000000..bc3ad6b Binary files /dev/null and b/postgres/data/base/16384/3599 differ diff --git a/postgres/data/base/16384/3600 b/postgres/data/base/16384/3600 new file mode 100755 index 0000000..2af78ec Binary files /dev/null and b/postgres/data/base/16384/3600 differ diff --git a/postgres/data/base/16384/3600_fsm b/postgres/data/base/16384/3600_fsm new file mode 100755 index 0000000..f3e342e Binary files /dev/null and b/postgres/data/base/16384/3600_fsm differ diff --git a/postgres/data/base/16384/3600_vm b/postgres/data/base/16384/3600_vm new file mode 100755 index 0000000..a50cf08 Binary files /dev/null and b/postgres/data/base/16384/3600_vm differ diff --git a/postgres/data/base/16384/3601 b/postgres/data/base/16384/3601 new file mode 100755 index 0000000..95c3af8 Binary files /dev/null and b/postgres/data/base/16384/3601 differ diff --git a/postgres/data/base/16384/3601_fsm b/postgres/data/base/16384/3601_fsm new file mode 100755 index 0000000..bfe9554 Binary files /dev/null and b/postgres/data/base/16384/3601_fsm differ diff --git a/postgres/data/base/16384/3601_vm b/postgres/data/base/16384/3601_vm new file mode 100755 index 0000000..1aac519 Binary files /dev/null and b/postgres/data/base/16384/3601_vm differ diff --git a/postgres/data/base/16384/3602 b/postgres/data/base/16384/3602 new file mode 100755 index 0000000..362639c Binary files /dev/null and b/postgres/data/base/16384/3602 differ diff --git a/postgres/data/base/16384/3602_fsm b/postgres/data/base/16384/3602_fsm new file mode 100755 index 0000000..eccc305 Binary files /dev/null and b/postgres/data/base/16384/3602_fsm differ diff --git a/postgres/data/base/16384/3602_vm b/postgres/data/base/16384/3602_vm new file mode 100755 index 0000000..75ad90f Binary files /dev/null and b/postgres/data/base/16384/3602_vm differ diff --git a/postgres/data/base/16384/3603 b/postgres/data/base/16384/3603 new file mode 100755 index 0000000..fb7c4c6 Binary files /dev/null and b/postgres/data/base/16384/3603 differ diff --git a/postgres/data/base/16384/3603_fsm b/postgres/data/base/16384/3603_fsm new file mode 100755 index 0000000..d7d1781 Binary files /dev/null and b/postgres/data/base/16384/3603_fsm differ diff --git a/postgres/data/base/16384/3603_vm b/postgres/data/base/16384/3603_vm new file mode 100755 index 0000000..acadd0d Binary files /dev/null and b/postgres/data/base/16384/3603_vm differ diff --git a/postgres/data/base/16384/3604 b/postgres/data/base/16384/3604 new file mode 100755 index 0000000..efe867a Binary files /dev/null and b/postgres/data/base/16384/3604 differ diff --git a/postgres/data/base/16384/3605 b/postgres/data/base/16384/3605 new file mode 100755 index 0000000..2810b20 Binary files /dev/null and b/postgres/data/base/16384/3605 differ diff --git a/postgres/data/base/16384/3606 b/postgres/data/base/16384/3606 new file mode 100755 index 0000000..eea3f69 Binary files /dev/null and b/postgres/data/base/16384/3606 differ diff --git a/postgres/data/base/16384/3607 b/postgres/data/base/16384/3607 new file mode 100755 index 0000000..8a78944 Binary files /dev/null and b/postgres/data/base/16384/3607 differ diff --git a/postgres/data/base/16384/3608 b/postgres/data/base/16384/3608 new file mode 100755 index 0000000..fe9c90f Binary files /dev/null and b/postgres/data/base/16384/3608 differ diff --git a/postgres/data/base/16384/3609 b/postgres/data/base/16384/3609 new file mode 100755 index 0000000..e261647 Binary files /dev/null and b/postgres/data/base/16384/3609 differ diff --git a/postgres/data/base/16384/3712 b/postgres/data/base/16384/3712 new file mode 100755 index 0000000..adc8628 Binary files /dev/null and b/postgres/data/base/16384/3712 differ diff --git a/postgres/data/base/16384/3764 b/postgres/data/base/16384/3764 new file mode 100755 index 0000000..5e4bc7a Binary files /dev/null and b/postgres/data/base/16384/3764 differ diff --git a/postgres/data/base/16384/3764_fsm b/postgres/data/base/16384/3764_fsm new file mode 100755 index 0000000..435ade2 Binary files /dev/null and b/postgres/data/base/16384/3764_fsm differ diff --git a/postgres/data/base/16384/3764_vm b/postgres/data/base/16384/3764_vm new file mode 100755 index 0000000..7c8a05a Binary files /dev/null and b/postgres/data/base/16384/3764_vm differ diff --git a/postgres/data/base/16384/3766 b/postgres/data/base/16384/3766 new file mode 100755 index 0000000..ecf2b30 Binary files /dev/null and b/postgres/data/base/16384/3766 differ diff --git a/postgres/data/base/16384/3767 b/postgres/data/base/16384/3767 new file mode 100755 index 0000000..9705634 Binary files /dev/null and b/postgres/data/base/16384/3767 differ diff --git a/postgres/data/base/16384/3997 b/postgres/data/base/16384/3997 new file mode 100755 index 0000000..35ebdf8 Binary files /dev/null and b/postgres/data/base/16384/3997 differ diff --git a/postgres/data/base/16384/4143 b/postgres/data/base/16384/4143 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/4144 b/postgres/data/base/16384/4144 new file mode 100755 index 0000000..aaab550 Binary files /dev/null and b/postgres/data/base/16384/4144 differ diff --git a/postgres/data/base/16384/4145 b/postgres/data/base/16384/4145 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/4146 b/postgres/data/base/16384/4146 new file mode 100755 index 0000000..08479e4 Binary files /dev/null and b/postgres/data/base/16384/4146 differ diff --git a/postgres/data/base/16384/4147 b/postgres/data/base/16384/4147 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/4148 b/postgres/data/base/16384/4148 new file mode 100755 index 0000000..24b6b28 Binary files /dev/null and b/postgres/data/base/16384/4148 differ diff --git a/postgres/data/base/16384/4149 b/postgres/data/base/16384/4149 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/4150 b/postgres/data/base/16384/4150 new file mode 100755 index 0000000..6d7ba72 Binary files /dev/null and b/postgres/data/base/16384/4150 differ diff --git a/postgres/data/base/16384/4151 b/postgres/data/base/16384/4151 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/4152 b/postgres/data/base/16384/4152 new file mode 100755 index 0000000..7315069 Binary files /dev/null and b/postgres/data/base/16384/4152 differ diff --git a/postgres/data/base/16384/4153 b/postgres/data/base/16384/4153 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/4154 b/postgres/data/base/16384/4154 new file mode 100755 index 0000000..2eba7b2 Binary files /dev/null and b/postgres/data/base/16384/4154 differ diff --git a/postgres/data/base/16384/4155 b/postgres/data/base/16384/4155 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/4156 b/postgres/data/base/16384/4156 new file mode 100755 index 0000000..962f7a9 Binary files /dev/null and b/postgres/data/base/16384/4156 differ diff --git a/postgres/data/base/16384/4157 b/postgres/data/base/16384/4157 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/4158 b/postgres/data/base/16384/4158 new file mode 100755 index 0000000..fdcc46a Binary files /dev/null and b/postgres/data/base/16384/4158 differ diff --git a/postgres/data/base/16384/4159 b/postgres/data/base/16384/4159 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/4160 b/postgres/data/base/16384/4160 new file mode 100755 index 0000000..9a2a2d5 Binary files /dev/null and b/postgres/data/base/16384/4160 differ diff --git a/postgres/data/base/16384/4163 b/postgres/data/base/16384/4163 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/4164 b/postgres/data/base/16384/4164 new file mode 100755 index 0000000..92b1d24 Binary files /dev/null and b/postgres/data/base/16384/4164 differ diff --git a/postgres/data/base/16384/4165 b/postgres/data/base/16384/4165 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/4166 b/postgres/data/base/16384/4166 new file mode 100755 index 0000000..98495f3 Binary files /dev/null and b/postgres/data/base/16384/4166 differ diff --git a/postgres/data/base/16384/4167 b/postgres/data/base/16384/4167 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/4168 b/postgres/data/base/16384/4168 new file mode 100755 index 0000000..4594055 Binary files /dev/null and b/postgres/data/base/16384/4168 differ diff --git a/postgres/data/base/16384/4169 b/postgres/data/base/16384/4169 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/4170 b/postgres/data/base/16384/4170 new file mode 100755 index 0000000..7e8ac4c Binary files /dev/null and b/postgres/data/base/16384/4170 differ diff --git a/postgres/data/base/16384/4171 b/postgres/data/base/16384/4171 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/4172 b/postgres/data/base/16384/4172 new file mode 100755 index 0000000..ee2af54 Binary files /dev/null and b/postgres/data/base/16384/4172 differ diff --git a/postgres/data/base/16384/4173 b/postgres/data/base/16384/4173 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/4174 b/postgres/data/base/16384/4174 new file mode 100755 index 0000000..6342595 Binary files /dev/null and b/postgres/data/base/16384/4174 differ diff --git a/postgres/data/base/16384/5002 b/postgres/data/base/16384/5002 new file mode 100755 index 0000000..e99aed6 Binary files /dev/null and b/postgres/data/base/16384/5002 differ diff --git a/postgres/data/base/16384/548 b/postgres/data/base/16384/548 new file mode 100755 index 0000000..ef700e6 Binary files /dev/null and b/postgres/data/base/16384/548 differ diff --git a/postgres/data/base/16384/549 b/postgres/data/base/16384/549 new file mode 100755 index 0000000..67a9562 Binary files /dev/null and b/postgres/data/base/16384/549 differ diff --git a/postgres/data/base/16384/6102 b/postgres/data/base/16384/6102 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/6104 b/postgres/data/base/16384/6104 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/6106 b/postgres/data/base/16384/6106 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/6110 b/postgres/data/base/16384/6110 new file mode 100755 index 0000000..9cd66ad Binary files /dev/null and b/postgres/data/base/16384/6110 differ diff --git a/postgres/data/base/16384/6111 b/postgres/data/base/16384/6111 new file mode 100755 index 0000000..d0d21a1 Binary files /dev/null and b/postgres/data/base/16384/6111 differ diff --git a/postgres/data/base/16384/6112 b/postgres/data/base/16384/6112 new file mode 100755 index 0000000..c2c6a93 Binary files /dev/null and b/postgres/data/base/16384/6112 differ diff --git a/postgres/data/base/16384/6113 b/postgres/data/base/16384/6113 new file mode 100755 index 0000000..1d52b85 Binary files /dev/null and b/postgres/data/base/16384/6113 differ diff --git a/postgres/data/base/16384/6116 b/postgres/data/base/16384/6116 new file mode 100755 index 0000000..598db6c Binary files /dev/null and b/postgres/data/base/16384/6116 differ diff --git a/postgres/data/base/16384/6117 b/postgres/data/base/16384/6117 new file mode 100755 index 0000000..6db8315 Binary files /dev/null and b/postgres/data/base/16384/6117 differ diff --git a/postgres/data/base/16384/6175 b/postgres/data/base/16384/6175 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/6176 b/postgres/data/base/16384/6176 new file mode 100755 index 0000000..23417d0 Binary files /dev/null and b/postgres/data/base/16384/6176 differ diff --git a/postgres/data/base/16384/6228 b/postgres/data/base/16384/6228 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/6229 b/postgres/data/base/16384/6229 new file mode 100755 index 0000000..ce8e445 Binary files /dev/null and b/postgres/data/base/16384/6229 differ diff --git a/postgres/data/base/16384/6237 b/postgres/data/base/16384/6237 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16384/6238 b/postgres/data/base/16384/6238 new file mode 100755 index 0000000..233df18 Binary files /dev/null and b/postgres/data/base/16384/6238 differ diff --git a/postgres/data/base/16384/6239 b/postgres/data/base/16384/6239 new file mode 100755 index 0000000..d967f76 Binary files /dev/null and b/postgres/data/base/16384/6239 differ diff --git a/postgres/data/base/16384/826 b/postgres/data/base/16384/826 new file mode 100755 index 0000000..a2fc7a2 Binary files /dev/null and b/postgres/data/base/16384/826 differ diff --git a/postgres/data/base/16384/827 b/postgres/data/base/16384/827 new file mode 100755 index 0000000..8a238b3 Binary files /dev/null and b/postgres/data/base/16384/827 differ diff --git a/postgres/data/base/16384/828 b/postgres/data/base/16384/828 new file mode 100755 index 0000000..0d8ef27 Binary files /dev/null and b/postgres/data/base/16384/828 differ diff --git a/postgres/data/base/16384/PG_VERSION b/postgres/data/base/16384/PG_VERSION new file mode 100755 index 0000000..98d9bcb --- /dev/null +++ b/postgres/data/base/16384/PG_VERSION @@ -0,0 +1 @@ +17 diff --git a/postgres/data/base/16384/pg_filenode.map b/postgres/data/base/16384/pg_filenode.map new file mode 100755 index 0000000..4fc801a Binary files /dev/null and b/postgres/data/base/16384/pg_filenode.map differ diff --git a/postgres/data/base/16384/pg_internal.init b/postgres/data/base/16384/pg_internal.init new file mode 100755 index 0000000..bb2e1e2 Binary files /dev/null and b/postgres/data/base/16384/pg_internal.init differ diff --git a/postgres/data/base/16537/112 b/postgres/data/base/16537/112 new file mode 100755 index 0000000..80b78f3 Binary files /dev/null and b/postgres/data/base/16537/112 differ diff --git a/postgres/data/base/16537/113 b/postgres/data/base/16537/113 new file mode 100755 index 0000000..7b80aa5 Binary files /dev/null and b/postgres/data/base/16537/113 differ diff --git a/postgres/data/base/16537/1247 b/postgres/data/base/16537/1247 new file mode 100755 index 0000000..2b41926 Binary files /dev/null and b/postgres/data/base/16537/1247 differ diff --git a/postgres/data/base/16537/1247_fsm b/postgres/data/base/16537/1247_fsm new file mode 100755 index 0000000..50cc716 Binary files /dev/null and b/postgres/data/base/16537/1247_fsm differ diff --git a/postgres/data/base/16537/1247_vm b/postgres/data/base/16537/1247_vm new file mode 100755 index 0000000..8671fba Binary files /dev/null and b/postgres/data/base/16537/1247_vm differ diff --git a/postgres/data/base/16537/1249 b/postgres/data/base/16537/1249 new file mode 100755 index 0000000..4d5d445 Binary files /dev/null and b/postgres/data/base/16537/1249 differ diff --git a/postgres/data/base/16537/1249_fsm b/postgres/data/base/16537/1249_fsm new file mode 100755 index 0000000..4fa9b93 Binary files /dev/null and b/postgres/data/base/16537/1249_fsm differ diff --git a/postgres/data/base/16537/1249_vm b/postgres/data/base/16537/1249_vm new file mode 100755 index 0000000..d502974 Binary files /dev/null and b/postgres/data/base/16537/1249_vm differ diff --git a/postgres/data/base/16537/1255 b/postgres/data/base/16537/1255 new file mode 100755 index 0000000..012cb55 Binary files /dev/null and b/postgres/data/base/16537/1255 differ diff --git a/postgres/data/base/16537/1255_fsm b/postgres/data/base/16537/1255_fsm new file mode 100755 index 0000000..2e62180 Binary files /dev/null and b/postgres/data/base/16537/1255_fsm differ diff --git a/postgres/data/base/16537/1255_vm b/postgres/data/base/16537/1255_vm new file mode 100755 index 0000000..2e10922 Binary files /dev/null and b/postgres/data/base/16537/1255_vm differ diff --git a/postgres/data/base/16537/1259 b/postgres/data/base/16537/1259 new file mode 100755 index 0000000..64a9deb Binary files /dev/null and b/postgres/data/base/16537/1259 differ diff --git a/postgres/data/base/16537/1259_fsm b/postgres/data/base/16537/1259_fsm new file mode 100755 index 0000000..a818673 Binary files /dev/null and b/postgres/data/base/16537/1259_fsm differ diff --git a/postgres/data/base/16537/1259_vm b/postgres/data/base/16537/1259_vm new file mode 100755 index 0000000..0b1f004 Binary files /dev/null and b/postgres/data/base/16537/1259_vm differ diff --git a/postgres/data/base/16537/13463 b/postgres/data/base/16537/13463 new file mode 100755 index 0000000..421fe01 Binary files /dev/null and b/postgres/data/base/16537/13463 differ diff --git a/postgres/data/base/16537/13463_fsm b/postgres/data/base/16537/13463_fsm new file mode 100755 index 0000000..5b1fd09 Binary files /dev/null and b/postgres/data/base/16537/13463_fsm differ diff --git a/postgres/data/base/16537/13463_vm b/postgres/data/base/16537/13463_vm new file mode 100755 index 0000000..4b09200 Binary files /dev/null and b/postgres/data/base/16537/13463_vm differ diff --git a/postgres/data/base/16537/13466 b/postgres/data/base/16537/13466 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/13467 b/postgres/data/base/16537/13467 new file mode 100755 index 0000000..9c1df46 Binary files /dev/null and b/postgres/data/base/16537/13467 differ diff --git a/postgres/data/base/16537/13468 b/postgres/data/base/16537/13468 new file mode 100755 index 0000000..9db6e9c Binary files /dev/null and b/postgres/data/base/16537/13468 differ diff --git a/postgres/data/base/16537/13468_fsm b/postgres/data/base/16537/13468_fsm new file mode 100755 index 0000000..9f7dfa4 Binary files /dev/null and b/postgres/data/base/16537/13468_fsm differ diff --git a/postgres/data/base/16537/13468_vm b/postgres/data/base/16537/13468_vm new file mode 100755 index 0000000..ddde67c Binary files /dev/null and b/postgres/data/base/16537/13468_vm differ diff --git a/postgres/data/base/16537/13471 b/postgres/data/base/16537/13471 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/13472 b/postgres/data/base/16537/13472 new file mode 100755 index 0000000..e2231fb Binary files /dev/null and b/postgres/data/base/16537/13472 differ diff --git a/postgres/data/base/16537/13473 b/postgres/data/base/16537/13473 new file mode 100755 index 0000000..328b0ae Binary files /dev/null and b/postgres/data/base/16537/13473 differ diff --git a/postgres/data/base/16537/13473_fsm b/postgres/data/base/16537/13473_fsm new file mode 100755 index 0000000..cdf3003 Binary files /dev/null and b/postgres/data/base/16537/13473_fsm differ diff --git a/postgres/data/base/16537/13473_vm b/postgres/data/base/16537/13473_vm new file mode 100755 index 0000000..84e02fb Binary files /dev/null and b/postgres/data/base/16537/13473_vm differ diff --git a/postgres/data/base/16537/13476 b/postgres/data/base/16537/13476 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/13477 b/postgres/data/base/16537/13477 new file mode 100755 index 0000000..22edab7 Binary files /dev/null and b/postgres/data/base/16537/13477 differ diff --git a/postgres/data/base/16537/13478 b/postgres/data/base/16537/13478 new file mode 100755 index 0000000..bcdfc00 Binary files /dev/null and b/postgres/data/base/16537/13478 differ diff --git a/postgres/data/base/16537/13478_fsm b/postgres/data/base/16537/13478_fsm new file mode 100755 index 0000000..90f3e51 Binary files /dev/null and b/postgres/data/base/16537/13478_fsm differ diff --git a/postgres/data/base/16537/13478_vm b/postgres/data/base/16537/13478_vm new file mode 100755 index 0000000..fa2423f Binary files /dev/null and b/postgres/data/base/16537/13478_vm differ diff --git a/postgres/data/base/16537/13481 b/postgres/data/base/16537/13481 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/13482 b/postgres/data/base/16537/13482 new file mode 100755 index 0000000..0b7f5c3 Binary files /dev/null and b/postgres/data/base/16537/13482 differ diff --git a/postgres/data/base/16537/1417 b/postgres/data/base/16537/1417 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/1418 b/postgres/data/base/16537/1418 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/16915 b/postgres/data/base/16537/16915 new file mode 100755 index 0000000..f84b484 Binary files /dev/null and b/postgres/data/base/16537/16915 differ diff --git a/postgres/data/base/16537/16918 b/postgres/data/base/16537/16918 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/16919 b/postgres/data/base/16537/16919 new file mode 100755 index 0000000..5117c7d Binary files /dev/null and b/postgres/data/base/16537/16919 differ diff --git a/postgres/data/base/16537/16920 b/postgres/data/base/16537/16920 new file mode 100755 index 0000000..7caee6c Binary files /dev/null and b/postgres/data/base/16537/16920 differ diff --git a/postgres/data/base/16537/16922 b/postgres/data/base/16537/16922 new file mode 100755 index 0000000..d54f145 Binary files /dev/null and b/postgres/data/base/16537/16922 differ diff --git a/postgres/data/base/16537/16925 b/postgres/data/base/16537/16925 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/16926 b/postgres/data/base/16537/16926 new file mode 100755 index 0000000..384cb92 Binary files /dev/null and b/postgres/data/base/16537/16926 differ diff --git a/postgres/data/base/16537/16927 b/postgres/data/base/16537/16927 new file mode 100755 index 0000000..08f7ac8 Binary files /dev/null and b/postgres/data/base/16537/16927 differ diff --git a/postgres/data/base/16537/16929 b/postgres/data/base/16537/16929 new file mode 100755 index 0000000..f4af4e8 Binary files /dev/null and b/postgres/data/base/16537/16929 differ diff --git a/postgres/data/base/16537/16932 b/postgres/data/base/16537/16932 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/16933 b/postgres/data/base/16537/16933 new file mode 100755 index 0000000..c3a187c Binary files /dev/null and b/postgres/data/base/16537/16933 differ diff --git a/postgres/data/base/16537/16934 b/postgres/data/base/16537/16934 new file mode 100755 index 0000000..85eee2f Binary files /dev/null and b/postgres/data/base/16537/16934 differ diff --git a/postgres/data/base/16537/16936 b/postgres/data/base/16537/16936 new file mode 100755 index 0000000..c198314 Binary files /dev/null and b/postgres/data/base/16537/16936 differ diff --git a/postgres/data/base/16537/16939 b/postgres/data/base/16537/16939 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/16940 b/postgres/data/base/16537/16940 new file mode 100755 index 0000000..3fb9172 Binary files /dev/null and b/postgres/data/base/16537/16940 differ diff --git a/postgres/data/base/16537/16941 b/postgres/data/base/16537/16941 new file mode 100755 index 0000000..0e85643 Binary files /dev/null and b/postgres/data/base/16537/16941 differ diff --git a/postgres/data/base/16537/16943 b/postgres/data/base/16537/16943 new file mode 100755 index 0000000..baecfc3 Binary files /dev/null and b/postgres/data/base/16537/16943 differ diff --git a/postgres/data/base/16537/16946 b/postgres/data/base/16537/16946 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/16947 b/postgres/data/base/16537/16947 new file mode 100755 index 0000000..bb00a99 Binary files /dev/null and b/postgres/data/base/16537/16947 differ diff --git a/postgres/data/base/16537/16948 b/postgres/data/base/16537/16948 new file mode 100755 index 0000000..8ba512f Binary files /dev/null and b/postgres/data/base/16537/16948 differ diff --git a/postgres/data/base/16537/16950 b/postgres/data/base/16537/16950 new file mode 100755 index 0000000..b392f5d Binary files /dev/null and b/postgres/data/base/16537/16950 differ diff --git a/postgres/data/base/16537/16953 b/postgres/data/base/16537/16953 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/16954 b/postgres/data/base/16537/16954 new file mode 100755 index 0000000..e416e9a Binary files /dev/null and b/postgres/data/base/16537/16954 differ diff --git a/postgres/data/base/16537/16955 b/postgres/data/base/16537/16955 new file mode 100755 index 0000000..8ad85c1 Binary files /dev/null and b/postgres/data/base/16537/16955 differ diff --git a/postgres/data/base/16537/16957 b/postgres/data/base/16537/16957 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/16963 b/postgres/data/base/16537/16963 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/16964 b/postgres/data/base/16537/16964 new file mode 100755 index 0000000..e23ba73 Binary files /dev/null and b/postgres/data/base/16537/16964 differ diff --git a/postgres/data/base/16537/16965 b/postgres/data/base/16537/16965 new file mode 100755 index 0000000..4912c1d Binary files /dev/null and b/postgres/data/base/16537/16965 differ diff --git a/postgres/data/base/16537/16967 b/postgres/data/base/16537/16967 new file mode 100755 index 0000000..59f6e5b Binary files /dev/null and b/postgres/data/base/16537/16967 differ diff --git a/postgres/data/base/16537/16968 b/postgres/data/base/16537/16968 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/16974 b/postgres/data/base/16537/16974 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/16975 b/postgres/data/base/16537/16975 new file mode 100755 index 0000000..8a187cd Binary files /dev/null and b/postgres/data/base/16537/16975 differ diff --git a/postgres/data/base/16537/16976 b/postgres/data/base/16537/16976 new file mode 100755 index 0000000..930be99 Binary files /dev/null and b/postgres/data/base/16537/16976 differ diff --git a/postgres/data/base/16537/16983 b/postgres/data/base/16537/16983 new file mode 100755 index 0000000..fab500d Binary files /dev/null and b/postgres/data/base/16537/16983 differ diff --git a/postgres/data/base/16537/16984 b/postgres/data/base/16537/16984 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/16990 b/postgres/data/base/16537/16990 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/16991 b/postgres/data/base/16537/16991 new file mode 100755 index 0000000..7ec86b2 Binary files /dev/null and b/postgres/data/base/16537/16991 differ diff --git a/postgres/data/base/16537/16992 b/postgres/data/base/16537/16992 new file mode 100755 index 0000000..8f0c641 Binary files /dev/null and b/postgres/data/base/16537/16992 differ diff --git a/postgres/data/base/16537/17010 b/postgres/data/base/16537/17010 new file mode 100755 index 0000000..8334ac5 Binary files /dev/null and b/postgres/data/base/16537/17010 differ diff --git a/postgres/data/base/16537/17017 b/postgres/data/base/16537/17017 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17018 b/postgres/data/base/16537/17018 new file mode 100755 index 0000000..e4952c2 Binary files /dev/null and b/postgres/data/base/16537/17018 differ diff --git a/postgres/data/base/16537/17019 b/postgres/data/base/16537/17019 new file mode 100755 index 0000000..71d64dd Binary files /dev/null and b/postgres/data/base/16537/17019 differ diff --git a/postgres/data/base/16537/17022 b/postgres/data/base/16537/17022 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17029 b/postgres/data/base/16537/17029 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17030 b/postgres/data/base/16537/17030 new file mode 100755 index 0000000..0b3ab63 Binary files /dev/null and b/postgres/data/base/16537/17030 differ diff --git a/postgres/data/base/16537/17031 b/postgres/data/base/16537/17031 new file mode 100755 index 0000000..281252c Binary files /dev/null and b/postgres/data/base/16537/17031 differ diff --git a/postgres/data/base/16537/17034 b/postgres/data/base/16537/17034 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17038 b/postgres/data/base/16537/17038 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17039 b/postgres/data/base/16537/17039 new file mode 100755 index 0000000..24850ff Binary files /dev/null and b/postgres/data/base/16537/17039 differ diff --git a/postgres/data/base/16537/17040 b/postgres/data/base/16537/17040 new file mode 100755 index 0000000..c2bc597 Binary files /dev/null and b/postgres/data/base/16537/17040 differ diff --git a/postgres/data/base/16537/17052 b/postgres/data/base/16537/17052 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17059 b/postgres/data/base/16537/17059 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17060 b/postgres/data/base/16537/17060 new file mode 100755 index 0000000..280c7ab Binary files /dev/null and b/postgres/data/base/16537/17060 differ diff --git a/postgres/data/base/16537/17061 b/postgres/data/base/16537/17061 new file mode 100755 index 0000000..494bd15 Binary files /dev/null and b/postgres/data/base/16537/17061 differ diff --git a/postgres/data/base/16537/17068 b/postgres/data/base/16537/17068 new file mode 100755 index 0000000..1e14fc0 Binary files /dev/null and b/postgres/data/base/16537/17068 differ diff --git a/postgres/data/base/16537/17069 b/postgres/data/base/16537/17069 new file mode 100755 index 0000000..8a4e090 Binary files /dev/null and b/postgres/data/base/16537/17069 differ diff --git a/postgres/data/base/16537/17078 b/postgres/data/base/16537/17078 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17079 b/postgres/data/base/16537/17079 new file mode 100755 index 0000000..3b11ad6 Binary files /dev/null and b/postgres/data/base/16537/17079 differ diff --git a/postgres/data/base/16537/17080 b/postgres/data/base/16537/17080 new file mode 100755 index 0000000..5903fa1 Binary files /dev/null and b/postgres/data/base/16537/17080 differ diff --git a/postgres/data/base/16537/17088 b/postgres/data/base/16537/17088 new file mode 100755 index 0000000..f1e4de6 Binary files /dev/null and b/postgres/data/base/16537/17088 differ diff --git a/postgres/data/base/16537/17089 b/postgres/data/base/16537/17089 new file mode 100755 index 0000000..8842ff2 Binary files /dev/null and b/postgres/data/base/16537/17089 differ diff --git a/postgres/data/base/16537/17096 b/postgres/data/base/16537/17096 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17097 b/postgres/data/base/16537/17097 new file mode 100755 index 0000000..c962226 Binary files /dev/null and b/postgres/data/base/16537/17097 differ diff --git a/postgres/data/base/16537/17098 b/postgres/data/base/16537/17098 new file mode 100755 index 0000000..f980824 Binary files /dev/null and b/postgres/data/base/16537/17098 differ diff --git a/postgres/data/base/16537/17110 b/postgres/data/base/16537/17110 new file mode 100755 index 0000000..cca061a Binary files /dev/null and b/postgres/data/base/16537/17110 differ diff --git a/postgres/data/base/16537/17111 b/postgres/data/base/16537/17111 new file mode 100755 index 0000000..3b20c85 Binary files /dev/null and b/postgres/data/base/16537/17111 differ diff --git a/postgres/data/base/16537/17113 b/postgres/data/base/16537/17113 new file mode 100755 index 0000000..548430f Binary files /dev/null and b/postgres/data/base/16537/17113 differ diff --git a/postgres/data/base/16537/17116 b/postgres/data/base/16537/17116 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17117 b/postgres/data/base/16537/17117 new file mode 100755 index 0000000..ced45e2 Binary files /dev/null and b/postgres/data/base/16537/17117 differ diff --git a/postgres/data/base/16537/17118 b/postgres/data/base/16537/17118 new file mode 100755 index 0000000..56ef489 Binary files /dev/null and b/postgres/data/base/16537/17118 differ diff --git a/postgres/data/base/16537/17120 b/postgres/data/base/16537/17120 new file mode 100755 index 0000000..52a1d89 Binary files /dev/null and b/postgres/data/base/16537/17120 differ diff --git a/postgres/data/base/16537/17126 b/postgres/data/base/16537/17126 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17127 b/postgres/data/base/16537/17127 new file mode 100755 index 0000000..d74f350 Binary files /dev/null and b/postgres/data/base/16537/17127 differ diff --git a/postgres/data/base/16537/17128 b/postgres/data/base/16537/17128 new file mode 100755 index 0000000..353e516 Binary files /dev/null and b/postgres/data/base/16537/17128 differ diff --git a/postgres/data/base/16537/17130 b/postgres/data/base/16537/17130 new file mode 100755 index 0000000..aa8fc26 Binary files /dev/null and b/postgres/data/base/16537/17130 differ diff --git a/postgres/data/base/16537/17147 b/postgres/data/base/16537/17147 new file mode 100755 index 0000000..a2c8f2b Binary files /dev/null and b/postgres/data/base/16537/17147 differ diff --git a/postgres/data/base/16537/17148 b/postgres/data/base/16537/17148 new file mode 100755 index 0000000..f6c57b6 Binary files /dev/null and b/postgres/data/base/16537/17148 differ diff --git a/postgres/data/base/16537/17156 b/postgres/data/base/16537/17156 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17157 b/postgres/data/base/16537/17157 new file mode 100755 index 0000000..cf2cabe Binary files /dev/null and b/postgres/data/base/16537/17157 differ diff --git a/postgres/data/base/16537/17158 b/postgres/data/base/16537/17158 new file mode 100755 index 0000000..c10b44c Binary files /dev/null and b/postgres/data/base/16537/17158 differ diff --git a/postgres/data/base/16537/17170 b/postgres/data/base/16537/17170 new file mode 100755 index 0000000..bc4604c Binary files /dev/null and b/postgres/data/base/16537/17170 differ diff --git a/postgres/data/base/16537/17172 b/postgres/data/base/16537/17172 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17178 b/postgres/data/base/16537/17178 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17179 b/postgres/data/base/16537/17179 new file mode 100755 index 0000000..ee50883 Binary files /dev/null and b/postgres/data/base/16537/17179 differ diff --git a/postgres/data/base/16537/17180 b/postgres/data/base/16537/17180 new file mode 100755 index 0000000..64e94f7 Binary files /dev/null and b/postgres/data/base/16537/17180 differ diff --git a/postgres/data/base/16537/17182 b/postgres/data/base/16537/17182 new file mode 100755 index 0000000..41b0952 Binary files /dev/null and b/postgres/data/base/16537/17182 differ diff --git a/postgres/data/base/16537/17194 b/postgres/data/base/16537/17194 new file mode 100755 index 0000000..a73fcc6 Binary files /dev/null and b/postgres/data/base/16537/17194 differ diff --git a/postgres/data/base/16537/17201 b/postgres/data/base/16537/17201 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17202 b/postgres/data/base/16537/17202 new file mode 100755 index 0000000..a4b88ce Binary files /dev/null and b/postgres/data/base/16537/17202 differ diff --git a/postgres/data/base/16537/17203 b/postgres/data/base/16537/17203 new file mode 100755 index 0000000..bf8e74d Binary files /dev/null and b/postgres/data/base/16537/17203 differ diff --git a/postgres/data/base/16537/17240 b/postgres/data/base/16537/17240 new file mode 100755 index 0000000..e6bc295 Binary files /dev/null and b/postgres/data/base/16537/17240 differ diff --git a/postgres/data/base/16537/17242 b/postgres/data/base/16537/17242 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17248 b/postgres/data/base/16537/17248 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17249 b/postgres/data/base/16537/17249 new file mode 100755 index 0000000..7945321 Binary files /dev/null and b/postgres/data/base/16537/17249 differ diff --git a/postgres/data/base/16537/17250 b/postgres/data/base/16537/17250 new file mode 100755 index 0000000..252e817 Binary files /dev/null and b/postgres/data/base/16537/17250 differ diff --git a/postgres/data/base/16537/17252 b/postgres/data/base/16537/17252 new file mode 100755 index 0000000..6197f4b Binary files /dev/null and b/postgres/data/base/16537/17252 differ diff --git a/postgres/data/base/16537/17259 b/postgres/data/base/16537/17259 new file mode 100755 index 0000000..a2afe9b Binary files /dev/null and b/postgres/data/base/16537/17259 differ diff --git a/postgres/data/base/16537/17260 b/postgres/data/base/16537/17260 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17266 b/postgres/data/base/16537/17266 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17267 b/postgres/data/base/16537/17267 new file mode 100755 index 0000000..8731c98 Binary files /dev/null and b/postgres/data/base/16537/17267 differ diff --git a/postgres/data/base/16537/17268 b/postgres/data/base/16537/17268 new file mode 100755 index 0000000..f31586e Binary files /dev/null and b/postgres/data/base/16537/17268 differ diff --git a/postgres/data/base/16537/17275 b/postgres/data/base/16537/17275 new file mode 100755 index 0000000..c87274e Binary files /dev/null and b/postgres/data/base/16537/17275 differ diff --git a/postgres/data/base/16537/17276 b/postgres/data/base/16537/17276 new file mode 100755 index 0000000..fa11241 Binary files /dev/null and b/postgres/data/base/16537/17276 differ diff --git a/postgres/data/base/16537/17277 b/postgres/data/base/16537/17277 new file mode 100755 index 0000000..09e6767 Binary files /dev/null and b/postgres/data/base/16537/17277 differ diff --git a/postgres/data/base/16537/17283 b/postgres/data/base/16537/17283 new file mode 100755 index 0000000..dff4b5c Binary files /dev/null and b/postgres/data/base/16537/17283 differ diff --git a/postgres/data/base/16537/17295 b/postgres/data/base/16537/17295 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17301 b/postgres/data/base/16537/17301 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17302 b/postgres/data/base/16537/17302 new file mode 100755 index 0000000..acd2db5 Binary files /dev/null and b/postgres/data/base/16537/17302 differ diff --git a/postgres/data/base/16537/17303 b/postgres/data/base/16537/17303 new file mode 100755 index 0000000..0e080e5 Binary files /dev/null and b/postgres/data/base/16537/17303 differ diff --git a/postgres/data/base/16537/17327 b/postgres/data/base/16537/17327 new file mode 100755 index 0000000..9f5c3c0 Binary files /dev/null and b/postgres/data/base/16537/17327 differ diff --git a/postgres/data/base/16537/17335 b/postgres/data/base/16537/17335 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17336 b/postgres/data/base/16537/17336 new file mode 100755 index 0000000..2171c95 Binary files /dev/null and b/postgres/data/base/16537/17336 differ diff --git a/postgres/data/base/16537/17337 b/postgres/data/base/16537/17337 new file mode 100755 index 0000000..f32cc37 Binary files /dev/null and b/postgres/data/base/16537/17337 differ diff --git a/postgres/data/base/16537/17344 b/postgres/data/base/16537/17344 new file mode 100755 index 0000000..a8b6412 Binary files /dev/null and b/postgres/data/base/16537/17344 differ diff --git a/postgres/data/base/16537/17345 b/postgres/data/base/16537/17345 new file mode 100755 index 0000000..86a4242 Binary files /dev/null and b/postgres/data/base/16537/17345 differ diff --git a/postgres/data/base/16537/17355 b/postgres/data/base/16537/17355 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17356 b/postgres/data/base/16537/17356 new file mode 100755 index 0000000..80221f6 Binary files /dev/null and b/postgres/data/base/16537/17356 differ diff --git a/postgres/data/base/16537/17357 b/postgres/data/base/16537/17357 new file mode 100755 index 0000000..022cc35 Binary files /dev/null and b/postgres/data/base/16537/17357 differ diff --git a/postgres/data/base/16537/174 b/postgres/data/base/16537/174 new file mode 100755 index 0000000..2a974e6 Binary files /dev/null and b/postgres/data/base/16537/174 differ diff --git a/postgres/data/base/16537/17404 b/postgres/data/base/16537/17404 new file mode 100755 index 0000000..0f9bd10 Binary files /dev/null and b/postgres/data/base/16537/17404 differ diff --git a/postgres/data/base/16537/17405 b/postgres/data/base/16537/17405 new file mode 100755 index 0000000..15fde0b Binary files /dev/null and b/postgres/data/base/16537/17405 differ diff --git a/postgres/data/base/16537/17406 b/postgres/data/base/16537/17406 new file mode 100755 index 0000000..a59150a Binary files /dev/null and b/postgres/data/base/16537/17406 differ diff --git a/postgres/data/base/16537/17408 b/postgres/data/base/16537/17408 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17415 b/postgres/data/base/16537/17415 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17416 b/postgres/data/base/16537/17416 new file mode 100755 index 0000000..9366ba8 Binary files /dev/null and b/postgres/data/base/16537/17416 differ diff --git a/postgres/data/base/16537/17417 b/postgres/data/base/16537/17417 new file mode 100755 index 0000000..edfb525 Binary files /dev/null and b/postgres/data/base/16537/17417 differ diff --git a/postgres/data/base/16537/17439 b/postgres/data/base/16537/17439 new file mode 100755 index 0000000..bd0c546 Binary files /dev/null and b/postgres/data/base/16537/17439 differ diff --git a/postgres/data/base/16537/17440 b/postgres/data/base/16537/17440 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17447 b/postgres/data/base/16537/17447 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17448 b/postgres/data/base/16537/17448 new file mode 100755 index 0000000..d0b0470 Binary files /dev/null and b/postgres/data/base/16537/17448 differ diff --git a/postgres/data/base/16537/17449 b/postgres/data/base/16537/17449 new file mode 100755 index 0000000..27bc209 Binary files /dev/null and b/postgres/data/base/16537/17449 differ diff --git a/postgres/data/base/16537/17466 b/postgres/data/base/16537/17466 new file mode 100755 index 0000000..6963187 Binary files /dev/null and b/postgres/data/base/16537/17466 differ diff --git a/postgres/data/base/16537/17467 b/postgres/data/base/16537/17467 new file mode 100755 index 0000000..33ce9ea Binary files /dev/null and b/postgres/data/base/16537/17467 differ diff --git a/postgres/data/base/16537/17468 b/postgres/data/base/16537/17468 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17474 b/postgres/data/base/16537/17474 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17475 b/postgres/data/base/16537/17475 new file mode 100755 index 0000000..902d18f Binary files /dev/null and b/postgres/data/base/16537/17475 differ diff --git a/postgres/data/base/16537/17476 b/postgres/data/base/16537/17476 new file mode 100755 index 0000000..5d1ff17 Binary files /dev/null and b/postgres/data/base/16537/17476 differ diff --git a/postgres/data/base/16537/17493 b/postgres/data/base/16537/17493 new file mode 100755 index 0000000..0627fc9 Binary files /dev/null and b/postgres/data/base/16537/17493 differ diff --git a/postgres/data/base/16537/17494 b/postgres/data/base/16537/17494 new file mode 100755 index 0000000..d34d017 Binary files /dev/null and b/postgres/data/base/16537/17494 differ diff --git a/postgres/data/base/16537/175 b/postgres/data/base/16537/175 new file mode 100755 index 0000000..e477ab6 Binary files /dev/null and b/postgres/data/base/16537/175 differ diff --git a/postgres/data/base/16537/17504 b/postgres/data/base/16537/17504 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17505 b/postgres/data/base/16537/17505 new file mode 100755 index 0000000..875eec4 Binary files /dev/null and b/postgres/data/base/16537/17505 differ diff --git a/postgres/data/base/16537/17506 b/postgres/data/base/16537/17506 new file mode 100755 index 0000000..5e4b2d6 Binary files /dev/null and b/postgres/data/base/16537/17506 differ diff --git a/postgres/data/base/16537/17528 b/postgres/data/base/16537/17528 new file mode 100755 index 0000000..1e610da Binary files /dev/null and b/postgres/data/base/16537/17528 differ diff --git a/postgres/data/base/16537/17530 b/postgres/data/base/16537/17530 new file mode 100755 index 0000000..857d233 Binary files /dev/null and b/postgres/data/base/16537/17530 differ diff --git a/postgres/data/base/16537/17535 b/postgres/data/base/16537/17535 new file mode 100755 index 0000000..a8422ca Binary files /dev/null and b/postgres/data/base/16537/17535 differ diff --git a/postgres/data/base/16537/17547 b/postgres/data/base/16537/17547 new file mode 100755 index 0000000..abfd2dc Binary files /dev/null and b/postgres/data/base/16537/17547 differ diff --git a/postgres/data/base/16537/17548 b/postgres/data/base/16537/17548 new file mode 100755 index 0000000..ed076c8 Binary files /dev/null and b/postgres/data/base/16537/17548 differ diff --git a/postgres/data/base/16537/17553 b/postgres/data/base/16537/17553 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17554 b/postgres/data/base/16537/17554 new file mode 100755 index 0000000..5cf6737 Binary files /dev/null and b/postgres/data/base/16537/17554 differ diff --git a/postgres/data/base/16537/17555 b/postgres/data/base/16537/17555 new file mode 100755 index 0000000..eb343f3 Binary files /dev/null and b/postgres/data/base/16537/17555 differ diff --git a/postgres/data/base/16537/17557 b/postgres/data/base/16537/17557 new file mode 100755 index 0000000..53c98e6 Binary files /dev/null and b/postgres/data/base/16537/17557 differ diff --git a/postgres/data/base/16537/17574 b/postgres/data/base/16537/17574 new file mode 100755 index 0000000..dd28045 Binary files /dev/null and b/postgres/data/base/16537/17574 differ diff --git a/postgres/data/base/16537/17580 b/postgres/data/base/16537/17580 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17581 b/postgres/data/base/16537/17581 new file mode 100755 index 0000000..4fe5694 Binary files /dev/null and b/postgres/data/base/16537/17581 differ diff --git a/postgres/data/base/16537/17582 b/postgres/data/base/16537/17582 new file mode 100755 index 0000000..553cdba Binary files /dev/null and b/postgres/data/base/16537/17582 differ diff --git a/postgres/data/base/16537/17589 b/postgres/data/base/16537/17589 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17597 b/postgres/data/base/16537/17597 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17598 b/postgres/data/base/16537/17598 new file mode 100755 index 0000000..26bc6ab Binary files /dev/null and b/postgres/data/base/16537/17598 differ diff --git a/postgres/data/base/16537/17599 b/postgres/data/base/16537/17599 new file mode 100755 index 0000000..534db8a Binary files /dev/null and b/postgres/data/base/16537/17599 differ diff --git a/postgres/data/base/16537/17611 b/postgres/data/base/16537/17611 new file mode 100755 index 0000000..61433ec Binary files /dev/null and b/postgres/data/base/16537/17611 differ diff --git a/postgres/data/base/16537/17612 b/postgres/data/base/16537/17612 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17620 b/postgres/data/base/16537/17620 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17621 b/postgres/data/base/16537/17621 new file mode 100755 index 0000000..2db1793 Binary files /dev/null and b/postgres/data/base/16537/17621 differ diff --git a/postgres/data/base/16537/17622 b/postgres/data/base/16537/17622 new file mode 100755 index 0000000..fa9e140 Binary files /dev/null and b/postgres/data/base/16537/17622 differ diff --git a/postgres/data/base/16537/17634 b/postgres/data/base/16537/17634 new file mode 100755 index 0000000..edf8663 Binary files /dev/null and b/postgres/data/base/16537/17634 differ diff --git a/postgres/data/base/16537/17635 b/postgres/data/base/16537/17635 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17640 b/postgres/data/base/16537/17640 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17641 b/postgres/data/base/16537/17641 new file mode 100755 index 0000000..04b87f0 Binary files /dev/null and b/postgres/data/base/16537/17641 differ diff --git a/postgres/data/base/16537/17642 b/postgres/data/base/16537/17642 new file mode 100755 index 0000000..da4ab81 Binary files /dev/null and b/postgres/data/base/16537/17642 differ diff --git a/postgres/data/base/16537/17670 b/postgres/data/base/16537/17670 new file mode 100755 index 0000000..ec544af Binary files /dev/null and b/postgres/data/base/16537/17670 differ diff --git a/postgres/data/base/16537/17671 b/postgres/data/base/16537/17671 new file mode 100755 index 0000000..b6571e9 Binary files /dev/null and b/postgres/data/base/16537/17671 differ diff --git a/postgres/data/base/16537/17672 b/postgres/data/base/16537/17672 new file mode 100755 index 0000000..ab25fbb Binary files /dev/null and b/postgres/data/base/16537/17672 differ diff --git a/postgres/data/base/16537/17720 b/postgres/data/base/16537/17720 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17728 b/postgres/data/base/16537/17728 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17729 b/postgres/data/base/16537/17729 new file mode 100755 index 0000000..6607b72 Binary files /dev/null and b/postgres/data/base/16537/17729 differ diff --git a/postgres/data/base/16537/17730 b/postgres/data/base/16537/17730 new file mode 100755 index 0000000..7d369fe Binary files /dev/null and b/postgres/data/base/16537/17730 differ diff --git a/postgres/data/base/16537/17742 b/postgres/data/base/16537/17742 new file mode 100755 index 0000000..3daa042 Binary files /dev/null and b/postgres/data/base/16537/17742 differ diff --git a/postgres/data/base/16537/17745 b/postgres/data/base/16537/17745 new file mode 100755 index 0000000..3ddc8e0 Binary files /dev/null and b/postgres/data/base/16537/17745 differ diff --git a/postgres/data/base/16537/17752 b/postgres/data/base/16537/17752 new file mode 100755 index 0000000..52d8da5 Binary files /dev/null and b/postgres/data/base/16537/17752 differ diff --git a/postgres/data/base/16537/17758 b/postgres/data/base/16537/17758 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17759 b/postgres/data/base/16537/17759 new file mode 100755 index 0000000..c831518 Binary files /dev/null and b/postgres/data/base/16537/17759 differ diff --git a/postgres/data/base/16537/17760 b/postgres/data/base/16537/17760 new file mode 100755 index 0000000..b6203af Binary files /dev/null and b/postgres/data/base/16537/17760 differ diff --git a/postgres/data/base/16537/17767 b/postgres/data/base/16537/17767 new file mode 100755 index 0000000..6bca4b0 Binary files /dev/null and b/postgres/data/base/16537/17767 differ diff --git a/postgres/data/base/16537/17768 b/postgres/data/base/16537/17768 new file mode 100755 index 0000000..af53cab Binary files /dev/null and b/postgres/data/base/16537/17768 differ diff --git a/postgres/data/base/16537/17774 b/postgres/data/base/16537/17774 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17775 b/postgres/data/base/16537/17775 new file mode 100755 index 0000000..767b88b Binary files /dev/null and b/postgres/data/base/16537/17775 differ diff --git a/postgres/data/base/16537/17776 b/postgres/data/base/16537/17776 new file mode 100755 index 0000000..0cf3158 Binary files /dev/null and b/postgres/data/base/16537/17776 differ diff --git a/postgres/data/base/16537/17798 b/postgres/data/base/16537/17798 new file mode 100755 index 0000000..e7329bb Binary files /dev/null and b/postgres/data/base/16537/17798 differ diff --git a/postgres/data/base/16537/17799 b/postgres/data/base/16537/17799 new file mode 100755 index 0000000..b848df5 Binary files /dev/null and b/postgres/data/base/16537/17799 differ diff --git a/postgres/data/base/16537/17800 b/postgres/data/base/16537/17800 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17805 b/postgres/data/base/16537/17805 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17806 b/postgres/data/base/16537/17806 new file mode 100755 index 0000000..3594c0f Binary files /dev/null and b/postgres/data/base/16537/17806 differ diff --git a/postgres/data/base/16537/17807 b/postgres/data/base/16537/17807 new file mode 100755 index 0000000..acf588d Binary files /dev/null and b/postgres/data/base/16537/17807 differ diff --git a/postgres/data/base/16537/17829 b/postgres/data/base/16537/17829 new file mode 100755 index 0000000..dd2010d Binary files /dev/null and b/postgres/data/base/16537/17829 differ diff --git a/postgres/data/base/16537/17830 b/postgres/data/base/16537/17830 new file mode 100755 index 0000000..6eb5dae Binary files /dev/null and b/postgres/data/base/16537/17830 differ diff --git a/postgres/data/base/16537/17916 b/postgres/data/base/16537/17916 new file mode 100755 index 0000000..02930f2 Binary files /dev/null and b/postgres/data/base/16537/17916 differ diff --git a/postgres/data/base/16537/17925 b/postgres/data/base/16537/17925 new file mode 100755 index 0000000..965bbfe Binary files /dev/null and b/postgres/data/base/16537/17925 differ diff --git a/postgres/data/base/16537/17927 b/postgres/data/base/16537/17927 new file mode 100755 index 0000000..1e5700c Binary files /dev/null and b/postgres/data/base/16537/17927 differ diff --git a/postgres/data/base/16537/17935 b/postgres/data/base/16537/17935 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17938 b/postgres/data/base/16537/17938 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17939 b/postgres/data/base/16537/17939 new file mode 100755 index 0000000..f58ba99 Binary files /dev/null and b/postgres/data/base/16537/17939 differ diff --git a/postgres/data/base/16537/17940 b/postgres/data/base/16537/17940 new file mode 100755 index 0000000..14ce975 Binary files /dev/null and b/postgres/data/base/16537/17940 differ diff --git a/postgres/data/base/16537/17942 b/postgres/data/base/16537/17942 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17945 b/postgres/data/base/16537/17945 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17946 b/postgres/data/base/16537/17946 new file mode 100755 index 0000000..364b253 Binary files /dev/null and b/postgres/data/base/16537/17946 differ diff --git a/postgres/data/base/16537/17947 b/postgres/data/base/16537/17947 new file mode 100755 index 0000000..9ccc94a Binary files /dev/null and b/postgres/data/base/16537/17947 differ diff --git a/postgres/data/base/16537/17959 b/postgres/data/base/16537/17959 new file mode 100755 index 0000000..514fe66 Binary files /dev/null and b/postgres/data/base/16537/17959 differ diff --git a/postgres/data/base/16537/17961 b/postgres/data/base/16537/17961 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17968 b/postgres/data/base/16537/17968 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/17969 b/postgres/data/base/16537/17969 new file mode 100755 index 0000000..8a18d0b Binary files /dev/null and b/postgres/data/base/16537/17969 differ diff --git a/postgres/data/base/16537/17970 b/postgres/data/base/16537/17970 new file mode 100755 index 0000000..e1b3648 Binary files /dev/null and b/postgres/data/base/16537/17970 differ diff --git a/postgres/data/base/16537/17972 b/postgres/data/base/16537/17972 new file mode 100755 index 0000000..840a2df Binary files /dev/null and b/postgres/data/base/16537/17972 differ diff --git a/postgres/data/base/16537/17994 b/postgres/data/base/16537/17994 new file mode 100755 index 0000000..d71ce86 Binary files /dev/null and b/postgres/data/base/16537/17994 differ diff --git a/postgres/data/base/16537/17995 b/postgres/data/base/16537/17995 new file mode 100755 index 0000000..71748df Binary files /dev/null and b/postgres/data/base/16537/17995 differ diff --git a/postgres/data/base/16537/18026 b/postgres/data/base/16537/18026 new file mode 100755 index 0000000..0fd7bb8 Binary files /dev/null and b/postgres/data/base/16537/18026 differ diff --git a/postgres/data/base/16537/18032 b/postgres/data/base/16537/18032 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/18033 b/postgres/data/base/16537/18033 new file mode 100755 index 0000000..ba798ae Binary files /dev/null and b/postgres/data/base/16537/18033 differ diff --git a/postgres/data/base/16537/18034 b/postgres/data/base/16537/18034 new file mode 100755 index 0000000..26d3b75 Binary files /dev/null and b/postgres/data/base/16537/18034 differ diff --git a/postgres/data/base/16537/18046 b/postgres/data/base/16537/18046 new file mode 100755 index 0000000..f5a631f Binary files /dev/null and b/postgres/data/base/16537/18046 differ diff --git a/postgres/data/base/16537/18047 b/postgres/data/base/16537/18047 new file mode 100755 index 0000000..382fa16 Binary files /dev/null and b/postgres/data/base/16537/18047 differ diff --git a/postgres/data/base/16537/18061 b/postgres/data/base/16537/18061 new file mode 100755 index 0000000..2d40cdf Binary files /dev/null and b/postgres/data/base/16537/18061 differ diff --git a/postgres/data/base/16537/18066 b/postgres/data/base/16537/18066 new file mode 100755 index 0000000..5ba15cd Binary files /dev/null and b/postgres/data/base/16537/18066 differ diff --git a/postgres/data/base/16537/18084 b/postgres/data/base/16537/18084 new file mode 100755 index 0000000..533233d Binary files /dev/null and b/postgres/data/base/16537/18084 differ diff --git a/postgres/data/base/16537/18088 b/postgres/data/base/16537/18088 new file mode 100755 index 0000000..4ae7001 Binary files /dev/null and b/postgres/data/base/16537/18088 differ diff --git a/postgres/data/base/16537/18095 b/postgres/data/base/16537/18095 new file mode 100755 index 0000000..e680e93 Binary files /dev/null and b/postgres/data/base/16537/18095 differ diff --git a/postgres/data/base/16537/18117 b/postgres/data/base/16537/18117 new file mode 100755 index 0000000..62a8395 Binary files /dev/null and b/postgres/data/base/16537/18117 differ diff --git a/postgres/data/base/16537/18128 b/postgres/data/base/16537/18128 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/18129 b/postgres/data/base/16537/18129 new file mode 100755 index 0000000..32fb9f5 Binary files /dev/null and b/postgres/data/base/16537/18129 differ diff --git a/postgres/data/base/16537/18130 b/postgres/data/base/16537/18130 new file mode 100755 index 0000000..4fb7261 Binary files /dev/null and b/postgres/data/base/16537/18130 differ diff --git a/postgres/data/base/16537/18157 b/postgres/data/base/16537/18157 new file mode 100755 index 0000000..464df25 Binary files /dev/null and b/postgres/data/base/16537/18157 differ diff --git a/postgres/data/base/16537/18158 b/postgres/data/base/16537/18158 new file mode 100755 index 0000000..01c71fb Binary files /dev/null and b/postgres/data/base/16537/18158 differ diff --git a/postgres/data/base/16537/18159 b/postgres/data/base/16537/18159 new file mode 100755 index 0000000..cedc2c5 Binary files /dev/null and b/postgres/data/base/16537/18159 differ diff --git a/postgres/data/base/16537/18160 b/postgres/data/base/16537/18160 new file mode 100755 index 0000000..cc4cf22 Binary files /dev/null and b/postgres/data/base/16537/18160 differ diff --git a/postgres/data/base/16537/18166 b/postgres/data/base/16537/18166 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/18167 b/postgres/data/base/16537/18167 new file mode 100755 index 0000000..767eac9 Binary files /dev/null and b/postgres/data/base/16537/18167 differ diff --git a/postgres/data/base/16537/18168 b/postgres/data/base/16537/18168 new file mode 100755 index 0000000..051ae2f Binary files /dev/null and b/postgres/data/base/16537/18168 differ diff --git a/postgres/data/base/16537/18180 b/postgres/data/base/16537/18180 new file mode 100755 index 0000000..cc73e42 Binary files /dev/null and b/postgres/data/base/16537/18180 differ diff --git a/postgres/data/base/16537/18181 b/postgres/data/base/16537/18181 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/18187 b/postgres/data/base/16537/18187 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/18188 b/postgres/data/base/16537/18188 new file mode 100755 index 0000000..dc6ccd0 Binary files /dev/null and b/postgres/data/base/16537/18188 differ diff --git a/postgres/data/base/16537/18189 b/postgres/data/base/16537/18189 new file mode 100755 index 0000000..752d61a Binary files /dev/null and b/postgres/data/base/16537/18189 differ diff --git a/postgres/data/base/16537/18196 b/postgres/data/base/16537/18196 new file mode 100755 index 0000000..d4c21ef Binary files /dev/null and b/postgres/data/base/16537/18196 differ diff --git a/postgres/data/base/16537/18197 b/postgres/data/base/16537/18197 new file mode 100755 index 0000000..a873c51 Binary files /dev/null and b/postgres/data/base/16537/18197 differ diff --git a/postgres/data/base/16537/18204 b/postgres/data/base/16537/18204 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/18205 b/postgres/data/base/16537/18205 new file mode 100755 index 0000000..41d5384 Binary files /dev/null and b/postgres/data/base/16537/18205 differ diff --git a/postgres/data/base/16537/18206 b/postgres/data/base/16537/18206 new file mode 100755 index 0000000..7600d80 Binary files /dev/null and b/postgres/data/base/16537/18206 differ diff --git a/postgres/data/base/16537/18213 b/postgres/data/base/16537/18213 new file mode 100755 index 0000000..bd718dc Binary files /dev/null and b/postgres/data/base/16537/18213 differ diff --git a/postgres/data/base/16537/18234 b/postgres/data/base/16537/18234 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/18239 b/postgres/data/base/16537/18239 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/18240 b/postgres/data/base/16537/18240 new file mode 100755 index 0000000..68b9519 Binary files /dev/null and b/postgres/data/base/16537/18240 differ diff --git a/postgres/data/base/16537/18241 b/postgres/data/base/16537/18241 new file mode 100755 index 0000000..6220a29 Binary files /dev/null and b/postgres/data/base/16537/18241 differ diff --git a/postgres/data/base/16537/18243 b/postgres/data/base/16537/18243 new file mode 100755 index 0000000..6f6e7ed Binary files /dev/null and b/postgres/data/base/16537/18243 differ diff --git a/postgres/data/base/16537/18244 b/postgres/data/base/16537/18244 new file mode 100755 index 0000000..00e6703 Binary files /dev/null and b/postgres/data/base/16537/18244 differ diff --git a/postgres/data/base/16537/18249 b/postgres/data/base/16537/18249 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/18250 b/postgres/data/base/16537/18250 new file mode 100755 index 0000000..ae0595a Binary files /dev/null and b/postgres/data/base/16537/18250 differ diff --git a/postgres/data/base/16537/18251 b/postgres/data/base/16537/18251 new file mode 100755 index 0000000..97479cb Binary files /dev/null and b/postgres/data/base/16537/18251 differ diff --git a/postgres/data/base/16537/18258 b/postgres/data/base/16537/18258 new file mode 100755 index 0000000..83d7654 Binary files /dev/null and b/postgres/data/base/16537/18258 differ diff --git a/postgres/data/base/16537/18566 b/postgres/data/base/16537/18566 new file mode 100755 index 0000000..4f68ee2 Binary files /dev/null and b/postgres/data/base/16537/18566 differ diff --git a/postgres/data/base/16537/18567 b/postgres/data/base/16537/18567 new file mode 100755 index 0000000..ee91fc0 Binary files /dev/null and b/postgres/data/base/16537/18567 differ diff --git a/postgres/data/base/16537/18571 b/postgres/data/base/16537/18571 new file mode 100755 index 0000000..4818b55 Binary files /dev/null and b/postgres/data/base/16537/18571 differ diff --git a/postgres/data/base/16537/18573 b/postgres/data/base/16537/18573 new file mode 100755 index 0000000..de2bcf4 Binary files /dev/null and b/postgres/data/base/16537/18573 differ diff --git a/postgres/data/base/16537/18575 b/postgres/data/base/16537/18575 new file mode 100755 index 0000000..427f175 Binary files /dev/null and b/postgres/data/base/16537/18575 differ diff --git a/postgres/data/base/16537/18576 b/postgres/data/base/16537/18576 new file mode 100755 index 0000000..53cf1dd Binary files /dev/null and b/postgres/data/base/16537/18576 differ diff --git a/postgres/data/base/16537/18580 b/postgres/data/base/16537/18580 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/18581 b/postgres/data/base/16537/18581 new file mode 100755 index 0000000..bd819fd Binary files /dev/null and b/postgres/data/base/16537/18581 differ diff --git a/postgres/data/base/16537/18582 b/postgres/data/base/16537/18582 new file mode 100755 index 0000000..2ddfd2a Binary files /dev/null and b/postgres/data/base/16537/18582 differ diff --git a/postgres/data/base/16537/18584 b/postgres/data/base/16537/18584 new file mode 100755 index 0000000..3b5f371 Binary files /dev/null and b/postgres/data/base/16537/18584 differ diff --git a/postgres/data/base/16537/2187 b/postgres/data/base/16537/2187 new file mode 100755 index 0000000..64b646a Binary files /dev/null and b/postgres/data/base/16537/2187 differ diff --git a/postgres/data/base/16537/2224 b/postgres/data/base/16537/2224 new file mode 100755 index 0000000..290b8c1 Binary files /dev/null and b/postgres/data/base/16537/2224 differ diff --git a/postgres/data/base/16537/2228 b/postgres/data/base/16537/2228 new file mode 100755 index 0000000..94a8d31 Binary files /dev/null and b/postgres/data/base/16537/2228 differ diff --git a/postgres/data/base/16537/2328 b/postgres/data/base/16537/2328 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/2336 b/postgres/data/base/16537/2336 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/2337 b/postgres/data/base/16537/2337 new file mode 100755 index 0000000..11962ac Binary files /dev/null and b/postgres/data/base/16537/2337 differ diff --git a/postgres/data/base/16537/2579 b/postgres/data/base/16537/2579 new file mode 100755 index 0000000..3a896b1 Binary files /dev/null and b/postgres/data/base/16537/2579 differ diff --git a/postgres/data/base/16537/2600 b/postgres/data/base/16537/2600 new file mode 100755 index 0000000..667b020 Binary files /dev/null and b/postgres/data/base/16537/2600 differ diff --git a/postgres/data/base/16537/2600_fsm b/postgres/data/base/16537/2600_fsm new file mode 100755 index 0000000..71a4984 Binary files /dev/null and b/postgres/data/base/16537/2600_fsm differ diff --git a/postgres/data/base/16537/2600_vm b/postgres/data/base/16537/2600_vm new file mode 100755 index 0000000..afee001 Binary files /dev/null and b/postgres/data/base/16537/2600_vm differ diff --git a/postgres/data/base/16537/2601 b/postgres/data/base/16537/2601 new file mode 100755 index 0000000..99db636 Binary files /dev/null and b/postgres/data/base/16537/2601 differ diff --git a/postgres/data/base/16537/2601_fsm b/postgres/data/base/16537/2601_fsm new file mode 100755 index 0000000..a2ee66e Binary files /dev/null and b/postgres/data/base/16537/2601_fsm differ diff --git a/postgres/data/base/16537/2601_vm b/postgres/data/base/16537/2601_vm new file mode 100755 index 0000000..b83ceb9 Binary files /dev/null and b/postgres/data/base/16537/2601_vm differ diff --git a/postgres/data/base/16537/2602 b/postgres/data/base/16537/2602 new file mode 100755 index 0000000..00b9b87 Binary files /dev/null and b/postgres/data/base/16537/2602 differ diff --git a/postgres/data/base/16537/2602_fsm b/postgres/data/base/16537/2602_fsm new file mode 100755 index 0000000..9f59cc5 Binary files /dev/null and b/postgres/data/base/16537/2602_fsm differ diff --git a/postgres/data/base/16537/2602_vm b/postgres/data/base/16537/2602_vm new file mode 100755 index 0000000..30a1f4b Binary files /dev/null and b/postgres/data/base/16537/2602_vm differ diff --git a/postgres/data/base/16537/2603 b/postgres/data/base/16537/2603 new file mode 100755 index 0000000..8adf507 Binary files /dev/null and b/postgres/data/base/16537/2603 differ diff --git a/postgres/data/base/16537/2603_fsm b/postgres/data/base/16537/2603_fsm new file mode 100755 index 0000000..d708d46 Binary files /dev/null and b/postgres/data/base/16537/2603_fsm differ diff --git a/postgres/data/base/16537/2603_vm b/postgres/data/base/16537/2603_vm new file mode 100755 index 0000000..7627403 Binary files /dev/null and b/postgres/data/base/16537/2603_vm differ diff --git a/postgres/data/base/16537/2604 b/postgres/data/base/16537/2604 new file mode 100755 index 0000000..aa138b8 Binary files /dev/null and b/postgres/data/base/16537/2604 differ diff --git a/postgres/data/base/16537/2604_fsm b/postgres/data/base/16537/2604_fsm new file mode 100755 index 0000000..55e9ffe Binary files /dev/null and b/postgres/data/base/16537/2604_fsm differ diff --git a/postgres/data/base/16537/2605 b/postgres/data/base/16537/2605 new file mode 100755 index 0000000..aca70d6 Binary files /dev/null and b/postgres/data/base/16537/2605 differ diff --git a/postgres/data/base/16537/2605_fsm b/postgres/data/base/16537/2605_fsm new file mode 100755 index 0000000..1ca8895 Binary files /dev/null and b/postgres/data/base/16537/2605_fsm differ diff --git a/postgres/data/base/16537/2605_vm b/postgres/data/base/16537/2605_vm new file mode 100755 index 0000000..a819a53 Binary files /dev/null and b/postgres/data/base/16537/2605_vm differ diff --git a/postgres/data/base/16537/2606 b/postgres/data/base/16537/2606 new file mode 100755 index 0000000..4b50afa Binary files /dev/null and b/postgres/data/base/16537/2606 differ diff --git a/postgres/data/base/16537/2606_fsm b/postgres/data/base/16537/2606_fsm new file mode 100755 index 0000000..0435b5e Binary files /dev/null and b/postgres/data/base/16537/2606_fsm differ diff --git a/postgres/data/base/16537/2606_vm b/postgres/data/base/16537/2606_vm new file mode 100755 index 0000000..ac038ee Binary files /dev/null and b/postgres/data/base/16537/2606_vm differ diff --git a/postgres/data/base/16537/2607 b/postgres/data/base/16537/2607 new file mode 100755 index 0000000..840d45e Binary files /dev/null and b/postgres/data/base/16537/2607 differ diff --git a/postgres/data/base/16537/2607_fsm b/postgres/data/base/16537/2607_fsm new file mode 100755 index 0000000..7f27a04 Binary files /dev/null and b/postgres/data/base/16537/2607_fsm differ diff --git a/postgres/data/base/16537/2607_vm b/postgres/data/base/16537/2607_vm new file mode 100755 index 0000000..0599d83 Binary files /dev/null and b/postgres/data/base/16537/2607_vm differ diff --git a/postgres/data/base/16537/2608 b/postgres/data/base/16537/2608 new file mode 100755 index 0000000..40a47a1 Binary files /dev/null and b/postgres/data/base/16537/2608 differ diff --git a/postgres/data/base/16537/2608_fsm b/postgres/data/base/16537/2608_fsm new file mode 100755 index 0000000..13f6f47 Binary files /dev/null and b/postgres/data/base/16537/2608_fsm differ diff --git a/postgres/data/base/16537/2608_vm b/postgres/data/base/16537/2608_vm new file mode 100755 index 0000000..8f6e3b9 Binary files /dev/null and b/postgres/data/base/16537/2608_vm differ diff --git a/postgres/data/base/16537/2609 b/postgres/data/base/16537/2609 new file mode 100755 index 0000000..93575e4 Binary files /dev/null and b/postgres/data/base/16537/2609 differ diff --git a/postgres/data/base/16537/2609_fsm b/postgres/data/base/16537/2609_fsm new file mode 100755 index 0000000..f68bb1b Binary files /dev/null and b/postgres/data/base/16537/2609_fsm differ diff --git a/postgres/data/base/16537/2609_vm b/postgres/data/base/16537/2609_vm new file mode 100755 index 0000000..85d4f29 Binary files /dev/null and b/postgres/data/base/16537/2609_vm differ diff --git a/postgres/data/base/16537/2610 b/postgres/data/base/16537/2610 new file mode 100755 index 0000000..eee97bf Binary files /dev/null and b/postgres/data/base/16537/2610 differ diff --git a/postgres/data/base/16537/2610_fsm b/postgres/data/base/16537/2610_fsm new file mode 100755 index 0000000..05616d6 Binary files /dev/null and b/postgres/data/base/16537/2610_fsm differ diff --git a/postgres/data/base/16537/2610_vm b/postgres/data/base/16537/2610_vm new file mode 100755 index 0000000..d270e67 Binary files /dev/null and b/postgres/data/base/16537/2610_vm differ diff --git a/postgres/data/base/16537/2611 b/postgres/data/base/16537/2611 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/2612 b/postgres/data/base/16537/2612 new file mode 100755 index 0000000..1d2768a Binary files /dev/null and b/postgres/data/base/16537/2612 differ diff --git a/postgres/data/base/16537/2612_fsm b/postgres/data/base/16537/2612_fsm new file mode 100755 index 0000000..b4b33d4 Binary files /dev/null and b/postgres/data/base/16537/2612_fsm differ diff --git a/postgres/data/base/16537/2612_vm b/postgres/data/base/16537/2612_vm new file mode 100755 index 0000000..35f1cba Binary files /dev/null and b/postgres/data/base/16537/2612_vm differ diff --git a/postgres/data/base/16537/2613 b/postgres/data/base/16537/2613 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/2615 b/postgres/data/base/16537/2615 new file mode 100755 index 0000000..d1e6ab4 Binary files /dev/null and b/postgres/data/base/16537/2615 differ diff --git a/postgres/data/base/16537/2615_fsm b/postgres/data/base/16537/2615_fsm new file mode 100755 index 0000000..b4ce2a7 Binary files /dev/null and b/postgres/data/base/16537/2615_fsm differ diff --git a/postgres/data/base/16537/2615_vm b/postgres/data/base/16537/2615_vm new file mode 100755 index 0000000..34fa2ae Binary files /dev/null and b/postgres/data/base/16537/2615_vm differ diff --git a/postgres/data/base/16537/2616 b/postgres/data/base/16537/2616 new file mode 100755 index 0000000..19818e7 Binary files /dev/null and b/postgres/data/base/16537/2616 differ diff --git a/postgres/data/base/16537/2616_fsm b/postgres/data/base/16537/2616_fsm new file mode 100755 index 0000000..e44050a Binary files /dev/null and b/postgres/data/base/16537/2616_fsm differ diff --git a/postgres/data/base/16537/2616_vm b/postgres/data/base/16537/2616_vm new file mode 100755 index 0000000..13e590e Binary files /dev/null and b/postgres/data/base/16537/2616_vm differ diff --git a/postgres/data/base/16537/2617 b/postgres/data/base/16537/2617 new file mode 100755 index 0000000..c0701dd Binary files /dev/null and b/postgres/data/base/16537/2617 differ diff --git a/postgres/data/base/16537/2617_fsm b/postgres/data/base/16537/2617_fsm new file mode 100755 index 0000000..f708cad Binary files /dev/null and b/postgres/data/base/16537/2617_fsm differ diff --git a/postgres/data/base/16537/2617_vm b/postgres/data/base/16537/2617_vm new file mode 100755 index 0000000..848147b Binary files /dev/null and b/postgres/data/base/16537/2617_vm differ diff --git a/postgres/data/base/16537/2618 b/postgres/data/base/16537/2618 new file mode 100755 index 0000000..7144478 Binary files /dev/null and b/postgres/data/base/16537/2618 differ diff --git a/postgres/data/base/16537/2618_fsm b/postgres/data/base/16537/2618_fsm new file mode 100755 index 0000000..bec65d4 Binary files /dev/null and b/postgres/data/base/16537/2618_fsm differ diff --git a/postgres/data/base/16537/2618_vm b/postgres/data/base/16537/2618_vm new file mode 100755 index 0000000..3c82768 Binary files /dev/null and b/postgres/data/base/16537/2618_vm differ diff --git a/postgres/data/base/16537/2619 b/postgres/data/base/16537/2619 new file mode 100755 index 0000000..15cabe6 Binary files /dev/null and b/postgres/data/base/16537/2619 differ diff --git a/postgres/data/base/16537/2619_fsm b/postgres/data/base/16537/2619_fsm new file mode 100755 index 0000000..2321731 Binary files /dev/null and b/postgres/data/base/16537/2619_fsm differ diff --git a/postgres/data/base/16537/2619_vm b/postgres/data/base/16537/2619_vm new file mode 100755 index 0000000..b460c9b Binary files /dev/null and b/postgres/data/base/16537/2619_vm differ diff --git a/postgres/data/base/16537/2620 b/postgres/data/base/16537/2620 new file mode 100755 index 0000000..a087377 Binary files /dev/null and b/postgres/data/base/16537/2620 differ diff --git a/postgres/data/base/16537/2620_fsm b/postgres/data/base/16537/2620_fsm new file mode 100755 index 0000000..d13303a Binary files /dev/null and b/postgres/data/base/16537/2620_fsm differ diff --git a/postgres/data/base/16537/2650 b/postgres/data/base/16537/2650 new file mode 100755 index 0000000..aa1b67f Binary files /dev/null and b/postgres/data/base/16537/2650 differ diff --git a/postgres/data/base/16537/2651 b/postgres/data/base/16537/2651 new file mode 100755 index 0000000..ed57fc6 Binary files /dev/null and b/postgres/data/base/16537/2651 differ diff --git a/postgres/data/base/16537/2652 b/postgres/data/base/16537/2652 new file mode 100755 index 0000000..c5f4a8d Binary files /dev/null and b/postgres/data/base/16537/2652 differ diff --git a/postgres/data/base/16537/2653 b/postgres/data/base/16537/2653 new file mode 100755 index 0000000..f35bb4f Binary files /dev/null and b/postgres/data/base/16537/2653 differ diff --git a/postgres/data/base/16537/2654 b/postgres/data/base/16537/2654 new file mode 100755 index 0000000..558fb08 Binary files /dev/null and b/postgres/data/base/16537/2654 differ diff --git a/postgres/data/base/16537/2655 b/postgres/data/base/16537/2655 new file mode 100755 index 0000000..06297b3 Binary files /dev/null and b/postgres/data/base/16537/2655 differ diff --git a/postgres/data/base/16537/2656 b/postgres/data/base/16537/2656 new file mode 100755 index 0000000..776167d Binary files /dev/null and b/postgres/data/base/16537/2656 differ diff --git a/postgres/data/base/16537/2657 b/postgres/data/base/16537/2657 new file mode 100755 index 0000000..1543ce8 Binary files /dev/null and b/postgres/data/base/16537/2657 differ diff --git a/postgres/data/base/16537/2658 b/postgres/data/base/16537/2658 new file mode 100755 index 0000000..6c1c13b Binary files /dev/null and b/postgres/data/base/16537/2658 differ diff --git a/postgres/data/base/16537/2659 b/postgres/data/base/16537/2659 new file mode 100755 index 0000000..4af4834 Binary files /dev/null and b/postgres/data/base/16537/2659 differ diff --git a/postgres/data/base/16537/2660 b/postgres/data/base/16537/2660 new file mode 100755 index 0000000..4179f3a Binary files /dev/null and b/postgres/data/base/16537/2660 differ diff --git a/postgres/data/base/16537/2661 b/postgres/data/base/16537/2661 new file mode 100755 index 0000000..dbb1962 Binary files /dev/null and b/postgres/data/base/16537/2661 differ diff --git a/postgres/data/base/16537/2662 b/postgres/data/base/16537/2662 new file mode 100755 index 0000000..f14123d Binary files /dev/null and b/postgres/data/base/16537/2662 differ diff --git a/postgres/data/base/16537/2663 b/postgres/data/base/16537/2663 new file mode 100755 index 0000000..737aacf Binary files /dev/null and b/postgres/data/base/16537/2663 differ diff --git a/postgres/data/base/16537/2664 b/postgres/data/base/16537/2664 new file mode 100755 index 0000000..1107e34 Binary files /dev/null and b/postgres/data/base/16537/2664 differ diff --git a/postgres/data/base/16537/2665 b/postgres/data/base/16537/2665 new file mode 100755 index 0000000..3f5f836 Binary files /dev/null and b/postgres/data/base/16537/2665 differ diff --git a/postgres/data/base/16537/2666 b/postgres/data/base/16537/2666 new file mode 100755 index 0000000..903532a Binary files /dev/null and b/postgres/data/base/16537/2666 differ diff --git a/postgres/data/base/16537/2667 b/postgres/data/base/16537/2667 new file mode 100755 index 0000000..fe62f23 Binary files /dev/null and b/postgres/data/base/16537/2667 differ diff --git a/postgres/data/base/16537/2668 b/postgres/data/base/16537/2668 new file mode 100755 index 0000000..34b475d Binary files /dev/null and b/postgres/data/base/16537/2668 differ diff --git a/postgres/data/base/16537/2669 b/postgres/data/base/16537/2669 new file mode 100755 index 0000000..1cd4af3 Binary files /dev/null and b/postgres/data/base/16537/2669 differ diff --git a/postgres/data/base/16537/2670 b/postgres/data/base/16537/2670 new file mode 100755 index 0000000..9040ad3 Binary files /dev/null and b/postgres/data/base/16537/2670 differ diff --git a/postgres/data/base/16537/2673 b/postgres/data/base/16537/2673 new file mode 100755 index 0000000..fb59ddb Binary files /dev/null and b/postgres/data/base/16537/2673 differ diff --git a/postgres/data/base/16537/2674 b/postgres/data/base/16537/2674 new file mode 100755 index 0000000..9ea3ddf Binary files /dev/null and b/postgres/data/base/16537/2674 differ diff --git a/postgres/data/base/16537/2675 b/postgres/data/base/16537/2675 new file mode 100755 index 0000000..beb6a11 Binary files /dev/null and b/postgres/data/base/16537/2675 differ diff --git a/postgres/data/base/16537/2678 b/postgres/data/base/16537/2678 new file mode 100755 index 0000000..16113fe Binary files /dev/null and b/postgres/data/base/16537/2678 differ diff --git a/postgres/data/base/16537/2679 b/postgres/data/base/16537/2679 new file mode 100755 index 0000000..47335b8 Binary files /dev/null and b/postgres/data/base/16537/2679 differ diff --git a/postgres/data/base/16537/2680 b/postgres/data/base/16537/2680 new file mode 100755 index 0000000..f2dcf7d Binary files /dev/null and b/postgres/data/base/16537/2680 differ diff --git a/postgres/data/base/16537/2681 b/postgres/data/base/16537/2681 new file mode 100755 index 0000000..3a03efe Binary files /dev/null and b/postgres/data/base/16537/2681 differ diff --git a/postgres/data/base/16537/2682 b/postgres/data/base/16537/2682 new file mode 100755 index 0000000..7a7d73a Binary files /dev/null and b/postgres/data/base/16537/2682 differ diff --git a/postgres/data/base/16537/2683 b/postgres/data/base/16537/2683 new file mode 100755 index 0000000..0f8249d Binary files /dev/null and b/postgres/data/base/16537/2683 differ diff --git a/postgres/data/base/16537/2684 b/postgres/data/base/16537/2684 new file mode 100755 index 0000000..9909f96 Binary files /dev/null and b/postgres/data/base/16537/2684 differ diff --git a/postgres/data/base/16537/2685 b/postgres/data/base/16537/2685 new file mode 100755 index 0000000..aa98a06 Binary files /dev/null and b/postgres/data/base/16537/2685 differ diff --git a/postgres/data/base/16537/2686 b/postgres/data/base/16537/2686 new file mode 100755 index 0000000..3f2931a Binary files /dev/null and b/postgres/data/base/16537/2686 differ diff --git a/postgres/data/base/16537/2687 b/postgres/data/base/16537/2687 new file mode 100755 index 0000000..687c393 Binary files /dev/null and b/postgres/data/base/16537/2687 differ diff --git a/postgres/data/base/16537/2688 b/postgres/data/base/16537/2688 new file mode 100755 index 0000000..54985bd Binary files /dev/null and b/postgres/data/base/16537/2688 differ diff --git a/postgres/data/base/16537/2689 b/postgres/data/base/16537/2689 new file mode 100755 index 0000000..cdf38bf Binary files /dev/null and b/postgres/data/base/16537/2689 differ diff --git a/postgres/data/base/16537/2690 b/postgres/data/base/16537/2690 new file mode 100755 index 0000000..d55db52 Binary files /dev/null and b/postgres/data/base/16537/2690 differ diff --git a/postgres/data/base/16537/2691 b/postgres/data/base/16537/2691 new file mode 100755 index 0000000..4f3986e Binary files /dev/null and b/postgres/data/base/16537/2691 differ diff --git a/postgres/data/base/16537/2692 b/postgres/data/base/16537/2692 new file mode 100755 index 0000000..434afab Binary files /dev/null and b/postgres/data/base/16537/2692 differ diff --git a/postgres/data/base/16537/2693 b/postgres/data/base/16537/2693 new file mode 100755 index 0000000..9f0fd02 Binary files /dev/null and b/postgres/data/base/16537/2693 differ diff --git a/postgres/data/base/16537/2696 b/postgres/data/base/16537/2696 new file mode 100755 index 0000000..95b3258 Binary files /dev/null and b/postgres/data/base/16537/2696 differ diff --git a/postgres/data/base/16537/2699 b/postgres/data/base/16537/2699 new file mode 100755 index 0000000..380e55a Binary files /dev/null and b/postgres/data/base/16537/2699 differ diff --git a/postgres/data/base/16537/2701 b/postgres/data/base/16537/2701 new file mode 100755 index 0000000..5e5568a Binary files /dev/null and b/postgres/data/base/16537/2701 differ diff --git a/postgres/data/base/16537/2702 b/postgres/data/base/16537/2702 new file mode 100755 index 0000000..fab30eb Binary files /dev/null and b/postgres/data/base/16537/2702 differ diff --git a/postgres/data/base/16537/2703 b/postgres/data/base/16537/2703 new file mode 100755 index 0000000..5e9d8a1 Binary files /dev/null and b/postgres/data/base/16537/2703 differ diff --git a/postgres/data/base/16537/2704 b/postgres/data/base/16537/2704 new file mode 100755 index 0000000..2001299 Binary files /dev/null and b/postgres/data/base/16537/2704 differ diff --git a/postgres/data/base/16537/2753 b/postgres/data/base/16537/2753 new file mode 100755 index 0000000..01680fd Binary files /dev/null and b/postgres/data/base/16537/2753 differ diff --git a/postgres/data/base/16537/2753_fsm b/postgres/data/base/16537/2753_fsm new file mode 100755 index 0000000..3ec8c04 Binary files /dev/null and b/postgres/data/base/16537/2753_fsm differ diff --git a/postgres/data/base/16537/2753_vm b/postgres/data/base/16537/2753_vm new file mode 100755 index 0000000..5292750 Binary files /dev/null and b/postgres/data/base/16537/2753_vm differ diff --git a/postgres/data/base/16537/2754 b/postgres/data/base/16537/2754 new file mode 100755 index 0000000..da27682 Binary files /dev/null and b/postgres/data/base/16537/2754 differ diff --git a/postgres/data/base/16537/2755 b/postgres/data/base/16537/2755 new file mode 100755 index 0000000..c2cd4a4 Binary files /dev/null and b/postgres/data/base/16537/2755 differ diff --git a/postgres/data/base/16537/2756 b/postgres/data/base/16537/2756 new file mode 100755 index 0000000..d4a5b23 Binary files /dev/null and b/postgres/data/base/16537/2756 differ diff --git a/postgres/data/base/16537/2757 b/postgres/data/base/16537/2757 new file mode 100755 index 0000000..c2bd545 Binary files /dev/null and b/postgres/data/base/16537/2757 differ diff --git a/postgres/data/base/16537/2830 b/postgres/data/base/16537/2830 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/2831 b/postgres/data/base/16537/2831 new file mode 100755 index 0000000..86135fe Binary files /dev/null and b/postgres/data/base/16537/2831 differ diff --git a/postgres/data/base/16537/2832 b/postgres/data/base/16537/2832 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/2833 b/postgres/data/base/16537/2833 new file mode 100755 index 0000000..2e43352 Binary files /dev/null and b/postgres/data/base/16537/2833 differ diff --git a/postgres/data/base/16537/2834 b/postgres/data/base/16537/2834 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/2835 b/postgres/data/base/16537/2835 new file mode 100755 index 0000000..1293828 Binary files /dev/null and b/postgres/data/base/16537/2835 differ diff --git a/postgres/data/base/16537/2836 b/postgres/data/base/16537/2836 new file mode 100755 index 0000000..a9e2dd0 Binary files /dev/null and b/postgres/data/base/16537/2836 differ diff --git a/postgres/data/base/16537/2836_fsm b/postgres/data/base/16537/2836_fsm new file mode 100755 index 0000000..5979db0 Binary files /dev/null and b/postgres/data/base/16537/2836_fsm differ diff --git a/postgres/data/base/16537/2836_vm b/postgres/data/base/16537/2836_vm new file mode 100755 index 0000000..8dd719d Binary files /dev/null and b/postgres/data/base/16537/2836_vm differ diff --git a/postgres/data/base/16537/2837 b/postgres/data/base/16537/2837 new file mode 100755 index 0000000..242aade Binary files /dev/null and b/postgres/data/base/16537/2837 differ diff --git a/postgres/data/base/16537/2838 b/postgres/data/base/16537/2838 new file mode 100755 index 0000000..917c4db Binary files /dev/null and b/postgres/data/base/16537/2838 differ diff --git a/postgres/data/base/16537/2838_fsm b/postgres/data/base/16537/2838_fsm new file mode 100755 index 0000000..2b1507a Binary files /dev/null and b/postgres/data/base/16537/2838_fsm differ diff --git a/postgres/data/base/16537/2838_vm b/postgres/data/base/16537/2838_vm new file mode 100755 index 0000000..618569e Binary files /dev/null and b/postgres/data/base/16537/2838_vm differ diff --git a/postgres/data/base/16537/2839 b/postgres/data/base/16537/2839 new file mode 100755 index 0000000..039a28b Binary files /dev/null and b/postgres/data/base/16537/2839 differ diff --git a/postgres/data/base/16537/2840 b/postgres/data/base/16537/2840 new file mode 100755 index 0000000..58bcad4 Binary files /dev/null and b/postgres/data/base/16537/2840 differ diff --git a/postgres/data/base/16537/2840_fsm b/postgres/data/base/16537/2840_fsm new file mode 100755 index 0000000..b162ce2 Binary files /dev/null and b/postgres/data/base/16537/2840_fsm differ diff --git a/postgres/data/base/16537/2840_vm b/postgres/data/base/16537/2840_vm new file mode 100755 index 0000000..ca01665 Binary files /dev/null and b/postgres/data/base/16537/2840_vm differ diff --git a/postgres/data/base/16537/2841 b/postgres/data/base/16537/2841 new file mode 100755 index 0000000..4671774 Binary files /dev/null and b/postgres/data/base/16537/2841 differ diff --git a/postgres/data/base/16537/2995 b/postgres/data/base/16537/2995 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/2996 b/postgres/data/base/16537/2996 new file mode 100755 index 0000000..79cc712 Binary files /dev/null and b/postgres/data/base/16537/2996 differ diff --git a/postgres/data/base/16537/3079 b/postgres/data/base/16537/3079 new file mode 100755 index 0000000..230525f Binary files /dev/null and b/postgres/data/base/16537/3079 differ diff --git a/postgres/data/base/16537/3079_fsm b/postgres/data/base/16537/3079_fsm new file mode 100755 index 0000000..28b87b2 Binary files /dev/null and b/postgres/data/base/16537/3079_fsm differ diff --git a/postgres/data/base/16537/3079_vm b/postgres/data/base/16537/3079_vm new file mode 100755 index 0000000..35bcb82 Binary files /dev/null and b/postgres/data/base/16537/3079_vm differ diff --git a/postgres/data/base/16537/3080 b/postgres/data/base/16537/3080 new file mode 100755 index 0000000..eba1020 Binary files /dev/null and b/postgres/data/base/16537/3080 differ diff --git a/postgres/data/base/16537/3081 b/postgres/data/base/16537/3081 new file mode 100755 index 0000000..ed6d414 Binary files /dev/null and b/postgres/data/base/16537/3081 differ diff --git a/postgres/data/base/16537/3085 b/postgres/data/base/16537/3085 new file mode 100755 index 0000000..6091415 Binary files /dev/null and b/postgres/data/base/16537/3085 differ diff --git a/postgres/data/base/16537/3118 b/postgres/data/base/16537/3118 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/3119 b/postgres/data/base/16537/3119 new file mode 100755 index 0000000..abc792f Binary files /dev/null and b/postgres/data/base/16537/3119 differ diff --git a/postgres/data/base/16537/3164 b/postgres/data/base/16537/3164 new file mode 100755 index 0000000..273dad5 Binary files /dev/null and b/postgres/data/base/16537/3164 differ diff --git a/postgres/data/base/16537/3256 b/postgres/data/base/16537/3256 new file mode 100755 index 0000000..0af2c9d Binary files /dev/null and b/postgres/data/base/16537/3256 differ diff --git a/postgres/data/base/16537/3256_fsm b/postgres/data/base/16537/3256_fsm new file mode 100755 index 0000000..73b18e3 Binary files /dev/null and b/postgres/data/base/16537/3256_fsm differ diff --git a/postgres/data/base/16537/3257 b/postgres/data/base/16537/3257 new file mode 100755 index 0000000..57da4ac Binary files /dev/null and b/postgres/data/base/16537/3257 differ diff --git a/postgres/data/base/16537/3258 b/postgres/data/base/16537/3258 new file mode 100755 index 0000000..4bca31d Binary files /dev/null and b/postgres/data/base/16537/3258 differ diff --git a/postgres/data/base/16537/3350 b/postgres/data/base/16537/3350 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/3351 b/postgres/data/base/16537/3351 new file mode 100755 index 0000000..801708d Binary files /dev/null and b/postgres/data/base/16537/3351 differ diff --git a/postgres/data/base/16537/3379 b/postgres/data/base/16537/3379 new file mode 100755 index 0000000..b6a7b6e Binary files /dev/null and b/postgres/data/base/16537/3379 differ diff --git a/postgres/data/base/16537/3380 b/postgres/data/base/16537/3380 new file mode 100755 index 0000000..4b06a32 Binary files /dev/null and b/postgres/data/base/16537/3380 differ diff --git a/postgres/data/base/16537/3381 b/postgres/data/base/16537/3381 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/3394 b/postgres/data/base/16537/3394 new file mode 100755 index 0000000..7a00b70 Binary files /dev/null and b/postgres/data/base/16537/3394 differ diff --git a/postgres/data/base/16537/3394_fsm b/postgres/data/base/16537/3394_fsm new file mode 100755 index 0000000..8acb98f Binary files /dev/null and b/postgres/data/base/16537/3394_fsm differ diff --git a/postgres/data/base/16537/3394_vm b/postgres/data/base/16537/3394_vm new file mode 100755 index 0000000..d7464b0 Binary files /dev/null and b/postgres/data/base/16537/3394_vm differ diff --git a/postgres/data/base/16537/3395 b/postgres/data/base/16537/3395 new file mode 100755 index 0000000..e7bef6b Binary files /dev/null and b/postgres/data/base/16537/3395 differ diff --git a/postgres/data/base/16537/3429 b/postgres/data/base/16537/3429 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/3430 b/postgres/data/base/16537/3430 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/3431 b/postgres/data/base/16537/3431 new file mode 100755 index 0000000..9143bca Binary files /dev/null and b/postgres/data/base/16537/3431 differ diff --git a/postgres/data/base/16537/3433 b/postgres/data/base/16537/3433 new file mode 100755 index 0000000..d74867b Binary files /dev/null and b/postgres/data/base/16537/3433 differ diff --git a/postgres/data/base/16537/3439 b/postgres/data/base/16537/3439 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/3440 b/postgres/data/base/16537/3440 new file mode 100755 index 0000000..bd5d5d9 Binary files /dev/null and b/postgres/data/base/16537/3440 differ diff --git a/postgres/data/base/16537/3455 b/postgres/data/base/16537/3455 new file mode 100755 index 0000000..116a34e Binary files /dev/null and b/postgres/data/base/16537/3455 differ diff --git a/postgres/data/base/16537/3456 b/postgres/data/base/16537/3456 new file mode 100755 index 0000000..5e8c54d Binary files /dev/null and b/postgres/data/base/16537/3456 differ diff --git a/postgres/data/base/16537/3456_fsm b/postgres/data/base/16537/3456_fsm new file mode 100755 index 0000000..f34a9c7 Binary files /dev/null and b/postgres/data/base/16537/3456_fsm differ diff --git a/postgres/data/base/16537/3456_vm b/postgres/data/base/16537/3456_vm new file mode 100755 index 0000000..818bc99 Binary files /dev/null and b/postgres/data/base/16537/3456_vm differ diff --git a/postgres/data/base/16537/3466 b/postgres/data/base/16537/3466 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/3467 b/postgres/data/base/16537/3467 new file mode 100755 index 0000000..b6b9c87 Binary files /dev/null and b/postgres/data/base/16537/3467 differ diff --git a/postgres/data/base/16537/3468 b/postgres/data/base/16537/3468 new file mode 100755 index 0000000..a83ab4f Binary files /dev/null and b/postgres/data/base/16537/3468 differ diff --git a/postgres/data/base/16537/3501 b/postgres/data/base/16537/3501 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/3502 b/postgres/data/base/16537/3502 new file mode 100755 index 0000000..30116a3 Binary files /dev/null and b/postgres/data/base/16537/3502 differ diff --git a/postgres/data/base/16537/3503 b/postgres/data/base/16537/3503 new file mode 100755 index 0000000..25e825d Binary files /dev/null and b/postgres/data/base/16537/3503 differ diff --git a/postgres/data/base/16537/3534 b/postgres/data/base/16537/3534 new file mode 100755 index 0000000..4b3c838 Binary files /dev/null and b/postgres/data/base/16537/3534 differ diff --git a/postgres/data/base/16537/3541 b/postgres/data/base/16537/3541 new file mode 100755 index 0000000..7dca3c9 Binary files /dev/null and b/postgres/data/base/16537/3541 differ diff --git a/postgres/data/base/16537/3541_fsm b/postgres/data/base/16537/3541_fsm new file mode 100755 index 0000000..bc3412f Binary files /dev/null and b/postgres/data/base/16537/3541_fsm differ diff --git a/postgres/data/base/16537/3541_vm b/postgres/data/base/16537/3541_vm new file mode 100755 index 0000000..42316fb Binary files /dev/null and b/postgres/data/base/16537/3541_vm differ diff --git a/postgres/data/base/16537/3542 b/postgres/data/base/16537/3542 new file mode 100755 index 0000000..8145197 Binary files /dev/null and b/postgres/data/base/16537/3542 differ diff --git a/postgres/data/base/16537/3574 b/postgres/data/base/16537/3574 new file mode 100755 index 0000000..30a0e74 Binary files /dev/null and b/postgres/data/base/16537/3574 differ diff --git a/postgres/data/base/16537/3575 b/postgres/data/base/16537/3575 new file mode 100755 index 0000000..237919a Binary files /dev/null and b/postgres/data/base/16537/3575 differ diff --git a/postgres/data/base/16537/3576 b/postgres/data/base/16537/3576 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/3596 b/postgres/data/base/16537/3596 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/3597 b/postgres/data/base/16537/3597 new file mode 100755 index 0000000..39c3a29 Binary files /dev/null and b/postgres/data/base/16537/3597 differ diff --git a/postgres/data/base/16537/3598 b/postgres/data/base/16537/3598 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/3599 b/postgres/data/base/16537/3599 new file mode 100755 index 0000000..6ff80ec Binary files /dev/null and b/postgres/data/base/16537/3599 differ diff --git a/postgres/data/base/16537/3600 b/postgres/data/base/16537/3600 new file mode 100755 index 0000000..94459f7 Binary files /dev/null and b/postgres/data/base/16537/3600 differ diff --git a/postgres/data/base/16537/3600_fsm b/postgres/data/base/16537/3600_fsm new file mode 100755 index 0000000..f0f4aa3 Binary files /dev/null and b/postgres/data/base/16537/3600_fsm differ diff --git a/postgres/data/base/16537/3600_vm b/postgres/data/base/16537/3600_vm new file mode 100755 index 0000000..0f43342 Binary files /dev/null and b/postgres/data/base/16537/3600_vm differ diff --git a/postgres/data/base/16537/3601 b/postgres/data/base/16537/3601 new file mode 100755 index 0000000..124c4c8 Binary files /dev/null and b/postgres/data/base/16537/3601 differ diff --git a/postgres/data/base/16537/3601_fsm b/postgres/data/base/16537/3601_fsm new file mode 100755 index 0000000..c25aed6 Binary files /dev/null and b/postgres/data/base/16537/3601_fsm differ diff --git a/postgres/data/base/16537/3601_vm b/postgres/data/base/16537/3601_vm new file mode 100755 index 0000000..f7fd269 Binary files /dev/null and b/postgres/data/base/16537/3601_vm differ diff --git a/postgres/data/base/16537/3602 b/postgres/data/base/16537/3602 new file mode 100755 index 0000000..df8651c Binary files /dev/null and b/postgres/data/base/16537/3602 differ diff --git a/postgres/data/base/16537/3602_fsm b/postgres/data/base/16537/3602_fsm new file mode 100755 index 0000000..9e2452e Binary files /dev/null and b/postgres/data/base/16537/3602_fsm differ diff --git a/postgres/data/base/16537/3602_vm b/postgres/data/base/16537/3602_vm new file mode 100755 index 0000000..5bd7f1a Binary files /dev/null and b/postgres/data/base/16537/3602_vm differ diff --git a/postgres/data/base/16537/3603 b/postgres/data/base/16537/3603 new file mode 100755 index 0000000..c36e2ae Binary files /dev/null and b/postgres/data/base/16537/3603 differ diff --git a/postgres/data/base/16537/3603_fsm b/postgres/data/base/16537/3603_fsm new file mode 100755 index 0000000..357e7fa Binary files /dev/null and b/postgres/data/base/16537/3603_fsm differ diff --git a/postgres/data/base/16537/3603_vm b/postgres/data/base/16537/3603_vm new file mode 100755 index 0000000..10f5a68 Binary files /dev/null and b/postgres/data/base/16537/3603_vm differ diff --git a/postgres/data/base/16537/3604 b/postgres/data/base/16537/3604 new file mode 100755 index 0000000..d0a704a Binary files /dev/null and b/postgres/data/base/16537/3604 differ diff --git a/postgres/data/base/16537/3605 b/postgres/data/base/16537/3605 new file mode 100755 index 0000000..016f33e Binary files /dev/null and b/postgres/data/base/16537/3605 differ diff --git a/postgres/data/base/16537/3606 b/postgres/data/base/16537/3606 new file mode 100755 index 0000000..702e34a Binary files /dev/null and b/postgres/data/base/16537/3606 differ diff --git a/postgres/data/base/16537/3607 b/postgres/data/base/16537/3607 new file mode 100755 index 0000000..fc26c94 Binary files /dev/null and b/postgres/data/base/16537/3607 differ diff --git a/postgres/data/base/16537/3608 b/postgres/data/base/16537/3608 new file mode 100755 index 0000000..bc42a2f Binary files /dev/null and b/postgres/data/base/16537/3608 differ diff --git a/postgres/data/base/16537/3609 b/postgres/data/base/16537/3609 new file mode 100755 index 0000000..bd5c68e Binary files /dev/null and b/postgres/data/base/16537/3609 differ diff --git a/postgres/data/base/16537/3712 b/postgres/data/base/16537/3712 new file mode 100755 index 0000000..8dfcef0 Binary files /dev/null and b/postgres/data/base/16537/3712 differ diff --git a/postgres/data/base/16537/3764 b/postgres/data/base/16537/3764 new file mode 100755 index 0000000..a508bbb Binary files /dev/null and b/postgres/data/base/16537/3764 differ diff --git a/postgres/data/base/16537/3764_fsm b/postgres/data/base/16537/3764_fsm new file mode 100755 index 0000000..bfd7dfe Binary files /dev/null and b/postgres/data/base/16537/3764_fsm differ diff --git a/postgres/data/base/16537/3764_vm b/postgres/data/base/16537/3764_vm new file mode 100755 index 0000000..a513638 Binary files /dev/null and b/postgres/data/base/16537/3764_vm differ diff --git a/postgres/data/base/16537/3766 b/postgres/data/base/16537/3766 new file mode 100755 index 0000000..dd3ec5a Binary files /dev/null and b/postgres/data/base/16537/3766 differ diff --git a/postgres/data/base/16537/3767 b/postgres/data/base/16537/3767 new file mode 100755 index 0000000..f643198 Binary files /dev/null and b/postgres/data/base/16537/3767 differ diff --git a/postgres/data/base/16537/3997 b/postgres/data/base/16537/3997 new file mode 100755 index 0000000..25a77ed Binary files /dev/null and b/postgres/data/base/16537/3997 differ diff --git a/postgres/data/base/16537/4143 b/postgres/data/base/16537/4143 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/4144 b/postgres/data/base/16537/4144 new file mode 100755 index 0000000..9abb3ab Binary files /dev/null and b/postgres/data/base/16537/4144 differ diff --git a/postgres/data/base/16537/4145 b/postgres/data/base/16537/4145 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/4146 b/postgres/data/base/16537/4146 new file mode 100755 index 0000000..e85d981 Binary files /dev/null and b/postgres/data/base/16537/4146 differ diff --git a/postgres/data/base/16537/4147 b/postgres/data/base/16537/4147 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/4148 b/postgres/data/base/16537/4148 new file mode 100755 index 0000000..87afe88 Binary files /dev/null and b/postgres/data/base/16537/4148 differ diff --git a/postgres/data/base/16537/4149 b/postgres/data/base/16537/4149 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/4150 b/postgres/data/base/16537/4150 new file mode 100755 index 0000000..2b4bc0b Binary files /dev/null and b/postgres/data/base/16537/4150 differ diff --git a/postgres/data/base/16537/4151 b/postgres/data/base/16537/4151 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/4152 b/postgres/data/base/16537/4152 new file mode 100755 index 0000000..568f1e0 Binary files /dev/null and b/postgres/data/base/16537/4152 differ diff --git a/postgres/data/base/16537/4153 b/postgres/data/base/16537/4153 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/4154 b/postgres/data/base/16537/4154 new file mode 100755 index 0000000..314349b Binary files /dev/null and b/postgres/data/base/16537/4154 differ diff --git a/postgres/data/base/16537/4155 b/postgres/data/base/16537/4155 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/4156 b/postgres/data/base/16537/4156 new file mode 100755 index 0000000..22042dc Binary files /dev/null and b/postgres/data/base/16537/4156 differ diff --git a/postgres/data/base/16537/4157 b/postgres/data/base/16537/4157 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/4158 b/postgres/data/base/16537/4158 new file mode 100755 index 0000000..beedf88 Binary files /dev/null and b/postgres/data/base/16537/4158 differ diff --git a/postgres/data/base/16537/4159 b/postgres/data/base/16537/4159 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/4160 b/postgres/data/base/16537/4160 new file mode 100755 index 0000000..33c08c5 Binary files /dev/null and b/postgres/data/base/16537/4160 differ diff --git a/postgres/data/base/16537/4163 b/postgres/data/base/16537/4163 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/4164 b/postgres/data/base/16537/4164 new file mode 100755 index 0000000..2e3beec Binary files /dev/null and b/postgres/data/base/16537/4164 differ diff --git a/postgres/data/base/16537/4165 b/postgres/data/base/16537/4165 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/4166 b/postgres/data/base/16537/4166 new file mode 100755 index 0000000..94aeffa Binary files /dev/null and b/postgres/data/base/16537/4166 differ diff --git a/postgres/data/base/16537/4167 b/postgres/data/base/16537/4167 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/4168 b/postgres/data/base/16537/4168 new file mode 100755 index 0000000..cb5844d Binary files /dev/null and b/postgres/data/base/16537/4168 differ diff --git a/postgres/data/base/16537/4169 b/postgres/data/base/16537/4169 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/4170 b/postgres/data/base/16537/4170 new file mode 100755 index 0000000..a7b9a14 Binary files /dev/null and b/postgres/data/base/16537/4170 differ diff --git a/postgres/data/base/16537/4171 b/postgres/data/base/16537/4171 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/4172 b/postgres/data/base/16537/4172 new file mode 100755 index 0000000..29ca401 Binary files /dev/null and b/postgres/data/base/16537/4172 differ diff --git a/postgres/data/base/16537/4173 b/postgres/data/base/16537/4173 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/4174 b/postgres/data/base/16537/4174 new file mode 100755 index 0000000..74f4afe Binary files /dev/null and b/postgres/data/base/16537/4174 differ diff --git a/postgres/data/base/16537/5002 b/postgres/data/base/16537/5002 new file mode 100755 index 0000000..7ae136b Binary files /dev/null and b/postgres/data/base/16537/5002 differ diff --git a/postgres/data/base/16537/548 b/postgres/data/base/16537/548 new file mode 100755 index 0000000..b3bf885 Binary files /dev/null and b/postgres/data/base/16537/548 differ diff --git a/postgres/data/base/16537/549 b/postgres/data/base/16537/549 new file mode 100755 index 0000000..72a148b Binary files /dev/null and b/postgres/data/base/16537/549 differ diff --git a/postgres/data/base/16537/6102 b/postgres/data/base/16537/6102 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/6104 b/postgres/data/base/16537/6104 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/6106 b/postgres/data/base/16537/6106 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/6110 b/postgres/data/base/16537/6110 new file mode 100755 index 0000000..3ba6e4d Binary files /dev/null and b/postgres/data/base/16537/6110 differ diff --git a/postgres/data/base/16537/6111 b/postgres/data/base/16537/6111 new file mode 100755 index 0000000..dcbc9c9 Binary files /dev/null and b/postgres/data/base/16537/6111 differ diff --git a/postgres/data/base/16537/6112 b/postgres/data/base/16537/6112 new file mode 100755 index 0000000..870e6f0 Binary files /dev/null and b/postgres/data/base/16537/6112 differ diff --git a/postgres/data/base/16537/6113 b/postgres/data/base/16537/6113 new file mode 100755 index 0000000..9c0e439 Binary files /dev/null and b/postgres/data/base/16537/6113 differ diff --git a/postgres/data/base/16537/6116 b/postgres/data/base/16537/6116 new file mode 100755 index 0000000..5b091c2 Binary files /dev/null and b/postgres/data/base/16537/6116 differ diff --git a/postgres/data/base/16537/6117 b/postgres/data/base/16537/6117 new file mode 100755 index 0000000..a5f7f22 Binary files /dev/null and b/postgres/data/base/16537/6117 differ diff --git a/postgres/data/base/16537/6175 b/postgres/data/base/16537/6175 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/6176 b/postgres/data/base/16537/6176 new file mode 100755 index 0000000..ecc44a6 Binary files /dev/null and b/postgres/data/base/16537/6176 differ diff --git a/postgres/data/base/16537/6228 b/postgres/data/base/16537/6228 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/6229 b/postgres/data/base/16537/6229 new file mode 100755 index 0000000..cb50115 Binary files /dev/null and b/postgres/data/base/16537/6229 differ diff --git a/postgres/data/base/16537/6237 b/postgres/data/base/16537/6237 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/16537/6238 b/postgres/data/base/16537/6238 new file mode 100755 index 0000000..7ae197a Binary files /dev/null and b/postgres/data/base/16537/6238 differ diff --git a/postgres/data/base/16537/6239 b/postgres/data/base/16537/6239 new file mode 100755 index 0000000..cab3205 Binary files /dev/null and b/postgres/data/base/16537/6239 differ diff --git a/postgres/data/base/16537/826 b/postgres/data/base/16537/826 new file mode 100755 index 0000000..adb06d6 Binary files /dev/null and b/postgres/data/base/16537/826 differ diff --git a/postgres/data/base/16537/827 b/postgres/data/base/16537/827 new file mode 100755 index 0000000..179b950 Binary files /dev/null and b/postgres/data/base/16537/827 differ diff --git a/postgres/data/base/16537/828 b/postgres/data/base/16537/828 new file mode 100755 index 0000000..3de5e2e Binary files /dev/null and b/postgres/data/base/16537/828 differ diff --git a/postgres/data/base/16537/PG_VERSION b/postgres/data/base/16537/PG_VERSION new file mode 100755 index 0000000..98d9bcb --- /dev/null +++ b/postgres/data/base/16537/PG_VERSION @@ -0,0 +1 @@ +17 diff --git a/postgres/data/base/16537/pg_filenode.map b/postgres/data/base/16537/pg_filenode.map new file mode 100755 index 0000000..4fc801a Binary files /dev/null and b/postgres/data/base/16537/pg_filenode.map differ diff --git a/postgres/data/base/16537/pg_internal.init b/postgres/data/base/16537/pg_internal.init new file mode 100755 index 0000000..b8f3942 Binary files /dev/null and b/postgres/data/base/16537/pg_internal.init differ diff --git a/postgres/data/base/4/112 b/postgres/data/base/4/112 new file mode 100755 index 0000000..9531ca8 Binary files /dev/null and b/postgres/data/base/4/112 differ diff --git a/postgres/data/base/4/113 b/postgres/data/base/4/113 new file mode 100755 index 0000000..f92630d Binary files /dev/null and b/postgres/data/base/4/113 differ diff --git a/postgres/data/base/4/1247 b/postgres/data/base/4/1247 new file mode 100755 index 0000000..540213e Binary files /dev/null and b/postgres/data/base/4/1247 differ diff --git a/postgres/data/base/4/1247_fsm b/postgres/data/base/4/1247_fsm new file mode 100755 index 0000000..fd57308 Binary files /dev/null and b/postgres/data/base/4/1247_fsm differ diff --git a/postgres/data/base/4/1247_vm b/postgres/data/base/4/1247_vm new file mode 100755 index 0000000..8ccc3c7 Binary files /dev/null and b/postgres/data/base/4/1247_vm differ diff --git a/postgres/data/base/4/1249 b/postgres/data/base/4/1249 new file mode 100755 index 0000000..9b8eeab Binary files /dev/null and b/postgres/data/base/4/1249 differ diff --git a/postgres/data/base/4/1249_fsm b/postgres/data/base/4/1249_fsm new file mode 100755 index 0000000..e0ed4b0 Binary files /dev/null and b/postgres/data/base/4/1249_fsm differ diff --git a/postgres/data/base/4/1249_vm b/postgres/data/base/4/1249_vm new file mode 100755 index 0000000..affcf7f Binary files /dev/null and b/postgres/data/base/4/1249_vm differ diff --git a/postgres/data/base/4/1255 b/postgres/data/base/4/1255 new file mode 100755 index 0000000..23ff105 Binary files /dev/null and b/postgres/data/base/4/1255 differ diff --git a/postgres/data/base/4/1255_fsm b/postgres/data/base/4/1255_fsm new file mode 100755 index 0000000..062bfc5 Binary files /dev/null and b/postgres/data/base/4/1255_fsm differ diff --git a/postgres/data/base/4/1255_vm b/postgres/data/base/4/1255_vm new file mode 100755 index 0000000..7ac0ecc Binary files /dev/null and b/postgres/data/base/4/1255_vm differ diff --git a/postgres/data/base/4/1259 b/postgres/data/base/4/1259 new file mode 100755 index 0000000..a98519b Binary files /dev/null and b/postgres/data/base/4/1259 differ diff --git a/postgres/data/base/4/1259_fsm b/postgres/data/base/4/1259_fsm new file mode 100755 index 0000000..2077a7b Binary files /dev/null and b/postgres/data/base/4/1259_fsm differ diff --git a/postgres/data/base/4/1259_vm b/postgres/data/base/4/1259_vm new file mode 100755 index 0000000..c44f30c Binary files /dev/null and b/postgres/data/base/4/1259_vm differ diff --git a/postgres/data/base/4/13463 b/postgres/data/base/4/13463 new file mode 100755 index 0000000..5ac7a42 Binary files /dev/null and b/postgres/data/base/4/13463 differ diff --git a/postgres/data/base/4/13463_fsm b/postgres/data/base/4/13463_fsm new file mode 100755 index 0000000..45338f1 Binary files /dev/null and b/postgres/data/base/4/13463_fsm differ diff --git a/postgres/data/base/4/13463_vm b/postgres/data/base/4/13463_vm new file mode 100755 index 0000000..dd38365 Binary files /dev/null and b/postgres/data/base/4/13463_vm differ diff --git a/postgres/data/base/4/13466 b/postgres/data/base/4/13466 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/13467 b/postgres/data/base/4/13467 new file mode 100755 index 0000000..f572c60 Binary files /dev/null and b/postgres/data/base/4/13467 differ diff --git a/postgres/data/base/4/13468 b/postgres/data/base/4/13468 new file mode 100755 index 0000000..1c39b02 Binary files /dev/null and b/postgres/data/base/4/13468 differ diff --git a/postgres/data/base/4/13468_fsm b/postgres/data/base/4/13468_fsm new file mode 100755 index 0000000..70d16ce Binary files /dev/null and b/postgres/data/base/4/13468_fsm differ diff --git a/postgres/data/base/4/13468_vm b/postgres/data/base/4/13468_vm new file mode 100755 index 0000000..a990030 Binary files /dev/null and b/postgres/data/base/4/13468_vm differ diff --git a/postgres/data/base/4/13471 b/postgres/data/base/4/13471 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/13472 b/postgres/data/base/4/13472 new file mode 100755 index 0000000..c1b4577 Binary files /dev/null and b/postgres/data/base/4/13472 differ diff --git a/postgres/data/base/4/13473 b/postgres/data/base/4/13473 new file mode 100755 index 0000000..7722593 Binary files /dev/null and b/postgres/data/base/4/13473 differ diff --git a/postgres/data/base/4/13473_fsm b/postgres/data/base/4/13473_fsm new file mode 100755 index 0000000..0673ada Binary files /dev/null and b/postgres/data/base/4/13473_fsm differ diff --git a/postgres/data/base/4/13473_vm b/postgres/data/base/4/13473_vm new file mode 100755 index 0000000..076d693 Binary files /dev/null and b/postgres/data/base/4/13473_vm differ diff --git a/postgres/data/base/4/13476 b/postgres/data/base/4/13476 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/13477 b/postgres/data/base/4/13477 new file mode 100755 index 0000000..a2b6d05 Binary files /dev/null and b/postgres/data/base/4/13477 differ diff --git a/postgres/data/base/4/13478 b/postgres/data/base/4/13478 new file mode 100755 index 0000000..fe52a6c Binary files /dev/null and b/postgres/data/base/4/13478 differ diff --git a/postgres/data/base/4/13478_fsm b/postgres/data/base/4/13478_fsm new file mode 100755 index 0000000..a836ddf Binary files /dev/null and b/postgres/data/base/4/13478_fsm differ diff --git a/postgres/data/base/4/13478_vm b/postgres/data/base/4/13478_vm new file mode 100755 index 0000000..a69a78d Binary files /dev/null and b/postgres/data/base/4/13478_vm differ diff --git a/postgres/data/base/4/13481 b/postgres/data/base/4/13481 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/13482 b/postgres/data/base/4/13482 new file mode 100755 index 0000000..fbe1432 Binary files /dev/null and b/postgres/data/base/4/13482 differ diff --git a/postgres/data/base/4/1417 b/postgres/data/base/4/1417 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/1418 b/postgres/data/base/4/1418 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/174 b/postgres/data/base/4/174 new file mode 100755 index 0000000..4f4d8be Binary files /dev/null and b/postgres/data/base/4/174 differ diff --git a/postgres/data/base/4/175 b/postgres/data/base/4/175 new file mode 100755 index 0000000..98fd8de Binary files /dev/null and b/postgres/data/base/4/175 differ diff --git a/postgres/data/base/4/2187 b/postgres/data/base/4/2187 new file mode 100755 index 0000000..d2cd30b Binary files /dev/null and b/postgres/data/base/4/2187 differ diff --git a/postgres/data/base/4/2224 b/postgres/data/base/4/2224 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/2228 b/postgres/data/base/4/2228 new file mode 100755 index 0000000..bfecf01 Binary files /dev/null and b/postgres/data/base/4/2228 differ diff --git a/postgres/data/base/4/2328 b/postgres/data/base/4/2328 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/2336 b/postgres/data/base/4/2336 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/2337 b/postgres/data/base/4/2337 new file mode 100755 index 0000000..2c0b13d Binary files /dev/null and b/postgres/data/base/4/2337 differ diff --git a/postgres/data/base/4/2579 b/postgres/data/base/4/2579 new file mode 100755 index 0000000..e8e73a2 Binary files /dev/null and b/postgres/data/base/4/2579 differ diff --git a/postgres/data/base/4/2600 b/postgres/data/base/4/2600 new file mode 100755 index 0000000..9dfd1a8 Binary files /dev/null and b/postgres/data/base/4/2600 differ diff --git a/postgres/data/base/4/2600_fsm b/postgres/data/base/4/2600_fsm new file mode 100755 index 0000000..c542a78 Binary files /dev/null and b/postgres/data/base/4/2600_fsm differ diff --git a/postgres/data/base/4/2600_vm b/postgres/data/base/4/2600_vm new file mode 100755 index 0000000..c298c06 Binary files /dev/null and b/postgres/data/base/4/2600_vm differ diff --git a/postgres/data/base/4/2601 b/postgres/data/base/4/2601 new file mode 100755 index 0000000..d8001c8 Binary files /dev/null and b/postgres/data/base/4/2601 differ diff --git a/postgres/data/base/4/2601_fsm b/postgres/data/base/4/2601_fsm new file mode 100755 index 0000000..d388044 Binary files /dev/null and b/postgres/data/base/4/2601_fsm differ diff --git a/postgres/data/base/4/2601_vm b/postgres/data/base/4/2601_vm new file mode 100755 index 0000000..ce3bf93 Binary files /dev/null and b/postgres/data/base/4/2601_vm differ diff --git a/postgres/data/base/4/2602 b/postgres/data/base/4/2602 new file mode 100755 index 0000000..4a27b0a Binary files /dev/null and b/postgres/data/base/4/2602 differ diff --git a/postgres/data/base/4/2602_fsm b/postgres/data/base/4/2602_fsm new file mode 100755 index 0000000..23170d8 Binary files /dev/null and b/postgres/data/base/4/2602_fsm differ diff --git a/postgres/data/base/4/2602_vm b/postgres/data/base/4/2602_vm new file mode 100755 index 0000000..3b5e257 Binary files /dev/null and b/postgres/data/base/4/2602_vm differ diff --git a/postgres/data/base/4/2603 b/postgres/data/base/4/2603 new file mode 100755 index 0000000..d511af5 Binary files /dev/null and b/postgres/data/base/4/2603 differ diff --git a/postgres/data/base/4/2603_fsm b/postgres/data/base/4/2603_fsm new file mode 100755 index 0000000..949bd18 Binary files /dev/null and b/postgres/data/base/4/2603_fsm differ diff --git a/postgres/data/base/4/2603_vm b/postgres/data/base/4/2603_vm new file mode 100755 index 0000000..7df4f59 Binary files /dev/null and b/postgres/data/base/4/2603_vm differ diff --git a/postgres/data/base/4/2604 b/postgres/data/base/4/2604 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/2605 b/postgres/data/base/4/2605 new file mode 100755 index 0000000..eeaa7ea Binary files /dev/null and b/postgres/data/base/4/2605 differ diff --git a/postgres/data/base/4/2605_fsm b/postgres/data/base/4/2605_fsm new file mode 100755 index 0000000..f3b92bf Binary files /dev/null and b/postgres/data/base/4/2605_fsm differ diff --git a/postgres/data/base/4/2605_vm b/postgres/data/base/4/2605_vm new file mode 100755 index 0000000..a95fe7b Binary files /dev/null and b/postgres/data/base/4/2605_vm differ diff --git a/postgres/data/base/4/2606 b/postgres/data/base/4/2606 new file mode 100755 index 0000000..0e4c5a3 Binary files /dev/null and b/postgres/data/base/4/2606 differ diff --git a/postgres/data/base/4/2606_fsm b/postgres/data/base/4/2606_fsm new file mode 100755 index 0000000..267454e Binary files /dev/null and b/postgres/data/base/4/2606_fsm differ diff --git a/postgres/data/base/4/2606_vm b/postgres/data/base/4/2606_vm new file mode 100755 index 0000000..6b0159f Binary files /dev/null and b/postgres/data/base/4/2606_vm differ diff --git a/postgres/data/base/4/2607 b/postgres/data/base/4/2607 new file mode 100755 index 0000000..bfad49a Binary files /dev/null and b/postgres/data/base/4/2607 differ diff --git a/postgres/data/base/4/2607_fsm b/postgres/data/base/4/2607_fsm new file mode 100755 index 0000000..80ac8b1 Binary files /dev/null and b/postgres/data/base/4/2607_fsm differ diff --git a/postgres/data/base/4/2607_vm b/postgres/data/base/4/2607_vm new file mode 100755 index 0000000..7c2c53d Binary files /dev/null and b/postgres/data/base/4/2607_vm differ diff --git a/postgres/data/base/4/2608 b/postgres/data/base/4/2608 new file mode 100755 index 0000000..7f6f529 Binary files /dev/null and b/postgres/data/base/4/2608 differ diff --git a/postgres/data/base/4/2608_fsm b/postgres/data/base/4/2608_fsm new file mode 100755 index 0000000..4b19785 Binary files /dev/null and b/postgres/data/base/4/2608_fsm differ diff --git a/postgres/data/base/4/2608_vm b/postgres/data/base/4/2608_vm new file mode 100755 index 0000000..6e5e572 Binary files /dev/null and b/postgres/data/base/4/2608_vm differ diff --git a/postgres/data/base/4/2609 b/postgres/data/base/4/2609 new file mode 100755 index 0000000..f22fe32 Binary files /dev/null and b/postgres/data/base/4/2609 differ diff --git a/postgres/data/base/4/2609_fsm b/postgres/data/base/4/2609_fsm new file mode 100755 index 0000000..7be5dc7 Binary files /dev/null and b/postgres/data/base/4/2609_fsm differ diff --git a/postgres/data/base/4/2609_vm b/postgres/data/base/4/2609_vm new file mode 100755 index 0000000..40974d4 Binary files /dev/null and b/postgres/data/base/4/2609_vm differ diff --git a/postgres/data/base/4/2610 b/postgres/data/base/4/2610 new file mode 100755 index 0000000..2b6e6ed Binary files /dev/null and b/postgres/data/base/4/2610 differ diff --git a/postgres/data/base/4/2610_fsm b/postgres/data/base/4/2610_fsm new file mode 100755 index 0000000..ecbcb5f Binary files /dev/null and b/postgres/data/base/4/2610_fsm differ diff --git a/postgres/data/base/4/2610_vm b/postgres/data/base/4/2610_vm new file mode 100755 index 0000000..6a8139e Binary files /dev/null and b/postgres/data/base/4/2610_vm differ diff --git a/postgres/data/base/4/2611 b/postgres/data/base/4/2611 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/2612 b/postgres/data/base/4/2612 new file mode 100755 index 0000000..024d951 Binary files /dev/null and b/postgres/data/base/4/2612 differ diff --git a/postgres/data/base/4/2612_fsm b/postgres/data/base/4/2612_fsm new file mode 100755 index 0000000..877976a Binary files /dev/null and b/postgres/data/base/4/2612_fsm differ diff --git a/postgres/data/base/4/2612_vm b/postgres/data/base/4/2612_vm new file mode 100755 index 0000000..66d693c Binary files /dev/null and b/postgres/data/base/4/2612_vm differ diff --git a/postgres/data/base/4/2613 b/postgres/data/base/4/2613 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/2615 b/postgres/data/base/4/2615 new file mode 100755 index 0000000..add2690 Binary files /dev/null and b/postgres/data/base/4/2615 differ diff --git a/postgres/data/base/4/2615_fsm b/postgres/data/base/4/2615_fsm new file mode 100755 index 0000000..d041693 Binary files /dev/null and b/postgres/data/base/4/2615_fsm differ diff --git a/postgres/data/base/4/2615_vm b/postgres/data/base/4/2615_vm new file mode 100755 index 0000000..5ca7f9c Binary files /dev/null and b/postgres/data/base/4/2615_vm differ diff --git a/postgres/data/base/4/2616 b/postgres/data/base/4/2616 new file mode 100755 index 0000000..0d60d79 Binary files /dev/null and b/postgres/data/base/4/2616 differ diff --git a/postgres/data/base/4/2616_fsm b/postgres/data/base/4/2616_fsm new file mode 100755 index 0000000..cb924c9 Binary files /dev/null and b/postgres/data/base/4/2616_fsm differ diff --git a/postgres/data/base/4/2616_vm b/postgres/data/base/4/2616_vm new file mode 100755 index 0000000..67dd5a6 Binary files /dev/null and b/postgres/data/base/4/2616_vm differ diff --git a/postgres/data/base/4/2617 b/postgres/data/base/4/2617 new file mode 100755 index 0000000..bcdfc18 Binary files /dev/null and b/postgres/data/base/4/2617 differ diff --git a/postgres/data/base/4/2617_fsm b/postgres/data/base/4/2617_fsm new file mode 100755 index 0000000..29d6066 Binary files /dev/null and b/postgres/data/base/4/2617_fsm differ diff --git a/postgres/data/base/4/2617_vm b/postgres/data/base/4/2617_vm new file mode 100755 index 0000000..5b871b4 Binary files /dev/null and b/postgres/data/base/4/2617_vm differ diff --git a/postgres/data/base/4/2618 b/postgres/data/base/4/2618 new file mode 100755 index 0000000..a413ce8 Binary files /dev/null and b/postgres/data/base/4/2618 differ diff --git a/postgres/data/base/4/2618_fsm b/postgres/data/base/4/2618_fsm new file mode 100755 index 0000000..6cf107f Binary files /dev/null and b/postgres/data/base/4/2618_fsm differ diff --git a/postgres/data/base/4/2618_vm b/postgres/data/base/4/2618_vm new file mode 100755 index 0000000..598a6a2 Binary files /dev/null and b/postgres/data/base/4/2618_vm differ diff --git a/postgres/data/base/4/2619 b/postgres/data/base/4/2619 new file mode 100755 index 0000000..0273c8e Binary files /dev/null and b/postgres/data/base/4/2619 differ diff --git a/postgres/data/base/4/2619_fsm b/postgres/data/base/4/2619_fsm new file mode 100755 index 0000000..7183aea Binary files /dev/null and b/postgres/data/base/4/2619_fsm differ diff --git a/postgres/data/base/4/2619_vm b/postgres/data/base/4/2619_vm new file mode 100755 index 0000000..cb5f5e0 Binary files /dev/null and b/postgres/data/base/4/2619_vm differ diff --git a/postgres/data/base/4/2620 b/postgres/data/base/4/2620 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/2650 b/postgres/data/base/4/2650 new file mode 100755 index 0000000..042d761 Binary files /dev/null and b/postgres/data/base/4/2650 differ diff --git a/postgres/data/base/4/2651 b/postgres/data/base/4/2651 new file mode 100755 index 0000000..35590f4 Binary files /dev/null and b/postgres/data/base/4/2651 differ diff --git a/postgres/data/base/4/2652 b/postgres/data/base/4/2652 new file mode 100755 index 0000000..adf7b05 Binary files /dev/null and b/postgres/data/base/4/2652 differ diff --git a/postgres/data/base/4/2653 b/postgres/data/base/4/2653 new file mode 100755 index 0000000..7ef9b49 Binary files /dev/null and b/postgres/data/base/4/2653 differ diff --git a/postgres/data/base/4/2654 b/postgres/data/base/4/2654 new file mode 100755 index 0000000..e4e182f Binary files /dev/null and b/postgres/data/base/4/2654 differ diff --git a/postgres/data/base/4/2655 b/postgres/data/base/4/2655 new file mode 100755 index 0000000..0a0d565 Binary files /dev/null and b/postgres/data/base/4/2655 differ diff --git a/postgres/data/base/4/2656 b/postgres/data/base/4/2656 new file mode 100755 index 0000000..8507f4c Binary files /dev/null and b/postgres/data/base/4/2656 differ diff --git a/postgres/data/base/4/2657 b/postgres/data/base/4/2657 new file mode 100755 index 0000000..f62a61d Binary files /dev/null and b/postgres/data/base/4/2657 differ diff --git a/postgres/data/base/4/2658 b/postgres/data/base/4/2658 new file mode 100755 index 0000000..04c0fab Binary files /dev/null and b/postgres/data/base/4/2658 differ diff --git a/postgres/data/base/4/2659 b/postgres/data/base/4/2659 new file mode 100755 index 0000000..7a038de Binary files /dev/null and b/postgres/data/base/4/2659 differ diff --git a/postgres/data/base/4/2660 b/postgres/data/base/4/2660 new file mode 100755 index 0000000..8a83211 Binary files /dev/null and b/postgres/data/base/4/2660 differ diff --git a/postgres/data/base/4/2661 b/postgres/data/base/4/2661 new file mode 100755 index 0000000..17613f7 Binary files /dev/null and b/postgres/data/base/4/2661 differ diff --git a/postgres/data/base/4/2662 b/postgres/data/base/4/2662 new file mode 100755 index 0000000..06ddd60 Binary files /dev/null and b/postgres/data/base/4/2662 differ diff --git a/postgres/data/base/4/2663 b/postgres/data/base/4/2663 new file mode 100755 index 0000000..8c7204d Binary files /dev/null and b/postgres/data/base/4/2663 differ diff --git a/postgres/data/base/4/2664 b/postgres/data/base/4/2664 new file mode 100755 index 0000000..1a7c9a4 Binary files /dev/null and b/postgres/data/base/4/2664 differ diff --git a/postgres/data/base/4/2665 b/postgres/data/base/4/2665 new file mode 100755 index 0000000..a636b34 Binary files /dev/null and b/postgres/data/base/4/2665 differ diff --git a/postgres/data/base/4/2666 b/postgres/data/base/4/2666 new file mode 100755 index 0000000..35015fc Binary files /dev/null and b/postgres/data/base/4/2666 differ diff --git a/postgres/data/base/4/2667 b/postgres/data/base/4/2667 new file mode 100755 index 0000000..0e8a194 Binary files /dev/null and b/postgres/data/base/4/2667 differ diff --git a/postgres/data/base/4/2668 b/postgres/data/base/4/2668 new file mode 100755 index 0000000..5fd6734 Binary files /dev/null and b/postgres/data/base/4/2668 differ diff --git a/postgres/data/base/4/2669 b/postgres/data/base/4/2669 new file mode 100755 index 0000000..659c1e8 Binary files /dev/null and b/postgres/data/base/4/2669 differ diff --git a/postgres/data/base/4/2670 b/postgres/data/base/4/2670 new file mode 100755 index 0000000..affe09d Binary files /dev/null and b/postgres/data/base/4/2670 differ diff --git a/postgres/data/base/4/2673 b/postgres/data/base/4/2673 new file mode 100755 index 0000000..e8d4f2f Binary files /dev/null and b/postgres/data/base/4/2673 differ diff --git a/postgres/data/base/4/2674 b/postgres/data/base/4/2674 new file mode 100755 index 0000000..42f14c1 Binary files /dev/null and b/postgres/data/base/4/2674 differ diff --git a/postgres/data/base/4/2675 b/postgres/data/base/4/2675 new file mode 100755 index 0000000..632859e Binary files /dev/null and b/postgres/data/base/4/2675 differ diff --git a/postgres/data/base/4/2678 b/postgres/data/base/4/2678 new file mode 100755 index 0000000..dd6c349 Binary files /dev/null and b/postgres/data/base/4/2678 differ diff --git a/postgres/data/base/4/2679 b/postgres/data/base/4/2679 new file mode 100755 index 0000000..67c09dd Binary files /dev/null and b/postgres/data/base/4/2679 differ diff --git a/postgres/data/base/4/2680 b/postgres/data/base/4/2680 new file mode 100755 index 0000000..e8a9ce2 Binary files /dev/null and b/postgres/data/base/4/2680 differ diff --git a/postgres/data/base/4/2681 b/postgres/data/base/4/2681 new file mode 100755 index 0000000..0a64099 Binary files /dev/null and b/postgres/data/base/4/2681 differ diff --git a/postgres/data/base/4/2682 b/postgres/data/base/4/2682 new file mode 100755 index 0000000..b758a97 Binary files /dev/null and b/postgres/data/base/4/2682 differ diff --git a/postgres/data/base/4/2683 b/postgres/data/base/4/2683 new file mode 100755 index 0000000..b1e1410 Binary files /dev/null and b/postgres/data/base/4/2683 differ diff --git a/postgres/data/base/4/2684 b/postgres/data/base/4/2684 new file mode 100755 index 0000000..d1a4d71 Binary files /dev/null and b/postgres/data/base/4/2684 differ diff --git a/postgres/data/base/4/2685 b/postgres/data/base/4/2685 new file mode 100755 index 0000000..f9f0e52 Binary files /dev/null and b/postgres/data/base/4/2685 differ diff --git a/postgres/data/base/4/2686 b/postgres/data/base/4/2686 new file mode 100755 index 0000000..afdb6ec Binary files /dev/null and b/postgres/data/base/4/2686 differ diff --git a/postgres/data/base/4/2687 b/postgres/data/base/4/2687 new file mode 100755 index 0000000..6c5d318 Binary files /dev/null and b/postgres/data/base/4/2687 differ diff --git a/postgres/data/base/4/2688 b/postgres/data/base/4/2688 new file mode 100755 index 0000000..cbd8118 Binary files /dev/null and b/postgres/data/base/4/2688 differ diff --git a/postgres/data/base/4/2689 b/postgres/data/base/4/2689 new file mode 100755 index 0000000..785afe1 Binary files /dev/null and b/postgres/data/base/4/2689 differ diff --git a/postgres/data/base/4/2690 b/postgres/data/base/4/2690 new file mode 100755 index 0000000..a570b25 Binary files /dev/null and b/postgres/data/base/4/2690 differ diff --git a/postgres/data/base/4/2691 b/postgres/data/base/4/2691 new file mode 100755 index 0000000..260039e Binary files /dev/null and b/postgres/data/base/4/2691 differ diff --git a/postgres/data/base/4/2692 b/postgres/data/base/4/2692 new file mode 100755 index 0000000..375c9df Binary files /dev/null and b/postgres/data/base/4/2692 differ diff --git a/postgres/data/base/4/2693 b/postgres/data/base/4/2693 new file mode 100755 index 0000000..2c89d92 Binary files /dev/null and b/postgres/data/base/4/2693 differ diff --git a/postgres/data/base/4/2696 b/postgres/data/base/4/2696 new file mode 100755 index 0000000..27197d9 Binary files /dev/null and b/postgres/data/base/4/2696 differ diff --git a/postgres/data/base/4/2699 b/postgres/data/base/4/2699 new file mode 100755 index 0000000..250c5ff Binary files /dev/null and b/postgres/data/base/4/2699 differ diff --git a/postgres/data/base/4/2701 b/postgres/data/base/4/2701 new file mode 100755 index 0000000..e47c5c0 Binary files /dev/null and b/postgres/data/base/4/2701 differ diff --git a/postgres/data/base/4/2702 b/postgres/data/base/4/2702 new file mode 100755 index 0000000..bd5ceed Binary files /dev/null and b/postgres/data/base/4/2702 differ diff --git a/postgres/data/base/4/2703 b/postgres/data/base/4/2703 new file mode 100755 index 0000000..cb5f63e Binary files /dev/null and b/postgres/data/base/4/2703 differ diff --git a/postgres/data/base/4/2704 b/postgres/data/base/4/2704 new file mode 100755 index 0000000..03220f7 Binary files /dev/null and b/postgres/data/base/4/2704 differ diff --git a/postgres/data/base/4/2753 b/postgres/data/base/4/2753 new file mode 100755 index 0000000..3c16dff Binary files /dev/null and b/postgres/data/base/4/2753 differ diff --git a/postgres/data/base/4/2753_fsm b/postgres/data/base/4/2753_fsm new file mode 100755 index 0000000..642bce3 Binary files /dev/null and b/postgres/data/base/4/2753_fsm differ diff --git a/postgres/data/base/4/2753_vm b/postgres/data/base/4/2753_vm new file mode 100755 index 0000000..4d40b45 Binary files /dev/null and b/postgres/data/base/4/2753_vm differ diff --git a/postgres/data/base/4/2754 b/postgres/data/base/4/2754 new file mode 100755 index 0000000..dff15d8 Binary files /dev/null and b/postgres/data/base/4/2754 differ diff --git a/postgres/data/base/4/2755 b/postgres/data/base/4/2755 new file mode 100755 index 0000000..4b09f63 Binary files /dev/null and b/postgres/data/base/4/2755 differ diff --git a/postgres/data/base/4/2756 b/postgres/data/base/4/2756 new file mode 100755 index 0000000..8d0e774 Binary files /dev/null and b/postgres/data/base/4/2756 differ diff --git a/postgres/data/base/4/2757 b/postgres/data/base/4/2757 new file mode 100755 index 0000000..3df6dd2 Binary files /dev/null and b/postgres/data/base/4/2757 differ diff --git a/postgres/data/base/4/2830 b/postgres/data/base/4/2830 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/2831 b/postgres/data/base/4/2831 new file mode 100755 index 0000000..260051f Binary files /dev/null and b/postgres/data/base/4/2831 differ diff --git a/postgres/data/base/4/2832 b/postgres/data/base/4/2832 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/2833 b/postgres/data/base/4/2833 new file mode 100755 index 0000000..d178cca Binary files /dev/null and b/postgres/data/base/4/2833 differ diff --git a/postgres/data/base/4/2834 b/postgres/data/base/4/2834 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/2835 b/postgres/data/base/4/2835 new file mode 100755 index 0000000..db2ba3a Binary files /dev/null and b/postgres/data/base/4/2835 differ diff --git a/postgres/data/base/4/2836 b/postgres/data/base/4/2836 new file mode 100755 index 0000000..cdd2d05 Binary files /dev/null and b/postgres/data/base/4/2836 differ diff --git a/postgres/data/base/4/2836_fsm b/postgres/data/base/4/2836_fsm new file mode 100755 index 0000000..ed42b8e Binary files /dev/null and b/postgres/data/base/4/2836_fsm differ diff --git a/postgres/data/base/4/2836_vm b/postgres/data/base/4/2836_vm new file mode 100755 index 0000000..99187e0 Binary files /dev/null and b/postgres/data/base/4/2836_vm differ diff --git a/postgres/data/base/4/2837 b/postgres/data/base/4/2837 new file mode 100755 index 0000000..cb88bcb Binary files /dev/null and b/postgres/data/base/4/2837 differ diff --git a/postgres/data/base/4/2838 b/postgres/data/base/4/2838 new file mode 100755 index 0000000..c8b4486 Binary files /dev/null and b/postgres/data/base/4/2838 differ diff --git a/postgres/data/base/4/2838_fsm b/postgres/data/base/4/2838_fsm new file mode 100755 index 0000000..2916af2 Binary files /dev/null and b/postgres/data/base/4/2838_fsm differ diff --git a/postgres/data/base/4/2838_vm b/postgres/data/base/4/2838_vm new file mode 100755 index 0000000..16cff1a Binary files /dev/null and b/postgres/data/base/4/2838_vm differ diff --git a/postgres/data/base/4/2839 b/postgres/data/base/4/2839 new file mode 100755 index 0000000..7e75c82 Binary files /dev/null and b/postgres/data/base/4/2839 differ diff --git a/postgres/data/base/4/2840 b/postgres/data/base/4/2840 new file mode 100755 index 0000000..0102c6e Binary files /dev/null and b/postgres/data/base/4/2840 differ diff --git a/postgres/data/base/4/2840_fsm b/postgres/data/base/4/2840_fsm new file mode 100755 index 0000000..a6e901e Binary files /dev/null and b/postgres/data/base/4/2840_fsm differ diff --git a/postgres/data/base/4/2840_vm b/postgres/data/base/4/2840_vm new file mode 100755 index 0000000..cc4faff Binary files /dev/null and b/postgres/data/base/4/2840_vm differ diff --git a/postgres/data/base/4/2841 b/postgres/data/base/4/2841 new file mode 100755 index 0000000..05bccbb Binary files /dev/null and b/postgres/data/base/4/2841 differ diff --git a/postgres/data/base/4/2995 b/postgres/data/base/4/2995 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/2996 b/postgres/data/base/4/2996 new file mode 100755 index 0000000..7bcbf8f Binary files /dev/null and b/postgres/data/base/4/2996 differ diff --git a/postgres/data/base/4/3079 b/postgres/data/base/4/3079 new file mode 100755 index 0000000..36eda3e Binary files /dev/null and b/postgres/data/base/4/3079 differ diff --git a/postgres/data/base/4/3079_fsm b/postgres/data/base/4/3079_fsm new file mode 100755 index 0000000..7732d22 Binary files /dev/null and b/postgres/data/base/4/3079_fsm differ diff --git a/postgres/data/base/4/3079_vm b/postgres/data/base/4/3079_vm new file mode 100755 index 0000000..6f69ead Binary files /dev/null and b/postgres/data/base/4/3079_vm differ diff --git a/postgres/data/base/4/3080 b/postgres/data/base/4/3080 new file mode 100755 index 0000000..ee41e6b Binary files /dev/null and b/postgres/data/base/4/3080 differ diff --git a/postgres/data/base/4/3081 b/postgres/data/base/4/3081 new file mode 100755 index 0000000..8a32370 Binary files /dev/null and b/postgres/data/base/4/3081 differ diff --git a/postgres/data/base/4/3085 b/postgres/data/base/4/3085 new file mode 100755 index 0000000..e75db0c Binary files /dev/null and b/postgres/data/base/4/3085 differ diff --git a/postgres/data/base/4/3118 b/postgres/data/base/4/3118 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/3119 b/postgres/data/base/4/3119 new file mode 100755 index 0000000..059d8b6 Binary files /dev/null and b/postgres/data/base/4/3119 differ diff --git a/postgres/data/base/4/3164 b/postgres/data/base/4/3164 new file mode 100755 index 0000000..4392a6c Binary files /dev/null and b/postgres/data/base/4/3164 differ diff --git a/postgres/data/base/4/3256 b/postgres/data/base/4/3256 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/3257 b/postgres/data/base/4/3257 new file mode 100755 index 0000000..fbf5bbe Binary files /dev/null and b/postgres/data/base/4/3257 differ diff --git a/postgres/data/base/4/3258 b/postgres/data/base/4/3258 new file mode 100755 index 0000000..e6ea9ce Binary files /dev/null and b/postgres/data/base/4/3258 differ diff --git a/postgres/data/base/4/3350 b/postgres/data/base/4/3350 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/3351 b/postgres/data/base/4/3351 new file mode 100755 index 0000000..afd5efa Binary files /dev/null and b/postgres/data/base/4/3351 differ diff --git a/postgres/data/base/4/3379 b/postgres/data/base/4/3379 new file mode 100755 index 0000000..faaee39 Binary files /dev/null and b/postgres/data/base/4/3379 differ diff --git a/postgres/data/base/4/3380 b/postgres/data/base/4/3380 new file mode 100755 index 0000000..01e9984 Binary files /dev/null and b/postgres/data/base/4/3380 differ diff --git a/postgres/data/base/4/3381 b/postgres/data/base/4/3381 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/3394 b/postgres/data/base/4/3394 new file mode 100755 index 0000000..8429b20 Binary files /dev/null and b/postgres/data/base/4/3394 differ diff --git a/postgres/data/base/4/3394_fsm b/postgres/data/base/4/3394_fsm new file mode 100755 index 0000000..ffa8644 Binary files /dev/null and b/postgres/data/base/4/3394_fsm differ diff --git a/postgres/data/base/4/3394_vm b/postgres/data/base/4/3394_vm new file mode 100755 index 0000000..b30d0e5 Binary files /dev/null and b/postgres/data/base/4/3394_vm differ diff --git a/postgres/data/base/4/3395 b/postgres/data/base/4/3395 new file mode 100755 index 0000000..79b711c Binary files /dev/null and b/postgres/data/base/4/3395 differ diff --git a/postgres/data/base/4/3429 b/postgres/data/base/4/3429 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/3430 b/postgres/data/base/4/3430 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/3431 b/postgres/data/base/4/3431 new file mode 100755 index 0000000..13c10cb Binary files /dev/null and b/postgres/data/base/4/3431 differ diff --git a/postgres/data/base/4/3433 b/postgres/data/base/4/3433 new file mode 100755 index 0000000..ffe926f Binary files /dev/null and b/postgres/data/base/4/3433 differ diff --git a/postgres/data/base/4/3439 b/postgres/data/base/4/3439 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/3440 b/postgres/data/base/4/3440 new file mode 100755 index 0000000..cfae4df Binary files /dev/null and b/postgres/data/base/4/3440 differ diff --git a/postgres/data/base/4/3455 b/postgres/data/base/4/3455 new file mode 100755 index 0000000..b58ddf0 Binary files /dev/null and b/postgres/data/base/4/3455 differ diff --git a/postgres/data/base/4/3456 b/postgres/data/base/4/3456 new file mode 100755 index 0000000..caa5712 Binary files /dev/null and b/postgres/data/base/4/3456 differ diff --git a/postgres/data/base/4/3456_fsm b/postgres/data/base/4/3456_fsm new file mode 100755 index 0000000..3cb165f Binary files /dev/null and b/postgres/data/base/4/3456_fsm differ diff --git a/postgres/data/base/4/3456_vm b/postgres/data/base/4/3456_vm new file mode 100755 index 0000000..405e3b7 Binary files /dev/null and b/postgres/data/base/4/3456_vm differ diff --git a/postgres/data/base/4/3466 b/postgres/data/base/4/3466 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/3467 b/postgres/data/base/4/3467 new file mode 100755 index 0000000..6344b94 Binary files /dev/null and b/postgres/data/base/4/3467 differ diff --git a/postgres/data/base/4/3468 b/postgres/data/base/4/3468 new file mode 100755 index 0000000..6a2b6b1 Binary files /dev/null and b/postgres/data/base/4/3468 differ diff --git a/postgres/data/base/4/3501 b/postgres/data/base/4/3501 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/3502 b/postgres/data/base/4/3502 new file mode 100755 index 0000000..eb0b32a Binary files /dev/null and b/postgres/data/base/4/3502 differ diff --git a/postgres/data/base/4/3503 b/postgres/data/base/4/3503 new file mode 100755 index 0000000..32a3055 Binary files /dev/null and b/postgres/data/base/4/3503 differ diff --git a/postgres/data/base/4/3534 b/postgres/data/base/4/3534 new file mode 100755 index 0000000..7676fd8 Binary files /dev/null and b/postgres/data/base/4/3534 differ diff --git a/postgres/data/base/4/3541 b/postgres/data/base/4/3541 new file mode 100755 index 0000000..40869ad Binary files /dev/null and b/postgres/data/base/4/3541 differ diff --git a/postgres/data/base/4/3541_fsm b/postgres/data/base/4/3541_fsm new file mode 100755 index 0000000..a3a2de4 Binary files /dev/null and b/postgres/data/base/4/3541_fsm differ diff --git a/postgres/data/base/4/3541_vm b/postgres/data/base/4/3541_vm new file mode 100755 index 0000000..8bc4d54 Binary files /dev/null and b/postgres/data/base/4/3541_vm differ diff --git a/postgres/data/base/4/3542 b/postgres/data/base/4/3542 new file mode 100755 index 0000000..bb83580 Binary files /dev/null and b/postgres/data/base/4/3542 differ diff --git a/postgres/data/base/4/3574 b/postgres/data/base/4/3574 new file mode 100755 index 0000000..b026df1 Binary files /dev/null and b/postgres/data/base/4/3574 differ diff --git a/postgres/data/base/4/3575 b/postgres/data/base/4/3575 new file mode 100755 index 0000000..bdec532 Binary files /dev/null and b/postgres/data/base/4/3575 differ diff --git a/postgres/data/base/4/3576 b/postgres/data/base/4/3576 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/3596 b/postgres/data/base/4/3596 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/3597 b/postgres/data/base/4/3597 new file mode 100755 index 0000000..8963738 Binary files /dev/null and b/postgres/data/base/4/3597 differ diff --git a/postgres/data/base/4/3598 b/postgres/data/base/4/3598 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/3599 b/postgres/data/base/4/3599 new file mode 100755 index 0000000..67582c2 Binary files /dev/null and b/postgres/data/base/4/3599 differ diff --git a/postgres/data/base/4/3600 b/postgres/data/base/4/3600 new file mode 100755 index 0000000..ecb95aa Binary files /dev/null and b/postgres/data/base/4/3600 differ diff --git a/postgres/data/base/4/3600_fsm b/postgres/data/base/4/3600_fsm new file mode 100755 index 0000000..cebec19 Binary files /dev/null and b/postgres/data/base/4/3600_fsm differ diff --git a/postgres/data/base/4/3600_vm b/postgres/data/base/4/3600_vm new file mode 100755 index 0000000..2a81cd7 Binary files /dev/null and b/postgres/data/base/4/3600_vm differ diff --git a/postgres/data/base/4/3601 b/postgres/data/base/4/3601 new file mode 100755 index 0000000..04c846e Binary files /dev/null and b/postgres/data/base/4/3601 differ diff --git a/postgres/data/base/4/3601_fsm b/postgres/data/base/4/3601_fsm new file mode 100755 index 0000000..7732d22 Binary files /dev/null and b/postgres/data/base/4/3601_fsm differ diff --git a/postgres/data/base/4/3601_vm b/postgres/data/base/4/3601_vm new file mode 100755 index 0000000..fa97895 Binary files /dev/null and b/postgres/data/base/4/3601_vm differ diff --git a/postgres/data/base/4/3602 b/postgres/data/base/4/3602 new file mode 100755 index 0000000..72fa641 Binary files /dev/null and b/postgres/data/base/4/3602 differ diff --git a/postgres/data/base/4/3602_fsm b/postgres/data/base/4/3602_fsm new file mode 100755 index 0000000..d7897de Binary files /dev/null and b/postgres/data/base/4/3602_fsm differ diff --git a/postgres/data/base/4/3602_vm b/postgres/data/base/4/3602_vm new file mode 100755 index 0000000..86d1c5b Binary files /dev/null and b/postgres/data/base/4/3602_vm differ diff --git a/postgres/data/base/4/3603 b/postgres/data/base/4/3603 new file mode 100755 index 0000000..3e8d72a Binary files /dev/null and b/postgres/data/base/4/3603 differ diff --git a/postgres/data/base/4/3603_fsm b/postgres/data/base/4/3603_fsm new file mode 100755 index 0000000..c28dd4f Binary files /dev/null and b/postgres/data/base/4/3603_fsm differ diff --git a/postgres/data/base/4/3603_vm b/postgres/data/base/4/3603_vm new file mode 100755 index 0000000..80a425d Binary files /dev/null and b/postgres/data/base/4/3603_vm differ diff --git a/postgres/data/base/4/3604 b/postgres/data/base/4/3604 new file mode 100755 index 0000000..6f5a0aa Binary files /dev/null and b/postgres/data/base/4/3604 differ diff --git a/postgres/data/base/4/3605 b/postgres/data/base/4/3605 new file mode 100755 index 0000000..0f77325 Binary files /dev/null and b/postgres/data/base/4/3605 differ diff --git a/postgres/data/base/4/3606 b/postgres/data/base/4/3606 new file mode 100755 index 0000000..698e6d0 Binary files /dev/null and b/postgres/data/base/4/3606 differ diff --git a/postgres/data/base/4/3607 b/postgres/data/base/4/3607 new file mode 100755 index 0000000..1d023e0 Binary files /dev/null and b/postgres/data/base/4/3607 differ diff --git a/postgres/data/base/4/3608 b/postgres/data/base/4/3608 new file mode 100755 index 0000000..b52499e Binary files /dev/null and b/postgres/data/base/4/3608 differ diff --git a/postgres/data/base/4/3609 b/postgres/data/base/4/3609 new file mode 100755 index 0000000..e8a1432 Binary files /dev/null and b/postgres/data/base/4/3609 differ diff --git a/postgres/data/base/4/3712 b/postgres/data/base/4/3712 new file mode 100755 index 0000000..2c8258b Binary files /dev/null and b/postgres/data/base/4/3712 differ diff --git a/postgres/data/base/4/3764 b/postgres/data/base/4/3764 new file mode 100755 index 0000000..8364b26 Binary files /dev/null and b/postgres/data/base/4/3764 differ diff --git a/postgres/data/base/4/3764_fsm b/postgres/data/base/4/3764_fsm new file mode 100755 index 0000000..f64db4d Binary files /dev/null and b/postgres/data/base/4/3764_fsm differ diff --git a/postgres/data/base/4/3764_vm b/postgres/data/base/4/3764_vm new file mode 100755 index 0000000..6bafd97 Binary files /dev/null and b/postgres/data/base/4/3764_vm differ diff --git a/postgres/data/base/4/3766 b/postgres/data/base/4/3766 new file mode 100755 index 0000000..67ec2eb Binary files /dev/null and b/postgres/data/base/4/3766 differ diff --git a/postgres/data/base/4/3767 b/postgres/data/base/4/3767 new file mode 100755 index 0000000..a279a5f Binary files /dev/null and b/postgres/data/base/4/3767 differ diff --git a/postgres/data/base/4/3997 b/postgres/data/base/4/3997 new file mode 100755 index 0000000..46564a3 Binary files /dev/null and b/postgres/data/base/4/3997 differ diff --git a/postgres/data/base/4/4143 b/postgres/data/base/4/4143 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/4144 b/postgres/data/base/4/4144 new file mode 100755 index 0000000..64af764 Binary files /dev/null and b/postgres/data/base/4/4144 differ diff --git a/postgres/data/base/4/4145 b/postgres/data/base/4/4145 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/4146 b/postgres/data/base/4/4146 new file mode 100755 index 0000000..1f029ea Binary files /dev/null and b/postgres/data/base/4/4146 differ diff --git a/postgres/data/base/4/4147 b/postgres/data/base/4/4147 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/4148 b/postgres/data/base/4/4148 new file mode 100755 index 0000000..5959a95 Binary files /dev/null and b/postgres/data/base/4/4148 differ diff --git a/postgres/data/base/4/4149 b/postgres/data/base/4/4149 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/4150 b/postgres/data/base/4/4150 new file mode 100755 index 0000000..5e11d49 Binary files /dev/null and b/postgres/data/base/4/4150 differ diff --git a/postgres/data/base/4/4151 b/postgres/data/base/4/4151 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/4152 b/postgres/data/base/4/4152 new file mode 100755 index 0000000..8acd468 Binary files /dev/null and b/postgres/data/base/4/4152 differ diff --git a/postgres/data/base/4/4153 b/postgres/data/base/4/4153 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/4154 b/postgres/data/base/4/4154 new file mode 100755 index 0000000..e597f61 Binary files /dev/null and b/postgres/data/base/4/4154 differ diff --git a/postgres/data/base/4/4155 b/postgres/data/base/4/4155 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/4156 b/postgres/data/base/4/4156 new file mode 100755 index 0000000..d653113 Binary files /dev/null and b/postgres/data/base/4/4156 differ diff --git a/postgres/data/base/4/4157 b/postgres/data/base/4/4157 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/4158 b/postgres/data/base/4/4158 new file mode 100755 index 0000000..355910c Binary files /dev/null and b/postgres/data/base/4/4158 differ diff --git a/postgres/data/base/4/4159 b/postgres/data/base/4/4159 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/4160 b/postgres/data/base/4/4160 new file mode 100755 index 0000000..7d09bfa Binary files /dev/null and b/postgres/data/base/4/4160 differ diff --git a/postgres/data/base/4/4163 b/postgres/data/base/4/4163 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/4164 b/postgres/data/base/4/4164 new file mode 100755 index 0000000..97adb95 Binary files /dev/null and b/postgres/data/base/4/4164 differ diff --git a/postgres/data/base/4/4165 b/postgres/data/base/4/4165 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/4166 b/postgres/data/base/4/4166 new file mode 100755 index 0000000..c0e3e5b Binary files /dev/null and b/postgres/data/base/4/4166 differ diff --git a/postgres/data/base/4/4167 b/postgres/data/base/4/4167 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/4168 b/postgres/data/base/4/4168 new file mode 100755 index 0000000..ddcb560 Binary files /dev/null and b/postgres/data/base/4/4168 differ diff --git a/postgres/data/base/4/4169 b/postgres/data/base/4/4169 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/4170 b/postgres/data/base/4/4170 new file mode 100755 index 0000000..5812a8e Binary files /dev/null and b/postgres/data/base/4/4170 differ diff --git a/postgres/data/base/4/4171 b/postgres/data/base/4/4171 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/4172 b/postgres/data/base/4/4172 new file mode 100755 index 0000000..84c04d6 Binary files /dev/null and b/postgres/data/base/4/4172 differ diff --git a/postgres/data/base/4/4173 b/postgres/data/base/4/4173 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/4174 b/postgres/data/base/4/4174 new file mode 100755 index 0000000..9b12bec Binary files /dev/null and b/postgres/data/base/4/4174 differ diff --git a/postgres/data/base/4/5002 b/postgres/data/base/4/5002 new file mode 100755 index 0000000..aefa40d Binary files /dev/null and b/postgres/data/base/4/5002 differ diff --git a/postgres/data/base/4/548 b/postgres/data/base/4/548 new file mode 100755 index 0000000..64fdefd Binary files /dev/null and b/postgres/data/base/4/548 differ diff --git a/postgres/data/base/4/549 b/postgres/data/base/4/549 new file mode 100755 index 0000000..3734cc2 Binary files /dev/null and b/postgres/data/base/4/549 differ diff --git a/postgres/data/base/4/6102 b/postgres/data/base/4/6102 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/6104 b/postgres/data/base/4/6104 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/6106 b/postgres/data/base/4/6106 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/6110 b/postgres/data/base/4/6110 new file mode 100755 index 0000000..42e1920 Binary files /dev/null and b/postgres/data/base/4/6110 differ diff --git a/postgres/data/base/4/6111 b/postgres/data/base/4/6111 new file mode 100755 index 0000000..d012727 Binary files /dev/null and b/postgres/data/base/4/6111 differ diff --git a/postgres/data/base/4/6112 b/postgres/data/base/4/6112 new file mode 100755 index 0000000..293367c Binary files /dev/null and b/postgres/data/base/4/6112 differ diff --git a/postgres/data/base/4/6113 b/postgres/data/base/4/6113 new file mode 100755 index 0000000..542f8fa Binary files /dev/null and b/postgres/data/base/4/6113 differ diff --git a/postgres/data/base/4/6116 b/postgres/data/base/4/6116 new file mode 100755 index 0000000..787d5d1 Binary files /dev/null and b/postgres/data/base/4/6116 differ diff --git a/postgres/data/base/4/6117 b/postgres/data/base/4/6117 new file mode 100755 index 0000000..2b5656b Binary files /dev/null and b/postgres/data/base/4/6117 differ diff --git a/postgres/data/base/4/6175 b/postgres/data/base/4/6175 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/6176 b/postgres/data/base/4/6176 new file mode 100755 index 0000000..6e5bcd6 Binary files /dev/null and b/postgres/data/base/4/6176 differ diff --git a/postgres/data/base/4/6228 b/postgres/data/base/4/6228 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/6229 b/postgres/data/base/4/6229 new file mode 100755 index 0000000..fae8f44 Binary files /dev/null and b/postgres/data/base/4/6229 differ diff --git a/postgres/data/base/4/6237 b/postgres/data/base/4/6237 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/6238 b/postgres/data/base/4/6238 new file mode 100755 index 0000000..e7c0e8c Binary files /dev/null and b/postgres/data/base/4/6238 differ diff --git a/postgres/data/base/4/6239 b/postgres/data/base/4/6239 new file mode 100755 index 0000000..6c60b50 Binary files /dev/null and b/postgres/data/base/4/6239 differ diff --git a/postgres/data/base/4/826 b/postgres/data/base/4/826 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/4/827 b/postgres/data/base/4/827 new file mode 100755 index 0000000..f102efd Binary files /dev/null and b/postgres/data/base/4/827 differ diff --git a/postgres/data/base/4/828 b/postgres/data/base/4/828 new file mode 100755 index 0000000..e97c210 Binary files /dev/null and b/postgres/data/base/4/828 differ diff --git a/postgres/data/base/4/PG_VERSION b/postgres/data/base/4/PG_VERSION new file mode 100755 index 0000000..98d9bcb --- /dev/null +++ b/postgres/data/base/4/PG_VERSION @@ -0,0 +1 @@ +17 diff --git a/postgres/data/base/4/pg_filenode.map b/postgres/data/base/4/pg_filenode.map new file mode 100755 index 0000000..4fc801a Binary files /dev/null and b/postgres/data/base/4/pg_filenode.map differ diff --git a/postgres/data/base/5/112 b/postgres/data/base/5/112 new file mode 100755 index 0000000..9531ca8 Binary files /dev/null and b/postgres/data/base/5/112 differ diff --git a/postgres/data/base/5/113 b/postgres/data/base/5/113 new file mode 100755 index 0000000..f92630d Binary files /dev/null and b/postgres/data/base/5/113 differ diff --git a/postgres/data/base/5/1247 b/postgres/data/base/5/1247 new file mode 100755 index 0000000..540213e Binary files /dev/null and b/postgres/data/base/5/1247 differ diff --git a/postgres/data/base/5/1247_fsm b/postgres/data/base/5/1247_fsm new file mode 100755 index 0000000..fd57308 Binary files /dev/null and b/postgres/data/base/5/1247_fsm differ diff --git a/postgres/data/base/5/1247_vm b/postgres/data/base/5/1247_vm new file mode 100755 index 0000000..8ccc3c7 Binary files /dev/null and b/postgres/data/base/5/1247_vm differ diff --git a/postgres/data/base/5/1249 b/postgres/data/base/5/1249 new file mode 100755 index 0000000..9b8eeab Binary files /dev/null and b/postgres/data/base/5/1249 differ diff --git a/postgres/data/base/5/1249_fsm b/postgres/data/base/5/1249_fsm new file mode 100755 index 0000000..e0ed4b0 Binary files /dev/null and b/postgres/data/base/5/1249_fsm differ diff --git a/postgres/data/base/5/1249_vm b/postgres/data/base/5/1249_vm new file mode 100755 index 0000000..affcf7f Binary files /dev/null and b/postgres/data/base/5/1249_vm differ diff --git a/postgres/data/base/5/1255 b/postgres/data/base/5/1255 new file mode 100755 index 0000000..23ff105 Binary files /dev/null and b/postgres/data/base/5/1255 differ diff --git a/postgres/data/base/5/1255_fsm b/postgres/data/base/5/1255_fsm new file mode 100755 index 0000000..062bfc5 Binary files /dev/null and b/postgres/data/base/5/1255_fsm differ diff --git a/postgres/data/base/5/1255_vm b/postgres/data/base/5/1255_vm new file mode 100755 index 0000000..7ac0ecc Binary files /dev/null and b/postgres/data/base/5/1255_vm differ diff --git a/postgres/data/base/5/1259 b/postgres/data/base/5/1259 new file mode 100755 index 0000000..bd484b4 Binary files /dev/null and b/postgres/data/base/5/1259 differ diff --git a/postgres/data/base/5/1259_fsm b/postgres/data/base/5/1259_fsm new file mode 100755 index 0000000..2077a7b Binary files /dev/null and b/postgres/data/base/5/1259_fsm differ diff --git a/postgres/data/base/5/1259_vm b/postgres/data/base/5/1259_vm new file mode 100755 index 0000000..c44f30c Binary files /dev/null and b/postgres/data/base/5/1259_vm differ diff --git a/postgres/data/base/5/13463 b/postgres/data/base/5/13463 new file mode 100755 index 0000000..5ac7a42 Binary files /dev/null and b/postgres/data/base/5/13463 differ diff --git a/postgres/data/base/5/13463_fsm b/postgres/data/base/5/13463_fsm new file mode 100755 index 0000000..45338f1 Binary files /dev/null and b/postgres/data/base/5/13463_fsm differ diff --git a/postgres/data/base/5/13463_vm b/postgres/data/base/5/13463_vm new file mode 100755 index 0000000..dd38365 Binary files /dev/null and b/postgres/data/base/5/13463_vm differ diff --git a/postgres/data/base/5/13466 b/postgres/data/base/5/13466 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/13467 b/postgres/data/base/5/13467 new file mode 100755 index 0000000..f572c60 Binary files /dev/null and b/postgres/data/base/5/13467 differ diff --git a/postgres/data/base/5/13468 b/postgres/data/base/5/13468 new file mode 100755 index 0000000..1c39b02 Binary files /dev/null and b/postgres/data/base/5/13468 differ diff --git a/postgres/data/base/5/13468_fsm b/postgres/data/base/5/13468_fsm new file mode 100755 index 0000000..70d16ce Binary files /dev/null and b/postgres/data/base/5/13468_fsm differ diff --git a/postgres/data/base/5/13468_vm b/postgres/data/base/5/13468_vm new file mode 100755 index 0000000..a990030 Binary files /dev/null and b/postgres/data/base/5/13468_vm differ diff --git a/postgres/data/base/5/13471 b/postgres/data/base/5/13471 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/13472 b/postgres/data/base/5/13472 new file mode 100755 index 0000000..c1b4577 Binary files /dev/null and b/postgres/data/base/5/13472 differ diff --git a/postgres/data/base/5/13473 b/postgres/data/base/5/13473 new file mode 100755 index 0000000..7722593 Binary files /dev/null and b/postgres/data/base/5/13473 differ diff --git a/postgres/data/base/5/13473_fsm b/postgres/data/base/5/13473_fsm new file mode 100755 index 0000000..0673ada Binary files /dev/null and b/postgres/data/base/5/13473_fsm differ diff --git a/postgres/data/base/5/13473_vm b/postgres/data/base/5/13473_vm new file mode 100755 index 0000000..076d693 Binary files /dev/null and b/postgres/data/base/5/13473_vm differ diff --git a/postgres/data/base/5/13476 b/postgres/data/base/5/13476 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/13477 b/postgres/data/base/5/13477 new file mode 100755 index 0000000..a2b6d05 Binary files /dev/null and b/postgres/data/base/5/13477 differ diff --git a/postgres/data/base/5/13478 b/postgres/data/base/5/13478 new file mode 100755 index 0000000..fe52a6c Binary files /dev/null and b/postgres/data/base/5/13478 differ diff --git a/postgres/data/base/5/13478_fsm b/postgres/data/base/5/13478_fsm new file mode 100755 index 0000000..a836ddf Binary files /dev/null and b/postgres/data/base/5/13478_fsm differ diff --git a/postgres/data/base/5/13478_vm b/postgres/data/base/5/13478_vm new file mode 100755 index 0000000..a69a78d Binary files /dev/null and b/postgres/data/base/5/13478_vm differ diff --git a/postgres/data/base/5/13481 b/postgres/data/base/5/13481 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/13482 b/postgres/data/base/5/13482 new file mode 100755 index 0000000..fbe1432 Binary files /dev/null and b/postgres/data/base/5/13482 differ diff --git a/postgres/data/base/5/1417 b/postgres/data/base/5/1417 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/1418 b/postgres/data/base/5/1418 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/174 b/postgres/data/base/5/174 new file mode 100755 index 0000000..4f4d8be Binary files /dev/null and b/postgres/data/base/5/174 differ diff --git a/postgres/data/base/5/175 b/postgres/data/base/5/175 new file mode 100755 index 0000000..98fd8de Binary files /dev/null and b/postgres/data/base/5/175 differ diff --git a/postgres/data/base/5/2187 b/postgres/data/base/5/2187 new file mode 100755 index 0000000..d2cd30b Binary files /dev/null and b/postgres/data/base/5/2187 differ diff --git a/postgres/data/base/5/2224 b/postgres/data/base/5/2224 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/2228 b/postgres/data/base/5/2228 new file mode 100755 index 0000000..bfecf01 Binary files /dev/null and b/postgres/data/base/5/2228 differ diff --git a/postgres/data/base/5/2328 b/postgres/data/base/5/2328 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/2336 b/postgres/data/base/5/2336 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/2337 b/postgres/data/base/5/2337 new file mode 100755 index 0000000..2c0b13d Binary files /dev/null and b/postgres/data/base/5/2337 differ diff --git a/postgres/data/base/5/2579 b/postgres/data/base/5/2579 new file mode 100755 index 0000000..e8e73a2 Binary files /dev/null and b/postgres/data/base/5/2579 differ diff --git a/postgres/data/base/5/2600 b/postgres/data/base/5/2600 new file mode 100755 index 0000000..9dfd1a8 Binary files /dev/null and b/postgres/data/base/5/2600 differ diff --git a/postgres/data/base/5/2600_fsm b/postgres/data/base/5/2600_fsm new file mode 100755 index 0000000..c542a78 Binary files /dev/null and b/postgres/data/base/5/2600_fsm differ diff --git a/postgres/data/base/5/2600_vm b/postgres/data/base/5/2600_vm new file mode 100755 index 0000000..c298c06 Binary files /dev/null and b/postgres/data/base/5/2600_vm differ diff --git a/postgres/data/base/5/2601 b/postgres/data/base/5/2601 new file mode 100755 index 0000000..d8001c8 Binary files /dev/null and b/postgres/data/base/5/2601 differ diff --git a/postgres/data/base/5/2601_fsm b/postgres/data/base/5/2601_fsm new file mode 100755 index 0000000..d388044 Binary files /dev/null and b/postgres/data/base/5/2601_fsm differ diff --git a/postgres/data/base/5/2601_vm b/postgres/data/base/5/2601_vm new file mode 100755 index 0000000..ce3bf93 Binary files /dev/null and b/postgres/data/base/5/2601_vm differ diff --git a/postgres/data/base/5/2602 b/postgres/data/base/5/2602 new file mode 100755 index 0000000..4a27b0a Binary files /dev/null and b/postgres/data/base/5/2602 differ diff --git a/postgres/data/base/5/2602_fsm b/postgres/data/base/5/2602_fsm new file mode 100755 index 0000000..23170d8 Binary files /dev/null and b/postgres/data/base/5/2602_fsm differ diff --git a/postgres/data/base/5/2602_vm b/postgres/data/base/5/2602_vm new file mode 100755 index 0000000..3b5e257 Binary files /dev/null and b/postgres/data/base/5/2602_vm differ diff --git a/postgres/data/base/5/2603 b/postgres/data/base/5/2603 new file mode 100755 index 0000000..d511af5 Binary files /dev/null and b/postgres/data/base/5/2603 differ diff --git a/postgres/data/base/5/2603_fsm b/postgres/data/base/5/2603_fsm new file mode 100755 index 0000000..949bd18 Binary files /dev/null and b/postgres/data/base/5/2603_fsm differ diff --git a/postgres/data/base/5/2603_vm b/postgres/data/base/5/2603_vm new file mode 100755 index 0000000..7df4f59 Binary files /dev/null and b/postgres/data/base/5/2603_vm differ diff --git a/postgres/data/base/5/2604 b/postgres/data/base/5/2604 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/2605 b/postgres/data/base/5/2605 new file mode 100755 index 0000000..eeaa7ea Binary files /dev/null and b/postgres/data/base/5/2605 differ diff --git a/postgres/data/base/5/2605_fsm b/postgres/data/base/5/2605_fsm new file mode 100755 index 0000000..f3b92bf Binary files /dev/null and b/postgres/data/base/5/2605_fsm differ diff --git a/postgres/data/base/5/2605_vm b/postgres/data/base/5/2605_vm new file mode 100755 index 0000000..a95fe7b Binary files /dev/null and b/postgres/data/base/5/2605_vm differ diff --git a/postgres/data/base/5/2606 b/postgres/data/base/5/2606 new file mode 100755 index 0000000..0e4c5a3 Binary files /dev/null and b/postgres/data/base/5/2606 differ diff --git a/postgres/data/base/5/2606_fsm b/postgres/data/base/5/2606_fsm new file mode 100755 index 0000000..267454e Binary files /dev/null and b/postgres/data/base/5/2606_fsm differ diff --git a/postgres/data/base/5/2606_vm b/postgres/data/base/5/2606_vm new file mode 100755 index 0000000..6b0159f Binary files /dev/null and b/postgres/data/base/5/2606_vm differ diff --git a/postgres/data/base/5/2607 b/postgres/data/base/5/2607 new file mode 100755 index 0000000..bfad49a Binary files /dev/null and b/postgres/data/base/5/2607 differ diff --git a/postgres/data/base/5/2607_fsm b/postgres/data/base/5/2607_fsm new file mode 100755 index 0000000..80ac8b1 Binary files /dev/null and b/postgres/data/base/5/2607_fsm differ diff --git a/postgres/data/base/5/2607_vm b/postgres/data/base/5/2607_vm new file mode 100755 index 0000000..7c2c53d Binary files /dev/null and b/postgres/data/base/5/2607_vm differ diff --git a/postgres/data/base/5/2608 b/postgres/data/base/5/2608 new file mode 100755 index 0000000..7f6f529 Binary files /dev/null and b/postgres/data/base/5/2608 differ diff --git a/postgres/data/base/5/2608_fsm b/postgres/data/base/5/2608_fsm new file mode 100755 index 0000000..4b19785 Binary files /dev/null and b/postgres/data/base/5/2608_fsm differ diff --git a/postgres/data/base/5/2608_vm b/postgres/data/base/5/2608_vm new file mode 100755 index 0000000..6e5e572 Binary files /dev/null and b/postgres/data/base/5/2608_vm differ diff --git a/postgres/data/base/5/2609 b/postgres/data/base/5/2609 new file mode 100755 index 0000000..f22fe32 Binary files /dev/null and b/postgres/data/base/5/2609 differ diff --git a/postgres/data/base/5/2609_fsm b/postgres/data/base/5/2609_fsm new file mode 100755 index 0000000..7be5dc7 Binary files /dev/null and b/postgres/data/base/5/2609_fsm differ diff --git a/postgres/data/base/5/2609_vm b/postgres/data/base/5/2609_vm new file mode 100755 index 0000000..40974d4 Binary files /dev/null and b/postgres/data/base/5/2609_vm differ diff --git a/postgres/data/base/5/2610 b/postgres/data/base/5/2610 new file mode 100755 index 0000000..2b6e6ed Binary files /dev/null and b/postgres/data/base/5/2610 differ diff --git a/postgres/data/base/5/2610_fsm b/postgres/data/base/5/2610_fsm new file mode 100755 index 0000000..ecbcb5f Binary files /dev/null and b/postgres/data/base/5/2610_fsm differ diff --git a/postgres/data/base/5/2610_vm b/postgres/data/base/5/2610_vm new file mode 100755 index 0000000..6a8139e Binary files /dev/null and b/postgres/data/base/5/2610_vm differ diff --git a/postgres/data/base/5/2611 b/postgres/data/base/5/2611 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/2612 b/postgres/data/base/5/2612 new file mode 100755 index 0000000..024d951 Binary files /dev/null and b/postgres/data/base/5/2612 differ diff --git a/postgres/data/base/5/2612_fsm b/postgres/data/base/5/2612_fsm new file mode 100755 index 0000000..877976a Binary files /dev/null and b/postgres/data/base/5/2612_fsm differ diff --git a/postgres/data/base/5/2612_vm b/postgres/data/base/5/2612_vm new file mode 100755 index 0000000..66d693c Binary files /dev/null and b/postgres/data/base/5/2612_vm differ diff --git a/postgres/data/base/5/2613 b/postgres/data/base/5/2613 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/2615 b/postgres/data/base/5/2615 new file mode 100755 index 0000000..add2690 Binary files /dev/null and b/postgres/data/base/5/2615 differ diff --git a/postgres/data/base/5/2615_fsm b/postgres/data/base/5/2615_fsm new file mode 100755 index 0000000..d041693 Binary files /dev/null and b/postgres/data/base/5/2615_fsm differ diff --git a/postgres/data/base/5/2615_vm b/postgres/data/base/5/2615_vm new file mode 100755 index 0000000..5ca7f9c Binary files /dev/null and b/postgres/data/base/5/2615_vm differ diff --git a/postgres/data/base/5/2616 b/postgres/data/base/5/2616 new file mode 100755 index 0000000..0d60d79 Binary files /dev/null and b/postgres/data/base/5/2616 differ diff --git a/postgres/data/base/5/2616_fsm b/postgres/data/base/5/2616_fsm new file mode 100755 index 0000000..cb924c9 Binary files /dev/null and b/postgres/data/base/5/2616_fsm differ diff --git a/postgres/data/base/5/2616_vm b/postgres/data/base/5/2616_vm new file mode 100755 index 0000000..67dd5a6 Binary files /dev/null and b/postgres/data/base/5/2616_vm differ diff --git a/postgres/data/base/5/2617 b/postgres/data/base/5/2617 new file mode 100755 index 0000000..bcdfc18 Binary files /dev/null and b/postgres/data/base/5/2617 differ diff --git a/postgres/data/base/5/2617_fsm b/postgres/data/base/5/2617_fsm new file mode 100755 index 0000000..29d6066 Binary files /dev/null and b/postgres/data/base/5/2617_fsm differ diff --git a/postgres/data/base/5/2617_vm b/postgres/data/base/5/2617_vm new file mode 100755 index 0000000..5b871b4 Binary files /dev/null and b/postgres/data/base/5/2617_vm differ diff --git a/postgres/data/base/5/2618 b/postgres/data/base/5/2618 new file mode 100755 index 0000000..a413ce8 Binary files /dev/null and b/postgres/data/base/5/2618 differ diff --git a/postgres/data/base/5/2618_fsm b/postgres/data/base/5/2618_fsm new file mode 100755 index 0000000..6cf107f Binary files /dev/null and b/postgres/data/base/5/2618_fsm differ diff --git a/postgres/data/base/5/2618_vm b/postgres/data/base/5/2618_vm new file mode 100755 index 0000000..598a6a2 Binary files /dev/null and b/postgres/data/base/5/2618_vm differ diff --git a/postgres/data/base/5/2619 b/postgres/data/base/5/2619 new file mode 100755 index 0000000..c216b8c Binary files /dev/null and b/postgres/data/base/5/2619 differ diff --git a/postgres/data/base/5/2619_fsm b/postgres/data/base/5/2619_fsm new file mode 100755 index 0000000..7183aea Binary files /dev/null and b/postgres/data/base/5/2619_fsm differ diff --git a/postgres/data/base/5/2619_vm b/postgres/data/base/5/2619_vm new file mode 100755 index 0000000..60968ec Binary files /dev/null and b/postgres/data/base/5/2619_vm differ diff --git a/postgres/data/base/5/2620 b/postgres/data/base/5/2620 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/2650 b/postgres/data/base/5/2650 new file mode 100755 index 0000000..042d761 Binary files /dev/null and b/postgres/data/base/5/2650 differ diff --git a/postgres/data/base/5/2651 b/postgres/data/base/5/2651 new file mode 100755 index 0000000..35590f4 Binary files /dev/null and b/postgres/data/base/5/2651 differ diff --git a/postgres/data/base/5/2652 b/postgres/data/base/5/2652 new file mode 100755 index 0000000..adf7b05 Binary files /dev/null and b/postgres/data/base/5/2652 differ diff --git a/postgres/data/base/5/2653 b/postgres/data/base/5/2653 new file mode 100755 index 0000000..7ef9b49 Binary files /dev/null and b/postgres/data/base/5/2653 differ diff --git a/postgres/data/base/5/2654 b/postgres/data/base/5/2654 new file mode 100755 index 0000000..e4e182f Binary files /dev/null and b/postgres/data/base/5/2654 differ diff --git a/postgres/data/base/5/2655 b/postgres/data/base/5/2655 new file mode 100755 index 0000000..0a0d565 Binary files /dev/null and b/postgres/data/base/5/2655 differ diff --git a/postgres/data/base/5/2656 b/postgres/data/base/5/2656 new file mode 100755 index 0000000..8507f4c Binary files /dev/null and b/postgres/data/base/5/2656 differ diff --git a/postgres/data/base/5/2657 b/postgres/data/base/5/2657 new file mode 100755 index 0000000..f62a61d Binary files /dev/null and b/postgres/data/base/5/2657 differ diff --git a/postgres/data/base/5/2658 b/postgres/data/base/5/2658 new file mode 100755 index 0000000..04c0fab Binary files /dev/null and b/postgres/data/base/5/2658 differ diff --git a/postgres/data/base/5/2659 b/postgres/data/base/5/2659 new file mode 100755 index 0000000..7a038de Binary files /dev/null and b/postgres/data/base/5/2659 differ diff --git a/postgres/data/base/5/2660 b/postgres/data/base/5/2660 new file mode 100755 index 0000000..8a83211 Binary files /dev/null and b/postgres/data/base/5/2660 differ diff --git a/postgres/data/base/5/2661 b/postgres/data/base/5/2661 new file mode 100755 index 0000000..17613f7 Binary files /dev/null and b/postgres/data/base/5/2661 differ diff --git a/postgres/data/base/5/2662 b/postgres/data/base/5/2662 new file mode 100755 index 0000000..06ddd60 Binary files /dev/null and b/postgres/data/base/5/2662 differ diff --git a/postgres/data/base/5/2663 b/postgres/data/base/5/2663 new file mode 100755 index 0000000..8c7204d Binary files /dev/null and b/postgres/data/base/5/2663 differ diff --git a/postgres/data/base/5/2664 b/postgres/data/base/5/2664 new file mode 100755 index 0000000..1a7c9a4 Binary files /dev/null and b/postgres/data/base/5/2664 differ diff --git a/postgres/data/base/5/2665 b/postgres/data/base/5/2665 new file mode 100755 index 0000000..a636b34 Binary files /dev/null and b/postgres/data/base/5/2665 differ diff --git a/postgres/data/base/5/2666 b/postgres/data/base/5/2666 new file mode 100755 index 0000000..35015fc Binary files /dev/null and b/postgres/data/base/5/2666 differ diff --git a/postgres/data/base/5/2667 b/postgres/data/base/5/2667 new file mode 100755 index 0000000..0e8a194 Binary files /dev/null and b/postgres/data/base/5/2667 differ diff --git a/postgres/data/base/5/2668 b/postgres/data/base/5/2668 new file mode 100755 index 0000000..5fd6734 Binary files /dev/null and b/postgres/data/base/5/2668 differ diff --git a/postgres/data/base/5/2669 b/postgres/data/base/5/2669 new file mode 100755 index 0000000..659c1e8 Binary files /dev/null and b/postgres/data/base/5/2669 differ diff --git a/postgres/data/base/5/2670 b/postgres/data/base/5/2670 new file mode 100755 index 0000000..affe09d Binary files /dev/null and b/postgres/data/base/5/2670 differ diff --git a/postgres/data/base/5/2673 b/postgres/data/base/5/2673 new file mode 100755 index 0000000..e8d4f2f Binary files /dev/null and b/postgres/data/base/5/2673 differ diff --git a/postgres/data/base/5/2674 b/postgres/data/base/5/2674 new file mode 100755 index 0000000..42f14c1 Binary files /dev/null and b/postgres/data/base/5/2674 differ diff --git a/postgres/data/base/5/2675 b/postgres/data/base/5/2675 new file mode 100755 index 0000000..632859e Binary files /dev/null and b/postgres/data/base/5/2675 differ diff --git a/postgres/data/base/5/2678 b/postgres/data/base/5/2678 new file mode 100755 index 0000000..dd6c349 Binary files /dev/null and b/postgres/data/base/5/2678 differ diff --git a/postgres/data/base/5/2679 b/postgres/data/base/5/2679 new file mode 100755 index 0000000..67c09dd Binary files /dev/null and b/postgres/data/base/5/2679 differ diff --git a/postgres/data/base/5/2680 b/postgres/data/base/5/2680 new file mode 100755 index 0000000..e8a9ce2 Binary files /dev/null and b/postgres/data/base/5/2680 differ diff --git a/postgres/data/base/5/2681 b/postgres/data/base/5/2681 new file mode 100755 index 0000000..0a64099 Binary files /dev/null and b/postgres/data/base/5/2681 differ diff --git a/postgres/data/base/5/2682 b/postgres/data/base/5/2682 new file mode 100755 index 0000000..b758a97 Binary files /dev/null and b/postgres/data/base/5/2682 differ diff --git a/postgres/data/base/5/2683 b/postgres/data/base/5/2683 new file mode 100755 index 0000000..b1e1410 Binary files /dev/null and b/postgres/data/base/5/2683 differ diff --git a/postgres/data/base/5/2684 b/postgres/data/base/5/2684 new file mode 100755 index 0000000..d1a4d71 Binary files /dev/null and b/postgres/data/base/5/2684 differ diff --git a/postgres/data/base/5/2685 b/postgres/data/base/5/2685 new file mode 100755 index 0000000..f9f0e52 Binary files /dev/null and b/postgres/data/base/5/2685 differ diff --git a/postgres/data/base/5/2686 b/postgres/data/base/5/2686 new file mode 100755 index 0000000..afdb6ec Binary files /dev/null and b/postgres/data/base/5/2686 differ diff --git a/postgres/data/base/5/2687 b/postgres/data/base/5/2687 new file mode 100755 index 0000000..6c5d318 Binary files /dev/null and b/postgres/data/base/5/2687 differ diff --git a/postgres/data/base/5/2688 b/postgres/data/base/5/2688 new file mode 100755 index 0000000..cbd8118 Binary files /dev/null and b/postgres/data/base/5/2688 differ diff --git a/postgres/data/base/5/2689 b/postgres/data/base/5/2689 new file mode 100755 index 0000000..785afe1 Binary files /dev/null and b/postgres/data/base/5/2689 differ diff --git a/postgres/data/base/5/2690 b/postgres/data/base/5/2690 new file mode 100755 index 0000000..a570b25 Binary files /dev/null and b/postgres/data/base/5/2690 differ diff --git a/postgres/data/base/5/2691 b/postgres/data/base/5/2691 new file mode 100755 index 0000000..260039e Binary files /dev/null and b/postgres/data/base/5/2691 differ diff --git a/postgres/data/base/5/2692 b/postgres/data/base/5/2692 new file mode 100755 index 0000000..375c9df Binary files /dev/null and b/postgres/data/base/5/2692 differ diff --git a/postgres/data/base/5/2693 b/postgres/data/base/5/2693 new file mode 100755 index 0000000..2c89d92 Binary files /dev/null and b/postgres/data/base/5/2693 differ diff --git a/postgres/data/base/5/2696 b/postgres/data/base/5/2696 new file mode 100755 index 0000000..1f1aade Binary files /dev/null and b/postgres/data/base/5/2696 differ diff --git a/postgres/data/base/5/2699 b/postgres/data/base/5/2699 new file mode 100755 index 0000000..250c5ff Binary files /dev/null and b/postgres/data/base/5/2699 differ diff --git a/postgres/data/base/5/2701 b/postgres/data/base/5/2701 new file mode 100755 index 0000000..e47c5c0 Binary files /dev/null and b/postgres/data/base/5/2701 differ diff --git a/postgres/data/base/5/2702 b/postgres/data/base/5/2702 new file mode 100755 index 0000000..bd5ceed Binary files /dev/null and b/postgres/data/base/5/2702 differ diff --git a/postgres/data/base/5/2703 b/postgres/data/base/5/2703 new file mode 100755 index 0000000..cb5f63e Binary files /dev/null and b/postgres/data/base/5/2703 differ diff --git a/postgres/data/base/5/2704 b/postgres/data/base/5/2704 new file mode 100755 index 0000000..03220f7 Binary files /dev/null and b/postgres/data/base/5/2704 differ diff --git a/postgres/data/base/5/2753 b/postgres/data/base/5/2753 new file mode 100755 index 0000000..3c16dff Binary files /dev/null and b/postgres/data/base/5/2753 differ diff --git a/postgres/data/base/5/2753_fsm b/postgres/data/base/5/2753_fsm new file mode 100755 index 0000000..642bce3 Binary files /dev/null and b/postgres/data/base/5/2753_fsm differ diff --git a/postgres/data/base/5/2753_vm b/postgres/data/base/5/2753_vm new file mode 100755 index 0000000..4d40b45 Binary files /dev/null and b/postgres/data/base/5/2753_vm differ diff --git a/postgres/data/base/5/2754 b/postgres/data/base/5/2754 new file mode 100755 index 0000000..dff15d8 Binary files /dev/null and b/postgres/data/base/5/2754 differ diff --git a/postgres/data/base/5/2755 b/postgres/data/base/5/2755 new file mode 100755 index 0000000..4b09f63 Binary files /dev/null and b/postgres/data/base/5/2755 differ diff --git a/postgres/data/base/5/2756 b/postgres/data/base/5/2756 new file mode 100755 index 0000000..8d0e774 Binary files /dev/null and b/postgres/data/base/5/2756 differ diff --git a/postgres/data/base/5/2757 b/postgres/data/base/5/2757 new file mode 100755 index 0000000..3df6dd2 Binary files /dev/null and b/postgres/data/base/5/2757 differ diff --git a/postgres/data/base/5/2830 b/postgres/data/base/5/2830 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/2831 b/postgres/data/base/5/2831 new file mode 100755 index 0000000..260051f Binary files /dev/null and b/postgres/data/base/5/2831 differ diff --git a/postgres/data/base/5/2832 b/postgres/data/base/5/2832 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/2833 b/postgres/data/base/5/2833 new file mode 100755 index 0000000..d178cca Binary files /dev/null and b/postgres/data/base/5/2833 differ diff --git a/postgres/data/base/5/2834 b/postgres/data/base/5/2834 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/2835 b/postgres/data/base/5/2835 new file mode 100755 index 0000000..db2ba3a Binary files /dev/null and b/postgres/data/base/5/2835 differ diff --git a/postgres/data/base/5/2836 b/postgres/data/base/5/2836 new file mode 100755 index 0000000..cdd2d05 Binary files /dev/null and b/postgres/data/base/5/2836 differ diff --git a/postgres/data/base/5/2836_fsm b/postgres/data/base/5/2836_fsm new file mode 100755 index 0000000..ed42b8e Binary files /dev/null and b/postgres/data/base/5/2836_fsm differ diff --git a/postgres/data/base/5/2836_vm b/postgres/data/base/5/2836_vm new file mode 100755 index 0000000..99187e0 Binary files /dev/null and b/postgres/data/base/5/2836_vm differ diff --git a/postgres/data/base/5/2837 b/postgres/data/base/5/2837 new file mode 100755 index 0000000..cb88bcb Binary files /dev/null and b/postgres/data/base/5/2837 differ diff --git a/postgres/data/base/5/2838 b/postgres/data/base/5/2838 new file mode 100755 index 0000000..c8b4486 Binary files /dev/null and b/postgres/data/base/5/2838 differ diff --git a/postgres/data/base/5/2838_fsm b/postgres/data/base/5/2838_fsm new file mode 100755 index 0000000..2916af2 Binary files /dev/null and b/postgres/data/base/5/2838_fsm differ diff --git a/postgres/data/base/5/2838_vm b/postgres/data/base/5/2838_vm new file mode 100755 index 0000000..16cff1a Binary files /dev/null and b/postgres/data/base/5/2838_vm differ diff --git a/postgres/data/base/5/2839 b/postgres/data/base/5/2839 new file mode 100755 index 0000000..7e75c82 Binary files /dev/null and b/postgres/data/base/5/2839 differ diff --git a/postgres/data/base/5/2840 b/postgres/data/base/5/2840 new file mode 100755 index 0000000..0102c6e Binary files /dev/null and b/postgres/data/base/5/2840 differ diff --git a/postgres/data/base/5/2840_fsm b/postgres/data/base/5/2840_fsm new file mode 100755 index 0000000..a6e901e Binary files /dev/null and b/postgres/data/base/5/2840_fsm differ diff --git a/postgres/data/base/5/2840_vm b/postgres/data/base/5/2840_vm new file mode 100755 index 0000000..cc4faff Binary files /dev/null and b/postgres/data/base/5/2840_vm differ diff --git a/postgres/data/base/5/2841 b/postgres/data/base/5/2841 new file mode 100755 index 0000000..05bccbb Binary files /dev/null and b/postgres/data/base/5/2841 differ diff --git a/postgres/data/base/5/2995 b/postgres/data/base/5/2995 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/2996 b/postgres/data/base/5/2996 new file mode 100755 index 0000000..7bcbf8f Binary files /dev/null and b/postgres/data/base/5/2996 differ diff --git a/postgres/data/base/5/3079 b/postgres/data/base/5/3079 new file mode 100755 index 0000000..36eda3e Binary files /dev/null and b/postgres/data/base/5/3079 differ diff --git a/postgres/data/base/5/3079_fsm b/postgres/data/base/5/3079_fsm new file mode 100755 index 0000000..7732d22 Binary files /dev/null and b/postgres/data/base/5/3079_fsm differ diff --git a/postgres/data/base/5/3079_vm b/postgres/data/base/5/3079_vm new file mode 100755 index 0000000..6f69ead Binary files /dev/null and b/postgres/data/base/5/3079_vm differ diff --git a/postgres/data/base/5/3080 b/postgres/data/base/5/3080 new file mode 100755 index 0000000..ee41e6b Binary files /dev/null and b/postgres/data/base/5/3080 differ diff --git a/postgres/data/base/5/3081 b/postgres/data/base/5/3081 new file mode 100755 index 0000000..8a32370 Binary files /dev/null and b/postgres/data/base/5/3081 differ diff --git a/postgres/data/base/5/3085 b/postgres/data/base/5/3085 new file mode 100755 index 0000000..e75db0c Binary files /dev/null and b/postgres/data/base/5/3085 differ diff --git a/postgres/data/base/5/3118 b/postgres/data/base/5/3118 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/3119 b/postgres/data/base/5/3119 new file mode 100755 index 0000000..059d8b6 Binary files /dev/null and b/postgres/data/base/5/3119 differ diff --git a/postgres/data/base/5/3164 b/postgres/data/base/5/3164 new file mode 100755 index 0000000..4392a6c Binary files /dev/null and b/postgres/data/base/5/3164 differ diff --git a/postgres/data/base/5/3256 b/postgres/data/base/5/3256 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/3257 b/postgres/data/base/5/3257 new file mode 100755 index 0000000..fbf5bbe Binary files /dev/null and b/postgres/data/base/5/3257 differ diff --git a/postgres/data/base/5/3258 b/postgres/data/base/5/3258 new file mode 100755 index 0000000..e6ea9ce Binary files /dev/null and b/postgres/data/base/5/3258 differ diff --git a/postgres/data/base/5/3350 b/postgres/data/base/5/3350 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/3351 b/postgres/data/base/5/3351 new file mode 100755 index 0000000..afd5efa Binary files /dev/null and b/postgres/data/base/5/3351 differ diff --git a/postgres/data/base/5/3379 b/postgres/data/base/5/3379 new file mode 100755 index 0000000..faaee39 Binary files /dev/null and b/postgres/data/base/5/3379 differ diff --git a/postgres/data/base/5/3380 b/postgres/data/base/5/3380 new file mode 100755 index 0000000..01e9984 Binary files /dev/null and b/postgres/data/base/5/3380 differ diff --git a/postgres/data/base/5/3381 b/postgres/data/base/5/3381 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/3394 b/postgres/data/base/5/3394 new file mode 100755 index 0000000..8429b20 Binary files /dev/null and b/postgres/data/base/5/3394 differ diff --git a/postgres/data/base/5/3394_fsm b/postgres/data/base/5/3394_fsm new file mode 100755 index 0000000..ffa8644 Binary files /dev/null and b/postgres/data/base/5/3394_fsm differ diff --git a/postgres/data/base/5/3394_vm b/postgres/data/base/5/3394_vm new file mode 100755 index 0000000..b30d0e5 Binary files /dev/null and b/postgres/data/base/5/3394_vm differ diff --git a/postgres/data/base/5/3395 b/postgres/data/base/5/3395 new file mode 100755 index 0000000..79b711c Binary files /dev/null and b/postgres/data/base/5/3395 differ diff --git a/postgres/data/base/5/3429 b/postgres/data/base/5/3429 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/3430 b/postgres/data/base/5/3430 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/3431 b/postgres/data/base/5/3431 new file mode 100755 index 0000000..13c10cb Binary files /dev/null and b/postgres/data/base/5/3431 differ diff --git a/postgres/data/base/5/3433 b/postgres/data/base/5/3433 new file mode 100755 index 0000000..ffe926f Binary files /dev/null and b/postgres/data/base/5/3433 differ diff --git a/postgres/data/base/5/3439 b/postgres/data/base/5/3439 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/3440 b/postgres/data/base/5/3440 new file mode 100755 index 0000000..cfae4df Binary files /dev/null and b/postgres/data/base/5/3440 differ diff --git a/postgres/data/base/5/3455 b/postgres/data/base/5/3455 new file mode 100755 index 0000000..b58ddf0 Binary files /dev/null and b/postgres/data/base/5/3455 differ diff --git a/postgres/data/base/5/3456 b/postgres/data/base/5/3456 new file mode 100755 index 0000000..caa5712 Binary files /dev/null and b/postgres/data/base/5/3456 differ diff --git a/postgres/data/base/5/3456_fsm b/postgres/data/base/5/3456_fsm new file mode 100755 index 0000000..3cb165f Binary files /dev/null and b/postgres/data/base/5/3456_fsm differ diff --git a/postgres/data/base/5/3456_vm b/postgres/data/base/5/3456_vm new file mode 100755 index 0000000..405e3b7 Binary files /dev/null and b/postgres/data/base/5/3456_vm differ diff --git a/postgres/data/base/5/3466 b/postgres/data/base/5/3466 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/3467 b/postgres/data/base/5/3467 new file mode 100755 index 0000000..6344b94 Binary files /dev/null and b/postgres/data/base/5/3467 differ diff --git a/postgres/data/base/5/3468 b/postgres/data/base/5/3468 new file mode 100755 index 0000000..6a2b6b1 Binary files /dev/null and b/postgres/data/base/5/3468 differ diff --git a/postgres/data/base/5/3501 b/postgres/data/base/5/3501 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/3502 b/postgres/data/base/5/3502 new file mode 100755 index 0000000..eb0b32a Binary files /dev/null and b/postgres/data/base/5/3502 differ diff --git a/postgres/data/base/5/3503 b/postgres/data/base/5/3503 new file mode 100755 index 0000000..32a3055 Binary files /dev/null and b/postgres/data/base/5/3503 differ diff --git a/postgres/data/base/5/3534 b/postgres/data/base/5/3534 new file mode 100755 index 0000000..7676fd8 Binary files /dev/null and b/postgres/data/base/5/3534 differ diff --git a/postgres/data/base/5/3541 b/postgres/data/base/5/3541 new file mode 100755 index 0000000..40869ad Binary files /dev/null and b/postgres/data/base/5/3541 differ diff --git a/postgres/data/base/5/3541_fsm b/postgres/data/base/5/3541_fsm new file mode 100755 index 0000000..a3a2de4 Binary files /dev/null and b/postgres/data/base/5/3541_fsm differ diff --git a/postgres/data/base/5/3541_vm b/postgres/data/base/5/3541_vm new file mode 100755 index 0000000..8bc4d54 Binary files /dev/null and b/postgres/data/base/5/3541_vm differ diff --git a/postgres/data/base/5/3542 b/postgres/data/base/5/3542 new file mode 100755 index 0000000..bb83580 Binary files /dev/null and b/postgres/data/base/5/3542 differ diff --git a/postgres/data/base/5/3574 b/postgres/data/base/5/3574 new file mode 100755 index 0000000..b026df1 Binary files /dev/null and b/postgres/data/base/5/3574 differ diff --git a/postgres/data/base/5/3575 b/postgres/data/base/5/3575 new file mode 100755 index 0000000..bdec532 Binary files /dev/null and b/postgres/data/base/5/3575 differ diff --git a/postgres/data/base/5/3576 b/postgres/data/base/5/3576 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/3596 b/postgres/data/base/5/3596 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/3597 b/postgres/data/base/5/3597 new file mode 100755 index 0000000..8963738 Binary files /dev/null and b/postgres/data/base/5/3597 differ diff --git a/postgres/data/base/5/3598 b/postgres/data/base/5/3598 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/3599 b/postgres/data/base/5/3599 new file mode 100755 index 0000000..67582c2 Binary files /dev/null and b/postgres/data/base/5/3599 differ diff --git a/postgres/data/base/5/3600 b/postgres/data/base/5/3600 new file mode 100755 index 0000000..ecb95aa Binary files /dev/null and b/postgres/data/base/5/3600 differ diff --git a/postgres/data/base/5/3600_fsm b/postgres/data/base/5/3600_fsm new file mode 100755 index 0000000..cebec19 Binary files /dev/null and b/postgres/data/base/5/3600_fsm differ diff --git a/postgres/data/base/5/3600_vm b/postgres/data/base/5/3600_vm new file mode 100755 index 0000000..2a81cd7 Binary files /dev/null and b/postgres/data/base/5/3600_vm differ diff --git a/postgres/data/base/5/3601 b/postgres/data/base/5/3601 new file mode 100755 index 0000000..04c846e Binary files /dev/null and b/postgres/data/base/5/3601 differ diff --git a/postgres/data/base/5/3601_fsm b/postgres/data/base/5/3601_fsm new file mode 100755 index 0000000..7732d22 Binary files /dev/null and b/postgres/data/base/5/3601_fsm differ diff --git a/postgres/data/base/5/3601_vm b/postgres/data/base/5/3601_vm new file mode 100755 index 0000000..fa97895 Binary files /dev/null and b/postgres/data/base/5/3601_vm differ diff --git a/postgres/data/base/5/3602 b/postgres/data/base/5/3602 new file mode 100755 index 0000000..72fa641 Binary files /dev/null and b/postgres/data/base/5/3602 differ diff --git a/postgres/data/base/5/3602_fsm b/postgres/data/base/5/3602_fsm new file mode 100755 index 0000000..d7897de Binary files /dev/null and b/postgres/data/base/5/3602_fsm differ diff --git a/postgres/data/base/5/3602_vm b/postgres/data/base/5/3602_vm new file mode 100755 index 0000000..86d1c5b Binary files /dev/null and b/postgres/data/base/5/3602_vm differ diff --git a/postgres/data/base/5/3603 b/postgres/data/base/5/3603 new file mode 100755 index 0000000..3e8d72a Binary files /dev/null and b/postgres/data/base/5/3603 differ diff --git a/postgres/data/base/5/3603_fsm b/postgres/data/base/5/3603_fsm new file mode 100755 index 0000000..c28dd4f Binary files /dev/null and b/postgres/data/base/5/3603_fsm differ diff --git a/postgres/data/base/5/3603_vm b/postgres/data/base/5/3603_vm new file mode 100755 index 0000000..80a425d Binary files /dev/null and b/postgres/data/base/5/3603_vm differ diff --git a/postgres/data/base/5/3604 b/postgres/data/base/5/3604 new file mode 100755 index 0000000..6f5a0aa Binary files /dev/null and b/postgres/data/base/5/3604 differ diff --git a/postgres/data/base/5/3605 b/postgres/data/base/5/3605 new file mode 100755 index 0000000..0f77325 Binary files /dev/null and b/postgres/data/base/5/3605 differ diff --git a/postgres/data/base/5/3606 b/postgres/data/base/5/3606 new file mode 100755 index 0000000..698e6d0 Binary files /dev/null and b/postgres/data/base/5/3606 differ diff --git a/postgres/data/base/5/3607 b/postgres/data/base/5/3607 new file mode 100755 index 0000000..1d023e0 Binary files /dev/null and b/postgres/data/base/5/3607 differ diff --git a/postgres/data/base/5/3608 b/postgres/data/base/5/3608 new file mode 100755 index 0000000..b52499e Binary files /dev/null and b/postgres/data/base/5/3608 differ diff --git a/postgres/data/base/5/3609 b/postgres/data/base/5/3609 new file mode 100755 index 0000000..e8a1432 Binary files /dev/null and b/postgres/data/base/5/3609 differ diff --git a/postgres/data/base/5/3712 b/postgres/data/base/5/3712 new file mode 100755 index 0000000..2c8258b Binary files /dev/null and b/postgres/data/base/5/3712 differ diff --git a/postgres/data/base/5/3764 b/postgres/data/base/5/3764 new file mode 100755 index 0000000..8364b26 Binary files /dev/null and b/postgres/data/base/5/3764 differ diff --git a/postgres/data/base/5/3764_fsm b/postgres/data/base/5/3764_fsm new file mode 100755 index 0000000..f64db4d Binary files /dev/null and b/postgres/data/base/5/3764_fsm differ diff --git a/postgres/data/base/5/3764_vm b/postgres/data/base/5/3764_vm new file mode 100755 index 0000000..6bafd97 Binary files /dev/null and b/postgres/data/base/5/3764_vm differ diff --git a/postgres/data/base/5/3766 b/postgres/data/base/5/3766 new file mode 100755 index 0000000..67ec2eb Binary files /dev/null and b/postgres/data/base/5/3766 differ diff --git a/postgres/data/base/5/3767 b/postgres/data/base/5/3767 new file mode 100755 index 0000000..a279a5f Binary files /dev/null and b/postgres/data/base/5/3767 differ diff --git a/postgres/data/base/5/3997 b/postgres/data/base/5/3997 new file mode 100755 index 0000000..46564a3 Binary files /dev/null and b/postgres/data/base/5/3997 differ diff --git a/postgres/data/base/5/4143 b/postgres/data/base/5/4143 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/4144 b/postgres/data/base/5/4144 new file mode 100755 index 0000000..64af764 Binary files /dev/null and b/postgres/data/base/5/4144 differ diff --git a/postgres/data/base/5/4145 b/postgres/data/base/5/4145 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/4146 b/postgres/data/base/5/4146 new file mode 100755 index 0000000..1f029ea Binary files /dev/null and b/postgres/data/base/5/4146 differ diff --git a/postgres/data/base/5/4147 b/postgres/data/base/5/4147 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/4148 b/postgres/data/base/5/4148 new file mode 100755 index 0000000..5959a95 Binary files /dev/null and b/postgres/data/base/5/4148 differ diff --git a/postgres/data/base/5/4149 b/postgres/data/base/5/4149 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/4150 b/postgres/data/base/5/4150 new file mode 100755 index 0000000..5e11d49 Binary files /dev/null and b/postgres/data/base/5/4150 differ diff --git a/postgres/data/base/5/4151 b/postgres/data/base/5/4151 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/4152 b/postgres/data/base/5/4152 new file mode 100755 index 0000000..8acd468 Binary files /dev/null and b/postgres/data/base/5/4152 differ diff --git a/postgres/data/base/5/4153 b/postgres/data/base/5/4153 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/4154 b/postgres/data/base/5/4154 new file mode 100755 index 0000000..e597f61 Binary files /dev/null and b/postgres/data/base/5/4154 differ diff --git a/postgres/data/base/5/4155 b/postgres/data/base/5/4155 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/4156 b/postgres/data/base/5/4156 new file mode 100755 index 0000000..d653113 Binary files /dev/null and b/postgres/data/base/5/4156 differ diff --git a/postgres/data/base/5/4157 b/postgres/data/base/5/4157 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/4158 b/postgres/data/base/5/4158 new file mode 100755 index 0000000..355910c Binary files /dev/null and b/postgres/data/base/5/4158 differ diff --git a/postgres/data/base/5/4159 b/postgres/data/base/5/4159 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/4160 b/postgres/data/base/5/4160 new file mode 100755 index 0000000..7d09bfa Binary files /dev/null and b/postgres/data/base/5/4160 differ diff --git a/postgres/data/base/5/4163 b/postgres/data/base/5/4163 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/4164 b/postgres/data/base/5/4164 new file mode 100755 index 0000000..97adb95 Binary files /dev/null and b/postgres/data/base/5/4164 differ diff --git a/postgres/data/base/5/4165 b/postgres/data/base/5/4165 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/4166 b/postgres/data/base/5/4166 new file mode 100755 index 0000000..c0e3e5b Binary files /dev/null and b/postgres/data/base/5/4166 differ diff --git a/postgres/data/base/5/4167 b/postgres/data/base/5/4167 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/4168 b/postgres/data/base/5/4168 new file mode 100755 index 0000000..ddcb560 Binary files /dev/null and b/postgres/data/base/5/4168 differ diff --git a/postgres/data/base/5/4169 b/postgres/data/base/5/4169 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/4170 b/postgres/data/base/5/4170 new file mode 100755 index 0000000..5812a8e Binary files /dev/null and b/postgres/data/base/5/4170 differ diff --git a/postgres/data/base/5/4171 b/postgres/data/base/5/4171 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/4172 b/postgres/data/base/5/4172 new file mode 100755 index 0000000..84c04d6 Binary files /dev/null and b/postgres/data/base/5/4172 differ diff --git a/postgres/data/base/5/4173 b/postgres/data/base/5/4173 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/4174 b/postgres/data/base/5/4174 new file mode 100755 index 0000000..9b12bec Binary files /dev/null and b/postgres/data/base/5/4174 differ diff --git a/postgres/data/base/5/5002 b/postgres/data/base/5/5002 new file mode 100755 index 0000000..aefa40d Binary files /dev/null and b/postgres/data/base/5/5002 differ diff --git a/postgres/data/base/5/548 b/postgres/data/base/5/548 new file mode 100755 index 0000000..64fdefd Binary files /dev/null and b/postgres/data/base/5/548 differ diff --git a/postgres/data/base/5/549 b/postgres/data/base/5/549 new file mode 100755 index 0000000..3734cc2 Binary files /dev/null and b/postgres/data/base/5/549 differ diff --git a/postgres/data/base/5/6102 b/postgres/data/base/5/6102 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/6104 b/postgres/data/base/5/6104 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/6106 b/postgres/data/base/5/6106 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/6110 b/postgres/data/base/5/6110 new file mode 100755 index 0000000..42e1920 Binary files /dev/null and b/postgres/data/base/5/6110 differ diff --git a/postgres/data/base/5/6111 b/postgres/data/base/5/6111 new file mode 100755 index 0000000..d012727 Binary files /dev/null and b/postgres/data/base/5/6111 differ diff --git a/postgres/data/base/5/6112 b/postgres/data/base/5/6112 new file mode 100755 index 0000000..293367c Binary files /dev/null and b/postgres/data/base/5/6112 differ diff --git a/postgres/data/base/5/6113 b/postgres/data/base/5/6113 new file mode 100755 index 0000000..542f8fa Binary files /dev/null and b/postgres/data/base/5/6113 differ diff --git a/postgres/data/base/5/6116 b/postgres/data/base/5/6116 new file mode 100755 index 0000000..787d5d1 Binary files /dev/null and b/postgres/data/base/5/6116 differ diff --git a/postgres/data/base/5/6117 b/postgres/data/base/5/6117 new file mode 100755 index 0000000..2b5656b Binary files /dev/null and b/postgres/data/base/5/6117 differ diff --git a/postgres/data/base/5/6175 b/postgres/data/base/5/6175 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/6176 b/postgres/data/base/5/6176 new file mode 100755 index 0000000..6e5bcd6 Binary files /dev/null and b/postgres/data/base/5/6176 differ diff --git a/postgres/data/base/5/6228 b/postgres/data/base/5/6228 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/6229 b/postgres/data/base/5/6229 new file mode 100755 index 0000000..fae8f44 Binary files /dev/null and b/postgres/data/base/5/6229 differ diff --git a/postgres/data/base/5/6237 b/postgres/data/base/5/6237 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/6238 b/postgres/data/base/5/6238 new file mode 100755 index 0000000..e7c0e8c Binary files /dev/null and b/postgres/data/base/5/6238 differ diff --git a/postgres/data/base/5/6239 b/postgres/data/base/5/6239 new file mode 100755 index 0000000..6c60b50 Binary files /dev/null and b/postgres/data/base/5/6239 differ diff --git a/postgres/data/base/5/826 b/postgres/data/base/5/826 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/base/5/827 b/postgres/data/base/5/827 new file mode 100755 index 0000000..f102efd Binary files /dev/null and b/postgres/data/base/5/827 differ diff --git a/postgres/data/base/5/828 b/postgres/data/base/5/828 new file mode 100755 index 0000000..e97c210 Binary files /dev/null and b/postgres/data/base/5/828 differ diff --git a/postgres/data/base/5/PG_VERSION b/postgres/data/base/5/PG_VERSION new file mode 100755 index 0000000..98d9bcb --- /dev/null +++ b/postgres/data/base/5/PG_VERSION @@ -0,0 +1 @@ +17 diff --git a/postgres/data/base/5/pg_filenode.map b/postgres/data/base/5/pg_filenode.map new file mode 100755 index 0000000..4fc801a Binary files /dev/null and b/postgres/data/base/5/pg_filenode.map differ diff --git a/postgres/data/global/1213 b/postgres/data/global/1213 new file mode 100755 index 0000000..eec8dc3 Binary files /dev/null and b/postgres/data/global/1213 differ diff --git a/postgres/data/global/1213_fsm b/postgres/data/global/1213_fsm new file mode 100755 index 0000000..86074be Binary files /dev/null and b/postgres/data/global/1213_fsm differ diff --git a/postgres/data/global/1213_vm b/postgres/data/global/1213_vm new file mode 100755 index 0000000..19685e9 Binary files /dev/null and b/postgres/data/global/1213_vm differ diff --git a/postgres/data/global/1214 b/postgres/data/global/1214 new file mode 100755 index 0000000..174ae02 Binary files /dev/null and b/postgres/data/global/1214 differ diff --git a/postgres/data/global/1214_fsm b/postgres/data/global/1214_fsm new file mode 100755 index 0000000..6215a7e Binary files /dev/null and b/postgres/data/global/1214_fsm differ diff --git a/postgres/data/global/1232 b/postgres/data/global/1232 new file mode 100755 index 0000000..ec0cfe7 Binary files /dev/null and b/postgres/data/global/1232 differ diff --git a/postgres/data/global/1233 b/postgres/data/global/1233 new file mode 100755 index 0000000..293c602 Binary files /dev/null and b/postgres/data/global/1233 differ diff --git a/postgres/data/global/1260 b/postgres/data/global/1260 new file mode 100755 index 0000000..25294f3 Binary files /dev/null and b/postgres/data/global/1260 differ diff --git a/postgres/data/global/1260_fsm b/postgres/data/global/1260_fsm new file mode 100755 index 0000000..4ee5faa Binary files /dev/null and b/postgres/data/global/1260_fsm differ diff --git a/postgres/data/global/1260_vm b/postgres/data/global/1260_vm new file mode 100755 index 0000000..3dc8382 Binary files /dev/null and b/postgres/data/global/1260_vm differ diff --git a/postgres/data/global/1261 b/postgres/data/global/1261 new file mode 100755 index 0000000..d705a0c Binary files /dev/null and b/postgres/data/global/1261 differ diff --git a/postgres/data/global/1261_fsm b/postgres/data/global/1261_fsm new file mode 100755 index 0000000..f32c23e Binary files /dev/null and b/postgres/data/global/1261_fsm differ diff --git a/postgres/data/global/1261_vm b/postgres/data/global/1261_vm new file mode 100755 index 0000000..a581c39 Binary files /dev/null and b/postgres/data/global/1261_vm differ diff --git a/postgres/data/global/1262 b/postgres/data/global/1262 new file mode 100755 index 0000000..21d8b09 Binary files /dev/null and b/postgres/data/global/1262 differ diff --git a/postgres/data/global/1262_fsm b/postgres/data/global/1262_fsm new file mode 100755 index 0000000..479fd94 Binary files /dev/null and b/postgres/data/global/1262_fsm differ diff --git a/postgres/data/global/1262_vm b/postgres/data/global/1262_vm new file mode 100755 index 0000000..c4c3c5d Binary files /dev/null and b/postgres/data/global/1262_vm differ diff --git a/postgres/data/global/2396 b/postgres/data/global/2396 new file mode 100755 index 0000000..e49d28b Binary files /dev/null and b/postgres/data/global/2396 differ diff --git a/postgres/data/global/2396_fsm b/postgres/data/global/2396_fsm new file mode 100755 index 0000000..7a4f24f Binary files /dev/null and b/postgres/data/global/2396_fsm differ diff --git a/postgres/data/global/2396_vm b/postgres/data/global/2396_vm new file mode 100755 index 0000000..7850d6a Binary files /dev/null and b/postgres/data/global/2396_vm differ diff --git a/postgres/data/global/2397 b/postgres/data/global/2397 new file mode 100755 index 0000000..3a83707 Binary files /dev/null and b/postgres/data/global/2397 differ diff --git a/postgres/data/global/2671 b/postgres/data/global/2671 new file mode 100755 index 0000000..b38d139 Binary files /dev/null and b/postgres/data/global/2671 differ diff --git a/postgres/data/global/2672 b/postgres/data/global/2672 new file mode 100755 index 0000000..ccce872 Binary files /dev/null and b/postgres/data/global/2672 differ diff --git a/postgres/data/global/2676 b/postgres/data/global/2676 new file mode 100755 index 0000000..8a626bc Binary files /dev/null and b/postgres/data/global/2676 differ diff --git a/postgres/data/global/2677 b/postgres/data/global/2677 new file mode 100755 index 0000000..b43d5d8 Binary files /dev/null and b/postgres/data/global/2677 differ diff --git a/postgres/data/global/2694 b/postgres/data/global/2694 new file mode 100755 index 0000000..ddd941b Binary files /dev/null and b/postgres/data/global/2694 differ diff --git a/postgres/data/global/2695 b/postgres/data/global/2695 new file mode 100755 index 0000000..763a32d Binary files /dev/null and b/postgres/data/global/2695 differ diff --git a/postgres/data/global/2697 b/postgres/data/global/2697 new file mode 100755 index 0000000..18caad2 Binary files /dev/null and b/postgres/data/global/2697 differ diff --git a/postgres/data/global/2698 b/postgres/data/global/2698 new file mode 100755 index 0000000..e7e9247 Binary files /dev/null and b/postgres/data/global/2698 differ diff --git a/postgres/data/global/2846 b/postgres/data/global/2846 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/global/2847 b/postgres/data/global/2847 new file mode 100755 index 0000000..9405f95 Binary files /dev/null and b/postgres/data/global/2847 differ diff --git a/postgres/data/global/2964 b/postgres/data/global/2964 new file mode 100755 index 0000000..3f0d9bb Binary files /dev/null and b/postgres/data/global/2964 differ diff --git a/postgres/data/global/2965 b/postgres/data/global/2965 new file mode 100755 index 0000000..345fa4f Binary files /dev/null and b/postgres/data/global/2965 differ diff --git a/postgres/data/global/2966 b/postgres/data/global/2966 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/global/2967 b/postgres/data/global/2967 new file mode 100755 index 0000000..588aa84 Binary files /dev/null and b/postgres/data/global/2967 differ diff --git a/postgres/data/global/3592 b/postgres/data/global/3592 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/global/3593 b/postgres/data/global/3593 new file mode 100755 index 0000000..17d4fe9 Binary files /dev/null and b/postgres/data/global/3593 differ diff --git a/postgres/data/global/4060 b/postgres/data/global/4060 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/global/4061 b/postgres/data/global/4061 new file mode 100755 index 0000000..210916f Binary files /dev/null and b/postgres/data/global/4061 differ diff --git a/postgres/data/global/4175 b/postgres/data/global/4175 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/global/4176 b/postgres/data/global/4176 new file mode 100755 index 0000000..c321477 Binary files /dev/null and b/postgres/data/global/4176 differ diff --git a/postgres/data/global/4177 b/postgres/data/global/4177 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/global/4178 b/postgres/data/global/4178 new file mode 100755 index 0000000..27db3c0 Binary files /dev/null and b/postgres/data/global/4178 differ diff --git a/postgres/data/global/4181 b/postgres/data/global/4181 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/global/4182 b/postgres/data/global/4182 new file mode 100755 index 0000000..a22e4a3 Binary files /dev/null and b/postgres/data/global/4182 differ diff --git a/postgres/data/global/4183 b/postgres/data/global/4183 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/global/4184 b/postgres/data/global/4184 new file mode 100755 index 0000000..242a319 Binary files /dev/null and b/postgres/data/global/4184 differ diff --git a/postgres/data/global/4185 b/postgres/data/global/4185 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/global/4186 b/postgres/data/global/4186 new file mode 100755 index 0000000..060ba86 Binary files /dev/null and b/postgres/data/global/4186 differ diff --git a/postgres/data/global/6000 b/postgres/data/global/6000 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/global/6001 b/postgres/data/global/6001 new file mode 100755 index 0000000..d18737c Binary files /dev/null and b/postgres/data/global/6001 differ diff --git a/postgres/data/global/6002 b/postgres/data/global/6002 new file mode 100755 index 0000000..a066fe1 Binary files /dev/null and b/postgres/data/global/6002 differ diff --git a/postgres/data/global/6100 b/postgres/data/global/6100 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/global/6114 b/postgres/data/global/6114 new file mode 100755 index 0000000..bf887fa Binary files /dev/null and b/postgres/data/global/6114 differ diff --git a/postgres/data/global/6115 b/postgres/data/global/6115 new file mode 100755 index 0000000..afafca8 Binary files /dev/null and b/postgres/data/global/6115 differ diff --git a/postgres/data/global/6243 b/postgres/data/global/6243 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/global/6244 b/postgres/data/global/6244 new file mode 100755 index 0000000..e69de29 diff --git a/postgres/data/global/6245 b/postgres/data/global/6245 new file mode 100755 index 0000000..1a9e142 Binary files /dev/null and b/postgres/data/global/6245 differ diff --git a/postgres/data/global/6246 b/postgres/data/global/6246 new file mode 100755 index 0000000..40d7bd8 Binary files /dev/null and b/postgres/data/global/6246 differ diff --git a/postgres/data/global/6247 b/postgres/data/global/6247 new file mode 100755 index 0000000..22e8881 Binary files /dev/null and b/postgres/data/global/6247 differ diff --git a/postgres/data/global/6302 b/postgres/data/global/6302 new file mode 100755 index 0000000..b0aa180 Binary files /dev/null and b/postgres/data/global/6302 differ diff --git a/postgres/data/global/6303 b/postgres/data/global/6303 new file mode 100755 index 0000000..155f91a Binary files /dev/null and b/postgres/data/global/6303 differ diff --git a/postgres/data/global/pg_control b/postgres/data/global/pg_control new file mode 100755 index 0000000..99b53a0 Binary files /dev/null and b/postgres/data/global/pg_control differ diff --git a/postgres/data/global/pg_filenode.map b/postgres/data/global/pg_filenode.map new file mode 100755 index 0000000..97c07a6 Binary files /dev/null and b/postgres/data/global/pg_filenode.map differ diff --git a/postgres/data/global/pg_internal.init b/postgres/data/global/pg_internal.init new file mode 100755 index 0000000..c604377 Binary files /dev/null and b/postgres/data/global/pg_internal.init differ diff --git a/postgres/data/pg_hba.conf b/postgres/data/pg_hba.conf new file mode 100755 index 0000000..7f379db --- /dev/null +++ b/postgres/data/pg_hba.conf @@ -0,0 +1,128 @@ +# PostgreSQL Client Authentication Configuration File +# =================================================== +# +# Refer to the "Client Authentication" section in the PostgreSQL +# documentation for a complete description of this file. A short +# synopsis follows. +# +# ---------------------- +# Authentication Records +# ---------------------- +# +# This file controls: which hosts are allowed to connect, how clients +# are authenticated, which PostgreSQL user names they can use, which +# databases they can access. Records take one of these forms: +# +# local DATABASE USER METHOD [OPTIONS] +# host DATABASE USER ADDRESS METHOD [OPTIONS] +# hostssl DATABASE USER ADDRESS METHOD [OPTIONS] +# hostnossl DATABASE USER ADDRESS METHOD [OPTIONS] +# hostgssenc DATABASE USER ADDRESS METHOD [OPTIONS] +# hostnogssenc DATABASE USER ADDRESS METHOD [OPTIONS] +# +# (The uppercase items must be replaced by actual values.) +# +# The first field is the connection type: +# - "local" is a Unix-domain socket +# - "host" is a TCP/IP socket (encrypted or not) +# - "hostssl" is a TCP/IP socket that is SSL-encrypted +# - "hostnossl" is a TCP/IP socket that is not SSL-encrypted +# - "hostgssenc" is a TCP/IP socket that is GSSAPI-encrypted +# - "hostnogssenc" is a TCP/IP socket that is not GSSAPI-encrypted +# +# DATABASE can be "all", "sameuser", "samerole", "replication", a +# database name, a regular expression (if it starts with a slash (/)) +# or a comma-separated list thereof. The "all" keyword does not match +# "replication". Access to replication must be enabled in a separate +# record (see example below). +# +# USER can be "all", a user name, a group name prefixed with "+", a +# regular expression (if it starts with a slash (/)) or a comma-separated +# list thereof. In both the DATABASE and USER fields you can also write +# a file name prefixed with "@" to include names from a separate file. +# +# ADDRESS specifies the set of hosts the record matches. It can be a +# host name, or it is made up of an IP address and a CIDR mask that is +# an integer (between 0 and 32 (IPv4) or 128 (IPv6) inclusive) that +# specifies the number of significant bits in the mask. A host name +# that starts with a dot (.) matches a suffix of the actual host name. +# Alternatively, you can write an IP address and netmask in separate +# columns to specify the set of hosts. Instead of a CIDR-address, you +# can write "samehost" to match any of the server's own IP addresses, +# or "samenet" to match any address in any subnet that the server is +# directly connected to. +# +# METHOD can be "trust", "reject", "md5", "password", "scram-sha-256", +# "gss", "sspi", "ident", "peer", "pam", "ldap", "radius" or "cert". +# Note that "password" sends passwords in clear text; "md5" or +# "scram-sha-256" are preferred since they send encrypted passwords. +# +# OPTIONS are a set of options for the authentication in the format +# NAME=VALUE. The available options depend on the different +# authentication methods -- refer to the "Client Authentication" +# section in the documentation for a list of which options are +# available for which authentication methods. +# +# Database and user names containing spaces, commas, quotes and other +# special characters must be quoted. Quoting one of the keywords +# "all", "sameuser", "samerole" or "replication" makes the name lose +# its special character, and just match a database or username with +# that name. +# +# --------------- +# Include Records +# --------------- +# +# This file allows the inclusion of external files or directories holding +# more records, using the following keywords: +# +# include FILE +# include_if_exists FILE +# include_dir DIRECTORY +# +# FILE is the file name to include, and DIR is the directory name containing +# the file(s) to include. Any file in a directory will be loaded if suffixed +# with ".conf". The files of a directory are ordered by name. +# include_if_exists ignores missing files. FILE and DIRECTORY can be +# specified as a relative or an absolute path, and can be double-quoted if +# they contain spaces. +# +# ------------- +# Miscellaneous +# ------------- +# +# This file is read on server startup and when the server receives a +# SIGHUP signal. If you edit the file on a running system, you have to +# SIGHUP the server for the changes to take effect, run "pg_ctl reload", +# or execute "SELECT pg_reload_conf()". +# +# ---------------------------------- +# Put your actual configuration here +# ---------------------------------- +# +# If you want to allow non-local connections, you need to add more +# "host" records. In that case you will also need to make PostgreSQL +# listen on a non-local interface via the listen_addresses +# configuration parameter, or via the -i or -h command line switches. + +# CAUTION: Configuring the system for local "trust" authentication +# allows any local user to connect as any PostgreSQL user, including +# the database superuser. If you do not trust all your local users, +# use another authentication method. + + +# TYPE DATABASE USER ADDRESS METHOD + +# "local" is for Unix domain socket connections only +local all all trust +# IPv4 local connections: +host all all 127.0.0.1/32 trust +# IPv6 local connections: +host all all ::1/128 trust +# Allow replication connections from localhost, by a user with the +# replication privilege. +local replication all trust +host replication all 127.0.0.1/32 trust +host replication all ::1/128 trust + +host all all all scram-sha-256 diff --git a/postgres/data/pg_ident.conf b/postgres/data/pg_ident.conf new file mode 100755 index 0000000..f5225f2 --- /dev/null +++ b/postgres/data/pg_ident.conf @@ -0,0 +1,72 @@ +# PostgreSQL User Name Maps +# ========================= +# +# --------------- +# Mapping Records +# --------------- +# +# Refer to the PostgreSQL documentation, chapter "Client +# Authentication" for a complete description. A short synopsis +# follows. +# +# This file controls PostgreSQL user name mapping. It maps external +# user names to their corresponding PostgreSQL user names. Records +# are of the form: +# +# MAPNAME SYSTEM-USERNAME PG-USERNAME +# +# (The uppercase quantities must be replaced by actual values.) +# +# MAPNAME is the (otherwise freely chosen) map name that was used in +# pg_hba.conf. SYSTEM-USERNAME is the detected user name of the +# client. PG-USERNAME is the requested PostgreSQL user name. The +# existence of a record specifies that SYSTEM-USERNAME may connect as +# PG-USERNAME. +# +# If SYSTEM-USERNAME starts with a slash (/), it will be treated as a +# regular expression. Optionally this can contain a capture (a +# parenthesized subexpression). The substring matching the capture +# will be substituted for \1 (backslash-one) if present in +# PG-USERNAME. +# +# PG-USERNAME can be "all", a user name, a group name prefixed with "+", or +# a regular expression (if it starts with a slash (/)). If it is a regular +# expression, the substring matching with \1 has no effect. +# +# Multiple maps may be specified in this file and used by pg_hba.conf. +# +# No map names are defined in the default configuration. If all +# system user names and PostgreSQL user names are the same, you don't +# need anything in this file. +# +# --------------- +# Include Records +# --------------- +# +# This file allows the inclusion of external files or directories holding +# more records, using the following keywords: +# +# include FILE +# include_if_exists FILE +# include_dir DIRECTORY +# +# FILE is the file name to include, and DIR is the directory name containing +# the file(s) to include. Any file in a directory will be loaded if suffixed +# with ".conf". The files of a directory are ordered by name. +# include_if_exists ignores missing files. FILE and DIRECTORY can be +# specified as a relative or an absolute path, and can be double-quoted if +# they contain spaces. +# +# ------------------------------- +# Miscellaneous +# ------------------------------- +# +# This file is read on server startup and when the postmaster receives +# a SIGHUP signal. If you edit the file on a running system, you have +# to SIGHUP the postmaster for the changes to take effect. You can +# use "pg_ctl reload" to do that. + +# Put your actual configuration here +# ---------------------------------- + +# MAPNAME SYSTEM-USERNAME PG-USERNAME diff --git a/postgres/data/pg_logical/replorigin_checkpoint b/postgres/data/pg_logical/replorigin_checkpoint new file mode 100755 index 0000000..ec451b0 Binary files /dev/null and b/postgres/data/pg_logical/replorigin_checkpoint differ diff --git a/postgres/data/pg_multixact/members/0000 b/postgres/data/pg_multixact/members/0000 new file mode 100755 index 0000000..6d17cf9 Binary files /dev/null and b/postgres/data/pg_multixact/members/0000 differ diff --git a/postgres/data/pg_multixact/offsets/0000 b/postgres/data/pg_multixact/offsets/0000 new file mode 100755 index 0000000..6d17cf9 Binary files /dev/null and b/postgres/data/pg_multixact/offsets/0000 differ diff --git a/postgres/data/pg_subtrans/0000 b/postgres/data/pg_subtrans/0000 new file mode 100755 index 0000000..6d17cf9 Binary files /dev/null and b/postgres/data/pg_subtrans/0000 differ diff --git a/postgres/data/pg_wal/000000010000000000000002 b/postgres/data/pg_wal/000000010000000000000002 new file mode 100755 index 0000000..7450257 Binary files /dev/null and b/postgres/data/pg_wal/000000010000000000000002 differ diff --git a/postgres/data/pg_wal/000000010000000000000003 b/postgres/data/pg_wal/000000010000000000000003 new file mode 100755 index 0000000..fa868bf Binary files /dev/null and b/postgres/data/pg_wal/000000010000000000000003 differ diff --git a/postgres/data/pg_xact/0000 b/postgres/data/pg_xact/0000 new file mode 100755 index 0000000..83901a2 Binary files /dev/null and b/postgres/data/pg_xact/0000 differ diff --git a/postgres/data/postgresql.auto.conf b/postgres/data/postgresql.auto.conf new file mode 100755 index 0000000..af7125e --- /dev/null +++ b/postgres/data/postgresql.auto.conf @@ -0,0 +1,2 @@ +# Do not edit this file manually! +# It will be overwritten by the ALTER SYSTEM command. diff --git a/postgres/data/postgresql.conf b/postgres/data/postgresql.conf new file mode 100755 index 0000000..19414a3 --- /dev/null +++ b/postgres/data/postgresql.conf @@ -0,0 +1,842 @@ +# ----------------------------- +# PostgreSQL configuration file +# ----------------------------- +# +# This file consists of lines of the form: +# +# name = value +# +# (The "=" is optional.) Whitespace may be used. Comments are introduced with +# "#" anywhere on a line. The complete list of parameter names and allowed +# values can be found in the PostgreSQL documentation. +# +# The commented-out settings shown in this file represent the default values. +# Re-commenting a setting is NOT sufficient to revert it to the default value; +# you need to reload the server. +# +# This file is read on server startup and when the server receives a SIGHUP +# signal. If you edit the file on a running system, you have to SIGHUP the +# server for the changes to take effect, run "pg_ctl reload", or execute +# "SELECT pg_reload_conf()". Some parameters, which are marked below, +# require a server shutdown and restart to take effect. +# +# Any parameter can also be given as a command-line option to the server, e.g., +# "postgres -c log_connections=on". Some parameters can be changed at run time +# with the "SET" SQL command. +# +# Memory units: B = bytes Time units: us = microseconds +# kB = kilobytes ms = milliseconds +# MB = megabytes s = seconds +# GB = gigabytes min = minutes +# TB = terabytes h = hours +# d = days + + +#------------------------------------------------------------------------------ +# FILE LOCATIONS +#------------------------------------------------------------------------------ + +# The default values of these variables are driven from the -D command-line +# option or PGDATA environment variable, represented here as ConfigDir. + +#data_directory = 'ConfigDir' # use data in another directory + # (change requires restart) +#hba_file = 'ConfigDir/pg_hba.conf' # host-based authentication file + # (change requires restart) +#ident_file = 'ConfigDir/pg_ident.conf' # ident configuration file + # (change requires restart) + +# If external_pid_file is not explicitly set, no extra PID file is written. +#external_pid_file = '' # write an extra PID file + # (change requires restart) + + +#------------------------------------------------------------------------------ +# CONNECTIONS AND AUTHENTICATION +#------------------------------------------------------------------------------ + +# - Connection Settings - + +listen_addresses = '*' + # comma-separated list of addresses; + # defaults to 'localhost'; use '*' for all + # (change requires restart) +#port = 5432 # (change requires restart) +max_connections = 100 # (change requires restart) +#reserved_connections = 0 # (change requires restart) +#superuser_reserved_connections = 3 # (change requires restart) +#unix_socket_directories = '/var/run/postgresql' # comma-separated list of directories + # (change requires restart) +#unix_socket_group = '' # (change requires restart) +#unix_socket_permissions = 0777 # begin with 0 to use octal notation + # (change requires restart) +#bonjour = off # advertise server via Bonjour + # (change requires restart) +#bonjour_name = '' # defaults to the computer name + # (change requires restart) + +# - TCP settings - +# see "man tcp" for details + +#tcp_keepalives_idle = 0 # TCP_KEEPIDLE, in seconds; + # 0 selects the system default +#tcp_keepalives_interval = 0 # TCP_KEEPINTVL, in seconds; + # 0 selects the system default +#tcp_keepalives_count = 0 # TCP_KEEPCNT; + # 0 selects the system default +#tcp_user_timeout = 0 # TCP_USER_TIMEOUT, in milliseconds; + # 0 selects the system default + +#client_connection_check_interval = 0 # time between checks for client + # disconnection while running queries; + # 0 for never + +# - Authentication - + +#authentication_timeout = 1min # 1s-600s +#password_encryption = scram-sha-256 # scram-sha-256 or md5 +#scram_iterations = 4096 + +# GSSAPI using Kerberos +#krb_server_keyfile = 'FILE:${sysconfdir}/krb5.keytab' +#krb_caseins_users = off +#gss_accept_delegation = off + +# - SSL - + +#ssl = off +#ssl_ca_file = '' +#ssl_cert_file = 'server.crt' +#ssl_crl_file = '' +#ssl_crl_dir = '' +#ssl_key_file = 'server.key' +#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers +#ssl_prefer_server_ciphers = on +#ssl_ecdh_curve = 'prime256v1' +#ssl_min_protocol_version = 'TLSv1.2' +#ssl_max_protocol_version = '' +#ssl_dh_params_file = '' +#ssl_passphrase_command = '' +#ssl_passphrase_command_supports_reload = off + + +#------------------------------------------------------------------------------ +# RESOURCE USAGE (except WAL) +#------------------------------------------------------------------------------ + +# - Memory - + +shared_buffers = 128MB # min 128kB + # (change requires restart) +#huge_pages = try # on, off, or try + # (change requires restart) +#huge_page_size = 0 # zero for system default + # (change requires restart) +#temp_buffers = 8MB # min 800kB +#max_prepared_transactions = 0 # zero disables the feature + # (change requires restart) +# Caution: it is not advisable to set max_prepared_transactions nonzero unless +# you actively intend to use prepared transactions. +#work_mem = 4MB # min 64kB +#hash_mem_multiplier = 2.0 # 1-1000.0 multiplier on hash table work_mem +#maintenance_work_mem = 64MB # min 64kB +#autovacuum_work_mem = -1 # min 64kB, or -1 to use maintenance_work_mem +#logical_decoding_work_mem = 64MB # min 64kB +#max_stack_depth = 2MB # min 100kB +#shared_memory_type = mmap # the default is the first option + # supported by the operating system: + # mmap + # sysv + # windows + # (change requires restart) +dynamic_shared_memory_type = posix # the default is usually the first option + # supported by the operating system: + # posix + # sysv + # windows + # mmap + # (change requires restart) +#min_dynamic_shared_memory = 0MB # (change requires restart) +#vacuum_buffer_usage_limit = 2MB # size of vacuum and analyze buffer access strategy ring; + # 0 to disable vacuum buffer access strategy; + # range 128kB to 16GB + +# SLRU buffers (change requires restart) +#commit_timestamp_buffers = 0 # memory for pg_commit_ts (0 = auto) +#multixact_offset_buffers = 16 # memory for pg_multixact/offsets +#multixact_member_buffers = 32 # memory for pg_multixact/members +#notify_buffers = 16 # memory for pg_notify +#serializable_buffers = 32 # memory for pg_serial +#subtransaction_buffers = 0 # memory for pg_subtrans (0 = auto) +#transaction_buffers = 0 # memory for pg_xact (0 = auto) + +# - Disk - + +#temp_file_limit = -1 # limits per-process temp file space + # in kilobytes, or -1 for no limit + +#max_notify_queue_pages = 1048576 # limits the number of SLRU pages allocated + # for NOTIFY / LISTEN queue + +# - Kernel Resources - + +#max_files_per_process = 1000 # min 64 + # (change requires restart) + +# - Cost-Based Vacuum Delay - + +#vacuum_cost_delay = 0 # 0-100 milliseconds (0 disables) +#vacuum_cost_page_hit = 1 # 0-10000 credits +#vacuum_cost_page_miss = 2 # 0-10000 credits +#vacuum_cost_page_dirty = 20 # 0-10000 credits +#vacuum_cost_limit = 200 # 1-10000 credits + +# - Background Writer - + +#bgwriter_delay = 200ms # 10-10000ms between rounds +#bgwriter_lru_maxpages = 100 # max buffers written/round, 0 disables +#bgwriter_lru_multiplier = 2.0 # 0-10.0 multiplier on buffers scanned/round +#bgwriter_flush_after = 512kB # measured in pages, 0 disables + +# - Asynchronous Behavior - + +#backend_flush_after = 0 # measured in pages, 0 disables +#effective_io_concurrency = 1 # 1-1000; 0 disables prefetching +#maintenance_io_concurrency = 10 # 1-1000; 0 disables prefetching +#io_combine_limit = 128kB # usually 1-32 blocks (depends on OS) +#max_worker_processes = 8 # (change requires restart) +#max_parallel_workers_per_gather = 2 # limited by max_parallel_workers +#max_parallel_maintenance_workers = 2 # limited by max_parallel_workers +#max_parallel_workers = 8 # number of max_worker_processes that + # can be used in parallel operations +#parallel_leader_participation = on + + +#------------------------------------------------------------------------------ +# WRITE-AHEAD LOG +#------------------------------------------------------------------------------ + +# - Settings - + +#wal_level = replica # minimal, replica, or logical + # (change requires restart) +#fsync = on # flush data to disk for crash safety + # (turning this off can cause + # unrecoverable data corruption) +#synchronous_commit = on # synchronization level; + # off, local, remote_write, remote_apply, or on +#wal_sync_method = fsync # the default is the first option + # supported by the operating system: + # open_datasync + # fdatasync (default on Linux and FreeBSD) + # fsync + # fsync_writethrough + # open_sync +#full_page_writes = on # recover from partial page writes +#wal_log_hints = off # also do full page writes of non-critical updates + # (change requires restart) +#wal_compression = off # enables compression of full-page writes; + # off, pglz, lz4, zstd, or on +#wal_init_zero = on # zero-fill new WAL files +#wal_recycle = on # recycle WAL files +#wal_buffers = -1 # min 32kB, -1 sets based on shared_buffers + # (change requires restart) +#wal_writer_delay = 200ms # 1-10000 milliseconds +#wal_writer_flush_after = 1MB # measured in pages, 0 disables +#wal_skip_threshold = 2MB + +#commit_delay = 0 # range 0-100000, in microseconds +#commit_siblings = 5 # range 1-1000 + +# - Checkpoints - + +#checkpoint_timeout = 5min # range 30s-1d +#checkpoint_completion_target = 0.9 # checkpoint target duration, 0.0 - 1.0 +#checkpoint_flush_after = 256kB # measured in pages, 0 disables +#checkpoint_warning = 30s # 0 disables +max_wal_size = 1GB +min_wal_size = 80MB + +# - Prefetching during recovery - + +#recovery_prefetch = try # prefetch pages referenced in the WAL? +#wal_decode_buffer_size = 512kB # lookahead window used for prefetching + # (change requires restart) + +# - Archiving - + +#archive_mode = off # enables archiving; off, on, or always + # (change requires restart) +#archive_library = '' # library to use to archive a WAL file + # (empty string indicates archive_command should + # be used) +#archive_command = '' # command to use to archive a WAL file + # placeholders: %p = path of file to archive + # %f = file name only + # e.g. 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f' +#archive_timeout = 0 # force a WAL file switch after this + # number of seconds; 0 disables + +# - Archive Recovery - + +# These are only used in recovery mode. + +#restore_command = '' # command to use to restore an archived WAL file + # placeholders: %p = path of file to restore + # %f = file name only + # e.g. 'cp /mnt/server/archivedir/%f %p' +#archive_cleanup_command = '' # command to execute at every restartpoint +#recovery_end_command = '' # command to execute at completion of recovery + +# - Recovery Target - + +# Set these only when performing a targeted recovery. + +#recovery_target = '' # 'immediate' to end recovery as soon as a + # consistent state is reached + # (change requires restart) +#recovery_target_name = '' # the named restore point to which recovery will proceed + # (change requires restart) +#recovery_target_time = '' # the time stamp up to which recovery will proceed + # (change requires restart) +#recovery_target_xid = '' # the transaction ID up to which recovery will proceed + # (change requires restart) +#recovery_target_lsn = '' # the WAL LSN up to which recovery will proceed + # (change requires restart) +#recovery_target_inclusive = on # Specifies whether to stop: + # just after the specified recovery target (on) + # just before the recovery target (off) + # (change requires restart) +#recovery_target_timeline = 'latest' # 'current', 'latest', or timeline ID + # (change requires restart) +#recovery_target_action = 'pause' # 'pause', 'promote', 'shutdown' + # (change requires restart) + +# - WAL Summarization - + +#summarize_wal = off # run WAL summarizer process? +#wal_summary_keep_time = '10d' # when to remove old summary files, 0 = never + + +#------------------------------------------------------------------------------ +# REPLICATION +#------------------------------------------------------------------------------ + +# - Sending Servers - + +# Set these on the primary and on any standby that will send replication data. + +#max_wal_senders = 10 # max number of walsender processes + # (change requires restart) +#max_replication_slots = 10 # max number of replication slots + # (change requires restart) +#wal_keep_size = 0 # in megabytes; 0 disables +#max_slot_wal_keep_size = -1 # in megabytes; -1 disables +#wal_sender_timeout = 60s # in milliseconds; 0 disables +#track_commit_timestamp = off # collect timestamp of transaction commit + # (change requires restart) + +# - Primary Server - + +# These settings are ignored on a standby server. + +#synchronous_standby_names = '' # standby servers that provide sync rep + # method to choose sync standbys, number of sync standbys, + # and comma-separated list of application_name + # from standby(s); '*' = all +#synchronized_standby_slots = '' # streaming replication standby server slot + # names that logical walsender processes will wait for + +# - Standby Servers - + +# These settings are ignored on a primary server. + +#primary_conninfo = '' # connection string to sending server +#primary_slot_name = '' # replication slot on sending server +#hot_standby = on # "off" disallows queries during recovery + # (change requires restart) +#max_standby_archive_delay = 30s # max delay before canceling queries + # when reading WAL from archive; + # -1 allows indefinite delay +#max_standby_streaming_delay = 30s # max delay before canceling queries + # when reading streaming WAL; + # -1 allows indefinite delay +#wal_receiver_create_temp_slot = off # create temp slot if primary_slot_name + # is not set +#wal_receiver_status_interval = 10s # send replies at least this often + # 0 disables +#hot_standby_feedback = off # send info from standby to prevent + # query conflicts +#wal_receiver_timeout = 60s # time that receiver waits for + # communication from primary + # in milliseconds; 0 disables +#wal_retrieve_retry_interval = 5s # time to wait before retrying to + # retrieve WAL after a failed attempt +#recovery_min_apply_delay = 0 # minimum delay for applying changes during recovery +#sync_replication_slots = off # enables slot synchronization on the physical standby from the primary + +# - Subscribers - + +# These settings are ignored on a publisher. + +#max_logical_replication_workers = 4 # taken from max_worker_processes + # (change requires restart) +#max_sync_workers_per_subscription = 2 # taken from max_logical_replication_workers +#max_parallel_apply_workers_per_subscription = 2 # taken from max_logical_replication_workers + + +#------------------------------------------------------------------------------ +# QUERY TUNING +#------------------------------------------------------------------------------ + +# - Planner Method Configuration - + +#enable_async_append = on +#enable_bitmapscan = on +#enable_gathermerge = on +#enable_hashagg = on +#enable_hashjoin = on +#enable_incremental_sort = on +#enable_indexscan = on +#enable_indexonlyscan = on +#enable_material = on +#enable_memoize = on +#enable_mergejoin = on +#enable_nestloop = on +#enable_parallel_append = on +#enable_parallel_hash = on +#enable_partition_pruning = on +#enable_partitionwise_join = off +#enable_partitionwise_aggregate = off +#enable_presorted_aggregate = on +#enable_seqscan = on +#enable_sort = on +#enable_tidscan = on +#enable_group_by_reordering = on + +# - Planner Cost Constants - + +#seq_page_cost = 1.0 # measured on an arbitrary scale +#random_page_cost = 4.0 # same scale as above +#cpu_tuple_cost = 0.01 # same scale as above +#cpu_index_tuple_cost = 0.005 # same scale as above +#cpu_operator_cost = 0.0025 # same scale as above +#parallel_setup_cost = 1000.0 # same scale as above +#parallel_tuple_cost = 0.1 # same scale as above +#min_parallel_table_scan_size = 8MB +#min_parallel_index_scan_size = 512kB +#effective_cache_size = 4GB + +#jit_above_cost = 100000 # perform JIT compilation if available + # and query more expensive than this; + # -1 disables +#jit_inline_above_cost = 500000 # inline small functions if query is + # more expensive than this; -1 disables +#jit_optimize_above_cost = 500000 # use expensive JIT optimizations if + # query is more expensive than this; + # -1 disables + +# - Genetic Query Optimizer - + +#geqo = on +#geqo_threshold = 12 +#geqo_effort = 5 # range 1-10 +#geqo_pool_size = 0 # selects default based on effort +#geqo_generations = 0 # selects default based on effort +#geqo_selection_bias = 2.0 # range 1.5-2.0 +#geqo_seed = 0.0 # range 0.0-1.0 + +# - Other Planner Options - + +#default_statistics_target = 100 # range 1-10000 +#constraint_exclusion = partition # on, off, or partition +#cursor_tuple_fraction = 0.1 # range 0.0-1.0 +#from_collapse_limit = 8 +#jit = on # allow JIT compilation +#join_collapse_limit = 8 # 1 disables collapsing of explicit + # JOIN clauses +#plan_cache_mode = auto # auto, force_generic_plan or + # force_custom_plan +#recursive_worktable_factor = 10.0 # range 0.001-1000000 + + +#------------------------------------------------------------------------------ +# REPORTING AND LOGGING +#------------------------------------------------------------------------------ + +# - Where to Log - + +#log_destination = 'stderr' # Valid values are combinations of + # stderr, csvlog, jsonlog, syslog, and + # eventlog, depending on platform. + # csvlog and jsonlog require + # logging_collector to be on. + +# This is used when logging to stderr: +#logging_collector = off # Enable capturing of stderr, jsonlog, + # and csvlog into log files. Required + # to be on for csvlogs and jsonlogs. + # (change requires restart) + +# These are only used if logging_collector is on: +#log_directory = 'log' # directory where log files are written, + # can be absolute or relative to PGDATA +#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern, + # can include strftime() escapes +#log_file_mode = 0600 # creation mode for log files, + # begin with 0 to use octal notation +#log_rotation_age = 1d # Automatic rotation of logfiles will + # happen after that time. 0 disables. +#log_rotation_size = 10MB # Automatic rotation of logfiles will + # happen after that much log output. + # 0 disables. +#log_truncate_on_rotation = off # If on, an existing log file with the + # same name as the new log file will be + # truncated rather than appended to. + # But such truncation only occurs on + # time-driven rotation, not on restarts + # or size-driven rotation. Default is + # off, meaning append to existing files + # in all cases. + +# These are relevant when logging to syslog: +#syslog_facility = 'LOCAL0' +#syslog_ident = 'postgres' +#syslog_sequence_numbers = on +#syslog_split_messages = on + +# This is only relevant when logging to eventlog (Windows): +# (change requires restart) +#event_source = 'PostgreSQL' + +# - When to Log - + +#log_min_messages = warning # values in order of decreasing detail: + # debug5 + # debug4 + # debug3 + # debug2 + # debug1 + # info + # notice + # warning + # error + # log + # fatal + # panic + +#log_min_error_statement = error # values in order of decreasing detail: + # debug5 + # debug4 + # debug3 + # debug2 + # debug1 + # info + # notice + # warning + # error + # log + # fatal + # panic (effectively off) + +#log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements + # and their durations, > 0 logs only + # statements running at least this number + # of milliseconds + +#log_min_duration_sample = -1 # -1 is disabled, 0 logs a sample of statements + # and their durations, > 0 logs only a sample of + # statements running at least this number + # of milliseconds; + # sample fraction is determined by log_statement_sample_rate + +#log_statement_sample_rate = 1.0 # fraction of logged statements exceeding + # log_min_duration_sample to be logged; + # 1.0 logs all such statements, 0.0 never logs + + +#log_transaction_sample_rate = 0.0 # fraction of transactions whose statements + # are logged regardless of their duration; 1.0 logs all + # statements from all transactions, 0.0 never logs + +#log_startup_progress_interval = 10s # Time between progress updates for + # long-running startup operations. + # 0 disables the feature, > 0 indicates + # the interval in milliseconds. + +# - What to Log - + +#debug_print_parse = off +#debug_print_rewritten = off +#debug_print_plan = off +#debug_pretty_print = on +#log_autovacuum_min_duration = 10min # log autovacuum activity; + # -1 disables, 0 logs all actions and + # their durations, > 0 logs only + # actions running at least this number + # of milliseconds. +#log_checkpoints = on +#log_connections = off +#log_disconnections = off +#log_duration = off +#log_error_verbosity = default # terse, default, or verbose messages +#log_hostname = off +#log_line_prefix = '%m [%p] ' # special values: + # %a = application name + # %u = user name + # %d = database name + # %r = remote host and port + # %h = remote host + # %b = backend type + # %p = process ID + # %P = process ID of parallel group leader + # %t = timestamp without milliseconds + # %m = timestamp with milliseconds + # %n = timestamp with milliseconds (as a Unix epoch) + # %Q = query ID (0 if none or not computed) + # %i = command tag + # %e = SQL state + # %c = session ID + # %l = session line number + # %s = session start timestamp + # %v = virtual transaction ID + # %x = transaction ID (0 if none) + # %q = stop here in non-session + # processes + # %% = '%' + # e.g. '<%u%%%d> ' +#log_lock_waits = off # log lock waits >= deadlock_timeout +#log_recovery_conflict_waits = off # log standby recovery conflict waits + # >= deadlock_timeout +#log_parameter_max_length = -1 # when logging statements, limit logged + # bind-parameter values to N bytes; + # -1 means print in full, 0 disables +#log_parameter_max_length_on_error = 0 # when logging an error, limit logged + # bind-parameter values to N bytes; + # -1 means print in full, 0 disables +#log_statement = 'none' # none, ddl, mod, all +#log_replication_commands = off +#log_temp_files = -1 # log temporary files equal or larger + # than the specified size in kilobytes; + # -1 disables, 0 logs all temp files +log_timezone = UTC + +# - Process Title - + +#cluster_name = '' # added to process titles if nonempty + # (change requires restart) +#update_process_title = on + + +#------------------------------------------------------------------------------ +# STATISTICS +#------------------------------------------------------------------------------ + +# - Cumulative Query and Index Statistics - + +#track_activities = on +#track_activity_query_size = 1024 # (change requires restart) +#track_counts = on +#track_io_timing = off +#track_wal_io_timing = off +#track_functions = none # none, pl, all +#stats_fetch_consistency = cache # cache, none, snapshot + + +# - Monitoring - + +#compute_query_id = auto +#log_statement_stats = off +#log_parser_stats = off +#log_planner_stats = off +#log_executor_stats = off + + +#------------------------------------------------------------------------------ +# AUTOVACUUM +#------------------------------------------------------------------------------ + +#autovacuum = on # Enable autovacuum subprocess? 'on' + # requires track_counts to also be on. +#autovacuum_max_workers = 3 # max number of autovacuum subprocesses + # (change requires restart) +#autovacuum_naptime = 1min # time between autovacuum runs +#autovacuum_vacuum_threshold = 50 # min number of row updates before + # vacuum +#autovacuum_vacuum_insert_threshold = 1000 # min number of row inserts + # before vacuum; -1 disables insert + # vacuums +#autovacuum_analyze_threshold = 50 # min number of row updates before + # analyze +#autovacuum_vacuum_scale_factor = 0.2 # fraction of table size before vacuum +#autovacuum_vacuum_insert_scale_factor = 0.2 # fraction of inserts over table + # size before insert vacuum +#autovacuum_analyze_scale_factor = 0.1 # fraction of table size before analyze +#autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum + # (change requires restart) +#autovacuum_multixact_freeze_max_age = 400000000 # maximum multixact age + # before forced vacuum + # (change requires restart) +#autovacuum_vacuum_cost_delay = 2ms # default vacuum cost delay for + # autovacuum, in milliseconds; + # -1 means use vacuum_cost_delay +#autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for + # autovacuum, -1 means use + # vacuum_cost_limit + + +#------------------------------------------------------------------------------ +# CLIENT CONNECTION DEFAULTS +#------------------------------------------------------------------------------ + +# - Statement Behavior - + +#client_min_messages = notice # values in order of decreasing detail: + # debug5 + # debug4 + # debug3 + # debug2 + # debug1 + # log + # notice + # warning + # error +#search_path = '"$user", public' # schema names +#row_security = on +#default_table_access_method = 'heap' +#default_tablespace = '' # a tablespace name, '' uses the default +#default_toast_compression = 'pglz' # 'pglz' or 'lz4' +#temp_tablespaces = '' # a list of tablespace names, '' uses + # only default tablespace +#check_function_bodies = on +#default_transaction_isolation = 'read committed' +#default_transaction_read_only = off +#default_transaction_deferrable = off +#session_replication_role = 'origin' +#statement_timeout = 0 # in milliseconds, 0 is disabled +#transaction_timeout = 0 # in milliseconds, 0 is disabled +#lock_timeout = 0 # in milliseconds, 0 is disabled +#idle_in_transaction_session_timeout = 0 # in milliseconds, 0 is disabled +#idle_session_timeout = 0 # in milliseconds, 0 is disabled +#vacuum_freeze_table_age = 150000000 +#vacuum_freeze_min_age = 50000000 +#vacuum_failsafe_age = 1600000000 +#vacuum_multixact_freeze_table_age = 150000000 +#vacuum_multixact_freeze_min_age = 5000000 +#vacuum_multixact_failsafe_age = 1600000000 +#bytea_output = 'hex' # hex, escape +#xmlbinary = 'base64' +#xmloption = 'content' +#gin_pending_list_limit = 4MB +#createrole_self_grant = '' # set and/or inherit +#event_triggers = on + +# - Locale and Formatting - + +datestyle = 'iso, mdy' +#intervalstyle = 'postgres' +timezone = UTC +#timezone_abbreviations = 'Default' # Select the set of available time zone + # abbreviations. Currently, there are + # Default + # Australia (historical usage) + # India + # You can create your own file in + # share/timezonesets/. +#extra_float_digits = 1 # min -15, max 3; any value >0 actually + # selects precise output mode +#client_encoding = sql_ascii # actually, defaults to database + # encoding + +# These settings are initialized by initdb, but they can be changed. +lc_messages = 'en_US.utf8' # locale for system error message + # strings +lc_monetary = 'en_US.utf8' # locale for monetary formatting +lc_numeric = 'en_US.utf8' # locale for number formatting +lc_time = 'en_US.utf8' # locale for time formatting + +#icu_validation_level = warning # report ICU locale validation + # errors at the given level + +# default configuration for text search +default_text_search_config = 'pg_catalog.english' + +# - Shared Library Preloading - + +#local_preload_libraries = '' +#session_preload_libraries = '' +#shared_preload_libraries = '' # (change requires restart) +#jit_provider = 'llvmjit' # JIT library to use + +# - Other Defaults - + +#dynamic_library_path = '$libdir' +#gin_fuzzy_search_limit = 0 + + +#------------------------------------------------------------------------------ +# LOCK MANAGEMENT +#------------------------------------------------------------------------------ + +#deadlock_timeout = 1s +#max_locks_per_transaction = 64 # min 10 + # (change requires restart) +#max_pred_locks_per_transaction = 64 # min 10 + # (change requires restart) +#max_pred_locks_per_relation = -2 # negative values mean + # (max_pred_locks_per_transaction + # / -max_pred_locks_per_relation) - 1 +#max_pred_locks_per_page = 2 # min 0 + + +#------------------------------------------------------------------------------ +# VERSION AND PLATFORM COMPATIBILITY +#------------------------------------------------------------------------------ + +# - Previous PostgreSQL Versions - + +#array_nulls = on +#backslash_quote = safe_encoding # on, off, or safe_encoding +#escape_string_warning = on +#lo_compat_privileges = off +#quote_all_identifiers = off +#standard_conforming_strings = on +#synchronize_seqscans = on + +# - Other Platforms and Clients - + +#transform_null_equals = off +#allow_alter_system = on + + +#------------------------------------------------------------------------------ +# ERROR HANDLING +#------------------------------------------------------------------------------ + +#exit_on_error = off # terminate session on any error? +#restart_after_crash = on # reinitialize after backend crash? +#data_sync_retry = off # retry or panic on failure to fsync + # data? + # (change requires restart) +#recovery_init_sync_method = fsync # fsync, syncfs (Linux 5.8+) + + +#------------------------------------------------------------------------------ +# CONFIG FILE INCLUDES +#------------------------------------------------------------------------------ + +# These options allow settings to be loaded from files other than the +# default postgresql.conf. Note that these are directives, not variable +# assignments, so they can usefully be given more than once. + +#include_dir = '...' # include files ending in '.conf' from + # a directory, e.g., 'conf.d' +#include_if_exists = '...' # include file only if it exists +#include = '...' # include file + + +#------------------------------------------------------------------------------ +# CUSTOMIZED OPTIONS +#------------------------------------------------------------------------------ + +# Add settings for extensions here diff --git a/postgres/data/postmaster.opts b/postgres/data/postmaster.opts new file mode 100755 index 0000000..77c8b5d --- /dev/null +++ b/postgres/data/postmaster.opts @@ -0,0 +1 @@ +/usr/local/bin/postgres diff --git a/postgres/data/postmaster.pid b/postgres/data/postmaster.pid new file mode 100755 index 0000000..7c7f202 --- /dev/null +++ b/postgres/data/postmaster.pid @@ -0,0 +1,8 @@ +1 +/var/lib/postgresql/data +1768928065 +5432 +/var/run/postgresql +* + 1179695 0 +ready diff --git a/postgres/init-db.sql b/postgres/init-db.sql new file mode 100755 index 0000000..b4a47ce --- /dev/null +++ b/postgres/init-db.sql @@ -0,0 +1,19 @@ +-- 1. Alkalmazás felhasználó létrehozása (ha még nem létezik) +DO $$ +BEGIN + IF NOT EXISTS (SELECT FROM pg_catalog.pg_user WHERE usename = 'service_finder_app') THEN + CREATE USER service_finder_app WITH PASSWORD 'AppSafePass_2026'; -- Itt a valós jelszavadat használd + END IF; +END +$$; + +-- 2. Adatbázis létrehozása +-- Megjegyzés: A Docker alapértelmezetten létrehozza a POSTGRES_DB-t, +-- de biztosítjuk a létezését és a jogosultságokat. + +GRANT ALL PRIVILEGES ON DATABASE service_finder TO service_finder_app; + +-- 3. Séma jogosultságok beállítása +\c service_finder +GRANT ALL ON SCHEMA public TO service_finder_app; +ALTER SCHEMA public OWNER TO service_finder_app; diff --git a/proxy-manager/data/database.sqlite b/proxy-manager/data/database.sqlite new file mode 100755 index 0000000..f31f638 Binary files /dev/null and b/proxy-manager/data/database.sqlite differ diff --git a/proxy-manager/data/keys.json b/proxy-manager/data/keys.json new file mode 100755 index 0000000..7370370 --- /dev/null +++ b/proxy-manager/data/keys.json @@ -0,0 +1,4 @@ +{ + "key": "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEAiln3gBlb/3Rw3E5ZVwVxuecWHnOHZKGhORwdV+Oq3jNkDrqy\n8P5JHiQIKw5JTPNoxJjFCHUbCBSC1+8Lhf17j9bJKdhDwPzskardROTQacdqCaMY\nz4ouRigyjD/wTaN9JlioWxQIJLNrQbj6B+TPomualNVxlUG0nofeDDGELs0Qyp4r\nOOSXTAoZRxvPEltqpm4zuF9joUqfDmZk5dPMuuZ3Xg13wZEE4xghmz8KRFHU3D98\n5BXdHU/Pjziu3LoasqXC9v6mOUXcSzvs41sK7duOmnGzMsaatbnf0y6Tr4BZGuxR\ndgWJNFxfr22/VZdQeM3EEGPuF4wlyAqH9X3/lQIDAQABAoIBAAOWudjUz5IczyCn\n16FuPrj3yZcYoBZ4Ktp0ZD53ZWNGKf5H0YR21Ca4AI49XKFmXv1aiSHjB8R547r+\nNGpRXPcqNyWiun8zEF/m8r5qwQ09Yv7FAEvB5dlkCYuhzPX2m7R28EcMifmJveqC\nhdnWkZxA9k2OC9g3UBwcoiHm1urv1Q1Y3N/mh0d0BzDfSlvYyhLfPElFw7elrreC\nEk/NWJ0byXLMeJ42F8SgDn3zAPBYAUmkiyiFdY4mV0tM4zT7X+euapACv17FWQWI\niO0Abt0QPemBEQRk+ZxZHSOCkhsZr5IkslmYEC7JXBOlOOusvMdCs9GejdaTqnH1\n9SeFD7ECgYEAxWJ/8l5/kvrDhRBoU44E6hfR+MGkNCQ3Bl2fHpxpDNxfZzuwrQVh\nYGGIvrs+PnIqqWp8MzYZ856YnF5yOTifDrpwkePmwnLGHXeMSo4m3936SqblRSQh\nlGUV5NZxH/UOTfmz9rQ2sG2cQ0qOiR94u6QOoox+1HzhBZ2TtY8eAEMCgYEAs2+p\nB/KUH7owfv7pNSvrmLPCTimfVAT/XODZEjPIp2fNwXBhGKMU10v6Irk6L+jmeOZX\n8sfKzwzi9Ex0w6pXwDca898X+6QOiMib/Q6GG8chROSkvyekuQO7P4/CBw2Z/7X2\nBXr4JD5i6tmIY0C2TlsmRZuht9pKmGQ6uEa4D0cCgYEAqVUyTJwTN+WXHK2RwrSg\ntK8QvCZrlyvGZNimbF1kpdrcobSMgjKOcl/aLz51TJ8myEaJHGn6Y4yYgfVoanyP\nv9PkRNROIFzUZ20q1r8SzJUjZy28nM89W5BI8xOg4viZd/2TDT9Xd43hM71fgHWW\nXuuEfqCnIeWsKeQgVu7bnv8CgYBJel8YfxCDEYaMaqxq9qpKZMobodW53TYI/ZZG\naugvDUXngbJxGU8OfvFWSM14EwJV3dWD+KanNNq3OZvTCC1Y6/fgh6nVhS/ieWvP\nK6RlOZz5DjwcfwpoLQv/kkndA4fde9DcG6gDh3yQOTYtlrFQ0uiQNpP5qq1DTD/z\neBolPwKBgQCozDz+CJgF5h5NfBojg2vrBC3Cutwm0UEgMie1FgluybeWI1oCimk1\nmNG+GmwwewNmOFOnV9WS23qePYZfw05vW+Rk0SdV2Z+Qqey3Ub8n0fPwn+mv8E12\nXu7IH7E6vKdMXUz5GuMFJE7WjTjcv8neEcFWCo0I8AIa5f6EOLCkcw==\n-----END RSA PRIVATE KEY-----", + "pub": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiln3gBlb/3Rw3E5ZVwVx\nuecWHnOHZKGhORwdV+Oq3jNkDrqy8P5JHiQIKw5JTPNoxJjFCHUbCBSC1+8Lhf17\nj9bJKdhDwPzskardROTQacdqCaMYz4ouRigyjD/wTaN9JlioWxQIJLNrQbj6B+TP\nomualNVxlUG0nofeDDGELs0Qyp4rOOSXTAoZRxvPEltqpm4zuF9joUqfDmZk5dPM\nuuZ3Xg13wZEE4xghmz8KRFHU3D985BXdHU/Pjziu3LoasqXC9v6mOUXcSzvs41sK\n7duOmnGzMsaatbnf0y6Tr4BZGuxRdgWJNFxfr22/VZdQeM3EEGPuF4wlyAqH9X3/\nlQIDAQAB\n-----END PUBLIC KEY-----" +} \ No newline at end of file diff --git a/proxy-manager/data/logs/fallback_access.log.1.gz b/proxy-manager/data/logs/fallback_access.log.1.gz new file mode 100755 index 0000000..89b7d1e Binary files /dev/null and b/proxy-manager/data/logs/fallback_access.log.1.gz differ diff --git a/proxy-manager/data/logs/fallback_access.log.2.gz b/proxy-manager/data/logs/fallback_access.log.2.gz new file mode 100755 index 0000000..a1336e2 Binary files /dev/null and b/proxy-manager/data/logs/fallback_access.log.2.gz differ diff --git a/proxy-manager/data/logs/fallback_access.log.3.gz b/proxy-manager/data/logs/fallback_access.log.3.gz new file mode 100755 index 0000000..67d8d30 Binary files /dev/null and b/proxy-manager/data/logs/fallback_access.log.3.gz differ diff --git a/proxy-manager/data/logs/fallback_error.log.1.gz b/proxy-manager/data/logs/fallback_error.log.1.gz new file mode 100755 index 0000000..8941f79 Binary files /dev/null and b/proxy-manager/data/logs/fallback_error.log.1.gz differ diff --git a/proxy-manager/data/logs/fallback_error.log.2.gz b/proxy-manager/data/logs/fallback_error.log.2.gz new file mode 100755 index 0000000..055f46e Binary files /dev/null and b/proxy-manager/data/logs/fallback_error.log.2.gz differ diff --git a/proxy-manager/data/logs/fallback_error.log.3.gz b/proxy-manager/data/logs/fallback_error.log.3.gz new file mode 100755 index 0000000..ea43621 Binary files /dev/null and b/proxy-manager/data/logs/fallback_error.log.3.gz differ diff --git a/proxy-manager/data/logs/letsencrypt-requests_access.log.1.gz b/proxy-manager/data/logs/letsencrypt-requests_access.log.1.gz new file mode 100755 index 0000000..156dd60 Binary files /dev/null and b/proxy-manager/data/logs/letsencrypt-requests_access.log.1.gz differ diff --git a/proxy-manager/data/logs/letsencrypt.log.1 b/proxy-manager/data/logs/letsencrypt.log.1 new file mode 100755 index 0000000..f299258 --- /dev/null +++ b/proxy-manager/data/logs/letsencrypt.log.1 @@ -0,0 +1,1191 @@ +2026-01-27 23:21:29,496:DEBUG:certbot._internal.main:certbot version: 5.1.0 +2026-01-27 23:21:29,496:DEBUG:certbot._internal.main:Location of certbot entry point: /opt/certbot/bin/certbot +2026-01-27 23:21:29,496:DEBUG:certbot._internal.main:Arguments: ['--config', '/etc/letsencrypt.ini', '--work-dir', '/tmp/letsencrypt-lib', '--logs-dir', '/data/logs', '--cert-name', 'npm-18', '--agree-tos', '--authenticator', 'webroot', '-m', 'kincses@gmail.com', '--preferred-challenges', 'http', '--domains', 'terminal.profibot.hu'] +2026-01-27 23:21:29,496:DEBUG:certbot._internal.main:Discovered plugins: PluginsRegistry(PluginEntryPoint#manual,PluginEntryPoint#null,PluginEntryPoint#standalone,PluginEntryPoint#webroot) +2026-01-27 23:21:29,506:DEBUG:certbot._internal.log:Root logging level set at 30 +2026-01-27 23:21:29,507:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2026-01-27 23:21:29,507:DEBUG:certbot._internal.plugins.selection:Single candidate plugin: * webroot +Description: Saves the necessary validation files to a .well-known/acme-challenge/ directory within the nominated webroot path. A separate HTTP server must be running and serving files from the webroot path. HTTP challenge only (wildcards not supported). +Interfaces: Authenticator, Plugin +Entry point: EntryPoint(name='webroot', value='certbot._internal.plugins.webroot:Authenticator', group='certbot.plugins') +Initialized: +Prep: True +2026-01-27 23:21:29,507:DEBUG:certbot._internal.plugins.selection:Selected authenticator and installer None +2026-01-27 23:21:29,507:INFO:certbot._internal.plugins.selection:Plugins selected: Authenticator webroot, Installer None +2026-01-27 23:21:29,545:DEBUG:certbot._internal.main:Picked account: +2026-01-27 23:21:29,545:DEBUG:acme.client:Sending GET request to https://acme-v02.api.letsencrypt.org/directory. +2026-01-27 23:21:29,547:DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org:443 +2026-01-27 23:21:30,017:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "GET /directory HTTP/1.1" 200 1033 +2026-01-27 23:21:30,018:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:21:29 GMT +Content-Type: application/json +Content-Length: 1033 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "131oZhY9-pQ": "https://community.letsencrypt.org/t/adding-random-entries-to-the-directory/33417", + "keyChange": "https://acme-v02.api.letsencrypt.org/acme/key-change", + "meta": { + "caaIdentities": [ + "letsencrypt.org" + ], + "profiles": { + "classic": "https://letsencrypt.org/docs/profiles#classic", + "shortlived": "https://letsencrypt.org/docs/profiles#shortlived", + "tlsclient": "https://letsencrypt.org/docs/profiles#tlsclient", + "tlsserver": "https://letsencrypt.org/docs/profiles#tlsserver" + }, + "termsOfService": "https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf", + "website": "https://letsencrypt.org" + }, + "newAccount": "https://acme-v02.api.letsencrypt.org/acme/new-acct", + "newNonce": "https://acme-v02.api.letsencrypt.org/acme/new-nonce", + "newOrder": "https://acme-v02.api.letsencrypt.org/acme/new-order", + "renewalInfo": "https://acme-v02.api.letsencrypt.org/acme/renewal-info", + "revokeCert": "https://acme-v02.api.letsencrypt.org/acme/revoke-cert" +} +2026-01-27 23:21:30,019:DEBUG:certbot._internal.display.obj:Notifying user: Requesting a certificate for terminal.profibot.hu +2026-01-27 23:21:30,025:DEBUG:acme.client:Requesting fresh nonce +2026-01-27 23:21:30,025:DEBUG:acme.client:Sending HEAD request to https://acme-v02.api.letsencrypt.org/acme/new-nonce. +2026-01-27 23:21:30,179:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "HEAD /acme/new-nonce HTTP/1.1" 200 0 +2026-01-27 23:21:30,180:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:21:30 GMT +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 3aiLGgPYO5BoR4TgHvxXnBATSB4q2rwmts32t1UYCyiF_pvilxw +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + + +2026-01-27 23:21:30,181:DEBUG:acme.client:Storing nonce: 3aiLGgPYO5BoR4TgHvxXnBATSB4q2rwmts32t1UYCyiF_pvilxw +2026-01-27 23:21:30,181:DEBUG:acme.client:JWS payload: +b'{\n "identifiers": [\n {\n "type": "dns",\n "value": "terminal.profibot.hu"\n }\n ]\n}' +2026-01-27 23:21:30,185:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/new-order: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICIzYWlMR2dQWU81Qm9SNFRnSHZ4WG5CQVRTQjRxMnJ3bXRzMzJ0MVVZQ3lpRl9wdmlseHciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL25ldy1vcmRlciJ9", + "signature": "QbAjit56wL0H2WHHg23CwXYDluX742bOmCzYwu6C2z0r9B6QWfE_dCFALWJt_RAu_iFFxX1dFAliZ9IAXVf5Qoe7KSwlxX4yyn0El_K3Vx510KUQkgfxd-3UiESUp40W93Tj5afxUnQU028NZzacFzy_X76oLhON5urQaq0oL4z5jNOmdWFhNXG5d31vhEsxJHsW4wpCzphV1CKgsUJtYqq3PxoSKSnFsKPVvYDIXV_oVjO7dDy35plK27aICvgarNTDG8yotNHCyW4ERZUlNhYCEYQdtBZIs11Ipl99nc6asCMKnuvcWJ5SnoT9fdhqhHdgUWLK86G_nbK4GRbosA", + "payload": "ewogICJpZGVudGlmaWVycyI6IFsKICAgIHsKICAgICAgInR5cGUiOiAiZG5zIiwKICAgICAgInZhbHVlIjogInRlcm1pbmFsLnByb2ZpYm90Lmh1IgogICAgfQogIF0KfQ" +} +2026-01-27 23:21:30,380:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/new-order HTTP/1.1" 201 354 +2026-01-27 23:21:30,381:DEBUG:acme.client:Received response: +HTTP 201 +Server: nginx +Date: Tue, 27 Jan 2026 23:21:30 GMT +Content-Type: application/json +Content-Length: 354 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/474148880876 +Replay-Nonce: 3aiLGgPYq_4kBGLQKFrsQ6n2wz9g6DDqVOEi0a3jkBZq4eadhtI +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "pending", + "expires": "2026-02-03T23:21:30Z", + "identifiers": [ + { + "type": "dns", + "value": "terminal.profibot.hu" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649789209516" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/474148880876" +} +2026-01-27 23:21:30,381:DEBUG:acme.client:Storing nonce: 3aiLGgPYq_4kBGLQKFrsQ6n2wz9g6DDqVOEi0a3jkBZq4eadhtI +2026-01-27 23:21:30,382:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:21:30,385:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649789209516: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICIzYWlMR2dQWXFfNGtCR0xRS0Zyc1E2bjJ3ejlnNkREcVZPRWkwYTNqa0JacTRlYWRodEkiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg5MjA5NTE2In0", + "signature": "buqqRxzXl5NkCVUTV72nUD1nDaM7eauJ7Vhwv1BytZHBQ8tGGkGB9rUe8NppcFOB7NU6rmysQhbOH7CIFbDn5mofzvA9U1S6eCZ8vcZ5LECft2YNjiMnxJwHS4rRC_Owa6n2b2vBGT0xWGNEb-4PYi-Mno1i3FRfLrjiWbhrdjljdk0DSM-dShvljOqvfr45D9PQL5tSxPKfkm1HKPkVKjanx1G_LLVsAftPlxLWeO2ReW2AQ6m9CjijDe-uxmtSzU6AXpAFRkhYowobM0yC7fWEZiiLXOunjHE7UmpLd223smhQvzGROc11iTiYYK6kjJKPhkxYa7S_jLQ9mzQ9tw", + "payload": "" +} +2026-01-27 23:21:30,543:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649789209516 HTTP/1.1" 200 828 +2026-01-27 23:21:30,544:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:21:30 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: _aMw-OblYLjvmy1AUbA3dSkFofJ4s6n_e1nIy6TTPuvzpFKUpOk +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:21:30Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/xflWag", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/zVloSA", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + } + ] +} +2026-01-27 23:21:30,544:DEBUG:acme.client:Storing nonce: _aMw-OblYLjvmy1AUbA3dSkFofJ4s6n_e1nIy6TTPuvzpFKUpOk +2026-01-27 23:21:30,545:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw', 'status': 'pending', 'token': 'ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0'} +2026-01-27 23:21:30,545:INFO:certbot._internal.auth_handler:Performing the following challenges: +2026-01-27 23:21:30,546:INFO:certbot._internal.auth_handler:http-01 challenge for terminal.profibot.hu +2026-01-27 23:21:30,546:INFO:certbot._internal.plugins.webroot:Using the webroot path /data/letsencrypt-acme-challenge for all unmatched domains. +2026-01-27 23:21:30,546:DEBUG:certbot._internal.plugins.webroot:Creating root challenges validation dir at /data/letsencrypt-acme-challenge/.well-known/acme-challenge +2026-01-27 23:21:30,548:DEBUG:certbot._internal.plugins.webroot:Attempting to save validation to /data/letsencrypt-acme-challenge/.well-known/acme-challenge/ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0 +2026-01-27 23:21:30,549:DEBUG:acme.client:JWS payload: +b'{}' +2026-01-27 23:21:30,552:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/zVloSA: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJfYU13LU9ibFlManZteTFBVWJBM2RTa0ZvZko0czZuX2Uxbkl5NlRUUHV2enBGS1VwT2siLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NoYWxsLzI5MDY0MzgxNzYvNjQ5Nzg5MjA5NTE2L3pWbG9TQSJ9", + "signature": "HJz-rVSM940ALN668WpB-3zl1BJL8GRZRMDkCCYFZEBt6od59oPpuPeIYMnX-vgAD10syXaP6rJcKauQJ6R5ReHJhdIVYlDdN6kYvp6ArRV7wbmzwrmr9fz36LuVy9rv9wtbJdc7K_43gzu6AhXA6FQt5Nz4YgP1QAdmn6cy8ncvlsax37CAOcrJ0JUqXuUIxGYqUbbUtqMDKvhIidBIPk77fm_rS9Mld_iswjai-aG7dHporTJqjwHnsHgcIf-ldHO1jK-MMfYJkGVlyb6wIzMn_yGYMXalg2Sxt8Tuf_E96DmRgsPKfG4-vlqefZ5U7b0q9wIFi6esOhRpQSPf8w", + "payload": "e30" +} +2026-01-27 23:21:30,713:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/chall/2906438176/649789209516/zVloSA HTTP/1.1" 200 195 +2026-01-27 23:21:30,714:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:21:30 GMT +Content-Type: application/json +Content-Length: 195 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="up" +Location: https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/zVloSA +Replay-Nonce: 3aiLGgPYCP6u6gBiSW8RA1Q44bJnJC_pNecN3tmBJJvyInxyXCo +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/zVloSA", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" +} +2026-01-27 23:21:30,714:DEBUG:acme.client:Storing nonce: 3aiLGgPYCP6u6gBiSW8RA1Q44bJnJC_pNecN3tmBJJvyInxyXCo +2026-01-27 23:21:30,715:INFO:certbot._internal.auth_handler:Waiting for verification... +2026-01-27 23:21:31,715:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:21:31,719:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649789209516: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICIzYWlMR2dQWUNQNnU2Z0JpU1c4UkExUTQ0YkpuSkNfcE5lY04zdG1CSkp2eUlueHlYQ28iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg5MjA5NTE2In0", + "signature": "Y_cGEQ8EcO3_3d_j25yt0GuBa5f7ppr5h3CIzszYhYvdRpCdejXEAq5pfJJRNKsdi6sANqbU9-4XmaiThJM0XpA3AmBuOQ9JSwX4MPCF_bHyjwgUxbWOGfKfFu0dlL1uwP481Et2AApd77PcyfVbK8hHwBuzHKwFikG8x22TfoUUvf26wrBiqVdsLAqFGrvfPaYUe1mdWa7YgqthZbEsV1d1in2FZ9XqCKL8BD2M8VOaKIuPIz0UzsTgdUTA23kK5Q043Vzhbcx_fUoQAA7X3Sb6AhR8dvaa4C9lDNHLdn2yCLa-5VmziV9kWvHlAfSZ0AL8DbmUO_ecyNkrb56cjg", + "payload": "" +} +2026-01-27 23:21:31,875:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649789209516 HTTP/1.1" 200 828 +2026-01-27 23:21:31,876:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:21:31 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 3aiLGgPYEs63vQ617WQDrbOtxZDXUOAFadza5uUea3E8_g5fJSM +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:21:30Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/xflWag", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/zVloSA", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + } + ] +} +2026-01-27 23:21:31,876:DEBUG:acme.client:Storing nonce: 3aiLGgPYEs63vQ617WQDrbOtxZDXUOAFadza5uUea3E8_g5fJSM +2026-01-27 23:21:31,877:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw', 'status': 'pending', 'token': 'ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0'} +2026-01-27 23:21:34,877:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:21:34,881:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649789209516: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICIzYWlMR2dQWUVzNjN2UTYxN1dRRHJiT3R4WkRYVU9BRmFkemE1dVVlYTNFOF9nNWZKU00iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg5MjA5NTE2In0", + "signature": "dB80WIMmD98lB_3MQJNQnG3OWvPNMyxK1IbI9t7ZU6Fx7DqVjeoHXsU5OVZsJCJsBIqSzNVciD2KowHRuPR1CZtmyUtb1IeyDaYAvtVBoq_gWkFkeCZ9tYs2hosh0ALbM1TlEYpxcI9QAt6BnfXqxfQK1chdVgeTeaEk03jCANrBctse37kxYnKzs-02MB4gZ_wfgMvOlY8_vhnOCpQNo8nI3DGSuKzRO6KnBhZRGw-gUCaQuuXFm4Gf58S-81I5b0kEvZm3uDvU1QTblduUgcqJvqzh4UMq2FspxvEHg_EDqqtW93zjpPKUvf46XHXd8m6cis6RK612cMbAQ33drg", + "payload": "" +} +2026-01-27 23:21:35,039:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649789209516 HTTP/1.1" 200 828 +2026-01-27 23:21:35,040:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:21:34 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: _aMw-OblQUSdvU6Wi_a06bKtFOSdoawPOEwJLCE7qpqFC81JtoU +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:21:30Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/xflWag", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/zVloSA", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + } + ] +} +2026-01-27 23:21:35,040:DEBUG:acme.client:Storing nonce: _aMw-OblQUSdvU6Wi_a06bKtFOSdoawPOEwJLCE7qpqFC81JtoU +2026-01-27 23:21:35,041:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw', 'status': 'pending', 'token': 'ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0'} +2026-01-27 23:21:38,042:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:21:38,044:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649789209516: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJfYU13LU9ibFFVU2R2VTZXaV9hMDZiS3RGT1Nkb2F3UE9Fd0pMQ0U3cXBxRkM4MUp0b1UiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg5MjA5NTE2In0", + "signature": "akaXpiAdfmOeavQartHjTLByD8tdN2ORj_9tagTI82E2yStZz5t0ojMAYm1ReKFmYtVW3J--MbMbzVMyrMkFh1-biz9dNpOvOLo65hbmbaBM9J2ibIb5ld2jl7zmX63Q_WHwB2gzMtWTyvR5WTwUpYFKaRChEETPBQLCXMPIFn1InjBTAtKjEvZbt3w3nOCx3EtJURnDjMNvr2qCrCUKAV3K2A-I2_80p9oEc0FsBGEqdw-P8XgZtUFLaWRAuQ5AzKRBtlTv0LuNZZ9vY-jBjcMm2jqlWhFE0BJNdJt4mzVnpc2rUqvl7KX-php5y5ywBGubHJRqXrTHrpFxCoRQTg", + "payload": "" +} +2026-01-27 23:21:38,213:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649789209516 HTTP/1.1" 200 828 +2026-01-27 23:21:38,214:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:21:38 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: _aMw-OblQmNyi_QgLMYT3p18mMpkdMkcPx3DDJCOy5406dHtv0w +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:21:30Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/xflWag", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/zVloSA", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + } + ] +} +2026-01-27 23:21:38,214:DEBUG:acme.client:Storing nonce: _aMw-OblQmNyi_QgLMYT3p18mMpkdMkcPx3DDJCOy5406dHtv0w +2026-01-27 23:21:38,215:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw', 'status': 'pending', 'token': 'ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0'} +2026-01-27 23:21:41,216:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:21:41,219:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649789209516: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJfYU13LU9ibFFtTnlpX1FnTE1ZVDNwMThtTXBrZE1rY1B4M0RESkNPeTU0MDZkSHR2MHciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg5MjA5NTE2In0", + "signature": "TkVQYc3_2bFG3vtdHC1sIKh54shQkjl3yNOuod8rk4Rp8SN9bflqj4yUjasa5rnAqDdBI4x-8fpttYWaaJFOw2Lzt0lYfpL0nyGLWXAJXGcUHeYmDkx7ZKo3iyJba50eQfTfqsZs6F8WLgJaOdZB45zav7bBdLN89rfaG6udD5cxbmnZBANTXSHcgHaYBrN9yVDiP8jLNfq1sY30oHNRIn1mhFpTlhhWpk9Kg0LStVHIP3spPw33zL9SRxLg03NH0X2kzImRr8fO12DJJkLSrR7zGz8VezB1DvPtddKgFzzQ_TvWGrqkzppg5gRXju7d79oFAbBYgggDmwu7mfDUdg", + "payload": "" +} +2026-01-27 23:21:41,374:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649789209516 HTTP/1.1" 200 828 +2026-01-27 23:21:41,375:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:21:41 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: _aMw-OblSWBwQypm3iwU3Bv0EYucnpUbidrMYo97E1TTyMcw0iw +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:21:30Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/zVloSA", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/xflWag", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + } + ] +} +2026-01-27 23:21:41,375:DEBUG:acme.client:Storing nonce: _aMw-OblSWBwQypm3iwU3Bv0EYucnpUbidrMYo97E1TTyMcw0iw +2026-01-27 23:21:41,376:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw', 'status': 'pending', 'token': 'ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0'} +2026-01-27 23:21:44,377:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:21:44,381:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649789209516: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJfYU13LU9ibFNXQndReXBtM2l3VTNCdjBFWXVjbnBVYmlkck1Zbzk3RTFUVHlNY3cwaXciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg5MjA5NTE2In0", + "signature": "kXTiy99vdls-pNm6gvFA9lC6FbQnlsw6HM5lbvE0OOq0gn3psmDtWy_153Gq6tSoofzw234wpsFZQZGNXOuzYpa35hzMW5VrOPe4RcNct46mPw0ugcbE0rGiKNvcSxTVq_pf34Lmtgz_AFvieVoaFlUjKKle6fxL95fTD4DBR6lRAC6IwKLF1tUGtk_4PNFwjTQQxFew8VA9BWlqHHzkjZhBo-YNz391PlbqYAbPkZyFoy6wupxmyjVN5daZCdCSPYGvRPVKAd3FP8B3nYY-zgRsmDYvitKF5pRbnu4lrvlPfaVl1KfvM4xNiSWKcFBdcC3lz6qWb-S4USWwzMHn3w", + "payload": "" +} +2026-01-27 23:21:44,538:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649789209516 HTTP/1.1" 200 828 +2026-01-27 23:21:44,539:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:21:44 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: _aMw-OblCLbPDQ2i3Lh-NOjWHna0fAcIW3_9NiUSMYC9uHwBIKk +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:21:30Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/xflWag", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/zVloSA", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + } + ] +} +2026-01-27 23:21:44,539:DEBUG:acme.client:Storing nonce: _aMw-OblCLbPDQ2i3Lh-NOjWHna0fAcIW3_9NiUSMYC9uHwBIKk +2026-01-27 23:21:44,540:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw', 'status': 'pending', 'token': 'ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0'} +2026-01-27 23:21:47,541:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:21:47,545:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649789209516: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJfYU13LU9ibENMYlBEUTJpM0xoLU5PaldIbmEwZkFjSVczXzlOaVVTTVlDOXVId0JJS2siLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg5MjA5NTE2In0", + "signature": "F79DPRze3jmJ1tVzl57CVxj6-qwLXoUwIKuAqK6DcdruBzjE1e452K3gKR3kMjGUnUk3KgQkrI1ktu_YGQFzgAcFegeuI4p37t73ujckNPaKP0Z-sI0nIHCZCeneXlg48cgm3RJ_uGFys3uvolQKQUxwrzvyjVAbcvBD982A56LFns5DUcAS5_08VwDgumxtnwcBsOr74zrp-g8EvWLnT8Sr_2KNJz5PIMkPX-Xn80g2C7MC5djjf9FaLj6jvSJkScM0DNldBqnW9gD8TQJnfSNspkxvfve5v6mgvoW6zoB99D7u_W0stQX3ciTK5B0iPCIiM_cCW8AGJL78FNnnGQ", + "payload": "" +} +2026-01-27 23:21:47,701:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649789209516 HTTP/1.1" 200 828 +2026-01-27 23:21:47,702:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:21:47 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 3aiLGgPYOTlcvSCavITWRXx28auLj2QeEi78syvdZYuHs0q5I9M +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:21:30Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/zVloSA", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/xflWag", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + } + ] +} +2026-01-27 23:21:47,702:DEBUG:acme.client:Storing nonce: 3aiLGgPYOTlcvSCavITWRXx28auLj2QeEi78syvdZYuHs0q5I9M +2026-01-27 23:21:47,703:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw', 'status': 'pending', 'token': 'ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0'} +2026-01-27 23:21:50,704:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:21:50,708:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649789209516: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICIzYWlMR2dQWU9UbGN2U0NhdklUV1JYeDI4YXVMajJRZUVpNzhzeXZkWll1SHMwcTVJOU0iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg5MjA5NTE2In0", + "signature": "Ih1c5NIekpz-X3XIJ4ulz2nuEKhzR_tCbZPUSj28kd5Ur_4I9iu9GPo4IuWZuDQmA_3FtDeeYSGWmMfetYLkUqoqyXmY67aJFT_kDq47T1r0evWWyruQWTbf3mBCAsKI7Vcf-hzOQHFUbcWZ0h-Rn3GoCNznDXLgQDa_nZcxJGuFTpp2emqW0AwcJKxSN0ZGaE2D9N-nrw7Qhvsp7h0zIWkg5jyyQhePvp3VAA0TY-RmcYxlCDBExgFM5b9gSAu4foPuI0w73QOvPCo6CSNio5_dF75zF2iFXtOQnSqkDy1enwWY_hbV9rnnUbdl-UPMlBgGjQlOMWHvTU7VAXOn-Q", + "payload": "" +} +2026-01-27 23:21:50,865:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649789209516 HTTP/1.1" 200 828 +2026-01-27 23:21:50,866:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:21:50 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: _aMw-Oblnl6rkvoR2_aiOp4CjWm7kdg3m8dqxFAscrgjItmq-wM +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:21:30Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/zVloSA", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/xflWag", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + } + ] +} +2026-01-27 23:21:50,866:DEBUG:acme.client:Storing nonce: _aMw-Oblnl6rkvoR2_aiOp4CjWm7kdg3m8dqxFAscrgjItmq-wM +2026-01-27 23:21:50,867:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw', 'status': 'pending', 'token': 'ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0'} +2026-01-27 23:21:53,868:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:21:53,871:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649789209516: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJfYU13LU9ibG5sNnJrdm9SMl9haU9wNENqV203a2RnM204ZHF4RkFzY3Jnakl0bXEtd00iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg5MjA5NTE2In0", + "signature": "EPnxijgDQ25-LBa2Zw7OLUvNk3atiPVQzcNMCS4Z3HzYxD_4dz7AoSXr383Fnnl-wJtdALA8nbndu7c41nnjfYTgE7ApdhTho_-r5sal60DGYr0KxgByTIq_zex348m1dEdpf6qrTF_wXORMEBticBwgcjv65kvCSMooOHSpBEdzIjP3Yav49nQnQRH0sUfcPwUyzStrGDuylDSCgE9s-_MPBsbVYhixMNg8sy9tZpzHqBA6HfllbeUaZbIteSPRCjxk7JQIFQJKzWLrsCSHD_PjfMbUb1DZzRLsYsKfO31YyQCs_mD3GxT9mrYKVRUa2qbXTbY2zp7PPfGLJsBGVg", + "payload": "" +} +2026-01-27 23:21:54,028:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649789209516 HTTP/1.1" 200 828 +2026-01-27 23:21:54,029:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:21:53 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: _aMw-OblWzjPRDO3bBQqTAvdd6G35b5AgXcLYEaGBU2AYjBkQkw +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:21:30Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/zVloSA", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/xflWag", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + } + ] +} +2026-01-27 23:21:54,029:DEBUG:acme.client:Storing nonce: _aMw-OblWzjPRDO3bBQqTAvdd6G35b5AgXcLYEaGBU2AYjBkQkw +2026-01-27 23:21:54,030:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw', 'status': 'pending', 'token': 'ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0'} +2026-01-27 23:21:57,031:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:21:57,035:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649789209516: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJfYU13LU9ibFd6alBSRE8zYkJRcVRBdmRkNkczNWI1QWdYY0xZRWFHQlUyQVlqQmtRa3ciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg5MjA5NTE2In0", + "signature": "C4ybK0Yt3aZGIqgBR74Cq5wHPE5hmgo5SI796nW4N2JHNAsT2QJkHscfLPytl5vaIJRTFBwwGu86_lvlsvv4wfDF8MnOc_9N7ItbuGk52a1i_lACk_76cAxlOYWLexyQSNgkZjMwqgI9KD3zWi2wmmGakC0FFJuQouGNn-dNu3hG6jGeG1Q3_-J4czi4BKXl8_JE3MWJ61wvYqTa9hGD6GsaxuxxoDs6RDWWB-mUEudHLz77auSqY0Syfb5nWzMBq4dUHX2jmbvuT1F-IVlUX9ZVJU1sRb5rupkRmyBBCzbxxhR4KIaCKndHoNUbgN6duS0d3_NDrJW0FLS2c1u4jw", + "payload": "" +} +2026-01-27 23:21:57,190:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649789209516 HTTP/1.1" 200 828 +2026-01-27 23:21:57,191:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:21:57 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 3aiLGgPYArQTOBWb8pk5d1gieDjSA4hXJpOu8l5KdgyT66rdeKg +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:21:30Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/xflWag", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/zVloSA", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + } + ] +} +2026-01-27 23:21:57,191:DEBUG:acme.client:Storing nonce: 3aiLGgPYArQTOBWb8pk5d1gieDjSA4hXJpOu8l5KdgyT66rdeKg +2026-01-27 23:21:57,192:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw', 'status': 'pending', 'token': 'ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0'} +2026-01-27 23:22:00,193:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:22:00,196:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649789209516: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICIzYWlMR2dQWUFyUVRPQldiOHBrNWQxZ2llRGpTQTRoWEpwT3U4bDVLZGd5VDY2cmRlS2ciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg5MjA5NTE2In0", + "signature": "dDMfhORj0hh4HNGwXchsoAK4a3REZn_8uU8NwGKvAwh_COjHxfaK3ZLDzCQVybqOI-Uru0q4KtT1agFxPlbS9AmyLy1cxL0ZqeFVx8zYf8GkvT1rjhZrvn4WjWHuJiyM54t7bt2eIPHPkP1DBqlJ8bRqsoU2pCjW5ehkH3SJaua7ewLyDMF1gPwdcANVfDcKwh7GBoYFZjHKJKYGuW21ZXNXgTpFIvlMWpa5XvqD_-Y1EFhIDogDRGZk7e_jTvtYFy8-Otw46abrvisUSXsP4NDQIPiQC34DG1ZZZaLE0i7070gZQlJC98jHt6s0SlidDaFI3jNMDZa1v3E6nYQlvQ", + "payload": "" +} +2026-01-27 23:22:00,351:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649789209516 HTTP/1.1" 200 828 +2026-01-27 23:22:00,351:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:22:00 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: _aMw-OblOxPq4g4hM-82xq3vjzOtQqQwNv-1eobsdxuVpadSKgc +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:21:30Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/xflWag", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/zVloSA", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + } + ] +} +2026-01-27 23:22:00,352:DEBUG:acme.client:Storing nonce: _aMw-OblOxPq4g4hM-82xq3vjzOtQqQwNv-1eobsdxuVpadSKgc +2026-01-27 23:22:00,352:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw', 'status': 'pending', 'token': 'ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0'} +2026-01-27 23:22:03,352:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:22:03,353:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649789209516: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJfYU13LU9ibE94UHE0ZzRoTS04MnhxM3Zqek90UXFRd052LTFlb2JzZHh1VnBhZFNLZ2MiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg5MjA5NTE2In0", + "signature": "jZqatY0tCqGh8NVG1jkVxnaKPuQylIrg7ztuBfCz0wClao1Kfd6373HC6g3BxXSrGf5rJvIPoJgnd0p3w8FjeZUDpq0x0sgt0kTeTHBO1m3bRC6_ZJujedM0Jnpyuuh94Y5UwKFUUGmHBsZSAn6Schoi7lXKbPI4GJaNZvqWMNCOqV4iHSWs25SoTq9mfRR2RM0EWDwOk49vtV4HqeuhinEjGz7xcNDr9GtXjoK2cHITnxoTI15KQPpKo9IgFArwj6if_6_9KgvqsVKBq9vbS9gbFMAcYvp3IQAeHXx8ZSdhk0wKSkome2ihQ_lhgypvnODJBqkq5r59bSuLFBvzbg", + "payload": "" +} +2026-01-27 23:22:03,520:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649789209516 HTTP/1.1" 200 828 +2026-01-27 23:22:03,521:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:22:03 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: _aMw-OblZ8NmBiyOgFd8_YSzerxyteciRujSG7KRcPzdxItZ_4A +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:21:30Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/xflWag", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/zVloSA", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + } + ] +} +2026-01-27 23:22:03,521:DEBUG:acme.client:Storing nonce: _aMw-OblZ8NmBiyOgFd8_YSzerxyteciRujSG7KRcPzdxItZ_4A +2026-01-27 23:22:03,522:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw', 'status': 'pending', 'token': 'ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0'} +2026-01-27 23:22:06,522:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:22:06,525:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649789209516: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJfYU13LU9ibFo4Tm1CaXlPZ0ZkOF9ZU3plcnh5dGVjaVJ1alNHN0tSY1B6ZHhJdFpfNEEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg5MjA5NTE2In0", + "signature": "fh8YrlCfWDmoyZ9fbN7GYuNq_WvW60fNyEaYf_YVSfqHHtL_7pLU8HoLgiOeWfr6ytxoi_lb0sMRXuwK2oaafieKs0q_HaN1vXYM1P4OFYwghh5fjMBSo_QMKBCrRzjCAxeZIn3ALNfAavwoJjV47FncvD3Qe7vaUmLURM54XgZ40NrZJ5tN_nFSjHtWHOhpIF8_J1N9EMXbjmbzXbWD2g0wLA-mUfOXo2z8tsPtjgZ5nG_FPV07tCv7QN6RmPaV0RdWRazGXipmGcc2eey8OFjVVQnO925hReZJNmSIuhZ4ZAbPHjCPjIDn6dYboPVkBbREn-8paIgfeQlG0bV83w", + "payload": "" +} +2026-01-27 23:22:06,687:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649789209516 HTTP/1.1" 200 828 +2026-01-27 23:22:06,688:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:22:06 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: _aMw-ObloAzYM_eEW6CMYJmlDzNEH4enQDkIAZbb5SRmw4dIBIY +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:21:30Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/zVloSA", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/xflWag", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + } + ] +} +2026-01-27 23:22:06,689:DEBUG:acme.client:Storing nonce: _aMw-ObloAzYM_eEW6CMYJmlDzNEH4enQDkIAZbb5SRmw4dIBIY +2026-01-27 23:22:06,689:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw', 'status': 'pending', 'token': 'ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0'} +2026-01-27 23:22:09,690:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:22:09,692:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649789209516: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJfYU13LU9ibG9BellNX2VFVzZDTVlKbWxEek5FSDRlblFEa0lBWmJiNVNSbXc0ZElCSVkiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg5MjA5NTE2In0", + "signature": "Ipqqpxns5pwGBAj_jJlGbZl7sKb-m2SQmh-J__7wicS6VGoCyAsW94GCPkG8TerRg_KiLK_4Q877rioi4fo8PbArzcwNK8i5VngzUPE05tDXCFv8b7H7HAkR5-tAopMv7JWIxh9WxEHvi_yrAjmaF3cUjA2v_DxtzWmKexxUgxnG7OuoThUvO1cNGM5IRIeUayHYsQalUqFqMEmsZJ8ovBmc0ytXXUohzWQRYDPC08Sy5vKaoM5TkxXtGrG73kGBq48OeC_x5Nq2QFQBIoKBDrsB9xAV97S1Er0jos850KXq5L5gHsK1t1q_fPcQ9lGo7eIHOECp0j0eRGs1TSafWQ", + "payload": "" +} +2026-01-27 23:22:09,848:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649789209516 HTTP/1.1" 200 828 +2026-01-27 23:22:09,849:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:22:09 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: _aMw-OblG1Ng92-lnXXDyjc_6m-Q_VNuO7wb1HvkJEyTWZ1geGM +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:21:30Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/zVloSA", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/xflWag", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw", + "status": "pending", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0" + } + ] +} +2026-01-27 23:22:09,849:DEBUG:acme.client:Storing nonce: _aMw-OblG1Ng92-lnXXDyjc_6m-Q_VNuO7wb1HvkJEyTWZ1geGM +2026-01-27 23:22:09,850:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/dbBOjw', 'status': 'pending', 'token': 'ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0'} +2026-01-27 23:22:12,851:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:22:12,854:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649789209516: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJfYU13LU9ibEcxTmc5Mi1sblhYRHlqY182bS1RX1ZOdU83d2IxSHZrSkV5VFdaMWdlR00iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg5MjA5NTE2In0", + "signature": "RbMgfJr64IHfq2-8R5Oufj2RpREEZiFhplhUMDdz7izf5ZkcFAmdcOx9nkcM6ICJJvvgdEwu9eaoyQrdo9gM67BNkYUufYCmegJYk4LLkneluC5aveUoUkcazD7sQlcjE6rLd7Zpm3IgDJnR41CewRDc7xmfeJ_tBD1ylgo4jivrenLZuhcFTOf4BQiDQtrQfJ0X4uw-uVReo-XuimEkfeQxj0h9K-aXe9nKjmeGdbvlo3R4pMKlnlbI0QJk08RiiWQXFENioXjU4qIHge8Gk_evXBGTaTXR5JjybScXdyZuJ5c_SCY0URoBncUwLeJxIUit-AbXSpQ1QyZz1_STyA", + "payload": "" +} +2026-01-27 23:22:13,011:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649789209516 HTTP/1.1" 200 783 +2026-01-27 23:22:13,012:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:22:12 GMT +Content-Type: application/json +Content-Length: 783 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: _aMw-OblXcyhMnaISAZLiAt6LH0rk-pc-qLFMnhMAQUzJJn8hXo +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "valid", + "expires": "2026-02-26T23:22:11Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649789209516/zVloSA", + "status": "valid", + "validated": "2026-01-27T23:21:30Z", + "token": "ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0", + "validationRecord": [ + { + "url": "http://terminal.profibot.hu/.well-known/acme-challenge/ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0", + "hostname": "terminal.profibot.hu", + "port": "80", + "addressesResolved": [ + "91.82.215.191" + ], + "addressUsed": "91.82.215.191" + } + ] + } + ] +} +2026-01-27 23:22:13,012:DEBUG:acme.client:Storing nonce: _aMw-OblXcyhMnaISAZLiAt6LH0rk-pc-qLFMnhMAQUzJJn8hXo +2026-01-27 23:22:13,013:DEBUG:certbot._internal.error_handler:Calling registered functions +2026-01-27 23:22:13,013:INFO:certbot._internal.auth_handler:Cleaning up challenges +2026-01-27 23:22:13,013:DEBUG:certbot._internal.plugins.webroot:Removing /data/letsencrypt-acme-challenge/.well-known/acme-challenge/ADcwHuUGpr9l6mmvyXLyahhQ8-xBQ25cVpsfeoQwDa0 +2026-01-27 23:22:13,014:DEBUG:certbot._internal.plugins.webroot:All challenges cleaned up +2026-01-27 23:22:13,015:DEBUG:certbot._internal.client:CSR: CSR(file=None, data=b'-----BEGIN CERTIFICATE REQUEST-----\nMIIBKjCBsQIBADAAMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEEoVjEbEuBSGcEzFv\nJ5z/39X14vJk7ASsC7+KB3ECIqjRZjuZmrzJDNPEFKLqtcv4sWAvDJpXb6NcQLQU\nmgGAi0c5O1D+jHPyFfifc1t0O8wRGE3t2vQw6BTZKf/Cw2V+oDIwMAYJKoZIhvcN\nAQkOMSMwITAfBgNVHREEGDAWghR0ZXJtaW5hbC5wcm9maWJvdC5odTAKBggqhkjO\nPQQDAgNoADBlAjEA9JEIgrRD22WF578iTlr6SHhOU7eUx4DlbWVlmC8u+JbDn2uI\nNbPnXhIe+pmtrLcfAjBVMNj9s4vT0sYYzfHSfnZ432DNhvNHaeCFD2DwTbZGvA5k\nY2D99u+A2UQX5X196JQ=\n-----END CERTIFICATE REQUEST-----\n', form='pem') +2026-01-27 23:22:13,015:DEBUG:certbot._internal.client:Will poll for certificate issuance until 2026-01-27 23:23:43.015861 +2026-01-27 23:22:13,016:DEBUG:acme.client:JWS payload: +b'{\n "csr": "MIIBKjCBsQIBADAAMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEEoVjEbEuBSGcEzFvJ5z_39X14vJk7ASsC7-KB3ECIqjRZjuZmrzJDNPEFKLqtcv4sWAvDJpXb6NcQLQUmgGAi0c5O1D-jHPyFfifc1t0O8wRGE3t2vQw6BTZKf_Cw2V-oDIwMAYJKoZIhvcNAQkOMSMwITAfBgNVHREEGDAWghR0ZXJtaW5hbC5wcm9maWJvdC5odTAKBggqhkjOPQQDAgNoADBlAjEA9JEIgrRD22WF578iTlr6SHhOU7eUx4DlbWVlmC8u-JbDn2uINbPnXhIe-pmtrLcfAjBVMNj9s4vT0sYYzfHSfnZ432DNhvNHaeCFD2DwTbZGvA5kY2D99u-A2UQX5X196JQ"\n}' +2026-01-27 23:22:13,020:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/474148880876: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJfYU13LU9ibFhjeWhNbmFJU0FaTGlBdDZMSDByay1wYy1xTEZNbmhNQVFVekpKbjhoWG8iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2ZpbmFsaXplLzI5MDY0MzgxNzYvNDc0MTQ4ODgwODc2In0", + "signature": "HrxR-fbzUmQ7jtMzLXovGUKn13iWPd-nSBGdMrVv3DcQEdbze7GAu68eXgYQRmzGBqQzXQltGZQjNGpPqYbCaNSIsnjVWZZ12o9nMbxH96csw-CJjqgGLb45BmzbqiJmKAUzB0nPPGaEprMti_lWcjlMirGJwxWc8UlrbCRcj8uYELXt2fklryll7f5M62h7252k1M_waCu8QmsNwoc8brLcHctQtTtlm43lkrR_KU8xhQkUYYzUCZ_hCFoHetPYAh9eUCX996qs9zQb27HnWoNrFNQYX3RZEOkW3NRDZwc32RFOqw6__PZxsoR5Rsv1xkGKEFvlj3-V7WwE9eZbyw", + "payload": "ewogICJjc3IiOiAiTUlJQktqQ0JzUUlCQURBQU1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFRW9WakViRXVCU0djRXpGdko1el8zOVgxNHZKazdBU3NDNy1LQjNFQ0lxalJaanVabXJ6SkROUEVGS0xxdGN2NHNXQXZESnBYYjZOY1FMUVVtZ0dBaTBjNU8xRC1qSFB5RmZpZmMxdDBPOHdSR0UzdDJ2UXc2QlRaS2ZfQ3cyVi1vREl3TUFZSktvWklodmNOQVFrT01TTXdJVEFmQmdOVkhSRUVHREFXZ2hSMFpYSnRhVzVoYkM1d2NtOW1hV0p2ZEM1b2RUQUtCZ2dxaGtqT1BRUURBZ05vQURCbEFqRUE5SkVJZ3JSRDIyV0Y1NzhpVGxyNlNIaE9VN2VVeDREbGJXVmxtQzh1LUpiRG4ydUlOYlBuWGhJZS1wbXRyTGNmQWpCVk1OajlzNHZUMHNZWXpmSFNmblo0MzJETmh2TkhhZUNGRDJEd1RiWkd2QTVrWTJEOTl1LUEyVVFYNVgxOTZKUSIKfQ" +} +2026-01-27 23:22:14,104:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/finalize/2906438176/474148880876 HTTP/1.1" 200 456 +2026-01-27 23:22:14,105:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:22:14 GMT +Content-Type: application/json +Content-Length: 456 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/474148880876 +Replay-Nonce: _aMw-OblADPpq7DBK3TVA2mVx4wpN23zJY769C_yfK-UAIsTtNY +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "valid", + "expires": "2026-02-03T23:21:30Z", + "identifiers": [ + { + "type": "dns", + "value": "terminal.profibot.hu" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649789209516" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/474148880876", + "certificate": "https://acme-v02.api.letsencrypt.org/acme/cert/050c8ad7008ac7c7bfe67ccd2c4b7973741f" +} +2026-01-27 23:22:14,105:DEBUG:acme.client:Storing nonce: _aMw-OblADPpq7DBK3TVA2mVx4wpN23zJY769C_yfK-UAIsTtNY +2026-01-27 23:22:15,106:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:22:15,109:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/order/2906438176/474148880876: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJfYU13LU9ibEFEUHBxN0RCSzNUVkEybVZ4NHdwTjIzekpZNzY5Q195ZkstVUFJc1R0TlkiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL29yZGVyLzI5MDY0MzgxNzYvNDc0MTQ4ODgwODc2In0", + "signature": "NR-ejtUd_uhwGD6Ivm7D-WJ63dHCK-wXSNbXq0m3NLNv9Hph78or4ceFKZ3gHZ7aYE9pDzwmNYv8IYp7z7oREk73ql1jOczpscfP_9vCNNQ5pxzdPjdm279VaNk6YZV_AKisnngaq9p06hQbcAulJ1YCqDDrKrEuGFmKnb0gF1sMqepiO1nbIuLf6qwpRDrHl-1HZ8kfoEj6o9EcjZ52C3f8BLvtn2q2Sq_yR9jkC3zNX6ZzPaZJ-Uwa3bMQTPVTppcuO5VmIOc22YmDiK7uuEo3l_9iwdSKuXTuYmQYRCUszE_KFUl3lHVB-E5uc1OIGOGhC-zXvqilkn5x9Nw3ag", + "payload": "" +} +2026-01-27 23:22:15,265:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/order/2906438176/474148880876 HTTP/1.1" 200 456 +2026-01-27 23:22:15,266:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:22:15 GMT +Content-Type: application/json +Content-Length: 456 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/474148880876 +Replay-Nonce: _aMw-ObloPIQfEs814ngMxbIayUAQiAFH9mjZG4HWtP-CLViw0I +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "valid", + "expires": "2026-02-03T23:21:30Z", + "identifiers": [ + { + "type": "dns", + "value": "terminal.profibot.hu" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649789209516" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/474148880876", + "certificate": "https://acme-v02.api.letsencrypt.org/acme/cert/050c8ad7008ac7c7bfe67ccd2c4b7973741f" +} +2026-01-27 23:22:15,266:DEBUG:acme.client:Storing nonce: _aMw-ObloPIQfEs814ngMxbIayUAQiAFH9mjZG4HWtP-CLViw0I +2026-01-27 23:22:15,267:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:22:15,270:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/cert/050c8ad7008ac7c7bfe67ccd2c4b7973741f: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJfYU13LU9ibG9QSVFmRXM4MTRuZ014YklheVVBUWlBRkg5bWpaRzRIV3RQLUNMVml3MEkiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NlcnQvMDUwYzhhZDcwMDhhYzdjN2JmZTY3Y2NkMmM0Yjc5NzM3NDFmIn0", + "signature": "LNbLKoMMvro-izg4Z0LHmVOCmc-DYos6L2JiEfC1yJ5xDlK1FojTmSDlBZdMppYE5ir3fQ3FN1xStJWcY_G_pZi5KZxHLKomJ_68aAK1qhDTIZuAHWMvNiIxGXyja3WrcFAquA3ViLBf9Z6BrOfE01PoPm8dctQszHyK7aDm4611cQY-2u4KHnBJYUR9yPnuEUmmRnDh_AY3ac-XEN9HIZh6yt1TCR2_Kxw8D0GnCl7FY2GNAjJNMND7I9k9uOCM4ULKeqWurENmOVygogG89X042wdi3SCc713efZ37_72XNNeVqS6-qkcEuImWOfd7nMIrP3aAMjmIET2kFNzfXw", + "payload": "" +} +2026-01-27 23:22:15,444:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/cert/050c8ad7008ac7c7bfe67ccd2c4b7973741f HTTP/1.1" 200 2917 +2026-01-27 23:22:15,445:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:22:15 GMT +Content-Type: application/pem-certificate-chain +Content-Length: 2917 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="alternate" +Replay-Nonce: 3aiLGgPYsnNHRZzdl4oxWf0cNhsIN7hExo6yAfe6T-gad36ffKY +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +-----BEGIN CERTIFICATE----- +MIIDuDCCAz+gAwIBAgISBQyK1wCKx8e/5nzNLEt5c3QfMAoGCCqGSM49BAMDMDIx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF +NzAeFw0yNjAxMjcyMjIzNDNaFw0yNjA0MjcyMjIzNDJaMB8xHTAbBgNVBAMTFHRl +cm1pbmFsLnByb2ZpYm90Lmh1MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEEoVjEbEu +BSGcEzFvJ5z/39X14vJk7ASsC7+KB3ECIqjRZjuZmrzJDNPEFKLqtcv4sWAvDJpX +b6NcQLQUmgGAi0c5O1D+jHPyFfifc1t0O8wRGE3t2vQw6BTZKf/Cw2V+o4ICKTCC +AiUwDgYDVR0PAQH/BAQDAgeAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcD +AjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQn1dxgdbo6x/C9QgKcbkkvnrFU1DAf +BgNVHSMEGDAWgBSuSJ7chx1EoG/aouVgdAR4wpwAgDAyBggrBgEFBQcBAQQmMCQw +IgYIKwYBBQUHMAKGFmh0dHA6Ly9lNy5pLmxlbmNyLm9yZy8wHwYDVR0RBBgwFoIU +dGVybWluYWwucHJvZmlib3QuaHUwEwYDVR0gBAwwCjAIBgZngQwBAgEwLQYDVR0f +BCYwJDAioCCgHoYcaHR0cDovL2U3LmMubGVuY3Iub3JnLzMyLmNybDCCAQsGCisG +AQQB1nkCBAIEgfwEgfkA9wB1AEmcm2neHXzs/DbezYdkprhbrwqHgBnRVVL76esp +3fjDAAABnAHDxSQAAAQDAEYwRAIgZU4So71ktINNySQhQUysS6noNE1+1oSGYF/s +65mcvjQCIAn7PnXUCws1A3h5rwEwUuudTmD7d7RKfv2z96UJJQHYAH4Apcl4kl1X +RheChw3YiWYLXFVki30AQPLsB2hR0YhpGfcAAAGcAcPHxgAIAAAFADBG2foEAwBH +MEUCICox7SZ8xxKtGnntKaSMtjZ3LmBmEhNiBrl3oIj/STYiAiEA8RQiLwzW/uEu +bnYhe+ZRB6PvpCVlBaGdHN87+EK080EwCgYIKoZIzj0EAwMDZwAwZAIwCbJaioYq +nX3Dh2jvGwQbTZqWQo94heOGNUWwYpQtRyQOjWHr3CcplGAeb/11iWGXAjB5el/z +D6DA/e3kP5O9MB82qk/cIzoWOQ6kSE/WjTGeQ/fk5a/tCk5UXjsIFtcw9JI= +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIEVzCCAj+gAwIBAgIRAKp18eYrjwoiCWbTi7/UuqEwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw +WhcNMjcwMzEyMjM1OTU5WjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg +RW5jcnlwdDELMAkGA1UEAxMCRTcwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARB6AST +CFh/vjcwDMCgQer+VtqEkz7JANurZxLP+U9TCeioL6sp5Z8VRvRbYk4P1INBmbef +QHJFHCxcSjKmwtvGBWpl/9ra8HW0QDsUaJW2qOJqceJ0ZVFT3hbUHifBM/2jgfgw +gfUwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcD +ATASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSuSJ7chx1EoG/aouVgdAR4 +wpwAgDAfBgNVHSMEGDAWgBR5tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcB +AQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0g +BAwwCjAIBgZngQwBAgEwJwYDVR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVu +Y3Iub3JnLzANBgkqhkiG9w0BAQsFAAOCAgEAjx66fDdLk5ywFn3CzA1w1qfylHUD +aEf0QZpXcJseddJGSfbUUOvbNR9N/QQ16K1lXl4VFyhmGXDT5Kdfcr0RvIIVrNxF +h4lqHtRRCP6RBRstqbZ2zURgqakn/Xip0iaQL0IdfHBZr396FgknniRYFckKORPG +yM3QKnd66gtMst8I5nkRQlAg/Jb+Gc3egIvuGKWboE1G89NTsN9LTDD3PLj0dUMr +OIuqVjLB8pEC6yk9enrlrqjXQgkLEYhXzq7dLafv5Vkig6Gl0nuuqjqfp0Q1bi1o +yVNAlXe6aUXw92CcghC9bNsKEO1+M52YY5+ofIXlS/SEQbvVYYBLZ5yeiglV6t3S +M6H+vTG0aP9YHzLn/KVOHzGQfXDP7qM5tkf+7diZe7o2fw6O7IvN6fsQXEQQj8TJ +UXJxv2/uJhcuy/tSDgXwHM8Uk34WNbRT7zGTGkQRX0gsbjAea/jYAoWv0ZvQRwpq +Pe79D/i7Cep8qWnA+7AE/3B3S/3dEEYmc0lpe1366A/6GEgk3ktr9PEoQrLChs6I +tu3wnNLB2euC8IKGLQFpGtOO/2/hiAKjyajaBP25w1jF0Wl8Bbqne3uZ2q1GyPFJ +YRmT7/OXpmOH/FVLtwS+8ng1cAmpCujPwteJZNcDG0sF2n/sc0+SQf49fdyUK0ty ++VUwFj9tmWxyR/M= +-----END CERTIFICATE----- + +2026-01-27 23:22:15,445:DEBUG:acme.client:Storing nonce: 3aiLGgPYsnNHRZzdl4oxWf0cNhsIN7hExo6yAfe6T-gad36ffKY +2026-01-27 23:22:15,446:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:22:15,449:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/cert/050c8ad7008ac7c7bfe67ccd2c4b7973741f/1: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICIzYWlMR2dQWXNuTkhSWnpkbDRveFdmMGNOaHNJTjdoRXhvNnlBZmU2VC1nYWQzNmZmS1kiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NlcnQvMDUwYzhhZDcwMDhhYzdjN2JmZTY3Y2NkMmM0Yjc5NzM3NDFmLzEifQ", + "signature": "K4bYuHiMtkgq1J8YiziWn1yxKkzY202fdMSRNnTsEEpwLE6qBRpe3jZEehWLxyK8wrmG1yJFQKIVYnufbvkWT3PCJS7-DOP8NxTSHt7PM6bSbjUxcgQ60Iz3lTPAxFck_4DteRg_Tdnk1Zu0e1PFoWEaoO2Z5FJFG_9hTsP36xJhDxtmZBp2a1ZITDMSkCCuVGHeqXvplcSI9GOCjtZzNIpqf5NY5Firt-uDNy0D5V96jzr4RpRjFembG7d8IMKVafjzE1ZTz6PxwTueJjbveRdTYLVfackd9sSAzmauOEV5DCP7Cp0NrvY5q8AE34YWjQ2TJyyxqIN8WCe8Zcn0bA", + "payload": "" +} +2026-01-27 23:22:15,608:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/cert/050c8ad7008ac7c7bfe67ccd2c4b7973741f/1 HTTP/1.1" 200 2352 +2026-01-27 23:22:15,609:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:22:15 GMT +Content-Type: application/pem-certificate-chain +Content-Length: 2352 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="alternate" +Replay-Nonce: 3aiLGgPYCVQxoTyXyo9GKgcxQBDo8ruphs4htl-9w2tkvcLFVoU +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +-----BEGIN CERTIFICATE----- +MIIDuDCCAz+gAwIBAgISBQyK1wCKx8e/5nzNLEt5c3QfMAoGCCqGSM49BAMDMDIx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF +NzAeFw0yNjAxMjcyMjIzNDNaFw0yNjA0MjcyMjIzNDJaMB8xHTAbBgNVBAMTFHRl +cm1pbmFsLnByb2ZpYm90Lmh1MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEEoVjEbEu +BSGcEzFvJ5z/39X14vJk7ASsC7+KB3ECIqjRZjuZmrzJDNPEFKLqtcv4sWAvDJpX +b6NcQLQUmgGAi0c5O1D+jHPyFfifc1t0O8wRGE3t2vQw6BTZKf/Cw2V+o4ICKTCC +AiUwDgYDVR0PAQH/BAQDAgeAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcD +AjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQn1dxgdbo6x/C9QgKcbkkvnrFU1DAf +BgNVHSMEGDAWgBSuSJ7chx1EoG/aouVgdAR4wpwAgDAyBggrBgEFBQcBAQQmMCQw +IgYIKwYBBQUHMAKGFmh0dHA6Ly9lNy5pLmxlbmNyLm9yZy8wHwYDVR0RBBgwFoIU +dGVybWluYWwucHJvZmlib3QuaHUwEwYDVR0gBAwwCjAIBgZngQwBAgEwLQYDVR0f +BCYwJDAioCCgHoYcaHR0cDovL2U3LmMubGVuY3Iub3JnLzMyLmNybDCCAQsGCisG +AQQB1nkCBAIEgfwEgfkA9wB1AEmcm2neHXzs/DbezYdkprhbrwqHgBnRVVL76esp +3fjDAAABnAHDxSQAAAQDAEYwRAIgZU4So71ktINNySQhQUysS6noNE1+1oSGYF/s +65mcvjQCIAn7PnXUCws1A3h5rwEwUuudTmD7d7RKfv2z96UJJQHYAH4Apcl4kl1X +RheChw3YiWYLXFVki30AQPLsB2hR0YhpGfcAAAGcAcPHxgAIAAAFADBG2foEAwBH +MEUCICox7SZ8xxKtGnntKaSMtjZ3LmBmEhNiBrl3oIj/STYiAiEA8RQiLwzW/uEu +bnYhe+ZRB6PvpCVlBaGdHN87+EK080EwCgYIKoZIzj0EAwMDZwAwZAIwCbJaioYq +nX3Dh2jvGwQbTZqWQo94heOGNUWwYpQtRyQOjWHr3CcplGAeb/11iWGXAjB5el/z +D6DA/e3kP5O9MB82qk/cIzoWOQ6kSE/WjTGeQ/fk5a/tCk5UXjsIFtcw9JI= +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIICtzCCAjygAwIBAgIRAMWKhaLGI0XgqMRSU4efWTowCgYIKoZIzj0EAwMwTzEL +MAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNo +IEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDIwHhcNMjQwMzEzMDAwMDAwWhcN +MjcwMzEyMjM1OTU5WjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3MgRW5j +cnlwdDELMAkGA1UEAxMCRTcwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARB6ASTCFh/ +vjcwDMCgQer+VtqEkz7JANurZxLP+U9TCeioL6sp5Z8VRvRbYk4P1INBmbefQHJF +HCxcSjKmwtvGBWpl/9ra8HW0QDsUaJW2qOJqceJ0ZVFT3hbUHifBM/2jgfgwgfUw +DgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAS +BgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSuSJ7chx1EoG/aouVgdAR4wpwA +gDAfBgNVHSMEGDAWgBR8Qpau3ktIO/qS+J6Mz22LqXI3lTAyBggrBgEFBQcBAQQm +MCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly94Mi5pLmxlbmNyLm9yZy8wEwYDVR0gBAww +CjAIBgZngQwBAgEwJwYDVR0fBCAwHjAcoBqgGIYWaHR0cDovL3gyLmMubGVuY3Iu +b3JnLzAKBggqhkjOPQQDAwNpADBmAjEA/e5N+wjAk945cpaFxGaeMC13fyvdbNzX +lRg9HNdElxi5mXdI4az2CykNU07iFwqEAjEAihPCDkw4b1BvfLg8VNLLuaMpn1Rb +Z1682chR6zNRCseyie4SjyTCdkvsAa+omQSf +-----END CERTIFICATE----- + +2026-01-27 23:22:15,610:DEBUG:acme.client:Storing nonce: 3aiLGgPYCVQxoTyXyo9GKgcxQBDo8ruphs4htl-9w2tkvcLFVoU +2026-01-27 23:22:15,618:INFO:certbot._internal.client:Non-standard path(s), might not work with crontab installed by your operating system package manager +2026-01-27 23:22:15,619:DEBUG:certbot._internal.storage:Creating directory /etc/letsencrypt/archive/npm-18. +2026-01-27 23:22:15,620:DEBUG:certbot._internal.storage:Creating directory /etc/letsencrypt/live/npm-18. +2026-01-27 23:22:15,620:DEBUG:certbot._internal.storage:Writing certificate to /etc/letsencrypt/live/npm-18/cert.pem. +2026-01-27 23:22:15,621:DEBUG:certbot._internal.storage:Writing private key to /etc/letsencrypt/live/npm-18/privkey.pem. +2026-01-27 23:22:15,621:DEBUG:certbot._internal.storage:Writing chain to /etc/letsencrypt/live/npm-18/chain.pem. +2026-01-27 23:22:15,622:DEBUG:certbot._internal.storage:Writing full chain to /etc/letsencrypt/live/npm-18/fullchain.pem. +2026-01-27 23:22:15,622:DEBUG:certbot._internal.storage:Writing README to /etc/letsencrypt/live/npm-18/README. +2026-01-27 23:22:15,632:DEBUG:certbot.configuration:Var account=e417a583de478a0cfdeed332c1113068 (set by user). +2026-01-27 23:22:15,632:DEBUG:certbot.configuration:Var key_type=ecdsa (set by user). +2026-01-27 23:22:15,632:DEBUG:certbot.configuration:Var elliptic_curve=secp384r1 (set by user). +2026-01-27 23:22:15,633:DEBUG:certbot.configuration:Var preferred_chain=ISRG Root X1 (set by user). +2026-01-27 23:22:15,633:DEBUG:certbot.configuration:Var pref_challs=['http-01'] (set by user). +2026-01-27 23:22:15,633:DEBUG:certbot.configuration:Var config_dir=/etc/letsencrypt (set by user). +2026-01-27 23:22:15,633:DEBUG:certbot.configuration:Var work_dir=/tmp/letsencrypt-lib (set by user). +2026-01-27 23:22:15,633:DEBUG:certbot.configuration:Var logs_dir=/data/logs (set by user). +2026-01-27 23:22:15,633:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2026-01-27 23:22:15,633:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2026-01-27 23:22:15,633:DEBUG:certbot.configuration:Var webroot_path=['/data/letsencrypt-acme-challenge'] (set by user). +2026-01-27 23:22:15,633:DEBUG:certbot.configuration:Var webroot_map={'terminal.profibot.hu': '/data/letsencrypt-acme-challenge'} (set by user). +2026-01-27 23:22:15,634:DEBUG:certbot._internal.display.obj:Notifying user: +Successfully received certificate. +Certificate is saved at: /etc/letsencrypt/live/npm-18/fullchain.pem +Key is saved at: /etc/letsencrypt/live/npm-18/privkey.pem +This certificate expires on 2026-04-27. +These files will be updated when the certificate renews. +2026-01-27 23:22:15,635:DEBUG:certbot._internal.display.obj:Notifying user: NEXT STEPS: +2026-01-27 23:22:15,635:DEBUG:certbot._internal.display.obj:Notifying user: - The certificate will need to be renewed before it expires. Certbot can automatically renew the certificate in the background, but you may need to take steps to enable that functionality. See https://certbot.org/renewal-setup for instructions. +2026-01-27 23:22:15,636:DEBUG:certbot._internal.display.obj:Notifying user: If you like Certbot, please consider supporting our work by: + * Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate + * Donating to EFF: https://eff.org/donate-le diff --git a/proxy-manager/data/logs/letsencrypt.log.10 b/proxy-manager/data/logs/letsencrypt.log.10 new file mode 100755 index 0000000..9b11b51 --- /dev/null +++ b/proxy-manager/data/logs/letsencrypt.log.10 @@ -0,0 +1,137 @@ +2025-12-25 00:26:43,459:DEBUG:certbot._internal.main:certbot version: 5.1.0 +2025-12-25 00:26:43,459:DEBUG:certbot._internal.main:Location of certbot entry point: /opt/certbot/bin/certbot +2025-12-25 00:26:43,459:DEBUG:certbot._internal.main:Arguments: ['--config', '/etc/letsencrypt.ini', '--work-dir', '/tmp/letsencrypt-lib', '--logs-dir', '/data/logs', '--cert-name', 'npm-9', '--agree-tos', '--authenticator', 'webroot', '-m', 'kincses@gmail.com', '--preferred-challenges', 'http', '--domains', 'NAS'] +2025-12-25 00:26:43,459:DEBUG:certbot._internal.main:Discovered plugins: PluginsRegistry(PluginEntryPoint#manual,PluginEntryPoint#null,PluginEntryPoint#standalone,PluginEntryPoint#webroot) +2025-12-25 00:26:43,469:DEBUG:certbot._internal.log:Root logging level set at 30 +2025-12-25 00:26:43,470:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2025-12-25 00:26:43,470:DEBUG:certbot._internal.plugins.selection:Single candidate plugin: * webroot +Description: Saves the necessary validation files to a .well-known/acme-challenge/ directory within the nominated webroot path. A separate HTTP server must be running and serving files from the webroot path. HTTP challenge only (wildcards not supported). +Interfaces: Authenticator, Plugin +Entry point: EntryPoint(name='webroot', value='certbot._internal.plugins.webroot:Authenticator', group='certbot.plugins') +Initialized: +Prep: True +2025-12-25 00:26:43,470:DEBUG:certbot._internal.plugins.selection:Selected authenticator and installer None +2025-12-25 00:26:43,470:INFO:certbot._internal.plugins.selection:Plugins selected: Authenticator webroot, Installer None +2025-12-25 00:26:43,507:DEBUG:certbot._internal.main:Picked account: +2025-12-25 00:26:43,507:DEBUG:acme.client:Sending GET request to https://acme-v02.api.letsencrypt.org/directory. +2025-12-25 00:26:43,509:DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org:443 +2025-12-25 00:26:43,941:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "GET /directory HTTP/1.1" 200 1033 +2025-12-25 00:26:43,942:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:26:43 GMT +Content-Type: application/json +Content-Length: 1033 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "WZ2L0VcwJxs": "https://community.letsencrypt.org/t/adding-random-entries-to-the-directory/33417", + "keyChange": "https://acme-v02.api.letsencrypt.org/acme/key-change", + "meta": { + "caaIdentities": [ + "letsencrypt.org" + ], + "profiles": { + "classic": "https://letsencrypt.org/docs/profiles#classic", + "shortlived": "https://letsencrypt.org/docs/profiles#shortlived", + "tlsclient": "https://letsencrypt.org/docs/profiles#tlsclient", + "tlsserver": "https://letsencrypt.org/docs/profiles#tlsserver" + }, + "termsOfService": "https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf", + "website": "https://letsencrypt.org" + }, + "newAccount": "https://acme-v02.api.letsencrypt.org/acme/new-acct", + "newNonce": "https://acme-v02.api.letsencrypt.org/acme/new-nonce", + "newOrder": "https://acme-v02.api.letsencrypt.org/acme/new-order", + "renewalInfo": "https://acme-v02.api.letsencrypt.org/acme/renewal-info", + "revokeCert": "https://acme-v02.api.letsencrypt.org/acme/revoke-cert" +} +2025-12-25 00:26:43,943:DEBUG:certbot._internal.display.obj:Notifying user: Requesting a certificate for nas +2025-12-25 00:26:43,949:DEBUG:acme.client:Requesting fresh nonce +2025-12-25 00:26:43,950:DEBUG:acme.client:Sending HEAD request to https://acme-v02.api.letsencrypt.org/acme/new-nonce. +2025-12-25 00:26:44,093:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "HEAD /acme/new-nonce HTTP/1.1" 200 0 +2025-12-25 00:26:44,094:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:26:44 GMT +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: GxwILcG0UrPWURe3fNitb6iIML5gPe0pkEuCK58XtFfhhtrGoQ8 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + + +2025-12-25 00:26:44,094:DEBUG:acme.client:Storing nonce: GxwILcG0UrPWURe3fNitb6iIML5gPe0pkEuCK58XtFfhhtrGoQ8 +2025-12-25 00:26:44,095:DEBUG:acme.client:JWS payload: +b'{\n "identifiers": [\n {\n "type": "dns",\n "value": "nas"\n }\n ]\n}' +2025-12-25 00:26:44,098:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/new-order: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJHeHdJTGNHMFVyUFdVUmUzZk5pdGI2aUlNTDVnUGUwcGtFdUNLNThYdEZmaGh0ckdvUTgiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL25ldy1vcmRlciJ9", + "signature": "WkheSig5aU-YVlwOcvMr-u29JRUa79lkxSYyb71JwBzSKFWXATVnCswqzLJRm2puloOn3T2dkDszL9poBnfW_0bMVENylL93hfzFQc3hpwDE6GIQHMa7yA-ap8lczjB8sX0KK4BDcHyVUfzDyzc3vH7Md2hwArZaQaB0I5PQNH_bd9gak6x6EvpthzqHuTNoMsrCuc4ms4EkOFWhQQmUfedfLgAmXt_UwCi7Y1BTfLQRqeWNkNLc211K2_dsgc9ulhIO_Vdwqwl7e5lMGE-QHdEOoJFlw61rlwZZFn_clTeJvt4SJabYVxpfbBngpsqGstBfUPz6n3CijsHthF67Wg", + "payload": "ewogICJpZGVudGlmaWVycyI6IFsKICAgIHsKICAgICAgInR5cGUiOiAiZG5zIiwKICAgICAgInZhbHVlIjogIm5hcyIKICAgIH0KICBdCn0" +} +2025-12-25 00:26:44,253:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/new-order HTTP/1.1" 400 187 +2025-12-25 00:26:44,254:DEBUG:acme.client:Received response: +HTTP 400 +Server: nginx +Date: Thu, 25 Dec 2025 00:26:44 GMT +Content-Type: application/problem+json +Content-Length: 187 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: GxwILcG05cm3VHlJ6LM8t_GHg8V-worSn48NT3j9Yo5tZCc98tI + +{ + "type": "urn:ietf:params:acme:error:rejectedIdentifier", + "detail": "Invalid identifiers requested :: Cannot issue for \"nas\": Domain name needs at least one dot", + "status": 400 +} +2025-12-25 00:26:44,256:DEBUG:certbot._internal.log:Exiting abnormally: +Traceback (most recent call last): + File "/opt/certbot/bin/certbot", line 7, in + sys.exit(main()) + ^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/main.py", line 18, in main + return internal_main.main(cli_args) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 1850, in main + return config.func(config, plugins) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 1562, in certonly + lineage = _get_and_save_cert(le_client, config, domains, certname, lineage) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 141, in _get_and_save_cert + lineage = le_client.obtain_and_enroll_certificate(domains, certname) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 526, in obtain_and_enroll_certificate + cert, chain, key, _ = self.obtain_certificate(domains) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 427, in obtain_certificate + orderr = self._get_order_and_authorizations(csr.data, self.config.allow_subset_of_names) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 487, in _get_order_and_authorizations + orderr = self.acme.new_order(csr_pem, profile=profile) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/acme/client.py", line 141, in new_order + response = self._post(self.directory['newOrder'], order) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/acme/client.py", line 467, in _post + return self.net.post(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/acme/client.py", line 818, in post + return self._post_once(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/acme/client.py", line 833, in _post_once + response = self._check_response(response, content_type=content_type) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/acme/client.py", line 705, in _check_response + raise messages.Error.from_json(jobj) +acme.messages.Error: urn:ietf:params:acme:error:rejectedIdentifier :: The server will not issue certificates for the identifier :: Invalid identifiers requested :: Cannot issue for "nas": Domain name needs at least one dot +2025-12-25 00:26:44,262:ERROR:certbot._internal.log:An unexpected error occurred: +2025-12-25 00:26:44,262:ERROR:certbot._internal.log:Invalid identifiers requested :: Cannot issue for "nas": Domain name needs at least one dot diff --git a/proxy-manager/data/logs/letsencrypt.log.11 b/proxy-manager/data/logs/letsencrypt.log.11 new file mode 100755 index 0000000..a26590e --- /dev/null +++ b/proxy-manager/data/logs/letsencrypt.log.11 @@ -0,0 +1,137 @@ +2025-12-25 00:26:22,876:DEBUG:certbot._internal.main:certbot version: 5.1.0 +2025-12-25 00:26:22,876:DEBUG:certbot._internal.main:Location of certbot entry point: /opt/certbot/bin/certbot +2025-12-25 00:26:22,876:DEBUG:certbot._internal.main:Arguments: ['--config', '/etc/letsencrypt.ini', '--work-dir', '/tmp/letsencrypt-lib', '--logs-dir', '/data/logs', '--cert-name', 'npm-8', '--agree-tos', '--authenticator', 'webroot', '-m', 'kincses@gmail.com', '--preferred-challenges', 'http', '--domains', 'NAS'] +2025-12-25 00:26:22,876:DEBUG:certbot._internal.main:Discovered plugins: PluginsRegistry(PluginEntryPoint#manual,PluginEntryPoint#null,PluginEntryPoint#standalone,PluginEntryPoint#webroot) +2025-12-25 00:26:22,886:DEBUG:certbot._internal.log:Root logging level set at 30 +2025-12-25 00:26:22,886:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2025-12-25 00:26:22,886:DEBUG:certbot._internal.plugins.selection:Single candidate plugin: * webroot +Description: Saves the necessary validation files to a .well-known/acme-challenge/ directory within the nominated webroot path. A separate HTTP server must be running and serving files from the webroot path. HTTP challenge only (wildcards not supported). +Interfaces: Authenticator, Plugin +Entry point: EntryPoint(name='webroot', value='certbot._internal.plugins.webroot:Authenticator', group='certbot.plugins') +Initialized: +Prep: True +2025-12-25 00:26:22,887:DEBUG:certbot._internal.plugins.selection:Selected authenticator and installer None +2025-12-25 00:26:22,887:INFO:certbot._internal.plugins.selection:Plugins selected: Authenticator webroot, Installer None +2025-12-25 00:26:22,925:DEBUG:certbot._internal.main:Picked account: +2025-12-25 00:26:22,925:DEBUG:acme.client:Sending GET request to https://acme-v02.api.letsencrypt.org/directory. +2025-12-25 00:26:22,926:DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org:443 +2025-12-25 00:26:23,359:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "GET /directory HTTP/1.1" 200 1033 +2025-12-25 00:26:23,359:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:26:23 GMT +Content-Type: application/json +Content-Length: 1033 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "30tQsADE7Ng": "https://community.letsencrypt.org/t/adding-random-entries-to-the-directory/33417", + "keyChange": "https://acme-v02.api.letsencrypt.org/acme/key-change", + "meta": { + "caaIdentities": [ + "letsencrypt.org" + ], + "profiles": { + "classic": "https://letsencrypt.org/docs/profiles#classic", + "shortlived": "https://letsencrypt.org/docs/profiles#shortlived", + "tlsclient": "https://letsencrypt.org/docs/profiles#tlsclient", + "tlsserver": "https://letsencrypt.org/docs/profiles#tlsserver" + }, + "termsOfService": "https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf", + "website": "https://letsencrypt.org" + }, + "newAccount": "https://acme-v02.api.letsencrypt.org/acme/new-acct", + "newNonce": "https://acme-v02.api.letsencrypt.org/acme/new-nonce", + "newOrder": "https://acme-v02.api.letsencrypt.org/acme/new-order", + "renewalInfo": "https://acme-v02.api.letsencrypt.org/acme/renewal-info", + "revokeCert": "https://acme-v02.api.letsencrypt.org/acme/revoke-cert" +} +2025-12-25 00:26:23,360:DEBUG:certbot._internal.display.obj:Notifying user: Requesting a certificate for nas +2025-12-25 00:26:23,363:DEBUG:acme.client:Requesting fresh nonce +2025-12-25 00:26:23,363:DEBUG:acme.client:Sending HEAD request to https://acme-v02.api.letsencrypt.org/acme/new-nonce. +2025-12-25 00:26:23,506:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "HEAD /acme/new-nonce HTTP/1.1" 200 0 +2025-12-25 00:26:23,507:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:26:23 GMT +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: IijzadlSuk_r8p0Ml9FyQAI_imYa7xITniSxPxGAHDTk59I9bsc +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + + +2025-12-25 00:26:23,507:DEBUG:acme.client:Storing nonce: IijzadlSuk_r8p0Ml9FyQAI_imYa7xITniSxPxGAHDTk59I9bsc +2025-12-25 00:26:23,508:DEBUG:acme.client:JWS payload: +b'{\n "identifiers": [\n {\n "type": "dns",\n "value": "nas"\n }\n ]\n}' +2025-12-25 00:26:23,510:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/new-order: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJJaWp6YWRsU3VrX3I4cDBNbDlGeVFBSV9pbVlhN3hJVG5pU3hQeEdBSERUazU5STlic2MiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL25ldy1vcmRlciJ9", + "signature": "N2M9sh5wF3JtdIQ5PJ70Xuim8MW8CzOqOagRcK6eCXlAeCanx8lwwNWi2uK6-gzM9hd9PpKBMhdhLa6r1E7g5mpGIFHJJmqFeF9RzUz19OMCElDqmH-pMHOrDebxA9D--umzF4Tn_sj_iubVFmCYKnqpFHDgMljOiJgRNiBVjwjkgCIcGoxiVDv5m-ET5Hn1BTqzCn6H6s6L3k1DjASkHiJ6sPjLa5CF6YyRp7leh82SDZDHHePm-fqJ7QnlG_VISz_AguJLY72BlcQHc-jY9mPnuqUCipxSjkJclZOW5qfX9tYu1kXRA61DlyChvdt4O3OCUTYyxTjFYNZbuF0dhw", + "payload": "ewogICJpZGVudGlmaWVycyI6IFsKICAgIHsKICAgICAgInR5cGUiOiAiZG5zIiwKICAgICAgInZhbHVlIjogIm5hcyIKICAgIH0KICBdCn0" +} +2025-12-25 00:26:23,653:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/new-order HTTP/1.1" 400 187 +2025-12-25 00:26:23,654:DEBUG:acme.client:Received response: +HTTP 400 +Server: nginx +Date: Thu, 25 Dec 2025 00:26:23 GMT +Content-Type: application/problem+json +Content-Length: 187 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: GxwILcG0AMJAQTFBgzgVlIWvI3j_eHVwqYVLT7xy7ULM7_y72Vo + +{ + "type": "urn:ietf:params:acme:error:rejectedIdentifier", + "detail": "Invalid identifiers requested :: Cannot issue for \"nas\": Domain name needs at least one dot", + "status": 400 +} +2025-12-25 00:26:23,655:DEBUG:certbot._internal.log:Exiting abnormally: +Traceback (most recent call last): + File "/opt/certbot/bin/certbot", line 7, in + sys.exit(main()) + ^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/main.py", line 18, in main + return internal_main.main(cli_args) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 1850, in main + return config.func(config, plugins) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 1562, in certonly + lineage = _get_and_save_cert(le_client, config, domains, certname, lineage) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 141, in _get_and_save_cert + lineage = le_client.obtain_and_enroll_certificate(domains, certname) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 526, in obtain_and_enroll_certificate + cert, chain, key, _ = self.obtain_certificate(domains) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 427, in obtain_certificate + orderr = self._get_order_and_authorizations(csr.data, self.config.allow_subset_of_names) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 487, in _get_order_and_authorizations + orderr = self.acme.new_order(csr_pem, profile=profile) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/acme/client.py", line 141, in new_order + response = self._post(self.directory['newOrder'], order) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/acme/client.py", line 467, in _post + return self.net.post(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/acme/client.py", line 818, in post + return self._post_once(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/acme/client.py", line 833, in _post_once + response = self._check_response(response, content_type=content_type) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/acme/client.py", line 705, in _check_response + raise messages.Error.from_json(jobj) +acme.messages.Error: urn:ietf:params:acme:error:rejectedIdentifier :: The server will not issue certificates for the identifier :: Invalid identifiers requested :: Cannot issue for "nas": Domain name needs at least one dot +2025-12-25 00:26:23,662:ERROR:certbot._internal.log:An unexpected error occurred: +2025-12-25 00:26:23,662:ERROR:certbot._internal.log:Invalid identifiers requested :: Cannot issue for "nas": Domain name needs at least one dot diff --git a/proxy-manager/data/logs/letsencrypt.log.12 b/proxy-manager/data/logs/letsencrypt.log.12 new file mode 100755 index 0000000..8b068f1 --- /dev/null +++ b/proxy-manager/data/logs/letsencrypt.log.12 @@ -0,0 +1,137 @@ +2025-12-25 00:26:12,714:DEBUG:certbot._internal.main:certbot version: 5.1.0 +2025-12-25 00:26:12,714:DEBUG:certbot._internal.main:Location of certbot entry point: /opt/certbot/bin/certbot +2025-12-25 00:26:12,714:DEBUG:certbot._internal.main:Arguments: ['--config', '/etc/letsencrypt.ini', '--work-dir', '/tmp/letsencrypt-lib', '--logs-dir', '/data/logs', '--cert-name', 'npm-7', '--agree-tos', '--authenticator', 'webroot', '-m', 'kincses@gmail.com', '--preferred-challenges', 'http', '--domains', 'NAS'] +2025-12-25 00:26:12,714:DEBUG:certbot._internal.main:Discovered plugins: PluginsRegistry(PluginEntryPoint#manual,PluginEntryPoint#null,PluginEntryPoint#standalone,PluginEntryPoint#webroot) +2025-12-25 00:26:12,724:DEBUG:certbot._internal.log:Root logging level set at 30 +2025-12-25 00:26:12,725:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2025-12-25 00:26:12,725:DEBUG:certbot._internal.plugins.selection:Single candidate plugin: * webroot +Description: Saves the necessary validation files to a .well-known/acme-challenge/ directory within the nominated webroot path. A separate HTTP server must be running and serving files from the webroot path. HTTP challenge only (wildcards not supported). +Interfaces: Authenticator, Plugin +Entry point: EntryPoint(name='webroot', value='certbot._internal.plugins.webroot:Authenticator', group='certbot.plugins') +Initialized: +Prep: True +2025-12-25 00:26:12,725:DEBUG:certbot._internal.plugins.selection:Selected authenticator and installer None +2025-12-25 00:26:12,725:INFO:certbot._internal.plugins.selection:Plugins selected: Authenticator webroot, Installer None +2025-12-25 00:26:12,764:DEBUG:certbot._internal.main:Picked account: +2025-12-25 00:26:12,764:DEBUG:acme.client:Sending GET request to https://acme-v02.api.letsencrypt.org/directory. +2025-12-25 00:26:12,765:DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org:443 +2025-12-25 00:26:13,201:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "GET /directory HTTP/1.1" 200 1033 +2025-12-25 00:26:13,202:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:26:13 GMT +Content-Type: application/json +Content-Length: 1033 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "9ojpIDIRYvo": "https://community.letsencrypt.org/t/adding-random-entries-to-the-directory/33417", + "keyChange": "https://acme-v02.api.letsencrypt.org/acme/key-change", + "meta": { + "caaIdentities": [ + "letsencrypt.org" + ], + "profiles": { + "classic": "https://letsencrypt.org/docs/profiles#classic", + "shortlived": "https://letsencrypt.org/docs/profiles#shortlived", + "tlsclient": "https://letsencrypt.org/docs/profiles#tlsclient", + "tlsserver": "https://letsencrypt.org/docs/profiles#tlsserver" + }, + "termsOfService": "https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf", + "website": "https://letsencrypt.org" + }, + "newAccount": "https://acme-v02.api.letsencrypt.org/acme/new-acct", + "newNonce": "https://acme-v02.api.letsencrypt.org/acme/new-nonce", + "newOrder": "https://acme-v02.api.letsencrypt.org/acme/new-order", + "renewalInfo": "https://acme-v02.api.letsencrypt.org/acme/renewal-info", + "revokeCert": "https://acme-v02.api.letsencrypt.org/acme/revoke-cert" +} +2025-12-25 00:26:13,203:DEBUG:certbot._internal.display.obj:Notifying user: Requesting a certificate for nas +2025-12-25 00:26:13,209:DEBUG:acme.client:Requesting fresh nonce +2025-12-25 00:26:13,209:DEBUG:acme.client:Sending HEAD request to https://acme-v02.api.letsencrypt.org/acme/new-nonce. +2025-12-25 00:26:13,352:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "HEAD /acme/new-nonce HTTP/1.1" 200 0 +2025-12-25 00:26:13,353:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:26:13 GMT +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: IijzadlSUG12gLy_rsd9fAwAqjoaHPXC5XG9PWEXqkZ7feNIuZ8 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + + +2025-12-25 00:26:13,354:DEBUG:acme.client:Storing nonce: IijzadlSUG12gLy_rsd9fAwAqjoaHPXC5XG9PWEXqkZ7feNIuZ8 +2025-12-25 00:26:13,354:DEBUG:acme.client:JWS payload: +b'{\n "identifiers": [\n {\n "type": "dns",\n "value": "nas"\n }\n ]\n}' +2025-12-25 00:26:13,358:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/new-order: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJJaWp6YWRsU1VHMTJnTHlfcnNkOWZBd0Fxam9hSFBYQzVYRzlQV0VYcWtaN2ZlTkl1WjgiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL25ldy1vcmRlciJ9", + "signature": "VJ3osIH74o48lDiKscw5z37DYgdDl_mv85nBPTYyWc4XU218FCbfbRG9OiVUWdPkC0-G0riC9HsbYeOZh7elbGyk7hp59YAjSgXmE7d_AqcpDvexXm1x_Ih4iBiwitIYFq5rIo0FPmGkp6Uj5eWv1d_3n9iPI1TCQ_74RIgxcKPVY--CiAHnT55-hDog55nWNY-ovfUlCM8OeO1VFphF4EK-Nyh95t8mCmMHFaWE0Ar7S9lHC9bHVtvADb6gSD2DuTSeVZDeMquLFGulQVTk4Q9jFq4gyNBCYXzJHLleaR72wEPoEnlVRJWLldYSRG9R2ip1Wz8DjPIkMPgOkIdJbQ", + "payload": "ewogICJpZGVudGlmaWVycyI6IFsKICAgIHsKICAgICAgInR5cGUiOiAiZG5zIiwKICAgICAgInZhbHVlIjogIm5hcyIKICAgIH0KICBdCn0" +} +2025-12-25 00:26:13,501:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/new-order HTTP/1.1" 400 187 +2025-12-25 00:26:13,502:DEBUG:acme.client:Received response: +HTTP 400 +Server: nginx +Date: Thu, 25 Dec 2025 00:26:13 GMT +Content-Type: application/problem+json +Content-Length: 187 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: GxwILcG0h_oBtuobwRE86nVrkyWYNNYTargy-Ehmktj5RrevJAs + +{ + "type": "urn:ietf:params:acme:error:rejectedIdentifier", + "detail": "Invalid identifiers requested :: Cannot issue for \"nas\": Domain name needs at least one dot", + "status": 400 +} +2025-12-25 00:26:13,503:DEBUG:certbot._internal.log:Exiting abnormally: +Traceback (most recent call last): + File "/opt/certbot/bin/certbot", line 7, in + sys.exit(main()) + ^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/main.py", line 18, in main + return internal_main.main(cli_args) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 1850, in main + return config.func(config, plugins) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 1562, in certonly + lineage = _get_and_save_cert(le_client, config, domains, certname, lineage) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 141, in _get_and_save_cert + lineage = le_client.obtain_and_enroll_certificate(domains, certname) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 526, in obtain_and_enroll_certificate + cert, chain, key, _ = self.obtain_certificate(domains) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 427, in obtain_certificate + orderr = self._get_order_and_authorizations(csr.data, self.config.allow_subset_of_names) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 487, in _get_order_and_authorizations + orderr = self.acme.new_order(csr_pem, profile=profile) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/acme/client.py", line 141, in new_order + response = self._post(self.directory['newOrder'], order) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/acme/client.py", line 467, in _post + return self.net.post(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/acme/client.py", line 818, in post + return self._post_once(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/acme/client.py", line 833, in _post_once + response = self._check_response(response, content_type=content_type) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/acme/client.py", line 705, in _check_response + raise messages.Error.from_json(jobj) +acme.messages.Error: urn:ietf:params:acme:error:rejectedIdentifier :: The server will not issue certificates for the identifier :: Invalid identifiers requested :: Cannot issue for "nas": Domain name needs at least one dot +2025-12-25 00:26:13,510:ERROR:certbot._internal.log:An unexpected error occurred: +2025-12-25 00:26:13,510:ERROR:certbot._internal.log:Invalid identifiers requested :: Cannot issue for "nas": Domain name needs at least one dot diff --git a/proxy-manager/data/logs/letsencrypt.log.13 b/proxy-manager/data/logs/letsencrypt.log.13 new file mode 100755 index 0000000..f5ccfe9 --- /dev/null +++ b/proxy-manager/data/logs/letsencrypt.log.13 @@ -0,0 +1,137 @@ +2025-12-25 00:22:14,973:DEBUG:certbot._internal.main:certbot version: 5.1.0 +2025-12-25 00:22:14,973:DEBUG:certbot._internal.main:Location of certbot entry point: /opt/certbot/bin/certbot +2025-12-25 00:22:14,973:DEBUG:certbot._internal.main:Arguments: ['--config', '/etc/letsencrypt.ini', '--work-dir', '/tmp/letsencrypt-lib', '--logs-dir', '/data/logs', '--cert-name', 'npm-6', '--agree-tos', '--authenticator', 'webroot', '-m', 'kincses@gmail.com', '--preferred-challenges', 'http', '--domains', 'NAS'] +2025-12-25 00:22:14,973:DEBUG:certbot._internal.main:Discovered plugins: PluginsRegistry(PluginEntryPoint#manual,PluginEntryPoint#null,PluginEntryPoint#standalone,PluginEntryPoint#webroot) +2025-12-25 00:22:14,983:DEBUG:certbot._internal.log:Root logging level set at 30 +2025-12-25 00:22:14,984:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2025-12-25 00:22:14,984:DEBUG:certbot._internal.plugins.selection:Single candidate plugin: * webroot +Description: Saves the necessary validation files to a .well-known/acme-challenge/ directory within the nominated webroot path. A separate HTTP server must be running and serving files from the webroot path. HTTP challenge only (wildcards not supported). +Interfaces: Authenticator, Plugin +Entry point: EntryPoint(name='webroot', value='certbot._internal.plugins.webroot:Authenticator', group='certbot.plugins') +Initialized: +Prep: True +2025-12-25 00:22:14,984:DEBUG:certbot._internal.plugins.selection:Selected authenticator and installer None +2025-12-25 00:22:14,984:INFO:certbot._internal.plugins.selection:Plugins selected: Authenticator webroot, Installer None +2025-12-25 00:22:15,021:DEBUG:certbot._internal.main:Picked account: +2025-12-25 00:22:15,022:DEBUG:acme.client:Sending GET request to https://acme-v02.api.letsencrypt.org/directory. +2025-12-25 00:22:15,023:DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org:443 +2025-12-25 00:22:15,458:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "GET /directory HTTP/1.1" 200 1033 +2025-12-25 00:22:15,459:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:22:15 GMT +Content-Type: application/json +Content-Length: 1033 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "1l3nqP4MWMY": "https://community.letsencrypt.org/t/adding-random-entries-to-the-directory/33417", + "keyChange": "https://acme-v02.api.letsencrypt.org/acme/key-change", + "meta": { + "caaIdentities": [ + "letsencrypt.org" + ], + "profiles": { + "classic": "https://letsencrypt.org/docs/profiles#classic", + "shortlived": "https://letsencrypt.org/docs/profiles#shortlived", + "tlsclient": "https://letsencrypt.org/docs/profiles#tlsclient", + "tlsserver": "https://letsencrypt.org/docs/profiles#tlsserver" + }, + "termsOfService": "https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf", + "website": "https://letsencrypt.org" + }, + "newAccount": "https://acme-v02.api.letsencrypt.org/acme/new-acct", + "newNonce": "https://acme-v02.api.letsencrypt.org/acme/new-nonce", + "newOrder": "https://acme-v02.api.letsencrypt.org/acme/new-order", + "renewalInfo": "https://acme-v02.api.letsencrypt.org/acme/renewal-info", + "revokeCert": "https://acme-v02.api.letsencrypt.org/acme/revoke-cert" +} +2025-12-25 00:22:15,460:DEBUG:certbot._internal.display.obj:Notifying user: Requesting a certificate for nas +2025-12-25 00:22:15,466:DEBUG:acme.client:Requesting fresh nonce +2025-12-25 00:22:15,466:DEBUG:acme.client:Sending HEAD request to https://acme-v02.api.letsencrypt.org/acme/new-nonce. +2025-12-25 00:22:15,610:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "HEAD /acme/new-nonce HTTP/1.1" 200 0 +2025-12-25 00:22:15,611:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:22:15 GMT +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: GxwILcG0AD_6BXqPygFbMveOuqSkyCiMUeUVFAvrWZI2ElVq0Ng +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + + +2025-12-25 00:22:15,611:DEBUG:acme.client:Storing nonce: GxwILcG0AD_6BXqPygFbMveOuqSkyCiMUeUVFAvrWZI2ElVq0Ng +2025-12-25 00:22:15,612:DEBUG:acme.client:JWS payload: +b'{\n "identifiers": [\n {\n "type": "dns",\n "value": "nas"\n }\n ]\n}' +2025-12-25 00:22:15,616:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/new-order: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJHeHdJTGNHMEFEXzZCWHFQeWdGYk12ZU91cVNreUNpTVVlVVZGQXZyV1pJMkVsVnEwTmciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL25ldy1vcmRlciJ9", + "signature": "aJXimnOO7pSdAlG-4kI2bUUZur1O7B8TwxRG80y8nn30sdHmQvGJUANapSWrCeNO829809Id1OAWM9zyTkUc2fCqUvi2rchNuDQTRn9SkKLTF-il9YDATHln9_ntTx63_M1rpSd1Bc4C127E9kF_u0XhuOQwEX9-avrXX4IoIW5boT-UOBeTc99R7F-a44qwOygnAmm1kVsmEMhn3bDFq7zR433y8xZ3s0IOEdjwc0bBKRfyY7MSmfKd94CQOnsmwWl5Jihr0Thzb2PGrCNnPLrMZ5FJG03eFu_Dw1wHP6U5wX_AXwChJd62NtmJlLbCu38ZY4XJWWQfAU-AoZrj6w", + "payload": "ewogICJpZGVudGlmaWVycyI6IFsKICAgIHsKICAgICAgInR5cGUiOiAiZG5zIiwKICAgICAgInZhbHVlIjogIm5hcyIKICAgIH0KICBdCn0" +} +2025-12-25 00:22:15,759:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/new-order HTTP/1.1" 400 187 +2025-12-25 00:22:15,760:DEBUG:acme.client:Received response: +HTTP 400 +Server: nginx +Date: Thu, 25 Dec 2025 00:22:15 GMT +Content-Type: application/problem+json +Content-Length: 187 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: GxwILcG0ae-rlLzstdWaO22bjUruUT6uwpcxeklOj39FPgxhdl0 + +{ + "type": "urn:ietf:params:acme:error:rejectedIdentifier", + "detail": "Invalid identifiers requested :: Cannot issue for \"nas\": Domain name needs at least one dot", + "status": 400 +} +2025-12-25 00:22:15,761:DEBUG:certbot._internal.log:Exiting abnormally: +Traceback (most recent call last): + File "/opt/certbot/bin/certbot", line 7, in + sys.exit(main()) + ^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/main.py", line 18, in main + return internal_main.main(cli_args) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 1850, in main + return config.func(config, plugins) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 1562, in certonly + lineage = _get_and_save_cert(le_client, config, domains, certname, lineage) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 141, in _get_and_save_cert + lineage = le_client.obtain_and_enroll_certificate(domains, certname) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 526, in obtain_and_enroll_certificate + cert, chain, key, _ = self.obtain_certificate(domains) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 427, in obtain_certificate + orderr = self._get_order_and_authorizations(csr.data, self.config.allow_subset_of_names) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 487, in _get_order_and_authorizations + orderr = self.acme.new_order(csr_pem, profile=profile) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/acme/client.py", line 141, in new_order + response = self._post(self.directory['newOrder'], order) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/acme/client.py", line 467, in _post + return self.net.post(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/acme/client.py", line 818, in post + return self._post_once(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/acme/client.py", line 833, in _post_once + response = self._check_response(response, content_type=content_type) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/acme/client.py", line 705, in _check_response + raise messages.Error.from_json(jobj) +acme.messages.Error: urn:ietf:params:acme:error:rejectedIdentifier :: The server will not issue certificates for the identifier :: Invalid identifiers requested :: Cannot issue for "nas": Domain name needs at least one dot +2025-12-25 00:22:15,774:ERROR:certbot._internal.log:An unexpected error occurred: +2025-12-25 00:22:15,775:ERROR:certbot._internal.log:Invalid identifiers requested :: Cannot issue for "nas": Domain name needs at least one dot diff --git a/proxy-manager/data/logs/letsencrypt.log.14 b/proxy-manager/data/logs/letsencrypt.log.14 new file mode 100755 index 0000000..b065dff --- /dev/null +++ b/proxy-manager/data/logs/letsencrypt.log.14 @@ -0,0 +1,555 @@ +2025-12-25 00:05:39,572:DEBUG:certbot._internal.main:certbot version: 5.1.0 +2025-12-25 00:05:39,572:DEBUG:certbot._internal.main:Location of certbot entry point: /opt/certbot/bin/certbot +2025-12-25 00:05:39,572:DEBUG:certbot._internal.main:Arguments: ['--config', '/etc/letsencrypt.ini', '--work-dir', '/tmp/letsencrypt-lib', '--logs-dir', '/data/logs', '--cert-name', 'npm-5', '--agree-tos', '--authenticator', 'webroot', '-m', 'kincses@gmail.com', '--preferred-challenges', 'http', '--domains', 'Targetts.ddns.net'] +2025-12-25 00:05:39,572:DEBUG:certbot._internal.main:Discovered plugins: PluginsRegistry(PluginEntryPoint#manual,PluginEntryPoint#null,PluginEntryPoint#standalone,PluginEntryPoint#webroot) +2025-12-25 00:05:39,582:DEBUG:certbot._internal.log:Root logging level set at 30 +2025-12-25 00:05:39,583:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2025-12-25 00:05:39,583:DEBUG:certbot._internal.plugins.selection:Single candidate plugin: * webroot +Description: Saves the necessary validation files to a .well-known/acme-challenge/ directory within the nominated webroot path. A separate HTTP server must be running and serving files from the webroot path. HTTP challenge only (wildcards not supported). +Interfaces: Authenticator, Plugin +Entry point: EntryPoint(name='webroot', value='certbot._internal.plugins.webroot:Authenticator', group='certbot.plugins') +Initialized: +Prep: True +2025-12-25 00:05:39,583:DEBUG:certbot._internal.plugins.selection:Selected authenticator and installer None +2025-12-25 00:05:39,583:INFO:certbot._internal.plugins.selection:Plugins selected: Authenticator webroot, Installer None +2025-12-25 00:05:39,621:DEBUG:certbot._internal.main:Picked account: +2025-12-25 00:05:39,621:DEBUG:acme.client:Sending GET request to https://acme-v02.api.letsencrypt.org/directory. +2025-12-25 00:05:39,622:DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org:443 +2025-12-25 00:05:40,091:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "GET /directory HTTP/1.1" 200 1033 +2025-12-25 00:05:40,092:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:05:40 GMT +Content-Type: application/json +Content-Length: 1033 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "k1u_7EtCDpk": "https://community.letsencrypt.org/t/adding-random-entries-to-the-directory/33417", + "keyChange": "https://acme-v02.api.letsencrypt.org/acme/key-change", + "meta": { + "caaIdentities": [ + "letsencrypt.org" + ], + "profiles": { + "classic": "https://letsencrypt.org/docs/profiles#classic", + "shortlived": "https://letsencrypt.org/docs/profiles#shortlived", + "tlsclient": "https://letsencrypt.org/docs/profiles#tlsclient", + "tlsserver": "https://letsencrypt.org/docs/profiles#tlsserver" + }, + "termsOfService": "https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf", + "website": "https://letsencrypt.org" + }, + "newAccount": "https://acme-v02.api.letsencrypt.org/acme/new-acct", + "newNonce": "https://acme-v02.api.letsencrypt.org/acme/new-nonce", + "newOrder": "https://acme-v02.api.letsencrypt.org/acme/new-order", + "renewalInfo": "https://acme-v02.api.letsencrypt.org/acme/renewal-info", + "revokeCert": "https://acme-v02.api.letsencrypt.org/acme/revoke-cert" +} +2025-12-25 00:05:40,093:DEBUG:certbot._internal.display.obj:Notifying user: Requesting a certificate for targetts.ddns.net +2025-12-25 00:05:40,100:DEBUG:acme.client:Requesting fresh nonce +2025-12-25 00:05:40,100:DEBUG:acme.client:Sending HEAD request to https://acme-v02.api.letsencrypt.org/acme/new-nonce. +2025-12-25 00:05:40,255:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "HEAD /acme/new-nonce HTTP/1.1" 200 0 +2025-12-25 00:05:40,256:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:05:40 GMT +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJXsgdiDFJMgVaxkmBU1AnQK5qoB931VmrQf0n40_hCxQ +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + + +2025-12-25 00:05:40,256:DEBUG:acme.client:Storing nonce: fULB7aUJXsgdiDFJMgVaxkmBU1AnQK5qoB931VmrQf0n40_hCxQ +2025-12-25 00:05:40,257:DEBUG:acme.client:JWS payload: +b'{\n "identifiers": [\n {\n "type": "dns",\n "value": "targetts.ddns.net"\n }\n ]\n}' +2025-12-25 00:05:40,260:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/new-order: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSlhzZ2RpREZKTWdWYXhrbUJVMUFuUUs1cW9COTMxVm1yUWYwbjQwX2hDeFEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL25ldy1vcmRlciJ9", + "signature": "LHxEBie-zgglrEphUcgEO8lziYF-uSyRXGy0cbum-sRwwqf75I3A5vr-w3lyK8oIzXtH3g7CHN67-NP0fsGzqQLFprYNp6ex1M5R9FwurFgBasCmNppC9wULG4bkprzuPMKQuF0HVgLg0q0Ib3r8ijnb_u5jSFQopY8gVVKJ_SlqrDTgQC-paRKWG0ZWVibn9-iR1f7l8vk7hfCYFpgrvztROWoI6GikJIhkPZT97MPeyMC30vVDcQ08Imzip0ZUVLg-A8N_tTulBMT_IlxrY7dIZm7xJ2H5T035uJISot8_EuetawYvGHobPRZOMGw4esOb6RX_6rvqVyUrbPfY6A", + "payload": "ewogICJpZGVudGlmaWVycyI6IFsKICAgIHsKICAgICAgInR5cGUiOiAiZG5zIiwKICAgICAgInZhbHVlIjogInRhcmdldHRzLmRkbnMubmV0IgogICAgfQogIF0KfQ" +} +2025-12-25 00:05:40,455:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/new-order HTTP/1.1" 201 351 +2025-12-25 00:05:40,456:DEBUG:acme.client:Received response: +HTTP 201 +Server: nginx +Date: Thu, 25 Dec 2025 00:05:40 GMT +Content-Type: application/json +Content-Length: 351 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/462365093426 +Replay-Nonce: fULB7aUJRTJroWzqU9GB_Gs6tc2ssTS9lrMIqN6QPdNJLjlnQZQ +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "pending", + "expires": "2026-01-01T00:05:40Z", + "identifiers": [ + { + "type": "dns", + "value": "targetts.ddns.net" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632574996616" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/462365093426" +} +2025-12-25 00:05:40,456:DEBUG:acme.client:Storing nonce: fULB7aUJRTJroWzqU9GB_Gs6tc2ssTS9lrMIqN6QPdNJLjlnQZQ +2025-12-25 00:05:40,456:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 00:05:40,460:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632574996616: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSlJUSnJvV3pxVTlHQl9HczZ0YzJzc1RTOWxyTUlxTjZRUGROSkxqbG5RWlEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTc0OTk2NjE2In0", + "signature": "S18NnIl6jr6BWhprNuorB4wO_wQ_p_z92yRuAu8sVNxwpIK4fvPJTi_EBM_l9XGQ_B4sRNS4WF2-dmkR9kjFhhTlskMRaF9TlD3z-oCAgXSWUOlb5Mehr7AOwzgNm3E23JFhZMJDDqwQSUa17wk5liGBAIbscyrvYx8Wkzw442sXBOn7jfmAYfDT62vV85wwidlAxl2n5OblsTrLRn3baUkkMHmGjyZGlpHrV9vgTxFvglogPk77rOWG6tx4HYNx9GOuniUaBHInKYbDpVyZPreJrYNFVklF2XhcFY7WPJ5wwzGyamg8XyT4N_nN3DmyHyg49rxOdPPWSOKHVgVNuw", + "payload": "" +} +2025-12-25 00:05:40,618:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632574996616 HTTP/1.1" 200 825 +2025-12-25 00:05:40,619:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:05:40 GMT +Content-Type: application/json +Content-Length: 825 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJrq_bdyaMK8AFV7kCdIT5mH6NOtzklv8_mdbuRtWfkkc +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "targetts.ddns.net" + }, + "status": "pending", + "expires": "2026-01-01T00:05:40Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632574996616/3QI9bA", + "status": "pending", + "token": "Carv4gXM7xQ1uEibrPALL9r4ZqEIkoF90yNqLoGk3jk" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632574996616/Dmrcbw", + "status": "pending", + "token": "Carv4gXM7xQ1uEibrPALL9r4ZqEIkoF90yNqLoGk3jk" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632574996616/zijEvA", + "status": "pending", + "token": "Carv4gXM7xQ1uEibrPALL9r4ZqEIkoF90yNqLoGk3jk" + } + ] +} +2025-12-25 00:05:40,619:DEBUG:acme.client:Storing nonce: fULB7aUJrq_bdyaMK8AFV7kCdIT5mH6NOtzklv8_mdbuRtWfkkc +2025-12-25 00:05:40,620:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632574996616/zijEvA', 'status': 'pending', 'token': 'Carv4gXM7xQ1uEibrPALL9r4ZqEIkoF90yNqLoGk3jk'} +2025-12-25 00:05:40,621:INFO:certbot._internal.auth_handler:Performing the following challenges: +2025-12-25 00:05:40,621:INFO:certbot._internal.auth_handler:http-01 challenge for targetts.ddns.net +2025-12-25 00:05:40,621:INFO:certbot._internal.plugins.webroot:Using the webroot path /data/letsencrypt-acme-challenge for all unmatched domains. +2025-12-25 00:05:40,622:DEBUG:certbot._internal.plugins.webroot:Creating root challenges validation dir at /data/letsencrypt-acme-challenge/.well-known/acme-challenge +2025-12-25 00:05:40,624:DEBUG:certbot._internal.plugins.webroot:Attempting to save validation to /data/letsencrypt-acme-challenge/.well-known/acme-challenge/Carv4gXM7xQ1uEibrPALL9r4ZqEIkoF90yNqLoGk3jk +2025-12-25 00:05:40,625:DEBUG:acme.client:JWS payload: +b'{}' +2025-12-25 00:05:40,628:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632574996616/Dmrcbw: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSnJxX2JkeWFNSzhBRlY3a0NkSVQ1bUg2Tk90emtsdjhfbWRidVJ0V2Zra2MiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NoYWxsLzI5MDY0MzgxNzYvNjMyNTc0OTk2NjE2L0RtcmNidyJ9", + "signature": "RMSqADoOYQj-G5xF806VY2-p9A0g0XKCAxE758rjYnDwaZlGgvRyky3QvWoV-ZkVKq8j1T-FtYn77i7Iim5BcFfqermSPBSpsPWtJm6hWlMUuPZjG-_1rZJSpgajg57gNlw8MZ6JDBFOPnX_VxFZE5er_K9H8vErWXmXe-La8wfGmxfB-6x_4mt5v9lPJEzHLyEvj2DhRj4aI4ly3wJt9CRpxrhNSQMzVZ7NAO5SKUZs3tvwyfYN91pSawXb2MVOP28TCK0G4tPgQbYIW2twPJWHIRi-_huQJ2RjVLBjtqwJniP668wk_3_iXYIHnQExkrL_CmJ5oXg-v5gnspmJZw", + "payload": "e30" +} +2025-12-25 00:05:40,787:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/chall/2906438176/632574996616/Dmrcbw HTTP/1.1" 200 195 +2025-12-25 00:05:40,788:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:05:40 GMT +Content-Type: application/json +Content-Length: 195 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="up" +Location: https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632574996616/Dmrcbw +Replay-Nonce: fULB7aUJpgxwCzTDI7q654TVOMhrwkhyJ9p9wL5uQFOo3qN-rks +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632574996616/Dmrcbw", + "status": "pending", + "token": "Carv4gXM7xQ1uEibrPALL9r4ZqEIkoF90yNqLoGk3jk" +} +2025-12-25 00:05:40,788:DEBUG:acme.client:Storing nonce: fULB7aUJpgxwCzTDI7q654TVOMhrwkhyJ9p9wL5uQFOo3qN-rks +2025-12-25 00:05:40,789:INFO:certbot._internal.auth_handler:Waiting for verification... +2025-12-25 00:05:41,789:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 00:05:41,793:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632574996616: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSnBneHdDelRESTdxNjU0VFZPTWhyd2toeUo5cDl3TDV1UUZPbzNxTi1ya3MiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTc0OTk2NjE2In0", + "signature": "RxKLoUui9vvW6Up4nFEhJM6AJyeIpfQrNHJL5Kg_TrGsJEr2K1-CwDs7ghO72PwvhDbdwe8ys4juzKusBykZ1buBXZ3RI7YSsNyAcbtprX9k25yGyKenzaaOun4cfu3pIGE6mKFDIEZ0sxpBQWyhomSXX1qsZNiZ3P2nZkFU4lJQ_sFdwl_gTwdryIcJKfZOAP3syiLFESFGXxUGiFcqypl3UJSLCFdWH1x9rZIkg1kIsW-5P5i1cN-RVscYitmjEtfQILLwbGfuhXo6uMKTCtphbtOoygWeR18iIz7Mvcy66udY-as9GHREk7sR_9UxKgDLiYj65VA--VQqV7tmSw", + "payload": "" +} +2025-12-25 00:05:41,950:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632574996616 HTTP/1.1" 200 825 +2025-12-25 00:05:41,951:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:05:41 GMT +Content-Type: application/json +Content-Length: 825 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjENazP6tKsSkXT5TXH3oFwp-wXCM73M5PPRqbZzrT4Hgo +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "targetts.ddns.net" + }, + "status": "pending", + "expires": "2026-01-01T00:05:40Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632574996616/zijEvA", + "status": "pending", + "token": "Carv4gXM7xQ1uEibrPALL9r4ZqEIkoF90yNqLoGk3jk" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632574996616/3QI9bA", + "status": "pending", + "token": "Carv4gXM7xQ1uEibrPALL9r4ZqEIkoF90yNqLoGk3jk" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632574996616/Dmrcbw", + "status": "pending", + "token": "Carv4gXM7xQ1uEibrPALL9r4ZqEIkoF90yNqLoGk3jk" + } + ] +} +2025-12-25 00:05:41,951:DEBUG:acme.client:Storing nonce: 58tS3qjENazP6tKsSkXT5TXH3oFwp-wXCM73M5PPRqbZzrT4Hgo +2025-12-25 00:05:41,951:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632574996616/zijEvA', 'status': 'pending', 'token': 'Carv4gXM7xQ1uEibrPALL9r4ZqEIkoF90yNqLoGk3jk'} +2025-12-25 00:05:44,953:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 00:05:44,956:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632574996616: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRU5helA2dEtzU2tYVDVUWEgzb0Z3cC13WENNNzNNNVBQUnFiWnpyVDRIZ28iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTc0OTk2NjE2In0", + "signature": "fUjYjPZTnD3C4R0al-MUaWthvU3yLBpHJRyB0OlYRM8Sjiy0ee2pDReNa_s9hvHgT0XNUMsxDrkxIe8MoF3mmvDC9K7F5bTsuGSR4OORpp9reMDQDizhsALCE7ilL9vMwskY8rmsfYnuh5Z2KRO72ZSlHZWrp9QAkNmqcZD5HHxqM0baI6Y8RADv1nAQRtS2Yq52EvPQ4nGw1GyFDqfuUrf-dcMDyf60QA3-pLqCS1awWuyJuT-UYRbVHdKjqAh6IFQWHObECAz8P6HfuhGfWJdF6IASL-bKmLk25fObFR1kNw1UEvDjAfxhyv9NMbn3vcWXjf0__xtQgPnZbEOuXQ", + "payload": "" +} +2025-12-25 00:05:45,113:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632574996616 HTTP/1.1" 200 776 +2025-12-25 00:05:45,113:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:05:45 GMT +Content-Type: application/json +Content-Length: 776 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEi309dR45Zo9VcU81xwJl502LIbN0SL_Hjo8Y7InwJeo +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "targetts.ddns.net" + }, + "status": "valid", + "expires": "2026-01-24T00:05:42Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632574996616/Dmrcbw", + "status": "valid", + "validated": "2025-12-25T00:05:40Z", + "token": "Carv4gXM7xQ1uEibrPALL9r4ZqEIkoF90yNqLoGk3jk", + "validationRecord": [ + { + "url": "http://targetts.ddns.net/.well-known/acme-challenge/Carv4gXM7xQ1uEibrPALL9r4ZqEIkoF90yNqLoGk3jk", + "hostname": "targetts.ddns.net", + "port": "80", + "addressesResolved": [ + "92.249.165.228" + ], + "addressUsed": "92.249.165.228" + } + ] + } + ] +} +2025-12-25 00:05:45,114:DEBUG:acme.client:Storing nonce: 58tS3qjEi309dR45Zo9VcU81xwJl502LIbN0SL_Hjo8Y7InwJeo +2025-12-25 00:05:45,115:DEBUG:certbot._internal.error_handler:Calling registered functions +2025-12-25 00:05:45,115:INFO:certbot._internal.auth_handler:Cleaning up challenges +2025-12-25 00:05:45,115:DEBUG:certbot._internal.plugins.webroot:Removing /data/letsencrypt-acme-challenge/.well-known/acme-challenge/Carv4gXM7xQ1uEibrPALL9r4ZqEIkoF90yNqLoGk3jk +2025-12-25 00:05:45,116:DEBUG:certbot._internal.plugins.webroot:All challenges cleaned up +2025-12-25 00:05:45,116:DEBUG:certbot._internal.client:CSR: CSR(file=None, data=b'-----BEGIN CERTIFICATE REQUEST-----\nMIIBJzCBrgIBADAAMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEbppnNJdjc0qzZonc\n4aanqDlpEFG9XWU1L2OvCFZb9urxaNcrMLvEqXtBbAgTn0I1DlACppHvUm/0OK98\nnOUwEG4XbuerQJkb7VzQ8Gdkkqnon9YKwFsTQl2Ov/3cmu7loC8wLQYJKoZIhvcN\nAQkOMSAwHjAcBgNVHREEFTATghF0YXJnZXR0cy5kZG5zLm5ldDAKBggqhkjOPQQD\nAgNoADBlAjEAiE6jSrKJEoSp9qUhd/qQwTFB7by+8G6sG0IUl95XCI1/I/CjRmsI\n6lzC+m272pNIAjB6eqryBjKrBKKKUvsDL0qVoXdtTLbtGnPBrRfF4A4F+KG/jFN7\nWkzN/7lpd9zNimo=\n-----END CERTIFICATE REQUEST-----\n', form='pem') +2025-12-25 00:05:45,117:DEBUG:certbot._internal.client:Will poll for certificate issuance until 2025-12-25 00:07:15.117467 +2025-12-25 00:05:45,118:DEBUG:acme.client:JWS payload: +b'{\n "csr": "MIIBJzCBrgIBADAAMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEbppnNJdjc0qzZonc4aanqDlpEFG9XWU1L2OvCFZb9urxaNcrMLvEqXtBbAgTn0I1DlACppHvUm_0OK98nOUwEG4XbuerQJkb7VzQ8Gdkkqnon9YKwFsTQl2Ov_3cmu7loC8wLQYJKoZIhvcNAQkOMSAwHjAcBgNVHREEFTATghF0YXJnZXR0cy5kZG5zLm5ldDAKBggqhkjOPQQDAgNoADBlAjEAiE6jSrKJEoSp9qUhd_qQwTFB7by-8G6sG0IUl95XCI1_I_CjRmsI6lzC-m272pNIAjB6eqryBjKrBKKKUvsDL0qVoXdtTLbtGnPBrRfF4A4F-KG_jFN7WkzN_7lpd9zNimo"\n}' +2025-12-25 00:05:45,122:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/462365093426: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRWkzMDlkUjQ1Wm85VmNVODF4d0psNTAyTEliTjBTTF9Iam84WTdJbndKZW8iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2ZpbmFsaXplLzI5MDY0MzgxNzYvNDYyMzY1MDkzNDI2In0", + "signature": "gqcxNzOZ1OHoamHkU7lLli3V46z65ceeeHN2m5Qf_mUfU_YIGDwTpdA33Kl0eshQSO_0bo3ZoAv6CYFV9G8q1i3ltp7kb6eWRQCocwRuLKwZPCoVeeg4hWyeMHxzBAYYUcRX1IUy1igosZ_D7Ddye_u3Nqv-AGTCFDjGxR7M2T7aiLU_vOR1WX1E7f91qaz61Gr_fPCXSrpfi1Zf-2HXCaHEK1qdN1fg6K2XAVdL4ne5Gz4MCWrfRxD5dYG9H776l8L3MdZcnCwTz5C-1_Q5kU4OtgHbE0UcZ14Oxf2RtOG5BB7nauaCAb6_KjkD6fbQELx16egQkTeRsS_RFml0GA", + "payload": "ewogICJjc3IiOiAiTUlJQkp6Q0JyZ0lCQURBQU1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFYnBwbk5KZGpjMHF6Wm9uYzRhYW5xRGxwRUZHOVhXVTFMMk92Q0ZaYjl1cnhhTmNyTUx2RXFYdEJiQWdUbjBJMURsQUNwcEh2VW1fME9LOThuT1V3RUc0WGJ1ZXJRSmtiN1Z6UThHZGtrcW5vbjlZS3dGc1RRbDJPdl8zY211N2xvQzh3TFFZSktvWklodmNOQVFrT01TQXdIakFjQmdOVkhSRUVGVEFUZ2hGMFlYSm5aWFIwY3k1a1pHNXpMbTVsZERBS0JnZ3Foa2pPUFFRREFnTm9BREJsQWpFQWlFNmpTcktKRW9TcDlxVWhkX3FRd1RGQjdieS04RzZzRzBJVWw5NVhDSTFfSV9DalJtc0k2bHpDLW0yNzJwTklBakI2ZXFyeUJqS3JCS0tLVXZzREwwcVZvWGR0VExidEduUEJyUmZGNEE0Ri1LR19qRk43V2t6Tl83bHBkOXpOaW1vIgp9" +} +2025-12-25 00:05:45,521:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/finalize/2906438176/462365093426 HTTP/1.1" 200 453 +2025-12-25 00:05:45,522:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:05:45 GMT +Content-Type: application/json +Content-Length: 453 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/462365093426 +Replay-Nonce: fULB7aUJYstFBqA3aWs9mxw6uEASi-HKE4wo1eyBVGZ47l5NCYI +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "valid", + "expires": "2026-01-01T00:05:40Z", + "identifiers": [ + { + "type": "dns", + "value": "targetts.ddns.net" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632574996616" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/462365093426", + "certificate": "https://acme-v02.api.letsencrypt.org/acme/cert/0567c4e1e52bc596eee80511ff65c7045231" +} +2025-12-25 00:05:45,522:DEBUG:acme.client:Storing nonce: fULB7aUJYstFBqA3aWs9mxw6uEASi-HKE4wo1eyBVGZ47l5NCYI +2025-12-25 00:05:46,523:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 00:05:46,526:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/order/2906438176/462365093426: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSllzdEZCcUEzYVdzOW14dzZ1RUFTaS1IS0U0d28xZXlCVkdaNDdsNU5DWUkiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL29yZGVyLzI5MDY0MzgxNzYvNDYyMzY1MDkzNDI2In0", + "signature": "XbuxzdlIgBMXCZvbcdBuBMQBN-jJHncxUZ2CoZ717odE6kmY3VMP_mQgRbuj1Jn0NK9Nq9uIdyZedECq6ObbjuTfOB56EbsdAIAQGq1Oq-tcscxVT0p2jtGpxPjlFzQNe1vi4P6ruuM086v7RGnBIuzKNQdg0N6qMKf99vvOzW0CP8s0hE88fn7GOzAypahCKMtEA4eLGHT5kQZPDQJskUs1U364zRDEI-8hu1Ghm6nTbD4HhgBzuWh0rO12Z-5mgaPo_spK4jAfn7RrgHcCgdWaQ_d4BPTBYR12i_RcCvPeioAGMoiaztYOMfYqQvwv81iQ9eD8Iu0S7YPEmrmEwg", + "payload": "" +} +2025-12-25 00:05:46,682:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/order/2906438176/462365093426 HTTP/1.1" 200 453 +2025-12-25 00:05:46,683:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:05:46 GMT +Content-Type: application/json +Content-Length: 453 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/462365093426 +Replay-Nonce: fULB7aUJdBPo4kx1naK2jz7Q9PLGXF0GK4j8ZhXV1lw_vSx_fS0 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "valid", + "expires": "2026-01-01T00:05:40Z", + "identifiers": [ + { + "type": "dns", + "value": "targetts.ddns.net" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632574996616" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/462365093426", + "certificate": "https://acme-v02.api.letsencrypt.org/acme/cert/0567c4e1e52bc596eee80511ff65c7045231" +} +2025-12-25 00:05:46,683:DEBUG:acme.client:Storing nonce: fULB7aUJdBPo4kx1naK2jz7Q9PLGXF0GK4j8ZhXV1lw_vSx_fS0 +2025-12-25 00:05:46,684:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 00:05:46,686:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/cert/0567c4e1e52bc596eee80511ff65c7045231: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSmRCUG80a3gxbmFLMmp6N1E5UExHWEYwR0s0ajhaaFhWMWx3X3ZTeF9mUzAiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NlcnQvMDU2N2M0ZTFlNTJiYzU5NmVlZTgwNTExZmY2NWM3MDQ1MjMxIn0", + "signature": "LXpZ_1sqYbqZEV6AozikwESZB_nO61rzrG51UGk7z8-Pg7NfVRgGDd9aINDaldGmjN7EaQ9yH1yiNv5JRxuAkV8lPwt4_GCX1FjuTnZ65JTYwz8lusZJWTj5ddiOB9mA_-yKpf6SHkeI1b6dr_APYg96eeOHIdEX-E7T-q5Kqpx3NEeNG_BewDsmc9bCozDIyFQmSJpqbESaAfvGxRpjjjrhzY6i3yMbQuIiy6cqn3q7ToDXRrrKIsMy_vS-I1lXKD0IGlHZawF0kDc_Fnons5pIlhdX31ZwWpo-g-bAE6F1Q1K2jY2A5m1ZgCFj5HCsIEM_4wybQqfl1ZqgPeRljQ", + "payload": "" +} +2025-12-25 00:05:46,842:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/cert/0567c4e1e52bc596eee80511ff65c7045231 HTTP/1.1" 200 2905 +2025-12-25 00:05:46,842:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:05:46 GMT +Content-Type: application/pem-certificate-chain +Content-Length: 2905 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="alternate" +Replay-Nonce: fULB7aUJqPXGzW7nm6lsQI3Jc4GNvLKmO1ncqi3gwCx5-kBvX4A +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +-----BEGIN CERTIFICATE----- +MIIDrjCCAzSgAwIBAgISBWfE4eUrxZbu6AUR/2XHBFIxMAoGCCqGSM49BAMDMDIx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF +NzAeFw0yNTEyMjQyMzA3MTVaFw0yNjAzMjQyMzA3MTRaMBwxGjAYBgNVBAMTEXRh +cmdldHRzLmRkbnMubmV0MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEbppnNJdjc0qz +Zonc4aanqDlpEFG9XWU1L2OvCFZb9urxaNcrMLvEqXtBbAgTn0I1DlACppHvUm/0 +OK98nOUwEG4XbuerQJkb7VzQ8Gdkkqnon9YKwFsTQl2Ov/3cmu7lo4ICITCCAh0w +DgYDVR0PAQH/BAQDAgeAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAM +BgNVHRMBAf8EAjAAMB0GA1UdDgQWBBRkdzIL9Mu+mUplt6f4Z/80MuokEzAfBgNV +HSMEGDAWgBSuSJ7chx1EoG/aouVgdAR4wpwAgDAyBggrBgEFBQcBAQQmMCQwIgYI +KwYBBQUHMAKGFmh0dHA6Ly9lNy5pLmxlbmNyLm9yZy8wHAYDVR0RBBUwE4IRdGFy +Z2V0dHMuZGRucy5uZXQwEwYDVR0gBAwwCjAIBgZngQwBAgEwLQYDVR0fBCYwJDAi +oCCgHoYcaHR0cDovL2U3LmMubGVuY3Iub3JnLzUwLmNybDCCAQYGCisGAQQB1nkC +BAIEgfcEgfQA8gB3AEmcm2neHXzs/DbezYdkprhbrwqHgBnRVVL76esp3fjDAAAB +m1LTaKoAAAQDAEgwRgIhAI5q4PGH60OWaibalUHGm6EmlCqGgfOjn15nmKVQ37d4 +AiEAsS5aR/xBEfhiUbMCucTvsl3QLAOid+tI/z7tB5vq4pwAdwAOV5S8866pPjMb +LJkHs/eQ35vCPXEyJd0hqSWsYcVOIQAAAZtS02ifAAAEAwBIMEYCIQCsYfvhJlQv +vx3eVCerHw1Z6i39EZv0HSWmhZqhq1nTCQIhAPNsGeu51jzNdtuTSk0RIg6FePgZ +s6YURXF48dAU8/wOMAoGCCqGSM49BAMDA2gAMGUCMCYreQlbzELe4OdBK6u3Wgg9 +jLKm4gAVdQ9xgWMHPFPMYcUf5vekGpiYFvU6pKNcGAIxAKtMZqdaO0fB4NeyaMIx +YiTf4CNdcIom03b/PLO3EWx6/FMfLNlJBO4DJ0pjMIcWrQ== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIEVzCCAj+gAwIBAgIRAKp18eYrjwoiCWbTi7/UuqEwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw +WhcNMjcwMzEyMjM1OTU5WjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg +RW5jcnlwdDELMAkGA1UEAxMCRTcwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARB6AST +CFh/vjcwDMCgQer+VtqEkz7JANurZxLP+U9TCeioL6sp5Z8VRvRbYk4P1INBmbef +QHJFHCxcSjKmwtvGBWpl/9ra8HW0QDsUaJW2qOJqceJ0ZVFT3hbUHifBM/2jgfgw +gfUwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcD +ATASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSuSJ7chx1EoG/aouVgdAR4 +wpwAgDAfBgNVHSMEGDAWgBR5tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcB +AQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0g +BAwwCjAIBgZngQwBAgEwJwYDVR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVu +Y3Iub3JnLzANBgkqhkiG9w0BAQsFAAOCAgEAjx66fDdLk5ywFn3CzA1w1qfylHUD +aEf0QZpXcJseddJGSfbUUOvbNR9N/QQ16K1lXl4VFyhmGXDT5Kdfcr0RvIIVrNxF +h4lqHtRRCP6RBRstqbZ2zURgqakn/Xip0iaQL0IdfHBZr396FgknniRYFckKORPG +yM3QKnd66gtMst8I5nkRQlAg/Jb+Gc3egIvuGKWboE1G89NTsN9LTDD3PLj0dUMr +OIuqVjLB8pEC6yk9enrlrqjXQgkLEYhXzq7dLafv5Vkig6Gl0nuuqjqfp0Q1bi1o +yVNAlXe6aUXw92CcghC9bNsKEO1+M52YY5+ofIXlS/SEQbvVYYBLZ5yeiglV6t3S +M6H+vTG0aP9YHzLn/KVOHzGQfXDP7qM5tkf+7diZe7o2fw6O7IvN6fsQXEQQj8TJ +UXJxv2/uJhcuy/tSDgXwHM8Uk34WNbRT7zGTGkQRX0gsbjAea/jYAoWv0ZvQRwpq +Pe79D/i7Cep8qWnA+7AE/3B3S/3dEEYmc0lpe1366A/6GEgk3ktr9PEoQrLChs6I +tu3wnNLB2euC8IKGLQFpGtOO/2/hiAKjyajaBP25w1jF0Wl8Bbqne3uZ2q1GyPFJ +YRmT7/OXpmOH/FVLtwS+8ng1cAmpCujPwteJZNcDG0sF2n/sc0+SQf49fdyUK0ty ++VUwFj9tmWxyR/M= +-----END CERTIFICATE----- + +2025-12-25 00:05:46,843:DEBUG:acme.client:Storing nonce: fULB7aUJqPXGzW7nm6lsQI3Jc4GNvLKmO1ncqi3gwCx5-kBvX4A +2025-12-25 00:05:46,843:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 00:05:46,847:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/cert/0567c4e1e52bc596eee80511ff65c7045231/1: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSnFQWEd6VzdubTZsc1FJM0pjNEdOdkxLbU8xbmNxaTNnd0N4NS1rQnZYNEEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NlcnQvMDU2N2M0ZTFlNTJiYzU5NmVlZTgwNTExZmY2NWM3MDQ1MjMxLzEifQ", + "signature": "EzTgcvIjtGmVlMD3j92b2YUXDkpzZoCC9mfkwqV_KnUbT2um6wxHnDyKcao-68VX_LtU6OztfWipBPzBjLT9jYH8kb8lQePCvBQVLjN1V9-UBoJr9tzEid87IyN8OA4h8fdOpyrV6laVi64t1RqVIdIFxHMj9l8TpcF0_KDRTbAkIA26OSRWMp-RQtGPYVw8t5nJBpWWDvZapnVdUYZu7GqBxumSKyc57FKXE5sQlyCM8MRcTqEY_MntBvFwZm_vYmm-K_CVWwiN-x_gdJ1EX8lOHF-6jfVHIChRI2uwQ6ZfFZG6cIVsSP5R9BDZfyBiM5JZ040XahrgxjkR-yzrcQ", + "payload": "" +} +2025-12-25 00:05:47,004:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/cert/0567c4e1e52bc596eee80511ff65c7045231/1 HTTP/1.1" 200 2340 +2025-12-25 00:05:47,005:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:05:46 GMT +Content-Type: application/pem-certificate-chain +Content-Length: 2340 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="alternate" +Replay-Nonce: fULB7aUJ9l9EZT39mTkRbN0Uc_EzHTT0pfJLQXmSxv-xjRLQYQ0 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +-----BEGIN CERTIFICATE----- +MIIDrjCCAzSgAwIBAgISBWfE4eUrxZbu6AUR/2XHBFIxMAoGCCqGSM49BAMDMDIx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF +NzAeFw0yNTEyMjQyMzA3MTVaFw0yNjAzMjQyMzA3MTRaMBwxGjAYBgNVBAMTEXRh +cmdldHRzLmRkbnMubmV0MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEbppnNJdjc0qz +Zonc4aanqDlpEFG9XWU1L2OvCFZb9urxaNcrMLvEqXtBbAgTn0I1DlACppHvUm/0 +OK98nOUwEG4XbuerQJkb7VzQ8Gdkkqnon9YKwFsTQl2Ov/3cmu7lo4ICITCCAh0w +DgYDVR0PAQH/BAQDAgeAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAM +BgNVHRMBAf8EAjAAMB0GA1UdDgQWBBRkdzIL9Mu+mUplt6f4Z/80MuokEzAfBgNV +HSMEGDAWgBSuSJ7chx1EoG/aouVgdAR4wpwAgDAyBggrBgEFBQcBAQQmMCQwIgYI +KwYBBQUHMAKGFmh0dHA6Ly9lNy5pLmxlbmNyLm9yZy8wHAYDVR0RBBUwE4IRdGFy +Z2V0dHMuZGRucy5uZXQwEwYDVR0gBAwwCjAIBgZngQwBAgEwLQYDVR0fBCYwJDAi +oCCgHoYcaHR0cDovL2U3LmMubGVuY3Iub3JnLzUwLmNybDCCAQYGCisGAQQB1nkC +BAIEgfcEgfQA8gB3AEmcm2neHXzs/DbezYdkprhbrwqHgBnRVVL76esp3fjDAAAB +m1LTaKoAAAQDAEgwRgIhAI5q4PGH60OWaibalUHGm6EmlCqGgfOjn15nmKVQ37d4 +AiEAsS5aR/xBEfhiUbMCucTvsl3QLAOid+tI/z7tB5vq4pwAdwAOV5S8866pPjMb +LJkHs/eQ35vCPXEyJd0hqSWsYcVOIQAAAZtS02ifAAAEAwBIMEYCIQCsYfvhJlQv +vx3eVCerHw1Z6i39EZv0HSWmhZqhq1nTCQIhAPNsGeu51jzNdtuTSk0RIg6FePgZ +s6YURXF48dAU8/wOMAoGCCqGSM49BAMDA2gAMGUCMCYreQlbzELe4OdBK6u3Wgg9 +jLKm4gAVdQ9xgWMHPFPMYcUf5vekGpiYFvU6pKNcGAIxAKtMZqdaO0fB4NeyaMIx +YiTf4CNdcIom03b/PLO3EWx6/FMfLNlJBO4DJ0pjMIcWrQ== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIICtzCCAjygAwIBAgIRAMWKhaLGI0XgqMRSU4efWTowCgYIKoZIzj0EAwMwTzEL +MAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNo +IEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDIwHhcNMjQwMzEzMDAwMDAwWhcN +MjcwMzEyMjM1OTU5WjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3MgRW5j +cnlwdDELMAkGA1UEAxMCRTcwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARB6ASTCFh/ +vjcwDMCgQer+VtqEkz7JANurZxLP+U9TCeioL6sp5Z8VRvRbYk4P1INBmbefQHJF +HCxcSjKmwtvGBWpl/9ra8HW0QDsUaJW2qOJqceJ0ZVFT3hbUHifBM/2jgfgwgfUw +DgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAS +BgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSuSJ7chx1EoG/aouVgdAR4wpwA +gDAfBgNVHSMEGDAWgBR8Qpau3ktIO/qS+J6Mz22LqXI3lTAyBggrBgEFBQcBAQQm +MCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly94Mi5pLmxlbmNyLm9yZy8wEwYDVR0gBAww +CjAIBgZngQwBAgEwJwYDVR0fBCAwHjAcoBqgGIYWaHR0cDovL3gyLmMubGVuY3Iu +b3JnLzAKBggqhkjOPQQDAwNpADBmAjEA/e5N+wjAk945cpaFxGaeMC13fyvdbNzX +lRg9HNdElxi5mXdI4az2CykNU07iFwqEAjEAihPCDkw4b1BvfLg8VNLLuaMpn1Rb +Z1682chR6zNRCseyie4SjyTCdkvsAa+omQSf +-----END CERTIFICATE----- + +2025-12-25 00:05:47,006:DEBUG:acme.client:Storing nonce: fULB7aUJ9l9EZT39mTkRbN0Uc_EzHTT0pfJLQXmSxv-xjRLQYQ0 +2025-12-25 00:05:47,008:INFO:certbot._internal.client:Non-standard path(s), might not work with crontab installed by your operating system package manager +2025-12-25 00:05:47,009:DEBUG:certbot._internal.storage:Creating directory /etc/letsencrypt/archive/npm-5. +2025-12-25 00:05:47,009:DEBUG:certbot._internal.storage:Creating directory /etc/letsencrypt/live/npm-5. +2025-12-25 00:05:47,010:DEBUG:certbot._internal.storage:Writing certificate to /etc/letsencrypt/live/npm-5/cert.pem. +2025-12-25 00:05:47,010:DEBUG:certbot._internal.storage:Writing private key to /etc/letsencrypt/live/npm-5/privkey.pem. +2025-12-25 00:05:47,011:DEBUG:certbot._internal.storage:Writing chain to /etc/letsencrypt/live/npm-5/chain.pem. +2025-12-25 00:05:47,011:DEBUG:certbot._internal.storage:Writing full chain to /etc/letsencrypt/live/npm-5/fullchain.pem. +2025-12-25 00:05:47,012:DEBUG:certbot._internal.storage:Writing README to /etc/letsencrypt/live/npm-5/README. +2025-12-25 00:05:47,041:DEBUG:certbot.configuration:Var account=e417a583de478a0cfdeed332c1113068 (set by user). +2025-12-25 00:05:47,041:DEBUG:certbot.configuration:Var key_type=ecdsa (set by user). +2025-12-25 00:05:47,041:DEBUG:certbot.configuration:Var elliptic_curve=secp384r1 (set by user). +2025-12-25 00:05:47,041:DEBUG:certbot.configuration:Var preferred_chain=ISRG Root X1 (set by user). +2025-12-25 00:05:47,042:DEBUG:certbot.configuration:Var pref_challs=['http-01'] (set by user). +2025-12-25 00:05:47,042:DEBUG:certbot.configuration:Var config_dir=/etc/letsencrypt (set by user). +2025-12-25 00:05:47,042:DEBUG:certbot.configuration:Var work_dir=/tmp/letsencrypt-lib (set by user). +2025-12-25 00:05:47,042:DEBUG:certbot.configuration:Var logs_dir=/data/logs (set by user). +2025-12-25 00:05:47,042:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2025-12-25 00:05:47,043:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2025-12-25 00:05:47,043:DEBUG:certbot.configuration:Var webroot_path=['/data/letsencrypt-acme-challenge'] (set by user). +2025-12-25 00:05:47,043:DEBUG:certbot.configuration:Var webroot_map={'targetts.ddns.net': '/data/letsencrypt-acme-challenge'} (set by user). +2025-12-25 00:05:47,045:DEBUG:certbot._internal.display.obj:Notifying user: +Successfully received certificate. +Certificate is saved at: /etc/letsencrypt/live/npm-5/fullchain.pem +Key is saved at: /etc/letsencrypt/live/npm-5/privkey.pem +This certificate expires on 2026-03-24. +These files will be updated when the certificate renews. +2025-12-25 00:05:47,045:DEBUG:certbot._internal.display.obj:Notifying user: NEXT STEPS: +2025-12-25 00:05:47,045:DEBUG:certbot._internal.display.obj:Notifying user: - The certificate will need to be renewed before it expires. Certbot can automatically renew the certificate in the background, but you may need to take steps to enable that functionality. See https://certbot.org/renewal-setup for instructions. +2025-12-25 00:05:47,047:DEBUG:certbot._internal.display.obj:Notifying user: If you like Certbot, please consider supporting our work by: + * Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate + * Donating to EFF: https://eff.org/donate-le diff --git a/proxy-manager/data/logs/letsencrypt.log.15 b/proxy-manager/data/logs/letsencrypt.log.15 new file mode 100755 index 0000000..c0ad055 --- /dev/null +++ b/proxy-manager/data/logs/letsencrypt.log.15 @@ -0,0 +1,1512 @@ +2025-12-24 22:15:02,881:DEBUG:certbot._internal.main:certbot version: 5.1.0 +2025-12-24 22:15:02,881:DEBUG:certbot._internal.main:Location of certbot entry point: /opt/certbot/bin/certbot +2025-12-24 22:15:02,881:DEBUG:certbot._internal.main:Arguments: ['--config', '/etc/letsencrypt.ini', '--work-dir', '/tmp/letsencrypt-lib', '--logs-dir', '/data/logs', '--cert-name', 'npm-4', '--agree-tos', '--authenticator', 'webroot', '-m', 'kincses@gmail.com', '--preferred-challenges', 'http', '--domains', 'dev.profibot.hu'] +2025-12-24 22:15:02,881:DEBUG:certbot._internal.main:Discovered plugins: PluginsRegistry(PluginEntryPoint#manual,PluginEntryPoint#null,PluginEntryPoint#standalone,PluginEntryPoint#webroot) +2025-12-24 22:15:02,891:DEBUG:certbot._internal.log:Root logging level set at 30 +2025-12-24 22:15:02,891:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2025-12-24 22:15:02,891:DEBUG:certbot._internal.plugins.selection:Single candidate plugin: * webroot +Description: Saves the necessary validation files to a .well-known/acme-challenge/ directory within the nominated webroot path. A separate HTTP server must be running and serving files from the webroot path. HTTP challenge only (wildcards not supported). +Interfaces: Authenticator, Plugin +Entry point: EntryPoint(name='webroot', value='certbot._internal.plugins.webroot:Authenticator', group='certbot.plugins') +Initialized: +Prep: True +2025-12-24 22:15:02,892:DEBUG:certbot._internal.plugins.selection:Selected authenticator and installer None +2025-12-24 22:15:02,892:INFO:certbot._internal.plugins.selection:Plugins selected: Authenticator webroot, Installer None +2025-12-24 22:15:02,929:DEBUG:certbot._internal.main:Picked account: +2025-12-24 22:15:02,929:DEBUG:acme.client:Sending GET request to https://acme-v02.api.letsencrypt.org/directory. +2025-12-24 22:15:02,930:DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org:443 +2025-12-24 22:15:03,400:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "GET /directory HTTP/1.1" 200 1033 +2025-12-24 22:15:03,401:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:15:03 GMT +Content-Type: application/json +Content-Length: 1033 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "SSPYI0mM2AM": "https://community.letsencrypt.org/t/adding-random-entries-to-the-directory/33417", + "keyChange": "https://acme-v02.api.letsencrypt.org/acme/key-change", + "meta": { + "caaIdentities": [ + "letsencrypt.org" + ], + "profiles": { + "classic": "https://letsencrypt.org/docs/profiles#classic", + "shortlived": "https://letsencrypt.org/docs/profiles#shortlived", + "tlsclient": "https://letsencrypt.org/docs/profiles#tlsclient", + "tlsserver": "https://letsencrypt.org/docs/profiles#tlsserver" + }, + "termsOfService": "https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf", + "website": "https://letsencrypt.org" + }, + "newAccount": "https://acme-v02.api.letsencrypt.org/acme/new-acct", + "newNonce": "https://acme-v02.api.letsencrypt.org/acme/new-nonce", + "newOrder": "https://acme-v02.api.letsencrypt.org/acme/new-order", + "renewalInfo": "https://acme-v02.api.letsencrypt.org/acme/renewal-info", + "revokeCert": "https://acme-v02.api.letsencrypt.org/acme/revoke-cert" +} +2025-12-24 22:15:03,402:DEBUG:certbot._internal.display.obj:Notifying user: Requesting a certificate for dev.profibot.hu +2025-12-24 22:15:03,405:DEBUG:acme.client:Requesting fresh nonce +2025-12-24 22:15:03,405:DEBUG:acme.client:Sending HEAD request to https://acme-v02.api.letsencrypt.org/acme/new-nonce. +2025-12-24 22:15:03,558:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "HEAD /acme/new-nonce HTTP/1.1" 200 0 +2025-12-24 22:15:03,559:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:15:03 GMT +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEfPk0EQkmqyyQRLVEIwmaz3IVJZjN1BOWH31lEoUE80A +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + + +2025-12-24 22:15:03,559:DEBUG:acme.client:Storing nonce: 58tS3qjEfPk0EQkmqyyQRLVEIwmaz3IVJZjN1BOWH31lEoUE80A +2025-12-24 22:15:03,560:DEBUG:acme.client:JWS payload: +b'{\n "identifiers": [\n {\n "type": "dns",\n "value": "dev.profibot.hu"\n }\n ]\n}' +2025-12-24 22:15:03,566:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/new-order: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRWZQazBFUWttcXl5UVJMVkVJd21hejNJVkpaak4xQk9XSDMxbEVvVUU4MEEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL25ldy1vcmRlciJ9", + "signature": "Ta6TUGo09g6Xu2MKzWQ60mIDNKuJwsXb-1Bowmcnl6niiKScqUDc_ikq6D_njM0q7BdXqV3OUkSwpRGCrKCtkZPl1OV2_5du3rk6rw0zd3p58_ji50EuRvF_3mIS8Q1KRD8kxIsKPoZkfcYJS8IkI9lH0pnBnBWJcWxvVhFqWfW4WZ5LUruIq_COuV4WDLihGlr3cVVUB7yNiDK6roP6Lwlf7yqfEZw6tYVXaU5CGBFdy1kHQAwmvhKV2RZ52EJMQvxE1wAW-4126BS--eomxyKCgBYFBKJJuNLxb8_aIq8yio5kLRa0zJvrfWfGsc6zpwxUr4z5L5I_GiRjkiQiWg", + "payload": "ewogICJpZGVudGlmaWVycyI6IFsKICAgIHsKICAgICAgInR5cGUiOiAiZG5zIiwKICAgICAgInZhbHVlIjogImRldi5wcm9maWJvdC5odSIKICAgIH0KICBdCn0" +} +2025-12-24 22:15:03,746:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/new-order HTTP/1.1" 201 349 +2025-12-24 22:15:03,747:DEBUG:acme.client:Received response: +HTTP 201 +Server: nginx +Date: Wed, 24 Dec 2025 22:15:03 GMT +Content-Type: application/json +Content-Length: 349 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/462336946666 +Replay-Nonce: 58tS3qjEoXzQw7iLepLemgoWn1R4ARWmjZ83tOmXNy-wVFUbjig +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "pending", + "expires": "2025-12-31T22:15:03Z", + "identifiers": [ + { + "type": "dns", + "value": "dev.profibot.hu" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535074556" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/462336946666" +} +2025-12-24 22:15:03,747:DEBUG:acme.client:Storing nonce: 58tS3qjEoXzQw7iLepLemgoWn1R4ARWmjZ83tOmXNy-wVFUbjig +2025-12-24 22:15:03,748:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 22:15:03,751:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535074556: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRW9YelF3N2lMZXBMZW1nb1duMVI0QVJXbWpaODN0T21YTnktd1ZGVWJqaWciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTM1MDc0NTU2In0", + "signature": "Z1v-LwSzyFzGDsL91I4ccOW2FMg2_PAWEFTrbnhwIXZo1OwvuzuE4C_np7qadakocaIiVZxBDAEiy66wZRh7YYyK-OOKgIf-b9VxbxozlcEnDvfZIc0hLZ5Vkg7QVNWh3ZXqGv5G5nbpOIPoMAhYSIEX-6ZrBbOlzf_HGQMUwrFJTEE44siNdwy98yV_vjyOeqpRl8OgTZ9QH6fdkEDoyEgz1DawHr1FCmjXCLsgT_4hpZCiEjuFYt2fUGdMLleyFksDrf7rkfrvh4AYJQIxWUO3cgeIJ9dqYwc30dXCC6NPXxb959Hb6mhyYv8rj3xOWwOW9uPzu1gAdsr1Eui9dQ", + "payload": "" +} +2025-12-24 22:15:03,909:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632535074556 HTTP/1.1" 200 823 +2025-12-24 22:15:03,910:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:15:03 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEKCm1zEPoYEG77OdTv01kKsTgeYdGWQD9enho-2-o21A +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "dev.profibot.hu" + }, + "status": "pending", + "expires": "2025-12-31T22:15:03Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/N1TSAA", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/FDGz7g", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + } + ] +} +2025-12-24 22:15:03,910:DEBUG:acme.client:Storing nonce: 58tS3qjEKCm1zEPoYEG77OdTv01kKsTgeYdGWQD9enho-2-o21A +2025-12-24 22:15:03,910:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q', 'status': 'pending', 'token': '9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY'} +2025-12-24 22:15:03,911:INFO:certbot._internal.auth_handler:Performing the following challenges: +2025-12-24 22:15:03,912:INFO:certbot._internal.auth_handler:http-01 challenge for dev.profibot.hu +2025-12-24 22:15:03,912:INFO:certbot._internal.plugins.webroot:Using the webroot path /data/letsencrypt-acme-challenge for all unmatched domains. +2025-12-24 22:15:03,913:DEBUG:certbot._internal.plugins.webroot:Creating root challenges validation dir at /data/letsencrypt-acme-challenge/.well-known/acme-challenge +2025-12-24 22:15:03,913:DEBUG:certbot._internal.plugins.webroot:Attempting to save validation to /data/letsencrypt-acme-challenge/.well-known/acme-challenge/9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY +2025-12-24 22:15:03,914:DEBUG:acme.client:JWS payload: +b'{}' +2025-12-24 22:15:03,915:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/FDGz7g: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRUtDbTF6RVBvWUVHNzdPZFR2MDFrS3NUZ2VZZEdXUUQ5ZW5oby0yLW8yMUEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NoYWxsLzI5MDY0MzgxNzYvNjMyNTM1MDc0NTU2L0ZER3o3ZyJ9", + "signature": "NMYogEwPiXw94KjNSYdSVYcREXcRbteemMN0i6a3UYT2DoMwiRaiMJYtUwEpg0baSQ3mFwatEyNnNeHqVp5PFk6BwSvRUpCsUhk3AzXVDiL6thBKHcHR5_VHdhS5jdyvdiw6_rMSCG5l_oWTnxCgvXqkUgWeiAfjw7hZBDQtewubEP92vTDpGYgGgkRg_fiAR7jEhDzCk1QiWYqLMkCykSGgc7TF_IfCAFNo24aB_Sqv7He_vrWAxTDTSGkNFMkmCL2_BT3HzIbZm1afBn9XxRbLn2iKBwkqkuPqI0xgt1hFUFYChu_Uk8FtGpR-eFzgglJiAVdgFrI8HviqTWdHTA", + "payload": "e30" +} +2025-12-24 22:15:04,073:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/chall/2906438176/632535074556/FDGz7g HTTP/1.1" 200 195 +2025-12-24 22:15:04,074:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:15:03 GMT +Content-Type: application/json +Content-Length: 195 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="up" +Location: https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/FDGz7g +Replay-Nonce: fULB7aUJzkBla4qGMjUc_zfmVlbqFCEMxQVon_i91_wW-7wb2Zw +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/FDGz7g", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" +} +2025-12-24 22:15:04,075:DEBUG:acme.client:Storing nonce: fULB7aUJzkBla4qGMjUc_zfmVlbqFCEMxQVon_i91_wW-7wb2Zw +2025-12-24 22:15:04,075:INFO:certbot._internal.auth_handler:Waiting for verification... +2025-12-24 22:15:05,076:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 22:15:05,080:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535074556: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSnprQmxhNHFHTWpVY196Zm1WbGJxRkNFTXhRVm9uX2k5MV93Vy03d2IyWnciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTM1MDc0NTU2In0", + "signature": "EjzULhNW_qaAoYlKXu-KPlzm4HCyPE4SEV9THDudsxePxbSKStkyeP6mqe6cJrrFtjI2FHoMwSRpDJl_f1g2VGpsE9PMl9vYf5y30E-XdtFsA6y0fi1riuauKT7BmsL-F_ngbwgUCsMmF4F4PmAIsEHAR8zL9ziOCBo7f6Bv0e9iPhhtnqNfh8qg_vHLx8z3cgcNkL634Ohin3Wah9ljZNqd6XEaB6StFWtEgA3UQFWOCqD3foF45i0AK9E7RsLfWCcjjVFoRjs5hW1DSH2nZoEynnFCRVlw0de2parHj1QARdGMvrEYq7qZncPWdtbilz32P-hQ4ZUt6Y33RWzumQ", + "payload": "" +} +2025-12-24 22:15:05,236:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632535074556 HTTP/1.1" 200 823 +2025-12-24 22:15:05,237:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:15:05 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjECTgbEUfoaR851HRfXSKQNZYHQ6iqTNfHa2mAio0T-n4 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "dev.profibot.hu" + }, + "status": "pending", + "expires": "2025-12-31T22:15:03Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/N1TSAA", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/FDGz7g", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + } + ] +} +2025-12-24 22:15:05,238:DEBUG:acme.client:Storing nonce: 58tS3qjECTgbEUfoaR851HRfXSKQNZYHQ6iqTNfHa2mAio0T-n4 +2025-12-24 22:15:05,238:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q', 'status': 'pending', 'token': '9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY'} +2025-12-24 22:15:08,239:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 22:15:08,243:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535074556: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRUNUZ2JFVWZvYVI4NTFIUmZYU0tRTlpZSFE2aXFUTmZIYTJtQWlvMFQtbjQiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTM1MDc0NTU2In0", + "signature": "fBJlK8bO4jn_fyrfD8Y7vqs0M1Lgvva7WKNJdRsFIDyiV8CMIUtPrwgT_K3b1CZ815H2La01SC3qZfTSyrbOVHQQrDCqPs29JE8Rz_Kg5aAz_UG8w7GwEbcb-bIqVWJ-YlG0gUxL-THxAUn3j2FQBfzNdtTOd7lIwAze4dRsV2NhlmhrOungEnBrIMjVghZu-Uap0MOyJuy2GpdakhZndi8I3SevCyNarMZAI0jDZfN_6Vn88POsa2N1E41clazslidn4b_DvzI1MbnMrkxGo75Fv8Ft9Lrof5mT_baacniZC3DDfZkErjrdb3J1MpcBZGb3SEziAB1P_bKBh707lw", + "payload": "" +} +2025-12-24 22:15:08,397:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632535074556 HTTP/1.1" 200 823 +2025-12-24 22:15:08,398:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:15:08 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEgkl4O1g1hrIfR9wklFe-fLThQ2aech5V3e2l7e8BmDU +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "dev.profibot.hu" + }, + "status": "pending", + "expires": "2025-12-31T22:15:03Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/N1TSAA", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/FDGz7g", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + } + ] +} +2025-12-24 22:15:08,398:DEBUG:acme.client:Storing nonce: 58tS3qjEgkl4O1g1hrIfR9wklFe-fLThQ2aech5V3e2l7e8BmDU +2025-12-24 22:15:08,398:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q', 'status': 'pending', 'token': '9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY'} +2025-12-24 22:15:11,399:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 22:15:11,403:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535074556: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRWdrbDRPMWcxaHJJZlI5d2tsRmUtZkxUaFEyYWVjaDVWM2UybDdlOEJtRFUiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTM1MDc0NTU2In0", + "signature": "XirtNQ8E0zF4DYhxZC3WO9alvEEX6GcvEHJBeZJiYXQkp2TdMG4sd7ILTRU8-lgvT2z5iwoP1XYpSn9Vgag3nSyoKgtWfFxBHT6MOBYLuOS9Q3Q18r6po4nAithMIRdxvrg6xejM8-5QwN7hRC41bbgZOaVgGLZHUbKBE0Mu4rU93JmgESXXMmVkl9NRzSCm4sKEgRtCJU659B46LTFmSDjKa0zOTeP4a1dD8ICCHT3-UZRg26MKAacAGoDf61cD1HgxmEAZsY8q1WHEKVHUnPJcyb7Nuhn4IBWNFFKiK8dxDB1pIEUInYUTjma1weF8cZc77F6vnNwqIhjAhVqMZw", + "payload": "" +} +2025-12-24 22:15:11,570:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632535074556 HTTP/1.1" 200 823 +2025-12-24 22:15:11,571:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:15:11 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEYyhNoGMuDwM4oaWyLPWFbyT8RMpaZ5egHGfszwMVGn8 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "dev.profibot.hu" + }, + "status": "pending", + "expires": "2025-12-31T22:15:03Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/N1TSAA", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/FDGz7g", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + } + ] +} +2025-12-24 22:15:11,571:DEBUG:acme.client:Storing nonce: 58tS3qjEYyhNoGMuDwM4oaWyLPWFbyT8RMpaZ5egHGfszwMVGn8 +2025-12-24 22:15:11,572:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q', 'status': 'pending', 'token': '9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY'} +2025-12-24 22:15:14,573:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 22:15:14,576:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535074556: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRVl5aE5vR011RHdNNG9hV3lMUFdGYnlUOFJNcGFaNWVnSEdmc3p3TVZHbjgiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTM1MDc0NTU2In0", + "signature": "CFJiWCpudmVx4Q1Tg8MVEpnLVlmlrrggfYFiwE8BMWWy_3i7Y4clHyZ-MAaKSmFW702SXqkBpJ0R9fnJ_GK2-DYuWMnS_uuRaJpqAcSVNJyZ6hsfqOhZOq6CZv9w3kIMvuDSibUcwzgUdA7Krs7f3tLP5jKxx9nP9Jqac-pkNt7Q8VwtkX3mk0Ny5rRWAtn_4yWjY3LFdjkma59ajlstL-DvScs6OKsIhrjQ3RG0AVdZfC2mYbF8w-7sLPdze0N9gZNxoTzz-Yctfc3h6wV_mvE8ykphVrtXfV1E-5YLLhJHGboXc2HVuBLQfOrnCF3gNkdkfiDbloK4HGAp6yOGiw", + "payload": "" +} +2025-12-24 22:15:14,745:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632535074556 HTTP/1.1" 200 823 +2025-12-24 22:15:14,746:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:15:14 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJcUwz8IQlXeDEK-rcJi-uBLPkgvtjzNE7PjTRF4mHj0w +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "dev.profibot.hu" + }, + "status": "pending", + "expires": "2025-12-31T22:15:03Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/N1TSAA", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/FDGz7g", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + } + ] +} +2025-12-24 22:15:14,746:DEBUG:acme.client:Storing nonce: fULB7aUJcUwz8IQlXeDEK-rcJi-uBLPkgvtjzNE7PjTRF4mHj0w +2025-12-24 22:15:14,747:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q', 'status': 'pending', 'token': '9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY'} +2025-12-24 22:15:17,747:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 22:15:17,751:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535074556: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSmNVd3o4SVFsWGVERUstcmNKaS11QkxQa2d2dGp6TkU3UGpUUkY0bUhqMHciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTM1MDc0NTU2In0", + "signature": "ix582SLecIYFqh6tmCd-Q1URsfQZpEGJW_22CojAaZgKE1LFXCSxGWxVh7fO9oVZ3qoKzw0yzJrrZAsyp4GMAZ1A74ilBKDRSe802vhJRwR_-IkgJYZ16G7QFISfx-LCqViAXAAc0wKqybZcOSPNeqscp5oInwGW3jQiMELM5mGM0Sdu4HX5x17D12XSRKWawveizYDjrl1gcREtZNRvsIu9x9hTao72qXnsWdeVnYCPp8tjgLYNxr9YyoSoxzaPwyUavbIKsT3jr-PbRVdsS0c9KhZDHIoqOT2bMY0G77VRYkTgFGlBPfYkIahurY_6AcpjhK789iBX9NIuAIT5xQ", + "payload": "" +} +2025-12-24 22:15:17,908:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632535074556 HTTP/1.1" 200 823 +2025-12-24 22:15:17,909:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:15:17 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJEW6LVquNh6e58jH8tSX6X64SXLpAs-BJXaq3XMQWpZg +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "dev.profibot.hu" + }, + "status": "pending", + "expires": "2025-12-31T22:15:03Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/FDGz7g", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/N1TSAA", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + } + ] +} +2025-12-24 22:15:17,909:DEBUG:acme.client:Storing nonce: fULB7aUJEW6LVquNh6e58jH8tSX6X64SXLpAs-BJXaq3XMQWpZg +2025-12-24 22:15:17,910:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q', 'status': 'pending', 'token': '9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY'} +2025-12-24 22:15:20,911:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 22:15:20,915:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535074556: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSkVXNkxWcXVOaDZlNThqSDh0U1g2WDY0U1hMcEFzLUJKWGFxM1hNUVdwWmciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTM1MDc0NTU2In0", + "signature": "Gp7dUNsbrpLg2gNEwS6Zt9jWb6alNy7yhyMLW8U_SqaTVHhbyJOnbFstdkJwjkMgYFXrROZVdfetf9m9VdRYLhmP4XiDBHSsj8iecX358eRWZH2v68vBwU5RaYWrENTCgr7x2DU1ItcPmIWWv0NH_QYNT28WZa0dZ0WWqZpjzkMIXU8F_8Tjl61JcY8ojP5gnpHUdwo8Cyixu5vb8Z_hYOjt9otuuGTy-t4oqRL07VuIPHRmL4ZRsINqJ1nLc0UIRJvJePiEC1ljFKuDisKRm6ngYPm2YleKvUpPwy0OwGvmLiMLlVpC_tfPCzKrEm5zao3p9CedG_2MQyIvmfOxmw", + "payload": "" +} +2025-12-24 22:15:21,072:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632535074556 HTTP/1.1" 200 823 +2025-12-24 22:15:21,073:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:15:20 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjECZi3ZQOZ0KCxdHz0q-t7530CX1KE7eBjyJkTtfYD1ZU +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "dev.profibot.hu" + }, + "status": "pending", + "expires": "2025-12-31T22:15:03Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/FDGz7g", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/N1TSAA", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + } + ] +} +2025-12-24 22:15:21,073:DEBUG:acme.client:Storing nonce: 58tS3qjECZi3ZQOZ0KCxdHz0q-t7530CX1KE7eBjyJkTtfYD1ZU +2025-12-24 22:15:21,074:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q', 'status': 'pending', 'token': '9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY'} +2025-12-24 22:15:24,074:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 22:15:24,078:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535074556: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRUNaaTNaUU9aMEtDeGRIejBxLXQ3NTMwQ1gxS0U3ZUJqeUprVHRmWUQxWlUiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTM1MDc0NTU2In0", + "signature": "B6b4WvJK8PGs_G0M6mE_kdHKvVHrxdB_bpJb6pMWu_KbWoq5OQfdIoAKn6jyRdWQVI92myeIrGRaVT0FGCFe5OdgRMToP0Fi4dhAJPs-pLb-S2xy3DtE5N6CfUmTGBWwR8UBd6YSK8FXoPnT1yHF9cZLC5Eww6jeFMBQOkUeIH04Zxn4W5w9EVvKL8KZmhWyf5jB1m33vISU3jfIVRNlXhjsFASl_xdiU6wujgQGLg3eXXECpFYymgG4gY7Iq55Flju93CyJSSUKujrIhUKQXmc1xoaCcCkVjnEIj9QLUqtyOCPUCFf9SeZyBWG7RfBJZW8SKPb4tQQMaRsdqQUWIw", + "payload": "" +} +2025-12-24 22:15:24,235:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632535074556 HTTP/1.1" 200 823 +2025-12-24 22:15:24,236:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:15:24 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJ4KD6LiMEq6l3wg8xIk3qw5kYzuzWElebhlsxSLgPMmU +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "dev.profibot.hu" + }, + "status": "pending", + "expires": "2025-12-31T22:15:03Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/FDGz7g", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/N1TSAA", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + } + ] +} +2025-12-24 22:15:24,236:DEBUG:acme.client:Storing nonce: fULB7aUJ4KD6LiMEq6l3wg8xIk3qw5kYzuzWElebhlsxSLgPMmU +2025-12-24 22:15:24,237:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q', 'status': 'pending', 'token': '9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY'} +2025-12-24 22:15:27,238:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 22:15:27,241:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535074556: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSjRLRDZMaU1FcTZsM3dnOHhJazNxdzVrWXp1eldFbGViaGxzeFNMZ1BNbVUiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTM1MDc0NTU2In0", + "signature": "KP5zc6zAFXyX3b0DmJBHzpxspzzjBiA7Pguqqx6xx_K9GRqmZbBWmT6MNKwy5cVLkO0fikBm9Q7-PoX147ElHdg_1O_Ml5Z4-DO13R6EyMR6kslNQPQBXzvfPkgPLiS-r30dmLG3GAEZWxS0yJ7dXZez15l9Cm7RtMJBuVf51p-XG-lTULguoeyrTxFa48Z6KDgAa7mn3sX-ynUgX8_NA2fBnJqL5BRndCechhVO6hA4NHWs6DLTdvORLwB13ThLvhEoc7dPUUykJRSqfkJwq4novXzysk8I9JHVKMHdri8H4xi00IJJPuUeaTmk4G_8p_It36ussknUaTTJf4ZTWA", + "payload": "" +} +2025-12-24 22:15:27,397:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632535074556 HTTP/1.1" 200 823 +2025-12-24 22:15:27,397:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:15:27 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEljf8n4BaDkm2938BzG64B8E-ehtdZXf-DQ5W2p_Tvjw +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "dev.profibot.hu" + }, + "status": "pending", + "expires": "2025-12-31T22:15:03Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/N1TSAA", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/FDGz7g", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + } + ] +} +2025-12-24 22:15:27,398:DEBUG:acme.client:Storing nonce: 58tS3qjEljf8n4BaDkm2938BzG64B8E-ehtdZXf-DQ5W2p_Tvjw +2025-12-24 22:15:27,398:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q', 'status': 'pending', 'token': '9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY'} +2025-12-24 22:15:30,399:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 22:15:30,403:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535074556: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRWxqZjhuNEJhRGttMjkzOEJ6RzY0QjhFLWVodGRaWGYtRFE1VzJwX1R2anciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTM1MDc0NTU2In0", + "signature": "GLINIuixYNaOJl5c_fZf4QBYcEpn01ZwYYAv1ML58phKgEj19TzsuLtUGJYbcUYF3HDZ0v3X0txvFAy20WyIZFsM2JW3xj2vCv7yBxmQGPUn8aoeanByLKkUGcp77GAwsvdxyCLtaMdA6jdjBITcqN0arA7CEVe89v3VnGipYyDvFej7V7mhjVTBCRR6vB4LLB8Is80xRCEV7nlvdI36GMmLVvnB-SpcNwvbnq716hW30ip5mai2iHT_zVpGjwxbeziNc0Fvfq08wHofBdYrA9Nh4X7ug14sI1rvkFNLuflsfb2gr4Biq6pLPuaa0KeIyNSUsBojDQV5aDPlvVIH6Q", + "payload": "" +} +2025-12-24 22:15:30,559:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632535074556 HTTP/1.1" 200 823 +2025-12-24 22:15:30,559:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:15:30 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEuXPzx6ccwJ_H9S5hE3neJRjkb2WcvB9V-bo2BjAFasQ +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "dev.profibot.hu" + }, + "status": "pending", + "expires": "2025-12-31T22:15:03Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/N1TSAA", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/FDGz7g", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + } + ] +} +2025-12-24 22:15:30,560:DEBUG:acme.client:Storing nonce: 58tS3qjEuXPzx6ccwJ_H9S5hE3neJRjkb2WcvB9V-bo2BjAFasQ +2025-12-24 22:15:30,560:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q', 'status': 'pending', 'token': '9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY'} +2025-12-24 22:15:33,561:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 22:15:33,564:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535074556: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRXVYUHp4NmNjd0pfSDlTNWhFM25lSlJqa2IyV2N2QjlWLWJvMkJqQUZhc1EiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTM1MDc0NTU2In0", + "signature": "V9IEoiDKbPZh5IkWfpLzXfCHF9eWoh507o9WwaX_Lfe3PlvotEItCqWzvyvnlAb67zU2hR7p6oHyGefgucA0gh2ZLpUht_wPAlM9BVyYCuio-JsrcxL0MvWJPxEo-YIv6g1xsjY_TtyyT3ImkbIrA7J2M2MUmATtsH1nF4f8BL5pNz8HeWT000Rwflwxbwybny2fbLfjlvdX00JrsecNdQ0XIh7ZxfdjZbOUOl7WiCCDcHBpfArG9H_NzAAr5D4jQpxdfyU3AyzZZySq8Ag3Yq8EVplJ-QMFn85wt4TaCYFG6Pomc50qFUX_r8OMcAbzciwaHMc4ML_MINRUGnVNfA", + "payload": "" +} +2025-12-24 22:15:33,719:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632535074556 HTTP/1.1" 200 823 +2025-12-24 22:15:33,720:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:15:33 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjER74oEjtPMXdgAp98tbtujmJF15b9TRTuAr_LNBVrMiQ +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "dev.profibot.hu" + }, + "status": "pending", + "expires": "2025-12-31T22:15:03Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/N1TSAA", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/FDGz7g", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + } + ] +} +2025-12-24 22:15:33,720:DEBUG:acme.client:Storing nonce: 58tS3qjER74oEjtPMXdgAp98tbtujmJF15b9TRTuAr_LNBVrMiQ +2025-12-24 22:15:33,721:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q', 'status': 'pending', 'token': '9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY'} +2025-12-24 22:15:36,722:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 22:15:36,726:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535074556: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRVI3NG9FanRQTVhkZ0FwOTh0YnR1am1KRjE1YjlUUlR1QXJfTE5CVnJNaVEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTM1MDc0NTU2In0", + "signature": "I_WUHOYNgpvjJ2jATeMZaaYA4H0KO9Kmjb2_UD05RM9XExZRvrrz-MWwlTKoFFQWDSngl1UC2vcHiB8ZLtyIvN8jdmkgOURvLP_CZjZyY9eAtojeMBjm4cKPgnHSuZLlEeJdy5Qi80shxyW-WKHIvN04t0uPDtxbDqk0B0pD4uejkgHS4oddYpopFUnh3QJPSjJLAoFDUqLS7Dmwpv-FylnQTmvcR_Vmv2c8Qx-8GJAd-RMbWiky6WjmBMu0DySctwBcSPDLWI3W5CgZG701qccxI563fodYCd2MzqwC8Y4acNzVfB-XUZLtZOBd4dlcv7ROArouW7p_OLnzTDqXfA", + "payload": "" +} +2025-12-24 22:15:36,883:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632535074556 HTTP/1.1" 200 823 +2025-12-24 22:15:36,884:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:15:36 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjE5GF5LvPl1VfRvQVF06tHRsLlPHT2VDwb-O0Thte-U4g +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "dev.profibot.hu" + }, + "status": "pending", + "expires": "2025-12-31T22:15:03Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/N1TSAA", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/FDGz7g", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + } + ] +} +2025-12-24 22:15:36,884:DEBUG:acme.client:Storing nonce: 58tS3qjE5GF5LvPl1VfRvQVF06tHRsLlPHT2VDwb-O0Thte-U4g +2025-12-24 22:15:36,884:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q', 'status': 'pending', 'token': '9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY'} +2025-12-24 22:15:39,885:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 22:15:39,889:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535074556: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRTVHRjVMdlBsMVZmUnZRVkYwNnRIUnNMbFBIVDJWRHdiLU8wVGh0ZS1VNGciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTM1MDc0NTU2In0", + "signature": "iuGQ536NQ7IF00b6SPXIlDkJdGTmXrFzaL6leywX4TMAYkQzo53oJhFCtLxYoKzwUP_Q9y91u2nJw9d--IJbu_AkpHdjWRwbll785_y5KTcdLyfKPRnNai3ufBB1McgCoT1I9YAwSKhBK7MNjA5t_dBAMYEGfR6ZGxKZWH9pzsybHUTnr600LRFet2cdIeey-bFugCgYul-CZPsQQFLcI3CobifkxzO2sGIKe_twnS6nGh5WKgqfYrUd9gAdTI2BmcnLJarRnbl4P4vh1R570nDyY7Y7yRQGfWUfNCJntm5g8wpVCPJN3BK6WOwMD1sQBXlM53wQgJJhg2uGAGVUvw", + "payload": "" +} +2025-12-24 22:15:40,045:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632535074556 HTTP/1.1" 200 823 +2025-12-24 22:15:40,046:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:15:39 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJUC6jrDPawL_hfKc2iEtLusbG5rTyY0oMa0xpNLu30pQ +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "dev.profibot.hu" + }, + "status": "pending", + "expires": "2025-12-31T22:15:03Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/FDGz7g", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/N1TSAA", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + } + ] +} +2025-12-24 22:15:40,047:DEBUG:acme.client:Storing nonce: fULB7aUJUC6jrDPawL_hfKc2iEtLusbG5rTyY0oMa0xpNLu30pQ +2025-12-24 22:15:40,047:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q', 'status': 'pending', 'token': '9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY'} +2025-12-24 22:15:43,048:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 22:15:43,051:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535074556: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSlVDNmpyRFBhd0xfaGZLYzJpRXRMdXNiRzVyVHlZMG9NYTB4cE5MdTMwcFEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTM1MDc0NTU2In0", + "signature": "GTlOxrjOupzJ5CR93d-IEvNVbQkzrcrgsbD5ubRl-gZsHNawLJMRVKpX9W8d3xwYxYv6titHEaKmrX9hbNHeyFZT3N9I-PdKlBKO_M-A24dSeIWcXGBPsBJViD28vkgtoR6m1xNQtRFIm1Sf788HykXPeijrmGUR82kSLNq_HDhvIC4agndhZjpZatahZj3vICBF70TAAFdDxGDJtgBygotgzmKybSZmQwXUuXPyJcm9ibdYRBm4JZcuQXqtBPUarv6RMQpE4GtF6qiqS510oSi0mBJEa4VvO6cQi0X-Lep56LHftIZoq2IMlslvYYdlAhuPaDtWdI72-ymrNtRivQ", + "payload": "" +} +2025-12-24 22:15:43,207:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632535074556 HTTP/1.1" 200 823 +2025-12-24 22:15:43,208:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:15:43 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEaRjbHjb6r44SLYVAsBBNtd2RzZa-inR97D7NnESVhqE +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "dev.profibot.hu" + }, + "status": "pending", + "expires": "2025-12-31T22:15:03Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/N1TSAA", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/FDGz7g", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + } + ] +} +2025-12-24 22:15:43,208:DEBUG:acme.client:Storing nonce: 58tS3qjEaRjbHjb6r44SLYVAsBBNtd2RzZa-inR97D7NnESVhqE +2025-12-24 22:15:43,209:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q', 'status': 'pending', 'token': '9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY'} +2025-12-24 22:15:46,210:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 22:15:46,214:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535074556: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRWFSamJIamI2cjQ0U0xZVkFzQkJOdGQyUnpaYS1pblI5N0Q3Tm5FU1ZocUUiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTM1MDc0NTU2In0", + "signature": "Ef1S6X-99wZSXAFmLPjIVDROGdumUKQ4ze05Oeci-RkKfEJi3ARhxtEeZFzmffiZ_1Syhvngk3aA2rlGdT9PIjDBES-QPbKRbcddeSztY-U5t2ZRpdjuq6RsaSPz4-esAHttvLzthb2PkH60jH0h1ELxJXfkPYgRNldiZSkZyEeS7pEu4c0tfiBrteRbL_Mh67Is4eQWvpHv5RI4Yhh8tXvSNu1z5Vjtadw2mf-y_lnDsZWFsi-yOy1B-U76O9a_0vPlB-jGvEVLn5kvaErniNBwLwzphmiR1pS8jNKm8yVxch9gXd06jkZEXWDa8xrDp9lD6A8meYs7psbh8CFqSQ", + "payload": "" +} +2025-12-24 22:15:46,370:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632535074556 HTTP/1.1" 200 823 +2025-12-24 22:15:46,371:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:15:46 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJn3G3yuOfaYky9mz3z1m2ijdkPR-pxH58PMQhQ-0W2Us +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "dev.profibot.hu" + }, + "status": "pending", + "expires": "2025-12-31T22:15:03Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/FDGz7g", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/N1TSAA", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + } + ] +} +2025-12-24 22:15:46,371:DEBUG:acme.client:Storing nonce: fULB7aUJn3G3yuOfaYky9mz3z1m2ijdkPR-pxH58PMQhQ-0W2Us +2025-12-24 22:15:46,372:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q', 'status': 'pending', 'token': '9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY'} +2025-12-24 22:15:49,373:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 22:15:49,377:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535074556: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSm4zRzN5dU9mYVlreTltejN6MW0yaWpka1BSLXB4SDU4UE1RaFEtMFcyVXMiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTM1MDc0NTU2In0", + "signature": "GGij3RjADipfbNE6EXFPzEG0C07s6_V_Mbns-mL-7Br1q3euFPmiopGZ4T3mIDGCnmuA5s_l3_8MxdUloYrID4BZnaEDPTtuOXpq7AsYQL_nrm1EzMKRnlDYoACZcOO5nBW2v7w31qMQOAz3GGjRRn1lmJtiPUCuGZuItc6-e7HpH7HjSyLr4tW5sbf_t_u-6OIEU4mjuVnjmhM3iV3UDcJtie11IABm_WY4xn4QyUldlkICUcZCJGAYaf0YDfgo2JbenvVEGaZQNeltZImICsQCJiuVGEUdMknposZ7yyVqyz0f6J5qnvpXIA7Ayl6wpNJPVD8qbtjNT9VZ8Lkmqw", + "payload": "" +} +2025-12-24 22:15:49,532:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632535074556 HTTP/1.1" 200 823 +2025-12-24 22:15:49,533:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:15:49 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEagOcnoYaKavnXl-PB7mezFqKc-aCw6tSDde6PBII8to +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "dev.profibot.hu" + }, + "status": "pending", + "expires": "2025-12-31T22:15:03Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/N1TSAA", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/FDGz7g", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + } + ] +} +2025-12-24 22:15:49,533:DEBUG:acme.client:Storing nonce: 58tS3qjEagOcnoYaKavnXl-PB7mezFqKc-aCw6tSDde6PBII8to +2025-12-24 22:15:49,534:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q', 'status': 'pending', 'token': '9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY'} +2025-12-24 22:15:52,535:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 22:15:52,538:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535074556: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRWFnT2Nub1lhS2F2blhsLVBCN21lekZxS2MtYUN3NnRTRGRlNlBCSUk4dG8iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTM1MDc0NTU2In0", + "signature": "NN3lOvbpDt28SNQAdIYWY820FGmAVuFbCGiiyXRmUPRrVDI6Zsj_VSE8Hc2xt35xs4x-ruUtJ-ibMzXh5VFr6YAaapJnIBaPd75vpsc9RL6tAoGPbQiCUkD3PUED-8MmOvUEkU67ikFSbmDEfrTDsBSlK4T31rnI0tND_R-0xtsfy5F6ka_E4gar8S4WUf2wQ6AlIjlcu2ubp0eol4ulgySOxTlVsK7cPX84z1Gb9Qt0nQLdr32p2L5HhgxMBjcceFRLNrLnprfl5kJW1uRSmGr9ZGYLod9CrbCMVNqZx_itM223Y05JObgmBLewT8JhlGc4MJ4LOCsVGXI5m9l0WQ", + "payload": "" +} +2025-12-24 22:15:52,692:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632535074556 HTTP/1.1" 200 823 +2025-12-24 22:15:52,693:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:15:52 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJrr1oKy9LTJs-nLnWNqpsf-fiiJew__kbJjEVLOxPKj8 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "dev.profibot.hu" + }, + "status": "pending", + "expires": "2025-12-31T22:15:03Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/FDGz7g", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/N1TSAA", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + } + ] +} +2025-12-24 22:15:52,694:DEBUG:acme.client:Storing nonce: fULB7aUJrr1oKy9LTJs-nLnWNqpsf-fiiJew__kbJjEVLOxPKj8 +2025-12-24 22:15:52,694:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q', 'status': 'pending', 'token': '9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY'} +2025-12-24 22:15:55,695:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 22:15:55,699:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535074556: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSnJyMW9LeTlMVEpzLW5MbldOcXBzZi1maWlKZXdfX2tiSmpFVkxPeFBLajgiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTM1MDc0NTU2In0", + "signature": "UI5oeduvW_aH3OEnWt9R8WqRyvph5HRKFSl7A24NvmaUmXTHJRHskuwTCQ760uiVbp7pn6VZZsV9AUjARky9VRRyWgYS4i7C0ZAZnuHvjgJrEasAT-ltC5nA_YsxrJgQNBwKSuaTaBD9CtC28YPNloCiKUvO5YQL4ouFWau_7dakvQ0j-sih9CWyoX-daV-58KnWdAyN5nszxJcdelSGCojTte-jVxStedfk3ne9Y5ofyrwKwwj-Ze1yITVdBVi28qoOipj9LLs9hkRpGqVvrqt6zXY_XR4yuobGy4k8raNWgRBFjGizPT4x8CKc_VKvSkTTn6UobGXzet1QDhTXkA", + "payload": "" +} +2025-12-24 22:15:55,917:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632535074556 HTTP/1.1" 200 823 +2025-12-24 22:15:55,918:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:15:55 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJpQ_PUkDS1R-e75opAcT8lnfXtSdEzGg6yaYymPdqgzM +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "dev.profibot.hu" + }, + "status": "pending", + "expires": "2025-12-31T22:15:03Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/N1TSAA", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/FDGz7g", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + } + ] +} +2025-12-24 22:15:55,918:DEBUG:acme.client:Storing nonce: fULB7aUJpQ_PUkDS1R-e75opAcT8lnfXtSdEzGg6yaYymPdqgzM +2025-12-24 22:15:55,919:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q', 'status': 'pending', 'token': '9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY'} +2025-12-24 22:15:58,920:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 22:15:58,924:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535074556: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSnBRX1BVa0RTMVItZTc1b3BBY1Q4bG5mWHRTZEV6R2c2eWFZeW1QZHFnek0iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTM1MDc0NTU2In0", + "signature": "KabCH7mDjNa1q5iu_9WDfVqN48Q2TjNYv7MG9HzD3wB1JXsDJUP6UbZHG5fAESJwxWs8qw2si7NKdYrgsUHB9g_ig3mrYbiF4PdoukFQBN-xTJgyWY3uBN8cHgoLQuy7-mYRvnPYHpLQvElsAzEXJ_zoaqVXu4QjYkxOqBnXi_X28_Ruk7CHJXLcxovUNYoLlTbnva3V6ct8sl4PKKic8e-At20NnlgxDdBf3eV-vC9nBGQoYDtTMpoV-hRXsrrgasJaLZWnSGTL3kGw5qdeM1aqCMP2CXx9pH4ViSaopi5MzBeoGjUaEEmbM_XjO0KYwlnrSQECRiz8LPVmErnIzA", + "payload": "" +} +2025-12-24 22:15:59,081:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632535074556 HTTP/1.1" 200 823 +2025-12-24 22:15:59,082:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:15:58 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEaVRPUeiJ2bF6o7ujKdQPgAnsCQIfIrOrIOtwrqxfAik +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "dev.profibot.hu" + }, + "status": "pending", + "expires": "2025-12-31T22:15:03Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/N1TSAA", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/FDGz7g", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + } + ] +} +2025-12-24 22:15:59,082:DEBUG:acme.client:Storing nonce: 58tS3qjEaVRPUeiJ2bF6o7ujKdQPgAnsCQIfIrOrIOtwrqxfAik +2025-12-24 22:15:59,083:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q', 'status': 'pending', 'token': '9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY'} +2025-12-24 22:16:02,084:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 22:16:02,087:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535074556: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRWFWUlBVZWlKMmJGNm83dWpLZFFQZ0Fuc0NRSWZJck9ySU90d3JxeGZBaWsiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTM1MDc0NTU2In0", + "signature": "VH89JwkX4dw0qOKgaFoa1yE2_ntQwQVtFC95TUbtZI5HpU86o_q1KRBuqH7CeuhnicFV0SzwdheTKUIJtmCD0CIx-DfVD-TBLkKJPAzz8eKrP_pgxHn65ZkLDKbxWhRn0iW2HBWJciTiKvOK94uAuxc64XbqjLwjm4d0G8X9yZh_lBS_ugeqDvwVqzFmV8DCJiLr30P87qeHm37NyzWFNsKbe8aMv77otreWoQV9tCG7h3vozHpo-HmNKXJKw9DWBLGPhn2EPyPH-2OiH-Z-pII5yfXD532Jxesz6UPI0HcNfAAIrQ0yJCWlFtoYIDOffXuldjqyZe_zP8DC98TFFw", + "payload": "" +} +2025-12-24 22:16:02,244:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632535074556 HTTP/1.1" 200 823 +2025-12-24 22:16:02,245:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:16:02 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJpeDfrpAM0dmvvQvTh-1eYLjce9iApCluSM3NZArFi88 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "dev.profibot.hu" + }, + "status": "pending", + "expires": "2025-12-31T22:15:03Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/FDGz7g", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/N1TSAA", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q", + "status": "pending", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY" + } + ] +} +2025-12-24 22:16:02,245:DEBUG:acme.client:Storing nonce: fULB7aUJpeDfrpAM0dmvvQvTh-1eYLjce9iApCluSM3NZArFi88 +2025-12-24 22:16:02,246:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/XHbT_Q', 'status': 'pending', 'token': '9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY'} +2025-12-24 22:16:05,247:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 22:16:05,250:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535074556: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSnBlRGZycEFNMGRtdnZRdlRoLTFlWUxqY2U5aUFwQ2x1U00zTlpBckZpODgiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTM1MDc0NTU2In0", + "signature": "QY8sCWh2bVbd9aZqxAvISsgbTH1hukVzo-5NQL2XLrkWb7Z2ad2LTjCM18YnAsD9egwr5RwiXpLB3LbaNfOVFCAAuv3tXLbowuy1TgFDZPcqGoaUO1Bh5cnlb0RvxJRd7OO_HartRju328EnIuzxLgL8EGpUdfoURGE5sVetOSPKFx4mVnnLd5i_EHH1by9sMp9QtjBiqP_5zZvrAjMHpTXqBYtEIJ-VjJYLfW3QErPVfTJVy6fM-pA-6P89rBMvSympgpwRaezNob08eZMfww34YZRayMyuPvaM9n-HTDG6VUgmuQdL28mRNGzb-58ilvHeVveBttTIIFtECdH0Fg", + "payload": "" +} +2025-12-24 22:16:05,405:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632535074556 HTTP/1.1" 200 770 +2025-12-24 22:16:05,406:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:16:05 GMT +Content-Type: application/json +Content-Length: 770 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJQaf52UUUcwJG4W5hdS-chyJHpAan1oghhwMwc1pqcnA +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "dev.profibot.hu" + }, + "status": "valid", + "expires": "2026-01-23T22:16:05Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535074556/FDGz7g", + "status": "valid", + "validated": "2025-12-24T22:15:03Z", + "token": "9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY", + "validationRecord": [ + { + "url": "http://dev.profibot.hu/.well-known/acme-challenge/9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY", + "hostname": "dev.profibot.hu", + "port": "80", + "addressesResolved": [ + "92.249.165.228" + ], + "addressUsed": "92.249.165.228" + } + ] + } + ] +} +2025-12-24 22:16:05,406:DEBUG:acme.client:Storing nonce: fULB7aUJQaf52UUUcwJG4W5hdS-chyJHpAan1oghhwMwc1pqcnA +2025-12-24 22:16:05,407:DEBUG:certbot._internal.error_handler:Calling registered functions +2025-12-24 22:16:05,407:INFO:certbot._internal.auth_handler:Cleaning up challenges +2025-12-24 22:16:05,408:DEBUG:certbot._internal.plugins.webroot:Removing /data/letsencrypt-acme-challenge/.well-known/acme-challenge/9eUTmk0WznV2eYd4lgYHVMg8NBnIvbcNO0Dtg6VxWwY +2025-12-24 22:16:05,408:DEBUG:certbot._internal.plugins.webroot:All challenges cleaned up +2025-12-24 22:16:05,409:DEBUG:certbot._internal.client:CSR: CSR(file=None, data=b'-----BEGIN CERTIFICATE REQUEST-----\nMIIBJjCBrAIBADAAMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEVuITR6yGWLJbUia5\naheimDj7pXdv96vJrXQGKONfHJJ4hbfd5/YIHdS+vwc8pmFgV3+JV0Ub+91nuCJm\n0MPvIJt7NKfvtkBKNZ2Yijli4858ibsaObS8f3w+q1FULe99oC0wKwYJKoZIhvcN\nAQkOMR4wHDAaBgNVHREEEzARgg9kZXYucHJvZmlib3QuaHUwCgYIKoZIzj0EAwID\naQAwZgIxAJlcDdwS3I8vpO8hLf/KV3amltmS4Jp73IC9/77dfy5AFq+4++ApTHIx\nArIBiI1H9wIxAM+PdE1T6Drz+iiiMzEYzZuNA4FKYac09RResUCx55aSl5O6SvFE\nDIIvao+lXVCvUQ==\n-----END CERTIFICATE REQUEST-----\n', form='pem') +2025-12-24 22:16:05,409:DEBUG:certbot._internal.client:Will poll for certificate issuance until 2025-12-24 22:17:35.409927 +2025-12-24 22:16:05,410:DEBUG:acme.client:JWS payload: +b'{\n "csr": "MIIBJjCBrAIBADAAMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEVuITR6yGWLJbUia5aheimDj7pXdv96vJrXQGKONfHJJ4hbfd5_YIHdS-vwc8pmFgV3-JV0Ub-91nuCJm0MPvIJt7NKfvtkBKNZ2Yijli4858ibsaObS8f3w-q1FULe99oC0wKwYJKoZIhvcNAQkOMR4wHDAaBgNVHREEEzARgg9kZXYucHJvZmlib3QuaHUwCgYIKoZIzj0EAwIDaQAwZgIxAJlcDdwS3I8vpO8hLf_KV3amltmS4Jp73IC9_77dfy5AFq-4--ApTHIxArIBiI1H9wIxAM-PdE1T6Drz-iiiMzEYzZuNA4FKYac09RResUCx55aSl5O6SvFEDIIvao-lXVCvUQ"\n}' +2025-12-24 22:16:05,414:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/462336946666: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSlFhZjUyVVVVY3dKRzRXNWhkUy1jaHlKSHBBYW4xb2doaHdNd2MxcHFjbkEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2ZpbmFsaXplLzI5MDY0MzgxNzYvNDYyMzM2OTQ2NjY2In0", + "signature": "PA986GcSGX-D_o8B05xg9xqs9_xoU7E0WnIAO85229AgKuuGmVZNJia32MYwUTk-ZuHlXgUfRaNp1IYXAj1RQhb6z0HLd-eKan_PmveURIR8dWbn3xmzTeImRL-_nRqaKQQ6DPzJoCXRM5ZhoW2qrUak-snYGJBYYxocHlxmFMPSj7o05kBSuB4x27ZjkYlnWwXomXUKWfGclK6ihW7Xa06bmL0enhWjTj_hZL82JSZbR49BbBMEh_gZNsAqGo-ekJyqBDD3WehEMuW305OxbmN24dEoNCU0zs5i4JRWVJFM-Xg5U-Oo50JxW4J-YZ9JIECyImPG6DFncbonxwIf6g", + "payload": "ewogICJjc3IiOiAiTUlJQkpqQ0JyQUlCQURBQU1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFVnVJVFI2eUdXTEpiVWlhNWFoZWltRGo3cFhkdjk2dkpyWFFHS09OZkhKSjRoYmZkNV9ZSUhkUy12d2M4cG1GZ1YzLUpWMFViLTkxbnVDSm0wTVB2SUp0N05LZnZ0a0JLTloyWWlqbGk0ODU4aWJzYU9iUzhmM3ctcTFGVUxlOTlvQzB3S3dZSktvWklodmNOQVFrT01SNHdIREFhQmdOVkhSRUVFekFSZ2c5a1pYWXVjSEp2Wm1saWIzUXVhSFV3Q2dZSUtvWkl6ajBFQXdJRGFRQXdaZ0l4QUpsY0Rkd1MzSTh2cE84aExmX0tWM2FtbHRtUzRKcDczSUM5Xzc3ZGZ5NUFGcS00LS1BcFRISXhBcklCaUkxSDl3SXhBTS1QZEUxVDZEcnotaWlpTXpFWXpadU5BNEZLWWFjMDlSUmVzVUN4NTVhU2w1TzZTdkZFRElJdmFvLWxYVkN2VVEiCn0" +} +2025-12-24 22:16:05,857:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/finalize/2906438176/462336946666 HTTP/1.1" 200 451 +2025-12-24 22:16:05,858:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:16:05 GMT +Content-Type: application/json +Content-Length: 451 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/462336946666 +Replay-Nonce: fULB7aUJwYRj7pGEKqWXmUIY6UmIPbuGX5zk6VXyMUbbK_d_F9w +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "valid", + "expires": "2025-12-31T22:15:03Z", + "identifiers": [ + { + "type": "dns", + "value": "dev.profibot.hu" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535074556" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/462336946666", + "certificate": "https://acme-v02.api.letsencrypt.org/acme/cert/05fe01c15311c78a8c649e6091652d11561e" +} +2025-12-24 22:16:05,858:DEBUG:acme.client:Storing nonce: fULB7aUJwYRj7pGEKqWXmUIY6UmIPbuGX5zk6VXyMUbbK_d_F9w +2025-12-24 22:16:06,859:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 22:16:06,863:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/order/2906438176/462336946666: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSndZUmo3cEdFS3FXWG1VSVk2VW1JUGJ1R1g1ems2Vlh5TVViYktfZF9GOXciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL29yZGVyLzI5MDY0MzgxNzYvNDYyMzM2OTQ2NjY2In0", + "signature": "AXt-qHrdI4nIDXmJuls1rxl6zhGG9k1zkkDoIbt9q0nNVoDfKVWDKyHeT4lFq1EG0my-Zcqh1l5LmJt3c8RYEibwJpp1_9QVsoQJea5qDpDE0eg8MUiQn45D3jEM-dIkGWd4WZ4gAETkRmI9eS6f6cDfetc7R5XwUlR0vY3dVn5HVFz06BqM-kBONSCPsbLLANnrcVoqdyXwwks6yfPWViq8_XLa90PKEUSh4Yj5Pus_QOClyzmu2BsSTIm0bnns_5SBonTIMQX2I5hwmOZwfMwdiR_CZj-UAQGCQ9tmhiZgmOOP8tu_YFCbNLklVTpLgNJbKJi409-fXmPu4ggtqQ", + "payload": "" +} +2025-12-24 22:16:07,081:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/order/2906438176/462336946666 HTTP/1.1" 200 451 +2025-12-24 22:16:07,082:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:16:06 GMT +Content-Type: application/json +Content-Length: 451 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/462336946666 +Replay-Nonce: 58tS3qjEuFSXHnZK_kQqTbQL64Kr0Zf_augHsoONbscHZTiB10k +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "valid", + "expires": "2025-12-31T22:15:03Z", + "identifiers": [ + { + "type": "dns", + "value": "dev.profibot.hu" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535074556" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/462336946666", + "certificate": "https://acme-v02.api.letsencrypt.org/acme/cert/05fe01c15311c78a8c649e6091652d11561e" +} +2025-12-24 22:16:07,082:DEBUG:acme.client:Storing nonce: 58tS3qjEuFSXHnZK_kQqTbQL64Kr0Zf_augHsoONbscHZTiB10k +2025-12-24 22:16:07,083:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 22:16:07,087:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/cert/05fe01c15311c78a8c649e6091652d11561e: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRXVGU1hIblpLX2tRcVRiUUw2NEtyMFpmX2F1Z0hzb09OYnNjSFpUaUIxMGsiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NlcnQvMDVmZTAxYzE1MzExYzc4YThjNjQ5ZTYwOTE2NTJkMTE1NjFlIn0", + "signature": "OSI32lukhGekq3o0Ym5MeTHlyPlGD9SIQZj7rZPImtsMgGvUTx72VDsEE9rXC4Do75FKLetWlOijeKYMmTWXK1clcZ8whkm_fvIO0WORtrXtqHhT81WMtlsllscBuKRlRJVw4qyikafu-Z8KhzKIY4Ly7G2CJ1XtyvMRdD00dR19K9MuDQSOfiP-ZorWrUg6UUkM7SwK55MDc24TSmPWclja3xQPSojItNRbMiBt0BL94psbPvWtu1fTr6E6ztrqauG9qiNBujzw57C4HLjaKtqNT-dE5HIFij1VCdSF9BlDvAve9bmnijXDu086HmvbdbgYBaInlN6esxloDlxEHQ", + "payload": "" +} +2025-12-24 22:16:07,244:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/cert/05fe01c15311c78a8c649e6091652d11561e HTTP/1.1" 200 2897 +2025-12-24 22:16:07,245:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:16:07 GMT +Content-Type: application/pem-certificate-chain +Content-Length: 2897 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="alternate" +Replay-Nonce: fULB7aUJ_AqSIONMN4hW-Hmvz_aoIxey3VTDT061ACr-jYobOPg +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +-----BEGIN CERTIFICATE----- +MIIDqjCCAzCgAwIBAgISBf4BwVMRx4qMZJ5gkWUtEVYeMAoGCCqGSM49BAMDMDIx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF +NzAeFw0yNTEyMjQyMTE3MzVaFw0yNjAzMjQyMTE3MzRaMBoxGDAWBgNVBAMTD2Rl +di5wcm9maWJvdC5odTB2MBAGByqGSM49AgEGBSuBBAAiA2IABFbiE0eshliyW1Im +uWoXopg4+6V3b/erya10BijjXxySeIW33ef2CB3Uvr8HPKZhYFd/iVdFG/vdZ7gi +ZtDD7yCbezSn77ZASjWdmIo5YuPOfIm7Gjm0vH98PqtRVC3vfaOCAh8wggIbMA4G +A1UdDwEB/wQEAwIHgDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYD +VR0TAQH/BAIwADAdBgNVHQ4EFgQUC2R6ChnaSs7VCRfoOKRST+8Tl4MwHwYDVR0j +BBgwFoAUrkie3IcdRKBv2qLlYHQEeMKcAIAwMgYIKwYBBQUHAQEEJjAkMCIGCCsG +AQUFBzAChhZodHRwOi8vZTcuaS5sZW5jci5vcmcvMBoGA1UdEQQTMBGCD2Rldi5w +cm9maWJvdC5odTATBgNVHSAEDDAKMAgGBmeBDAECATAtBgNVHR8EJjAkMCKgIKAe +hhxodHRwOi8vZTcuYy5sZW5jci5vcmcvMzEuY3JsMIIBBgYKKwYBBAHWeQIEAgSB +9wSB9ADyAHcAFoMtq/CpJQ8P8DqlRf/Iv8gj0IdL9gQpJ/jnHzMT9foAAAGbUm8C +rQAABAMASDBGAiEArly6O33bMQm30RA9E05OHiE3uZnwKiDgGz7mkIZEDLYCIQCJ +52jsXvFwqeNbv0CsYX+IKvjIU+igYfIqJkCP63/PMAB3AA5XlLzzrqk+MxssmQez +95Dfm8I9cTIl3SGpJaxhxU4hAAABm1JvAoYAAAQDAEgwRgIhAO5TFDnaRZfJH+iD +ZfKgDWcC/r9+TCJ7p3eM9N/suhszAiEAiqQ7MplXYZ+kJOHXwm9Fljebx6KRgSJ9 +6Lj5sIyTsQAwCgYIKoZIzj0EAwMDaAAwZQIxANGb3yHYfOjsvHweY2/n1IKv56os +0j8pgNQLy8wBuMSf1+TKzO9e90ePhD+oTuYpXwIwQjaIewBjUUe6QCEB3USGGC/y +E+oQOM4J1VFZmDsD5tvngvgJyWT5mQyggczlb/Q0 +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIEVzCCAj+gAwIBAgIRAKp18eYrjwoiCWbTi7/UuqEwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw +WhcNMjcwMzEyMjM1OTU5WjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg +RW5jcnlwdDELMAkGA1UEAxMCRTcwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARB6AST +CFh/vjcwDMCgQer+VtqEkz7JANurZxLP+U9TCeioL6sp5Z8VRvRbYk4P1INBmbef +QHJFHCxcSjKmwtvGBWpl/9ra8HW0QDsUaJW2qOJqceJ0ZVFT3hbUHifBM/2jgfgw +gfUwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcD +ATASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSuSJ7chx1EoG/aouVgdAR4 +wpwAgDAfBgNVHSMEGDAWgBR5tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcB +AQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0g +BAwwCjAIBgZngQwBAgEwJwYDVR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVu +Y3Iub3JnLzANBgkqhkiG9w0BAQsFAAOCAgEAjx66fDdLk5ywFn3CzA1w1qfylHUD +aEf0QZpXcJseddJGSfbUUOvbNR9N/QQ16K1lXl4VFyhmGXDT5Kdfcr0RvIIVrNxF +h4lqHtRRCP6RBRstqbZ2zURgqakn/Xip0iaQL0IdfHBZr396FgknniRYFckKORPG +yM3QKnd66gtMst8I5nkRQlAg/Jb+Gc3egIvuGKWboE1G89NTsN9LTDD3PLj0dUMr +OIuqVjLB8pEC6yk9enrlrqjXQgkLEYhXzq7dLafv5Vkig6Gl0nuuqjqfp0Q1bi1o +yVNAlXe6aUXw92CcghC9bNsKEO1+M52YY5+ofIXlS/SEQbvVYYBLZ5yeiglV6t3S +M6H+vTG0aP9YHzLn/KVOHzGQfXDP7qM5tkf+7diZe7o2fw6O7IvN6fsQXEQQj8TJ +UXJxv2/uJhcuy/tSDgXwHM8Uk34WNbRT7zGTGkQRX0gsbjAea/jYAoWv0ZvQRwpq +Pe79D/i7Cep8qWnA+7AE/3B3S/3dEEYmc0lpe1366A/6GEgk3ktr9PEoQrLChs6I +tu3wnNLB2euC8IKGLQFpGtOO/2/hiAKjyajaBP25w1jF0Wl8Bbqne3uZ2q1GyPFJ +YRmT7/OXpmOH/FVLtwS+8ng1cAmpCujPwteJZNcDG0sF2n/sc0+SQf49fdyUK0ty ++VUwFj9tmWxyR/M= +-----END CERTIFICATE----- + +2025-12-24 22:16:07,246:DEBUG:acme.client:Storing nonce: fULB7aUJ_AqSIONMN4hW-Hmvz_aoIxey3VTDT061ACr-jYobOPg +2025-12-24 22:16:07,246:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 22:16:07,250:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/cert/05fe01c15311c78a8c649e6091652d11561e/1: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSl9BcVNJT05NTjRoVy1IbXZ6X2FvSXhleTNWVERUMDYxQUNyLWpZb2JPUGciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NlcnQvMDVmZTAxYzE1MzExYzc4YThjNjQ5ZTYwOTE2NTJkMTE1NjFlLzEifQ", + "signature": "dkeoEq4_2SKEnaAa2Ud_8WeMS00Uh9jHzwtbVKY-n6eWDtklOPM5vicwGnyAtRjAvrVXogAhxHMtu354337DJAPPflsbr0SeTWbqGuvc18d4xAzHGk7tuH60845xDcnpjwAStOACASY0fF_vQ2eiZ3FVOhqA4p50kENheJsCIkV2jN36zp-Lv-0iVIwtA-u0gj08mTTkdoLOqKRhAnOEjXGz1yU4pjlwVLaKbPSOLxUsZaQ-g7UHjFwKE8C_gOmSvS_z84dXy4LAI6T9U3SMfDK1gwzCLy4QNQwzNomKiKPJjWCGDVgBUkB8YRcZxPk9tfzRoIQK-MnftUgadMn9Fw", + "payload": "" +} +2025-12-24 22:16:07,407:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/cert/05fe01c15311c78a8c649e6091652d11561e/1 HTTP/1.1" 200 2332 +2025-12-24 22:16:07,408:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:16:07 GMT +Content-Type: application/pem-certificate-chain +Content-Length: 2332 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="alternate" +Replay-Nonce: fULB7aUJl6BaG7DpoOchX7TcbahAWzgmCRHB8uIGzpzlajQkkeQ +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +-----BEGIN CERTIFICATE----- +MIIDqjCCAzCgAwIBAgISBf4BwVMRx4qMZJ5gkWUtEVYeMAoGCCqGSM49BAMDMDIx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF +NzAeFw0yNTEyMjQyMTE3MzVaFw0yNjAzMjQyMTE3MzRaMBoxGDAWBgNVBAMTD2Rl +di5wcm9maWJvdC5odTB2MBAGByqGSM49AgEGBSuBBAAiA2IABFbiE0eshliyW1Im +uWoXopg4+6V3b/erya10BijjXxySeIW33ef2CB3Uvr8HPKZhYFd/iVdFG/vdZ7gi +ZtDD7yCbezSn77ZASjWdmIo5YuPOfIm7Gjm0vH98PqtRVC3vfaOCAh8wggIbMA4G +A1UdDwEB/wQEAwIHgDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYD +VR0TAQH/BAIwADAdBgNVHQ4EFgQUC2R6ChnaSs7VCRfoOKRST+8Tl4MwHwYDVR0j +BBgwFoAUrkie3IcdRKBv2qLlYHQEeMKcAIAwMgYIKwYBBQUHAQEEJjAkMCIGCCsG +AQUFBzAChhZodHRwOi8vZTcuaS5sZW5jci5vcmcvMBoGA1UdEQQTMBGCD2Rldi5w +cm9maWJvdC5odTATBgNVHSAEDDAKMAgGBmeBDAECATAtBgNVHR8EJjAkMCKgIKAe +hhxodHRwOi8vZTcuYy5sZW5jci5vcmcvMzEuY3JsMIIBBgYKKwYBBAHWeQIEAgSB +9wSB9ADyAHcAFoMtq/CpJQ8P8DqlRf/Iv8gj0IdL9gQpJ/jnHzMT9foAAAGbUm8C +rQAABAMASDBGAiEArly6O33bMQm30RA9E05OHiE3uZnwKiDgGz7mkIZEDLYCIQCJ +52jsXvFwqeNbv0CsYX+IKvjIU+igYfIqJkCP63/PMAB3AA5XlLzzrqk+MxssmQez +95Dfm8I9cTIl3SGpJaxhxU4hAAABm1JvAoYAAAQDAEgwRgIhAO5TFDnaRZfJH+iD +ZfKgDWcC/r9+TCJ7p3eM9N/suhszAiEAiqQ7MplXYZ+kJOHXwm9Fljebx6KRgSJ9 +6Lj5sIyTsQAwCgYIKoZIzj0EAwMDaAAwZQIxANGb3yHYfOjsvHweY2/n1IKv56os +0j8pgNQLy8wBuMSf1+TKzO9e90ePhD+oTuYpXwIwQjaIewBjUUe6QCEB3USGGC/y +E+oQOM4J1VFZmDsD5tvngvgJyWT5mQyggczlb/Q0 +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIICtzCCAjygAwIBAgIRAMWKhaLGI0XgqMRSU4efWTowCgYIKoZIzj0EAwMwTzEL +MAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNo +IEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDIwHhcNMjQwMzEzMDAwMDAwWhcN +MjcwMzEyMjM1OTU5WjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3MgRW5j +cnlwdDELMAkGA1UEAxMCRTcwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARB6ASTCFh/ +vjcwDMCgQer+VtqEkz7JANurZxLP+U9TCeioL6sp5Z8VRvRbYk4P1INBmbefQHJF +HCxcSjKmwtvGBWpl/9ra8HW0QDsUaJW2qOJqceJ0ZVFT3hbUHifBM/2jgfgwgfUw +DgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAS +BgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSuSJ7chx1EoG/aouVgdAR4wpwA +gDAfBgNVHSMEGDAWgBR8Qpau3ktIO/qS+J6Mz22LqXI3lTAyBggrBgEFBQcBAQQm +MCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly94Mi5pLmxlbmNyLm9yZy8wEwYDVR0gBAww +CjAIBgZngQwBAgEwJwYDVR0fBCAwHjAcoBqgGIYWaHR0cDovL3gyLmMubGVuY3Iu +b3JnLzAKBggqhkjOPQQDAwNpADBmAjEA/e5N+wjAk945cpaFxGaeMC13fyvdbNzX +lRg9HNdElxi5mXdI4az2CykNU07iFwqEAjEAihPCDkw4b1BvfLg8VNLLuaMpn1Rb +Z1682chR6zNRCseyie4SjyTCdkvsAa+omQSf +-----END CERTIFICATE----- + +2025-12-24 22:16:07,415:DEBUG:acme.client:Storing nonce: fULB7aUJl6BaG7DpoOchX7TcbahAWzgmCRHB8uIGzpzlajQkkeQ +2025-12-24 22:16:07,418:INFO:certbot._internal.client:Non-standard path(s), might not work with crontab installed by your operating system package manager +2025-12-24 22:16:07,419:DEBUG:certbot._internal.storage:Creating directory /etc/letsencrypt/archive. +2025-12-24 22:16:07,419:DEBUG:certbot._internal.storage:Creating directory /etc/letsencrypt/live. +2025-12-24 22:16:07,420:DEBUG:certbot._internal.storage:Writing README to /etc/letsencrypt/live/README. +2025-12-24 22:16:07,421:DEBUG:certbot._internal.storage:Creating directory /etc/letsencrypt/archive/npm-4. +2025-12-24 22:16:07,421:DEBUG:certbot._internal.storage:Creating directory /etc/letsencrypt/live/npm-4. +2025-12-24 22:16:07,422:DEBUG:certbot._internal.storage:Writing certificate to /etc/letsencrypt/live/npm-4/cert.pem. +2025-12-24 22:16:07,422:DEBUG:certbot._internal.storage:Writing private key to /etc/letsencrypt/live/npm-4/privkey.pem. +2025-12-24 22:16:07,422:DEBUG:certbot._internal.storage:Writing chain to /etc/letsencrypt/live/npm-4/chain.pem. +2025-12-24 22:16:07,423:DEBUG:certbot._internal.storage:Writing full chain to /etc/letsencrypt/live/npm-4/fullchain.pem. +2025-12-24 22:16:07,423:DEBUG:certbot._internal.storage:Writing README to /etc/letsencrypt/live/npm-4/README. +2025-12-24 22:16:07,433:DEBUG:certbot.configuration:Var account=e417a583de478a0cfdeed332c1113068 (set by user). +2025-12-24 22:16:07,433:DEBUG:certbot.configuration:Var key_type=ecdsa (set by user). +2025-12-24 22:16:07,433:DEBUG:certbot.configuration:Var elliptic_curve=secp384r1 (set by user). +2025-12-24 22:16:07,433:DEBUG:certbot.configuration:Var preferred_chain=ISRG Root X1 (set by user). +2025-12-24 22:16:07,433:DEBUG:certbot.configuration:Var pref_challs=['http-01'] (set by user). +2025-12-24 22:16:07,433:DEBUG:certbot.configuration:Var config_dir=/etc/letsencrypt (set by user). +2025-12-24 22:16:07,433:DEBUG:certbot.configuration:Var work_dir=/tmp/letsencrypt-lib (set by user). +2025-12-24 22:16:07,433:DEBUG:certbot.configuration:Var logs_dir=/data/logs (set by user). +2025-12-24 22:16:07,433:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2025-12-24 22:16:07,433:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2025-12-24 22:16:07,433:DEBUG:certbot.configuration:Var webroot_path=['/data/letsencrypt-acme-challenge'] (set by user). +2025-12-24 22:16:07,434:DEBUG:certbot.configuration:Var webroot_map={'dev.profibot.hu': '/data/letsencrypt-acme-challenge'} (set by user). +2025-12-24 22:16:07,435:DEBUG:certbot._internal.display.obj:Notifying user: +Successfully received certificate. +Certificate is saved at: /etc/letsencrypt/live/npm-4/fullchain.pem +Key is saved at: /etc/letsencrypt/live/npm-4/privkey.pem +This certificate expires on 2026-03-24. +These files will be updated when the certificate renews. +2025-12-24 22:16:07,435:DEBUG:certbot._internal.display.obj:Notifying user: NEXT STEPS: +2025-12-24 22:16:07,435:DEBUG:certbot._internal.display.obj:Notifying user: - The certificate will need to be renewed before it expires. Certbot can automatically renew the certificate in the background, but you may need to take steps to enable that functionality. See https://certbot.org/renewal-setup for instructions. +2025-12-24 22:16:07,436:DEBUG:certbot._internal.display.obj:Notifying user: If you like Certbot, please consider supporting our work by: + * Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate + * Donating to EFF: https://eff.org/donate-le diff --git a/proxy-manager/data/logs/letsencrypt.log.16 b/proxy-manager/data/logs/letsencrypt.log.16 new file mode 100755 index 0000000..85636ef --- /dev/null +++ b/proxy-manager/data/logs/letsencrypt.log.16 @@ -0,0 +1,297 @@ +2025-12-24 22:14:51,048:DEBUG:certbot._internal.main:certbot version: 5.1.0 +2025-12-24 22:14:51,048:DEBUG:certbot._internal.main:Location of certbot entry point: /opt/certbot/bin/certbot +2025-12-24 22:14:51,048:DEBUG:certbot._internal.main:Arguments: ['--config', '/etc/letsencrypt.ini', '--work-dir', '/tmp/letsencrypt-lib', '--logs-dir', '/data/logs', '--cert-name', 'npm-3', '--agree-tos', '--authenticator', 'webroot', '-m', 'kincses@gmail.com', '--preferred-challenges', 'http', '--domains', 'db.profibot.hu'] +2025-12-24 22:14:51,048:DEBUG:certbot._internal.main:Discovered plugins: PluginsRegistry(PluginEntryPoint#manual,PluginEntryPoint#null,PluginEntryPoint#standalone,PluginEntryPoint#webroot) +2025-12-24 22:14:51,058:DEBUG:certbot._internal.log:Root logging level set at 30 +2025-12-24 22:14:51,059:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2025-12-24 22:14:51,059:DEBUG:certbot._internal.plugins.selection:Single candidate plugin: * webroot +Description: Saves the necessary validation files to a .well-known/acme-challenge/ directory within the nominated webroot path. A separate HTTP server must be running and serving files from the webroot path. HTTP challenge only (wildcards not supported). +Interfaces: Authenticator, Plugin +Entry point: EntryPoint(name='webroot', value='certbot._internal.plugins.webroot:Authenticator', group='certbot.plugins') +Initialized: +Prep: True +2025-12-24 22:14:51,059:DEBUG:certbot._internal.plugins.selection:Selected authenticator and installer None +2025-12-24 22:14:51,059:INFO:certbot._internal.plugins.selection:Plugins selected: Authenticator webroot, Installer None +2025-12-24 22:14:51,096:DEBUG:certbot._internal.main:Picked account: +2025-12-24 22:14:51,097:DEBUG:acme.client:Sending GET request to https://acme-v02.api.letsencrypt.org/directory. +2025-12-24 22:14:51,098:DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org:443 +2025-12-24 22:14:51,534:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "GET /directory HTTP/1.1" 200 1033 +2025-12-24 22:14:51,535:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:14:51 GMT +Content-Type: application/json +Content-Length: 1033 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "cjjYE-nIdGQ": "https://community.letsencrypt.org/t/adding-random-entries-to-the-directory/33417", + "keyChange": "https://acme-v02.api.letsencrypt.org/acme/key-change", + "meta": { + "caaIdentities": [ + "letsencrypt.org" + ], + "profiles": { + "classic": "https://letsencrypt.org/docs/profiles#classic", + "shortlived": "https://letsencrypt.org/docs/profiles#shortlived", + "tlsclient": "https://letsencrypt.org/docs/profiles#tlsclient", + "tlsserver": "https://letsencrypt.org/docs/profiles#tlsserver" + }, + "termsOfService": "https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf", + "website": "https://letsencrypt.org" + }, + "newAccount": "https://acme-v02.api.letsencrypt.org/acme/new-acct", + "newNonce": "https://acme-v02.api.letsencrypt.org/acme/new-nonce", + "newOrder": "https://acme-v02.api.letsencrypt.org/acme/new-order", + "renewalInfo": "https://acme-v02.api.letsencrypt.org/acme/renewal-info", + "revokeCert": "https://acme-v02.api.letsencrypt.org/acme/revoke-cert" +} +2025-12-24 22:14:51,536:DEBUG:certbot._internal.display.obj:Notifying user: Requesting a certificate for db.profibot.hu +2025-12-24 22:14:51,543:DEBUG:acme.client:Requesting fresh nonce +2025-12-24 22:14:51,543:DEBUG:acme.client:Sending HEAD request to https://acme-v02.api.letsencrypt.org/acme/new-nonce. +2025-12-24 22:14:51,687:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "HEAD /acme/new-nonce HTTP/1.1" 200 0 +2025-12-24 22:14:51,688:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:14:51 GMT +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: IijzadlSSwfrRfDfmPGry91vXRKjuZB7VHY1XaZ-rap0QQQQxXE +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + + +2025-12-24 22:14:51,688:DEBUG:acme.client:Storing nonce: IijzadlSSwfrRfDfmPGry91vXRKjuZB7VHY1XaZ-rap0QQQQxXE +2025-12-24 22:14:51,689:DEBUG:acme.client:JWS payload: +b'{\n "identifiers": [\n {\n "type": "dns",\n "value": "db.profibot.hu"\n }\n ]\n}' +2025-12-24 22:14:51,693:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/new-order: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJJaWp6YWRsU1N3ZnJSZkRmbVBHcnk5MXZYUktqdVpCN1ZIWTFYYVotcmFwMFFRUVF4WEUiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL25ldy1vcmRlciJ9", + "signature": "LrdJjivFds5xHoPIjCaMi7ZUZWVd11UClupFsqz5eo-bOk4XNF51JPkBrH_QAfbioEGk02TeGQoW-IYiWiEnjlIWqe7gZp1hvZJHyPOXmj5eKhX0QG6AhPMOEa6ig0zeaGRKz_5FTutgoBZ79rTnEaRxgeLCCNDkO1tZ0CdkIKOmbJhB-4S8QPxltr20042jaLv03KdEAttkYOKh4Gyt6ZV3X4hBzfflARDxTmG_pcFfX4IZNz2tHcp0MLvSfE-6BimZH6khSHDDi9Y2veJ8V5mDsh2rxCdXh2mEBYodwndgs6USq_NCFRvgn6-MvDFLav3otdp2djeG4sboEPdZGg", + "payload": "ewogICJpZGVudGlmaWVycyI6IFsKICAgIHsKICAgICAgInR5cGUiOiAiZG5zIiwKICAgICAgInZhbHVlIjogImRiLnByb2ZpYm90Lmh1IgogICAgfQogIF0KfQ" +} +2025-12-24 22:14:52,015:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/new-order HTTP/1.1" 201 348 +2025-12-24 22:14:52,016:DEBUG:acme.client:Received response: +HTTP 201 +Server: nginx +Date: Wed, 24 Dec 2025 22:14:51 GMT +Content-Type: application/json +Content-Length: 348 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/462336901876 +Replay-Nonce: GxwILcG0cXkIVSH6rVc-HIFE7HjoA_Lc4AveBaIiADk3IEvtJLw +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "pending", + "expires": "2025-12-31T22:14:51Z", + "identifiers": [ + { + "type": "dns", + "value": "db.profibot.hu" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535012466" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/462336901876" +} +2025-12-24 22:14:52,017:DEBUG:acme.client:Storing nonce: GxwILcG0cXkIVSH6rVc-HIFE7HjoA_Lc4AveBaIiADk3IEvtJLw +2025-12-24 22:14:52,017:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 22:14:52,021:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535012466: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJHeHdJTGNHMGNYa0lWU0g2clZjLUhJRkU3SGpvQV9MYzRBdmVCYUlpQURrM0lFdnRKTHciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTM1MDEyNDY2In0", + "signature": "kmX1GQ4a18bYMlyDfxUeiu1a5J9kMVeI-xBorSs_RMlhQ3z2daIb4-3RJXQxIlpPyHaBm5d7puzTzYUxmioNcT8rCim3l6iiaRzMX7_RwMD2vAWhg_zbBAiZtHw6Lc_xk4rjnNBW0ayVRZBCF0V1A757fCch4LLMKQsRKAy7FuVDjK5psKtjrtZR0hbogJl6X7a9E3Cr3IQQXfNpjyt5bS8sZbw_ZIo-ICxUAys7uzokwK1Pile4ZSLmniztTPScS99-V1fevHbIk8kI_adCREuS1Pr8ogDWmC-yQ_2Nikp2Z-hWINjQdNmrWyBvF0uh-lmBHyRZg9sikgl2mZVj6g", + "payload": "" +} +2025-12-24 22:14:52,168:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632535012466 HTTP/1.1" 200 822 +2025-12-24 22:14:52,169:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:14:52 GMT +Content-Type: application/json +Content-Length: 822 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: GxwILcG0PYT_Iz8-ARQlgFqK26KUDVKHgSGuRtlKjXPc6322qdg +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "db.profibot.hu" + }, + "status": "pending", + "expires": "2025-12-31T22:14:51Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535012466/88WzhQ", + "status": "pending", + "token": "g6-uo3UCX0xNzx08Lq2qM2-dTzz-hH_Gs-lBYFBn5rs" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535012466/vwKyRw", + "status": "pending", + "token": "g6-uo3UCX0xNzx08Lq2qM2-dTzz-hH_Gs-lBYFBn5rs" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535012466/T-eoHg", + "status": "pending", + "token": "g6-uo3UCX0xNzx08Lq2qM2-dTzz-hH_Gs-lBYFBn5rs" + } + ] +} +2025-12-24 22:14:52,169:DEBUG:acme.client:Storing nonce: GxwILcG0PYT_Iz8-ARQlgFqK26KUDVKHgSGuRtlKjXPc6322qdg +2025-12-24 22:14:52,170:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535012466/vwKyRw', 'status': 'pending', 'token': 'g6-uo3UCX0xNzx08Lq2qM2-dTzz-hH_Gs-lBYFBn5rs'} +2025-12-24 22:14:52,171:INFO:certbot._internal.auth_handler:Performing the following challenges: +2025-12-24 22:14:52,171:INFO:certbot._internal.auth_handler:http-01 challenge for db.profibot.hu +2025-12-24 22:14:52,171:INFO:certbot._internal.plugins.webroot:Using the webroot path /data/letsencrypt-acme-challenge for all unmatched domains. +2025-12-24 22:14:52,172:DEBUG:certbot._internal.plugins.webroot:Creating root challenges validation dir at /data/letsencrypt-acme-challenge/.well-known/acme-challenge +2025-12-24 22:14:52,173:DEBUG:certbot._internal.plugins.webroot:Attempting to save validation to /data/letsencrypt-acme-challenge/.well-known/acme-challenge/g6-uo3UCX0xNzx08Lq2qM2-dTzz-hH_Gs-lBYFBn5rs +2025-12-24 22:14:52,174:DEBUG:acme.client:JWS payload: +b'{}' +2025-12-24 22:14:52,175:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535012466/88WzhQ: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJHeHdJTGNHMFBZVF9JejgtQVJRbGdGcUsyNktVRFZLSGdTR3VSdGxLalhQYzYzMjJxZGciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NoYWxsLzI5MDY0MzgxNzYvNjMyNTM1MDEyNDY2Lzg4V3poUSJ9", + "signature": "gZYX3MKtku6YVuw07YWAKCbTMQ40CyGsBP7GWq6H9MmwzyKuKVs_kQ2uCL8FPa6Vu0jspuGzKCJjYxmDn0ovWAHFsvQPqYhK4vR7Cs14Cs91bF74vnqnE0hVhv5HgNgVH96w5FaQ5GfnNglLXCvBlRJ-IPsEYuPOK2CPTVype3Sr2XHECBlKtOXyTExY3pJKzx_BFZtxwWoB-u5CAOUBuAtHxtmB0C0GH995peahgotHOMSq0dxrzSckzS4IrknmkpYf8Njjtipl1g9PNObCJRuEKARZQePe3nEE0_8v73g45zwwyMxLa-K7r517jazw3DbF7vqogBLcXll1hfhmew", + "payload": "e30" +} +2025-12-24 22:14:52,319:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/chall/2906438176/632535012466/88WzhQ HTTP/1.1" 200 195 +2025-12-24 22:14:52,320:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:14:52 GMT +Content-Type: application/json +Content-Length: 195 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="up" +Location: https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535012466/88WzhQ +Replay-Nonce: GxwILcG00iXy5cX19eh_NT2zLbtaE-ikAdluAH86LPZ1jimKvHI +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535012466/88WzhQ", + "status": "pending", + "token": "g6-uo3UCX0xNzx08Lq2qM2-dTzz-hH_Gs-lBYFBn5rs" +} +2025-12-24 22:14:52,320:DEBUG:acme.client:Storing nonce: GxwILcG00iXy5cX19eh_NT2zLbtaE-ikAdluAH86LPZ1jimKvHI +2025-12-24 22:14:52,321:INFO:certbot._internal.auth_handler:Waiting for verification... +2025-12-24 22:14:53,322:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 22:14:53,325:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632535012466: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJHeHdJTGNHMDBpWHk1Y1gxOWVoX05UMnpMYnRhRS1pa0FkbHVBSDg2TFBaMWppbUt2SEkiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTM1MDEyNDY2In0", + "signature": "JT6aFEe2sHCkbj2OGezPJzuHWZnNShWxa45fiMhyasgtzrwxzRzzlsDKzf0at__L3zuZghOqXeu-E_X3uS8xj0IzXhKaD8whn1xPNfnZpCppEnHs472fBMA459G9pLXLWO3hQ8UaRyUhTQSQ95bZhSy8JKFlTTR4rsEZwoxEaZFmBpMZWQm-U6TdsIstc_Gf2X-2Gb9nWQREjgovCnNEg1yQ1GAlKB2vMZBbiEv6eMRXf24vdxLnU5tvXaYT-_7laHWPcPLjSGLEBDtC0jZS6qhOEPUdE5hAM5OPLy8-pE895XumTfGgvlDZ4Vtxj97DPTzOHnAApOsCRaQ5wQvBNw", + "payload": "" +} +2025-12-24 22:14:53,470:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632535012466 HTTP/1.1" 200 749 +2025-12-24 22:14:53,470:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 22:14:53 GMT +Content-Type: application/json +Content-Length: 749 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: GxwILcG0q7YEo4peu5y9dMbLLEI43eN_n54-ZleCHHrDlLNO8XA +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "db.profibot.hu" + }, + "status": "invalid", + "expires": "2025-12-31T22:14:51Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632535012466/88WzhQ", + "status": "invalid", + "validated": "2025-12-24T22:14:52Z", + "error": { + "type": "urn:ietf:params:acme:error:dns", + "detail": "DNS problem: NXDOMAIN looking up A for db.profibot.hu - check that a DNS record exists for this domain; DNS problem: NXDOMAIN looking up AAAA for db.profibot.hu - check that a DNS record exists for this domain", + "status": 400 + }, + "token": "g6-uo3UCX0xNzx08Lq2qM2-dTzz-hH_Gs-lBYFBn5rs" + } + ] +} +2025-12-24 22:14:53,471:DEBUG:acme.client:Storing nonce: GxwILcG0q7YEo4peu5y9dMbLLEI43eN_n54-ZleCHHrDlLNO8XA +2025-12-24 22:14:53,471:INFO:certbot._internal.auth_handler:Challenge failed for domain db.profibot.hu +2025-12-24 22:14:53,472:INFO:certbot._internal.auth_handler:http-01 challenge for db.profibot.hu +2025-12-24 22:14:53,472:DEBUG:certbot._internal.display.obj:Notifying user: +Certbot failed to authenticate some domains (authenticator: webroot). The Certificate Authority reported these problems: + Domain: db.profibot.hu + Type: dns + Detail: DNS problem: NXDOMAIN looking up A for db.profibot.hu - check that a DNS record exists for this domain; DNS problem: NXDOMAIN looking up AAAA for db.profibot.hu - check that a DNS record exists for this domain + +Hint: The Certificate Authority failed to download the temporary challenge files created by Certbot. Ensure that the listed domains serve their content from the provided --webroot-path/-w and that files created there can be downloaded from the internet. + +2025-12-24 22:14:53,474:DEBUG:certbot._internal.error_handler:Encountered exception: +Traceback (most recent call last): + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/auth_handler.py", line 104, in handle_authorizations + self._poll_authorizations(authzrs, max_retries, max_time_mins, best_effort) + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/auth_handler.py", line 208, in _poll_authorizations + raise errors.AuthorizationError('Some challenges have failed.') +certbot.errors.AuthorizationError: Some challenges have failed. + +2025-12-24 22:14:53,474:DEBUG:certbot._internal.error_handler:Calling registered functions +2025-12-24 22:14:53,474:INFO:certbot._internal.auth_handler:Cleaning up challenges +2025-12-24 22:14:53,474:DEBUG:certbot._internal.plugins.webroot:Removing /data/letsencrypt-acme-challenge/.well-known/acme-challenge/g6-uo3UCX0xNzx08Lq2qM2-dTzz-hH_Gs-lBYFBn5rs +2025-12-24 22:14:53,475:DEBUG:certbot._internal.plugins.webroot:All challenges cleaned up +2025-12-24 22:14:53,476:DEBUG:certbot._internal.log:Exiting abnormally: +Traceback (most recent call last): + File "/opt/certbot/bin/certbot", line 7, in + sys.exit(main()) + ^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/main.py", line 18, in main + return internal_main.main(cli_args) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 1850, in main + return config.func(config, plugins) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 1562, in certonly + lineage = _get_and_save_cert(le_client, config, domains, certname, lineage) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 141, in _get_and_save_cert + lineage = le_client.obtain_and_enroll_certificate(domains, certname) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 526, in obtain_and_enroll_certificate + cert, chain, key, _ = self.obtain_certificate(domains) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 427, in obtain_certificate + orderr = self._get_order_and_authorizations(csr.data, self.config.allow_subset_of_names) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 505, in _get_order_and_authorizations + authzr = self.auth_handler.handle_authorizations(orderr, self.config, best_effort) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/auth_handler.py", line 104, in handle_authorizations + self._poll_authorizations(authzrs, max_retries, max_time_mins, best_effort) + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/auth_handler.py", line 208, in _poll_authorizations + raise errors.AuthorizationError('Some challenges have failed.') +certbot.errors.AuthorizationError: Some challenges have failed. +2025-12-24 22:14:53,481:ERROR:certbot._internal.log:Some challenges have failed. diff --git a/proxy-manager/data/logs/letsencrypt.log.17 b/proxy-manager/data/logs/letsencrypt.log.17 new file mode 100755 index 0000000..daf4158 --- /dev/null +++ b/proxy-manager/data/logs/letsencrypt.log.17 @@ -0,0 +1,297 @@ +2025-12-24 21:21:30,609:DEBUG:certbot._internal.main:certbot version: 5.1.0 +2025-12-24 21:21:30,609:DEBUG:certbot._internal.main:Location of certbot entry point: /opt/certbot/bin/certbot +2025-12-24 21:21:30,610:DEBUG:certbot._internal.main:Arguments: ['--config', '/etc/letsencrypt.ini', '--work-dir', '/tmp/letsencrypt-lib', '--logs-dir', '/data/logs', '--cert-name', 'npm-2', '--agree-tos', '--authenticator', 'webroot', '-m', 'kincses@gmail.com', '--preferred-challenges', 'http', '--domains', 'dev.profibot.hu'] +2025-12-24 21:21:30,610:DEBUG:certbot._internal.main:Discovered plugins: PluginsRegistry(PluginEntryPoint#manual,PluginEntryPoint#null,PluginEntryPoint#standalone,PluginEntryPoint#webroot) +2025-12-24 21:21:30,621:DEBUG:certbot._internal.log:Root logging level set at 30 +2025-12-24 21:21:30,622:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2025-12-24 21:21:30,622:DEBUG:certbot._internal.plugins.selection:Single candidate plugin: * webroot +Description: Saves the necessary validation files to a .well-known/acme-challenge/ directory within the nominated webroot path. A separate HTTP server must be running and serving files from the webroot path. HTTP challenge only (wildcards not supported). +Interfaces: Authenticator, Plugin +Entry point: EntryPoint(name='webroot', value='certbot._internal.plugins.webroot:Authenticator', group='certbot.plugins') +Initialized: +Prep: True +2025-12-24 21:21:30,622:DEBUG:certbot._internal.plugins.selection:Selected authenticator and installer None +2025-12-24 21:21:30,622:INFO:certbot._internal.plugins.selection:Plugins selected: Authenticator webroot, Installer None +2025-12-24 21:21:30,668:DEBUG:certbot._internal.main:Picked account: +2025-12-24 21:21:30,668:DEBUG:acme.client:Sending GET request to https://acme-v02.api.letsencrypt.org/directory. +2025-12-24 21:21:30,670:DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org:443 +2025-12-24 21:21:31,147:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "GET /directory HTTP/1.1" 200 1033 +2025-12-24 21:21:31,148:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 21:21:31 GMT +Content-Type: application/json +Content-Length: 1033 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "Jjy9QrlGvGk": "https://community.letsencrypt.org/t/adding-random-entries-to-the-directory/33417", + "keyChange": "https://acme-v02.api.letsencrypt.org/acme/key-change", + "meta": { + "caaIdentities": [ + "letsencrypt.org" + ], + "profiles": { + "classic": "https://letsencrypt.org/docs/profiles#classic", + "shortlived": "https://letsencrypt.org/docs/profiles#shortlived", + "tlsclient": "https://letsencrypt.org/docs/profiles#tlsclient", + "tlsserver": "https://letsencrypt.org/docs/profiles#tlsserver" + }, + "termsOfService": "https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf", + "website": "https://letsencrypt.org" + }, + "newAccount": "https://acme-v02.api.letsencrypt.org/acme/new-acct", + "newNonce": "https://acme-v02.api.letsencrypt.org/acme/new-nonce", + "newOrder": "https://acme-v02.api.letsencrypt.org/acme/new-order", + "renewalInfo": "https://acme-v02.api.letsencrypt.org/acme/renewal-info", + "revokeCert": "https://acme-v02.api.letsencrypt.org/acme/revoke-cert" +} +2025-12-24 21:21:31,157:DEBUG:certbot._internal.display.obj:Notifying user: Requesting a certificate for dev.profibot.hu +2025-12-24 21:21:31,171:DEBUG:acme.client:Requesting fresh nonce +2025-12-24 21:21:31,172:DEBUG:acme.client:Sending HEAD request to https://acme-v02.api.letsencrypt.org/acme/new-nonce. +2025-12-24 21:21:31,327:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "HEAD /acme/new-nonce HTTP/1.1" 200 0 +2025-12-24 21:21:31,328:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 21:21:31 GMT +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEuVmUQFJ48dXZKrJCcvzAA6_fm_Rp1FqtWhIe7bnFgPw +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + + +2025-12-24 21:21:31,328:DEBUG:acme.client:Storing nonce: 58tS3qjEuVmUQFJ48dXZKrJCcvzAA6_fm_Rp1FqtWhIe7bnFgPw +2025-12-24 21:21:31,328:DEBUG:acme.client:JWS payload: +b'{\n "identifiers": [\n {\n "type": "dns",\n "value": "dev.profibot.hu"\n }\n ]\n}' +2025-12-24 21:21:31,341:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/new-order: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRXVWbVVRRko0OGRYWktySkNjdnpBQTZfZm1fUnAxRnF0V2hJZTdibkZnUHciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL25ldy1vcmRlciJ9", + "signature": "E3NOywYUuc0vnsf-7hmjZ_ggVC72zd29KZZDgpmugsp6UIvp4Knq8zBclwD0W2RGbYem3i63MXXWzgNbj2puJFQqPKSD079jGqR27qApJbmaKOK10yAHxgjG0-fiVHIVTLn-PEbhubX-WxH7dkGkUfo6jBhy_yFi0ZK0k3aLGrsDAvR78lDveM7CP9G3viE2fa2hI4_JEpzETINERuewCgTr58xBryAG7fHGrGCOFnZDC7KBBIkHZ8EFkJqzpyFgdLHDYJ-HtFE8M2fiOby5vdGnyWcNFXdZFvVqEt-p3cIwtvDXBwAL6hVwLrXq-B01xr84MqsfB3RE18zMYam4ig", + "payload": "ewogICJpZGVudGlmaWVycyI6IFsKICAgIHsKICAgICAgInR5cGUiOiAiZG5zIiwKICAgICAgInZhbHVlIjogImRldi5wcm9maWJvdC5odSIKICAgIH0KICBdCn0" +} +2025-12-24 21:21:31,673:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/new-order HTTP/1.1" 201 349 +2025-12-24 21:21:31,673:DEBUG:acme.client:Received response: +HTTP 201 +Server: nginx +Date: Wed, 24 Dec 2025 21:21:31 GMT +Content-Type: application/json +Content-Length: 349 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/462324452966 +Replay-Nonce: 58tS3qjEliVwndrn6E2BxW6Lb7OyzUK_Jzl7wNIrtvpTMkPgxTo +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "pending", + "expires": "2025-12-31T21:21:31Z", + "identifiers": [ + { + "type": "dns", + "value": "dev.profibot.hu" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632517542506" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/462324452966" +} +2025-12-24 21:21:31,673:DEBUG:acme.client:Storing nonce: 58tS3qjEliVwndrn6E2BxW6Lb7OyzUK_Jzl7wNIrtvpTMkPgxTo +2025-12-24 21:21:31,674:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 21:21:31,677:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632517542506: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRWxpVnduZHJuNkUyQnhXNkxiN095elVLX0p6bDd3TklydHZwVE1rUGd4VG8iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTE3NTQyNTA2In0", + "signature": "fzuL8PNxCmdszwkla-0uKjB5jeVNVLhedrjMKspWXjEWJU3RsH9NzN3JOgB1Qs4xD7TVbcHQxOWjb_BDGXcLcE6Uk5rPPv-D5BieTvJkIQ8y0fimxY6JJLjThJ0bN0tgas2uBhhyiU3uvBkBUkFzdAZaA4Fn5Y2qy6e9BRODKjeG0pyv3LaTrRoPn9cz4bKA77fJ5zFaHj-kzgYlw8OiaYcUjcZbr7Chn00bheuqKdaOS1Pieg_pAnoJkN2uEAty3JJl33nb2Ws0XJBJ8iVWAe4KgNQPTtF11KfNmEEj9DBCrTdsC2axyKaOnYwRA9FTmjeeRjAWyxFO5_rITT2Fkg", + "payload": "" +} +2025-12-24 21:21:31,835:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632517542506 HTTP/1.1" 200 823 +2025-12-24 21:21:31,836:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 21:21:31 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEQW_ZsNE1cRFjPmi98oNWyZJAwXLjFjwLBvUQT1hB8Hk +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "dev.profibot.hu" + }, + "status": "pending", + "expires": "2025-12-31T21:21:31Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632517542506/daSokg", + "status": "pending", + "token": "hV2I34lK51uE2EOPh9Lrn6F1CJZWOyPiAElHBAg1pJE" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632517542506/O7D10A", + "status": "pending", + "token": "hV2I34lK51uE2EOPh9Lrn6F1CJZWOyPiAElHBAg1pJE" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632517542506/3brn_Q", + "status": "pending", + "token": "hV2I34lK51uE2EOPh9Lrn6F1CJZWOyPiAElHBAg1pJE" + } + ] +} +2025-12-24 21:21:31,836:DEBUG:acme.client:Storing nonce: 58tS3qjEQW_ZsNE1cRFjPmi98oNWyZJAwXLjFjwLBvUQT1hB8Hk +2025-12-24 21:21:31,837:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632517542506/3brn_Q', 'status': 'pending', 'token': 'hV2I34lK51uE2EOPh9Lrn6F1CJZWOyPiAElHBAg1pJE'} +2025-12-24 21:21:31,838:INFO:certbot._internal.auth_handler:Performing the following challenges: +2025-12-24 21:21:31,838:INFO:certbot._internal.auth_handler:http-01 challenge for dev.profibot.hu +2025-12-24 21:21:31,839:INFO:certbot._internal.plugins.webroot:Using the webroot path /data/letsencrypt-acme-challenge for all unmatched domains. +2025-12-24 21:21:31,839:DEBUG:certbot._internal.plugins.webroot:Creating root challenges validation dir at /data/letsencrypt-acme-challenge/.well-known/acme-challenge +2025-12-24 21:21:31,848:DEBUG:certbot._internal.plugins.webroot:Attempting to save validation to /data/letsencrypt-acme-challenge/.well-known/acme-challenge/hV2I34lK51uE2EOPh9Lrn6F1CJZWOyPiAElHBAg1pJE +2025-12-24 21:21:31,849:DEBUG:acme.client:JWS payload: +b'{}' +2025-12-24 21:21:31,852:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632517542506/daSokg: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRVFXX1pzTkUxY1JGalBtaTk4b05XeVpKQXdYTGpGandMQnZVUVQxaEI4SGsiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NoYWxsLzI5MDY0MzgxNzYvNjMyNTE3NTQyNTA2L2RhU29rZyJ9", + "signature": "jw8w89RyC3oknflMH8mH_VjSDOJtSxNAwyqTTybDq7zybeAzvr-g7-pjXeLbVi3BX3iETBh57Jnk_t6EZkcToTEDHfupHTWeUIRQmtvnypetJJa8lu2Xm-A7_DenRSRJxRU-2EhsFSKV8eoteLbJF8QG2MLAPyWnduEXER2qp6K2JH_AjJa-w3wGLVumSYh2dlfiWfqaF-JyLG8gihFWNC7FnKtJNm3LAd_g7aTjVwEwUOiDe2fDfvEdfiTG3DPqfDWp_ukw480SXBRHC1yYhOX3rkvAFYGvV30gYg3zqFnNmVdPFSGtY7TKGb4PJgl8VO3e87hOP6PWCD93XTYs1g", + "payload": "e30" +} +2025-12-24 21:21:32,011:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/chall/2906438176/632517542506/daSokg HTTP/1.1" 200 195 +2025-12-24 21:21:32,012:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 21:21:31 GMT +Content-Type: application/json +Content-Length: 195 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="up" +Location: https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632517542506/daSokg +Replay-Nonce: 58tS3qjESXYq-7REFTf9TBKNRi69JoFW4obdwK9tOA45ZJLHGMA +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632517542506/daSokg", + "status": "pending", + "token": "hV2I34lK51uE2EOPh9Lrn6F1CJZWOyPiAElHBAg1pJE" +} +2025-12-24 21:21:32,012:DEBUG:acme.client:Storing nonce: 58tS3qjESXYq-7REFTf9TBKNRi69JoFW4obdwK9tOA45ZJLHGMA +2025-12-24 21:21:32,013:INFO:certbot._internal.auth_handler:Waiting for verification... +2025-12-24 21:21:33,014:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 21:21:33,018:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632517542506: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRVNYWXEtN1JFRlRmOVRCS05SaTY5Sm9GVzRvYmR3Szl0T0E0NVpKTEhHTUEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTE3NTQyNTA2In0", + "signature": "NJ15FCDtT8mqJNv2ue4xVnzUiOQUF8snHTl3UfvHE7I2FIoKc57Qy8adoqylHHgIkH_ascVg93gbyl9I43p8alqwzF6VUYFdRDY2dHrILRRUgadOk9BY_r-mUO11byhzmfyt_t2pBKd7vomBDhUJaeo9jxM_y5H43o5WvIA4fB72c7s2Fi6O6b0_4zL9VvxxqCzZaC_B4znRCaW0oIFflw9UvZLO_aDRSB4MQJr2RSxRQaZ32wUGeHVjrdHArNajrrZtPK0KJs6Cuj8IvdH8jhAAMFCEW7hT0fK2yjnNeYHWAQD6bk8xyuqSYLx1-UwU5tu3TIezDuQowZTtOw6A1Q", + "payload": "" +} +2025-12-24 21:21:33,174:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632517542506 HTTP/1.1" 200 752 +2025-12-24 21:21:33,175:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 21:21:33 GMT +Content-Type: application/json +Content-Length: 752 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEQMMhUxPtHld6Bw9adr5ebPs-smHXj6yFzhk9ColtEvg +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "dev.profibot.hu" + }, + "status": "invalid", + "expires": "2025-12-31T21:21:31Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632517542506/daSokg", + "status": "invalid", + "validated": "2025-12-24T21:21:31Z", + "error": { + "type": "urn:ietf:params:acme:error:dns", + "detail": "DNS problem: NXDOMAIN looking up A for dev.profibot.hu - check that a DNS record exists for this domain; DNS problem: NXDOMAIN looking up AAAA for dev.profibot.hu - check that a DNS record exists for this domain", + "status": 400 + }, + "token": "hV2I34lK51uE2EOPh9Lrn6F1CJZWOyPiAElHBAg1pJE" + } + ] +} +2025-12-24 21:21:33,175:DEBUG:acme.client:Storing nonce: 58tS3qjEQMMhUxPtHld6Bw9adr5ebPs-smHXj6yFzhk9ColtEvg +2025-12-24 21:21:33,176:INFO:certbot._internal.auth_handler:Challenge failed for domain dev.profibot.hu +2025-12-24 21:21:33,176:INFO:certbot._internal.auth_handler:http-01 challenge for dev.profibot.hu +2025-12-24 21:21:33,176:DEBUG:certbot._internal.display.obj:Notifying user: +Certbot failed to authenticate some domains (authenticator: webroot). The Certificate Authority reported these problems: + Domain: dev.profibot.hu + Type: dns + Detail: DNS problem: NXDOMAIN looking up A for dev.profibot.hu - check that a DNS record exists for this domain; DNS problem: NXDOMAIN looking up AAAA for dev.profibot.hu - check that a DNS record exists for this domain + +Hint: The Certificate Authority failed to download the temporary challenge files created by Certbot. Ensure that the listed domains serve their content from the provided --webroot-path/-w and that files created there can be downloaded from the internet. + +2025-12-24 21:21:33,185:DEBUG:certbot._internal.error_handler:Encountered exception: +Traceback (most recent call last): + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/auth_handler.py", line 104, in handle_authorizations + self._poll_authorizations(authzrs, max_retries, max_time_mins, best_effort) + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/auth_handler.py", line 208, in _poll_authorizations + raise errors.AuthorizationError('Some challenges have failed.') +certbot.errors.AuthorizationError: Some challenges have failed. + +2025-12-24 21:21:33,186:DEBUG:certbot._internal.error_handler:Calling registered functions +2025-12-24 21:21:33,186:INFO:certbot._internal.auth_handler:Cleaning up challenges +2025-12-24 21:21:33,186:DEBUG:certbot._internal.plugins.webroot:Removing /data/letsencrypt-acme-challenge/.well-known/acme-challenge/hV2I34lK51uE2EOPh9Lrn6F1CJZWOyPiAElHBAg1pJE +2025-12-24 21:21:33,187:DEBUG:certbot._internal.plugins.webroot:All challenges cleaned up +2025-12-24 21:21:33,188:DEBUG:certbot._internal.log:Exiting abnormally: +Traceback (most recent call last): + File "/opt/certbot/bin/certbot", line 7, in + sys.exit(main()) + ^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/main.py", line 18, in main + return internal_main.main(cli_args) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 1850, in main + return config.func(config, plugins) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 1562, in certonly + lineage = _get_and_save_cert(le_client, config, domains, certname, lineage) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 141, in _get_and_save_cert + lineage = le_client.obtain_and_enroll_certificate(domains, certname) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 526, in obtain_and_enroll_certificate + cert, chain, key, _ = self.obtain_certificate(domains) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 427, in obtain_certificate + orderr = self._get_order_and_authorizations(csr.data, self.config.allow_subset_of_names) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 505, in _get_order_and_authorizations + authzr = self.auth_handler.handle_authorizations(orderr, self.config, best_effort) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/auth_handler.py", line 104, in handle_authorizations + self._poll_authorizations(authzrs, max_retries, max_time_mins, best_effort) + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/auth_handler.py", line 208, in _poll_authorizations + raise errors.AuthorizationError('Some challenges have failed.') +certbot.errors.AuthorizationError: Some challenges have failed. +2025-12-24 21:21:33,196:ERROR:certbot._internal.log:Some challenges have failed. diff --git a/proxy-manager/data/logs/letsencrypt.log.18 b/proxy-manager/data/logs/letsencrypt.log.18 new file mode 100755 index 0000000..365f85d --- /dev/null +++ b/proxy-manager/data/logs/letsencrypt.log.18 @@ -0,0 +1,332 @@ +2025-12-24 20:49:54,457:DEBUG:certbot._internal.main:certbot version: 5.1.0 +2025-12-24 20:49:54,457:DEBUG:certbot._internal.main:Location of certbot entry point: /opt/certbot/bin/certbot +2025-12-24 20:49:54,457:DEBUG:certbot._internal.main:Arguments: ['--config', '/etc/letsencrypt.ini', '--work-dir', '/tmp/letsencrypt-lib', '--logs-dir', '/data/logs', '--cert-name', 'npm-1', '--agree-tos', '--authenticator', 'webroot', '-m', 'kincses@gmail.com', '--preferred-challenges', 'http', '--domains', 'db.profibot.hu'] +2025-12-24 20:49:54,457:DEBUG:certbot._internal.main:Discovered plugins: PluginsRegistry(PluginEntryPoint#manual,PluginEntryPoint#null,PluginEntryPoint#standalone,PluginEntryPoint#webroot) +2025-12-24 20:49:54,468:DEBUG:certbot._internal.log:Root logging level set at 30 +2025-12-24 20:49:54,469:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2025-12-24 20:49:54,469:DEBUG:certbot._internal.plugins.selection:Single candidate plugin: * webroot +Description: Saves the necessary validation files to a .well-known/acme-challenge/ directory within the nominated webroot path. A separate HTTP server must be running and serving files from the webroot path. HTTP challenge only (wildcards not supported). +Interfaces: Authenticator, Plugin +Entry point: EntryPoint(name='webroot', value='certbot._internal.plugins.webroot:Authenticator', group='certbot.plugins') +Initialized: +Prep: True +2025-12-24 20:49:54,469:DEBUG:certbot._internal.plugins.selection:Selected authenticator and installer None +2025-12-24 20:49:54,469:INFO:certbot._internal.plugins.selection:Plugins selected: Authenticator webroot, Installer None +2025-12-24 20:49:54,515:DEBUG:acme.client:Sending GET request to https://acme-v02.api.letsencrypt.org/directory. +2025-12-24 20:49:54,516:DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org:443 +2025-12-24 20:49:54,990:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "GET /directory HTTP/1.1" 200 1033 +2025-12-24 20:49:54,991:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 20:49:54 GMT +Content-Type: application/json +Content-Length: 1033 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "keyChange": "https://acme-v02.api.letsencrypt.org/acme/key-change", + "meta": { + "caaIdentities": [ + "letsencrypt.org" + ], + "profiles": { + "classic": "https://letsencrypt.org/docs/profiles#classic", + "shortlived": "https://letsencrypt.org/docs/profiles#shortlived", + "tlsclient": "https://letsencrypt.org/docs/profiles#tlsclient", + "tlsserver": "https://letsencrypt.org/docs/profiles#tlsserver" + }, + "termsOfService": "https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf", + "website": "https://letsencrypt.org" + }, + "newAccount": "https://acme-v02.api.letsencrypt.org/acme/new-acct", + "newNonce": "https://acme-v02.api.letsencrypt.org/acme/new-nonce", + "newOrder": "https://acme-v02.api.letsencrypt.org/acme/new-order", + "renewalInfo": "https://acme-v02.api.letsencrypt.org/acme/renewal-info", + "revokeCert": "https://acme-v02.api.letsencrypt.org/acme/revoke-cert", + "vH-fIBjUpTE": "https://community.letsencrypt.org/t/adding-random-entries-to-the-directory/33417" +} +2025-12-24 20:49:54,992:DEBUG:acme.client:Requesting fresh nonce +2025-12-24 20:49:54,992:DEBUG:acme.client:Sending HEAD request to https://acme-v02.api.letsencrypt.org/acme/new-nonce. +2025-12-24 20:49:55,147:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "HEAD /acme/new-nonce HTTP/1.1" 200 0 +2025-12-24 20:49:55,148:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 20:49:55 GMT +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEHoicSN-U4SRTgAqBcNToOn4CNTVtDuT9tuYJEYy3Tsk +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + + +2025-12-24 20:49:55,148:DEBUG:acme.client:Storing nonce: 58tS3qjEHoicSN-U4SRTgAqBcNToOn4CNTVtDuT9tuYJEYy3Tsk +2025-12-24 20:49:55,149:DEBUG:acme.client:JWS payload: +b'{\n "contact": [\n "mailto:kincses@gmail.com"\n ],\n "termsOfServiceAgreed": true\n}' +2025-12-24 20:49:55,153:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/new-acct: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAiandrIjogeyJuIjogIm1GRnRreEIxa3JjaV9VS2dEbzBMbnNpWHF1UUxhNmZBVHhiZGdBVjFiOVpfM3N2WjU2N21VdFhGS3Z5WDNMdVRyclZWLTlnby03NnJYUGFOZmRZalRHcEprUEozMGZka1ZoYkk0R1Y1SWFINXVvb2FRYTJuMFdSazJJLTlCczlGaS02VXZBQzlwR055TkpxUWQzRTRRd1FacFFvbWFsOWhXeDVhQ0pwNml2VDREMVZvbXFZVHJtZ3N6RFJNbDRtT2xmT2pTMVJJUWljSVFNS0F2Y3BsZC0yc2w5Wlh1akFOaWVaaVVfTG4xTHZnNFc0TTdfZ0dMN3BYVFM2N1dPaEUwNWVMRW8wVExUSGVMcERfaVNMMzhKS1g4eWwyWmtLOElkVnJ0WjVHdlRuMmhrcjEzeUNlZUNLY25vdDNIYkgycWhrV1BkS0o1TGZHS2h0YUdYT2RzdyIsICJlIjogIkFRQUIiLCAia3R5IjogIlJTQSJ9LCAibm9uY2UiOiAiNTh0UzNxakVIb2ljU04tVTRTUlRnQXFCY05Ub09uNENOVFZ0RHVUOXR1WUpFWXkzVHNrIiwgInVybCI6ICJodHRwczovL2FjbWUtdjAyLmFwaS5sZXRzZW5jcnlwdC5vcmcvYWNtZS9uZXctYWNjdCJ9", + "signature": "RpyN-mLy2_OgHxW0LMA24cXhVGGXG227CmCKMQ0zdYCTzeOH719f3sZstAfJV7LaI5vPH6SrewsMHQELQB3ZBe_eisB8oVj0reEj47w6vEie5Z0YrXp2H4vc71NQ7SrhRukLf-Kd_UCDKRSU3Wes32mGez4ObkV7MpNRI0yx9cIigtNuKu3cuvIoWi7ue312HSYaKzbi78UZMN3o_ns2lIcPPWCFqiZg0ZQ7o7OOYPFyv1I-aKncRxbot8vTEcW0JllgacnX0oQfrCbA5V8Ke2fgyW2bbOSGYqNVDolk0O2bnX9xo0SVsddxgwB04bofYm4PonM7oh1o39f6sgrSFQ", + "payload": "ewogICJjb250YWN0IjogWwogICAgIm1haWx0bzpraW5jc2VzQGdtYWlsLmNvbSIKICBdLAogICJ0ZXJtc09mU2VydmljZUFncmVlZCI6IHRydWUKfQ" +} +2025-12-24 20:49:55,339:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/new-acct HTTP/1.1" 201 477 +2025-12-24 20:49:55,340:DEBUG:acme.client:Received response: +HTTP 201 +Server: nginx +Date: Wed, 24 Dec 2025 20:49:55 GMT +Content-Type: application/json +Content-Length: 477 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="terms-of-service" +Location: https://acme-v02.api.letsencrypt.org/acme/acct/2906438176 +Replay-Nonce: fULB7aUJ6TrSH2rJJ-9k7oM_ORwuFR9fdwfVB2ILakyp4gbrlq0 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "key": { + "kty": "RSA", + "n": "mFFtkxB1krci_UKgDo0LnsiXquQLa6fATxbdgAV1b9Z_3svZ567mUtXFKvyX3LuTrrVV-9go-76rXPaNfdYjTGpJkPJ30fdkVhbI4GV5IaH5uooaQa2n0WRk2I-9Bs9Fi-6UvAC9pGNyNJqQd3E4QwQZpQomal9hWx5aCJp6ivT4D1VomqYTrmgszDRMl4mOlfOjS1RIQicIQMKAvcpld-2sl9ZXujANieZiU_Ln1Lvg4W4M7_gGL7pXTS67WOhE05eLEo0TLTHeLpD_iSL38JKX8yl2ZkK8IdVrtZ5GvTn2hkr13yCeeCKcnot3HbH2qhkWPdKJ5LfGKhtaGXOdsw", + "e": "AQAB" + }, + "createdAt": "2025-12-24T20:49:55.263765908Z", + "status": "valid" +} +2025-12-24 20:49:55,340:DEBUG:acme.client:Storing nonce: fULB7aUJ6TrSH2rJJ-9k7oM_ORwuFR9fdwfVB2ILakyp4gbrlq0 +2025-12-24 20:49:55,344:DEBUG:certbot._internal.display.obj:Notifying user: Account registered. +2025-12-24 20:49:55,344:DEBUG:certbot._internal.main:Picked account: )>), contact=(), agreement=None, status='valid', terms_of_service_agreed=None, only_return_existing=None, external_account_binding=None), uri='https://acme-v02.api.letsencrypt.org/acme/acct/2906438176', new_authzr_uri=None, terms_of_service='https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf'), e417a583de478a0cfdeed332c1113068, Meta(creation_dt=datetime.datetime(2025, 12, 24, 20, 49, 55, tzinfo=datetime.timezone.utc), creation_host='c6fe500e2aae', register_to_eff=None))> +2025-12-24 20:49:55,346:DEBUG:certbot._internal.display.obj:Notifying user: Requesting a certificate for db.profibot.hu +2025-12-24 20:49:55,351:DEBUG:acme.client:JWS payload: +b'{\n "identifiers": [\n {\n "type": "dns",\n "value": "db.profibot.hu"\n }\n ]\n}' +2025-12-24 20:49:55,355:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/new-order: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSjZUclNIMnJKSi05azdvTV9PUnd1RlI5ZmR3ZlZCMklMYWt5cDRnYnJscTAiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL25ldy1vcmRlciJ9", + "signature": "JltXpxEfUopaWTgCVGebHue0sM0lht52j2ooAv0nj8vAjU7nWKwwVNgKzrzq5AgW5s635bpNhzUaGmRveejMfM4sghabPFwLYItpYB55pF9u3NDH8JlDzfxJGwKrHUvn3_4Mjab4kpdPocDC7SHKqdMaHUnQtnx-FQGARD1U8YNwJEzksxQ1QGEhf5Y0ZwtEsSTSNLZDRysL8d1sDRYfRL3JBEqHMhH3IidRlka6P0G82zJ4s-1YtwLuF9lzvSGL-I3Zg446dvvI_1EWWm7te0jh5cuPJQswW-F9VB7cRAyJvZm9eR-hP3CYB_TaydfweHAw0hNVbpdojGaGpUVcnw", + "payload": "ewogICJpZGVudGlmaWVycyI6IFsKICAgIHsKICAgICAgInR5cGUiOiAiZG5zIiwKICAgICAgInZhbHVlIjogImRiLnByb2ZpYm90Lmh1IgogICAgfQogIF0KfQ" +} +2025-12-24 20:49:55,536:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/new-order HTTP/1.1" 201 348 +2025-12-24 20:49:55,537:DEBUG:acme.client:Received response: +HTTP 201 +Server: nginx +Date: Wed, 24 Dec 2025 20:49:55 GMT +Content-Type: application/json +Content-Length: 348 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/462316842596 +Replay-Nonce: fULB7aUJhPtSP1F2SgroOzH85YgOOLN5Tj3B3vhrz35mtakzsLw +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "pending", + "expires": "2025-12-31T20:49:55Z", + "identifiers": [ + { + "type": "dns", + "value": "db.profibot.hu" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632506783986" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/462316842596" +} +2025-12-24 20:49:55,537:DEBUG:acme.client:Storing nonce: fULB7aUJhPtSP1F2SgroOzH85YgOOLN5Tj3B3vhrz35mtakzsLw +2025-12-24 20:49:55,538:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 20:49:55,542:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632506783986: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSmhQdFNQMUYyU2dyb096SDg1WWdPT0xONVRqM0IzdmhyejM1bXRha3pzTHciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTA2NzgzOTg2In0", + "signature": "X8K93R3oSnjhIZor6qchuIJMbIqCzZagzUUjcpHjr39S8v-EnWqsTs0T97v9LiVA0frQ3Ywz4bi6rn5F9bkCQxc-kFs5NrBs4_DHYpKcOjMscpUuRRjb4whuhF1dBWWWQ9mH7Jj4HtYPZfpjxc55Qsmg4n8qTDFugAd8tq_ffMEMrUG3670E1YPN39A8TMgfVPUZWWgNrtHKIrQzlAL9HpjU0Xpuc6jAxEBX3Tf6XlQmUNZmqPPrRq1KYTu3kwzsov6Yl2dLA5GqkaE3xyuqhfaPiH4dvZ2DWmUqsWTlSU7oPQYJ22xlBM5_CXjAIRyiXtancc9jFW7TGKKD9OGVRw", + "payload": "" +} +2025-12-24 20:49:55,699:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632506783986 HTTP/1.1" 200 822 +2025-12-24 20:49:55,700:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 20:49:55 GMT +Content-Type: application/json +Content-Length: 822 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJ4ovs5U-MQBi0rn3a_-3G7UY6MGx-JPrsljBM5hgXZ_c +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "db.profibot.hu" + }, + "status": "pending", + "expires": "2025-12-31T20:49:55Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632506783986/9MfOKQ", + "status": "pending", + "token": "DXVxT7DREnhAE3aC7VHEAWBzyVErdonLVXWFR1ImaOg" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632506783986/6NKP9g", + "status": "pending", + "token": "DXVxT7DREnhAE3aC7VHEAWBzyVErdonLVXWFR1ImaOg" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632506783986/sTLlGg", + "status": "pending", + "token": "DXVxT7DREnhAE3aC7VHEAWBzyVErdonLVXWFR1ImaOg" + } + ] +} +2025-12-24 20:49:55,701:DEBUG:acme.client:Storing nonce: fULB7aUJ4ovs5U-MQBi0rn3a_-3G7UY6MGx-JPrsljBM5hgXZ_c +2025-12-24 20:49:55,701:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632506783986/9MfOKQ', 'status': 'pending', 'token': 'DXVxT7DREnhAE3aC7VHEAWBzyVErdonLVXWFR1ImaOg'} +2025-12-24 20:49:55,702:INFO:certbot._internal.auth_handler:Performing the following challenges: +2025-12-24 20:49:55,702:INFO:certbot._internal.auth_handler:http-01 challenge for db.profibot.hu +2025-12-24 20:49:55,703:INFO:certbot._internal.plugins.webroot:Using the webroot path /data/letsencrypt-acme-challenge for all unmatched domains. +2025-12-24 20:49:55,703:DEBUG:certbot._internal.plugins.webroot:Creating root challenges validation dir at /data/letsencrypt-acme-challenge/.well-known/acme-challenge +2025-12-24 20:49:55,705:DEBUG:certbot._internal.plugins.webroot:Attempting to save validation to /data/letsencrypt-acme-challenge/.well-known/acme-challenge/DXVxT7DREnhAE3aC7VHEAWBzyVErdonLVXWFR1ImaOg +2025-12-24 20:49:55,705:DEBUG:acme.client:JWS payload: +b'{}' +2025-12-24 20:49:55,706:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632506783986/sTLlGg: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSjRvdnM1VS1NUUJpMHJuM2FfLTNHN1VZNk1HeC1KUHJzbGpCTTVoZ1haX2MiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NoYWxsLzI5MDY0MzgxNzYvNjMyNTA2NzgzOTg2L3NUTGxHZyJ9", + "signature": "ZikfTQF93glLuWXiQ2ttX65huL-bZob8LHZ8tqHUcz_mG80qD0g3rzn9n2smCHv2mb7xPtOY5RiuMMSfQPT7s3n-lHtjDSIrArjCq5PEJJOm2P2ky3oMlGaeladNN4wbm2FBIL29leFfRkVfIt0vAznjLkQjGlkXbTHYBkb82TVrV_VIosuIfkaXjZPco91i_xrfSMbyR0DfYJYYyk3fMJ7XanbkfVCzPgA7BCXOw8vqsKmDEKZjxyI7l2H5ropXfrcoQcEq9eCewlbIdbOtWJP-BGrnv3S0Nu0C0782OaQkVzQkTNm11ue4sKPcvqpIcp9-lH1Oynmh6lSOVkKK4g", + "payload": "e30" +} +2025-12-24 20:49:55,918:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/chall/2906438176/632506783986/sTLlGg HTTP/1.1" 200 195 +2025-12-24 20:49:55,919:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 20:49:55 GMT +Content-Type: application/json +Content-Length: 195 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="up" +Location: https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632506783986/sTLlGg +Replay-Nonce: fULB7aUJrhJVm2KXxiIq4ojIKPg2rDy--W66k6s7Xeq3qKFbyW4 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632506783986/sTLlGg", + "status": "pending", + "token": "DXVxT7DREnhAE3aC7VHEAWBzyVErdonLVXWFR1ImaOg" +} +2025-12-24 20:49:55,919:DEBUG:acme.client:Storing nonce: fULB7aUJrhJVm2KXxiIq4ojIKPg2rDy--W66k6s7Xeq3qKFbyW4 +2025-12-24 20:49:55,919:INFO:certbot._internal.auth_handler:Waiting for verification... +2025-12-24 20:49:56,920:DEBUG:acme.client:JWS payload: +b'' +2025-12-24 20:49:56,924:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632506783986: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSnJoSlZtMktYeGlJcTRvaklLUGcyckR5LS1XNjZrNnM3WGVxM3FLRmJ5VzQiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTA2NzgzOTg2In0", + "signature": "kRZbDyjZoCjFMXnwSyi10E73aD9H7ke6wwqDAX6B3e9F7KNzcOiAjb89SnPjLYjA3LSRgps5Iy9TI7g7LmFM6_FKBGBE729aDUnAp-klBFe2em7BOfmIRtPwwIz24nIyK5MjR1752CDmsRb09jCyvVARIfqGblidwVDTzh4H_p8_f9dZYXIUIwOAUd9LbP7sS78hFLQLbuDpjWxiWUzPDm5L5EJdfptYorlk_kcdF2mdPmVpX9SOkwsptGBgAUcnvwcJoxjJ0gQ0erJutYw9bMsZ3ZHyZg8vboOWPW1R4S0FEtkZM5wxmUY2FgL_30618ac7p4qWYcATP3o08B8bRw", + "payload": "" +} +2025-12-24 20:49:57,081:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632506783986 HTTP/1.1" 200 749 +2025-12-24 20:49:57,082:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Wed, 24 Dec 2025 20:49:57 GMT +Content-Type: application/json +Content-Length: 749 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEC3crQjIzj-AACFKFIf7JpLwdnMc7rupc2nYtYeyLrnM +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "db.profibot.hu" + }, + "status": "invalid", + "expires": "2025-12-31T20:49:55Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632506783986/sTLlGg", + "status": "invalid", + "validated": "2025-12-24T20:49:55Z", + "error": { + "type": "urn:ietf:params:acme:error:dns", + "detail": "DNS problem: NXDOMAIN looking up A for db.profibot.hu - check that a DNS record exists for this domain; DNS problem: NXDOMAIN looking up AAAA for db.profibot.hu - check that a DNS record exists for this domain", + "status": 400 + }, + "token": "DXVxT7DREnhAE3aC7VHEAWBzyVErdonLVXWFR1ImaOg" + } + ] +} +2025-12-24 20:49:57,082:DEBUG:acme.client:Storing nonce: 58tS3qjEC3crQjIzj-AACFKFIf7JpLwdnMc7rupc2nYtYeyLrnM +2025-12-24 20:49:57,083:INFO:certbot._internal.auth_handler:Challenge failed for domain db.profibot.hu +2025-12-24 20:49:57,083:INFO:certbot._internal.auth_handler:http-01 challenge for db.profibot.hu +2025-12-24 20:49:57,084:DEBUG:certbot._internal.display.obj:Notifying user: +Certbot failed to authenticate some domains (authenticator: webroot). The Certificate Authority reported these problems: + Domain: db.profibot.hu + Type: dns + Detail: DNS problem: NXDOMAIN looking up A for db.profibot.hu - check that a DNS record exists for this domain; DNS problem: NXDOMAIN looking up AAAA for db.profibot.hu - check that a DNS record exists for this domain + +Hint: The Certificate Authority failed to download the temporary challenge files created by Certbot. Ensure that the listed domains serve their content from the provided --webroot-path/-w and that files created there can be downloaded from the internet. + +2025-12-24 20:49:57,084:DEBUG:certbot._internal.error_handler:Encountered exception: +Traceback (most recent call last): + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/auth_handler.py", line 104, in handle_authorizations + self._poll_authorizations(authzrs, max_retries, max_time_mins, best_effort) + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/auth_handler.py", line 208, in _poll_authorizations + raise errors.AuthorizationError('Some challenges have failed.') +certbot.errors.AuthorizationError: Some challenges have failed. + +2025-12-24 20:49:57,084:DEBUG:certbot._internal.error_handler:Calling registered functions +2025-12-24 20:49:57,085:INFO:certbot._internal.auth_handler:Cleaning up challenges +2025-12-24 20:49:57,085:DEBUG:certbot._internal.plugins.webroot:Removing /data/letsencrypt-acme-challenge/.well-known/acme-challenge/DXVxT7DREnhAE3aC7VHEAWBzyVErdonLVXWFR1ImaOg +2025-12-24 20:49:57,085:DEBUG:certbot._internal.plugins.webroot:All challenges cleaned up +2025-12-24 20:49:57,085:DEBUG:certbot._internal.log:Exiting abnormally: +Traceback (most recent call last): + File "/opt/certbot/bin/certbot", line 7, in + sys.exit(main()) + ^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/main.py", line 18, in main + return internal_main.main(cli_args) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 1850, in main + return config.func(config, plugins) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 1562, in certonly + lineage = _get_and_save_cert(le_client, config, domains, certname, lineage) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 141, in _get_and_save_cert + lineage = le_client.obtain_and_enroll_certificate(domains, certname) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 526, in obtain_and_enroll_certificate + cert, chain, key, _ = self.obtain_certificate(domains) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 427, in obtain_certificate + orderr = self._get_order_and_authorizations(csr.data, self.config.allow_subset_of_names) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 505, in _get_order_and_authorizations + authzr = self.auth_handler.handle_authorizations(orderr, self.config, best_effort) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/auth_handler.py", line 104, in handle_authorizations + self._poll_authorizations(authzrs, max_retries, max_time_mins, best_effort) + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/auth_handler.py", line 208, in _poll_authorizations + raise errors.AuthorizationError('Some challenges have failed.') +certbot.errors.AuthorizationError: Some challenges have failed. +2025-12-24 20:49:57,087:ERROR:certbot._internal.log:Some challenges have failed. diff --git a/proxy-manager/data/logs/letsencrypt.log.19 b/proxy-manager/data/logs/letsencrypt.log.19 new file mode 100755 index 0000000..e69de29 diff --git a/proxy-manager/data/logs/letsencrypt.log.2 b/proxy-manager/data/logs/letsencrypt.log.2 new file mode 100755 index 0000000..1381d24 --- /dev/null +++ b/proxy-manager/data/logs/letsencrypt.log.2 @@ -0,0 +1,1368 @@ +2026-01-27 23:19:22,732:DEBUG:certbot._internal.main:certbot version: 5.1.0 +2026-01-27 23:19:22,732:DEBUG:certbot._internal.main:Location of certbot entry point: /opt/certbot/bin/certbot +2026-01-27 23:19:22,732:DEBUG:certbot._internal.main:Arguments: ['--config', '/etc/letsencrypt.ini', '--work-dir', '/tmp/letsencrypt-lib', '--logs-dir', '/data/logs', '--cert-name', 'npm-17', '--agree-tos', '--authenticator', 'webroot', '-m', 'kincses@gmail.com', '--preferred-challenges', 'http', '--domains', 'terminal.profibot.hu'] +2026-01-27 23:19:22,732:DEBUG:certbot._internal.main:Discovered plugins: PluginsRegistry(PluginEntryPoint#manual,PluginEntryPoint#null,PluginEntryPoint#standalone,PluginEntryPoint#webroot) +2026-01-27 23:19:22,746:DEBUG:certbot._internal.log:Root logging level set at 30 +2026-01-27 23:19:22,747:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2026-01-27 23:19:22,747:DEBUG:certbot._internal.plugins.selection:Single candidate plugin: * webroot +Description: Saves the necessary validation files to a .well-known/acme-challenge/ directory within the nominated webroot path. A separate HTTP server must be running and serving files from the webroot path. HTTP challenge only (wildcards not supported). +Interfaces: Authenticator, Plugin +Entry point: EntryPoint(name='webroot', value='certbot._internal.plugins.webroot:Authenticator', group='certbot.plugins') +Initialized: +Prep: True +2026-01-27 23:19:22,747:DEBUG:certbot._internal.plugins.selection:Selected authenticator and installer None +2026-01-27 23:19:22,747:INFO:certbot._internal.plugins.selection:Plugins selected: Authenticator webroot, Installer None +2026-01-27 23:19:22,790:DEBUG:certbot._internal.main:Picked account: +2026-01-27 23:19:22,791:DEBUG:acme.client:Sending GET request to https://acme-v02.api.letsencrypt.org/directory. +2026-01-27 23:19:22,793:DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org:443 +2026-01-27 23:19:23,235:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "GET /directory HTTP/1.1" 200 1033 +2026-01-27 23:19:23,236:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:19:23 GMT +Content-Type: application/json +Content-Length: 1033 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "TjMk-AEmEog": "https://community.letsencrypt.org/t/adding-random-entries-to-the-directory/33417", + "keyChange": "https://acme-v02.api.letsencrypt.org/acme/key-change", + "meta": { + "caaIdentities": [ + "letsencrypt.org" + ], + "profiles": { + "classic": "https://letsencrypt.org/docs/profiles#classic", + "shortlived": "https://letsencrypt.org/docs/profiles#shortlived", + "tlsclient": "https://letsencrypt.org/docs/profiles#tlsclient", + "tlsserver": "https://letsencrypt.org/docs/profiles#tlsserver" + }, + "termsOfService": "https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf", + "website": "https://letsencrypt.org" + }, + "newAccount": "https://acme-v02.api.letsencrypt.org/acme/new-acct", + "newNonce": "https://acme-v02.api.letsencrypt.org/acme/new-nonce", + "newOrder": "https://acme-v02.api.letsencrypt.org/acme/new-order", + "renewalInfo": "https://acme-v02.api.letsencrypt.org/acme/renewal-info", + "revokeCert": "https://acme-v02.api.letsencrypt.org/acme/revoke-cert" +} +2026-01-27 23:19:23,237:DEBUG:certbot._internal.display.obj:Notifying user: Requesting a certificate for terminal.profibot.hu +2026-01-27 23:19:23,258:DEBUG:acme.client:Requesting fresh nonce +2026-01-27 23:19:23,259:DEBUG:acme.client:Sending HEAD request to https://acme-v02.api.letsencrypt.org/acme/new-nonce. +2026-01-27 23:19:23,402:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "HEAD /acme/new-nonce HTTP/1.1" 200 0 +2026-01-27 23:19:23,402:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:19:23 GMT +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: z6o3uXKgSpfmjVTAlr6OwHqqoMRy42sq_WI2C0BIC9ftye_HkNs +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + + +2026-01-27 23:19:23,403:DEBUG:acme.client:Storing nonce: z6o3uXKgSpfmjVTAlr6OwHqqoMRy42sq_WI2C0BIC9ftye_HkNs +2026-01-27 23:19:23,403:DEBUG:acme.client:JWS payload: +b'{\n "identifiers": [\n {\n "type": "dns",\n "value": "terminal.profibot.hu"\n }\n ]\n}' +2026-01-27 23:19:23,415:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/new-order: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJ6Nm8zdVhLZ1NwZm1qVlRBbHI2T3dIcXFvTVJ5NDJzcV9XSTJDMEJJQzlmdHllX0hrTnMiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL25ldy1vcmRlciJ9", + "signature": "a5dutotjG4f4CNS0HmqMVyz8kK6HAvyc0BTrw9zx_coTsgbrVHYup6LZRM3EXLEGbBTHwjI2S-c-twNXVe2Ooos4HMFMjtEi-CWd9rKKAm8EE6GJOeJG1HQfUT_3er105aDFa0IQURBKqidlbLfvDPQxK06PBINTzfr1MpfFaFgJmjEqlGe2mLc1R8k-o5q9ScLr9viW9NFo-P3jTwtkb3LOVzfDjGRpnICOCBZb_as7hTjHVvQ0Zp-ZfY7Cj5i_8ZdBa5ZhN-K05rEGrp0ulJJZuXD2tgXINOf4gkYBk7awBrtE7TT5a6nfVQAoJHasMTEsoOOEwW9DmRh6mgY-tw", + "payload": "ewogICJpZGVudGlmaWVycyI6IFsKICAgIHsKICAgICAgInR5cGUiOiAiZG5zIiwKICAgICAgInZhbHVlIjogInRlcm1pbmFsLnByb2ZpYm90Lmh1IgogICAgfQogIF0KfQ" +} +2026-01-27 23:19:23,681:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/new-order HTTP/1.1" 201 354 +2026-01-27 23:19:23,682:DEBUG:acme.client:Received response: +HTTP 201 +Server: nginx +Date: Tue, 27 Jan 2026 23:19:23 GMT +Content-Type: application/json +Content-Length: 354 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/474148345596 +Replay-Nonce: z6o3uXKgFuzjf2tkb7R1LdEz5JdJXi0Cp4PminoJ86yqW81HxUc +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "pending", + "expires": "2026-02-03T23:19:23Z", + "identifiers": [ + { + "type": "dns", + "value": "terminal.profibot.hu" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649788427386" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/474148345596" +} +2026-01-27 23:19:23,682:DEBUG:acme.client:Storing nonce: z6o3uXKgFuzjf2tkb7R1LdEz5JdJXi0Cp4PminoJ86yqW81HxUc +2026-01-27 23:19:23,683:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:19:23,685:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649788427386: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJ6Nm8zdVhLZ0Z1empmMnRrYjdSMUxkRXo1SmRKWGkwQ3A0UG1pbm9KODZ5cVc4MUh4VWMiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg4NDI3Mzg2In0", + "signature": "hAHyrYBCCgT3S8TMTxN2ni7CiOSz3PNG1UwHmhiEgDdzTBX5Qbj8RcRO4Ubgs-9t67wKKurep69xv49Qn-s6Den6_YjlQch7c3_pA57sTkaEJwryLlUJUa537i1GiSg1v0d1YBxcByTFqFm8Y0vgGXwbtZ2so4FOhvhKUIywzx4hBiRec_MY4DdODJVGmX0E6G97z2dvo6m58IWFFH5FjF8FA7m1W2L7tNodMmBAlqM5bawbqdPwpbCe6e_il0HIIHwY0lWtQiPaBzfhTw47ggSy9-BHMTcC9ATIdYyukxN0zU0ueHDIBnHLdJhvg4Uwg0iahwy8wE51CjvHkXnATg", + "payload": "" +} +2026-01-27 23:19:23,843:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649788427386 HTTP/1.1" 200 828 +2026-01-27 23:19:23,844:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:19:23 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: F4vGLPjlblpg5itcV1dX6w2nMh5o6QmyktllBcQz_Qs8Cp4nl3Y +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:19:23Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/3Lj5Rg", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/iD1r9Q", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + } + ] +} +2026-01-27 23:19:23,844:DEBUG:acme.client:Storing nonce: F4vGLPjlblpg5itcV1dX6w2nMh5o6QmyktllBcQz_Qs8Cp4nl3Y +2026-01-27 23:19:23,845:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ', 'status': 'pending', 'token': 'KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w'} +2026-01-27 23:19:23,845:INFO:certbot._internal.auth_handler:Performing the following challenges: +2026-01-27 23:19:23,846:INFO:certbot._internal.auth_handler:http-01 challenge for terminal.profibot.hu +2026-01-27 23:19:23,846:INFO:certbot._internal.plugins.webroot:Using the webroot path /data/letsencrypt-acme-challenge for all unmatched domains. +2026-01-27 23:19:23,847:DEBUG:certbot._internal.plugins.webroot:Creating root challenges validation dir at /data/letsencrypt-acme-challenge/.well-known/acme-challenge +2026-01-27 23:19:23,849:DEBUG:certbot._internal.plugins.webroot:Attempting to save validation to /data/letsencrypt-acme-challenge/.well-known/acme-challenge/KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w +2026-01-27 23:19:23,850:DEBUG:acme.client:JWS payload: +b'{}' +2026-01-27 23:19:23,853:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/3Lj5Rg: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJGNHZHTFBqbGJscGc1aXRjVjFkWDZ3Mm5NaDVvNlFteWt0bGxCY1F6X1FzOENwNG5sM1kiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NoYWxsLzI5MDY0MzgxNzYvNjQ5Nzg4NDI3Mzg2LzNMajVSZyJ9", + "signature": "BHhodnIGDhZ6haAaop4ktB4Zs9iT09-tO2r4Hv6mCvq6rwsY4H92Tip-8jkcehJ1m2Cgm1ULiRYYWGFIPE9m18PDzkpCqwQNj8tDwWYi5VgPI4-6znIFOYtAGuUJ8xMPsp2jQ2-owMtKgvNoi_9irAoFi8AfOUXlm1QPyRSrvJrW6IdLPZNDdXt0OWX2kr3UcpLLuXSV5hiDa9_WqFVLJ1giv_myFtzWZdBC4O-59Rjr5i4GC-XlG3MR8VGaPi7uXF1u8pxX213DKgUYmL4IZiszkBTbsGyUR6iyQswoNFBJ8PniW4F9tjxD70Cg-8MLPQspvPcz5knbDXSq9MuilQ", + "payload": "e30" +} +2026-01-27 23:19:24,002:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/chall/2906438176/649788427386/3Lj5Rg HTTP/1.1" 200 195 +2026-01-27 23:19:24,003:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:19:23 GMT +Content-Type: application/json +Content-Length: 195 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="up" +Location: https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/3Lj5Rg +Replay-Nonce: F4vGLPjlbA3KCgJ9NNzZFTz1jV2FYwSrmftwxkNGQtkSKx2yIJ8 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/3Lj5Rg", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" +} +2026-01-27 23:19:24,004:DEBUG:acme.client:Storing nonce: F4vGLPjlbA3KCgJ9NNzZFTz1jV2FYwSrmftwxkNGQtkSKx2yIJ8 +2026-01-27 23:19:24,004:INFO:certbot._internal.auth_handler:Waiting for verification... +2026-01-27 23:19:25,005:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:19:25,009:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649788427386: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJGNHZHTFBqbGJBM0tDZ0o5Tk56WkZUejFqVjJGWXdTcm1mdHd4a05HUXRrU0t4MnlJSjgiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg4NDI3Mzg2In0", + "signature": "Y6Cu1te16-LtZfWXSQI5eICQUlPNT4TsTqqFsBLS8_2NtbezOY3xPROv4yFFl6e4CxVOgvQVE1yb38zyJC_VBBmIu5W7NScK1fH1RZbiQbRwY0TwdDOi_HNyTMK8eTpZ61rcB4J4NQPbcxAyVNNtCRwf6kvgchiBCAb_1JX7-rOon-qHpue9i4mtYUcw8ZV5h_oTFey3wxh5Z1i09qkZJjJjgOgHD5VjxWUS84Oen_qkkKgBG0tklyrrFMDRQEAPqS_VnPVdYY0P0CE5K7LNKogPNoi0UFCibNm7e6PjXsWSGMfWL5QbduE1xjXMXIAhqjltCJcc8V025vtZPVJ0Fg", + "payload": "" +} +2026-01-27 23:19:25,154:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649788427386 HTTP/1.1" 200 828 +2026-01-27 23:19:25,155:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:19:25 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: F4vGLPjlHTVaDXmOBf2DBjdfEL6PFeBv5rvMPB7llAWMIDkGNWs +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:19:23Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/iD1r9Q", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/3Lj5Rg", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + } + ] +} +2026-01-27 23:19:25,155:DEBUG:acme.client:Storing nonce: F4vGLPjlHTVaDXmOBf2DBjdfEL6PFeBv5rvMPB7llAWMIDkGNWs +2026-01-27 23:19:25,156:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ', 'status': 'pending', 'token': 'KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w'} +2026-01-27 23:19:28,157:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:19:28,161:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649788427386: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJGNHZHTFBqbEhUVmFEWG1PQmYyREJqZGZFTDZQRmVCdjVydk1QQjdsbEFXTUlEa0dOV3MiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg4NDI3Mzg2In0", + "signature": "ZN-Fc8DwNuei1wokZyLsn8u6UZbddFdlF0pXwfvP0Zyr3J_cLASNrNXkwvWbqI4J2q5Tl1qOEwDwC_Dvo01etXSQfZP7cQWu6eH9ypUREY1JeZsUKT8hPmFYOo1L5ZfcoKr3saIqFNngK8tSctrXHiZsKAmB90ntUME72ZZFsy-br0AncGFuJjMhaW7Hy9L2V7kwTAurnhGpb0WlUtMaiL-UA2e3XK6DGABvAXhO5TvRYQDnQO28itQUJofQhQ1tzPVR8zPFbe71CqnFkVNfovTlGQ7Vcu6K5PaaUFIkv8VRkbZtkBq42yfdTJWOAh7WeaBwd6d5sGp13mBMNnJUew", + "payload": "" +} +2026-01-27 23:19:28,317:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649788427386 HTTP/1.1" 200 828 +2026-01-27 23:19:28,318:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:19:28 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: F4vGLPjlSDEIoYPXPdEXQC124X03w04SqyWlTio_ITy0EXnDGMM +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:19:23Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/3Lj5Rg", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/iD1r9Q", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + } + ] +} +2026-01-27 23:19:28,318:DEBUG:acme.client:Storing nonce: F4vGLPjlSDEIoYPXPdEXQC124X03w04SqyWlTio_ITy0EXnDGMM +2026-01-27 23:19:28,319:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ', 'status': 'pending', 'token': 'KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w'} +2026-01-27 23:19:31,320:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:19:31,324:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649788427386: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJGNHZHTFBqbFNERUlvWVBYUGRFWFFDMTI0WDAzdzA0U3F5V2xUaW9fSVR5MEVYbkRHTU0iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg4NDI3Mzg2In0", + "signature": "G2a4ywCfpokQIgwCdF07rOsmGWyWeCTm61FmnzTUVC68Vze-9X2PTt00M7Ym1Jld9xSlfIE8GWIzARfkx-SeeCSWrn-JowMUM7TnWs3valZzAyG9DK6IBGty2q42dAdbKmsrE0WrLGb9z6f1sKY7QwvGAOhO2wApNTEv4ZhGjCfVp__3nYgAJ5Uc0Hez8rbBNTRLAneuE51_E1WerUSkUtAuZRthsfkKE-CGw_GZTWfOnv4eoJRPPTmBm7xVX6ccTnUBBufbiBtHA0X2aaSaEiVTgGl78YMPNF0xlMSQSJzjp55GsWeCJ34x4cWTXehEQdGVp-VWhIJkek8vRP0Xzg", + "payload": "" +} +2026-01-27 23:19:31,469:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649788427386 HTTP/1.1" 200 828 +2026-01-27 23:19:31,470:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:19:31 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: F4vGLPjlInseeTd93_w0JFUnGn2W27XwCn-yK4dPo8YBTPh1uik +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:19:23Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/iD1r9Q", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/3Lj5Rg", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + } + ] +} +2026-01-27 23:19:31,471:DEBUG:acme.client:Storing nonce: F4vGLPjlInseeTd93_w0JFUnGn2W27XwCn-yK4dPo8YBTPh1uik +2026-01-27 23:19:31,471:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ', 'status': 'pending', 'token': 'KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w'} +2026-01-27 23:19:34,472:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:19:34,476:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649788427386: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJGNHZHTFBqbEluc2VlVGQ5M193MEpGVW5HbjJXMjdYd0NuLXlLNGRQbzhZQlRQaDF1aWsiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg4NDI3Mzg2In0", + "signature": "jYp0f78KdGi2_ScJVbfaM00FUJlxbTO2KYdMqJ7xN1xUtrxJj8G7KQmm0ihFkvoZwhGkbt_I5YxvF_QjlC-MoG41QxiP_vCTiTU_OKwdsvNQKmfafyWxGcJSl7COXOnhb8HOQcF-lZwJW68R7arMxx320Z7iKBWUwncaRtFahs2oJonRQ1b5pi4x-qEVbilbl0Zefj2uk3S4Le37hzZI0fYyT-a8-30uv9fiur4grfklZdvDRm8-MKAesIrUoFtiy8aFUsqCUFFTYuKefeI769QNpBs8ek2b6GNrEN6qx4EW9FeMnU4rdwT96s8jRwMFBhhBwrA9Wd9Mz5zyxrd-Iw", + "payload": "" +} +2026-01-27 23:19:34,622:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649788427386 HTTP/1.1" 200 828 +2026-01-27 23:19:34,623:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:19:34 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: F4vGLPjlp5yFuQElT9VqaILSFyQJuzxaOnDEiMNcVbFIsMXp07E +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:19:23Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/iD1r9Q", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/3Lj5Rg", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + } + ] +} +2026-01-27 23:19:34,623:DEBUG:acme.client:Storing nonce: F4vGLPjlp5yFuQElT9VqaILSFyQJuzxaOnDEiMNcVbFIsMXp07E +2026-01-27 23:19:34,624:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ', 'status': 'pending', 'token': 'KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w'} +2026-01-27 23:19:37,625:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:19:37,628:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649788427386: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJGNHZHTFBqbHA1eUZ1UUVsVDlWcWFJTFNGeVFKdXp4YU9uREVpTU5jVmJGSXNNWHAwN0UiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg4NDI3Mzg2In0", + "signature": "eb-3JkbnaOOCePDxfKDPHoqYk1au2fiytBJEisur24ntyrfgoluy92noZZMP5ZBv5favzBRwf_e-SHEDsw7mOrOGQxLkRwbn0TxuVG8e6YevMvfInfYhyIfoNqi6tlrBuPLFGaA5co5ay4sh_Evb61hrjKnuebXyurKL_-oa3Zz0tOcYhf5zxsr0VcNPbgRyXRTcd7Kf_29x0GNfiheEbMlVMV_70hpjYZASiEobx8wQr503Rx9V2mkTVaymumugMl0C0lGKIgy7oFrh8R4h_24Xg1S5ZNjBq95L4KYmp9vwiIeNPIb5OFXb9n1PYC0iueIzorNc0au7MCwhrobcQA", + "payload": "" +} +2026-01-27 23:19:37,774:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649788427386 HTTP/1.1" 200 828 +2026-01-27 23:19:37,775:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:19:37 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: F4vGLPjlCKKC1uZJYx0pLpYEt8bIH32exo7ErAflUFz2mcAYo4s +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:19:23Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/3Lj5Rg", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/iD1r9Q", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + } + ] +} +2026-01-27 23:19:37,776:DEBUG:acme.client:Storing nonce: F4vGLPjlCKKC1uZJYx0pLpYEt8bIH32exo7ErAflUFz2mcAYo4s +2026-01-27 23:19:37,776:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ', 'status': 'pending', 'token': 'KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w'} +2026-01-27 23:19:40,777:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:19:40,781:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649788427386: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJGNHZHTFBqbENLS0MxdVpKWXgwcExwWUV0OGJJSDMyZXhvN0VyQWZsVUZ6Mm1jQVlvNHMiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg4NDI3Mzg2In0", + "signature": "PEXiNRKhSHad22j35ykCzwNoL1q9rlEg9HiOZfrDh2PaKIw-WQtCmfAG-kRmvL86WfU1KymWePfSpotuMCdjzy4HUMQzvGlXYNhRt04luuUiY6WqvgcqsG1Weykcw6ak97BpgF4EK9pLAKRebisDXSHP9SHG_40yHa6VoHJHSKJ9rGE21tO_ZczvHwm-WXbG1QeQ9_diAoM8-lO4wpL8MkxT3cdO8CopHHoVPFzH08XcDQNZyDuI9f-FvhC0C3uHhpKSIPsZe87f2iOzSWA8KhghbK8wFDuM0ZrMjJ2k-3wXG7ffbGXwLKcIaNME19FyjSQUpsxIUEUnf3AmpwyXmg", + "payload": "" +} +2026-01-27 23:19:40,925:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649788427386 HTTP/1.1" 200 828 +2026-01-27 23:19:40,926:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:19:40 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: z6o3uXKgsUfFvCntvRT0dKUHmwf-o6i6Ug0mjSogjRo-uL_BIWk +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:19:23Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/3Lj5Rg", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/iD1r9Q", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + } + ] +} +2026-01-27 23:19:40,926:DEBUG:acme.client:Storing nonce: z6o3uXKgsUfFvCntvRT0dKUHmwf-o6i6Ug0mjSogjRo-uL_BIWk +2026-01-27 23:19:40,926:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ', 'status': 'pending', 'token': 'KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w'} +2026-01-27 23:19:43,927:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:19:43,931:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649788427386: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJ6Nm8zdVhLZ3NVZkZ2Q250dlJUMGRLVUhtd2YtbzZpNlVnMG1qU29nalJvLXVMX0JJV2siLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg4NDI3Mzg2In0", + "signature": "A6WyrmQH7mHQOyvRpxvlGmqzZB1hdfOBzXvZ4_EzWkpX7LNZSzEMPWaKEfGuYfwXYp9dVNl6sJXzneuodQjmJ_QcMTbINFLp0v_GCkSklI0dycN3MMtSd9eqf7xq1BdUKi8HHYK8JMUCAG3eC_ZNCP2YYFIxIpKlWFfqi6491cpJwYmCSE1Fi_2_ZXPPVMiE558OR-hEQ9wlbDoosgw3w9ErqwQQw8B-OQoXeMFBCuOpiM8Zq5U5dxCb16FHh1zqH_PNmem99yNt9em2fFDyoPXGqhywO_1YrjfzD9_ucgL7-WW-Tr7N2YO4CFDGjl3MWGPYQf5sDsHNIG1CQ1j-Aw", + "payload": "" +} +2026-01-27 23:19:44,076:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649788427386 HTTP/1.1" 200 828 +2026-01-27 23:19:44,077:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:19:44 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: F4vGLPjlisqJkINek1IXv6rKN_5cDe94Krn1-wi1q510m7AKGmo +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:19:23Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/3Lj5Rg", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/iD1r9Q", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + } + ] +} +2026-01-27 23:19:44,078:DEBUG:acme.client:Storing nonce: F4vGLPjlisqJkINek1IXv6rKN_5cDe94Krn1-wi1q510m7AKGmo +2026-01-27 23:19:44,078:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ', 'status': 'pending', 'token': 'KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w'} +2026-01-27 23:19:47,079:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:19:47,082:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649788427386: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJGNHZHTFBqbGlzcUprSU5lazFJWHY2cktOXzVjRGU5NEtybjEtd2kxcTUxMG03QUtHbW8iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg4NDI3Mzg2In0", + "signature": "j_85qTEi2lm2l19jK6YFqcv_mW8h0OGVe5bgYzrABxRvxhSSCKr-WY4LuXQN-tCal0Q1-X5hXUQjdgZcXGTYzMCJgw6hqbzR3OU751c-mt4j9uhjYNbecfwJ1D5LP_lvqajrnAu9v8sdA7iK-9C_s2hxYtsMyP2Vz2oPKrR1pPzzMKVcApcMGbID5ZyQ893-6bmzSM1cMiakoFCWNClQE-15Etqzpk0suN0xI4PyKZbN1BCYvi5FHSKATMgmchUO5Dq5EtFY4kvGHU3Ql5SCZIkL09e-NotCBc1xTXTdm6NmsSuBmM9rQQ6U5Aa5DVKWdNUVzCgRLiBN1q9eqwab1g", + "payload": "" +} +2026-01-27 23:19:47,239:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649788427386 HTTP/1.1" 200 828 +2026-01-27 23:19:47,239:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:19:47 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: F4vGLPjl_jXd04SrwuHmoz82Zz-exyMgM4YkDqGRFkMIdMLkuQ0 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:19:23Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/3Lj5Rg", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/iD1r9Q", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + } + ] +} +2026-01-27 23:19:47,240:DEBUG:acme.client:Storing nonce: F4vGLPjl_jXd04SrwuHmoz82Zz-exyMgM4YkDqGRFkMIdMLkuQ0 +2026-01-27 23:19:47,240:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ', 'status': 'pending', 'token': 'KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w'} +2026-01-27 23:19:50,242:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:19:50,245:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649788427386: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJGNHZHTFBqbF9qWGQwNFNyd3VIbW96ODJaei1leHlNZ000WWtEcUdSRmtNSWRNTGt1UTAiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg4NDI3Mzg2In0", + "signature": "Q_ov6bjIeLWI14twjpBufnFhgjA-YatWwHuWf5wH2qsoQ24g1id6I-9WMUkGeJs8lhjF6ycbF8KR1uGpNwZJaQtxM8B4H5mISOas-DSYe864gI-YyQF-ArmUJjiLFPYGi3YMLp3v_UZcTxccwn_4bZos1UkBOUJV_-BhxeSIkuwFTZch-M61lhv7kKL11lR3oNqOTdgwwpnGgH7x7zrqYWRQQ1Ltzcw6958mElDM69LB6oEus1csm5Wyx9hpQurz1p-bQ63ceQbYyvs1e_SgYr-8D3AOy4xFtRQ1X7mhdqyKh-vxU6EaGBEYX4qP-sIHhwuGIo0IfMySzEBwVETiFg", + "payload": "" +} +2026-01-27 23:19:50,391:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649788427386 HTTP/1.1" 200 828 +2026-01-27 23:19:50,392:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:19:50 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: z6o3uXKg-a7OpxHOXb3wPef95UJ2hhZTZ2HDCbQjVvdRWbBe2Fs +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:19:23Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/3Lj5Rg", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/iD1r9Q", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + } + ] +} +2026-01-27 23:19:50,392:DEBUG:acme.client:Storing nonce: z6o3uXKg-a7OpxHOXb3wPef95UJ2hhZTZ2HDCbQjVvdRWbBe2Fs +2026-01-27 23:19:50,393:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ', 'status': 'pending', 'token': 'KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w'} +2026-01-27 23:19:53,394:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:19:53,398:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649788427386: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJ6Nm8zdVhLZy1hN09weEhPWGIzd1BlZjk1VUoyaGhaVFoySERDYlFqVnZkUldiQmUyRnMiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg4NDI3Mzg2In0", + "signature": "ZLVA55f6-YN8qcRF9tB_hrOOEByrvlC2e7KfX3RRsbXq8wwsQjedepK6Zjvkdc_ffFV2-SUlosFFtzHu8KlWLm6JIS8ec95rCJAaZvQcSm5oT8FqeilQz0BPxKT06RImeVZF9XJxE7__XJXnQsJrTO6sy0hBMig6XowluB5-1YmmgwKjLP4CnkK0HsbfjS3u5exKD8k-LdUuxjk6jnXDtcEtCiOXyqVr9-8VJB7YMAd1a2x69b_2tsCgbQuU16RzPrwCZRqgHBl_5tIMbL5t6teEvZv2hAr1PndFJ1jiIjUZZiYw-VuUFw1I673SlKSb_G4GQO-X_JNHZkl8YPtjIg", + "payload": "" +} +2026-01-27 23:19:53,543:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649788427386 HTTP/1.1" 200 828 +2026-01-27 23:19:53,544:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:19:53 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: F4vGLPjlJEBhigl3ijYKrH0BH9kX17Igle99Ql7J2iZSkxRAoTw +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:19:23Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/3Lj5Rg", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/iD1r9Q", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + } + ] +} +2026-01-27 23:19:53,545:DEBUG:acme.client:Storing nonce: F4vGLPjlJEBhigl3ijYKrH0BH9kX17Igle99Ql7J2iZSkxRAoTw +2026-01-27 23:19:53,545:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ', 'status': 'pending', 'token': 'KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w'} +2026-01-27 23:19:56,546:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:19:56,550:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649788427386: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJGNHZHTFBqbEpFQmhpZ2wzaWpZS3JIMEJIOWtYMTdJZ2xlOTlRbDdKMmlaU2t4UkFvVHciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg4NDI3Mzg2In0", + "signature": "DjnVA5-KBTkNGHA8qY4AFUT5M9LBtQr7gwB28lNmezzOSY5iY48Jbak5WH1fm6s2FDRmQ7wydcNQxAv-vk9Y7FWJyDKc_UI6mB4-39aDi_YsXpEAb0PQEO2yIkrC_3N6E9nBYCr2nSJhaTco9838foSdWFPwnIUUPTRDIIJ7Djbvpe-gyWQ0TWl69BS0RPOW1GAAxvr2VIs54H7NBWwq0OQY_Rto3TkFSN9Tj-yDasbNbGyxeNxQp4XF2xnrlJmEQ1LyCLqfWYLsIdf9MaJdtsg9qbtsKH4PDx4H8mQcs-_Ma4053qYqqdRdGkzOE-FR_4RSJo8UZbHne1hSBvSyTQ", + "payload": "" +} +2026-01-27 23:19:56,697:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649788427386 HTTP/1.1" 200 828 +2026-01-27 23:19:56,698:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:19:56 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: F4vGLPjlk4IcPD7MvE-CBZLLPpP2q_gZCUoLLvPftv412OAMCeo +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:19:23Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/iD1r9Q", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/3Lj5Rg", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + } + ] +} +2026-01-27 23:19:56,698:DEBUG:acme.client:Storing nonce: F4vGLPjlk4IcPD7MvE-CBZLLPpP2q_gZCUoLLvPftv412OAMCeo +2026-01-27 23:19:56,699:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ', 'status': 'pending', 'token': 'KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w'} +2026-01-27 23:19:59,700:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:19:59,704:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649788427386: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJGNHZHTFBqbGs0SWNQRDdNdkUtQ0JaTExQcFAycV9nWkNVb0xMdlBmdHY0MTJPQU1DZW8iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg4NDI3Mzg2In0", + "signature": "ePP0t4A123zNefH1oNmeVoXzDm_hZADBJIulHNXfNlrwifmPdGm8kGCMJQV4uFk0xM9T7aQHSTzZ49CMDl0h6JwVHQ0ULVIycFiTfKgbc66soP7WHZAqq9_vsq_-QQqJKathcnz_-liRTt5S4HvVNf2ZY0VU29We7xyI5AqHD1KRYcOL9lLPoC9AMR4xv1JxAEJXlrdqOCsIg5aiBytWyuNuWYMnpuXjzayQqhFERhYZD2OzVw5sHK2wjkCwgeGj7mTuNwPeeMHlf6C0uizAW1VT99xVsgE5YSfP89NKBlG-Ghvq_sNDZLdnNGWlBPMr2-sruhkkip-TBQSgBCZBzQ", + "payload": "" +} +2026-01-27 23:19:59,849:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649788427386 HTTP/1.1" 200 828 +2026-01-27 23:19:59,850:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:19:59 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: z6o3uXKg2ozdFibTBHal_gvKR92FDXipfXNPRntyGdiJDc6FLrY +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:19:23Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/iD1r9Q", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/3Lj5Rg", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + } + ] +} +2026-01-27 23:19:59,850:DEBUG:acme.client:Storing nonce: z6o3uXKg2ozdFibTBHal_gvKR92FDXipfXNPRntyGdiJDc6FLrY +2026-01-27 23:19:59,851:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ', 'status': 'pending', 'token': 'KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w'} +2026-01-27 23:20:02,852:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:20:02,856:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649788427386: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJ6Nm8zdVhLZzJvemRGaWJUQkhhbF9ndktSOTJGRFhpcGZYTlBSbnR5R2RpSkRjNkZMclkiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg4NDI3Mzg2In0", + "signature": "DFqtIsyIstfx1lJwh94eT8aR9xYmaptfbOm8mTR2exGhU8kJ8SPMP8wg5ZgN0Wd6bXIudIrFFYsuaqVBh-2W4_yCp3mYp06vmAqYyvqYzKNFunDPvgsFaKXExoea4mIkEW5qegsH_c3FqEZMlhCRc5gcZ9di-x7L9ZGkLxhgkE9NXsdAeAEdDGi1nOHiDTpWwIja16BCvi28q_dmlsBF-pmNBpDC8Pe2NICMaF06A_vJm6kj3s4yusycMl71OOWFeZBdDOQopOSs1TmoegqmAfGKNZQAkxP_k-ztB9mPeK-qi5UPpkAWRQfVIR9k-dVOh7vIiwZAA-LZMN9_NSm7Pw", + "payload": "" +} +2026-01-27 23:20:03,001:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649788427386 HTTP/1.1" 200 828 +2026-01-27 23:20:03,002:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:20:02 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: F4vGLPjlKmFAtEcUD_lmSqXB9jsKNV-LCldjrhaRwUE6q-8Cp90 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:19:23Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/3Lj5Rg", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/iD1r9Q", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + } + ] +} +2026-01-27 23:20:03,003:DEBUG:acme.client:Storing nonce: F4vGLPjlKmFAtEcUD_lmSqXB9jsKNV-LCldjrhaRwUE6q-8Cp90 +2026-01-27 23:20:03,003:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ', 'status': 'pending', 'token': 'KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w'} +2026-01-27 23:20:06,004:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:20:06,008:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649788427386: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJGNHZHTFBqbEttRkF0RWNVRF9sbVNxWEI5anNLTlYtTENsZGpyaGFSd1VFNnEtOENwOTAiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg4NDI3Mzg2In0", + "signature": "gwiozPIeUoIELN2qav2q93CdYUS6b7Vz8KLeLuLChmLj1J6-_bk9IJBfGVWxCtEAR8p7n6rEL9NA5bErZdVqueMNmbgmBqXoN-0LbmVygs-ZkladGHpb8Crvt4L2QV25AF1eXxJZMgiayOJnt7TN3c1Iz_9cPgRFrMVSqOKhugeqrmwgWyi9LpiM7P_dlc7u5pNYcSLnGGNNvGmaGj1TH531p8M4mF2Ds10P4YLrPV8DVqAgfVlqXM494Ny9hK1rP880r4FNhB870u9eCRje7laTkOpcyc1W2ta0grypOkEBEpU_UzzCfy4XkIog8i0U9kTM0azsu62NX35inZcvcA", + "payload": "" +} +2026-01-27 23:20:06,226:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649788427386 HTTP/1.1" 200 828 +2026-01-27 23:20:06,227:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:20:06 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: z6o3uXKgru0Pcty7uEVBD2gi1-FV5kJYTarG5PbKs2Qv4cmE9hQ +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:19:23Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/iD1r9Q", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/3Lj5Rg", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + } + ] +} +2026-01-27 23:20:06,227:DEBUG:acme.client:Storing nonce: z6o3uXKgru0Pcty7uEVBD2gi1-FV5kJYTarG5PbKs2Qv4cmE9hQ +2026-01-27 23:20:06,228:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ', 'status': 'pending', 'token': 'KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w'} +2026-01-27 23:20:09,229:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:20:09,233:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649788427386: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJ6Nm8zdVhLZ3J1MFBjdHk3dUVWQkQyZ2kxLUZWNWtKWVRhckc1UGJLczJRdjRjbUU5aFEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg4NDI3Mzg2In0", + "signature": "CWmKgeai52e4UBGzO25eUml2CmXM1yvyeU9Bf1PGyZMif1NDjNVyguD6H_FO393kBgIknxWEzLJClt0rt8A_9Qs8ZQy9uUPh8YzIsPztXoK4DJe5wh9Nzp3hLschgGUZg9WcWdS3D7oFRbjLa1eaiDy1RGK05t_8ypi3t8KIFk2-XnPCWgPurGFWSLsHct2pKY4JwXdn46fThN3nlrARG_QeHYMnV4sm66_uuyC9dTSfmKK9WHiGrkw0UIhg_5tn-7sNOxle80BAMyV24bDeA22akxTTFnWkfV7ZvzxeJPPwm6ZjJTvcMlfqZSdj0jQR12yGWkBHE-x6ggWcQ1JsMA", + "payload": "" +} +2026-01-27 23:20:09,379:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649788427386 HTTP/1.1" 200 828 +2026-01-27 23:20:09,380:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:20:09 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: z6o3uXKgQo2Il9Eaj8O6xn-RpLC80HjhFu7hNSrF9jlhsu4VB5o +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:19:23Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/iD1r9Q", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/3Lj5Rg", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + } + ] +} +2026-01-27 23:20:09,380:DEBUG:acme.client:Storing nonce: z6o3uXKgQo2Il9Eaj8O6xn-RpLC80HjhFu7hNSrF9jlhsu4VB5o +2026-01-27 23:20:09,380:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ', 'status': 'pending', 'token': 'KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w'} +2026-01-27 23:20:12,381:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:20:12,383:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649788427386: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJ6Nm8zdVhLZ1FvMklsOUVhajhPNnhuLVJwTEM4MEhqaEZ1N2hOU3JGOWpsaHN1NFZCNW8iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg4NDI3Mzg2In0", + "signature": "MCpoimDKnKOSPt9z9coliWNz7H3Vu-KJ68VWQpNppN71nv4Mvz9PN1CU_82qi8L_eE9H1YjDC0GsZ7Kyk2ysW-GS2_HdCciLmKuq1lguchC_FHsq1DfQsvZuAIEXtoLlftGeCf2SliiAkHwriu6kuBpqONc3ly9tlBHBB8UGFUflVgg4rajLIDTtxx0KlYDXnluDSO9UGamcmtUj4t6pcBmfCDu5iZG2cLtrgM0ewPPFnXcT4nDSy4ozLttZH2z_ABq_oAJYEKKQd5D2LOe2kZUMMoLQtIFfR-4Tnq4_3J5IcmrDbxK3VtEYdk-oYrb2XMLJXpYt86gmKylN7JNDNg", + "payload": "" +} +2026-01-27 23:20:12,527:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649788427386 HTTP/1.1" 200 828 +2026-01-27 23:20:12,528:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:20:12 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: z6o3uXKggbjvx5OpKnTQfIs_DJ3x5wQ_QH3Jxrb464zV_Y8Gae4 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:19:23Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/3Lj5Rg", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/iD1r9Q", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + } + ] +} +2026-01-27 23:20:12,529:DEBUG:acme.client:Storing nonce: z6o3uXKggbjvx5OpKnTQfIs_DJ3x5wQ_QH3Jxrb464zV_Y8Gae4 +2026-01-27 23:20:12,529:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ', 'status': 'pending', 'token': 'KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w'} +2026-01-27 23:20:15,530:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:20:15,534:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649788427386: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJ6Nm8zdVhLZ2dianZ4NU9wS25UUWZJc19ESjN4NXdRX1FIM0p4cmI0NjR6Vl9ZOEdhZTQiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg4NDI3Mzg2In0", + "signature": "k83lPDfPCFWVo4eHK8qRp6jIdPYcl9BfgfhOzeHSa_iB1LEaXrYHlZJvj-zgZoSqPuAyCwVgM0rbTdcdi40ta1cvhgJ34SW4ZyAwgFnv0b8VNelCtf5gIKUv4QnkU6RymBcV8k-sGWY2pDuVdAUSChvCvEEvvFrdtb1LH1xuks28ahsEBsZ99cStqsGbep-9_Pt1yH4rNGbjji3btgQUDQnY3hqnM8qoRE9A1Qn-jsxbWwofYsDJYG2CshWUuC5z8bdH708JBJfA_K-NpQu1iwmxuViK_UPzOLUtiX8koXdCtqCBWrJ6et0fPcCjhDdej2G6_ThtOM-7t8d9ru0wbA", + "payload": "" +} +2026-01-27 23:20:15,678:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649788427386 HTTP/1.1" 200 828 +2026-01-27 23:20:15,679:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:20:15 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: z6o3uXKgxYw3sI93rhD2AcoRBINr30dPgoIiyJ7AsuHMOC1Iz-g +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:19:23Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/3Lj5Rg", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/iD1r9Q", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + } + ] +} +2026-01-27 23:20:15,679:DEBUG:acme.client:Storing nonce: z6o3uXKgxYw3sI93rhD2AcoRBINr30dPgoIiyJ7AsuHMOC1Iz-g +2026-01-27 23:20:15,680:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ', 'status': 'pending', 'token': 'KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w'} +2026-01-27 23:20:18,681:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:20:18,685:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649788427386: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJ6Nm8zdVhLZ3hZdzNzSTkzcmhEMkFjb1JCSU5yMzBkUGdvSWl5SjdBc3VITU9DMUl6LWciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg4NDI3Mzg2In0", + "signature": "hQ1ygHen_0bKyKC6LQdwqh2IVhkYfcuHsdYyB87aRmnAgannfvIisRbR2-TLVxDwA7nkQgJ2I6VI7Img-2reZ_M9B3MLvErQsbVwvBfcOxfMKuFrxje22D0LbB6EvMRE-yyt_jH8Zp1KhfK0g1TiLKcSH6ZPuWF1phrqzdGeaz-0E7nPjh8s3EPvr2nr_psefhcLcib4uTuOS27vxMR5-iEGrYNxukzOHy4bFkR3hH6DmqhokM76i-PdclODbVauycGMjFNtbFwZV3jvlzKrZMlS0iuvReNzzAbi0FWBqJL9Z86JkjORJaOOPb1xw1ipmDQbcdJDBVsRm6njayJLPw", + "payload": "" +} +2026-01-27 23:20:18,830:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649788427386 HTTP/1.1" 200 828 +2026-01-27 23:20:18,831:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:20:18 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: F4vGLPjlBt9iYqaBT90I1Ryvg9Jw7bW19klSG0kTWnc7mJKhzI4 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:19:23Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/iD1r9Q", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/3Lj5Rg", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + } + ] +} +2026-01-27 23:20:18,832:DEBUG:acme.client:Storing nonce: F4vGLPjlBt9iYqaBT90I1Ryvg9Jw7bW19klSG0kTWnc7mJKhzI4 +2026-01-27 23:20:18,832:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ', 'status': 'pending', 'token': 'KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w'} +2026-01-27 23:20:21,833:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:20:21,837:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649788427386: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJGNHZHTFBqbEJ0OWlZcWFCVDkwSTFSeXZnOUp3N2JXMTlrbFNHMGtUV25jN21KS2h6STQiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg4NDI3Mzg2In0", + "signature": "h75qoSJQBd3HRKU2GedWtgumK_l5JP2uChPtdyHKaQqpnqdLpJt7-8bDvagfIVzUQxVPxCQu6vc_nW1AHRkWhM2XPRf6WAT2eDha_3fVB2TS1TKtYr8JsefhGjNjD8I3aEGXeYoI8CXvDbed-Axp2f5GIePf-gL3zqqv7VCBUVd97G8AtKf9bdie9V4-CFTtBBFms723He2uqkF4h6YUPM7lLDsBEvZ3RtdUdbjWct_V1r18ouOMUHg3tM2SbeqTcJFN4V4JnIw7ceJaGKIFPbatvKcoTWNofONmAopwvzbi5l_sDaRd3Rl7hytWR36UFuiqiRSqxuLQwP_F39ItfA", + "payload": "" +} +2026-01-27 23:20:21,983:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649788427386 HTTP/1.1" 200 828 +2026-01-27 23:20:21,983:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:20:21 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: z6o3uXKgy4fY4n4JtKnOwfSbjPota3t2ByKsfFFWVuBqy9j4OeQ +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:19:23Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/iD1r9Q", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/3Lj5Rg", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + } + ] +} +2026-01-27 23:20:21,984:DEBUG:acme.client:Storing nonce: z6o3uXKgy4fY4n4JtKnOwfSbjPota3t2ByKsfFFWVuBqy9j4OeQ +2026-01-27 23:20:21,984:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ', 'status': 'pending', 'token': 'KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w'} +2026-01-27 23:20:24,986:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:20:24,989:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649788427386: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJ6Nm8zdVhLZ3k0Zlk0bjRKdEtuT3dmU2JqUG90YTN0MkJ5S3NmRkZXVnVCcXk5ajRPZVEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg4NDI3Mzg2In0", + "signature": "TK8mnIrcvl70Ebc4NQKjQ58ommmwoxvvWbMiyfssfg-F88XDQRu5MvcVXxNsVIuxwyGCrq02licFJVOe_e9iTku4sPfUa04CcXwr61-xXduw7rLHQkeA1RhfCXOBMjnaRvX92jEQh-0BP6nieK0WoBcF39RyBaOeagDkPSXsphca42wBXgn79eUmmwVyzVwBUS7WpEEzwpIvD86QsY4_UdFd7_ATdx7HNns_YDlOVKyuf953jc0tI1y9BxA8cNfFYr0IzmK-LlaFdSDHzML2gJVP9TcHPrKt1338Jty7iemz33NOBzbhnqIi-rWcC6mcMfO-9LkD7-z8SR6J0QMxWw", + "payload": "" +} +2026-01-27 23:20:25,135:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649788427386 HTTP/1.1" 200 828 +2026-01-27 23:20:25,136:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:20:25 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: z6o3uXKgO13h_j4f0_V6oOCBt5kyYKMGNEYg6KTa-FH23XRPiR0 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "pending", + "expires": "2026-02-03T23:19:23Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/iD1r9Q", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/3Lj5Rg", + "status": "pending", + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w" + } + ] +} +2026-01-27 23:20:25,136:DEBUG:acme.client:Storing nonce: z6o3uXKgO13h_j4f0_V6oOCBt5kyYKMGNEYg6KTa-FH23XRPiR0 +2026-01-27 23:20:25,137:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/PanWfQ', 'status': 'pending', 'token': 'KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w'} +2026-01-27 23:20:28,138:DEBUG:acme.client:JWS payload: +b'' +2026-01-27 23:20:28,140:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/649788427386: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJ6Nm8zdVhLZ08xM2hfajRmMF9WNm9PQ0J0NWt5WUtNR05FWWc2S1RhLUZIMjNYUlBpUjAiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ5Nzg4NDI3Mzg2In0", + "signature": "RTEAQhAZK7FUO3erwe4fYiu3Lc83Vj7bSmevhE3_wXzthku_gK-SAzJBXkR8vzShoL0ljjMK_j5BosDEqnh3Jb1bGloQ299fvMU5uRHVaTZsIwxs109I2snJk3s25cqyT64TJ_gg7qDyjl-mDopybwQo67scD2txdiKXhcIFmP9nywMnW4ROK4xg5hA2uxiWYGjfUm2j09WF5nSKDx6DzoY5MSL_SPQl35UjzDiHOccaxfZ4GkGhd4jrgQ4M47G_7h9IWlcToTcwAii3-AV5C785L48-ctiQAa5lhthUMCGxVy7XHqjz2rT6TkrKFlYwaV51EHCOy_fL9Q0DGbJDiw", + "payload": "" +} +2026-01-27 23:20:28,285:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/649788427386 HTTP/1.1" 200 1051 +2026-01-27 23:20:28,286:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 27 Jan 2026 23:20:28 GMT +Content-Type: application/json +Content-Length: 1051 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: F4vGLPjloa-4B71IcYqgix_Y9UYf8WT8Hs6ARinMwsHillgBx8w +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "terminal.profibot.hu" + }, + "status": "invalid", + "expires": "2026-02-03T23:19:23Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/649788427386/3Lj5Rg", + "status": "invalid", + "validated": "2026-01-27T23:19:23Z", + "error": { + "type": "urn:ietf:params:acme:error:dns", + "detail": "During secondary validation: While processing CAA for terminal.profibot.hu: DNS problem: query timed out looking up CAA for terminal.profibot.hu", + "status": 400 + }, + "token": "KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w", + "validationRecord": [ + { + "url": "http://terminal.profibot.hu/.well-known/acme-challenge/KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w", + "hostname": "terminal.profibot.hu", + "port": "80", + "addressesResolved": [ + "91.82.215.191" + ], + "addressUsed": "91.82.215.191" + } + ] + } + ] +} +2026-01-27 23:20:28,287:DEBUG:acme.client:Storing nonce: F4vGLPjloa-4B71IcYqgix_Y9UYf8WT8Hs6ARinMwsHillgBx8w +2026-01-27 23:20:28,288:INFO:certbot._internal.auth_handler:Challenge failed for domain terminal.profibot.hu +2026-01-27 23:20:28,288:INFO:certbot._internal.auth_handler:http-01 challenge for terminal.profibot.hu +2026-01-27 23:20:28,288:DEBUG:certbot._internal.display.obj:Notifying user: +Certbot failed to authenticate some domains (authenticator: webroot). The Certificate Authority reported these problems: + Domain: terminal.profibot.hu + Type: dns + Detail: During secondary validation: While processing CAA for terminal.profibot.hu: DNS problem: query timed out looking up CAA for terminal.profibot.hu + +Hint: The Certificate Authority failed to download the temporary challenge files created by Certbot. Ensure that the listed domains serve their content from the provided --webroot-path/-w and that files created there can be downloaded from the internet. + +2026-01-27 23:20:28,297:DEBUG:certbot._internal.error_handler:Encountered exception: +Traceback (most recent call last): + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/auth_handler.py", line 104, in handle_authorizations + self._poll_authorizations(authzrs, max_retries, max_time_mins, best_effort) + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/auth_handler.py", line 208, in _poll_authorizations + raise errors.AuthorizationError('Some challenges have failed.') +certbot.errors.AuthorizationError: Some challenges have failed. + +2026-01-27 23:20:28,298:DEBUG:certbot._internal.error_handler:Calling registered functions +2026-01-27 23:20:28,298:INFO:certbot._internal.auth_handler:Cleaning up challenges +2026-01-27 23:20:28,298:DEBUG:certbot._internal.plugins.webroot:Removing /data/letsencrypt-acme-challenge/.well-known/acme-challenge/KtolfhWy2aolVMc69aYbXPzY2EU6gtQx8-uvkiejZ5w +2026-01-27 23:20:28,299:DEBUG:certbot._internal.plugins.webroot:All challenges cleaned up +2026-01-27 23:20:28,300:DEBUG:certbot._internal.log:Exiting abnormally: +Traceback (most recent call last): + File "/opt/certbot/bin/certbot", line 7, in + sys.exit(main()) + ^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/main.py", line 18, in main + return internal_main.main(cli_args) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 1850, in main + return config.func(config, plugins) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 1562, in certonly + lineage = _get_and_save_cert(le_client, config, domains, certname, lineage) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 141, in _get_and_save_cert + lineage = le_client.obtain_and_enroll_certificate(domains, certname) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 526, in obtain_and_enroll_certificate + cert, chain, key, _ = self.obtain_certificate(domains) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 427, in obtain_certificate + orderr = self._get_order_and_authorizations(csr.data, self.config.allow_subset_of_names) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 505, in _get_order_and_authorizations + authzr = self.auth_handler.handle_authorizations(orderr, self.config, best_effort) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/auth_handler.py", line 104, in handle_authorizations + self._poll_authorizations(authzrs, max_retries, max_time_mins, best_effort) + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/auth_handler.py", line 208, in _poll_authorizations + raise errors.AuthorizationError('Some challenges have failed.') +certbot.errors.AuthorizationError: Some challenges have failed. +2026-01-27 23:20:28,307:ERROR:certbot._internal.log:Some challenges have failed. diff --git a/proxy-manager/data/logs/letsencrypt.log.3 b/proxy-manager/data/logs/letsencrypt.log.3 new file mode 100755 index 0000000..6cad131 --- /dev/null +++ b/proxy-manager/data/logs/letsencrypt.log.3 @@ -0,0 +1,1509 @@ +2026-01-20 19:14:20,271:DEBUG:certbot._internal.main:certbot version: 5.1.0 +2026-01-20 19:14:20,271:DEBUG:certbot._internal.main:Location of certbot entry point: /opt/certbot/bin/certbot +2026-01-20 19:14:20,271:DEBUG:certbot._internal.main:Arguments: ['--config', '/etc/letsencrypt.ini', '--work-dir', '/tmp/letsencrypt-lib', '--logs-dir', '/data/logs', '--cert-name', 'npm-16', '--agree-tos', '--authenticator', 'webroot', '-m', 'kincses@gmail.com', '--preferred-challenges', 'http', '--domains', 'app.profibot.hu'] +2026-01-20 19:14:20,271:DEBUG:certbot._internal.main:Discovered plugins: PluginsRegistry(PluginEntryPoint#manual,PluginEntryPoint#null,PluginEntryPoint#standalone,PluginEntryPoint#webroot) +2026-01-20 19:14:20,282:DEBUG:certbot._internal.log:Root logging level set at 30 +2026-01-20 19:14:20,282:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2026-01-20 19:14:20,282:DEBUG:certbot._internal.plugins.selection:Single candidate plugin: * webroot +Description: Saves the necessary validation files to a .well-known/acme-challenge/ directory within the nominated webroot path. A separate HTTP server must be running and serving files from the webroot path. HTTP challenge only (wildcards not supported). +Interfaces: Authenticator, Plugin +Entry point: EntryPoint(name='webroot', value='certbot._internal.plugins.webroot:Authenticator', group='certbot.plugins') +Initialized: +Prep: True +2026-01-20 19:14:20,282:DEBUG:certbot._internal.plugins.selection:Selected authenticator and installer None +2026-01-20 19:14:20,283:INFO:certbot._internal.plugins.selection:Plugins selected: Authenticator webroot, Installer None +2026-01-20 19:14:20,320:DEBUG:certbot._internal.main:Picked account: +2026-01-20 19:14:20,320:DEBUG:acme.client:Sending GET request to https://acme-v02.api.letsencrypt.org/directory. +2026-01-20 19:14:20,321:DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org:443 +2026-01-20 19:14:20,792:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "GET /directory HTTP/1.1" 200 1033 +2026-01-20 19:14:20,793:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:14:20 GMT +Content-Type: application/json +Content-Length: 1033 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "_z9Dwg6jJH0": "https://community.letsencrypt.org/t/adding-random-entries-to-the-directory/33417", + "keyChange": "https://acme-v02.api.letsencrypt.org/acme/key-change", + "meta": { + "caaIdentities": [ + "letsencrypt.org" + ], + "profiles": { + "classic": "https://letsencrypt.org/docs/profiles#classic", + "shortlived": "https://letsencrypt.org/docs/profiles#shortlived", + "tlsclient": "https://letsencrypt.org/docs/profiles#tlsclient", + "tlsserver": "https://letsencrypt.org/docs/profiles#tlsserver" + }, + "termsOfService": "https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf", + "website": "https://letsencrypt.org" + }, + "newAccount": "https://acme-v02.api.letsencrypt.org/acme/new-acct", + "newNonce": "https://acme-v02.api.letsencrypt.org/acme/new-nonce", + "newOrder": "https://acme-v02.api.letsencrypt.org/acme/new-order", + "renewalInfo": "https://acme-v02.api.letsencrypt.org/acme/renewal-info", + "revokeCert": "https://acme-v02.api.letsencrypt.org/acme/revoke-cert" +} +2026-01-20 19:14:20,794:DEBUG:certbot._internal.display.obj:Notifying user: Requesting a certificate for app.profibot.hu +2026-01-20 19:14:20,800:DEBUG:acme.client:Requesting fresh nonce +2026-01-20 19:14:20,800:DEBUG:acme.client:Sending HEAD request to https://acme-v02.api.letsencrypt.org/acme/new-nonce. +2026-01-20 19:14:20,955:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "HEAD /acme/new-nonce HTTP/1.1" 200 0 +2026-01-20 19:14:20,956:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:14:20 GMT +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 82ktJIqYjB_Jbh6yuGkv4RjcjkOQ7JhrUyprmtZJEdGP4ft-HzE +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + + +2026-01-20 19:14:20,956:DEBUG:acme.client:Storing nonce: 82ktJIqYjB_Jbh6yuGkv4RjcjkOQ7JhrUyprmtZJEdGP4ft-HzE +2026-01-20 19:14:20,957:DEBUG:acme.client:JWS payload: +b'{\n "identifiers": [\n {\n "type": "dns",\n "value": "app.profibot.hu"\n }\n ]\n}' +2026-01-20 19:14:20,962:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/new-order: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI4Mmt0SklxWWpCX0piaDZ5dUdrdjRSamNqa09RN0poclV5cHJtdFpKRWRHUDRmdC1IekUiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL25ldy1vcmRlciJ9", + "signature": "lPEZ0pNj90ry0arKNHT4ImHmKrFBoz4dgKrl47dpxSe63Mon3OBhhmWe481oCr1wXxHMHmcz7F89hdt9RCwkzrdZ4R6zp8YweJOlDFRnerRy7_7EpTibN_2_mmYdzfLT2NmKAGiK-6nK3xMtORtzu6c0-qUcYaggJ9ne-KI-nx1ttS5TQiHaaE35CCV_ZQD5hJ6vRv02yH2s2jbK_09VPruggHk5FeMgFvLo51SntF-GppIEIDAk79Q53UkNQ2r5jiqOcjanAslIeLeVV21nSYkQP---7bXlHW9v9ExkUJWDQeSqerokXJjm0hk_QO7ok20K_0EmCQySFJsVzwXIKg", + "payload": "ewogICJpZGVudGlmaWVycyI6IFsKICAgIHsKICAgICAgInR5cGUiOiAiZG5zIiwKICAgICAgInZhbHVlIjogImFwcC5wcm9maWJvdC5odSIKICAgIH0KICBdCn0" +} +2026-01-20 19:14:21,150:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/new-order HTTP/1.1" 201 349 +2026-01-20 19:14:21,151:DEBUG:acme.client:Received response: +HTTP 201 +Server: nginx +Date: Tue, 20 Jan 2026 19:14:21 GMT +Content-Type: application/json +Content-Length: 349 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/471639170836 +Replay-Nonce: l5FKN_ymiVWUKCJdU2YsOh6Boure2eZelgxd3Ur4prmJgfkGe68 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "pending", + "expires": "2026-01-27T19:14:21Z", + "identifiers": [ + { + "type": "dns", + "value": "app.profibot.hu" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/646154860406" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/471639170836" +} +2026-01-20 19:14:21,151:DEBUG:acme.client:Storing nonce: l5FKN_ymiVWUKCJdU2YsOh6Boure2eZelgxd3Ur4prmJgfkGe68 +2026-01-20 19:14:21,152:DEBUG:acme.client:JWS payload: +b'' +2026-01-20 19:14:21,155:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/646154860406: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJsNUZLTl95bWlWV1VLQ0pkVTJZc09oNkJvdXJlMmVaZWxneGQzVXI0cHJtSmdma0dlNjgiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ2MTU0ODYwNDA2In0", + "signature": "N807uyCcOWm_2u93qHf3sPQGJs6zSGrMR3DkUVYBYR0_YpTRbt6ovsixi62LA3WUjpgzunI370BQRQuyuftJDAG864BZ5yhHiLwiqV1PHFYBQUogUXadrB-R0qwiM64f8eLKUvWZVraAj8177Ita_lTTRXZ05fGGhz3mJmK4saFJQiwaCrvCccyCQvkN77H3SUXvRI22oiDhTMsdORoLD63rfoCfkFdk56K4mvbq1zdxHIz0sGKEKJxT11fye5iesTIuCljuVGI6Of-3MXxRV-d80mFWlnbumQGDClUeFzfayet1NxP_TAmElaPyjJZK6HUqeLFNpuRxyTOsVMfI2A", + "payload": "" +} +2026-01-20 19:14:21,313:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/646154860406 HTTP/1.1" 200 823 +2026-01-20 19:14:21,314:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:14:21 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 82ktJIqYtAs7qqknUsIMLeNZXlsSqMjuROP5O6giJQf_7nmgu68 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "app.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-27T19:14:21Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/58N6GA", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/F6m4Kw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + } + ] +} +2026-01-20 19:14:21,315:DEBUG:acme.client:Storing nonce: 82ktJIqYtAs7qqknUsIMLeNZXlsSqMjuROP5O6giJQf_7nmgu68 +2026-01-20 19:14:21,315:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw', 'status': 'pending', 'token': 'fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4'} +2026-01-20 19:14:21,316:INFO:certbot._internal.auth_handler:Performing the following challenges: +2026-01-20 19:14:21,316:INFO:certbot._internal.auth_handler:http-01 challenge for app.profibot.hu +2026-01-20 19:14:21,317:INFO:certbot._internal.plugins.webroot:Using the webroot path /data/letsencrypt-acme-challenge for all unmatched domains. +2026-01-20 19:14:21,317:DEBUG:certbot._internal.plugins.webroot:Creating root challenges validation dir at /data/letsencrypt-acme-challenge/.well-known/acme-challenge +2026-01-20 19:14:21,319:DEBUG:certbot._internal.plugins.webroot:Attempting to save validation to /data/letsencrypt-acme-challenge/.well-known/acme-challenge/fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4 +2026-01-20 19:14:21,319:DEBUG:acme.client:JWS payload: +b'{}' +2026-01-20 19:14:21,320:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/F6m4Kw: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI4Mmt0SklxWXRBczdxcWtuVXNJTUxlTlpYbHNTcU1qdVJPUDVPNmdpSlFmXzdubWd1NjgiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NoYWxsLzI5MDY0MzgxNzYvNjQ2MTU0ODYwNDA2L0Y2bTRLdyJ9", + "signature": "Ggfen2VTwEYTBv-cZiOvfxr9uj6h8e3wrdYGSkkoOyLezAYVILJSuUgG94PuFT2KnW_AqOYyfZx2ylKsxgDk8s5m6vV82lzhDTAUuMnz_y1kjhEB7r1aKkWY1Klgz5w9wsXqaH-y2_H065BNqC_kqiiSJ-_iYkg8k37VhlyzkOw0USZ-87BW1_dMgxUG6P2EaZQZSo0Gtxu9YVhR9nZ1Y__3uCQojnj1gH6SHGeXZbwhaDD4zfb_mi4O7alFKgQJXkkqIcaACWuEI-MiD4lTwAX7DR50wAreGO0bxfIiocptUtaKymFl9sD_wmc7QqRGxYI-oZUDrmCarlHAp2CbUw", + "payload": "e30" +} +2026-01-20 19:14:21,488:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/chall/2906438176/646154860406/F6m4Kw HTTP/1.1" 200 195 +2026-01-20 19:14:21,489:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:14:21 GMT +Content-Type: application/json +Content-Length: 195 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="up" +Location: https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/F6m4Kw +Replay-Nonce: 82ktJIqYDS2lBdKyIbD-0XQheavLC0jAxudGJHtQqth1T3t8cuw +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/F6m4Kw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" +} +2026-01-20 19:14:21,489:DEBUG:acme.client:Storing nonce: 82ktJIqYDS2lBdKyIbD-0XQheavLC0jAxudGJHtQqth1T3t8cuw +2026-01-20 19:14:21,489:INFO:certbot._internal.auth_handler:Waiting for verification... +2026-01-20 19:14:22,490:DEBUG:acme.client:JWS payload: +b'' +2026-01-20 19:14:22,494:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/646154860406: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI4Mmt0SklxWURTMmxCZEt5SWJELTBYUWhlYXZMQzBqQXh1ZEdKSHRRcXRoMVQzdDhjdXciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ2MTU0ODYwNDA2In0", + "signature": "jjUwIbgpGG_La30B0DTE_WxjDkmIWI_USJSgWxbR0_BEhnIUZCJSbwp9dYPJLZfEbdTren1B6sc3feiaYjBYcpFhCbSL7YkZSfGy-yFX2fJQnFfzlk_QCsI4a99Q0J7WWUnsEAo2nbyCPhanVft1LSrPXK7BlFBYnWVJHEUvmP_mjCqGRAjVMZ3qFIfGwyizd4o6LaM5N9T3f9-4n98NgdNG01TzuJ8BMpJi414BJgArgIbs3iFOhScXEKDsiSdKJ95ancyctlk454p_7AYbSn1KcA522W4SGwuhwHtDihMjBXcjhqyFFZrWrbW9YOB1WWnlsYrF3ftuE0sFu1Y2mQ", + "payload": "" +} +2026-01-20 19:14:22,650:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/646154860406 HTTP/1.1" 200 823 +2026-01-20 19:14:22,650:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:14:22 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 82ktJIqYYZma0ryRRuersndhd0zRPnBzVWMhviD0macQubUTlxU +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "app.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-27T19:14:21Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/F6m4Kw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/58N6GA", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + } + ] +} +2026-01-20 19:14:22,651:DEBUG:acme.client:Storing nonce: 82ktJIqYYZma0ryRRuersndhd0zRPnBzVWMhviD0macQubUTlxU +2026-01-20 19:14:22,651:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw', 'status': 'pending', 'token': 'fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4'} +2026-01-20 19:14:25,652:DEBUG:acme.client:JWS payload: +b'' +2026-01-20 19:14:25,655:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/646154860406: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI4Mmt0SklxWVlabWEwcnlSUnVlcnNuZGhkMHpSUG5CelZXTWh2aUQwbWFjUXViVVRseFUiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ2MTU0ODYwNDA2In0", + "signature": "X6BrBFWDK_xQuwQ-dh49HbBT90FiXVWw8yeu7HIRMKsMthxp8ohrEk9Zuite38mcdHJF1vCCSp8Orc9MH4Ue0vPEBsOHW6XWvqwlme_2FfTppPNerwW55u_X84VsLXlUhkII3ovXbTD_g9JJUp7APml0_enksslg18T5eH00mPuUyUiBvZO3C-EAhv7EQ_-uvVhF32KNtMDEWDlaRHdq3j0ZD3Doof9jkNDIqQy9y5SIilgU9CdeL5SMM8ykEflzQepiuw14WeyLmavpOVSkwKDcUUJ-ZXrkDHcLiI8hgdAptrOZjDd3o7vgCGoKVxci6dKjNJss1ptFkLhGxHQRKQ", + "payload": "" +} +2026-01-20 19:14:25,811:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/646154860406 HTTP/1.1" 200 823 +2026-01-20 19:14:25,812:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:14:25 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: l5FKN_ymjVchkE0_JLnJpdMbdAPhS2S7fMdGzr7jjXdveLD5haA +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "app.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-27T19:14:21Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/58N6GA", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/F6m4Kw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + } + ] +} +2026-01-20 19:14:25,813:DEBUG:acme.client:Storing nonce: l5FKN_ymjVchkE0_JLnJpdMbdAPhS2S7fMdGzr7jjXdveLD5haA +2026-01-20 19:14:25,813:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw', 'status': 'pending', 'token': 'fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4'} +2026-01-20 19:14:28,815:DEBUG:acme.client:JWS payload: +b'' +2026-01-20 19:14:28,819:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/646154860406: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJsNUZLTl95bWpWY2hrRTBfSkxuSnBkTWJkQVBoUzJTN2ZNZEd6cjdqalhkdmVMRDVoYUEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ2MTU0ODYwNDA2In0", + "signature": "QcG0PBOjZeXZv2ji0VroN9-1RmhcDs95u-ceD6KFiMPGz8Lsrff-6AETMzlkRpGZwo7rDki0_aDgkFoVbCHnHGd5Tdyy_70FhGQlDVZwoIv0HlqoWwYblKjrJ9byIEg6hqgLpPNJ37cJBpGYkn0SdOIch-slaxUus6MTvFWTiBSSbSy7FkvTp3V_MW8MUatQewKoWcVSoGk5TyZ8u3G6UVD_MyWdXFJyRjj8Jywxt2GdwO2hjQiBNihEZqLsfiy5gn3MnW3r5sFmVGHgwXsF6VQ5vuKQgo8YpQj-5lZ-6xXIMzB-Q4i6wzhtk8d8WtceYloT4AyvZDMLAeldm6kAZg", + "payload": "" +} +2026-01-20 19:14:28,975:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/646154860406 HTTP/1.1" 200 823 +2026-01-20 19:14:28,976:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:14:28 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: l5FKN_ymnuVSJM7JGfNcCuOVONt7MpNc6C3KAD-fZBDBOStLXVs +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "app.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-27T19:14:21Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/58N6GA", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/F6m4Kw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + } + ] +} +2026-01-20 19:14:28,977:DEBUG:acme.client:Storing nonce: l5FKN_ymnuVSJM7JGfNcCuOVONt7MpNc6C3KAD-fZBDBOStLXVs +2026-01-20 19:14:28,977:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw', 'status': 'pending', 'token': 'fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4'} +2026-01-20 19:14:31,978:DEBUG:acme.client:JWS payload: +b'' +2026-01-20 19:14:31,982:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/646154860406: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJsNUZLTl95bW51VlNKTTdKR2ZOY0N1T1ZPTnQ3TXBOYzZDM0tBRC1mWkJEQk9TdExYVnMiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ2MTU0ODYwNDA2In0", + "signature": "h7N47vG1R8VyJWgQPgnWEAnahrQnlaIwxYdaJ0vbuXY5AnFnGuQi_DkpvmxSG7CwTR8sBelrTlZRRfUQlKsC6IvEIVxuqKAPIQxu4HGC271yljtS-fFr8ciQLWa1-GcvaMjoNZWp_eVgVNBIOWTNRS0UBiS8gB8uHZkVzrAwEHOovsH3YLvN7pYqO6BmGdLZLjk1bBZdJo8ShWKvIHBHiLrp4e8Sz38HBUV08nQ2DSPHg4VFeHGD-ypa-5tiXDvWGQs54o5i3yvSj8Y28IVSNC1hbQoGq99d5ogOT2vsHG4zz0ul8m8bcOcmQwAMXKsPCcmhqBcNk6JU3BloCb8kmg", + "payload": "" +} +2026-01-20 19:14:32,137:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/646154860406 HTTP/1.1" 200 823 +2026-01-20 19:14:32,138:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:14:32 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 82ktJIqYHTXyEDfwxHZIaPW3FcMzsQUqLYHaPLw5eNbZsMT12qw +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "app.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-27T19:14:21Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/58N6GA", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/F6m4Kw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + } + ] +} +2026-01-20 19:14:32,139:DEBUG:acme.client:Storing nonce: 82ktJIqYHTXyEDfwxHZIaPW3FcMzsQUqLYHaPLw5eNbZsMT12qw +2026-01-20 19:14:32,139:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw', 'status': 'pending', 'token': 'fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4'} +2026-01-20 19:14:35,140:DEBUG:acme.client:JWS payload: +b'' +2026-01-20 19:14:35,144:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/646154860406: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI4Mmt0SklxWUhUWHlFRGZ3eEhaSWFQVzNGY016c1FVcUxZSGFQTHc1ZU5iWnNNVDEycXciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ2MTU0ODYwNDA2In0", + "signature": "IwDO8jcNl_pKRovEko0_w-bggjTQ301uW7-fFBqIpB5dSE5F8gZN_1H276Npja488HOgYzCFlF6364FEpzPC4lJZFk6UeuzFJIKmXg-nZDxJUyFSSFtLKzse9Qrz_5Q4FYOpL6gdhNFh6zXkYNyNcX_qZi5Q2HuuI855YcX4nf4TlCbj1t1mp2Mm35TUlmGxbFHJu91jWYymsYi1boE3buwXG0Vq4XNOzNq1deR4FGX1Cz4vdB-hB-aHGUcVZ1rqjwmQE-jMhEpYHzjo2zQsXcDw2n-kwElL295E0Paotbe7slwrrHUe6ptl8VUn63-AlCXEMgjGMX2fw2pKKwXq4A", + "payload": "" +} +2026-01-20 19:14:35,300:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/646154860406 HTTP/1.1" 200 823 +2026-01-20 19:14:35,301:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:14:35 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 82ktJIqYOKQmf5Pq8dXx5g6BJ772YTEIfKnAt1eDVt4Zq1gbbEc +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "app.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-27T19:14:21Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/58N6GA", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/F6m4Kw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + } + ] +} +2026-01-20 19:14:35,301:DEBUG:acme.client:Storing nonce: 82ktJIqYOKQmf5Pq8dXx5g6BJ772YTEIfKnAt1eDVt4Zq1gbbEc +2026-01-20 19:14:35,301:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw', 'status': 'pending', 'token': 'fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4'} +2026-01-20 19:14:38,303:DEBUG:acme.client:JWS payload: +b'' +2026-01-20 19:14:38,306:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/646154860406: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI4Mmt0SklxWU9LUW1mNVBxOGRYeDVnNkJKNzcyWVRFSWZLbkF0MWVEVnQ0WnExZ2JiRWMiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ2MTU0ODYwNDA2In0", + "signature": "JX4YgtHUWcB9NBMaXPEnDw6juD4-4MybH9Tiy-tUs5E1sE10e4AwblfQe-x59IDy7cTnFOXoBgD1xxbxS4DcPGLQQZI1rtlBO1LzEo1dnSE2Yp5d4jqCe7AA6_c3O3juqqKuI9MDp8NN3oYGjodElkOTmJAZry4MTqI1UFZpsUZEIajk8JkvA4rz18FNaF6nFnUv1oJerXvh-93WTjpu5ScGuCK_PGI6Zg0yg1wxuZ6Ao5uVr2OUDkG8fgXIqhpJ0VrZPSvzpGGfjd3PZBZ6B49XuKuKuKPLTOYxPGS_Awm816pnNsu6rPUGBNXzYl1G0ctEPV-KvWgoT9JlPuxAGw", + "payload": "" +} +2026-01-20 19:14:38,462:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/646154860406 HTTP/1.1" 200 823 +2026-01-20 19:14:38,463:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:14:38 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: l5FKN_ymxHQhBJvoU32e_MPC4uoseGepktPiH1RKfHmWFdNQHfw +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "app.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-27T19:14:21Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/58N6GA", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/F6m4Kw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + } + ] +} +2026-01-20 19:14:38,464:DEBUG:acme.client:Storing nonce: l5FKN_ymxHQhBJvoU32e_MPC4uoseGepktPiH1RKfHmWFdNQHfw +2026-01-20 19:14:38,464:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw', 'status': 'pending', 'token': 'fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4'} +2026-01-20 19:14:41,465:DEBUG:acme.client:JWS payload: +b'' +2026-01-20 19:14:41,469:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/646154860406: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJsNUZLTl95bXhIUWhCSnZvVTMyZV9NUEM0dW9zZUdlcGt0UGlIMVJLZkhtV0ZkTlFIZnciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ2MTU0ODYwNDA2In0", + "signature": "JUgN0NlI-n_eWhpX8sZX9QWipBzKnD6VjCcDrwQWEV6eFiaw3otlgEQMQ5_pEbUJCfso7y4DPQlPgAVv4TkbCjSH1paWD4-3QnmnDL-4eJmxEAQr7mQZ2a85-JQigrI0ZN9SS28iTBxzgD8Lj0P4VPMJvjlxqcfleZ4Zr39L24hPolRuKFH3Q9u5OnJeM7YZus_xACCUHcLZYschX2vCaW4NqOBHqHgXe4UubU1jWfh9q_RdZ-saCYcdGyHSbpQL3mLMkRknPljho3pmKYvz_Lt6sDJWZ38PEbVLwzYHc88EycDClViM_rV0KkQVfcL2EC6T33hq4fADIvoDKVLpUw", + "payload": "" +} +2026-01-20 19:14:41,627:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/646154860406 HTTP/1.1" 200 823 +2026-01-20 19:14:41,628:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:14:41 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: l5FKN_ymBHTKlFoH3l--jkweBmzWjlG9txDYX_PtpLTavbI4e2k +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "app.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-27T19:14:21Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/58N6GA", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/F6m4Kw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + } + ] +} +2026-01-20 19:14:41,628:DEBUG:acme.client:Storing nonce: l5FKN_ymBHTKlFoH3l--jkweBmzWjlG9txDYX_PtpLTavbI4e2k +2026-01-20 19:14:41,629:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw', 'status': 'pending', 'token': 'fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4'} +2026-01-20 19:14:44,630:DEBUG:acme.client:JWS payload: +b'' +2026-01-20 19:14:44,632:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/646154860406: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJsNUZLTl95bUJIVEtsRm9IM2wtLWprd2VCbXpXamxHOXR4RFlYX1B0cExUYXZiSTRlMmsiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ2MTU0ODYwNDA2In0", + "signature": "HoEmTS0AdOgDTh5RQHENpLOSILzwQIVNVC8j7PlOo3jWT-X_m5WwN6G81Iw36RqH2YMRyXOPogCSXaLjdrQtXap9eX_BN6-dWkDp_FcnQjkJzIcYXd3hTUY15R6Z-rkErBFnzfRdx877yTajysYzhrXzwh6Kem0YxLJPnkdZKsLNPt9P7ZPYe-oM3qHkXG557ITui_p9l38srcujY2mIyFLUEZ0RV3GiV41qtSmp-uPsStOa9Vk5v1VjjmEXrJJ7j5wQcVV7wQEGrRycgaDWYcegijs3ctbmE4B-96-rG7qhI6geWvQxlwlzD1TLW0mUAnc4RI3I7YzhjyfwlpqdZA", + "payload": "" +} +2026-01-20 19:14:44,787:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/646154860406 HTTP/1.1" 200 823 +2026-01-20 19:14:44,788:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:14:44 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 82ktJIqYLhR4ETijKbmi7a_xx1V7NR1RtcareEIXVpqraZCdn_E +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "app.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-27T19:14:21Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/F6m4Kw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/58N6GA", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + } + ] +} +2026-01-20 19:14:44,788:DEBUG:acme.client:Storing nonce: 82ktJIqYLhR4ETijKbmi7a_xx1V7NR1RtcareEIXVpqraZCdn_E +2026-01-20 19:14:44,789:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw', 'status': 'pending', 'token': 'fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4'} +2026-01-20 19:14:47,790:DEBUG:acme.client:JWS payload: +b'' +2026-01-20 19:14:47,794:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/646154860406: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI4Mmt0SklxWUxoUjRFVGlqS2JtaTdhX3h4MVY3TlIxUnRjYXJlRUlYVnBxcmFaQ2RuX0UiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ2MTU0ODYwNDA2In0", + "signature": "Qd-HdDsnSFIIaxViaKfop2kZ0zkwGo8qRSa733sq47a0WImsF8UcNICymuJw0GAVntUnLYp9B_WGNNRVFvWv3WhR44RTuvGT91j4k8anWvIIkAT2AXtuG8MWRQLPwCpkQ5xqCrcTwf00Mp6vbUJixAS15Dn0-aJPRtXOF_ybh2jCeRe4DO-tuqs9cjfrIQBRqbdfcO8uCgjadR6cqErNDMuHcevcdi2limUFuFNa9wAtiJ6QKegEQxzHaXJ8UPVb8UHHoHiUXNosPlpXK2kils8CoBTj5_v5XBTif2hzmXQc18T5zgZfbaQNPyhPOf3SDUvkTAzwx6aMh-sVTtNUew", + "payload": "" +} +2026-01-20 19:14:47,950:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/646154860406 HTTP/1.1" 200 823 +2026-01-20 19:14:47,951:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:14:47 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: l5FKN_ymiG212fdEAJWJ9MykJ5cRW3Lwb1IH4L3kV8qwDkeGag8 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "app.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-27T19:14:21Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/58N6GA", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/F6m4Kw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + } + ] +} +2026-01-20 19:14:47,951:DEBUG:acme.client:Storing nonce: l5FKN_ymiG212fdEAJWJ9MykJ5cRW3Lwb1IH4L3kV8qwDkeGag8 +2026-01-20 19:14:47,952:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw', 'status': 'pending', 'token': 'fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4'} +2026-01-20 19:14:50,953:DEBUG:acme.client:JWS payload: +b'' +2026-01-20 19:14:50,957:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/646154860406: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJsNUZLTl95bWlHMjEyZmRFQUpXSjlNeWtKNWNSVzNMd2IxSUg0TDNrVjhxd0RrZUdhZzgiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ2MTU0ODYwNDA2In0", + "signature": "GV2Luedeu2jlFpfv6ej9iVw_091SZGe80P3h0Xif9tp6ShsS_99kwdhjkodXYLsLxbLT1bQPBm9FLlgJdKlB5_qIsc4Qo6a-RoWxxauMCR9v4huFTgosGINTrbXqieEdd_XGVyICbL1fuRLQLKfk2LpqbhZdI-tnFIXf4cZPhD81IFoCM6Ot5KmR2xm4KhIM0IyrvEy8ph2K9s_d4w_yfFrh1GnLvtA-VrNszba23aXSqOTKoSicpOSGH5KNAI-a0D07vjiDo8wlTPqerRGMJKfScP5yXq6jr8yyeFWGc7pKB0D66zaXHhtkjttIQYERQA9apidm-C_ScgpNB50VNA", + "payload": "" +} +2026-01-20 19:14:51,114:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/646154860406 HTTP/1.1" 200 823 +2026-01-20 19:14:51,115:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:14:51 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: l5FKN_ymHAKCK0oFJQI5Sg_2lasIAQyIInSEVka2yL1lSZGnx6k +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "app.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-27T19:14:21Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/58N6GA", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/F6m4Kw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + } + ] +} +2026-01-20 19:14:51,115:DEBUG:acme.client:Storing nonce: l5FKN_ymHAKCK0oFJQI5Sg_2lasIAQyIInSEVka2yL1lSZGnx6k +2026-01-20 19:14:51,116:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw', 'status': 'pending', 'token': 'fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4'} +2026-01-20 19:14:54,117:DEBUG:acme.client:JWS payload: +b'' +2026-01-20 19:14:54,121:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/646154860406: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJsNUZLTl95bUhBS0NLMG9GSlFJNVNnXzJsYXNJQVF5SUluU0VWa2EyeUwxbFNaR254NmsiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ2MTU0ODYwNDA2In0", + "signature": "jr9GFN5g8CMSaHok6UKhThEZpfpnb68MtFhpc7FISzaQPviJHtJ4AkyrHBHcO4pY4gzrGe3cGtjE2v-bgisZMDrtM9Maq5IS8a-8hpM2yrLfR9ZzupOqIZ1VwgyuHcK-bJp283HtZBdEa-XzVNNk-xbcIiaBaSoWlQmJN-UbQb2zJh0CY6IyVPqT7rWsxp60voKZjBgxpe9uWmQcIvfgGgaL7YCMhN0_H12QUxYBDG-T-1T4NWgowGJ0Kk6WrJx-cuu9cIVx0lWjH2tJO2NQ1QTVEHZKSGE135KZYvv1loihxl6SboHgZziJZ16jGFxiyMoBB5QeMHkObLr7kiSafA", + "payload": "" +} +2026-01-20 19:14:54,278:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/646154860406 HTTP/1.1" 200 823 +2026-01-20 19:14:54,279:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:14:54 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 82ktJIqYUTmR7Ya9m7basL2vjOobuankEqj2Lo-L3b7H8lPiirY +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "app.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-27T19:14:21Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/F6m4Kw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/58N6GA", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + } + ] +} +2026-01-20 19:14:54,279:DEBUG:acme.client:Storing nonce: 82ktJIqYUTmR7Ya9m7basL2vjOobuankEqj2Lo-L3b7H8lPiirY +2026-01-20 19:14:54,280:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw', 'status': 'pending', 'token': 'fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4'} +2026-01-20 19:14:57,281:DEBUG:acme.client:JWS payload: +b'' +2026-01-20 19:14:57,285:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/646154860406: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI4Mmt0SklxWVVUbVI3WWE5bTdiYXNMMnZqT29idWFua0VxajJMby1MM2I3SDhsUGlpclkiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ2MTU0ODYwNDA2In0", + "signature": "iO4L5RxCQ6DHzKQ12ThfpabWVrUOAdRwKC0FQPv7jC9lZVWMFuCbwHl3Ey-RjEOKUiY7VxJkxOrHVTH8lLfTnWAOJxlJzG58spEHZT7XWscPFwBsD6M-CQq_dMARrzUzKYYGJswoAXr-F1bFg3F2Cqg6-Ce9IIMOi6GsXBuFvL3mPjnsn0hTgP8fch9KYWoAtQijGK6w8FQ6RQBPHRfARm5ewp2a9FtFzZ2Y2UBNhqkovWZ1-YYEbsDEDHn4n3wFISkAnYOQ2HfxeIi-htSZuJAz03kec2S6puA1LG1qgOeSOoAjQUTL1zE8_fyDf7-o9kgEaP8oeED6TSIJzN5Paw", + "payload": "" +} +2026-01-20 19:14:57,441:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/646154860406 HTTP/1.1" 200 823 +2026-01-20 19:14:57,442:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:14:57 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 82ktJIqY0G0EZBzN7DPREfQXjfxS0Mc-Q_2DIapJ9FKh6ke6a2U +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "app.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-27T19:14:21Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/F6m4Kw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/58N6GA", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + } + ] +} +2026-01-20 19:14:57,442:DEBUG:acme.client:Storing nonce: 82ktJIqY0G0EZBzN7DPREfQXjfxS0Mc-Q_2DIapJ9FKh6ke6a2U +2026-01-20 19:14:57,443:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw', 'status': 'pending', 'token': 'fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4'} +2026-01-20 19:15:00,444:DEBUG:acme.client:JWS payload: +b'' +2026-01-20 19:15:00,448:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/646154860406: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI4Mmt0SklxWTBHMEVaQnpON0RQUkVmUVhqZnhTME1jLVFfMkRJYXBKOUZLaDZrZTZhMlUiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ2MTU0ODYwNDA2In0", + "signature": "TqkREj6NU17T50OPPrhMHSBoe8mYEVTjLvdgV3aDurfgYBDoB9qohXeyAmLxCBORzvSmJA1kG6FWj6ThYRzneeNB9aoQ3sZ0YAu4Un1mHVTuQZDO6qZZ8JyNvDe9w-G16TSYjE-QzTWeO9cRhnYXIZyo9KHJ6Hn0Zdo7VyxW_zRx0UZyjKo_PMBeE5of6bSIxceVlCBeN0M5Vjz2dCkYq5Wf9HMoy6x9SvuOsnYMIxr8kGAJv2UqZvSSdR0SaiPQI15tJ1K2guZ-PD_nE59gZWdRiYWGjA62l5Q3ojR1-QZm7QYL4RyoJzAFmKVBq5WLGUh844dV9NnwRhA97zEY3Q", + "payload": "" +} +2026-01-20 19:15:01,058:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/646154860406 HTTP/1.1" 200 823 +2026-01-20 19:15:01,059:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:15:00 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 82ktJIqYjEU8GO9_6oSjwVx21sXtk5ECupi9btt6xZUyNJnZF8c +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "app.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-27T19:14:21Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/F6m4Kw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/58N6GA", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + } + ] +} +2026-01-20 19:15:01,060:DEBUG:acme.client:Storing nonce: 82ktJIqYjEU8GO9_6oSjwVx21sXtk5ECupi9btt6xZUyNJnZF8c +2026-01-20 19:15:01,060:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw', 'status': 'pending', 'token': 'fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4'} +2026-01-20 19:15:04,061:DEBUG:acme.client:JWS payload: +b'' +2026-01-20 19:15:04,065:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/646154860406: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI4Mmt0SklxWWpFVThHTzlfNm9TandWeDIxc1h0azVFQ3VwaTlidHQ2eFpVeU5KblpGOGMiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ2MTU0ODYwNDA2In0", + "signature": "OEjb1GajoS6ntZLHnjeL7ili09ibmA0bUnW8MIHga1qCDkkbrSDdS7D96d5Eo_YlsT4EkpdIXj6LKZXQJnndrl5ibh6PGdJ-vpYwwtJUjzJQEWFvuEcMxsBm_tXfg9QlXZoXqh9Oyf9a74_tDdOJaQjZfBOy7lnBXzWgT5cwmVvC7zNEuqnACfOslESRGSEljdHEI3342mwkwkMRZa4OASvqoEH2FWfZRVbEvqe9y3GnfUej2MDzRHajpvm-WYgyejZndaWDMkmp5_BnU766M7RdoywG5pAe0gdg0qvU--YYbkKOCSewmYCiF8_va01Cyuz6SUtFhpLG6Dp-JnGf7A", + "payload": "" +} +2026-01-20 19:15:04,222:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/646154860406 HTTP/1.1" 200 823 +2026-01-20 19:15:04,223:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:15:04 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: l5FKN_ymr2yaOWp-c0Gb1IOWI7FCetUzt9hJwUUKE75YIM_dHBs +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "app.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-27T19:14:21Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/58N6GA", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/F6m4Kw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + } + ] +} +2026-01-20 19:15:04,223:DEBUG:acme.client:Storing nonce: l5FKN_ymr2yaOWp-c0Gb1IOWI7FCetUzt9hJwUUKE75YIM_dHBs +2026-01-20 19:15:04,224:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw', 'status': 'pending', 'token': 'fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4'} +2026-01-20 19:15:07,225:DEBUG:acme.client:JWS payload: +b'' +2026-01-20 19:15:07,228:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/646154860406: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJsNUZLTl95bXIyeWFPV3AtYzBHYjFJT1dJN0ZDZXRVenQ5aEp3VVVLRTc1WUlNX2RIQnMiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ2MTU0ODYwNDA2In0", + "signature": "S3TAgBMtPl2HwQpCt2cvT4jHtcoPczxJVYIxSyIrCHCODIlaqgVSUj5Bdim1cSzZmhgByV6WO72Jpd3467sqo8CisJk2CJyLrfX4eUbha5GaFR219zTgPadtINWm6-GMBUvgR87FrIo3uCoECBm8_zKSxMqETRHa9HzZJm2fz9tCiY3EJZcvotd5AHdnRY05sDfw_b8roK7gJiO2CgGNTYiKvb5IW3j-U1YHdkGgbYsA9pg7UyQYf-xb-q215IabhziQM7OLcbsMTUHIn8OP6hvw9PZaWdhS_6ly4pDIli-gKEARIYmTLak2EmhtbphT93AAfvpT-Vut-jTjXFockw", + "payload": "" +} +2026-01-20 19:15:07,385:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/646154860406 HTTP/1.1" 200 823 +2026-01-20 19:15:07,386:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:15:07 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 82ktJIqY7e0ew27cSWOTXKb3qdf_ZalvL46d4brAuVMLJcz2Pcs +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "app.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-27T19:14:21Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/58N6GA", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/F6m4Kw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + } + ] +} +2026-01-20 19:15:07,386:DEBUG:acme.client:Storing nonce: 82ktJIqY7e0ew27cSWOTXKb3qdf_ZalvL46d4brAuVMLJcz2Pcs +2026-01-20 19:15:07,387:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw', 'status': 'pending', 'token': 'fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4'} +2026-01-20 19:15:10,388:DEBUG:acme.client:JWS payload: +b'' +2026-01-20 19:15:10,391:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/646154860406: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI4Mmt0SklxWTdlMGV3MjdjU1dPVFhLYjNxZGZfWmFsdkw0NmQ0YnJBdVZNTEpjejJQY3MiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ2MTU0ODYwNDA2In0", + "signature": "TnBcUI5wlbxcftZ02ivDO2gcnb9ZxGPBQyZcaZN0-RrlV9LSouGX-PqpSwjNX7Ak5rCRTU-NFZMSiZ2YlIuga5FdTlY95Ua1Cag2dNyT1zJycRypKO7o2EhzHOS6WbtnIeuVSaRvmd92ea5tXvkN0zEmXtZYUb2pjHTCncwrhdHydRL7ZPb_-AP_JrofygEJd00ZMFT-XAgSYcyv31gXRpZqLXyGNAAblxkGDZuEMbHZNdY5Wgb4u4hDFBQlXqlobpNhR31vACN_etMQmyOVCB1qOti6PhbtMyqdmjyiLCvysMcgFf6sIzJKhAo9hqqyRAKzRCehvqIRuVWluCdwWw", + "payload": "" +} +2026-01-20 19:15:10,549:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/646154860406 HTTP/1.1" 200 823 +2026-01-20 19:15:10,550:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:15:10 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: l5FKN_ymY5H6jDrPPxeocyUWPFtFXgR-ZOgu2uH02VB9jLJHdbI +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "app.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-27T19:14:21Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/F6m4Kw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/58N6GA", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + } + ] +} +2026-01-20 19:15:10,550:DEBUG:acme.client:Storing nonce: l5FKN_ymY5H6jDrPPxeocyUWPFtFXgR-ZOgu2uH02VB9jLJHdbI +2026-01-20 19:15:10,551:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw', 'status': 'pending', 'token': 'fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4'} +2026-01-20 19:15:13,552:DEBUG:acme.client:JWS payload: +b'' +2026-01-20 19:15:13,556:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/646154860406: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJsNUZLTl95bVk1SDZqRHJQUHhlb2N5VVdQRnRGWGdSLVpPZ3UydUgwMlZCOWpMSkhkYkkiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ2MTU0ODYwNDA2In0", + "signature": "D9D_P7RIHR-lsswIj3g1bsCgwJ0mwj3wyxswBADZBAmKOh0WXY7-d-DzfymzpS5sIIzzOZ6_WtQR80UravVyxcFtyIS2cPTZ6SD_5IekZlyVcalzae7gOClYSvG5DrhwcSp3UhU_3qINxxQLetOz0AsNvNXDPnQx2EuLbOWHT_YciNB1RFXPuQtJUnj-ioIC1uWYPcTBag_xgFJ_qF3eV-reMnQ9ZEsFjYBVvs5dY4Ug-yj_twdL0f1OnYEpoumrNYyQHecRjtaCPgfeCBn5GSozRbNxV3ZgsD7tBjmjvzrEYbkSuc190_-nEQEvIQ3-spTqUEJpqBh7PEe585Fo5g", + "payload": "" +} +2026-01-20 19:15:13,712:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/646154860406 HTTP/1.1" 200 823 +2026-01-20 19:15:13,713:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:15:13 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: l5FKN_ymvEiAzP8bgbuPqEaUJ2RiSjZUFdY38FJZmQAMMkkAdF0 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "app.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-27T19:14:21Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/58N6GA", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/F6m4Kw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + } + ] +} +2026-01-20 19:15:13,713:DEBUG:acme.client:Storing nonce: l5FKN_ymvEiAzP8bgbuPqEaUJ2RiSjZUFdY38FJZmQAMMkkAdF0 +2026-01-20 19:15:13,714:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw', 'status': 'pending', 'token': 'fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4'} +2026-01-20 19:15:16,715:DEBUG:acme.client:JWS payload: +b'' +2026-01-20 19:15:16,719:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/646154860406: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJsNUZLTl95bXZFaUF6UDhiZ2J1UHFFYVVKMlJpU2paVUZkWTM4RkpabVFBTU1ra0FkRjAiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ2MTU0ODYwNDA2In0", + "signature": "X9zNrqr0xylTsyk1gXf2oWR0lJ5mtcbXsk_i7Hj9uuXshMFytxJs5bx2raIX5oTbUIDAkBNY6h3QfH0KbLQ5mOAkLSUutpCHU8QP-Cs0XAHum5w4DF_ho96WhZrqfDySRKkfuG1yZ-BZyBxcnoHxrZe7uC5936DQjOIF23UEFU_jg96JVeCvQWdPSIXIoHadCchSSTipjKttCM8-zKZ8VxT3Vy6d5J2WdI-BSAYOC7oUSrUJZWESdnQpDh3J6cOA7Qa4ONwNBDY3RSZs2HMmTsJUQVZQSI2pSe5hQ24n4kXrYJi-2RKIugKB5MGLthVAxUtLLKexawmQIIZFGm0coA", + "payload": "" +} +2026-01-20 19:15:16,875:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/646154860406 HTTP/1.1" 200 823 +2026-01-20 19:15:16,876:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:15:16 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: l5FKN_ymKJpeQ_qErX7Uwngtp3IQPnK6C2An-_qsplPv-upjFbw +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "app.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-27T19:14:21Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/F6m4Kw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/58N6GA", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + } + ] +} +2026-01-20 19:15:16,877:DEBUG:acme.client:Storing nonce: l5FKN_ymKJpeQ_qErX7Uwngtp3IQPnK6C2An-_qsplPv-upjFbw +2026-01-20 19:15:16,877:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw', 'status': 'pending', 'token': 'fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4'} +2026-01-20 19:15:19,878:DEBUG:acme.client:JWS payload: +b'' +2026-01-20 19:15:19,882:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/646154860406: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJsNUZLTl95bUtKcGVRX3FFclg3VXduZ3RwM0lRUG5LNkMyQW4tX3FzcGxQdi11cGpGYnciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ2MTU0ODYwNDA2In0", + "signature": "iZHzfgSZAg4tdpEW5ymXQhj10m7VZDaySzVmAEbupL_DjNTMFmUQFqxirC-sC2VR5LBNZxx7i1rULAXBWwbYofYISQ_QfZr04o_Lb3Faow1CoM8FVNDYGikmYGGrJ9LvaXK_-Oxw7-CE24Woj3fSK5OmoStAZdbXLIBUDsh-nE3rNnZinHbNuWRICwdksK5NelYqu79i4sj65_8cdoAoPYj706GP_HAM7rl5dPd3Sz70rxyEHCdTl19JoRy5db-ee7ZxDB5OAfSRgo9LfNfYOOIvDbDkcGGrbQjIxIOzbTGEYx2dJwkqgMq1uchpHEpNbda6v3xSp_f6lk_6qifm8Q", + "payload": "" +} +2026-01-20 19:15:20,039:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/646154860406 HTTP/1.1" 200 823 +2026-01-20 19:15:20,040:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:15:19 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 82ktJIqYQEtB0gLQdlswjfsqg8MEkWFF9AlvsZHA9Xd5fmQZTBI +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "app.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-27T19:14:21Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/58N6GA", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/F6m4Kw", + "status": "pending", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4" + } + ] +} +2026-01-20 19:15:20,041:DEBUG:acme.client:Storing nonce: 82ktJIqYQEtB0gLQdlswjfsqg8MEkWFF9AlvsZHA9Xd5fmQZTBI +2026-01-20 19:15:20,041:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/GDcGVw', 'status': 'pending', 'token': 'fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4'} +2026-01-20 19:15:23,042:DEBUG:acme.client:JWS payload: +b'' +2026-01-20 19:15:23,046:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/646154860406: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI4Mmt0SklxWVFFdEIwZ0xRZGxzd2pmc3FnOE1Fa1dGRjlBbHZzWkhBOVhkNWZtUVpUQkkiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ2MTU0ODYwNDA2In0", + "signature": "RuSShWCoPPzGdijpZeTg_3RVmy9aUbMKa5f9J9B-_QLEKNhTJjOD3vKO7cmgL5UnG3wmbvQmsySxrpw1fP8pgr6QqvnwfgOJzpcNRR1PxFW4KDU1NzW1uvYOmfEo02NT1ZOXD6i_fPZ5wXbjOpxY4cZUlLTKXlZOPpFTvME32e1Ta6WSZBsFThysaHKi-2hnwx7tbcSm4AfwsWpcIrevHr1f0OXWMpyVsdelosHQKgIYxSm1b51R_LT5_C3dnUyGfle7oU9bgpajxQ_LhvKo1fFUHbna8nbWoWybOhuBrSKc6D09OCyLYarwk8TRcONeG_MEpkux-feMPouWT1vVLw", + "payload": "" +} +2026-01-20 19:15:23,202:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/646154860406 HTTP/1.1" 200 766 +2026-01-20 19:15:23,203:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:15:23 GMT +Content-Type: application/json +Content-Length: 766 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 82ktJIqYchXvfx-8ZdYjGWvoUimycbrjwRQoLZPjWMGIxyqUawo +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "app.profibot.hu" + }, + "status": "valid", + "expires": "2026-02-19T19:15:22Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/646154860406/F6m4Kw", + "status": "valid", + "validated": "2026-01-20T19:14:21Z", + "token": "fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4", + "validationRecord": [ + { + "url": "http://app.profibot.hu/.well-known/acme-challenge/fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4", + "hostname": "app.profibot.hu", + "port": "80", + "addressesResolved": [ + "91.82.83.208" + ], + "addressUsed": "91.82.83.208" + } + ] + } + ] +} +2026-01-20 19:15:23,203:DEBUG:acme.client:Storing nonce: 82ktJIqYchXvfx-8ZdYjGWvoUimycbrjwRQoLZPjWMGIxyqUawo +2026-01-20 19:15:23,204:DEBUG:certbot._internal.error_handler:Calling registered functions +2026-01-20 19:15:23,204:INFO:certbot._internal.auth_handler:Cleaning up challenges +2026-01-20 19:15:23,204:DEBUG:certbot._internal.plugins.webroot:Removing /data/letsencrypt-acme-challenge/.well-known/acme-challenge/fa3hNRmg4MuW5DiN2Jh7UIsjFyywoDpeaSC25Yh-SJ4 +2026-01-20 19:15:23,205:DEBUG:certbot._internal.plugins.webroot:All challenges cleaned up +2026-01-20 19:15:23,205:DEBUG:certbot._internal.client:CSR: CSR(file=None, data=b'-----BEGIN CERTIFICATE REQUEST-----\nMIIBJTCBrAIBADAAMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEZGwMOAMHvkR1cjgc\noFSZmH2dYDlX6lskI2tDBjyQo7qYCrLo4RSuMuSPQSZSNWIMNjiPNRWVINfNxRie\n05WXSJ2+iVVG3reaqOp9YTORqI7qj76hn0ugjrED1M+eM0dRoC0wKwYJKoZIhvcN\nAQkOMR4wHDAaBgNVHREEEzARgg9hcHAucHJvZmlib3QuaHUwCgYIKoZIzj0EAwID\naAAwZQIxAMczJ1wthg+/NhP/kMZ9b0xKER4TwQh0dIeXun5lyO3hYNVQrYvnfWIZ\nGRbJURqcUAIwZkQ1ae9z+9WjSzW9rLYYoHhLatP8ss+H/36qCgNcnL5zI1i3XJ3l\n/nDyVZRiFDyy\n-----END CERTIFICATE REQUEST-----\n', form='pem') +2026-01-20 19:15:23,206:DEBUG:certbot._internal.client:Will poll for certificate issuance until 2026-01-20 19:16:53.206363 +2026-01-20 19:15:23,207:DEBUG:acme.client:JWS payload: +b'{\n "csr": "MIIBJTCBrAIBADAAMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEZGwMOAMHvkR1cjgcoFSZmH2dYDlX6lskI2tDBjyQo7qYCrLo4RSuMuSPQSZSNWIMNjiPNRWVINfNxRie05WXSJ2-iVVG3reaqOp9YTORqI7qj76hn0ugjrED1M-eM0dRoC0wKwYJKoZIhvcNAQkOMR4wHDAaBgNVHREEEzARgg9hcHAucHJvZmlib3QuaHUwCgYIKoZIzj0EAwIDaAAwZQIxAMczJ1wthg-_NhP_kMZ9b0xKER4TwQh0dIeXun5lyO3hYNVQrYvnfWIZGRbJURqcUAIwZkQ1ae9z-9WjSzW9rLYYoHhLatP8ss-H_36qCgNcnL5zI1i3XJ3l_nDyVZRiFDyy"\n}' +2026-01-20 19:15:23,210:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/471639170836: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI4Mmt0SklxWWNoWHZmeC04WmRZakdXdm9VaW15Y2JyandSUW9MWlBqV01HSXh5cVVhd28iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2ZpbmFsaXplLzI5MDY0MzgxNzYvNDcxNjM5MTcwODM2In0", + "signature": "hWQdhPfQfdXaM3Ocyoi7_JvPutVZrB5IdxiuGZYVWdf_LDwoqbGUJaUsHveYXmNIG8ux24DU7JEtFUzskSRZ4bYwrkya2PKnhrg9rtEZKw8p0lDulVskL7ex3kCT9NGB6AeW8aXL_tFjUT43mhkxaANMRgyMkfr9RyikZKQ2W3UY0XPk0M500G8mzg-zd3RPqs3_MWybgCub3LufATi4WJuBHonvLrn8_1pMJGgQ1KhrjDFVef0R-0c7OL-_Z5P7q6p_YRuOrMpc8l4Dl9hfTizt3rX80rzcSSMKaai_pwAm548BBW8I37FFVS2MIiLZNxZKnvmf7Fy21Wu_bqsc0w", + "payload": "ewogICJjc3IiOiAiTUlJQkpUQ0JyQUlCQURBQU1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFWkd3TU9BTUh2a1IxY2pnY29GU1ptSDJkWURsWDZsc2tJMnREQmp5UW83cVlDckxvNFJTdU11U1BRU1pTTldJTU5qaVBOUldWSU5mTnhSaWUwNVdYU0oyLWlWVkczcmVhcU9wOVlUT1JxSTdxajc2aG4wdWdqckVEMU0tZU0wZFJvQzB3S3dZSktvWklodmNOQVFrT01SNHdIREFhQmdOVkhSRUVFekFSZ2c5aGNIQXVjSEp2Wm1saWIzUXVhSFV3Q2dZSUtvWkl6ajBFQXdJRGFBQXdaUUl4QU1jekoxd3RoZy1fTmhQX2tNWjliMHhLRVI0VHdRaDBkSWVYdW41bHlPM2hZTlZRcll2bmZXSVpHUmJKVVJxY1VBSXdaa1ExYWU5ei05V2pTelc5ckxZWW9IaExhdFA4c3MtSF8zNnFDZ05jbkw1ekkxaTNYSjNsX25EeVZaUmlGRHl5Igp9" +} +2026-01-20 19:15:24,088:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/finalize/2906438176/471639170836 HTTP/1.1" 200 451 +2026-01-20 19:15:24,089:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:15:24 GMT +Content-Type: application/json +Content-Length: 451 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/471639170836 +Replay-Nonce: 82ktJIqYWKF1imDf5QfsGjMuSz39epZQoKb_7B5WCV4_mOB9wRM +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "valid", + "expires": "2026-01-27T19:14:21Z", + "identifiers": [ + { + "type": "dns", + "value": "app.profibot.hu" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/646154860406" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/471639170836", + "certificate": "https://acme-v02.api.letsencrypt.org/acme/cert/05608df76fdab2efa09d5f63616fa5d3efd1" +} +2026-01-20 19:15:24,089:DEBUG:acme.client:Storing nonce: 82ktJIqYWKF1imDf5QfsGjMuSz39epZQoKb_7B5WCV4_mOB9wRM +2026-01-20 19:15:25,090:DEBUG:acme.client:JWS payload: +b'' +2026-01-20 19:15:25,094:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/order/2906438176/471639170836: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI4Mmt0SklxWVdLRjFpbURmNVFmc0dqTXVTejM5ZXBaUW9LYl83QjVXQ1Y0X21PQjl3Uk0iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL29yZGVyLzI5MDY0MzgxNzYvNDcxNjM5MTcwODM2In0", + "signature": "kY2ZUn0jt4SLBYGNRLwUMUps5sK8qz72cUUfxnUNIfrqkDznTLbDzHb14zM2AbSo3R3yWcmRc_5jdnXa2-71MQkHzcBdewPkMcruKNsQ2_Fu4F1eB9iSHcgd7W5Bs3iC30lEvCC7dqMO8hdaE5Lw9YuhPSqk_dsJOwC7Y5t4qC-glVk7ix4sFI5m3N3nWfEcp3OChOw80IGWBAKLRdjXcTa_efwCb8Qhoz1jd-rEpFrpNKcBaMH_3zHQvQa72fD5GhpK8pqhcBxh2G0CYgShpjlOjqqoGkS9Q3ktRAL_KlnYOVlyihN8_b_s6I2Z1OIty59Qj0smqARG97F5U0KNcg", + "payload": "" +} +2026-01-20 19:15:25,298:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/order/2906438176/471639170836 HTTP/1.1" 200 451 +2026-01-20 19:15:25,299:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:15:25 GMT +Content-Type: application/json +Content-Length: 451 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/471639170836 +Replay-Nonce: 82ktJIqYi-fH5JorUIDUVgTLTcmduUIhOoMGfRgtsw8DghuvTbQ +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "valid", + "expires": "2026-01-27T19:14:21Z", + "identifiers": [ + { + "type": "dns", + "value": "app.profibot.hu" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/646154860406" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/471639170836", + "certificate": "https://acme-v02.api.letsencrypt.org/acme/cert/05608df76fdab2efa09d5f63616fa5d3efd1" +} +2026-01-20 19:15:25,299:DEBUG:acme.client:Storing nonce: 82ktJIqYi-fH5JorUIDUVgTLTcmduUIhOoMGfRgtsw8DghuvTbQ +2026-01-20 19:15:25,300:DEBUG:acme.client:JWS payload: +b'' +2026-01-20 19:15:25,304:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/cert/05608df76fdab2efa09d5f63616fa5d3efd1: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI4Mmt0SklxWWktZkg1Sm9yVUlEVVZnVExUY21kdVVJaE9vTUdmUmd0c3c4RGdodXZUYlEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NlcnQvMDU2MDhkZjc2ZmRhYjJlZmEwOWQ1ZjYzNjE2ZmE1ZDNlZmQxIn0", + "signature": "UiPdPmkqNKm7uyhWj0bPbillZ4eMrX3liw1sje9CpAEowjkbzs5Do9m5StjeOHj02X8dzx5HyNcb4nJ8RnCXo5dmKp4byDWExlmdqCjSGPwwote5kb0HZU0KvAG8ZiKNViThooPKNTtnIIPjUrhK_Em3PGSL4P_yQAn34EKL_5gLRhOcbNFzewhFH3y2c-7FEzvUqfD1A4xYSh1Wc4FFlcSSVwG5Jyjdu7N6TOliED3NDFFqcUryNKFDjoEGzR3RcGQhpnlioxgfOnuV6dV54s9awhmM7xxuO99I7H75MJUCEMcRLaPb2xxXMBf3zjQNGapmjbPZQK3oe9dNuDj5eQ", + "payload": "" +} +2026-01-20 19:15:25,462:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/cert/05608df76fdab2efa09d5f63616fa5d3efd1 HTTP/1.1" 200 2905 +2026-01-20 19:15:25,463:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:15:25 GMT +Content-Type: application/pem-certificate-chain +Content-Length: 2905 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="alternate" +Replay-Nonce: 82ktJIqY7eHcOaEYq3LR7Qbjp8jYDiH5Bm8elffdu5sD3Y94hXE +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +-----BEGIN CERTIFICATE----- +MIIDsDCCAzWgAwIBAgISBWCN92/asu+gnV9jYW+l0+/RMAoGCCqGSM49BAMDMDIx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF +ODAeFw0yNjAxMjAxODE2NTNaFw0yNjA0MjAxODE2NTJaMBoxGDAWBgNVBAMTD2Fw +cC5wcm9maWJvdC5odTB2MBAGByqGSM49AgEGBSuBBAAiA2IABGRsDDgDB75EdXI4 +HKBUmZh9nWA5V+pbJCNrQwY8kKO6mAqy6OEUrjLkj0EmUjViDDY4jzUVlSDXzcUY +ntOVl0idvolVRt63mqjqfWEzkaiO6o++oZ9LoI6xA9TPnjNHUaOCAiQwggIgMA4G +A1UdDwEB/wQEAwIHgDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYD +VR0TAQH/BAIwADAdBgNVHQ4EFgQUyhEHvbW74UVUb1a6U64Puwn69SEwHwYDVR0j +BBgwFoAUjw0TovYuftFQbDMYOF1ZjiNykcowMgYIKwYBBQUHAQEEJjAkMCIGCCsG +AQUFBzAChhZodHRwOi8vZTguaS5sZW5jci5vcmcvMBoGA1UdEQQTMBGCD2FwcC5w +cm9maWJvdC5odTATBgNVHSAEDDAKMAgGBmeBDAECATAtBgNVHR8EJjAkMCKgIKAe +hhxodHRwOi8vZTguYy5sZW5jci5vcmcvODIuY3JsMIIBCwYKKwYBBAHWeQIEAgSB +/ASB+QD3AHUAZBHEbKQS7KeJHKICLgC8q08oB9QeNSer6v7VA8l9zfAAAAGb3NVG +SwAABAMARjBEAiAP1scwpg3dQFPK+PE5MdgOhZYW4O1NxisOvuWdefHsjQIgQT/M +lQx83aa2liIP+TPphetJNB5+p43RgzGl0tKEs3kAfgClyXiSXVdGF4KHDdiJZgtc +VWSLfQBA8uwHaFHRiGkZ9wAAAZvc1Ug2AAgAAAUAL5Y8sQQDAEcwRQIhAMGCBlb/ +fDzI+IgB5zdMs5Wgfgy95SYDZA5wSzE7/HywAiAybIZk62+BKZDX23jE3njqO3sc +JcfNJHk/ypU6jk8+SjAKBggqhkjOPQQDAwNpADBmAjEA9aw+nmK+Do52PRWB/voM +JkrNKZbVULDAoXymwPysX60k7DQqTlgvne2Dg//JaiaTAjEA9lAEXUH+b+clBJi8 +2w2u4feHtxqmDpEHVRwBsD427CjO1qM5YaOA8bcyh7Gmiamz +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIEVjCCAj6gAwIBAgIQY5WTY8JOcIJxWRi/w9ftVjANBgkqhkiG9w0BAQsFADBP +MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy +Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa +Fw0yNzAzMTIyMzU5NTlaMDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF +bmNyeXB0MQswCQYDVQQDEwJFODB2MBAGByqGSM49AgEGBSuBBAAiA2IABNFl8l7c +S7QMApzSsvru6WyrOq44ofTUOTIzxULUzDMMNMchIJBwXOhiLxxxs0LXeb5GDcHb +R6EToMffgSZjO9SNHfY9gjMy9vQr5/WWOrQTZxh7az6NSNnq3u2ubT6HTKOB+DCB +9TAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB +MBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFI8NE6L2Ln7RUGwzGDhdWY4j +cpHKMB8GA1UdIwQYMBaAFHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEB +BCYwJDAiBggrBgEFBQcwAoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzATBgNVHSAE +DDAKMAgGBmeBDAECATAnBgNVHR8EIDAeMBygGqAYhhZodHRwOi8veDEuYy5sZW5j +ci5vcmcvMA0GCSqGSIb3DQEBCwUAA4ICAQBnE0hGINKsCYWi0Xx1ygxD5qihEjZ0 +RI3tTZz1wuATH3ZwYPIp97kWEayanD1j0cDhIYzy4CkDo2jB8D5t0a6zZWzlr98d +AQFNh8uKJkIHdLShy+nUyeZxc5bNeMp1Lu0gSzE4McqfmNMvIpeiwWSYO9w82Ob8 +otvXcO2JUYi3svHIWRm3+707DUbL51XMcY2iZdlCq4Wa9nbuk3WTU4gr6LY8MzVA +aDQG2+4U3eJ6qUF10bBnR1uuVyDYs9RhrwucRVnfuDj29CMLTsplM5f5wSV5hUpm +Uwp/vV7M4w4aGunt74koX71n4EdagCsL/Yk5+mAQU0+tue0JOfAV/R6t1k+Xk9s2 +HMQFeoxppfzAVC04FdG9M+AC2JWxmFSt6BCuh3CEey3fE52Qrj9YM75rtvIjsm/1 +Hl+u//Wqxnu1ZQ4jpa+VpuZiGOlWrqSP9eogdOhCGisnyewWJwRQOqK16wiGyZeR +xs/Bekw65vwSIaVkBruPiTfMOo0Zh4gVa8/qJgMbJbyrwwG97z/PRgmLKCDl8z3d +tA0Z7qq7fta0Gl24uyuB05dqI5J1LvAzKuWdIjT1tP8qCoxSE/xpix8hX2dt3h+/ +jujUgFPFZ0EVZ0xSyBNRF3MboGZnYXFUxpNjTWPKpagDHJQmqrAcDmWJnMsFY3jS +u1igv3OefnWjSQ== +-----END CERTIFICATE----- + +2026-01-20 19:15:25,464:DEBUG:acme.client:Storing nonce: 82ktJIqY7eHcOaEYq3LR7Qbjp8jYDiH5Bm8elffdu5sD3Y94hXE +2026-01-20 19:15:25,464:DEBUG:acme.client:JWS payload: +b'' +2026-01-20 19:15:25,468:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/cert/05608df76fdab2efa09d5f63616fa5d3efd1/1: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI4Mmt0SklxWTdlSGNPYUVZcTNMUjdRYmpwOGpZRGlINUJtOGVsZmZkdTVzRDNZOTRoWEUiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NlcnQvMDU2MDhkZjc2ZmRhYjJlZmEwOWQ1ZjYzNjE2ZmE1ZDNlZmQxLzEifQ", + "signature": "Kaf32ZWngTYGaFqbgZwAD1MrDKL2t4G4Tt9zsan3rFG-y3bIPbD9Au2uQpE0GPSLZnPNOcMA2ScIqPach8G2Pa5lbWR0FVpBY3Q7zFeWiDE7xkgRyJxOy5V605eoF_HKZ9ytnzBKLB_z7iAzjXJr7ZBdvlKcX8kDWCVp8mzDcU7kuLNcEe_T334e61ehSmqopEhVKTdONIYLGFwgzFJFcfrvUYBM6Kcr3vxMLZ0MPNkSHR62XTeTQoVbQR8glu522_hVKjioWSb-TIT7t3PvlH-CY8H8k8JQNmiE0Me78cxsY4_ydXya5MObyjQI1Q4rHarBgGeKapVUkXRE6VTPKQ", + "payload": "" +} +2026-01-20 19:15:25,626:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/cert/05608df76fdab2efa09d5f63616fa5d3efd1/1 HTTP/1.1" 200 2340 +2026-01-20 19:15:25,627:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Tue, 20 Jan 2026 19:15:25 GMT +Content-Type: application/pem-certificate-chain +Content-Length: 2340 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="alternate" +Replay-Nonce: l5FKN_ymbE79zAxS8i7JZFZqH5seEIUqNMaJXajTNdfyD74cXqI +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +-----BEGIN CERTIFICATE----- +MIIDsDCCAzWgAwIBAgISBWCN92/asu+gnV9jYW+l0+/RMAoGCCqGSM49BAMDMDIx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF +ODAeFw0yNjAxMjAxODE2NTNaFw0yNjA0MjAxODE2NTJaMBoxGDAWBgNVBAMTD2Fw +cC5wcm9maWJvdC5odTB2MBAGByqGSM49AgEGBSuBBAAiA2IABGRsDDgDB75EdXI4 +HKBUmZh9nWA5V+pbJCNrQwY8kKO6mAqy6OEUrjLkj0EmUjViDDY4jzUVlSDXzcUY +ntOVl0idvolVRt63mqjqfWEzkaiO6o++oZ9LoI6xA9TPnjNHUaOCAiQwggIgMA4G +A1UdDwEB/wQEAwIHgDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYD +VR0TAQH/BAIwADAdBgNVHQ4EFgQUyhEHvbW74UVUb1a6U64Puwn69SEwHwYDVR0j +BBgwFoAUjw0TovYuftFQbDMYOF1ZjiNykcowMgYIKwYBBQUHAQEEJjAkMCIGCCsG +AQUFBzAChhZodHRwOi8vZTguaS5sZW5jci5vcmcvMBoGA1UdEQQTMBGCD2FwcC5w +cm9maWJvdC5odTATBgNVHSAEDDAKMAgGBmeBDAECATAtBgNVHR8EJjAkMCKgIKAe +hhxodHRwOi8vZTguYy5sZW5jci5vcmcvODIuY3JsMIIBCwYKKwYBBAHWeQIEAgSB +/ASB+QD3AHUAZBHEbKQS7KeJHKICLgC8q08oB9QeNSer6v7VA8l9zfAAAAGb3NVG +SwAABAMARjBEAiAP1scwpg3dQFPK+PE5MdgOhZYW4O1NxisOvuWdefHsjQIgQT/M +lQx83aa2liIP+TPphetJNB5+p43RgzGl0tKEs3kAfgClyXiSXVdGF4KHDdiJZgtc +VWSLfQBA8uwHaFHRiGkZ9wAAAZvc1Ug2AAgAAAUAL5Y8sQQDAEcwRQIhAMGCBlb/ +fDzI+IgB5zdMs5Wgfgy95SYDZA5wSzE7/HywAiAybIZk62+BKZDX23jE3njqO3sc +JcfNJHk/ypU6jk8+SjAKBggqhkjOPQQDAwNpADBmAjEA9aw+nmK+Do52PRWB/voM +JkrNKZbVULDAoXymwPysX60k7DQqTlgvne2Dg//JaiaTAjEA9lAEXUH+b+clBJi8 +2w2u4feHtxqmDpEHVRwBsD427CjO1qM5YaOA8bcyh7Gmiamz +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIICtTCCAjugAwIBAgIQfo8UX4exWTMtf9QIK4JraTAKBggqhkjOPQQDAzBPMQsw +CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg +R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yNDAzMTMwMDAwMDBaFw0y +NzAzMTIyMzU5NTlaMDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNy +eXB0MQswCQYDVQQDEwJFODB2MBAGByqGSM49AgEGBSuBBAAiA2IABNFl8l7cS7QM +ApzSsvru6WyrOq44ofTUOTIzxULUzDMMNMchIJBwXOhiLxxxs0LXeb5GDcHbR6ET +oMffgSZjO9SNHfY9gjMy9vQr5/WWOrQTZxh7az6NSNnq3u2ubT6HTKOB+DCB9TAO +BgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIG +A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFI8NE6L2Ln7RUGwzGDhdWY4jcpHK +MB8GA1UdIwQYMBaAFHxClq7eS0g7+pL4nozPbYupcjeVMDIGCCsGAQUFBwEBBCYw +JDAiBggrBgEFBQcwAoYWaHR0cDovL3gyLmkubGVuY3Iub3JnLzATBgNVHSAEDDAK +MAgGBmeBDAECATAnBgNVHR8EIDAeMBygGqAYhhZodHRwOi8veDIuYy5sZW5jci5v +cmcvMAoGCCqGSM49BAMDA2gAMGUCMQClsUNJdX36GE+o2yDf7L02m3P3ElVWRLls +5ZyLYPjcNamBxRB9gZYoj24mGZtP3GkCMASZcALg6kpScomqIIjVHXRUQ500cdl4 +4n7fhxwokLo/lVlO8YyHwAi7ejTHtvw9Vg== +-----END CERTIFICATE----- + +2026-01-20 19:15:25,627:DEBUG:acme.client:Storing nonce: l5FKN_ymbE79zAxS8i7JZFZqH5seEIUqNMaJXajTNdfyD74cXqI +2026-01-20 19:15:25,629:INFO:certbot._internal.client:Non-standard path(s), might not work with crontab installed by your operating system package manager +2026-01-20 19:15:25,630:DEBUG:certbot._internal.storage:Creating directory /etc/letsencrypt/archive/npm-16. +2026-01-20 19:15:25,630:DEBUG:certbot._internal.storage:Creating directory /etc/letsencrypt/live/npm-16. +2026-01-20 19:15:25,631:DEBUG:certbot._internal.storage:Writing certificate to /etc/letsencrypt/live/npm-16/cert.pem. +2026-01-20 19:15:25,632:DEBUG:certbot._internal.storage:Writing private key to /etc/letsencrypt/live/npm-16/privkey.pem. +2026-01-20 19:15:25,632:DEBUG:certbot._internal.storage:Writing chain to /etc/letsencrypt/live/npm-16/chain.pem. +2026-01-20 19:15:25,632:DEBUG:certbot._internal.storage:Writing full chain to /etc/letsencrypt/live/npm-16/fullchain.pem. +2026-01-20 19:15:25,633:DEBUG:certbot._internal.storage:Writing README to /etc/letsencrypt/live/npm-16/README. +2026-01-20 19:15:25,662:DEBUG:certbot.configuration:Var account=e417a583de478a0cfdeed332c1113068 (set by user). +2026-01-20 19:15:25,663:DEBUG:certbot.configuration:Var key_type=ecdsa (set by user). +2026-01-20 19:15:25,663:DEBUG:certbot.configuration:Var elliptic_curve=secp384r1 (set by user). +2026-01-20 19:15:25,663:DEBUG:certbot.configuration:Var preferred_chain=ISRG Root X1 (set by user). +2026-01-20 19:15:25,663:DEBUG:certbot.configuration:Var pref_challs=['http-01'] (set by user). +2026-01-20 19:15:25,663:DEBUG:certbot.configuration:Var config_dir=/etc/letsencrypt (set by user). +2026-01-20 19:15:25,664:DEBUG:certbot.configuration:Var work_dir=/tmp/letsencrypt-lib (set by user). +2026-01-20 19:15:25,664:DEBUG:certbot.configuration:Var logs_dir=/data/logs (set by user). +2026-01-20 19:15:25,664:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2026-01-20 19:15:25,664:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2026-01-20 19:15:25,664:DEBUG:certbot.configuration:Var webroot_path=['/data/letsencrypt-acme-challenge'] (set by user). +2026-01-20 19:15:25,665:DEBUG:certbot.configuration:Var webroot_map={'app.profibot.hu': '/data/letsencrypt-acme-challenge'} (set by user). +2026-01-20 19:15:25,667:DEBUG:certbot._internal.display.obj:Notifying user: +Successfully received certificate. +Certificate is saved at: /etc/letsencrypt/live/npm-16/fullchain.pem +Key is saved at: /etc/letsencrypt/live/npm-16/privkey.pem +This certificate expires on 2026-04-20. +These files will be updated when the certificate renews. +2026-01-20 19:15:25,667:DEBUG:certbot._internal.display.obj:Notifying user: NEXT STEPS: +2026-01-20 19:15:25,667:DEBUG:certbot._internal.display.obj:Notifying user: - The certificate will need to be renewed before it expires. Certbot can automatically renew the certificate in the background, but you may need to take steps to enable that functionality. See https://certbot.org/renewal-setup for instructions. +2026-01-20 19:15:25,669:DEBUG:certbot._internal.display.obj:Notifying user: If you like Certbot, please consider supporting our work by: + * Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate + * Donating to EFF: https://eff.org/donate-le diff --git a/proxy-manager/data/logs/letsencrypt.log.4 b/proxy-manager/data/logs/letsencrypt.log.4 new file mode 100755 index 0000000..5a042d0 --- /dev/null +++ b/proxy-manager/data/logs/letsencrypt.log.4 @@ -0,0 +1,1562 @@ +2026-01-19 23:22:56,970:DEBUG:certbot._internal.main:certbot version: 5.1.0 +2026-01-19 23:22:56,970:DEBUG:certbot._internal.main:Location of certbot entry point: /opt/certbot/bin/certbot +2026-01-19 23:22:56,970:DEBUG:certbot._internal.main:Arguments: ['--config', '/etc/letsencrypt.ini', '--work-dir', '/tmp/letsencrypt-lib', '--logs-dir', '/data/logs', '--cert-name', 'npm-15', '--agree-tos', '--authenticator', 'webroot', '-m', 'kincses@gmail.com', '--preferred-challenges', 'http', '--domains', 'code.profibot.hu'] +2026-01-19 23:22:56,970:DEBUG:certbot._internal.main:Discovered plugins: PluginsRegistry(PluginEntryPoint#manual,PluginEntryPoint#null,PluginEntryPoint#standalone,PluginEntryPoint#webroot) +2026-01-19 23:22:56,983:DEBUG:certbot._internal.log:Root logging level set at 30 +2026-01-19 23:22:56,983:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2026-01-19 23:22:56,983:DEBUG:certbot._internal.plugins.selection:Single candidate plugin: * webroot +Description: Saves the necessary validation files to a .well-known/acme-challenge/ directory within the nominated webroot path. A separate HTTP server must be running and serving files from the webroot path. HTTP challenge only (wildcards not supported). +Interfaces: Authenticator, Plugin +Entry point: EntryPoint(name='webroot', value='certbot._internal.plugins.webroot:Authenticator', group='certbot.plugins') +Initialized: +Prep: True +2026-01-19 23:22:56,984:DEBUG:certbot._internal.plugins.selection:Selected authenticator and installer None +2026-01-19 23:22:56,984:INFO:certbot._internal.plugins.selection:Plugins selected: Authenticator webroot, Installer None +2026-01-19 23:22:57,025:DEBUG:certbot._internal.main:Picked account: +2026-01-19 23:22:57,025:DEBUG:acme.client:Sending GET request to https://acme-v02.api.letsencrypt.org/directory. +2026-01-19 23:22:57,027:DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org:443 +2026-01-19 23:22:57,468:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "GET /directory HTTP/1.1" 200 1033 +2026-01-19 23:22:57,469:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:22:57 GMT +Content-Type: application/json +Content-Length: 1033 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "PSRwgWV9EE8": "https://community.letsencrypt.org/t/adding-random-entries-to-the-directory/33417", + "keyChange": "https://acme-v02.api.letsencrypt.org/acme/key-change", + "meta": { + "caaIdentities": [ + "letsencrypt.org" + ], + "profiles": { + "classic": "https://letsencrypt.org/docs/profiles#classic", + "shortlived": "https://letsencrypt.org/docs/profiles#shortlived", + "tlsclient": "https://letsencrypt.org/docs/profiles#tlsclient", + "tlsserver": "https://letsencrypt.org/docs/profiles#tlsserver" + }, + "termsOfService": "https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf", + "website": "https://letsencrypt.org" + }, + "newAccount": "https://acme-v02.api.letsencrypt.org/acme/new-acct", + "newNonce": "https://acme-v02.api.letsencrypt.org/acme/new-nonce", + "newOrder": "https://acme-v02.api.letsencrypt.org/acme/new-order", + "renewalInfo": "https://acme-v02.api.letsencrypt.org/acme/renewal-info", + "revokeCert": "https://acme-v02.api.letsencrypt.org/acme/revoke-cert" +} +2026-01-19 23:22:57,471:DEBUG:certbot._internal.display.obj:Notifying user: Requesting a certificate for code.profibot.hu +2026-01-19 23:22:57,491:DEBUG:acme.client:Requesting fresh nonce +2026-01-19 23:22:57,492:DEBUG:acme.client:Sending HEAD request to https://acme-v02.api.letsencrypt.org/acme/new-nonce. +2026-01-19 23:22:57,635:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "HEAD /acme/new-nonce HTTP/1.1" 200 0 +2026-01-19 23:22:57,636:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:22:57 GMT +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: LJ8hB_GOY4faR1SHMpwQcFNJWMpOcotglmygVukKNrap2JeTt0w +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + + +2026-01-19 23:22:57,636:DEBUG:acme.client:Storing nonce: LJ8hB_GOY4faR1SHMpwQcFNJWMpOcotglmygVukKNrap2JeTt0w +2026-01-19 23:22:57,637:DEBUG:acme.client:JWS payload: +b'{\n "identifiers": [\n {\n "type": "dns",\n "value": "code.profibot.hu"\n }\n ]\n}' +2026-01-19 23:22:57,650:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/new-order: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJMSjhoQl9HT1k0ZmFSMVNITXB3UWNGTkpXTXBPY290Z2xteWdWdWtLTnJhcDJKZVR0MHciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL25ldy1vcmRlciJ9", + "signature": "dstUJ9pQzgmEpuyhJxBExR6YFJpPK6nwnK-DP6BT--FfgKcj2IDWHIlan-c2OTuWgm2nY9y6tX3LJ2Jkdh_Lq_WMNFPFa-fPt5ztVP9ZENby-3YkVxizvy8f6zb-KKvKhnnfZ1skd57cA5WIV1dscVBeaL1qlbetgX5LhgyGsVVqVCMrLEUcNvxZJ9g8pmxcWKvzjh23aGLIxJcz_GezwX1T0JfcXKjXQlNujFS4mSs0oVi24AgwAvdXPTk3_yELItqcuTwGuAM4tz6WWb9eWhj_hLAkCGPWK3ervC8AQCxmrZIStCaflnfm_XnWR8dcocUiZwcuwD0uDouyJ4nM-g", + "payload": "ewogICJpZGVudGlmaWVycyI6IFsKICAgIHsKICAgICAgInR5cGUiOiAiZG5zIiwKICAgICAgInZhbHVlIjogImNvZGUucHJvZmlib3QuaHUiCiAgICB9CiAgXQp9" +} +2026-01-19 23:22:57,919:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/new-order HTTP/1.1" 201 350 +2026-01-19 23:22:57,920:DEBUG:acme.client:Received response: +HTTP 201 +Server: nginx +Date: Mon, 19 Jan 2026 23:22:57 GMT +Content-Type: application/json +Content-Length: 350 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/471340543716 +Replay-Nonce: H6cLU6QyxsUOuB2l86ZgzYp0NwTxl9zVvIuCsk2lmmXhZIY6_YA +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "pending", + "expires": "2026-01-26T23:22:57Z", + "identifiers": [ + { + "type": "dns", + "value": "code.profibot.hu" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/645727310096" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/471340543716" +} +2026-01-19 23:22:57,920:DEBUG:acme.client:Storing nonce: H6cLU6QyxsUOuB2l86ZgzYp0NwTxl9zVvIuCsk2lmmXhZIY6_YA +2026-01-19 23:22:57,921:DEBUG:acme.client:JWS payload: +b'' +2026-01-19 23:22:57,923:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/645727310096: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJINmNMVTZReXhzVU91QjJsODZaZ3pZcDBOd1R4bDl6VnZJdUNzazJsbW1YaFpJWTZfWUEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ1NzI3MzEwMDk2In0", + "signature": "mBtXA-5ORrnmkduzqJ7xwA0S2wwoyq4iay8UgNm2MN6JLQBqVuz_XXgHWOUpTxGEJ_rX5s8DZEN4134HToqzDWq8eyC3PH4pMwRhh1CFANTCcMRcUPNzxA6CfcQSner1F1KsI7ve8gc0lcBl-pRwym889R2cr2KDv9P6i5kO8npSsJq0boYB-PM3dAbw4Tmw7PPJ0tEg2PYpVmg-13B3b8IM199T8iiKTiayfKj_JlWSI8BFCGAB8DSR8bdSbLAQPvIQ5lEwY8awE_NC6TZAgb1IihXipJ9-ZqPBq9h3URbySgNOo8CiiQAocHuZm3zF1klBLRA0JyWLSZjRz5L9Gg", + "payload": "" +} +2026-01-19 23:22:58,069:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/645727310096 HTTP/1.1" 200 824 +2026-01-19 23:22:58,070:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:22:57 GMT +Content-Type: application/json +Content-Length: 824 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: LJ8hB_GOzN1R-onbANi0c4LJgdws4aZ4BHwHG2i1wQQnk-P-2cQ +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "code.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-26T23:22:57Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/UdlK3A", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/4gVIFA", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + } + ] +} +2026-01-19 23:22:58,070:DEBUG:acme.client:Storing nonce: LJ8hB_GOzN1R-onbANi0c4LJgdws4aZ4BHwHG2i1wQQnk-P-2cQ +2026-01-19 23:22:58,071:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ', 'status': 'pending', 'token': 'OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk'} +2026-01-19 23:22:58,072:INFO:certbot._internal.auth_handler:Performing the following challenges: +2026-01-19 23:22:58,072:INFO:certbot._internal.auth_handler:http-01 challenge for code.profibot.hu +2026-01-19 23:22:58,072:INFO:certbot._internal.plugins.webroot:Using the webroot path /data/letsencrypt-acme-challenge for all unmatched domains. +2026-01-19 23:22:58,073:DEBUG:certbot._internal.plugins.webroot:Creating root challenges validation dir at /data/letsencrypt-acme-challenge/.well-known/acme-challenge +2026-01-19 23:22:58,075:DEBUG:certbot._internal.plugins.webroot:Attempting to save validation to /data/letsencrypt-acme-challenge/.well-known/acme-challenge/OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk +2026-01-19 23:22:58,076:DEBUG:acme.client:JWS payload: +b'{}' +2026-01-19 23:22:58,079:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/4gVIFA: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJMSjhoQl9HT3pOMVItb25iQU5pMGM0TEpnZHdzNGFaNEJId0hHMmkxd1FRbmstUC0yY1EiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NoYWxsLzI5MDY0MzgxNzYvNjQ1NzI3MzEwMDk2LzRnVklGQSJ9", + "signature": "b9s3Fwsb-jx3RBTU2r5qD9wvWIR5XI4AB4XvD1vAGm5PcJa9aJ1m9C_ZMR9tnygzZ9eorvgs6hyTwfCYNtk2unrhnpEQG3rk186RTAJBUmFJwLTK4aT37bRqp_KBhmg4dnbN-z03diTleW41WvQPUjNTO96BTel66oxkPjFRcp3wTRNktgf5R55SxpeqE3dPRziuIzqvmM-iBkfL0heNIMtI7NBdAiaSgTW1R_g2cJXyV_hKfouTee_v6_x71qKX0e47ZoC9OoVNpKn29RxLLLP_oyE11A2d_I-6T0OfDz4dk6fkrD9Lj5wZ-VG0qj8X0E39e9gKSu_JD5q6YwcuKA", + "payload": "e30" +} +2026-01-19 23:22:58,227:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/chall/2906438176/645727310096/4gVIFA HTTP/1.1" 200 195 +2026-01-19 23:22:58,227:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:22:58 GMT +Content-Type: application/json +Content-Length: 195 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="up" +Location: https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/4gVIFA +Replay-Nonce: H6cLU6Qy0ynI5kSotgx91GAOE2FXSEcrWn7EhivXTr79ULsbtMk +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/4gVIFA", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" +} +2026-01-19 23:22:58,228:DEBUG:acme.client:Storing nonce: H6cLU6Qy0ynI5kSotgx91GAOE2FXSEcrWn7EhivXTr79ULsbtMk +2026-01-19 23:22:58,229:INFO:certbot._internal.auth_handler:Waiting for verification... +2026-01-19 23:22:59,229:DEBUG:acme.client:JWS payload: +b'' +2026-01-19 23:22:59,233:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/645727310096: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJINmNMVTZReTB5bkk1a1NvdGd4OTFHQU9FMkZYU0VjclduN0VoaXZYVHI3OVVMc2J0TWsiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ1NzI3MzEwMDk2In0", + "signature": "VWYn-nWhXwXrdQ4h75ibfTROlPjJNWpgDAs4CwaY3llo9yDb2iyS5KMoun26k0fA6DNfpiIHaASmlKGlSU4X2pv0qqTKyoB6GmjCWoVlixSnUzI4kZ2mwT8XewZ00D0xfIlPHHB7JmmGCqIkdWhgC6MXz78dYSr4U6nlkv-iF4CM-e6eH8ZbReIQWO7so_vF_rvNxtnRinYhaLwlJ3ts7UdimUmpwFlyn1ULNKc6XgGiroKTHFWLg4zHYaywK3J3uCjP4UESVOs2EbMrzYxUGfHcVLbd5Uc2EO2qF52m-lUihO-dvbrYR5T2RBxFmkgrXm_te5ggaq6vsq8cskz0vg", + "payload": "" +} +2026-01-19 23:22:59,390:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/645727310096 HTTP/1.1" 200 824 +2026-01-19 23:22:59,391:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:22:59 GMT +Content-Type: application/json +Content-Length: 824 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: H6cLU6QyXefX5vHHF-v58NaKEZpSJojltc9YVA7cdiwGYkeiToI +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "code.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-26T23:22:57Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/UdlK3A", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/4gVIFA", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + } + ] +} +2026-01-19 23:22:59,392:DEBUG:acme.client:Storing nonce: H6cLU6QyXefX5vHHF-v58NaKEZpSJojltc9YVA7cdiwGYkeiToI +2026-01-19 23:22:59,392:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ', 'status': 'pending', 'token': 'OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk'} +2026-01-19 23:23:02,393:DEBUG:acme.client:JWS payload: +b'' +2026-01-19 23:23:02,397:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/645727310096: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJINmNMVTZReVhlZlg1dkhIRi12NThOYUtFWnBTSm9qbHRjOVlWQTdjZGl3R1lrZWlUb0kiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ1NzI3MzEwMDk2In0", + "signature": "jEskIM41PEZyZXvBX9bbhcAhexqgHsghlR6-49N06bxG__TaF1qOUwxuuiOwn8Yc1dIeF7UZtsJ7PFgRiPpqXALB4JdanWpNJlOxJ9Oh2fpgOQYc1lQRXLLXhhpForvkVYQ8-Zi1BTW67lAAsuDvcaSkX2cKgvfIB4gSSQc9HKc7qS9OOJ_4Nt-nw6wzYulIatM6obyJQ-cqIyQUeb_o32Qkk9D_qoSQvQdauEN9dKEelcDfZfuP8ftQ4oQdmgivaRG20cXSpNwNothIPAuRr7qGD0aXAqEJ4xuJF1HTodBpGx8rdbq4xkWBZo1c8AfGzaoUBYINcjCpXhGrrJAqXw", + "payload": "" +} +2026-01-19 23:23:02,542:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/645727310096 HTTP/1.1" 200 824 +2026-01-19 23:23:02,543:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:23:02 GMT +Content-Type: application/json +Content-Length: 824 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: LJ8hB_GObI1igtZMJ_7FIg1uSds-71lVyW_wz4rjKUA1PV70tjI +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "code.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-26T23:22:57Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/UdlK3A", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/4gVIFA", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + } + ] +} +2026-01-19 23:23:02,543:DEBUG:acme.client:Storing nonce: LJ8hB_GObI1igtZMJ_7FIg1uSds-71lVyW_wz4rjKUA1PV70tjI +2026-01-19 23:23:02,544:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ', 'status': 'pending', 'token': 'OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk'} +2026-01-19 23:23:05,545:DEBUG:acme.client:JWS payload: +b'' +2026-01-19 23:23:05,549:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/645727310096: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJMSjhoQl9HT2JJMWlndFpNSl83RklnMXVTZHMtNzFsVnlXX3d6NHJqS1VBMVBWNzB0akkiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ1NzI3MzEwMDk2In0", + "signature": "hrcvIb-ySSzFksGWUhynvhOcKcQwS_Zh_DFJfrOTC5jfjC-PVmSMpvCC-mRCa6NMOV96DyGbgyz5IzyHCD9yzvjkRDPK9a0Oop0dsJiJ5Ixm69TIrlRu5p9IYfTGuAKGfvfMFC9BpRCdS5mG6F1-apbpoT8vfwaJH0r-lj0A8Y0MPR1o-2hDl-0XYqvuB_J2ZWodst3zQ_cjd_mAn4cB5HBdfOdqjWWLQGqWtbXDHn2eIkKSbVx1lKTmzx3vqwmoxrIatVZYOulxqwhxPl-SlMY9ESKJzob3sN9nqQk0xMZUUIeyv6v5-6CMTmwPASBFLkPuMXzOKNYdgKsk9GsnTw", + "payload": "" +} +2026-01-19 23:23:05,699:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/645727310096 HTTP/1.1" 200 824 +2026-01-19 23:23:05,700:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:23:05 GMT +Content-Type: application/json +Content-Length: 824 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: H6cLU6QySeySzz8V3vTQFdlNZY2jZrrzCJvwlSvnk9HqpgJZO6M +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "code.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-26T23:22:57Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/UdlK3A", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/4gVIFA", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + } + ] +} +2026-01-19 23:23:05,700:DEBUG:acme.client:Storing nonce: H6cLU6QySeySzz8V3vTQFdlNZY2jZrrzCJvwlSvnk9HqpgJZO6M +2026-01-19 23:23:05,701:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ', 'status': 'pending', 'token': 'OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk'} +2026-01-19 23:23:08,701:DEBUG:acme.client:JWS payload: +b'' +2026-01-19 23:23:08,705:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/645727310096: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJINmNMVTZReVNleVN6ejhWM3ZUUUZkbE5aWTJqWnJyekNKdndsU3ZuazlIcXBnSlpPNk0iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ1NzI3MzEwMDk2In0", + "signature": "RkGvG5Ru0ylhGeieJyy8m4LokD6OZWkAGRQ5pgiz4tADQ-prBpp7v7msDlL9jInOKBRlJjpW4uHj_qVOhn66jh730Kv3ikWjScOjDqZq0pZo5wQtxYKvdB1S0kPH0EzfzKISf5i0Gk4zXpPmlzJLUjAf1DSpZEdjg6j9e_gAkGqTGc0Bmu1EPfuuTCsEanmrLz3b21U5w5jQHPxtrJhQrxPJnwRupoB7tDJsbjF03VI325_2PCrzGomyxLM2vTNBtfYsJohIUgcvHtjq3S_PORkQO1cxaHNJnxizypaKzkbgm0v2b1yoLH6-EAvINRrXmEUug7gCfupWHXJHw09XGw", + "payload": "" +} +2026-01-19 23:23:08,863:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/645727310096 HTTP/1.1" 200 824 +2026-01-19 23:23:08,863:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:23:08 GMT +Content-Type: application/json +Content-Length: 824 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: H6cLU6QyW_h1dEOCzSRDzGsj3RAO2h4LeVqE-xQJF6xQrczS6OY +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "code.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-26T23:22:57Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/4gVIFA", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/UdlK3A", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + } + ] +} +2026-01-19 23:23:08,863:DEBUG:acme.client:Storing nonce: H6cLU6QyW_h1dEOCzSRDzGsj3RAO2h4LeVqE-xQJF6xQrczS6OY +2026-01-19 23:23:08,864:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ', 'status': 'pending', 'token': 'OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk'} +2026-01-19 23:23:11,864:DEBUG:acme.client:JWS payload: +b'' +2026-01-19 23:23:11,868:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/645727310096: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJINmNMVTZReVdfaDFkRU9DelNSRHpHc2ozUkFPMmg0TGVWcUUteFFKRjZ4UXJjelM2T1kiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ1NzI3MzEwMDk2In0", + "signature": "NTl09pUUkz6akrlQF0ZyRNGvToXO-KLGBm3l7bzUlnpmm8yVfwOXQ8LuzE1D7Er2urgBgGWbfqcBmdKmFpFWgio9d3M3AzpiiCAeB2e1pI-oU2idVLTsifuHT4y9P0ABT-UE_p4zv9i93-G-DMObBrMU5ppuWNr7d8KuSfC2AjdVUm5IYGmAJXaINSSCl_CQoSDxFYn-FTxVsXZ_tCNMuq39goAk3LLTuG5-7ZzWi8z5um8nN8n51EqlByd9IWLFiX38bfcUsvMJ9ztM3PVmk0JxFaEeNZHAArk0NSFE7EaVoe8EHVw6ym48bsu6VL4MrZoP2IvuzwQKCMGzeq7xlQ", + "payload": "" +} +2026-01-19 23:23:12,026:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/645727310096 HTTP/1.1" 200 824 +2026-01-19 23:23:12,027:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:23:11 GMT +Content-Type: application/json +Content-Length: 824 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: LJ8hB_GOt8vKjcAh9omXzSu-BapGXoWeLONnc0XfOXO5UDd6jAw +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "code.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-26T23:22:57Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/4gVIFA", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/UdlK3A", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + } + ] +} +2026-01-19 23:23:12,027:DEBUG:acme.client:Storing nonce: LJ8hB_GOt8vKjcAh9omXzSu-BapGXoWeLONnc0XfOXO5UDd6jAw +2026-01-19 23:23:12,028:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ', 'status': 'pending', 'token': 'OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk'} +2026-01-19 23:23:15,029:DEBUG:acme.client:JWS payload: +b'' +2026-01-19 23:23:15,032:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/645727310096: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJMSjhoQl9HT3Q4dktqY0FoOW9tWHpTdS1CYXBHWG9XZUxPTm5jMFhmT1hPNVVEZDZqQXciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ1NzI3MzEwMDk2In0", + "signature": "M8OwZONoJqkekHm0nfgPrDSOsAALTlkfON-VZTxSlg2aZaaRVAVVWvQkpvZX7bRrlwLSnZ_JW3t7HFUWhjxiW-ivCzskyRP0J1Q2mdTVdAcy0dOlh8Bzokg5RBAaw4E-FmdOfH-3KBT4JcYhyo3vKRV-ocLFFGEuZathaMkyVlPbDZG8d24YAHbIlHlH9EC0vlWj18lWKVLSEr8poHOIWQOGJUFhY-GsLJUnf-Ic6GuUidDcAsiiplkw6pBlHi-A4sUbugf3s6XuYuSFHoFbrJatovn8feRUUpLfBjTnlqQFlTBSjbcuIklP0xmpL_gjeJcCxF6mOWDyxqO305rGiQ", + "payload": "" +} +2026-01-19 23:23:15,188:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/645727310096 HTTP/1.1" 200 824 +2026-01-19 23:23:15,189:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:23:15 GMT +Content-Type: application/json +Content-Length: 824 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: LJ8hB_GOXfoJRc4k1Vvmgm4ROqU3tInRLq8fQPLkweKHYu07hgE +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "code.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-26T23:22:57Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/UdlK3A", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/4gVIFA", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + } + ] +} +2026-01-19 23:23:15,189:DEBUG:acme.client:Storing nonce: LJ8hB_GOXfoJRc4k1Vvmgm4ROqU3tInRLq8fQPLkweKHYu07hgE +2026-01-19 23:23:15,190:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ', 'status': 'pending', 'token': 'OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk'} +2026-01-19 23:23:18,191:DEBUG:acme.client:JWS payload: +b'' +2026-01-19 23:23:18,195:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/645727310096: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJMSjhoQl9HT1hmb0pSYzRrMVZ2bWdtNFJPcVUzdEluUkxxOGZRUExrd2VLSFl1MDdoZ0UiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ1NzI3MzEwMDk2In0", + "signature": "BkE_W8B4A0kE5JzRFw1JoAC0AdiUafXUyffXFrn222efXG13jYlpk0bmOweFoKJ6IIZfrOUfAvOFHCTOlVOgQZkr_lFopBOfcJv0W8m1aXF0YPWrArFzgt1XLjTCp7aD8YskJeNisMWl5Cq455KNRK7PsV1z5vSpR0IZ5F5sj66sL8h8j-3xCCo722tzG9C2br7Gx3tl_flhF48XGc9OkD3q9ANj7yaMlwtRh1fX_nHEW9IRkAGXiSFT7PKwHy2FUXcR4qx3YuT0uLy-gISjokpUHmX1Les_IiCaylAKZel3XmL__9FL-14OvVyee628JznRkB2aSYYOZy8cndfAlQ", + "payload": "" +} +2026-01-19 23:23:18,340:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/645727310096 HTTP/1.1" 200 824 +2026-01-19 23:23:18,341:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:23:18 GMT +Content-Type: application/json +Content-Length: 824 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: H6cLU6QymYuaBdieHs3XILzl9xtNDizdJFGnBg1Lebl9rrLQc34 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "code.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-26T23:22:57Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/4gVIFA", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/UdlK3A", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + } + ] +} +2026-01-19 23:23:18,342:DEBUG:acme.client:Storing nonce: H6cLU6QymYuaBdieHs3XILzl9xtNDizdJFGnBg1Lebl9rrLQc34 +2026-01-19 23:23:18,342:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ', 'status': 'pending', 'token': 'OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk'} +2026-01-19 23:23:21,343:DEBUG:acme.client:JWS payload: +b'' +2026-01-19 23:23:21,347:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/645727310096: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJINmNMVTZReW1ZdWFCZGllSHMzWElMemw5eHRORGl6ZEpGR25CZzFMZWJsOXJyTFFjMzQiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ1NzI3MzEwMDk2In0", + "signature": "Vbxuir7oygxmxVUIS-RrNmdjaJEZCmGM2Mpv9jBeERukJCRk2D_CHBmegqlKH2p_wEkmPi0gxV3a2uE6bDlX-3OQzbxnwyLjJfM4w4Ie8Cz5gM4oBF5-AXiknNIB4XY5bXX9WekzeBE2mkcCbkZdHjrqNL9uLDQa8eyrw--Zmx51XRuB-Nz4quO7cKCs8opTGJEuXYoQsVhvBz7vbsGCElh4mUW5PwLko-X6TcUZxwnS9nZJ9aMHmnmaRPox7AEbt9Bp7gaUEn8MBfKzIDGEMq8wvjP6ailpSOukDaio_DH_d5_bohTYUDKOWU2VM3zVO3x5fqIYqBVSeziqZZ4eZQ", + "payload": "" +} +2026-01-19 23:23:21,493:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/645727310096 HTTP/1.1" 200 824 +2026-01-19 23:23:21,494:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:23:21 GMT +Content-Type: application/json +Content-Length: 824 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: H6cLU6QyJp8VcLIvhIsITla8nFLdCwacdTJfMSU2m2qWjLWMSa4 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "code.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-26T23:22:57Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/4gVIFA", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/UdlK3A", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + } + ] +} +2026-01-19 23:23:21,494:DEBUG:acme.client:Storing nonce: H6cLU6QyJp8VcLIvhIsITla8nFLdCwacdTJfMSU2m2qWjLWMSa4 +2026-01-19 23:23:21,495:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ', 'status': 'pending', 'token': 'OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk'} +2026-01-19 23:23:24,496:DEBUG:acme.client:JWS payload: +b'' +2026-01-19 23:23:24,499:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/645727310096: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJINmNMVTZReUpwOFZjTEl2aElzSVRsYThuRkxkQ3dhY2RUSmZNU1UybTJxV2pMV01TYTQiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ1NzI3MzEwMDk2In0", + "signature": "aNsVUx-awrkwnVX3yR96B0pvCE6Wa0B4VX3LTDVrP6Gbq0HzA7iDw3KN0NjrGtwVeWBuOoXOusqplPjIjtsFW8ss9zWb15TjP2MpHVlN11r8lG4j22FGgJPepCVrDc5vwsfoXqihG8GdijdP8Luf6orF6uw_gCd929aWN12HMKNJD4VsIM-YL6aO17-FdySLmHtyUQ3nbsajmoxohZirRSBaHT7FQHh7tXU-5q7KFhkRwA8cX-ImdxkfZH5NnRFtUrzsD9u9Sj-Nggr0iFrGnZbxwkJJ-WIoTjukbh7eD_EkME7iR9zx7f7y-Gt3euDBM__clUyS43IUuJW04tQ9JA", + "payload": "" +} +2026-01-19 23:23:24,647:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/645727310096 HTTP/1.1" 200 824 +2026-01-19 23:23:24,648:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:23:24 GMT +Content-Type: application/json +Content-Length: 824 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: H6cLU6QyqsiJvfaiNPRUtQ-RCNbZBo0kZNgoe0_qVPLgbRd1Y-U +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "code.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-26T23:22:57Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/4gVIFA", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/UdlK3A", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + } + ] +} +2026-01-19 23:23:24,648:DEBUG:acme.client:Storing nonce: H6cLU6QyqsiJvfaiNPRUtQ-RCNbZBo0kZNgoe0_qVPLgbRd1Y-U +2026-01-19 23:23:24,649:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ', 'status': 'pending', 'token': 'OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk'} +2026-01-19 23:23:27,650:DEBUG:acme.client:JWS payload: +b'' +2026-01-19 23:23:27,654:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/645727310096: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJINmNMVTZReXFzaUp2ZmFpTlBSVXRRLVJDTmJaQm8wa1pOZ29lMF9xVlBMZ2JSZDFZLVUiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ1NzI3MzEwMDk2In0", + "signature": "iDVMN3VhdyTVwLgq-8OP2eV19Tj3S--16MNZ4Knp2U-6hLnHAs3uUNMa5aHtX7yqdahzmtAMtTwt5Ca0sOPdHrMzQhmezwmx6oUMXIKNT8aK3CN0cSoOU_HEgj54j39r5iTMIwYGInZaUBla4bJ9iEqygx85lVSP7-JxSLF50PEoq1BiczsreSOuinK0eSzKGIsql9BOCxuSkIZOxF851-o64kVAzG0HVJR-VzznPJVnpNFt5gcVyXn30-bNZ8sa54JXDRnUsTdAQBwFm6jk3l8K5Ca-7KMUwVb9CDSkYMcxNDrf4-Yr2sJ_hXNDjyQ3Z8QoeVXNGsHMa94IdgN6_w", + "payload": "" +} +2026-01-19 23:23:27,799:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/645727310096 HTTP/1.1" 200 824 +2026-01-19 23:23:27,800:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:23:27 GMT +Content-Type: application/json +Content-Length: 824 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: LJ8hB_GOzspeHKYpVZFDfDE2qSxPun8M0ef-9fG9v3jLhZl9o5w +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "code.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-26T23:22:57Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/4gVIFA", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/UdlK3A", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + } + ] +} +2026-01-19 23:23:27,801:DEBUG:acme.client:Storing nonce: LJ8hB_GOzspeHKYpVZFDfDE2qSxPun8M0ef-9fG9v3jLhZl9o5w +2026-01-19 23:23:27,801:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ', 'status': 'pending', 'token': 'OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk'} +2026-01-19 23:23:30,802:DEBUG:acme.client:JWS payload: +b'' +2026-01-19 23:23:30,806:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/645727310096: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJMSjhoQl9HT3pzcGVIS1lwVlpGRGZERTJxU3hQdW44TTBlZi05Zkc5djNqTGhabDlvNXciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ1NzI3MzEwMDk2In0", + "signature": "gY9qNcSPeXBhp2XhJe1XlZTR8ajwzVt9gVC8YvhPnHoc1JpzryRTozd-fAH3HaBQxJQ9lOTockECFCtTaR00UofbTzbloPI45ApifB1ArlYyNbqduPrNdI1HGSXcVCZee0p9NFT-pUZT1GhhDvIhBCFTSi3ZraTF0bSyl9QLtFTFhtRM6vbYCas0edXoNsqSQEMYJ8x24_X2axYLy5VEygcWsQKmcnHU0L1_ROCthZcLTF_iEZLy0gL7k2b__Ji9l7cGLOJcUGboCzmI9wSB8bHX1aid2r_x_y9D6tVWDCPTqLEVd1oBeVlqFOzj-J6jjiVtNZkRIF2tNQgCmqWp1g", + "payload": "" +} +2026-01-19 23:23:30,951:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/645727310096 HTTP/1.1" 200 824 +2026-01-19 23:23:30,951:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:23:30 GMT +Content-Type: application/json +Content-Length: 824 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: H6cLU6QyAxHxsu0LOdy1fWMzgrzMXj0EouKxdoDlZScE8If5zvE +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "code.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-26T23:22:57Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/UdlK3A", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/4gVIFA", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + } + ] +} +2026-01-19 23:23:30,951:DEBUG:acme.client:Storing nonce: H6cLU6QyAxHxsu0LOdy1fWMzgrzMXj0EouKxdoDlZScE8If5zvE +2026-01-19 23:23:30,952:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ', 'status': 'pending', 'token': 'OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk'} +2026-01-19 23:23:33,952:DEBUG:acme.client:JWS payload: +b'' +2026-01-19 23:23:33,956:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/645727310096: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJINmNMVTZReUF4SHhzdTBMT2R5MWZXTXpncnpNWGowRW91S3hkb0RsWlNjRThJZjV6dkUiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ1NzI3MzEwMDk2In0", + "signature": "jUqfXak1rcS9J2GNzN7S5Ia1V-ER6vLOTYfp07zOYV5wdesRgrLl6cbGteFe37eHDlWDOotKzaUeNaTmVl8ehDKLKs6X7K361RFUvlOd8msfpPQl1xDWuGnGQLd-dpMT28fJrVsgwRpbl-WAqfBouOZkJy4QEnr3AxXx8DPpjW2tIkwz3668VYAI-ITyR6qyTj1vbdbeioDu-7ogvxMx1gzQaDc87jKjjvksL5lf1JRMb74GIIjwK-3EO2522eXFNmPTFWPmT0R_KRk4eDp100Cx38dF-8goob044DuJKBL5Z9MFWXPHQiYF3KMIdUEW0htXg0WIIxsORsRNa5Xzhg", + "payload": "" +} +2026-01-19 23:23:34,102:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/645727310096 HTTP/1.1" 200 824 +2026-01-19 23:23:34,103:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:23:34 GMT +Content-Type: application/json +Content-Length: 824 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: H6cLU6Qy1Dtab6AzLuAg6yB3vYePadKMPn2SxJ3_j4b888pnocI +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "code.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-26T23:22:57Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/UdlK3A", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/4gVIFA", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + } + ] +} +2026-01-19 23:23:34,103:DEBUG:acme.client:Storing nonce: H6cLU6Qy1Dtab6AzLuAg6yB3vYePadKMPn2SxJ3_j4b888pnocI +2026-01-19 23:23:34,104:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ', 'status': 'pending', 'token': 'OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk'} +2026-01-19 23:23:37,105:DEBUG:acme.client:JWS payload: +b'' +2026-01-19 23:23:37,109:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/645727310096: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJINmNMVTZReTFEdGFiNkF6THVBZzZ5QjN2WWVQYWRLTVBuMlN4SjNfajRiODg4cG5vY0kiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ1NzI3MzEwMDk2In0", + "signature": "bjRRmgwo8S2L4Gvxlf-z4waBSLIf6UkvPfwp8jEUgxrChIcy3IygmrD9-LJqPHrtfJGO15QdHAL24VuOODUOTEheGMhsHJWPgwtLBX39rMSiQQiCFd_yv-95Y-c4fmm4GMBOOnCVL9xo373-UESpnHm3ZFN2Vot5PCKRwO8Y4VmYCrfY_o_uMO8h02eZLVgWP7gy81D9RTnBtAYRCqv4yULt3llRbpKKlTdtLhKeJaVxb1rDfs3iSCB4wC_lfnJ1Sc-4R928CZ0OlwTemsYrtWv6h_al4ZRsIIXkh2J8xkj-WjfFsGGXF5-o3lqd4uk3-r6e_FKI8t6F1sABsdVNGA", + "payload": "" +} +2026-01-19 23:23:37,302:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/645727310096 HTTP/1.1" 200 824 +2026-01-19 23:23:37,303:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:23:37 GMT +Content-Type: application/json +Content-Length: 824 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: LJ8hB_GOyVJ9aTSmDZZyWqRglWV22cYf98Q0g9uQPNG7Qcdt05A +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "code.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-26T23:22:57Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/UdlK3A", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/4gVIFA", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + } + ] +} +2026-01-19 23:23:37,303:DEBUG:acme.client:Storing nonce: LJ8hB_GOyVJ9aTSmDZZyWqRglWV22cYf98Q0g9uQPNG7Qcdt05A +2026-01-19 23:23:37,304:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ', 'status': 'pending', 'token': 'OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk'} +2026-01-19 23:23:40,305:DEBUG:acme.client:JWS payload: +b'' +2026-01-19 23:23:40,308:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/645727310096: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJMSjhoQl9HT3lWSjlhVFNtRFpaeVdxUmdsV1YyMmNZZjk4UTBnOXVRUE5HN1FjZHQwNUEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ1NzI3MzEwMDk2In0", + "signature": "lwTh31P1OxMG9rIgQgXE4SX7UnCuLttaaCNuAjIrGtMfSs1Ad9NRDZmVeRB8gmAL9NSvCoJ6foWJpqksYiuzGm46xIMlLIAFPYC4UP-VEjP2KGq0sSWKkhziYzxmzj6hFp3k5vtc7LSWSJG6REIT_2bJY5mYC1p4zn0qi414y9-2k5eTE3qiDgOxYxcRrxusQTHUDhwMthO9tmxN8oNsvIIlO6C25kK0ULWNjVLdCZcGaLkz_lJAW5Fs-SRqxX2DPzbekADKylLh_7f2maOExphBkCZoQwb-EmJogb7KWZyhME5U2HjveEMqY9C6Ma_grSqrCncq5jUMjicQKIe_tg", + "payload": "" +} +2026-01-19 23:23:40,478:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/645727310096 HTTP/1.1" 200 824 +2026-01-19 23:23:40,479:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:23:40 GMT +Content-Type: application/json +Content-Length: 824 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: H6cLU6QypbTOnHfUldamOCal40Up8OE-WOtC4NpjB7T5Q71xsd4 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "code.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-26T23:22:57Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/UdlK3A", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/4gVIFA", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + } + ] +} +2026-01-19 23:23:40,480:DEBUG:acme.client:Storing nonce: H6cLU6QypbTOnHfUldamOCal40Up8OE-WOtC4NpjB7T5Q71xsd4 +2026-01-19 23:23:40,480:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ', 'status': 'pending', 'token': 'OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk'} +2026-01-19 23:23:43,481:DEBUG:acme.client:JWS payload: +b'' +2026-01-19 23:23:43,485:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/645727310096: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJINmNMVTZReXBiVE9uSGZVbGRhbU9DYWw0MFVwOE9FLVdPdEM0TnBqQjdUNVE3MXhzZDQiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ1NzI3MzEwMDk2In0", + "signature": "dOxDIiiCZ3DdovX_8JvKFOfDlKcxlEqpDoYBcrjQMsqIRj-iUhm6ZqGxHEFPClYAoFKaZ_9nrPDPJEncHDfAg2i79CawippOFTA0hI5pSn9QAnpcuylDJSMGM84cwy8cjqrhejzYIb2OOstqGITLf4ycdV25_FdY0Yc7d4vxgVmDD_cOjmfQysIfmdoHAp_HqHPZJg76hoZakdVRsQMIeDgwU2uGiMUFmQGoR5SfadO39toSlXUBs_69Q9FBi8_rpT1ZL31TPMQs3sg3d8E6Ffd1AJeRj8W6BuG1t4kD_bW4m6JB-KAnnxI4O4NzNboq6HYwtT_X0AXmYmfuy3esrw", + "payload": "" +} +2026-01-19 23:23:43,629:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/645727310096 HTTP/1.1" 200 824 +2026-01-19 23:23:43,630:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:23:43 GMT +Content-Type: application/json +Content-Length: 824 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: LJ8hB_GOcu6hsc12aNy5ILMREWhD9qZHHX8WwYbLjorJoyNfLDE +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "code.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-26T23:22:57Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/UdlK3A", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/4gVIFA", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + } + ] +} +2026-01-19 23:23:43,631:DEBUG:acme.client:Storing nonce: LJ8hB_GOcu6hsc12aNy5ILMREWhD9qZHHX8WwYbLjorJoyNfLDE +2026-01-19 23:23:43,631:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ', 'status': 'pending', 'token': 'OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk'} +2026-01-19 23:23:46,632:DEBUG:acme.client:JWS payload: +b'' +2026-01-19 23:23:46,636:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/645727310096: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJMSjhoQl9HT2N1NmhzYzEyYU55NUlMTVJFV2hEOXFaSEhYOFd3WWJMam9ySm95TmZMREUiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ1NzI3MzEwMDk2In0", + "signature": "VDw0aUHOhtmrIbTrr7c1ogZhe3QDJVC-19ElEn2C8uN_yGzauwA065017BtbKDI_tjJIPDjWU2uD_9GUb3VayojujNNtFDPJAl7cGhvrUv4WQ_sWx4MmQkTRJ3J5-MBv4rZixcMQ9cLGSluJE7aT6GmSFaT-vq0FtK7OsdNYGrUvzeHyqu2fXhyYVGVPh44BjhfSioy1mKyMSNZG2Gn1ngCp9uPVIBW9UEmFpXxGGr5LSHUrllIR-F95ZaQuy9TG2HAAZwNhuxIXc8RxQSJfBRpHw5lb8I7V6rmLgGX279GbpCNNwDsxB9p3Ybe3HsumbsMRD3n3GRhIDKn_eOYtfA", + "payload": "" +} +2026-01-19 23:23:46,782:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/645727310096 HTTP/1.1" 200 824 +2026-01-19 23:23:46,783:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:23:46 GMT +Content-Type: application/json +Content-Length: 824 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: H6cLU6QyoMtUjE7tOnjoecsUxv5Rg0YJtClvAZhzaNmIgXgYXjw +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "code.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-26T23:22:57Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/UdlK3A", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/4gVIFA", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + } + ] +} +2026-01-19 23:23:46,783:DEBUG:acme.client:Storing nonce: H6cLU6QyoMtUjE7tOnjoecsUxv5Rg0YJtClvAZhzaNmIgXgYXjw +2026-01-19 23:23:46,784:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ', 'status': 'pending', 'token': 'OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk'} +2026-01-19 23:23:49,785:DEBUG:acme.client:JWS payload: +b'' +2026-01-19 23:23:49,789:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/645727310096: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJINmNMVTZReW9NdFVqRTd0T25qb2Vjc1V4djVSZzBZSnRDbHZBWmh6YU5tSWdYZ1lYanciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ1NzI3MzEwMDk2In0", + "signature": "E8nLRr43T3Ca5LmO0QkJ0bWNI2KCmm62HBIqGbD2HVjrvflsntYqb9qnKttNLKNFEVUKTl_xkcBxys_TbEJvPlbk8RtjZyjd2aj4MCqVC4_PQyqId5olqpI3khSRNkNl8p-UoMj8myYFYhWJS6HgZw4D4SDs8TbNhWkELhPYpFqHNXoX-l4O8poiTnhyGcLvwQHpjbJCaweNkNVrUULwDnNhJgi4TW0kfyTcK656VvjdB-dEeIzmG26pekxS-RX_Y8fmxBswc8-a2dgyn3Kw1odZaQg6u6tyGnNKNNlxQ_z8vuYL2iAbvs-6JKr1mxJYydQH0-5YcOSFyWZ73weRcw", + "payload": "" +} +2026-01-19 23:23:49,934:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/645727310096 HTTP/1.1" 200 824 +2026-01-19 23:23:49,934:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:23:49 GMT +Content-Type: application/json +Content-Length: 824 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: H6cLU6QyppnRkPpAGyUAhYt6jmIXL1kLJscsr6c8mH86ja09OGY +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "code.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-26T23:22:57Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/4gVIFA", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/UdlK3A", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + } + ] +} +2026-01-19 23:23:49,935:DEBUG:acme.client:Storing nonce: H6cLU6QyppnRkPpAGyUAhYt6jmIXL1kLJscsr6c8mH86ja09OGY +2026-01-19 23:23:49,935:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ', 'status': 'pending', 'token': 'OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk'} +2026-01-19 23:23:52,936:DEBUG:acme.client:JWS payload: +b'' +2026-01-19 23:23:52,939:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/645727310096: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJINmNMVTZReXBwblJrUHBBR3lVQWhZdDZqbUlYTDFrTEpzY3NyNmM4bUg4NmphMDlPR1kiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ1NzI3MzEwMDk2In0", + "signature": "P6XlccrLdjqKpjDk71gRl5Vyh6tiiLyN2Nnn6uvZeS68Xy0xMD2oWzhW9FJ5b7VHxlXH2RiWYjp_NgcJW_ZwinWTwIZH6dmukLiWbyce8IC-k0DyAwbmGMqsi8IiI5c-_q6f_Hr7gJlzFk7GWF5-5vEtp3-01xF35lTk5YzM5W8XALwsu1UvSWGDia9gwiRCMuB8EhV9xwCVGYifv1CY-i3bllWQNPQ2XoXjS2a2F2mSMjupA4VYD1dfyqTHo1eF-ZXDiE-q8OEB-pnJFOAQkk8O09rxYg1uyH4rMW5I_2GnB6lkYkn4GeCypMxSytS2D7wgGNfV_6b6tPX7hCOMtA", + "payload": "" +} +2026-01-19 23:23:53,095:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/645727310096 HTTP/1.1" 200 824 +2026-01-19 23:23:53,096:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:23:53 GMT +Content-Type: application/json +Content-Length: 824 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: LJ8hB_GOwCvmTpWDb8XFDrwkYJ6xHKU1jCKmoBHgOf2WWkQcfHE +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "code.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-26T23:22:57Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/UdlK3A", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/4gVIFA", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + } + ] +} +2026-01-19 23:23:53,097:DEBUG:acme.client:Storing nonce: LJ8hB_GOwCvmTpWDb8XFDrwkYJ6xHKU1jCKmoBHgOf2WWkQcfHE +2026-01-19 23:23:53,097:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ', 'status': 'pending', 'token': 'OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk'} +2026-01-19 23:23:56,098:DEBUG:acme.client:JWS payload: +b'' +2026-01-19 23:23:56,102:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/645727310096: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJMSjhoQl9HT3dDdm1UcFdEYjhYRkRyd2tZSjZ4SEtVMWpDS21vQkhnT2YyV1drUWNmSEUiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ1NzI3MzEwMDk2In0", + "signature": "Wefm4LG9_XBzBe2HIk0FD7Zq4GJnv6G9e38ShuS_IrCGfvK-IyiFNp02Blc15BYVAhkyHevIq0mrbud07PlG2LW4Q8P4fJ9TQgGj1gP6SXCtQWj4jpRmPG2Xry9ad3Qbqzui7wFML4xDPOcWT1HzDMWFN3lYtR36M8xLl1p2eVmQOj59g4UCVxGdYC2qpmt-qKFjw7C_PBPGpYcoIGSOFG7A463pnkwhjJVFqCtnHYG9dnIbjqu76DJ4OOKwRkzmrKvwIZf6RET3Jbl08kB5-HWGnWwX2bYlvHD_CdTPn8mgwsg2io0FJup7RlyFsJTTD-cWIlNWyOp_cbZ8BhMbmw", + "payload": "" +} +2026-01-19 23:23:56,248:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/645727310096 HTTP/1.1" 200 824 +2026-01-19 23:23:56,249:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:23:56 GMT +Content-Type: application/json +Content-Length: 824 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: LJ8hB_GODy_A5DkD3Bj8RtODYq6X_FONOXqb5IlVfuyXb8YuTOY +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "code.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-26T23:22:57Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/4gVIFA", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/UdlK3A", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + } + ] +} +2026-01-19 23:23:56,249:DEBUG:acme.client:Storing nonce: LJ8hB_GODy_A5DkD3Bj8RtODYq6X_FONOXqb5IlVfuyXb8YuTOY +2026-01-19 23:23:56,250:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ', 'status': 'pending', 'token': 'OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk'} +2026-01-19 23:23:59,251:DEBUG:acme.client:JWS payload: +b'' +2026-01-19 23:23:59,254:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/645727310096: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJMSjhoQl9HT0R5X0E1RGtEM0JqOFJ0T0RZcTZYX0ZPTk9YcWI1SWxWZnV5WGI4WXVUT1kiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ1NzI3MzEwMDk2In0", + "signature": "kYEntwtsakB_Wj5vBV-FYeNkkftra0gSIIslx-uA0d04tJ8VJTnXsuTSMFaSIziPTsrxY2B04JB8azIfeX5TlkH2ryNfKi7SoylW7MqufETgt0PLuNLO_t441uWkorW3pLPhWVsYd8l5Lp44TW0FL9Ey9h4LJ_BzoI7WQzBuWNKrOdGt5G9CAjuhKg9lFzcVgo2myqEgko_B1PF7Ntfq3046Ge7ESBmU-71YQ75ZYMU7nGZVdDyglRlcyKubxhHK9pf7KSBqDS4VIKWw7nF_8U3n20wXV0s880qlNyF3xNOh5KtxPhxIU7zVch5_pCi0rx0JCfUwXKpTYeH1xEW6EA", + "payload": "" +} +2026-01-19 23:23:59,399:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/645727310096 HTTP/1.1" 200 824 +2026-01-19 23:23:59,400:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:23:59 GMT +Content-Type: application/json +Content-Length: 824 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: LJ8hB_GOFTomAL70X42Ai7kUXDH1lT4enIflHmt_c9s0aG80XDU +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "code.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-26T23:22:57Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/UdlK3A", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/4gVIFA", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ", + "status": "pending", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk" + } + ] +} +2026-01-19 23:23:59,400:DEBUG:acme.client:Storing nonce: LJ8hB_GOFTomAL70X42Ai7kUXDH1lT4enIflHmt_c9s0aG80XDU +2026-01-19 23:23:59,401:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/GGgtbQ', 'status': 'pending', 'token': 'OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk'} +2026-01-19 23:24:02,402:DEBUG:acme.client:JWS payload: +b'' +2026-01-19 23:24:02,406:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/645727310096: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJMSjhoQl9HT0ZUb21BTDcwWDQyQWk3a1VYREgxbFQ0ZW5JZmxIbXRfYzlzMGFHODBYRFUiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjQ1NzI3MzEwMDk2In0", + "signature": "Xk1B9KbJ5O51w1qmoIFjFqvi8qJvAazEpmavi6FSzr1a7HkUB56NKnxmkWlBxgi4rLMCGZQWpfryAnPI-5I82DIm8tWz4Wl3WzHQNir2uMBsIeLjqa6-O4wakOIVVxbZNTOoY1J0mjQY9uOy9rx_YLKKc-njmxkHK4ITwks7N9oBMXw4TTUkqPv5VyuY3qEiSLGuUlyLKLjaWe6uuaChgVfjsuUFYHbiYjn4_P5Y9SuncU8BnCCkJcEPEaRWDVSGOygrjuPlBzq2kZKuChiR2nFq6XPiN0rp5ZRS2v8PihA85TTllbsyf5VE4JkH0JKMk1rp1r30zQOx1zF8VvWN_g", + "payload": "" +} +2026-01-19 23:24:02,550:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/645727310096 HTTP/1.1" 200 769 +2026-01-19 23:24:02,551:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:24:02 GMT +Content-Type: application/json +Content-Length: 769 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: H6cLU6QyGQJu-3uliVlOsEpNxSJtob4_0Wu7OhUDHpHk13mTIXk +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "code.profibot.hu" + }, + "status": "valid", + "expires": "2026-02-18T23:23:59Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/645727310096/4gVIFA", + "status": "valid", + "validated": "2026-01-19T23:22:58Z", + "token": "OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk", + "validationRecord": [ + { + "url": "http://code.profibot.hu/.well-known/acme-challenge/OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk", + "hostname": "code.profibot.hu", + "port": "80", + "addressesResolved": [ + "91.82.83.208" + ], + "addressUsed": "91.82.83.208" + } + ] + } + ] +} +2026-01-19 23:24:02,551:DEBUG:acme.client:Storing nonce: H6cLU6QyGQJu-3uliVlOsEpNxSJtob4_0Wu7OhUDHpHk13mTIXk +2026-01-19 23:24:02,552:DEBUG:certbot._internal.error_handler:Calling registered functions +2026-01-19 23:24:02,552:INFO:certbot._internal.auth_handler:Cleaning up challenges +2026-01-19 23:24:02,553:DEBUG:certbot._internal.plugins.webroot:Removing /data/letsencrypt-acme-challenge/.well-known/acme-challenge/OY8EgzG_DxGczkjfmz7irLUy93iKkgNOuZAzNEr7tWk +2026-01-19 23:24:02,553:DEBUG:certbot._internal.plugins.webroot:All challenges cleaned up +2026-01-19 23:24:02,554:DEBUG:certbot._internal.client:CSR: CSR(file=None, data=b'-----BEGIN CERTIFICATE REQUEST-----\nMIIBJjCBrQIBADAAMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAErDxNgjojpHc9JDAk\n0SKRrHzGUsCkyyvWhClaS9xHutZLnQzJMGtrKkiAecQu8HUzVr1TqThfmmSeLWL6\nWF0lY/84tsz0gtsJ1sjS61R+SI/nbJ3v91XqBHQiMHAPo60koC4wLAYJKoZIhvcN\nAQkOMR8wHTAbBgNVHREEFDASghBjb2RlLnByb2ZpYm90Lmh1MAoGCCqGSM49BAMC\nA2gAMGUCMB9YE/tvVAUzL5tryvQKSANR4AjNoxvxC5SOYeGc0157tBYR+YDIMMOP\nxHLSKOe+1QIxAM0tHr4FTMvmD8zIcXc1/EUAkTXnF/4dEJTHLIVmNYRkJFx9db7G\nRDOBgICf3UqEZQ==\n-----END CERTIFICATE REQUEST-----\n', form='pem') +2026-01-19 23:24:02,555:DEBUG:certbot._internal.client:Will poll for certificate issuance until 2026-01-19 23:25:32.554980 +2026-01-19 23:24:02,555:DEBUG:acme.client:JWS payload: +b'{\n "csr": "MIIBJjCBrQIBADAAMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAErDxNgjojpHc9JDAk0SKRrHzGUsCkyyvWhClaS9xHutZLnQzJMGtrKkiAecQu8HUzVr1TqThfmmSeLWL6WF0lY_84tsz0gtsJ1sjS61R-SI_nbJ3v91XqBHQiMHAPo60koC4wLAYJKoZIhvcNAQkOMR8wHTAbBgNVHREEFDASghBjb2RlLnByb2ZpYm90Lmh1MAoGCCqGSM49BAMCA2gAMGUCMB9YE_tvVAUzL5tryvQKSANR4AjNoxvxC5SOYeGc0157tBYR-YDIMMOPxHLSKOe-1QIxAM0tHr4FTMvmD8zIcXc1_EUAkTXnF_4dEJTHLIVmNYRkJFx9db7GRDOBgICf3UqEZQ"\n}' +2026-01-19 23:24:02,559:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/471340543716: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJINmNMVTZReUdRSnUtM3VsaVZsT3NFcE54U0p0b2I0XzBXdTdPaFVESHBIazEzbVRJWGsiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2ZpbmFsaXplLzI5MDY0MzgxNzYvNDcxMzQwNTQzNzE2In0", + "signature": "jzOIE6w2UtSDjMmxTXI561eq10uaJYu8ODx47Pa0Yrl2KkDRH4maZico3qLER8rRSP3exBwExuEp2pphl1qjrxaoZG4gxnFXT3hDxJnoIJCvSdkCq63D5Z3UUJ8vV2qjU7J3b4NKCJ3sb1Wsqz2eMZXekFwKbSj_HJEg06bdy2BEnjSKFQf2JuAX0iP5v-YxoD_XdVC5Sg4uOypZjad84O6ogpj_ZVWinbVk1LSlIUQW8S10XfLqq2z6Q5SUY9HsSzlgFpMuA3Xsrfr1_VFWX81ohFhSBR0-VD3Tc5gecOKHvTpOkmm0sVWN0gQzJmF8OkPKHFF4rMQvlam618Ux3Q", + "payload": "ewogICJjc3IiOiAiTUlJQkpqQ0JyUUlCQURBQU1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFckR4Tmdqb2pwSGM5SkRBazBTS1JySHpHVXNDa3l5dldoQ2xhUzl4SHV0WkxuUXpKTUd0cktraUFlY1F1OEhVelZyMVRxVGhmbW1TZUxXTDZXRjBsWV84NHRzejBndHNKMXNqUzYxUi1TSV9uYkozdjkxWHFCSFFpTUhBUG82MGtvQzR3TEFZSktvWklodmNOQVFrT01SOHdIVEFiQmdOVkhSRUVGREFTZ2hCamIyUmxMbkJ5YjJacFltOTBMbWgxTUFvR0NDcUdTTTQ5QkFNQ0EyZ0FNR1VDTUI5WUVfdHZWQVV6TDV0cnl2UUtTQU5SNEFqTm94dnhDNVNPWWVHYzAxNTd0QllSLVlESU1NT1B4SExTS09lLTFRSXhBTTB0SHI0RlRNdm1EOHpJY1hjMV9FVUFrVFhuRl80ZEVKVEhMSVZtTllSa0pGeDlkYjdHUkRPQmdJQ2YzVXFFWlEiCn0" +} +2026-01-19 23:24:04,944:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/finalize/2906438176/471340543716 HTTP/1.1" 200 452 +2026-01-19 23:24:04,945:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:24:04 GMT +Content-Type: application/json +Content-Length: 452 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/471340543716 +Replay-Nonce: H6cLU6Qypv3dO40vW5IdXJ0SaNxTFZKLV-htrTl5OXrpuWwoUA8 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "valid", + "expires": "2026-01-26T23:22:57Z", + "identifiers": [ + { + "type": "dns", + "value": "code.profibot.hu" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/645727310096" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/471340543716", + "certificate": "https://acme-v02.api.letsencrypt.org/acme/cert/066915db0d8c6c725fc46c163eb9f49ae7be" +} +2026-01-19 23:24:04,946:DEBUG:acme.client:Storing nonce: H6cLU6Qypv3dO40vW5IdXJ0SaNxTFZKLV-htrTl5OXrpuWwoUA8 +2026-01-19 23:24:05,947:DEBUG:acme.client:JWS payload: +b'' +2026-01-19 23:24:05,950:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/order/2906438176/471340543716: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJINmNMVTZReXB2M2RPNDB2VzVJZFhKMFNhTnhURlpLTFYtaHRyVGw1T1hycHVXd29VQTgiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL29yZGVyLzI5MDY0MzgxNzYvNDcxMzQwNTQzNzE2In0", + "signature": "VC_8pqdEkSOJ8hEzcps_ZJifOrLNpFeQpEnPmZpy8hWhZvQVxA9N72CnWq2FA_PbmEFK4uqfKLrLnB6EVm2R7_xTfD1dh4Jxe7uMJW5Zn8nihJKVUM1g4CTb7JZ0DM4msFoAcsWbYktiKJH9dN2lg9f9Tkge0hGB9YyD_Ca8sGNZQl0oH0j7ZDQGIUPMRlQOpzrQ-IQ1AIir_KV8DM3w5x7WuQKLtmjIcL0lEjlKaLDJx7BbTIt3sw-XWCkoRC4oh37lfeAMJrHzP-55xS345VX24p634XhJImJOQiKBd9D0AzsM4lQOdgq2Pd8QYvOohDNa27xQUuhNe5tnWNkUUw", + "payload": "" +} +2026-01-19 23:24:06,106:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/order/2906438176/471340543716 HTTP/1.1" 200 452 +2026-01-19 23:24:06,107:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:24:06 GMT +Content-Type: application/json +Content-Length: 452 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/471340543716 +Replay-Nonce: LJ8hB_GO6d5s4dK2eIxP0KygQOynEkG7fSMpQlga83oWOtYIeyM +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "valid", + "expires": "2026-01-26T23:22:57Z", + "identifiers": [ + { + "type": "dns", + "value": "code.profibot.hu" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/645727310096" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/471340543716", + "certificate": "https://acme-v02.api.letsencrypt.org/acme/cert/066915db0d8c6c725fc46c163eb9f49ae7be" +} +2026-01-19 23:24:06,108:DEBUG:acme.client:Storing nonce: LJ8hB_GO6d5s4dK2eIxP0KygQOynEkG7fSMpQlga83oWOtYIeyM +2026-01-19 23:24:06,108:DEBUG:acme.client:JWS payload: +b'' +2026-01-19 23:24:06,112:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/cert/066915db0d8c6c725fc46c163eb9f49ae7be: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJMSjhoQl9HTzZkNXM0ZEsyZUl4UDBLeWdRT3luRWtHN2ZTTXBRbGdhODNvV090WUlleU0iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NlcnQvMDY2OTE1ZGIwZDhjNmM3MjVmYzQ2YzE2M2ViOWY0OWFlN2JlIn0", + "signature": "fzs37eev-CgZY9wuE-Glm_5RMjVHQrffx44YRxKT5v3zrvjH8d2HoZrWkvHG4QSSAy9Y-OHeRl3uvRKYgi1Fvowvt52xlqwpD1E7aJMgjtfgEKQ8ISex89ou49d_I4vXI6T-SqECxLvKhkPIVgxmhSAkXHdnfPuh7Vuimd_x5jzMmAgYZ6C-MKtkxhfAPY5sXLBAA0tlVXd2UywFYQpcY8n66ePjKzGG6z8tEQKt3A8xF_NGZWx15wfpJhjUK8hgs4lN1YIcNymHlFHYFD4_oj9CQ2LsS0FDLHH_qW1Il9RzY13vKOwD0kVkWEU0EvMW1aiV-32qEZAFplMk0oXoKQ", + "payload": "" +} +2026-01-19 23:24:06,284:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/cert/066915db0d8c6c725fc46c163eb9f49ae7be HTTP/1.1" 200 2913 +2026-01-19 23:24:06,285:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:24:06 GMT +Content-Type: application/pem-certificate-chain +Content-Length: 2913 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="alternate" +Replay-Nonce: H6cLU6Qy_YKMbcycdtTSKF8t46hYS7U7Dylk3ffb1nMR8t8WdVw +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +-----BEGIN CERTIFICATE----- +MIIDtDCCAzqgAwIBAgISBmkV2w2MbHJfxGwWPrn0mue+MAoGCCqGSM49BAMDMDIx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF +ODAeFw0yNjAxMTkyMjI1MzJaFw0yNjA0MTkyMjI1MzFaMBsxGTAXBgNVBAMTEGNv +ZGUucHJvZmlib3QuaHUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASsPE2COiOkdz0k +MCTRIpGsfMZSwKTLK9aEKVpL3Ee61kudDMkwa2sqSIB5xC7wdTNWvVOpOF+aZJ4t +YvpYXSVj/zi2zPSC2wnWyNLrVH5Ij+dsne/3VeoEdCIwcA+jrSSjggIoMIICJDAO +BgNVHQ8BAf8EBAMCB4AwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwG +A1UdEwEB/wQCMAAwHQYDVR0OBBYEFJmpM2JIEFF0i4mlT394RM2hwG59MB8GA1Ud +IwQYMBaAFI8NE6L2Ln7RUGwzGDhdWY4jcpHKMDIGCCsGAQUFBwEBBCYwJDAiBggr +BgEFBQcwAoYWaHR0cDovL2U4LmkubGVuY3Iub3JnLzAbBgNVHREEFDASghBjb2Rl +LnByb2ZpYm90Lmh1MBMGA1UdIAQMMAowCAYGZ4EMAQIBMC0GA1UdHwQmMCQwIqAg +oB6GHGh0dHA6Ly9lOC5jLmxlbmNyLm9yZy82My5jcmwwggEOBgorBgEEAdZ5AgQC +BIH/BIH8APoAdwBkEcRspBLsp4kcogIuALyrTygH1B41J6vq/tUDyX3N8AAAAZvY +kpVyAAAEAwBIMEYCIQCtu3+le9jx12Df9gMli93P6z2yqK0e+1HmPtvoOc3tKwIh +AI//5jQe3jAgl3vBAD/dWn6DOCPf3/czz0W0gyZhCCNFAH8A4yON8o2iiOCq4Kzw ++pDJhfC2v/XSpSewAfwcRFjEtugAAAGb2JKYKwAIAAAFAC/n7DUEAwBIMEYCIQD2 +yKJ9EVEsYAZq9znoa2euJY0Kr1LKB3KMExhTRjGfCgIhANOZDKgSHDcaPg4D2tBi +vIe87PVD/6NrFrOMtOw9FrkIMAoGCCqGSM49BAMDA2gAMGUCMAVicdAlQJmbHtq1 +GKKwmFcOd10qoxkmtn2vjgalK8gmwFu4Yxz4PTrh65f/2uWXUwIxAJhDz1Dzy/jK +cA+/NqjqmSk3ZHT641YWVkExSKlwyVDCRciScnh0dtTAieWoQ0eGWQ== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIEVjCCAj6gAwIBAgIQY5WTY8JOcIJxWRi/w9ftVjANBgkqhkiG9w0BAQsFADBP +MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy +Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa +Fw0yNzAzMTIyMzU5NTlaMDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF +bmNyeXB0MQswCQYDVQQDEwJFODB2MBAGByqGSM49AgEGBSuBBAAiA2IABNFl8l7c +S7QMApzSsvru6WyrOq44ofTUOTIzxULUzDMMNMchIJBwXOhiLxxxs0LXeb5GDcHb +R6EToMffgSZjO9SNHfY9gjMy9vQr5/WWOrQTZxh7az6NSNnq3u2ubT6HTKOB+DCB +9TAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB +MBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFI8NE6L2Ln7RUGwzGDhdWY4j +cpHKMB8GA1UdIwQYMBaAFHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEB +BCYwJDAiBggrBgEFBQcwAoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzATBgNVHSAE +DDAKMAgGBmeBDAECATAnBgNVHR8EIDAeMBygGqAYhhZodHRwOi8veDEuYy5sZW5j +ci5vcmcvMA0GCSqGSIb3DQEBCwUAA4ICAQBnE0hGINKsCYWi0Xx1ygxD5qihEjZ0 +RI3tTZz1wuATH3ZwYPIp97kWEayanD1j0cDhIYzy4CkDo2jB8D5t0a6zZWzlr98d +AQFNh8uKJkIHdLShy+nUyeZxc5bNeMp1Lu0gSzE4McqfmNMvIpeiwWSYO9w82Ob8 +otvXcO2JUYi3svHIWRm3+707DUbL51XMcY2iZdlCq4Wa9nbuk3WTU4gr6LY8MzVA +aDQG2+4U3eJ6qUF10bBnR1uuVyDYs9RhrwucRVnfuDj29CMLTsplM5f5wSV5hUpm +Uwp/vV7M4w4aGunt74koX71n4EdagCsL/Yk5+mAQU0+tue0JOfAV/R6t1k+Xk9s2 +HMQFeoxppfzAVC04FdG9M+AC2JWxmFSt6BCuh3CEey3fE52Qrj9YM75rtvIjsm/1 +Hl+u//Wqxnu1ZQ4jpa+VpuZiGOlWrqSP9eogdOhCGisnyewWJwRQOqK16wiGyZeR +xs/Bekw65vwSIaVkBruPiTfMOo0Zh4gVa8/qJgMbJbyrwwG97z/PRgmLKCDl8z3d +tA0Z7qq7fta0Gl24uyuB05dqI5J1LvAzKuWdIjT1tP8qCoxSE/xpix8hX2dt3h+/ +jujUgFPFZ0EVZ0xSyBNRF3MboGZnYXFUxpNjTWPKpagDHJQmqrAcDmWJnMsFY3jS +u1igv3OefnWjSQ== +-----END CERTIFICATE----- + +2026-01-19 23:24:06,285:DEBUG:acme.client:Storing nonce: H6cLU6Qy_YKMbcycdtTSKF8t46hYS7U7Dylk3ffb1nMR8t8WdVw +2026-01-19 23:24:06,286:DEBUG:acme.client:JWS payload: +b'' +2026-01-19 23:24:06,289:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/cert/066915db0d8c6c725fc46c163eb9f49ae7be/1: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJINmNMVTZReV9ZS01iY3ljZHRUU0tGOHQ0NmhZUzdVN0R5bGszZmZiMW5NUjh0OFdkVnciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NlcnQvMDY2OTE1ZGIwZDhjNmM3MjVmYzQ2YzE2M2ViOWY0OWFlN2JlLzEifQ", + "signature": "Y9O0qWzCrtQzEZnvanir2UM0wznZ_aBvYouB2P1X9Fd41VS2r41UHnH4ew2cFTARDS6eJc1IXP3UiSHKAsVRvLtLcsfMzlKqfqw1mkutfvxZBDiRJxuknWmrHGQgoVGn_SGrPvpRjkNdktWsYwOI91QkTRqko43XCnBxuEgAjOzvge-MrDSv7UUdLuFhkU8gFoaU35qQkTCtfslcXFAE8y-1jlJLYeEgDqM5NZUvyhcH414Q0G3J0RxS8hI3HAwclTdSTLwNlOGv50t2gfux3zSfJcfxcs9Ub4YvvnVu2Qj7GNtk4yCg-jwSl55F3zoQuBs_QrUwisfp-5p2RqgTyg", + "payload": "" +} +2026-01-19 23:24:06,438:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/cert/066915db0d8c6c725fc46c163eb9f49ae7be/1 HTTP/1.1" 200 2348 +2026-01-19 23:24:06,438:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Mon, 19 Jan 2026 23:24:06 GMT +Content-Type: application/pem-certificate-chain +Content-Length: 2348 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="alternate" +Replay-Nonce: LJ8hB_GOxyzCsUTWd8gXXz1WOid3nTkepYNA8rBsA_6kqlff818 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +-----BEGIN CERTIFICATE----- +MIIDtDCCAzqgAwIBAgISBmkV2w2MbHJfxGwWPrn0mue+MAoGCCqGSM49BAMDMDIx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF +ODAeFw0yNjAxMTkyMjI1MzJaFw0yNjA0MTkyMjI1MzFaMBsxGTAXBgNVBAMTEGNv +ZGUucHJvZmlib3QuaHUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASsPE2COiOkdz0k +MCTRIpGsfMZSwKTLK9aEKVpL3Ee61kudDMkwa2sqSIB5xC7wdTNWvVOpOF+aZJ4t +YvpYXSVj/zi2zPSC2wnWyNLrVH5Ij+dsne/3VeoEdCIwcA+jrSSjggIoMIICJDAO +BgNVHQ8BAf8EBAMCB4AwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwG +A1UdEwEB/wQCMAAwHQYDVR0OBBYEFJmpM2JIEFF0i4mlT394RM2hwG59MB8GA1Ud +IwQYMBaAFI8NE6L2Ln7RUGwzGDhdWY4jcpHKMDIGCCsGAQUFBwEBBCYwJDAiBggr +BgEFBQcwAoYWaHR0cDovL2U4LmkubGVuY3Iub3JnLzAbBgNVHREEFDASghBjb2Rl +LnByb2ZpYm90Lmh1MBMGA1UdIAQMMAowCAYGZ4EMAQIBMC0GA1UdHwQmMCQwIqAg +oB6GHGh0dHA6Ly9lOC5jLmxlbmNyLm9yZy82My5jcmwwggEOBgorBgEEAdZ5AgQC +BIH/BIH8APoAdwBkEcRspBLsp4kcogIuALyrTygH1B41J6vq/tUDyX3N8AAAAZvY +kpVyAAAEAwBIMEYCIQCtu3+le9jx12Df9gMli93P6z2yqK0e+1HmPtvoOc3tKwIh +AI//5jQe3jAgl3vBAD/dWn6DOCPf3/czz0W0gyZhCCNFAH8A4yON8o2iiOCq4Kzw ++pDJhfC2v/XSpSewAfwcRFjEtugAAAGb2JKYKwAIAAAFAC/n7DUEAwBIMEYCIQD2 +yKJ9EVEsYAZq9znoa2euJY0Kr1LKB3KMExhTRjGfCgIhANOZDKgSHDcaPg4D2tBi +vIe87PVD/6NrFrOMtOw9FrkIMAoGCCqGSM49BAMDA2gAMGUCMAVicdAlQJmbHtq1 +GKKwmFcOd10qoxkmtn2vjgalK8gmwFu4Yxz4PTrh65f/2uWXUwIxAJhDz1Dzy/jK +cA+/NqjqmSk3ZHT641YWVkExSKlwyVDCRciScnh0dtTAieWoQ0eGWQ== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIICtTCCAjugAwIBAgIQfo8UX4exWTMtf9QIK4JraTAKBggqhkjOPQQDAzBPMQsw +CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg +R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yNDAzMTMwMDAwMDBaFw0y +NzAzMTIyMzU5NTlaMDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNy +eXB0MQswCQYDVQQDEwJFODB2MBAGByqGSM49AgEGBSuBBAAiA2IABNFl8l7cS7QM +ApzSsvru6WyrOq44ofTUOTIzxULUzDMMNMchIJBwXOhiLxxxs0LXeb5GDcHbR6ET +oMffgSZjO9SNHfY9gjMy9vQr5/WWOrQTZxh7az6NSNnq3u2ubT6HTKOB+DCB9TAO +BgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIG +A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFI8NE6L2Ln7RUGwzGDhdWY4jcpHK +MB8GA1UdIwQYMBaAFHxClq7eS0g7+pL4nozPbYupcjeVMDIGCCsGAQUFBwEBBCYw +JDAiBggrBgEFBQcwAoYWaHR0cDovL3gyLmkubGVuY3Iub3JnLzATBgNVHSAEDDAK +MAgGBmeBDAECATAnBgNVHR8EIDAeMBygGqAYhhZodHRwOi8veDIuYy5sZW5jci5v +cmcvMAoGCCqGSM49BAMDA2gAMGUCMQClsUNJdX36GE+o2yDf7L02m3P3ElVWRLls +5ZyLYPjcNamBxRB9gZYoj24mGZtP3GkCMASZcALg6kpScomqIIjVHXRUQ500cdl4 +4n7fhxwokLo/lVlO8YyHwAi7ejTHtvw9Vg== +-----END CERTIFICATE----- + +2026-01-19 23:24:06,439:DEBUG:acme.client:Storing nonce: LJ8hB_GOxyzCsUTWd8gXXz1WOid3nTkepYNA8rBsA_6kqlff818 +2026-01-19 23:24:06,448:INFO:certbot._internal.client:Non-standard path(s), might not work with crontab installed by your operating system package manager +2026-01-19 23:24:06,449:DEBUG:certbot._internal.storage:Creating directory /etc/letsencrypt/archive/npm-15. +2026-01-19 23:24:06,449:DEBUG:certbot._internal.storage:Creating directory /etc/letsencrypt/live/npm-15. +2026-01-19 23:24:06,450:DEBUG:certbot._internal.storage:Writing certificate to /etc/letsencrypt/live/npm-15/cert.pem. +2026-01-19 23:24:06,450:DEBUG:certbot._internal.storage:Writing private key to /etc/letsencrypt/live/npm-15/privkey.pem. +2026-01-19 23:24:06,451:DEBUG:certbot._internal.storage:Writing chain to /etc/letsencrypt/live/npm-15/chain.pem. +2026-01-19 23:24:06,451:DEBUG:certbot._internal.storage:Writing full chain to /etc/letsencrypt/live/npm-15/fullchain.pem. +2026-01-19 23:24:06,452:DEBUG:certbot._internal.storage:Writing README to /etc/letsencrypt/live/npm-15/README. +2026-01-19 23:24:06,481:DEBUG:certbot.configuration:Var account=e417a583de478a0cfdeed332c1113068 (set by user). +2026-01-19 23:24:06,481:DEBUG:certbot.configuration:Var key_type=ecdsa (set by user). +2026-01-19 23:24:06,481:DEBUG:certbot.configuration:Var elliptic_curve=secp384r1 (set by user). +2026-01-19 23:24:06,482:DEBUG:certbot.configuration:Var preferred_chain=ISRG Root X1 (set by user). +2026-01-19 23:24:06,482:DEBUG:certbot.configuration:Var pref_challs=['http-01'] (set by user). +2026-01-19 23:24:06,482:DEBUG:certbot.configuration:Var config_dir=/etc/letsencrypt (set by user). +2026-01-19 23:24:06,482:DEBUG:certbot.configuration:Var work_dir=/tmp/letsencrypt-lib (set by user). +2026-01-19 23:24:06,482:DEBUG:certbot.configuration:Var logs_dir=/data/logs (set by user). +2026-01-19 23:24:06,482:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2026-01-19 23:24:06,482:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2026-01-19 23:24:06,483:DEBUG:certbot.configuration:Var webroot_path=['/data/letsencrypt-acme-challenge'] (set by user). +2026-01-19 23:24:06,483:DEBUG:certbot.configuration:Var webroot_map={'code.profibot.hu': '/data/letsencrypt-acme-challenge'} (set by user). +2026-01-19 23:24:06,485:DEBUG:certbot._internal.display.obj:Notifying user: +Successfully received certificate. +Certificate is saved at: /etc/letsencrypt/live/npm-15/fullchain.pem +Key is saved at: /etc/letsencrypt/live/npm-15/privkey.pem +This certificate expires on 2026-04-19. +These files will be updated when the certificate renews. +2026-01-19 23:24:06,485:DEBUG:certbot._internal.display.obj:Notifying user: NEXT STEPS: +2026-01-19 23:24:06,485:DEBUG:certbot._internal.display.obj:Notifying user: - The certificate will need to be renewed before it expires. Certbot can automatically renew the certificate in the background, but you may need to take steps to enable that functionality. See https://certbot.org/renewal-setup for instructions. +2026-01-19 23:24:06,487:DEBUG:certbot._internal.display.obj:Notifying user: If you like Certbot, please consider supporting our work by: + * Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate + * Donating to EFF: https://eff.org/donate-le diff --git a/proxy-manager/data/logs/letsencrypt.log.5 b/proxy-manager/data/logs/letsencrypt.log.5 new file mode 100755 index 0000000..9755ff1 --- /dev/null +++ b/proxy-manager/data/logs/letsencrypt.log.5 @@ -0,0 +1,1032 @@ +2025-12-25 04:09:47,767:DEBUG:certbot._internal.main:certbot version: 5.1.0 +2025-12-25 04:09:47,767:DEBUG:certbot._internal.main:Location of certbot entry point: /opt/certbot/bin/certbot +2025-12-25 04:09:47,767:DEBUG:certbot._internal.main:Arguments: ['--config', '/etc/letsencrypt.ini', '--work-dir', '/tmp/letsencrypt-lib', '--logs-dir', '/data/logs', '--cert-name', 'npm-14', '--agree-tos', '--authenticator', 'webroot', '-m', 'kincses@gmail.com', '--preferred-challenges', 'http', '--domains', 'db.profibot.hu'] +2025-12-25 04:09:47,767:DEBUG:certbot._internal.main:Discovered plugins: PluginsRegistry(PluginEntryPoint#manual,PluginEntryPoint#null,PluginEntryPoint#standalone,PluginEntryPoint#webroot) +2025-12-25 04:09:47,777:DEBUG:certbot._internal.log:Root logging level set at 30 +2025-12-25 04:09:47,778:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2025-12-25 04:09:47,778:DEBUG:certbot._internal.plugins.selection:Single candidate plugin: * webroot +Description: Saves the necessary validation files to a .well-known/acme-challenge/ directory within the nominated webroot path. A separate HTTP server must be running and serving files from the webroot path. HTTP challenge only (wildcards not supported). +Interfaces: Authenticator, Plugin +Entry point: EntryPoint(name='webroot', value='certbot._internal.plugins.webroot:Authenticator', group='certbot.plugins') +Initialized: +Prep: True +2025-12-25 04:09:47,778:DEBUG:certbot._internal.plugins.selection:Selected authenticator and installer None +2025-12-25 04:09:47,778:INFO:certbot._internal.plugins.selection:Plugins selected: Authenticator webroot, Installer None +2025-12-25 04:09:47,815:DEBUG:certbot._internal.main:Picked account: +2025-12-25 04:09:47,815:DEBUG:acme.client:Sending GET request to https://acme-v02.api.letsencrypt.org/directory. +2025-12-25 04:09:47,817:DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org:443 +2025-12-25 04:09:48,282:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "GET /directory HTTP/1.1" 200 1033 +2025-12-25 04:09:48,283:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:09:48 GMT +Content-Type: application/json +Content-Length: 1033 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "JhN-bGapPNE": "https://community.letsencrypt.org/t/adding-random-entries-to-the-directory/33417", + "keyChange": "https://acme-v02.api.letsencrypt.org/acme/key-change", + "meta": { + "caaIdentities": [ + "letsencrypt.org" + ], + "profiles": { + "classic": "https://letsencrypt.org/docs/profiles#classic", + "shortlived": "https://letsencrypt.org/docs/profiles#shortlived", + "tlsclient": "https://letsencrypt.org/docs/profiles#tlsclient", + "tlsserver": "https://letsencrypt.org/docs/profiles#tlsserver" + }, + "termsOfService": "https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf", + "website": "https://letsencrypt.org" + }, + "newAccount": "https://acme-v02.api.letsencrypt.org/acme/new-acct", + "newNonce": "https://acme-v02.api.letsencrypt.org/acme/new-nonce", + "newOrder": "https://acme-v02.api.letsencrypt.org/acme/new-order", + "renewalInfo": "https://acme-v02.api.letsencrypt.org/acme/renewal-info", + "revokeCert": "https://acme-v02.api.letsencrypt.org/acme/revoke-cert" +} +2025-12-25 04:09:48,284:DEBUG:certbot._internal.display.obj:Notifying user: Requesting a certificate for db.profibot.hu +2025-12-25 04:09:48,290:DEBUG:acme.client:Requesting fresh nonce +2025-12-25 04:09:48,290:DEBUG:acme.client:Sending HEAD request to https://acme-v02.api.letsencrypt.org/acme/new-nonce. +2025-12-25 04:09:48,445:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "HEAD /acme/new-nonce HTTP/1.1" 200 0 +2025-12-25 04:09:48,446:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:09:48 GMT +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJDyc0oabQjKcI0QI4ygS4cOJhcR_wu7-p7rJ17BDUfmw +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + + +2025-12-25 04:09:48,446:DEBUG:acme.client:Storing nonce: fULB7aUJDyc0oabQjKcI0QI4ygS4cOJhcR_wu7-p7rJ17BDUfmw +2025-12-25 04:09:48,447:DEBUG:acme.client:JWS payload: +b'{\n "identifiers": [\n {\n "type": "dns",\n "value": "db.profibot.hu"\n }\n ]\n}' +2025-12-25 04:09:48,450:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/new-order: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSkR5YzBvYWJRaktjSTBRSTR5Z1M0Y09KaGNSX3d1Ny1wN3JKMTdCRFVmbXciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL25ldy1vcmRlciJ9", + "signature": "PsidprrdkfnvaGVRXgq4bC9SERpuBFp-pWVrPA-QJEpNvqtJ8G6cy2I3WAi1JXNOmBF0zHfMvuM-vFECKHmGveyMMh2oc7BrFhSrLNOXuoQBtS4_L2XeBALzxn9YTYhfK_ye28ZtKVPmqlE28QHI1wIYfU6r7PCpd74UK9jf1lmTeKDRvNlbrmTQXi76eDH6PPcPV0QKpvUwLY_OwOVH417dcUpmEiCL5aVoY9PF7FWMNk4HGGvX9qTXCAgsQrsbYlAk_IhN8FPniz64qDxW2_FjvJgY0v-1n6Xr2KG7WBhEGpujrO0TUNiSe0-ImDqoFi6UJuZZs7Yba20VoctogA", + "payload": "ewogICJpZGVudGlmaWVycyI6IFsKICAgIHsKICAgICAgInR5cGUiOiAiZG5zIiwKICAgICAgInZhbHVlIjogImRiLnByb2ZpYm90Lmh1IgogICAgfQogIF0KfQ" +} +2025-12-25 04:09:48,643:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/new-order HTTP/1.1" 201 348 +2025-12-25 04:09:48,644:DEBUG:acme.client:Received response: +HTTP 201 +Server: nginx +Date: Thu, 25 Dec 2025 04:09:48 GMT +Content-Type: application/json +Content-Length: 348 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/462430571446 +Replay-Nonce: fULB7aUJrYQOkVgVYA6yUnGFrIu6tLTy333hbXIS-l54k5iIGA8 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "pending", + "expires": "2026-01-01T04:09:48Z", + "identifiers": [ + { + "type": "dns", + "value": "db.profibot.hu" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632668458316" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/462430571446" +} +2025-12-25 04:09:48,644:DEBUG:acme.client:Storing nonce: fULB7aUJrYQOkVgVYA6yUnGFrIu6tLTy333hbXIS-l54k5iIGA8 +2025-12-25 04:09:48,645:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:09:48,649:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632668458316: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSnJZUU9rVmdWWUE2eVVuR0ZySXU2dExUeTMzM2hiWElTLWw1NGs1aUlHQTgiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY4NDU4MzE2In0", + "signature": "FIkBs33qGe-iBSysPMMhoth8qNfkxQkAO08hLYOHv5HrbuaA0KreCDGPfEQtMo8w8FlqCXzSbP7dVx1UD1uZmCgfPcJ9gZwoMc7RWB__ytjxGFWiPq7FBebo3mx6psH14eSqYG4wtWY0EGPgenHDl_UGc3L5mIJMd89yfxBVjNexeT0FNm37ZKGH-safBVoRN4-iehDjv_h8XFRExnArnM4b5AFn9xD99tUCZqHfUN4QNYOpWggIvqTNC1x7q2ors7v0tVDTKKwQHcq6WH-PryTfog_0taILP3e9GEH8Od5GXRzBhx5dEFoxwNXTrwSqNFU70LrEX9MD1-rdr8lb2Q", + "payload": "" +} +2025-12-25 04:09:48,805:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632668458316 HTTP/1.1" 200 822 +2025-12-25 04:09:48,806:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:09:48 GMT +Content-Type: application/json +Content-Length: 822 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJRGfmarfgPe0PhrijStt5ZKai-URo8A_U3fOIC1U6EcA +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "db.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:09:48Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/BzIaXA", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/oB79fQ", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/xrU-kA", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + } + ] +} +2025-12-25 04:09:48,806:DEBUG:acme.client:Storing nonce: fULB7aUJRGfmarfgPe0PhrijStt5ZKai-URo8A_U3fOIC1U6EcA +2025-12-25 04:09:48,807:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/oB79fQ', 'status': 'pending', 'token': 'PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ'} +2025-12-25 04:09:48,808:INFO:certbot._internal.auth_handler:Performing the following challenges: +2025-12-25 04:09:48,808:INFO:certbot._internal.auth_handler:http-01 challenge for db.profibot.hu +2025-12-25 04:09:48,809:INFO:certbot._internal.plugins.webroot:Using the webroot path /data/letsencrypt-acme-challenge for all unmatched domains. +2025-12-25 04:09:48,809:DEBUG:certbot._internal.plugins.webroot:Creating root challenges validation dir at /data/letsencrypt-acme-challenge/.well-known/acme-challenge +2025-12-25 04:09:48,811:DEBUG:certbot._internal.plugins.webroot:Attempting to save validation to /data/letsencrypt-acme-challenge/.well-known/acme-challenge/PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ +2025-12-25 04:09:48,812:DEBUG:acme.client:JWS payload: +b'{}' +2025-12-25 04:09:48,815:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/BzIaXA: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSlJHZm1hcmZnUGUwUGhyaWpTdHQ1WkthaS1VUm84QV9VM2ZPSUMxVTZFY0EiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NoYWxsLzI5MDY0MzgxNzYvNjMyNjY4NDU4MzE2L0J6SWFYQSJ9", + "signature": "gSyXLTZpxQltfvydbuc82dh_EcR42xuAWd7RbHlnzhanM-uvBrzVggNjfsHMPKgdIByGe4Y0e_8cWmGBM5y4JLt7d_Z4_CDDaLcwWDmqkuD1Sf4d3_lOgSoE3qjbXCzLeXx0jzMRDLSaUXOJaWFvQmSbiJzlmtcPyBqqaaVLSvhzf_k9lHXzukcL170BBNL81CH8CoGQEYDUK5QYkZNGZO4Zbdetb2Pp0t_aEiCqbl1CTxZGOWOJY1QHzRjAC0KZfLjVjRTOsxe0y87NL7R6iVO-5giwJY1BXuYkyOMMSY7ezW8-GrFp6Ww_b8R7EKy04oX4_0vayqyv9Qcv0445FA", + "payload": "e30" +} +2025-12-25 04:09:48,972:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/chall/2906438176/632668458316/BzIaXA HTTP/1.1" 200 195 +2025-12-25 04:09:48,973:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:09:48 GMT +Content-Type: application/json +Content-Length: 195 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="up" +Location: https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/BzIaXA +Replay-Nonce: 58tS3qjENDAlf1XMqNCvNAXQRlakLh3CgOolfJgLHxqoyLxNwtM +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/BzIaXA", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" +} +2025-12-25 04:09:48,974:DEBUG:acme.client:Storing nonce: 58tS3qjENDAlf1XMqNCvNAXQRlakLh3CgOolfJgLHxqoyLxNwtM +2025-12-25 04:09:48,974:INFO:certbot._internal.auth_handler:Waiting for verification... +2025-12-25 04:09:49,975:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:09:49,979:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632668458316: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRU5EQWxmMVhNcU5Ddk5BWFFSbGFrTGgzQ2dPb2xmSmdMSHhxb3lMeE53dE0iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY4NDU4MzE2In0", + "signature": "MdD_c_iEm520SywBEfQewl67dI4MkqfV8HO4qwn18TktTajZvcWfqxlpAwvcwsCvix-yhlFGxYeOmwr05rQwE9vnIL9xuOQr50HPc60tw_mKegIJI2PGfz64a_Fi74hQ9a4JO9FKFXzmyBVkr8-kaQ_QXEQkgO5geabM-kM0gwR9v41NbCuFRtYmY4KNvJn1RA9TU8OnGgiBHP9weBMsAWn60motpgAByoFet6EFcgUYth4PNhWZBSJ_K1ijY13uvWW9g0EusaMATfVzmBnmVYJKwj9MXvF103yidETvr_dQx8X10pumEqnkAFD-d6wgxD154WEGY209PuDe-gkppQ", + "payload": "" +} +2025-12-25 04:09:50,135:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632668458316 HTTP/1.1" 200 822 +2025-12-25 04:09:50,136:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:09:50 GMT +Content-Type: application/json +Content-Length: 822 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEwoHXmqO-HHT-QJ4KyWn_nwzfwblEJyIZoVKDf7yNR88 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "db.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:09:48Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/xrU-kA", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/BzIaXA", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/oB79fQ", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + } + ] +} +2025-12-25 04:09:50,136:DEBUG:acme.client:Storing nonce: 58tS3qjEwoHXmqO-HHT-QJ4KyWn_nwzfwblEJyIZoVKDf7yNR88 +2025-12-25 04:09:50,137:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/oB79fQ', 'status': 'pending', 'token': 'PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ'} +2025-12-25 04:09:53,138:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:09:53,142:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632668458316: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRXdvSFhtcU8tSEhULVFKNEt5V25fbnd6ZndibEVKeUlab1ZLRGY3eU5SODgiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY4NDU4MzE2In0", + "signature": "f322X8p9FRM-EmASQLAyMv23Jw43ss8fw5DCR2n4yQGVKgztFk9X7_ZxTtb38Al0z5jHEfIs5baU-ZmgaKCY5OrblLntiZwbr6QymRKtB3SMBkjPyS2mtXwI2lvxJIqhVZ4TOjwHQoxMKXisKqiLFcrUno7YViFwyZP9uFqZhpDtZ4IqwNTdfoU3vs14wZfG6A0eJG9OwtsOssT5b7y6nsrtjVYvt_fHk-HE2XzBPFlh9-kfQ8Kt0eyNuF4JCddwvoI8LAIyyLKLO3iPpfH6upkOfhh4n1rp0NrBohwZFPYgX8THT6rBFQlGAocfUmtiOtX9VqaBGk8B58Ij3J2Nqw", + "payload": "" +} +2025-12-25 04:09:53,298:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632668458316 HTTP/1.1" 200 822 +2025-12-25 04:09:53,299:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:09:53 GMT +Content-Type: application/json +Content-Length: 822 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEaGDw3f5KNfHTVUzRbzBIJNjXTGtUkhmL4lCbKvI1G4o +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "db.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:09:48Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/BzIaXA", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/oB79fQ", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/xrU-kA", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + } + ] +} +2025-12-25 04:09:53,300:DEBUG:acme.client:Storing nonce: 58tS3qjEaGDw3f5KNfHTVUzRbzBIJNjXTGtUkhmL4lCbKvI1G4o +2025-12-25 04:09:53,300:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/oB79fQ', 'status': 'pending', 'token': 'PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ'} +2025-12-25 04:09:56,301:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:09:56,305:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632668458316: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRWFHRHczZjVLTmZIVFZVelJiekJJSk5qWFRHdFVraG1MNGxDYkt2STFHNG8iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY4NDU4MzE2In0", + "signature": "PTmpfchSt-Uzw1lLkiRtasHC43KQbQY5K98bGkqF9PmpDv_zma4wjiUQoY7SFAjQ77avpYSIz5GI8GhC5nfBRSv-rshbKkgOgts4VhnbV8kEZQxGSOaBP51hFVYjZgG_ux0tUu7zqTAx3HeDUuHar4l5KIR-Ud4m4fZSMfiphpoQ6JRm1uVPSZPmH6eqepJRD7SOL2wukyjLql7W4hFPeq4NYTVwKSxv6TFlWpe_Dh7Qi5pooEkuEHl7vpnaziFwNmRMOozNviY9wrBabSd904Q14SHZ55WL-Y41Zcjngy5hv70wXQ405LLvtr1jyZEF7OZJWiEwp7K5odRNF6LHlA", + "payload": "" +} +2025-12-25 04:09:56,479:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632668458316 HTTP/1.1" 200 822 +2025-12-25 04:09:56,480:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:09:56 GMT +Content-Type: application/json +Content-Length: 822 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJ2yCdOxesQkDCo2_dalrWMy3MrwKoO_BNN0pLZ_5H-tw +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "db.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:09:48Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/oB79fQ", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/BzIaXA", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/xrU-kA", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + } + ] +} +2025-12-25 04:09:56,480:DEBUG:acme.client:Storing nonce: fULB7aUJ2yCdOxesQkDCo2_dalrWMy3MrwKoO_BNN0pLZ_5H-tw +2025-12-25 04:09:56,480:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/oB79fQ', 'status': 'pending', 'token': 'PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ'} +2025-12-25 04:09:59,482:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:09:59,486:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632668458316: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSjJ5Q2RPeGVzUWtEQ28yX2RhbHJXTXkzTXJ3S29PX0JOTjBwTFpfNUgtdHciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY4NDU4MzE2In0", + "signature": "LT8reJZXmzRrQQnBrQZuJ1vB_K1e7muSZAs7LnT2xjdNDoq3Jfu9Y-unqfCpOsz1c1f4bAbPIGO2LTOdVIav_20hMcFaxlpyXlZOR-tkXUZE3ixVRTUkEDjXmXnIGysH5G1tavTbiPaYy510R-A-7uSifrkD4Z79DU_l-N5x-uE4oW03RuPlpQslDWHnS2DbaInPiNzSELtv6mv1LFfSHsXXPXi89UYllKQpS2q3YVpNWipHGk5b3nsD1C9ICqe7q0Dj209BbN-xMuX6_AzTWPXS7wWyQd64fBeRBaVgkcOp_Yoj5yYWMXegM-XhxjhoImzKq9pm-dp-etlVF4QiqQ", + "payload": "" +} +2025-12-25 04:09:59,641:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632668458316 HTTP/1.1" 200 822 +2025-12-25 04:09:59,642:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:09:59 GMT +Content-Type: application/json +Content-Length: 822 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJeujFQnovsxLrvc2aNYHGQhptNsh39cU4UhAx0mJZ2iw +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "db.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:09:48Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/BzIaXA", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/xrU-kA", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/oB79fQ", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + } + ] +} +2025-12-25 04:09:59,642:DEBUG:acme.client:Storing nonce: fULB7aUJeujFQnovsxLrvc2aNYHGQhptNsh39cU4UhAx0mJZ2iw +2025-12-25 04:09:59,643:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/oB79fQ', 'status': 'pending', 'token': 'PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ'} +2025-12-25 04:10:02,644:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:10:02,647:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632668458316: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSmV1akZRbm92c3hMcnZjMmFOWUhHUWhwdE5zaDM5Y1U0VWhBeDBtSloyaXciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY4NDU4MzE2In0", + "signature": "C7hXS7KLwKsDVmDunimXg35D-zHsQ9BfOp3uU9QkKLdFkqYWiSGeDRExEVmQaVGtVaxKfV8_lQZLVEqjGNzkhijXdT5rIH25S3YaQ5_AHxkpdzdk_VcnMgn1ClAn3iYvvhFxrrm5Nx9HgsH7Y_nrgUX9RnCrCX88g828udiZcxbg7jrvzU6oAYPf_-GlvdPqv5UfNA7UsxOHXExkWIjDF2W48jQE4n8IEXsxmdVJisty3gYI6fCja_QKuPSWBCpSaE2qhxJvAjO8C683CnQag5bgM3W_UiDN7RJcXQi7eImgPlxLWMu4h_aCva1VdoMgXpOTRL5MgmQOYWv23LyW9w", + "payload": "" +} +2025-12-25 04:10:02,802:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632668458316 HTTP/1.1" 200 822 +2025-12-25 04:10:02,803:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:10:02 GMT +Content-Type: application/json +Content-Length: 822 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJju2amfc9uFHSeA4ULye0lXKj99nXM0JgS2jF9V6OZx4 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "db.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:09:48Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/oB79fQ", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/xrU-kA", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/BzIaXA", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + } + ] +} +2025-12-25 04:10:02,804:DEBUG:acme.client:Storing nonce: fULB7aUJju2amfc9uFHSeA4ULye0lXKj99nXM0JgS2jF9V6OZx4 +2025-12-25 04:10:02,804:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/oB79fQ', 'status': 'pending', 'token': 'PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ'} +2025-12-25 04:10:05,805:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:10:05,809:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632668458316: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSmp1MmFtZmM5dUZIU2VBNFVMeWUwbFhLajk5blhNMEpnUzJqRjlWNk9aeDQiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY4NDU4MzE2In0", + "signature": "PEINKZjKDPdu5rmKZXe45lEA4W_KFY9jkOE9qv7WjmCTKqaK5Ad2bNOmLYyZCDohSALdp2gKkqZf8_NoL12adnZb8dZMACSoqHQwM5ifN9QXVw6yZwQY-nr9IV4NLSpEoMw5QzG6ajaS7rqmyAou9dVyIEjgKvTenn0fao0hajxsOqUZDrRQnV0dA4ehEcRow37CYk8Y3Vbq-alehLWVyM4j558KTZM6F8Ofy5wcDsqxewqFjbzXgUcCYVMdly2RbGARxDlN8t5heZT536IbrYVmyR6QrmXIgS1vMduFEXWDfeYWgWFjW--UDnaKHEm_niqg_puEhDAsS3hUHrm5xQ", + "payload": "" +} +2025-12-25 04:10:05,966:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632668458316 HTTP/1.1" 200 822 +2025-12-25 04:10:05,967:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:10:05 GMT +Content-Type: application/json +Content-Length: 822 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJAkUc_l5cYSQDweXETe9KE2EiLeDCNxaEGpBvtwSCL68 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "db.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:09:48Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/xrU-kA", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/oB79fQ", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/BzIaXA", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + } + ] +} +2025-12-25 04:10:05,967:DEBUG:acme.client:Storing nonce: fULB7aUJAkUc_l5cYSQDweXETe9KE2EiLeDCNxaEGpBvtwSCL68 +2025-12-25 04:10:05,968:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/oB79fQ', 'status': 'pending', 'token': 'PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ'} +2025-12-25 04:10:08,969:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:10:08,972:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632668458316: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSkFrVWNfbDVjWVNRRHdlWEVUZTlLRTJFaUxlRENOeGFFR3BCdnR3U0NMNjgiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY4NDU4MzE2In0", + "signature": "KpknX9j0QlzXbvot6NAXUNlFuqWLX0Ubu6XlFxjDMOnSe076y1EkQcBD32vKuVqMxGb_5hC10a_1z3PH_d2cTgnfJJjxYQDmq1KiRWzKVKyhnAs7wx3QJhezICGkwIMRz1CKPnneQGVpKPiD2ZnkA8CmgA4tYfkoo_O2He9B2EouHXkgwFBN12KjaMXVQxl3S9JbGcCEpzCkwdn_xi8z-BoC0iDrxuwnkKjss2dzTZkSdATPwoJMmZU6Y0NHBRyJl-60xEliaw1FAxNe8OLQcYPRVH4NSl1uNDks9LYmu8iA-L0OEF0Cww3o2vxaNF3iQTFskQk0_WuNANPJ8JT-Zw", + "payload": "" +} +2025-12-25 04:10:09,127:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632668458316 HTTP/1.1" 200 822 +2025-12-25 04:10:09,128:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:10:09 GMT +Content-Type: application/json +Content-Length: 822 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJbDxaBLJMMh-A5W9QLa3ulHWeb3tYkgbHbUisirf6C_c +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "db.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:09:48Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/oB79fQ", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/xrU-kA", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/BzIaXA", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + } + ] +} +2025-12-25 04:10:09,128:DEBUG:acme.client:Storing nonce: fULB7aUJbDxaBLJMMh-A5W9QLa3ulHWeb3tYkgbHbUisirf6C_c +2025-12-25 04:10:09,129:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/oB79fQ', 'status': 'pending', 'token': 'PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ'} +2025-12-25 04:10:12,130:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:10:12,134:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632668458316: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSmJEeGFCTEpNTWgtQTVXOVFMYTN1bEhXZWIzdFlrZ2JIYlVpc2lyZjZDX2MiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY4NDU4MzE2In0", + "signature": "Hq769IXiO3GaW-Dc9DB_2sUzsPqtS94DMvBHeeK_sMu0_tUP7rHxHy0iROmZoePlleHrqU9Z7dPFGFqBCDMAXfDGRLfFBg1EhIszB99Ns_ZViDBCdZRG0T9XKeA-2gS-Kxa-npE2iGNrc5GRSS_2FL_aUj46kDOA9SDrd1vXFHhUQSJWqkbhCjpqdflaJiDcOAqfXYKac_yDVV_FB60Q4RH6AqAekddWbIDAFiUH6wULDrz2bhuZKI4n5t_QQpbj0WkjdYNZ35xRlocaBPkl1uH8OpDJj44s9R1HAVbmYV3rueZJqyiKEemhAPy2E1hRzszgoC9FINc-GbYRg0VtbQ", + "payload": "" +} +2025-12-25 04:10:12,302:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632668458316 HTTP/1.1" 200 822 +2025-12-25 04:10:12,303:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:10:12 GMT +Content-Type: application/json +Content-Length: 822 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJpN4EnNNj53_l2ZCY1tXoIVEFEEoxenYO5Ogb6A9hS7M +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "db.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:09:48Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/BzIaXA", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/xrU-kA", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/oB79fQ", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + } + ] +} +2025-12-25 04:10:12,303:DEBUG:acme.client:Storing nonce: fULB7aUJpN4EnNNj53_l2ZCY1tXoIVEFEEoxenYO5Ogb6A9hS7M +2025-12-25 04:10:12,304:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/oB79fQ', 'status': 'pending', 'token': 'PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ'} +2025-12-25 04:10:15,305:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:10:15,309:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632668458316: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSnBONEVuTk5qNTNfbDJaQ1kxdFhvSVZFRkVFb3hlbllPNU9nYjZBOWhTN00iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY4NDU4MzE2In0", + "signature": "R2y3gf1e_KqjEcDoBdyIm-z3du1iozsu_uQBVrfheVavfOcEG8mqZj4rFygLokzT16DgGPN9J8Sd5utIGGpIlkr9HUjzLKRy-e2V9Xt2qNF6A7_Qe9JkF3c5IeOe-jPBuJzlcjtf78549LVEzCHqqSaH8c0P1Px_iOIdoSo5fLKnQtWqFiMpCTPORZ7Qhag_g0d5NMhnFA0DpQpX1O_btaPeZWa5GiCT7YLsWgvy64eFiiFz_JQuSJwkiZPB7vAvoYcfBVNJXELRZet_UWbH4CI3thQlD0sUoCH-ub_ubURYc7TwnTQLJhLYiaNVVL2JFbac93Bxe7HaZYNe_LsF5A", + "payload": "" +} +2025-12-25 04:10:15,465:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632668458316 HTTP/1.1" 200 822 +2025-12-25 04:10:15,466:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:10:15 GMT +Content-Type: application/json +Content-Length: 822 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEI8g1YnpTpr8ZbwddmFtDK4GUrUmgcorkpeZgZ6T4Ic0 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "db.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:09:48Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/oB79fQ", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/xrU-kA", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/BzIaXA", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + } + ] +} +2025-12-25 04:10:15,467:DEBUG:acme.client:Storing nonce: 58tS3qjEI8g1YnpTpr8ZbwddmFtDK4GUrUmgcorkpeZgZ6T4Ic0 +2025-12-25 04:10:15,467:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/oB79fQ', 'status': 'pending', 'token': 'PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ'} +2025-12-25 04:10:18,468:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:10:18,471:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632668458316: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRUk4ZzFZbnBUcHI4WmJ3ZGRtRnRESzRHVXJVbWdjb3JrcGVaZ1o2VDRJYzAiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY4NDU4MzE2In0", + "signature": "USt2lfSlqabTgZPlBWxa6N4WWIm7qr33fY4pEBplw9PBZjVdHl16MA9TFm--UwPxu0h4d7OwqJgmFKRC_P9FK2HMs5kQPr9s_rz2jDk1qoq21RNRolFEhqgvjM7OnrjI0N0o9lH5UjYIMggY8eS4pPD6u70M2E32Bf1YJ0wSFCATy6Ki3BWR3tG3SL9uybprVFbvj3zK6y2OVJT3AVS70HAhKXhsnOcswSdkuylb3JpqDtTHjJFtX73NWiu3lY7luxnLTDdgNf2O3z8nm_XhG4rAt8MnwuV1FkjO3vnDBwffigfeQY5XBmL2wec-SynxlnCxDFmQvlYQuwtL-WDkLw", + "payload": "" +} +2025-12-25 04:10:18,627:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632668458316 HTTP/1.1" 200 822 +2025-12-25 04:10:18,628:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:10:18 GMT +Content-Type: application/json +Content-Length: 822 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEry4rxguzbRh8i1SneLoFIrOS_P1oSv3o3sb8XhDuMbo +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "db.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:09:48Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/xrU-kA", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/oB79fQ", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/BzIaXA", + "status": "pending", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ" + } + ] +} +2025-12-25 04:10:18,628:DEBUG:acme.client:Storing nonce: 58tS3qjEry4rxguzbRh8i1SneLoFIrOS_P1oSv3o3sb8XhDuMbo +2025-12-25 04:10:18,629:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/oB79fQ', 'status': 'pending', 'token': 'PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ'} +2025-12-25 04:10:21,630:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:10:21,634:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632668458316: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRXJ5NHJ4Z3V6YlJoOGkxU25lTG9GSXJPU19QMW9TdjNvM3NiOFhoRHVNYm8iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY4NDU4MzE2In0", + "signature": "gwRnS1oTjo0DB93QhiRIGnL1opIJJj356t2Mv89EIRUI3Z9vQDDltrSIpKeUHrcU_oJNvmdXdC1qlANSJ_xN98jHEj7XD_GGQK2TvlZoHJTz-umpSinMWF_Q0UbPph40aBbyJ6Swya2t97yDU6YKJcn9ipTi6NY5lcnldxUwTqh3G6sBXb-Yc85jOgAfxjP87kpRZIHB2F0iZ6Ze3ZYY0uiyytW46igqGoND_kl9pS9_U8YvxtA-483IOeLfYHSc7yWxzJH-um6BQcNx9OqfnAi-5toqaq6rp7tYk_cCtgwrb4zNPDQHYLVuKe793E7P4ATIRhi9LHfsBILC3oJPDw", + "payload": "" +} +2025-12-25 04:10:21,789:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632668458316 HTTP/1.1" 200 767 +2025-12-25 04:10:21,790:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:10:21 GMT +Content-Type: application/json +Content-Length: 767 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjELJCAFp7PL_Nb-kuuNONWqSzVxmvIi5GfNgQiwRrRVv8 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "db.profibot.hu" + }, + "status": "valid", + "expires": "2026-01-24T04:10:20Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668458316/BzIaXA", + "status": "valid", + "validated": "2025-12-25T04:09:48Z", + "token": "PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ", + "validationRecord": [ + { + "url": "http://db.profibot.hu/.well-known/acme-challenge/PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ", + "hostname": "db.profibot.hu", + "port": "80", + "addressesResolved": [ + "92.249.165.228" + ], + "addressUsed": "92.249.165.228" + } + ] + } + ] +} +2025-12-25 04:10:21,790:DEBUG:acme.client:Storing nonce: 58tS3qjELJCAFp7PL_Nb-kuuNONWqSzVxmvIi5GfNgQiwRrRVv8 +2025-12-25 04:10:21,791:DEBUG:certbot._internal.error_handler:Calling registered functions +2025-12-25 04:10:21,791:INFO:certbot._internal.auth_handler:Cleaning up challenges +2025-12-25 04:10:21,791:DEBUG:certbot._internal.plugins.webroot:Removing /data/letsencrypt-acme-challenge/.well-known/acme-challenge/PgEkXeocXuPe-cV64fPMOX_BBl--rJ91KSxv7lR9WSQ +2025-12-25 04:10:21,792:DEBUG:certbot._internal.plugins.webroot:All challenges cleaned up +2025-12-25 04:10:21,793:DEBUG:certbot._internal.client:CSR: CSR(file=None, data=b'-----BEGIN CERTIFICATE REQUEST-----\nMIIBJDCBqwIBADAAMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEWXMvMEIeqT/BIiIv\nbx32iIua7YMHHNdIxCzLlP2hho74rE67sXKwcvt18MKcZfIDsqM6fzoTlCtDRzHm\njtAe8/iaVvBB2RmkXKB17FQrGA9t5cLqBm2xJ5x31rQ0qQtBoCwwKgYJKoZIhvcN\nAQkOMR0wGzAZBgNVHREEEjAQgg5kYi5wcm9maWJvdC5odTAKBggqhkjOPQQDAgNo\nADBlAjAxgQP0MIhF96QGS37j5VPDFWgGyNY6irPD4csKAvhuzs3L5cR4QvRwiZZP\nm8sW2uoCMQDxU6iTyQi+DB8Ho8OO/rESsnhOmAL5pwWFWzhiQ4vKKUFGD4ME7XgG\ne7mEV2dvZkk=\n-----END CERTIFICATE REQUEST-----\n', form='pem') +2025-12-25 04:10:21,793:DEBUG:certbot._internal.client:Will poll for certificate issuance until 2025-12-25 04:11:51.793662 +2025-12-25 04:10:21,794:DEBUG:acme.client:JWS payload: +b'{\n "csr": "MIIBJDCBqwIBADAAMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEWXMvMEIeqT_BIiIvbx32iIua7YMHHNdIxCzLlP2hho74rE67sXKwcvt18MKcZfIDsqM6fzoTlCtDRzHmjtAe8_iaVvBB2RmkXKB17FQrGA9t5cLqBm2xJ5x31rQ0qQtBoCwwKgYJKoZIhvcNAQkOMR0wGzAZBgNVHREEEjAQgg5kYi5wcm9maWJvdC5odTAKBggqhkjOPQQDAgNoADBlAjAxgQP0MIhF96QGS37j5VPDFWgGyNY6irPD4csKAvhuzs3L5cR4QvRwiZZPm8sW2uoCMQDxU6iTyQi-DB8Ho8OO_rESsnhOmAL5pwWFWzhiQ4vKKUFGD4ME7XgGe7mEV2dvZkk"\n}' +2025-12-25 04:10:21,798:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/462430571446: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRUxKQ0FGcDdQTF9OYi1rdXVOT05XcVN6VnhtdklpNUdmTmdRaXdSclJWdjgiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2ZpbmFsaXplLzI5MDY0MzgxNzYvNDYyNDMwNTcxNDQ2In0", + "signature": "I4HPxxOiDM2Lvsu6R0YhZWJIzERhqJvOkz1FiFam76TOVBQJPwmJC8DS2nsV0Fu3BqKW_zXijKMZPJakvRfWwB1QN8hoQi5YDijQHNRpkPvd2E1qs9v7tZMNc1rQvVqxZL9X_mvkzpNOSSiSBiKQ0nsit9-67_iaF3UcwrGKFT8DUbsBW6aLKfu9SwNOkrWG_VjGp724i835Pfa4nUVM7zZTUwSb8Yqk9PcDWWC69T4TXd7M554XRk1ZNaRACW1jcXrm7S2-eejwlBZPQRc4Kof_t4wyxg_VujjpgV5uUExkV78Lcp4gN7urCRVEnRoR5CpUOVKU7l3inK4QbE5rRg", + "payload": "ewogICJjc3IiOiAiTUlJQkpEQ0Jxd0lCQURBQU1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFV1hNdk1FSWVxVF9CSWlJdmJ4MzJpSXVhN1lNSEhOZEl4Q3pMbFAyaGhvNzRyRTY3c1hLd2N2dDE4TUtjWmZJRHNxTTZmem9UbEN0RFJ6SG1qdEFlOF9pYVZ2QkIyUm1rWEtCMTdGUXJHQTl0NWNMcUJtMnhKNXgzMXJRMHFRdEJvQ3d3S2dZSktvWklodmNOQVFrT01SMHdHekFaQmdOVkhSRUVFakFRZ2c1a1lpNXdjbTltYVdKdmRDNW9kVEFLQmdncWhrak9QUVFEQWdOb0FEQmxBakF4Z1FQME1JaEY5NlFHUzM3ajVWUERGV2dHeU5ZNmlyUEQ0Y3NLQXZodXpzM0w1Y1I0UXZSd2laWlBtOHNXMnVvQ01RRHhVNmlUeVFpLURCOEhvOE9PX3JFU3NuaE9tQUw1cHdXRld6aGlRNHZLS1VGR0Q0TUU3WGdHZTdtRVYyZHZaa2siCn0" +} +2025-12-25 04:10:22,841:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/finalize/2906438176/462430571446 HTTP/1.1" 200 450 +2025-12-25 04:10:22,842:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:10:22 GMT +Content-Type: application/json +Content-Length: 450 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/462430571446 +Replay-Nonce: fULB7aUJXuClAWbLAo3PuZDS321otxL2fUuLlGHZNHxe_O4Sm4Y +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "valid", + "expires": "2026-01-01T04:09:48Z", + "identifiers": [ + { + "type": "dns", + "value": "db.profibot.hu" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632668458316" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/462430571446", + "certificate": "https://acme-v02.api.letsencrypt.org/acme/cert/059e768c03bb6e5072af72673a15a2d0f840" +} +2025-12-25 04:10:22,843:DEBUG:acme.client:Storing nonce: fULB7aUJXuClAWbLAo3PuZDS321otxL2fUuLlGHZNHxe_O4Sm4Y +2025-12-25 04:10:23,844:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:10:23,847:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/order/2906438176/462430571446: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSlh1Q2xBV2JMQW8zUHVaRFMzMjFvdHhMMmZVdUxsR0haTkh4ZV9PNFNtNFkiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL29yZGVyLzI5MDY0MzgxNzYvNDYyNDMwNTcxNDQ2In0", + "signature": "OOSjowsrWtN7jB4LzBdZk20TaEYTJrlha007jEPqQ2oLbeXR-TpzMFcgSixzQ2gqqg7DX323SLjGmwqCIYRN2q2DRs5aDOowpMPIcB-RtUaktl4xcyBa1fhOEuHLqWIrTBDbQVbTqBefZrqGv0pVYz-_8s7os7a_yhQQ-Rz9_VmBIfhnZLx1flUro7AOfTNscOa2i87ZybWTzzpxUdwMfnWELFZ8AAaSTzU1c_HW5OU5mkxilPgk63MrTdQyNVY-QB7lEKjNSMbo5cmt00Fh2GhyQ59av1dCI_r283NMF27dpMxkbWYqgLKhxYNaxw0RcMPdqwtz7vjM87eeaTaxog", + "payload": "" +} +2025-12-25 04:10:24,004:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/order/2906438176/462430571446 HTTP/1.1" 200 450 +2025-12-25 04:10:24,005:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:10:23 GMT +Content-Type: application/json +Content-Length: 450 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/462430571446 +Replay-Nonce: fULB7aUJhJMx015dKj86RWGgL0u2yqW8T2xAZ9WnGmQoJMpNktk +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "valid", + "expires": "2026-01-01T04:09:48Z", + "identifiers": [ + { + "type": "dns", + "value": "db.profibot.hu" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632668458316" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/462430571446", + "certificate": "https://acme-v02.api.letsencrypt.org/acme/cert/059e768c03bb6e5072af72673a15a2d0f840" +} +2025-12-25 04:10:24,006:DEBUG:acme.client:Storing nonce: fULB7aUJhJMx015dKj86RWGgL0u2yqW8T2xAZ9WnGmQoJMpNktk +2025-12-25 04:10:24,006:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:10:24,010:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/cert/059e768c03bb6e5072af72673a15a2d0f840: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSmhKTXgwMTVkS2o4NlJXR2dMMHUyeXFXOFQyeEFaOVduR21Rb0pNcE5rdGsiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NlcnQvMDU5ZTc2OGMwM2JiNmU1MDcyYWY3MjY3M2ExNWEyZDBmODQwIn0", + "signature": "NZViT4Xl6ggkR-NCmQvfgcNZYGQu7lZMy9n1CNF9KwvVJfwLW1DyRo_835QLa1oKlbknE03sviUJINaaBxpzGJR45Ae9K-JzaZ3PKl4Kt-8S2D7O3J43BriJAYBRld0gcyy_E96TGg0Q7iBbKXiu14YxtEQEkI2br7DOZ2Z9qpw9xTba3DA6RxgMKtE9K3XRzMRY-VWDnYeZg2PEFDZCDmcXQB5EBzel0ZFpT0WEUYErLwRs381wZ42PByC3PPcnIqbwVgylX79Qz7OokSQ_yJAjbtpfTeTjkW9_09wmzks9SdRjfVWIeKlobh7331mQSXV5T1d4r4_Z8r5CoLI9mw", + "payload": "" +} +2025-12-25 04:10:24,169:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/cert/059e768c03bb6e5072af72673a15a2d0f840 HTTP/1.1" 200 2905 +2025-12-25 04:10:24,170:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:10:24 GMT +Content-Type: application/pem-certificate-chain +Content-Length: 2905 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="alternate" +Replay-Nonce: 58tS3qjEqRjM6WTitM_4tpj1Oip-44cwn-bUMd_esElyQUGPacY +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +-----BEGIN CERTIFICATE----- +MIIDrjCCAzSgAwIBAgISBZ52jAO7blByr3JnOhWi0PhAMAoGCCqGSM49BAMDMDIx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF +NzAeFw0yNTEyMjUwMzExNTFaFw0yNjAzMjUwMzExNTBaMBkxFzAVBgNVBAMTDmRi +LnByb2ZpYm90Lmh1MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEWXMvMEIeqT/BIiIv +bx32iIua7YMHHNdIxCzLlP2hho74rE67sXKwcvt18MKcZfIDsqM6fzoTlCtDRzHm +jtAe8/iaVvBB2RmkXKB17FQrGA9t5cLqBm2xJ5x31rQ0qQtBo4ICJDCCAiAwDgYD +VR0PAQH/BAQDAgeAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNV +HRMBAf8EAjAAMB0GA1UdDgQWBBRVMInCsCl1VCSdcqEo/yMrJEYaYDAfBgNVHSME +GDAWgBSuSJ7chx1EoG/aouVgdAR4wpwAgDAyBggrBgEFBQcBAQQmMCQwIgYIKwYB +BQUHMAKGFmh0dHA6Ly9lNy5pLmxlbmNyLm9yZy8wGQYDVR0RBBIwEIIOZGIucHJv +Zmlib3QuaHUwEwYDVR0gBAwwCjAIBgZngQwBAgEwLQYDVR0fBCYwJDAioCCgHoYc +aHR0cDovL2U3LmMubGVuY3Iub3JnLzY1LmNybDCCAQwGCisGAQQB1nkCBAIEgf0E +gfoA+AB2ANFuqaVoB35mNaA/N6XdvAOlPEESFNSIGPXpMbMjy5UEAAABm1OzXFUA +AAQDAEcwRQIgNM4jgrhT8BREOSIZHL99IsylcPWwgmvYCmIY+GKy8v0CIQCmRZWo +ShoTtECtRbaWIRaojBBpafr01huWfMbSklfe0gB+AOMjjfKNoojgquCs8PqQyYXw +tr/10qUnsAH8HERYxLboAAABm1OzXbsACAAABQAtLYz3BAMARzBFAiEA9sjOV9J4 +mBiuHX43uxvdC1YWZZ5hWeZScHgDIxEIFSMCIAXL6slhAbeVhGvHeJyOQ+RlWorC +gjXrWCSEDBNrq4CtMAoGCCqGSM49BAMDA2gAMGUCMDW+HSJbA+YBTEmuK6KJwKPF ++lEElscDFB7cPyvvmmpWpYfY1XRMPeOsP8Fmu3pfnAIxAKo2I1RNBk5Ldzr2al7Q +zEiOFzJjnzMxL4LvTmJ80ogEBpXSVhmEGf8n5PwUIM8l5Q== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIEVzCCAj+gAwIBAgIRAKp18eYrjwoiCWbTi7/UuqEwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw +WhcNMjcwMzEyMjM1OTU5WjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg +RW5jcnlwdDELMAkGA1UEAxMCRTcwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARB6AST +CFh/vjcwDMCgQer+VtqEkz7JANurZxLP+U9TCeioL6sp5Z8VRvRbYk4P1INBmbef +QHJFHCxcSjKmwtvGBWpl/9ra8HW0QDsUaJW2qOJqceJ0ZVFT3hbUHifBM/2jgfgw +gfUwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcD +ATASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSuSJ7chx1EoG/aouVgdAR4 +wpwAgDAfBgNVHSMEGDAWgBR5tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcB +AQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0g +BAwwCjAIBgZngQwBAgEwJwYDVR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVu +Y3Iub3JnLzANBgkqhkiG9w0BAQsFAAOCAgEAjx66fDdLk5ywFn3CzA1w1qfylHUD +aEf0QZpXcJseddJGSfbUUOvbNR9N/QQ16K1lXl4VFyhmGXDT5Kdfcr0RvIIVrNxF +h4lqHtRRCP6RBRstqbZ2zURgqakn/Xip0iaQL0IdfHBZr396FgknniRYFckKORPG +yM3QKnd66gtMst8I5nkRQlAg/Jb+Gc3egIvuGKWboE1G89NTsN9LTDD3PLj0dUMr +OIuqVjLB8pEC6yk9enrlrqjXQgkLEYhXzq7dLafv5Vkig6Gl0nuuqjqfp0Q1bi1o +yVNAlXe6aUXw92CcghC9bNsKEO1+M52YY5+ofIXlS/SEQbvVYYBLZ5yeiglV6t3S +M6H+vTG0aP9YHzLn/KVOHzGQfXDP7qM5tkf+7diZe7o2fw6O7IvN6fsQXEQQj8TJ +UXJxv2/uJhcuy/tSDgXwHM8Uk34WNbRT7zGTGkQRX0gsbjAea/jYAoWv0ZvQRwpq +Pe79D/i7Cep8qWnA+7AE/3B3S/3dEEYmc0lpe1366A/6GEgk3ktr9PEoQrLChs6I +tu3wnNLB2euC8IKGLQFpGtOO/2/hiAKjyajaBP25w1jF0Wl8Bbqne3uZ2q1GyPFJ +YRmT7/OXpmOH/FVLtwS+8ng1cAmpCujPwteJZNcDG0sF2n/sc0+SQf49fdyUK0ty ++VUwFj9tmWxyR/M= +-----END CERTIFICATE----- + +2025-12-25 04:10:24,170:DEBUG:acme.client:Storing nonce: 58tS3qjEqRjM6WTitM_4tpj1Oip-44cwn-bUMd_esElyQUGPacY +2025-12-25 04:10:24,171:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:10:24,174:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/cert/059e768c03bb6e5072af72673a15a2d0f840/1: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRXFSak02V1RpdE1fNHRwajFPaXAtNDRjd24tYlVNZF9lc0VseVFVR1BhY1kiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NlcnQvMDU5ZTc2OGMwM2JiNmU1MDcyYWY3MjY3M2ExNWEyZDBmODQwLzEifQ", + "signature": "SJODObCMrRTN94Vsg58YCsuqunqLWzbMBuc_A7VR5QLq0J8ixQz4juXoQ-rG8naW4QVK4iBP2XsGeNE53opijiPlCEOUCfHSiKY37nGQ6ymdx4S3BkFTT2CG-jll9aUf6akqr6FJ_qv5NlbV2veYoCwG4AYuxvRLH--TKvTmbrMd9JdjTHDRvUkHyx1bl7lJk22muWDNSynxI-bQprNP1zrHL8RwwzqvaUulSYCppMPiAkxe0PisR0fPsaHm1xeIQZPdVTC3rIwYhdpFSsBFzIfGBMYoAvIvhmbz89zWQt9mOsmBoSUiM7yXTf-okcpjQ8720qjz77I-O5lPtGCl5w", + "payload": "" +} +2025-12-25 04:10:24,332:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/cert/059e768c03bb6e5072af72673a15a2d0f840/1 HTTP/1.1" 200 2340 +2025-12-25 04:10:24,333:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:10:24 GMT +Content-Type: application/pem-certificate-chain +Content-Length: 2340 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="alternate" +Replay-Nonce: 58tS3qjEkp5_5jVZNb_is73D3aR-KIK7Op_XgCfrQVQOaBypP-k +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +-----BEGIN CERTIFICATE----- +MIIDrjCCAzSgAwIBAgISBZ52jAO7blByr3JnOhWi0PhAMAoGCCqGSM49BAMDMDIx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF +NzAeFw0yNTEyMjUwMzExNTFaFw0yNjAzMjUwMzExNTBaMBkxFzAVBgNVBAMTDmRi +LnByb2ZpYm90Lmh1MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEWXMvMEIeqT/BIiIv +bx32iIua7YMHHNdIxCzLlP2hho74rE67sXKwcvt18MKcZfIDsqM6fzoTlCtDRzHm +jtAe8/iaVvBB2RmkXKB17FQrGA9t5cLqBm2xJ5x31rQ0qQtBo4ICJDCCAiAwDgYD +VR0PAQH/BAQDAgeAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNV +HRMBAf8EAjAAMB0GA1UdDgQWBBRVMInCsCl1VCSdcqEo/yMrJEYaYDAfBgNVHSME +GDAWgBSuSJ7chx1EoG/aouVgdAR4wpwAgDAyBggrBgEFBQcBAQQmMCQwIgYIKwYB +BQUHMAKGFmh0dHA6Ly9lNy5pLmxlbmNyLm9yZy8wGQYDVR0RBBIwEIIOZGIucHJv +Zmlib3QuaHUwEwYDVR0gBAwwCjAIBgZngQwBAgEwLQYDVR0fBCYwJDAioCCgHoYc +aHR0cDovL2U3LmMubGVuY3Iub3JnLzY1LmNybDCCAQwGCisGAQQB1nkCBAIEgf0E +gfoA+AB2ANFuqaVoB35mNaA/N6XdvAOlPEESFNSIGPXpMbMjy5UEAAABm1OzXFUA +AAQDAEcwRQIgNM4jgrhT8BREOSIZHL99IsylcPWwgmvYCmIY+GKy8v0CIQCmRZWo +ShoTtECtRbaWIRaojBBpafr01huWfMbSklfe0gB+AOMjjfKNoojgquCs8PqQyYXw +tr/10qUnsAH8HERYxLboAAABm1OzXbsACAAABQAtLYz3BAMARzBFAiEA9sjOV9J4 +mBiuHX43uxvdC1YWZZ5hWeZScHgDIxEIFSMCIAXL6slhAbeVhGvHeJyOQ+RlWorC +gjXrWCSEDBNrq4CtMAoGCCqGSM49BAMDA2gAMGUCMDW+HSJbA+YBTEmuK6KJwKPF ++lEElscDFB7cPyvvmmpWpYfY1XRMPeOsP8Fmu3pfnAIxAKo2I1RNBk5Ldzr2al7Q +zEiOFzJjnzMxL4LvTmJ80ogEBpXSVhmEGf8n5PwUIM8l5Q== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIICtzCCAjygAwIBAgIRAMWKhaLGI0XgqMRSU4efWTowCgYIKoZIzj0EAwMwTzEL +MAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNo +IEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDIwHhcNMjQwMzEzMDAwMDAwWhcN +MjcwMzEyMjM1OTU5WjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3MgRW5j +cnlwdDELMAkGA1UEAxMCRTcwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARB6ASTCFh/ +vjcwDMCgQer+VtqEkz7JANurZxLP+U9TCeioL6sp5Z8VRvRbYk4P1INBmbefQHJF +HCxcSjKmwtvGBWpl/9ra8HW0QDsUaJW2qOJqceJ0ZVFT3hbUHifBM/2jgfgwgfUw +DgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATAS +BgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSuSJ7chx1EoG/aouVgdAR4wpwA +gDAfBgNVHSMEGDAWgBR8Qpau3ktIO/qS+J6Mz22LqXI3lTAyBggrBgEFBQcBAQQm +MCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly94Mi5pLmxlbmNyLm9yZy8wEwYDVR0gBAww +CjAIBgZngQwBAgEwJwYDVR0fBCAwHjAcoBqgGIYWaHR0cDovL3gyLmMubGVuY3Iu +b3JnLzAKBggqhkjOPQQDAwNpADBmAjEA/e5N+wjAk945cpaFxGaeMC13fyvdbNzX +lRg9HNdElxi5mXdI4az2CykNU07iFwqEAjEAihPCDkw4b1BvfLg8VNLLuaMpn1Rb +Z1682chR6zNRCseyie4SjyTCdkvsAa+omQSf +-----END CERTIFICATE----- + +2025-12-25 04:10:24,333:DEBUG:acme.client:Storing nonce: 58tS3qjEkp5_5jVZNb_is73D3aR-KIK7Op_XgCfrQVQOaBypP-k +2025-12-25 04:10:24,335:INFO:certbot._internal.client:Non-standard path(s), might not work with crontab installed by your operating system package manager +2025-12-25 04:10:24,336:DEBUG:certbot._internal.storage:Creating directory /etc/letsencrypt/archive/npm-14. +2025-12-25 04:10:24,336:DEBUG:certbot._internal.storage:Creating directory /etc/letsencrypt/live/npm-14. +2025-12-25 04:10:24,336:DEBUG:certbot._internal.storage:Writing certificate to /etc/letsencrypt/live/npm-14/cert.pem. +2025-12-25 04:10:24,336:DEBUG:certbot._internal.storage:Writing private key to /etc/letsencrypt/live/npm-14/privkey.pem. +2025-12-25 04:10:24,337:DEBUG:certbot._internal.storage:Writing chain to /etc/letsencrypt/live/npm-14/chain.pem. +2025-12-25 04:10:24,337:DEBUG:certbot._internal.storage:Writing full chain to /etc/letsencrypt/live/npm-14/fullchain.pem. +2025-12-25 04:10:24,337:DEBUG:certbot._internal.storage:Writing README to /etc/letsencrypt/live/npm-14/README. +2025-12-25 04:10:24,347:DEBUG:certbot.configuration:Var account=e417a583de478a0cfdeed332c1113068 (set by user). +2025-12-25 04:10:24,347:DEBUG:certbot.configuration:Var key_type=ecdsa (set by user). +2025-12-25 04:10:24,347:DEBUG:certbot.configuration:Var elliptic_curve=secp384r1 (set by user). +2025-12-25 04:10:24,347:DEBUG:certbot.configuration:Var preferred_chain=ISRG Root X1 (set by user). +2025-12-25 04:10:24,347:DEBUG:certbot.configuration:Var pref_challs=['http-01'] (set by user). +2025-12-25 04:10:24,347:DEBUG:certbot.configuration:Var config_dir=/etc/letsencrypt (set by user). +2025-12-25 04:10:24,347:DEBUG:certbot.configuration:Var work_dir=/tmp/letsencrypt-lib (set by user). +2025-12-25 04:10:24,347:DEBUG:certbot.configuration:Var logs_dir=/data/logs (set by user). +2025-12-25 04:10:24,348:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2025-12-25 04:10:24,348:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2025-12-25 04:10:24,348:DEBUG:certbot.configuration:Var webroot_path=['/data/letsencrypt-acme-challenge'] (set by user). +2025-12-25 04:10:24,348:DEBUG:certbot.configuration:Var webroot_map={'db.profibot.hu': '/data/letsencrypt-acme-challenge'} (set by user). +2025-12-25 04:10:24,349:DEBUG:certbot._internal.display.obj:Notifying user: +Successfully received certificate. +Certificate is saved at: /etc/letsencrypt/live/npm-14/fullchain.pem +Key is saved at: /etc/letsencrypt/live/npm-14/privkey.pem +This certificate expires on 2026-03-25. +These files will be updated when the certificate renews. +2025-12-25 04:10:24,349:DEBUG:certbot._internal.display.obj:Notifying user: NEXT STEPS: +2025-12-25 04:10:24,349:DEBUG:certbot._internal.display.obj:Notifying user: - The certificate will need to be renewed before it expires. Certbot can automatically renew the certificate in the background, but you may need to take steps to enable that functionality. See https://certbot.org/renewal-setup for instructions. +2025-12-25 04:10:24,350:DEBUG:certbot._internal.display.obj:Notifying user: If you like Certbot, please consider supporting our work by: + * Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate + * Donating to EFF: https://eff.org/donate-le diff --git a/proxy-manager/data/logs/letsencrypt.log.6 b/proxy-manager/data/logs/letsencrypt.log.6 new file mode 100755 index 0000000..3c981bf --- /dev/null +++ b/proxy-manager/data/logs/letsencrypt.log.6 @@ -0,0 +1,555 @@ +2025-12-25 04:09:22,736:DEBUG:certbot._internal.main:certbot version: 5.1.0 +2025-12-25 04:09:22,736:DEBUG:certbot._internal.main:Location of certbot entry point: /opt/certbot/bin/certbot +2025-12-25 04:09:22,736:DEBUG:certbot._internal.main:Arguments: ['--config', '/etc/letsencrypt.ini', '--work-dir', '/tmp/letsencrypt-lib', '--logs-dir', '/data/logs', '--cert-name', 'npm-13', '--agree-tos', '--authenticator', 'webroot', '-m', 'kincses@gmail.com', '--preferred-challenges', 'http', '--domains', 'nas.profibot.hu'] +2025-12-25 04:09:22,736:DEBUG:certbot._internal.main:Discovered plugins: PluginsRegistry(PluginEntryPoint#manual,PluginEntryPoint#null,PluginEntryPoint#standalone,PluginEntryPoint#webroot) +2025-12-25 04:09:22,746:DEBUG:certbot._internal.log:Root logging level set at 30 +2025-12-25 04:09:22,747:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2025-12-25 04:09:22,747:DEBUG:certbot._internal.plugins.selection:Single candidate plugin: * webroot +Description: Saves the necessary validation files to a .well-known/acme-challenge/ directory within the nominated webroot path. A separate HTTP server must be running and serving files from the webroot path. HTTP challenge only (wildcards not supported). +Interfaces: Authenticator, Plugin +Entry point: EntryPoint(name='webroot', value='certbot._internal.plugins.webroot:Authenticator', group='certbot.plugins') +Initialized: +Prep: True +2025-12-25 04:09:22,747:DEBUG:certbot._internal.plugins.selection:Selected authenticator and installer None +2025-12-25 04:09:22,747:INFO:certbot._internal.plugins.selection:Plugins selected: Authenticator webroot, Installer None +2025-12-25 04:09:22,784:DEBUG:certbot._internal.main:Picked account: +2025-12-25 04:09:22,785:DEBUG:acme.client:Sending GET request to https://acme-v02.api.letsencrypt.org/directory. +2025-12-25 04:09:22,786:DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org:443 +2025-12-25 04:09:23,219:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "GET /directory HTTP/1.1" 200 1033 +2025-12-25 04:09:23,220:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:09:23 GMT +Content-Type: application/json +Content-Length: 1033 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "U_gvOrHlMcM": "https://community.letsencrypt.org/t/adding-random-entries-to-the-directory/33417", + "keyChange": "https://acme-v02.api.letsencrypt.org/acme/key-change", + "meta": { + "caaIdentities": [ + "letsencrypt.org" + ], + "profiles": { + "classic": "https://letsencrypt.org/docs/profiles#classic", + "shortlived": "https://letsencrypt.org/docs/profiles#shortlived", + "tlsclient": "https://letsencrypt.org/docs/profiles#tlsclient", + "tlsserver": "https://letsencrypt.org/docs/profiles#tlsserver" + }, + "termsOfService": "https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf", + "website": "https://letsencrypt.org" + }, + "newAccount": "https://acme-v02.api.letsencrypt.org/acme/new-acct", + "newNonce": "https://acme-v02.api.letsencrypt.org/acme/new-nonce", + "newOrder": "https://acme-v02.api.letsencrypt.org/acme/new-order", + "renewalInfo": "https://acme-v02.api.letsencrypt.org/acme/renewal-info", + "revokeCert": "https://acme-v02.api.letsencrypt.org/acme/revoke-cert" +} +2025-12-25 04:09:23,221:DEBUG:certbot._internal.display.obj:Notifying user: Requesting a certificate for nas.profibot.hu +2025-12-25 04:09:23,224:DEBUG:acme.client:Requesting fresh nonce +2025-12-25 04:09:23,225:DEBUG:acme.client:Sending HEAD request to https://acme-v02.api.letsencrypt.org/acme/new-nonce. +2025-12-25 04:09:23,366:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "HEAD /acme/new-nonce HTTP/1.1" 200 0 +2025-12-25 04:09:23,367:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:09:23 GMT +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: GxwILcG0WSeKmX2qWUPlMt8T9a2WwxCCQv23ARoSt8sPWWR6SBw +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + + +2025-12-25 04:09:23,367:DEBUG:acme.client:Storing nonce: GxwILcG0WSeKmX2qWUPlMt8T9a2WwxCCQv23ARoSt8sPWWR6SBw +2025-12-25 04:09:23,368:DEBUG:acme.client:JWS payload: +b'{\n "identifiers": [\n {\n "type": "dns",\n "value": "nas.profibot.hu"\n }\n ]\n}' +2025-12-25 04:09:23,373:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/new-order: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJHeHdJTGNHMFdTZUttWDJxV1VQbE10OFQ5YTJXd3hDQ1F2MjNBUm9TdDhzUFdXUjZTQnciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL25ldy1vcmRlciJ9", + "signature": "TFfao0EZ-8OZiT6Q8BOSCeyJUroydDm4xs_rasggfzRWdzWJqIxjv5nsVcmavBK0jpOrzQfp8wxBFE_iXaZ587GQnKAmAUOrmk3uiKk-QQBRPcAm9UgguQ6NN1GEV-r0V1JjZ8-Ps7Z1DCYc5EvA71zmyaA0yOAnJl0kcTD7YzZzm5EO8COPAE_H3jIPyV4d0CcVydNgQ3e--S8B0x7JbjpAA2hzRR2kXAuUObG4lfd261i5NynWejGn_XjfGjeROYdHHDNY8P1b99vKDWru3shjwtg21tlAQdUZh8LGtVgfBr02YNlejCYxnhxuIpwGkp-k85ll8_d89mt31qoz4Q", + "payload": "ewogICJpZGVudGlmaWVycyI6IFsKICAgIHsKICAgICAgInR5cGUiOiAiZG5zIiwKICAgICAgInZhbHVlIjogIm5hcy5wcm9maWJvdC5odSIKICAgIH0KICBdCn0" +} +2025-12-25 04:09:23,662:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/new-order HTTP/1.1" 201 349 +2025-12-25 04:09:23,663:DEBUG:acme.client:Received response: +HTTP 201 +Server: nginx +Date: Thu, 25 Dec 2025 04:09:23 GMT +Content-Type: application/json +Content-Length: 349 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/462430466376 +Replay-Nonce: GxwILcG0FE92gd3eU2CpIkiOFMDIjR8zA63O-eD5YqaFyP6rfXA +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "pending", + "expires": "2026-01-01T04:09:23Z", + "identifiers": [ + { + "type": "dns", + "value": "nas.profibot.hu" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632668310106" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/462430466376" +} +2025-12-25 04:09:23,663:DEBUG:acme.client:Storing nonce: GxwILcG0FE92gd3eU2CpIkiOFMDIjR8zA63O-eD5YqaFyP6rfXA +2025-12-25 04:09:23,664:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:09:23,666:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632668310106: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJHeHdJTGNHMEZFOTJnZDNlVTJDcElraU9GTURJalI4ekE2M08tZUQ1WXFhRnlQNnJmWEEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY4MzEwMTA2In0", + "signature": "Q59gd_eupuJUzVfnoWCofcRrpZ-JWls1kpsEBkpzaR5AdMNBOjlFMJ7v5iE5xP59g2SWgq4jobCY3CWdVCXHwhNPT-dgFFmDxD0KklWq7ipWKGQJpFS6I2Ebkd7O9cyM2uVC8MvVQBtbLO_4ymcdMbPnjBR1jpbendS9GVaHSsJH2RNibaM-jg6OtIpT1B24R5AOxhRfqKEmreyW23b_8-WcVNIk24JDeNE_t1rwkpiSRlgHFLd1V3OYRhh-DrJWvAC9QG7hWjI_4rKplMB1PajgUX352yHDVkQXJoo_uvehMoS_n-4f9S00bQ4PsyU5DMMBz3Cg2B9_48Cvaj-WDA", + "payload": "" +} +2025-12-25 04:09:23,824:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632668310106 HTTP/1.1" 200 823 +2025-12-25 04:09:23,825:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:09:23 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: IijzadlSS3abUwkXSyiy7jDAA0_fhHsZOqcV_8Jwxn1zdWl719c +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:09:23Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668310106/vdyVRA", + "status": "pending", + "token": "Iot0v1Xxkb508cAeBhmdL_wNhDnThji0ZpA0RH4aSjA" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668310106/gLoV1g", + "status": "pending", + "token": "Iot0v1Xxkb508cAeBhmdL_wNhDnThji0ZpA0RH4aSjA" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668310106/wahgYg", + "status": "pending", + "token": "Iot0v1Xxkb508cAeBhmdL_wNhDnThji0ZpA0RH4aSjA" + } + ] +} +2025-12-25 04:09:23,825:DEBUG:acme.client:Storing nonce: IijzadlSS3abUwkXSyiy7jDAA0_fhHsZOqcV_8Jwxn1zdWl719c +2025-12-25 04:09:23,826:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668310106/vdyVRA', 'status': 'pending', 'token': 'Iot0v1Xxkb508cAeBhmdL_wNhDnThji0ZpA0RH4aSjA'} +2025-12-25 04:09:23,827:INFO:certbot._internal.auth_handler:Performing the following challenges: +2025-12-25 04:09:23,827:INFO:certbot._internal.auth_handler:http-01 challenge for nas.profibot.hu +2025-12-25 04:09:23,827:INFO:certbot._internal.plugins.webroot:Using the webroot path /data/letsencrypt-acme-challenge for all unmatched domains. +2025-12-25 04:09:23,828:DEBUG:certbot._internal.plugins.webroot:Creating root challenges validation dir at /data/letsencrypt-acme-challenge/.well-known/acme-challenge +2025-12-25 04:09:23,830:DEBUG:certbot._internal.plugins.webroot:Attempting to save validation to /data/letsencrypt-acme-challenge/.well-known/acme-challenge/Iot0v1Xxkb508cAeBhmdL_wNhDnThji0ZpA0RH4aSjA +2025-12-25 04:09:23,831:DEBUG:acme.client:JWS payload: +b'{}' +2025-12-25 04:09:23,834:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668310106/gLoV1g: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJJaWp6YWRsU1MzYWJVd2tYU3lpeTdqREFBMF9maEhzWk9xY1ZfOEp3eG4xemRXbDcxOWMiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NoYWxsLzI5MDY0MzgxNzYvNjMyNjY4MzEwMTA2L2dMb1YxZyJ9", + "signature": "EG7Ed-BRv2Np1QDY2H6jxjPW4oydeHZRt7S1vdrrUwOv5IIeQ45e67FF9fvII8mc0FHlRT-2AsgT3KuwUUQn_Lbf7YEYmjEM30tD4q_0cWDp-A8GU3rvJos_j293_xKC4j5GJI_QEnMDt_h5j6tGU74l4nFXCmT_fEt5CnvK8UYTBs5FSo9Z93qG5X0uoddSVi4yq39UCO763TE0z6ilDoODhcnmuLFGZnjLcnR-cfjeEoOgI8EQ2K5XtiTzeLvGtU3vucyr7drckTTnV4-gXW03zglW3_2UHH2yWH3i4cC23PMhzrLed7tC15ylK9ZbrwrZlhNgchfgSvWhHhE9FA", + "payload": "e30" +} +2025-12-25 04:09:23,982:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/chall/2906438176/632668310106/gLoV1g HTTP/1.1" 200 195 +2025-12-25 04:09:23,983:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:09:23 GMT +Content-Type: application/json +Content-Length: 195 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="up" +Location: https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668310106/gLoV1g +Replay-Nonce: IijzadlSnnnt4Lv5jvUgybUenHUp_iI_FOYJEhTX6pQG0V4xNEQ +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668310106/gLoV1g", + "status": "pending", + "token": "Iot0v1Xxkb508cAeBhmdL_wNhDnThji0ZpA0RH4aSjA" +} +2025-12-25 04:09:23,983:DEBUG:acme.client:Storing nonce: IijzadlSnnnt4Lv5jvUgybUenHUp_iI_FOYJEhTX6pQG0V4xNEQ +2025-12-25 04:09:23,984:INFO:certbot._internal.auth_handler:Waiting for verification... +2025-12-25 04:09:24,984:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:09:24,988:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632668310106: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJJaWp6YWRsU25ubnQ0THY1anZVZ3liVWVuSFVwX2lJX0ZPWUpFaFRYNnBRRzBWNHhORVEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY4MzEwMTA2In0", + "signature": "KLkqdOqCiZZiFv1pu3CD9Uljx9C5PpDMWX10p1UcvX3p9VPQFQDBjZkpTsyESwmb2CeMR5Wv1pOSthrxYp2_rxPsEQNDaU1CU-AUgMOuqt1ruX4hwEdcrCts6NRcL6JVyRcE5mXzzcPoIUTpLCH5haB0Vb3-E1UlST4gptDVF4O1XoqDMO9H3-at2wCoDJtbTLpQca7ASF5Cm1bm8jzczvHOaXWtKkzrphlL3JSAmldQkzgEKkSsuq_qJmOSnTjL91-IIbEI5fflyN2d0LkvV97OEvTtqy9IdkO65RkyAJAgy9Vh-X41x47AleNRAyvzo5figTajlkMJhyYygZayYA", + "payload": "" +} +2025-12-25 04:09:25,133:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632668310106 HTTP/1.1" 200 823 +2025-12-25 04:09:25,134:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:09:25 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: IijzadlSJYZnykNqqDEF6HJrdAjtjxxk23maCbWipwtEmH0bTvQ +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:09:23Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668310106/wahgYg", + "status": "pending", + "token": "Iot0v1Xxkb508cAeBhmdL_wNhDnThji0ZpA0RH4aSjA" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668310106/gLoV1g", + "status": "pending", + "token": "Iot0v1Xxkb508cAeBhmdL_wNhDnThji0ZpA0RH4aSjA" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668310106/vdyVRA", + "status": "pending", + "token": "Iot0v1Xxkb508cAeBhmdL_wNhDnThji0ZpA0RH4aSjA" + } + ] +} +2025-12-25 04:09:25,134:DEBUG:acme.client:Storing nonce: IijzadlSJYZnykNqqDEF6HJrdAjtjxxk23maCbWipwtEmH0bTvQ +2025-12-25 04:09:25,135:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668310106/vdyVRA', 'status': 'pending', 'token': 'Iot0v1Xxkb508cAeBhmdL_wNhDnThji0ZpA0RH4aSjA'} +2025-12-25 04:09:28,136:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:09:28,140:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632668310106: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJJaWp6YWRsU0pZWm55a05xcURFRjZISnJkQWp0anh4azIzbWFDYldpcHd0RW1IMGJUdlEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY4MzEwMTA2In0", + "signature": "j9ICCBNlDmEij4maMjEMLYeKxpVBDwcVMxj2tpxbR-VAMS5LEA_tT4HqRsCXHGGkoPnUFpQuYaA7cnXa5NsuRS5HFdrxzv1wqhaTU2XcSIJIyhoFgMZSs1wG_knflyHyR41Ovmv-HS35Wy58AmzQZbELD1oQAWZM6QN2KqJ_WzUTq6pA0psdbnxMCLW3D0P8dmBuHPSiqkdXP2ez8qWcmayUXSWbDKOXRRONq308CqRHGtDRbd-SeSuQuxolGbIDXQoGtzRTBzQSYgKivxsl8Udw2S-vciz5OrS1AsAOjBfTXIIYLuqD5QPq9HSJHA7NYKIzE2bXFeto9jyk2hiDZQ", + "payload": "" +} +2025-12-25 04:09:28,285:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632668310106 HTTP/1.1" 200 770 +2025-12-25 04:09:28,286:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:09:28 GMT +Content-Type: application/json +Content-Length: 770 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: IijzadlS8mKoPlReGMXvx75U6K7GtYNJK9i6VG9ZtrNglsnIofA +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "valid", + "expires": "2026-01-24T04:09:26Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632668310106/gLoV1g", + "status": "valid", + "validated": "2025-12-25T04:09:23Z", + "token": "Iot0v1Xxkb508cAeBhmdL_wNhDnThji0ZpA0RH4aSjA", + "validationRecord": [ + { + "url": "http://nas.profibot.hu/.well-known/acme-challenge/Iot0v1Xxkb508cAeBhmdL_wNhDnThji0ZpA0RH4aSjA", + "hostname": "nas.profibot.hu", + "port": "80", + "addressesResolved": [ + "92.249.165.228" + ], + "addressUsed": "92.249.165.228" + } + ] + } + ] +} +2025-12-25 04:09:28,286:DEBUG:acme.client:Storing nonce: IijzadlS8mKoPlReGMXvx75U6K7GtYNJK9i6VG9ZtrNglsnIofA +2025-12-25 04:09:28,287:DEBUG:certbot._internal.error_handler:Calling registered functions +2025-12-25 04:09:28,287:INFO:certbot._internal.auth_handler:Cleaning up challenges +2025-12-25 04:09:28,287:DEBUG:certbot._internal.plugins.webroot:Removing /data/letsencrypt-acme-challenge/.well-known/acme-challenge/Iot0v1Xxkb508cAeBhmdL_wNhDnThji0ZpA0RH4aSjA +2025-12-25 04:09:28,288:DEBUG:certbot._internal.plugins.webroot:All challenges cleaned up +2025-12-25 04:09:28,289:DEBUG:certbot._internal.client:CSR: CSR(file=None, data=b'-----BEGIN CERTIFICATE REQUEST-----\nMIIBJjCBrAIBADAAMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEE3eB1LFmzamZEnOk\nbzuj9TOLtsYhA2FtxhQAXhD6ZRs5uBLGdEi4ek98DI0wFBGrQkN/em+ZF0a0StL6\ny4YbjEMZdYQM12Pj0GaqJupjXMn3Dadu6P4bubsU7CMJW6gUoC0wKwYJKoZIhvcN\nAQkOMR4wHDAaBgNVHREEEzARgg9uYXMucHJvZmlib3QuaHUwCgYIKoZIzj0EAwID\naQAwZgIxAP2ReBAgZaB+W81mgk6wGBqQjAW1nxhEXy588a4IOoE5/nGkC4grPpLD\nUiNY9fCo7AIxAIx+S1sOz9hkcqmIByt2svYfe+iUSozUEye5jocm0eyPkn/Spc+m\nyKmvMSzy9yRJPw==\n-----END CERTIFICATE REQUEST-----\n', form='pem') +2025-12-25 04:09:28,289:DEBUG:certbot._internal.client:Will poll for certificate issuance until 2025-12-25 04:10:58.289689 +2025-12-25 04:09:28,290:DEBUG:acme.client:JWS payload: +b'{\n "csr": "MIIBJjCBrAIBADAAMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEE3eB1LFmzamZEnOkbzuj9TOLtsYhA2FtxhQAXhD6ZRs5uBLGdEi4ek98DI0wFBGrQkN_em-ZF0a0StL6y4YbjEMZdYQM12Pj0GaqJupjXMn3Dadu6P4bubsU7CMJW6gUoC0wKwYJKoZIhvcNAQkOMR4wHDAaBgNVHREEEzARgg9uYXMucHJvZmlib3QuaHUwCgYIKoZIzj0EAwIDaQAwZgIxAP2ReBAgZaB-W81mgk6wGBqQjAW1nxhEXy588a4IOoE5_nGkC4grPpLDUiNY9fCo7AIxAIx-S1sOz9hkcqmIByt2svYfe-iUSozUEye5jocm0eyPkn_Spc-myKmvMSzy9yRJPw"\n}' +2025-12-25 04:09:28,294:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/462430466376: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJJaWp6YWRsUzhtS29QbFJlR01Ydng3NVU2SzdHdFlOSks5aTZWRzladHJOZ2xzbklvZkEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2ZpbmFsaXplLzI5MDY0MzgxNzYvNDYyNDMwNDY2Mzc2In0", + "signature": "d-6mMMrfk_gXhXBYk0dVGCpoOPJVuRYgonPm17bCPlQWWIC35SE5FK1ZZ9gAa_R2Ru1vCsKjHSiUwxlZiBn-MYcEB-ytwFCu5d7tedcHmQ0Pgl-yw-hEq2XZxIvRu56xpsIIfY5DntHg6pYrtZa2dHFc4LwgAqsTwZ3NihBfFJHxOOLI1A3nkbsXTAOoA49_Wc2Aw2uwxnPMiflmeS5eVp4Ikdfo6CtGmgphZgjiFJSUOpiaJstz-iK893G4ham46-oVEutR5_oyjyo67Jo9_ACxGoTFuZROA2PuVizlwz5-l5-vgT_hWhmpHMWBorRHc-YntK4zLL7uRQr2_zqiGA", + "payload": "ewogICJjc3IiOiAiTUlJQkpqQ0JyQUlCQURBQU1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFRTNlQjFMRm16YW1aRW5Pa2J6dWo5VE9MdHNZaEEyRnR4aFFBWGhENlpSczV1QkxHZEVpNGVrOThESTB3RkJHclFrTl9lbS1aRjBhMFN0TDZ5NFliakVNWmRZUU0xMlBqMEdhcUp1cGpYTW4zRGFkdTZQNGJ1YnNVN0NNSlc2Z1VvQzB3S3dZSktvWklodmNOQVFrT01SNHdIREFhQmdOVkhSRUVFekFSZ2c5dVlYTXVjSEp2Wm1saWIzUXVhSFV3Q2dZSUtvWkl6ajBFQXdJRGFRQXdaZ0l4QVAyUmVCQWdaYUItVzgxbWdrNndHQnFRakFXMW54aEVYeTU4OGE0SU9vRTVfbkdrQzRnclBwTERVaU5ZOWZDbzdBSXhBSXgtUzFzT3o5aGtjcW1JQnl0MnN2WWZlLWlVU296VUV5ZTVqb2NtMGV5UGtuX1NwYy1teUttdk1Tenk5eVJKUHciCn0" +} +2025-12-25 04:09:29,187:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/finalize/2906438176/462430466376 HTTP/1.1" 200 451 +2025-12-25 04:09:29,188:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:09:29 GMT +Content-Type: application/json +Content-Length: 451 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/462430466376 +Replay-Nonce: GxwILcG0Ajt6_1VE6pflElBE5I_-qk7Gr4hRN1jIsv84fgp-IEM +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "valid", + "expires": "2026-01-01T04:09:23Z", + "identifiers": [ + { + "type": "dns", + "value": "nas.profibot.hu" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632668310106" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/462430466376", + "certificate": "https://acme-v02.api.letsencrypt.org/acme/cert/06ddfc6b66c7552730015f8d08f97267ecc7" +} +2025-12-25 04:09:29,189:DEBUG:acme.client:Storing nonce: GxwILcG0Ajt6_1VE6pflElBE5I_-qk7Gr4hRN1jIsv84fgp-IEM +2025-12-25 04:09:30,190:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:09:30,193:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/order/2906438176/462430466376: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJHeHdJTGNHMEFqdDZfMVZFNnBmbEVsQkU1SV8tcWs3R3I0aFJOMWpJc3Y4NGZncC1JRU0iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL29yZGVyLzI5MDY0MzgxNzYvNDYyNDMwNDY2Mzc2In0", + "signature": "HKh-H0saZa3IXWRp9S__qvPVxsv5NaGZFOestcFNbYWnQB5Jg8smJB8J3kpkDpTIl8BuhVPNvQKycC1H9folU94X6yPsPEGsYpoV3_SE5Y1e2r1gRcGfP2O_fglMG0JnRbzul7lv_aN_225E_ngE7yek3nxOFf94jbQjesLZNP57ml00YTKSELFC09F6zO4huUu3Mdb7TeaBrWoWbAG_HYWb7y4PYWQTpEkRx8jO0SZNoi0NdmHJzwB6UxdgdMJ1d8SenHX2apTzMcrIGM-WrTUs9pLv1LA5c4EIRwmyWydyPDEnyBzJPeKk5bdY32iPN_84iQ1lTra0h_wWHPFMAg", + "payload": "" +} +2025-12-25 04:09:30,338:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/order/2906438176/462430466376 HTTP/1.1" 200 451 +2025-12-25 04:09:30,339:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:09:30 GMT +Content-Type: application/json +Content-Length: 451 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/462430466376 +Replay-Nonce: IijzadlSgPgNpiJVF92CEezFu8f0yABQFXqOZXt88aXN1NQneBQ +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "valid", + "expires": "2026-01-01T04:09:23Z", + "identifiers": [ + { + "type": "dns", + "value": "nas.profibot.hu" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632668310106" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/462430466376", + "certificate": "https://acme-v02.api.letsencrypt.org/acme/cert/06ddfc6b66c7552730015f8d08f97267ecc7" +} +2025-12-25 04:09:30,340:DEBUG:acme.client:Storing nonce: IijzadlSgPgNpiJVF92CEezFu8f0yABQFXqOZXt88aXN1NQneBQ +2025-12-25 04:09:30,340:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:09:30,344:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/cert/06ddfc6b66c7552730015f8d08f97267ecc7: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJJaWp6YWRsU2dQZ05waUpWRjkyQ0VlekZ1OGYweUFCUUZYcU9aWHQ4OGFYTjFOUW5lQlEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NlcnQvMDZkZGZjNmI2NmM3NTUyNzMwMDE1ZjhkMDhmOTcyNjdlY2M3In0", + "signature": "OLFSmueuYS_5TQ3CTZTvzFkiWcKuaSvg4Rl7QWcestp6Adlsd6eNzaKPoqM5YCXrxB4u8MLB-V-7n-p4MGsIk32pzrTnOvaP-v2n1stRtomSSDrsqY75rajDsRqAeadidoPzqDSk3GtaHslf93chI_XkisgxoxD-0AA95NEif_bI7l4dh9cArFX9h6tLC0DYZbjrklKujSt8JjErgM6WNOro-Wt7_ek1hGFN44izlsESV6kHCBd0ogk6u64_TFuar-V8kIW72RNwE4qfy95MbDoi-IVI6tXwje4SHYOc0XPBTRBD0-O-SyLSP6_OAJjsnaEqQfKnYW1veeVmMJbs5g", + "payload": "" +} +2025-12-25 04:09:30,491:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/cert/06ddfc6b66c7552730015f8d08f97267ecc7 HTTP/1.1" 200 2909 +2025-12-25 04:09:30,492:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:09:30 GMT +Content-Type: application/pem-certificate-chain +Content-Length: 2909 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="alternate" +Replay-Nonce: IijzadlSBrGQq8EL2p_eEBtYvyOFMAyIwnHfZklZfLikEVdn6D8 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +-----BEGIN CERTIFICATE----- +MIIDsTCCAzegAwIBAgISBt38a2bHVScwAV+NCPlyZ+zHMAoGCCqGSM49BAMDMDIx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF +ODAeFw0yNTEyMjUwMzEwNThaFw0yNjAzMjUwMzEwNTdaMBoxGDAWBgNVBAMTD25h +cy5wcm9maWJvdC5odTB2MBAGByqGSM49AgEGBSuBBAAiA2IABBN3gdSxZs2pmRJz +pG87o/Uzi7bGIQNhbcYUAF4Q+mUbObgSxnRIuHpPfAyNMBQRq0JDf3pvmRdGtErS ++suGG4xDGXWEDNdj49BmqibqY1zJ9w2nbuj+G7m7FOwjCVuoFKOCAiYwggIiMA4G +A1UdDwEB/wQEAwIHgDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYD +VR0TAQH/BAIwADAdBgNVHQ4EFgQUNSFbsdClVjQpkA4Rj9ZHAAdZCw4wHwYDVR0j +BBgwFoAUjw0TovYuftFQbDMYOF1ZjiNykcowMgYIKwYBBQUHAQEEJjAkMCIGCCsG +AQUFBzAChhZodHRwOi8vZTguaS5sZW5jci5vcmcvMBoGA1UdEQQTMBGCD25hcy5w +cm9maWJvdC5odTATBgNVHSAEDDAKMAgGBmeBDAECATAtBgNVHR8EJjAkMCKgIKAe +hhxodHRwOi8vZTguYy5sZW5jci5vcmcvNzIuY3JsMIIBDQYKKwYBBAHWeQIEAgSB +/gSB+wD5AH8AcX6V88I4im2x44RJPTHhWqliCHYtQgDgBQzQZ7WmYeIAAAGbU7KL +gwAIAAAFAAUdSgEEAwBIMEYCIQD4Pv7ndtk4R/swH+lOq/5iuSHgiloZk3fDbt+j +yiu0JQIhAN0V4ZOYvJxPBzZ3NX7jVkncIEGe3bx5Ljl2rXfnlKW/AHYA0W6ppWgH +fmY1oD83pd28A6U8QRIU1IgY9ekxsyPLlQQAAAGbU7KMHwAABAMARzBFAiBF8eaz +L3T9vhwIWjIaCG6AJb+Un4vf2s8DGivLiCWyYAIhAOycrWJg3GJAZJOW4KIzW1q2 +6Cq6ZEA/z3oWJ02wIT3XMAoGCCqGSM49BAMDA2gAMGUCMQCG2/ToF6lf10LXa7yJ +YT8YgkO7GiThZ3IJTA3obffj5P4ihmw9oEC2OV/MK8RInKICMEkXxDYAAkOYwArX +shFmXZ2zXPkaPXP/KRMzuuwCvT/nb/aEnm8xEVhw6eJpoZTZNw== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIEVjCCAj6gAwIBAgIQY5WTY8JOcIJxWRi/w9ftVjANBgkqhkiG9w0BAQsFADBP +MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy +Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa +Fw0yNzAzMTIyMzU5NTlaMDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF +bmNyeXB0MQswCQYDVQQDEwJFODB2MBAGByqGSM49AgEGBSuBBAAiA2IABNFl8l7c +S7QMApzSsvru6WyrOq44ofTUOTIzxULUzDMMNMchIJBwXOhiLxxxs0LXeb5GDcHb +R6EToMffgSZjO9SNHfY9gjMy9vQr5/WWOrQTZxh7az6NSNnq3u2ubT6HTKOB+DCB +9TAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB +MBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFI8NE6L2Ln7RUGwzGDhdWY4j +cpHKMB8GA1UdIwQYMBaAFHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEB +BCYwJDAiBggrBgEFBQcwAoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzATBgNVHSAE +DDAKMAgGBmeBDAECATAnBgNVHR8EIDAeMBygGqAYhhZodHRwOi8veDEuYy5sZW5j +ci5vcmcvMA0GCSqGSIb3DQEBCwUAA4ICAQBnE0hGINKsCYWi0Xx1ygxD5qihEjZ0 +RI3tTZz1wuATH3ZwYPIp97kWEayanD1j0cDhIYzy4CkDo2jB8D5t0a6zZWzlr98d +AQFNh8uKJkIHdLShy+nUyeZxc5bNeMp1Lu0gSzE4McqfmNMvIpeiwWSYO9w82Ob8 +otvXcO2JUYi3svHIWRm3+707DUbL51XMcY2iZdlCq4Wa9nbuk3WTU4gr6LY8MzVA +aDQG2+4U3eJ6qUF10bBnR1uuVyDYs9RhrwucRVnfuDj29CMLTsplM5f5wSV5hUpm +Uwp/vV7M4w4aGunt74koX71n4EdagCsL/Yk5+mAQU0+tue0JOfAV/R6t1k+Xk9s2 +HMQFeoxppfzAVC04FdG9M+AC2JWxmFSt6BCuh3CEey3fE52Qrj9YM75rtvIjsm/1 +Hl+u//Wqxnu1ZQ4jpa+VpuZiGOlWrqSP9eogdOhCGisnyewWJwRQOqK16wiGyZeR +xs/Bekw65vwSIaVkBruPiTfMOo0Zh4gVa8/qJgMbJbyrwwG97z/PRgmLKCDl8z3d +tA0Z7qq7fta0Gl24uyuB05dqI5J1LvAzKuWdIjT1tP8qCoxSE/xpix8hX2dt3h+/ +jujUgFPFZ0EVZ0xSyBNRF3MboGZnYXFUxpNjTWPKpagDHJQmqrAcDmWJnMsFY3jS +u1igv3OefnWjSQ== +-----END CERTIFICATE----- + +2025-12-25 04:09:30,492:DEBUG:acme.client:Storing nonce: IijzadlSBrGQq8EL2p_eEBtYvyOFMAyIwnHfZklZfLikEVdn6D8 +2025-12-25 04:09:30,493:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:09:30,496:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/cert/06ddfc6b66c7552730015f8d08f97267ecc7/1: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJJaWp6YWRsU0JyR1FxOEVMMnBfZUVCdFl2eU9GTUF5SXduSGZaa2xaZkxpa0VWZG42RDgiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NlcnQvMDZkZGZjNmI2NmM3NTUyNzMwMDE1ZjhkMDhmOTcyNjdlY2M3LzEifQ", + "signature": "J2RP1TkFVHBf82mXH_uYG_ybNG_bb-ePgaIGHlg3cTzkQ_4erJvY1gjilf1aW7i2QD7P_BDfZig7h8LwoGWce0IEK1fdpUAdPhprtAHd5RfXuCMs6j90k1TOg8u0RrbJPK0NOpgZdG3KbQHHpU3s43GSrj7vT8qOZvwe3SCfwG6F88dpUDv6TynzaIZxjYFcr_LqJGG40_Uvq1dTFzlq91XuKMz0M8h9Bqh5Rl-4sXbBPdi3iaB54QB4UqjDtkWUKMTpC2UCSxdFuUWWSlj4Wbwff6wb_y9dZMzf0aZq54boVWuIcL-zJKlr82oVJHlJPI_gsNu8NC3als1mNPA06A", + "payload": "" +} +2025-12-25 04:09:30,642:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/cert/06ddfc6b66c7552730015f8d08f97267ecc7/1 HTTP/1.1" 200 2344 +2025-12-25 04:09:30,643:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:09:30 GMT +Content-Type: application/pem-certificate-chain +Content-Length: 2344 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="alternate" +Replay-Nonce: IijzadlS51Z-qep3N-zZsuD5T8wrV0T-UyEG7pepPLt_eB1sfhw +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +-----BEGIN CERTIFICATE----- +MIIDsTCCAzegAwIBAgISBt38a2bHVScwAV+NCPlyZ+zHMAoGCCqGSM49BAMDMDIx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF +ODAeFw0yNTEyMjUwMzEwNThaFw0yNjAzMjUwMzEwNTdaMBoxGDAWBgNVBAMTD25h +cy5wcm9maWJvdC5odTB2MBAGByqGSM49AgEGBSuBBAAiA2IABBN3gdSxZs2pmRJz +pG87o/Uzi7bGIQNhbcYUAF4Q+mUbObgSxnRIuHpPfAyNMBQRq0JDf3pvmRdGtErS ++suGG4xDGXWEDNdj49BmqibqY1zJ9w2nbuj+G7m7FOwjCVuoFKOCAiYwggIiMA4G +A1UdDwEB/wQEAwIHgDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYD +VR0TAQH/BAIwADAdBgNVHQ4EFgQUNSFbsdClVjQpkA4Rj9ZHAAdZCw4wHwYDVR0j +BBgwFoAUjw0TovYuftFQbDMYOF1ZjiNykcowMgYIKwYBBQUHAQEEJjAkMCIGCCsG +AQUFBzAChhZodHRwOi8vZTguaS5sZW5jci5vcmcvMBoGA1UdEQQTMBGCD25hcy5w +cm9maWJvdC5odTATBgNVHSAEDDAKMAgGBmeBDAECATAtBgNVHR8EJjAkMCKgIKAe +hhxodHRwOi8vZTguYy5sZW5jci5vcmcvNzIuY3JsMIIBDQYKKwYBBAHWeQIEAgSB +/gSB+wD5AH8AcX6V88I4im2x44RJPTHhWqliCHYtQgDgBQzQZ7WmYeIAAAGbU7KL +gwAIAAAFAAUdSgEEAwBIMEYCIQD4Pv7ndtk4R/swH+lOq/5iuSHgiloZk3fDbt+j +yiu0JQIhAN0V4ZOYvJxPBzZ3NX7jVkncIEGe3bx5Ljl2rXfnlKW/AHYA0W6ppWgH +fmY1oD83pd28A6U8QRIU1IgY9ekxsyPLlQQAAAGbU7KMHwAABAMARzBFAiBF8eaz +L3T9vhwIWjIaCG6AJb+Un4vf2s8DGivLiCWyYAIhAOycrWJg3GJAZJOW4KIzW1q2 +6Cq6ZEA/z3oWJ02wIT3XMAoGCCqGSM49BAMDA2gAMGUCMQCG2/ToF6lf10LXa7yJ +YT8YgkO7GiThZ3IJTA3obffj5P4ihmw9oEC2OV/MK8RInKICMEkXxDYAAkOYwArX +shFmXZ2zXPkaPXP/KRMzuuwCvT/nb/aEnm8xEVhw6eJpoZTZNw== +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIICtTCCAjugAwIBAgIQfo8UX4exWTMtf9QIK4JraTAKBggqhkjOPQQDAzBPMQsw +CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg +R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yNDAzMTMwMDAwMDBaFw0y +NzAzMTIyMzU5NTlaMDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNy +eXB0MQswCQYDVQQDEwJFODB2MBAGByqGSM49AgEGBSuBBAAiA2IABNFl8l7cS7QM +ApzSsvru6WyrOq44ofTUOTIzxULUzDMMNMchIJBwXOhiLxxxs0LXeb5GDcHbR6ET +oMffgSZjO9SNHfY9gjMy9vQr5/WWOrQTZxh7az6NSNnq3u2ubT6HTKOB+DCB9TAO +BgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIG +A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFI8NE6L2Ln7RUGwzGDhdWY4jcpHK +MB8GA1UdIwQYMBaAFHxClq7eS0g7+pL4nozPbYupcjeVMDIGCCsGAQUFBwEBBCYw +JDAiBggrBgEFBQcwAoYWaHR0cDovL3gyLmkubGVuY3Iub3JnLzATBgNVHSAEDDAK +MAgGBmeBDAECATAnBgNVHR8EIDAeMBygGqAYhhZodHRwOi8veDIuYy5sZW5jci5v +cmcvMAoGCCqGSM49BAMDA2gAMGUCMQClsUNJdX36GE+o2yDf7L02m3P3ElVWRLls +5ZyLYPjcNamBxRB9gZYoj24mGZtP3GkCMASZcALg6kpScomqIIjVHXRUQ500cdl4 +4n7fhxwokLo/lVlO8YyHwAi7ejTHtvw9Vg== +-----END CERTIFICATE----- + +2025-12-25 04:09:30,643:DEBUG:acme.client:Storing nonce: IijzadlS51Z-qep3N-zZsuD5T8wrV0T-UyEG7pepPLt_eB1sfhw +2025-12-25 04:09:30,645:INFO:certbot._internal.client:Non-standard path(s), might not work with crontab installed by your operating system package manager +2025-12-25 04:09:30,646:DEBUG:certbot._internal.storage:Creating directory /etc/letsencrypt/archive/npm-13. +2025-12-25 04:09:30,647:DEBUG:certbot._internal.storage:Creating directory /etc/letsencrypt/live/npm-13. +2025-12-25 04:09:30,647:DEBUG:certbot._internal.storage:Writing certificate to /etc/letsencrypt/live/npm-13/cert.pem. +2025-12-25 04:09:30,648:DEBUG:certbot._internal.storage:Writing private key to /etc/letsencrypt/live/npm-13/privkey.pem. +2025-12-25 04:09:30,648:DEBUG:certbot._internal.storage:Writing chain to /etc/letsencrypt/live/npm-13/chain.pem. +2025-12-25 04:09:30,649:DEBUG:certbot._internal.storage:Writing full chain to /etc/letsencrypt/live/npm-13/fullchain.pem. +2025-12-25 04:09:30,649:DEBUG:certbot._internal.storage:Writing README to /etc/letsencrypt/live/npm-13/README. +2025-12-25 04:09:30,679:DEBUG:certbot.configuration:Var account=e417a583de478a0cfdeed332c1113068 (set by user). +2025-12-25 04:09:30,679:DEBUG:certbot.configuration:Var key_type=ecdsa (set by user). +2025-12-25 04:09:30,679:DEBUG:certbot.configuration:Var elliptic_curve=secp384r1 (set by user). +2025-12-25 04:09:30,679:DEBUG:certbot.configuration:Var preferred_chain=ISRG Root X1 (set by user). +2025-12-25 04:09:30,679:DEBUG:certbot.configuration:Var pref_challs=['http-01'] (set by user). +2025-12-25 04:09:30,680:DEBUG:certbot.configuration:Var config_dir=/etc/letsencrypt (set by user). +2025-12-25 04:09:30,680:DEBUG:certbot.configuration:Var work_dir=/tmp/letsencrypt-lib (set by user). +2025-12-25 04:09:30,680:DEBUG:certbot.configuration:Var logs_dir=/data/logs (set by user). +2025-12-25 04:09:30,680:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2025-12-25 04:09:30,680:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2025-12-25 04:09:30,681:DEBUG:certbot.configuration:Var webroot_path=['/data/letsencrypt-acme-challenge'] (set by user). +2025-12-25 04:09:30,681:DEBUG:certbot.configuration:Var webroot_map={'nas.profibot.hu': '/data/letsencrypt-acme-challenge'} (set by user). +2025-12-25 04:09:30,683:DEBUG:certbot._internal.display.obj:Notifying user: +Successfully received certificate. +Certificate is saved at: /etc/letsencrypt/live/npm-13/fullchain.pem +Key is saved at: /etc/letsencrypt/live/npm-13/privkey.pem +This certificate expires on 2026-03-25. +These files will be updated when the certificate renews. +2025-12-25 04:09:30,683:DEBUG:certbot._internal.display.obj:Notifying user: NEXT STEPS: +2025-12-25 04:09:30,683:DEBUG:certbot._internal.display.obj:Notifying user: - The certificate will need to be renewed before it expires. Certbot can automatically renew the certificate in the background, but you may need to take steps to enable that functionality. See https://certbot.org/renewal-setup for instructions. +2025-12-25 04:09:30,685:DEBUG:certbot._internal.display.obj:Notifying user: If you like Certbot, please consider supporting our work by: + * Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate + * Donating to EFF: https://eff.org/donate-le diff --git a/proxy-manager/data/logs/letsencrypt.log.7 b/proxy-manager/data/logs/letsencrypt.log.7 new file mode 100755 index 0000000..a01782b --- /dev/null +++ b/proxy-manager/data/logs/letsencrypt.log.7 @@ -0,0 +1,1845 @@ +2025-12-25 04:04:33,140:DEBUG:certbot._internal.main:certbot version: 5.1.0 +2025-12-25 04:04:33,140:DEBUG:certbot._internal.main:Location of certbot entry point: /opt/certbot/bin/certbot +2025-12-25 04:04:33,140:DEBUG:certbot._internal.main:Arguments: ['--config', '/etc/letsencrypt.ini', '--work-dir', '/tmp/letsencrypt-lib', '--logs-dir', '/data/logs', '--cert-name', 'npm-12', '--agree-tos', '--authenticator', 'webroot', '-m', 'kincses@gmail.com', '--preferred-challenges', 'http', '--domains', 'nas.profibot.hu'] +2025-12-25 04:04:33,141:DEBUG:certbot._internal.main:Discovered plugins: PluginsRegistry(PluginEntryPoint#manual,PluginEntryPoint#null,PluginEntryPoint#standalone,PluginEntryPoint#webroot) +2025-12-25 04:04:33,151:DEBUG:certbot._internal.log:Root logging level set at 30 +2025-12-25 04:04:33,151:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2025-12-25 04:04:33,151:DEBUG:certbot._internal.plugins.selection:Single candidate plugin: * webroot +Description: Saves the necessary validation files to a .well-known/acme-challenge/ directory within the nominated webroot path. A separate HTTP server must be running and serving files from the webroot path. HTTP challenge only (wildcards not supported). +Interfaces: Authenticator, Plugin +Entry point: EntryPoint(name='webroot', value='certbot._internal.plugins.webroot:Authenticator', group='certbot.plugins') +Initialized: +Prep: True +2025-12-25 04:04:33,151:DEBUG:certbot._internal.plugins.selection:Selected authenticator and installer None +2025-12-25 04:04:33,151:INFO:certbot._internal.plugins.selection:Plugins selected: Authenticator webroot, Installer None +2025-12-25 04:04:33,189:DEBUG:certbot._internal.main:Picked account: +2025-12-25 04:04:33,189:DEBUG:acme.client:Sending GET request to https://acme-v02.api.letsencrypt.org/directory. +2025-12-25 04:04:33,190:DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org:443 +2025-12-25 04:04:33,660:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "GET /directory HTTP/1.1" 200 1033 +2025-12-25 04:04:33,661:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:04:33 GMT +Content-Type: application/json +Content-Length: 1033 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "g8zUWWC2grM": "https://community.letsencrypt.org/t/adding-random-entries-to-the-directory/33417", + "keyChange": "https://acme-v02.api.letsencrypt.org/acme/key-change", + "meta": { + "caaIdentities": [ + "letsencrypt.org" + ], + "profiles": { + "classic": "https://letsencrypt.org/docs/profiles#classic", + "shortlived": "https://letsencrypt.org/docs/profiles#shortlived", + "tlsclient": "https://letsencrypt.org/docs/profiles#tlsclient", + "tlsserver": "https://letsencrypt.org/docs/profiles#tlsserver" + }, + "termsOfService": "https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf", + "website": "https://letsencrypt.org" + }, + "newAccount": "https://acme-v02.api.letsencrypt.org/acme/new-acct", + "newNonce": "https://acme-v02.api.letsencrypt.org/acme/new-nonce", + "newOrder": "https://acme-v02.api.letsencrypt.org/acme/new-order", + "renewalInfo": "https://acme-v02.api.letsencrypt.org/acme/renewal-info", + "revokeCert": "https://acme-v02.api.letsencrypt.org/acme/revoke-cert" +} +2025-12-25 04:04:33,662:DEBUG:certbot._internal.display.obj:Notifying user: Requesting a certificate for nas.profibot.hu +2025-12-25 04:04:33,669:DEBUG:acme.client:Requesting fresh nonce +2025-12-25 04:04:33,669:DEBUG:acme.client:Sending HEAD request to https://acme-v02.api.letsencrypt.org/acme/new-nonce. +2025-12-25 04:04:33,824:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "HEAD /acme/new-nonce HTTP/1.1" 200 0 +2025-12-25 04:04:33,825:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:04:33 GMT +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEAb1xxtHk5qtQ9QIEoxgUg1J9SIisDZkVuC8gS9fUfgw +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + + +2025-12-25 04:04:33,825:DEBUG:acme.client:Storing nonce: 58tS3qjEAb1xxtHk5qtQ9QIEoxgUg1J9SIisDZkVuC8gS9fUfgw +2025-12-25 04:04:33,826:DEBUG:acme.client:JWS payload: +b'{\n "identifiers": [\n {\n "type": "dns",\n "value": "nas.profibot.hu"\n }\n ]\n}' +2025-12-25 04:04:33,829:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/new-order: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRUFiMXh4dEhrNXF0UTlRSUVveGdVZzFKOVNJaXNEWmtWdUM4Z1M5ZlVmZ3ciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL25ldy1vcmRlciJ9", + "signature": "RYeI771H_kMGzlqt0PwBinoWKOIMlRgWoMRQO0LPeXJWDUkmjZeUkaLKKoGgt3hlwp1_r_t636MVB4fGAznhRgob5arqLhU8RSaDkUErIj8PWQncyHte6kj57zZWvtADzmnkgz8yIAKUiHSE4OEh9r57LJsKRD1HilOL-I_l079U6gHvPqPYYBXDyodFNUG25pOobKjrTiNRhjvwerLUL3y6vuUG8QutuKP6oaOYK5nYrHMWMofO0tMs-8KdZQg-QyUJ3Fwrqu__184lwBs35o9Y38iJ5F6oHmCa46rJ5gLYxPbquJnO2QieXdemfF6S9uiquQAnrbVMdD4FLx-seg", + "payload": "ewogICJpZGVudGlmaWVycyI6IFsKICAgIHsKICAgICAgInR5cGUiOiAiZG5zIiwKICAgICAgInZhbHVlIjogIm5hcy5wcm9maWJvdC5odSIKICAgIH0KICBdCn0" +} +2025-12-25 04:04:34,010:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/new-order HTTP/1.1" 201 349 +2025-12-25 04:04:34,011:DEBUG:acme.client:Received response: +HTTP 201 +Server: nginx +Date: Thu, 25 Dec 2025 04:04:33 GMT +Content-Type: application/json +Content-Length: 349 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/462429183856 +Replay-Nonce: fULB7aUJUnGzHg5yZDnT_0mUoSEKjhbU3Qzg6GUDV2zIt0ML6cs +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "identifiers": [ + { + "type": "dns", + "value": "nas.profibot.hu" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/462429183856" +} +2025-12-25 04:04:34,011:DEBUG:acme.client:Storing nonce: fULB7aUJUnGzHg5yZDnT_0mUoSEKjhbU3Qzg6GUDV2zIt0ML6cs +2025-12-25 04:04:34,012:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:04:34,016:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSlVuR3pIZzV5WkRuVF8wbVVvU0VLamhiVTNRemc2R1VEVjJ6SXQwTUw2Y3MiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "U2DuAvzbpEVjh-N_I3DX7-1CsM1tTITuW6_tNZLb_M03MD-Zrgxd3wOKYJS6M3Z6fzSsr8Ess2OcMgA2D-FEWbcsD-1qwawYi0eZ3gEipwkFZKPIgvmg8tNaB9HyqhQtHe3j99ma9sJfW8rcDrvC2MxEDVpJ9r81aSi9MSp6SvQ0v3Seg7SCa1sF9C56jqdFpkwZ3xUOnIQgIJ0aFNWqANJGa3i4w_8dCheli5ni8iSlSkSjwdUcx5CDA4qC8Erf8d1jbHhkI6pmvV01YTnEr8WH_5HKl9GKzQ65idVLJs-BB8XZw0C886gtZ2CmqBYNVkjJMARu43UkzEkCpM_TKQ", + "payload": "" +} +2025-12-25 04:04:34,185:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:04:34,186:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:04:34 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjED-OLY1tdB5n_Du-vYlTPfY_kNdBt7l-Qqao5qEvzu5M +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:04:34,186:DEBUG:acme.client:Storing nonce: 58tS3qjED-OLY1tdB5n_Du-vYlTPfY_kNdBt7l-Qqao5qEvzu5M +2025-12-25 04:04:34,187:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:04:34,188:INFO:certbot._internal.auth_handler:Performing the following challenges: +2025-12-25 04:04:34,188:INFO:certbot._internal.auth_handler:http-01 challenge for nas.profibot.hu +2025-12-25 04:04:34,189:INFO:certbot._internal.plugins.webroot:Using the webroot path /data/letsencrypt-acme-challenge for all unmatched domains. +2025-12-25 04:04:34,189:DEBUG:certbot._internal.plugins.webroot:Creating root challenges validation dir at /data/letsencrypt-acme-challenge/.well-known/acme-challenge +2025-12-25 04:04:34,191:DEBUG:certbot._internal.plugins.webroot:Attempting to save validation to /data/letsencrypt-acme-challenge/.well-known/acme-challenge/IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA +2025-12-25 04:04:34,192:DEBUG:acme.client:JWS payload: +b'{}' +2025-12-25 04:04:34,195:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRUQtT0xZMXRkQjVuX0R1LXZZbFRQZllfa05kQnQ3bC1RcWFvNXFFdnp1NU0iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NoYWxsLzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2L19TanZ5dyJ9", + "signature": "jjKFujgKGZAnIa8syv0lMhhbqIbkb4tF3sJwmDOj2l6xBdN4fhRqEFrkeHeKigtk83tBlfH5xbwPqkBVEC3oCtXYygORFtrpg9S4tcfAcYcqrBFyMyp5T8xhHBfVX1cpRCYncDK1rNzwlMOPnMfLoNn4A3iTt_WRl8m9YpPDNAtCHTUSUVMQuFCPoN6OF9V8RLHq0SKspfpBWEFS4bAS_iEuMSTHOCD1EKCHiL9h_HYfESG9ySX5sw4Z7ls_xcgrYifv_WFiC8NpsH4ucJtD2WvYuyvY0uV1T-eP0rHz8BeQMUibvRl4SQo7BcZf85AiutwykrFg5RXmnSXgb8v1oA", + "payload": "e30" +} +2025-12-25 04:04:34,353:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/chall/2906438176/632666504346/_Sjvyw HTTP/1.1" 200 195 +2025-12-25 04:04:34,354:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:04:34 GMT +Content-Type: application/json +Content-Length: 195 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="up" +Location: https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw +Replay-Nonce: 58tS3qjEvbTWLWpnKGtnU7qtQ7zmPlJE9rTY56gzL-q-OVp5uAs +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" +} +2025-12-25 04:04:34,354:DEBUG:acme.client:Storing nonce: 58tS3qjEvbTWLWpnKGtnU7qtQ7zmPlJE9rTY56gzL-q-OVp5uAs +2025-12-25 04:04:34,354:INFO:certbot._internal.auth_handler:Waiting for verification... +2025-12-25 04:04:35,355:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:04:35,359:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRXZiVFdMV3BuS0d0blU3cXRRN3ptUGxKRTlyVFk1Nmd6TC1xLU9WcDV1QXMiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "cwNPHaBep_wxZDLixU6Wg2nTWMdX-Q3faS1crJD2lEJUR5WXQJh6ioqKAMprwddLecVtpaOwbYJwUBdvWsXFqkvYi-5nhAFuszXRTmvUnJ8hDtAUaWlrgJKe7vgK6obzlNgkNmWNwWnamTqIqUVPhosuHjxP9YrfUaAbuqqvahzdYEFsEYnA0rDympLE1u52p9-KjdSDmn2ILnXCWv4Vrf666KqDkuqOocxfTZ1EAB4H-Vr-kBoqmW9la40EVpwlUJdBiHH5MbXVdODyZbQZv5dGt_0uxllTkQ-xU0qRTcOK6mnrTazdFtEuqfaRjSt_swJT-F7N9nQwNP4PScPQ5w", + "payload": "" +} +2025-12-25 04:04:35,544:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:04:35,545:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:04:35 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJEwsbBhGE8tF2K0DQrchPmuOYvjz5UUH2MfXFIblKtzk +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:04:35,545:DEBUG:acme.client:Storing nonce: fULB7aUJEwsbBhGE8tF2K0DQrchPmuOYvjz5UUH2MfXFIblKtzk +2025-12-25 04:04:35,546:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:04:38,547:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:04:38,551:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSkV3c2JCaEdFOHRGMkswRFFyY2hQbXVPWXZqejVVVUgyTWZYRklibEt0emsiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "IIZh8X3dHdQBSM275njjUUvSpvbx8pq5oMGkrDIG01UXexmUV973Nxw_dR845rPEAF_zAtk0ZQQmPd8Xc7vKwmUZPsvZuhc_Ucnvg_FHZKNsqyTvf5G0yCVjLUeCBk-VZXdjQS_txUlrvz_vxarb8GwQELtFqUajFcZuGjVOyCNnMubmYcqCV3dSAULDGvZ-vXATYuw8DYREGWBpE_jC9bVXJkSBc6dbIToBpRUiT7MMZzXy9v9tdSD8lGsovNvkbMEpAz1c5CmHrIKWUFTK_qeO0tvSKyjlG3kZ0c7RWv8ustzQo1kqRNC3BCmVgpNbOYi60KOm8IeXdOJ7ZU4pVw", + "payload": "" +} +2025-12-25 04:04:38,718:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:04:38,719:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:04:38 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJB8HI5zDjZIsWX2wV15uucBTNqhegsvhps92xoCoAJdE +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:04:38,720:DEBUG:acme.client:Storing nonce: fULB7aUJB8HI5zDjZIsWX2wV15uucBTNqhegsvhps92xoCoAJdE +2025-12-25 04:04:38,720:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:04:41,721:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:04:41,725:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSkI4SEk1ekRqWklzV1gyd1YxNXV1Y0JUTnFoZWdzdmhwczkyeG9Db0FKZEUiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "KgFlY8oJZ8N5_MSQ4ir0xKWmEo1tBphHKXpOuFOarth1A9vvDs2KYFiPcpGvlaZvYXEcb_nxDZC80M22bbGtVHU66alEBsYy2XTpjj4yM-iU2DN77cGfzsU1DggT6Ma5DxHvhXfnofjkiwaA7tLN5666hCqJJVpwkYQiqg4_6uzEmiCCDXPXeYliW-c2fPvYo9HmByptIcrMr7IvQLKYIvLT6u4r_7cM9LJpw0I_0ychfX8fseLIczVnpxuRXURujLk9GNd4rqz74wTX0FHtPMyTkgjHRlJmEgScGGNciuKFfVoMzqRtarpo1mtXw8IQoBGzbsw3vGVMCwDXx9LeqQ", + "payload": "" +} +2025-12-25 04:04:41,882:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:04:41,883:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:04:41 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEiau0os1UXApIU7WBrsoaJqhqUoyXDgfn1TsYBC_inXM +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:04:41,883:DEBUG:acme.client:Storing nonce: 58tS3qjEiau0os1UXApIU7WBrsoaJqhqUoyXDgfn1TsYBC_inXM +2025-12-25 04:04:41,884:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:04:44,885:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:04:44,889:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRWlhdTBvczFVWEFwSVU3V0Jyc29hSnFocVVveVhEZ2ZuMVRzWUJDX2luWE0iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "GFrHXEsETw2-ScmfTOb2FQ4100sBA6ilSe_aRsGpaPIageYZc_NSFf8eE0IqY6trnccog4mppScm07vr2Re_zmuTP29ClAmBQzGYN6NpSp6kagt3o9czDOCGa13Ubv5P_NhdhhQoltXENUVpsyceaaaBomjKcLafyk8sSjCSIs7oK36iY4VSt_QG-ZUSYJIROv9YHA8r6C6zmysbWlNQoaaYNWyAktG6SysZ3nNledm59xhMECXrsJHPLv7qpYhi-RdsqimXJU9_dlUoe-kRzieLgZFAtfxyfBrtWHSiEEAfJyYQ2IFViBlH5Z6tUXCgQI6g5ZPwXNdQK0GOEwxuSw", + "payload": "" +} +2025-12-25 04:04:45,057:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:04:45,058:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:04:44 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjE-qDCXPoRxKMRpZ5ahSKv92l3sI4WIGJ5phUvPrpX35g +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:04:45,058:DEBUG:acme.client:Storing nonce: 58tS3qjE-qDCXPoRxKMRpZ5ahSKv92l3sI4WIGJ5phUvPrpX35g +2025-12-25 04:04:45,059:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:04:48,060:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:04:48,062:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRS1xRENYUG9SeEtNUnBaNWFoU0t2OTJsM3NJNFdJR0o1cGhVdlBycFgzNWciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "M9peiLYfK-3kbkkMUYWwt1zYh-RwaNUn4aMuQv6M4mKrrXlIB6HUgYUWYZgWEbhgSoyC5bBXzSbMDrVY8uEMq27mGfVfOjbwB_OogQIMKeS1_o0LgwXBAv20Rq2RptNID4Au4Eb8o2dnIfOTL7o4LFq2hXxh-_6XXdfPQXiJ2aYAcTBYPeqCYMklqa4fIdgW-KQptNxwfENnP_GkuBxWATNCXy-4mFl9jDxehAQ_YPEN7rthHNEUNIe97LBXpiqFz4vAkFJkh1L9BnPHsnQgOwMXOWskm2PedKwJE8fWU_HQoW-bxiHnLpqT8BD-8AsreuvqREbwVq5zQqfzF2qewQ", + "payload": "" +} +2025-12-25 04:04:48,218:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:04:48,219:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:04:48 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJd3PpbiTX8HVXFX1Awho7IodtoTkDM0gsqyfpyREmva0 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:04:48,219:DEBUG:acme.client:Storing nonce: fULB7aUJd3PpbiTX8HVXFX1Awho7IodtoTkDM0gsqyfpyREmva0 +2025-12-25 04:04:48,220:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:04:51,221:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:04:51,225:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSmQzUHBiaVRYOEhWWEZYMUF3aG83SW9kdG9Ua0RNMGdzcXlmcHlSRW12YTAiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "JhxXR8QFMUwxDGN4dt0JqQbGg1Vas7HthxPGc5RxKezq-4JF-JSizQUpgNvx8gmEkjUbuVL_siCX9xVAGRtnwJg7lTnIrkGI6stiIDLCNVRCF5hoPXUPT-wHQi7To7pssmaWIYt-3rhJonrMMYORW9gbL6cUZk4FghfTBVswVnnMqwrrwMELYpaAk4l-6fxBou3lXAI3-iTNQDwB0ItY7slFGVEys1g_de22iXKSgP82PT65OyJNL9OX_-FULh43Vo8Bovg0sbTvWnA6Xw0ew2JYwZgPLrkZvUG3USX3ofvH1pUFsVLYPBY1DDN1a1sjIkct6LESA82-lPLmlJC_mg", + "payload": "" +} +2025-12-25 04:04:51,381:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:04:51,381:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:04:51 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJC-LIRTKyq_Kz-RU2tEh2RIzZT839-dFiInToHL9M558 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:04:51,381:DEBUG:acme.client:Storing nonce: fULB7aUJC-LIRTKyq_Kz-RU2tEh2RIzZT839-dFiInToHL9M558 +2025-12-25 04:04:51,382:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:04:54,382:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:04:54,386:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSkMtTElSVEt5cV9Lei1SVTJ0RWgyUkl6WlQ4MzktZEZpSW5Ub0hMOU01NTgiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "AmEAIxvbdA4m5oi2116BJ_FXxGhWDyohVL1o42eeEQQhuu8wKnf64JoDWKXBjclrlwpJjoUNdbycK58e2g2Oo1WQKMyS5MmRHVsqX0063Bo0TiN5hui60xv1VZYVZmBIEwMt7i8wNxLYJl1KD_9LQ7KXmsr2IVbjD4kSQRw_-shL5Gzt_JA_bvIKsvAwfAyRqDiLL7_EvJYSGTqx0RoXZVhUPzH-iZkMs7Xb5ygPje3YuIM2bZg2kvuv0eUl5Jkw6leaRogPTjbS6S3-7O82pT4S_r-U7CyNSnlZGLJ6hUdLUTmTiGCq2y1wlCtkzget1MNWcCx8v2FYLdWTISXK5g", + "payload": "" +} +2025-12-25 04:04:54,554:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:04:54,555:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:04:54 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjE7SJ-LYIxIKfS6IrY2LnifzMC9pUL89vEW1Voxs_CwKc +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:04:54,555:DEBUG:acme.client:Storing nonce: 58tS3qjE7SJ-LYIxIKfS6IrY2LnifzMC9pUL89vEW1Voxs_CwKc +2025-12-25 04:04:54,556:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:04:57,557:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:04:57,561:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRTdTSi1MWUl4SUtmUzZJclkyTG5pZnpNQzlwVUw4OXZFVzFWb3hzX0N3S2MiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "ZRANNDE91Sb4QruRmH_kbcsEyPfgYfLwBiSvSCNgoLeCjXOrOikQuzmyu8uhWnrihgdLHUcfGaOgz30mYaOxcmLC1O5yOZ5aej40yS6qtg4PYVUWxIeNEUgyVw-SbXGnsxd9vAsaAESxFA92x8p84m_2-ahfII-LHlhuLcOeWL1T7_vtC1dkJz_E1562CFDMz2RREFcp6UZA75MOXCfTDVP85Ad8KuhCyNvw7xTxUheWfEF2_hvuKqxKfZJpp9tLPVmBdXX3Kevziiow6STuEmg0Ux-Uxj76c3LYA_sxJu-fySDHVPRFbphO62TD4wkzVklbJGJXV-zCt7b06JuPAw", + "payload": "" +} +2025-12-25 04:04:57,717:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:04:57,718:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:04:57 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEqvKTrnuDXdzdCSPKjPsqbzcPz9cTvRUggB-zZSZPrAQ +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:04:57,719:DEBUG:acme.client:Storing nonce: 58tS3qjEqvKTrnuDXdzdCSPKjPsqbzcPz9cTvRUggB-zZSZPrAQ +2025-12-25 04:04:57,719:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:05:00,720:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:05:00,724:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRXF2S1RybnVEWGR6ZENTUEtqUHNxYnpjUHo5Y1R2UlVnZ0ItelpTWlByQVEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "OneMWZQtbYgCfYECjg-6vB8dUJ25SMJO4gtfzBd9umgEbx-9AIKjUD-kEmHidND-aoe9cFGayJDgaHmbRm84WvCxciFAWfrVFdx8Baqo20h8jdqMawRxFmMz6UyBOnY7D8OwUxHavo-6GKqwd8LJ10axvraqKx47Ju0sUNO6VCjmh0Du0g4C4kbQPfQJIYKqmL6qsD6_rpypx_0sYKIzLG4hcngiDO2W9YM763pg71Ej4ZKLc7h7DIQ9NSz8Vbb58leY_lRNcFtSZ0qRgZRk9Amx_ci7yYjZ_4vX9VdNBRBF3K-e29cdMH0xIRPCdvHe7CDo2zboxOD7tAnstgTMog", + "payload": "" +} +2025-12-25 04:05:00,880:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:05:00,881:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:05:00 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjECFmHLOqy_Zc6NHOgIOzGBJ_GZntBtqNFKIBVjrDAISg +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:05:00,881:DEBUG:acme.client:Storing nonce: 58tS3qjECFmHLOqy_Zc6NHOgIOzGBJ_GZntBtqNFKIBVjrDAISg +2025-12-25 04:05:00,882:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:05:03,883:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:05:03,887:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRUNGbUhMT3F5X1pjNk5IT2dJT3pHQkpfR1pudEJ0cU5GS0lCVmpyREFJU2ciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "cX8zD6sBjp3l0g5Mg3wYDDsqiRio59oVoK2ZzSKSIg7fEgjxcO_FC5tS5HADyMje9Mzu3AbXfU9uEqV7hQEBi85t1v6TradR5KvD1JE4mSWk_xuWNkDtukdEL9cjtj6TLNAAYfiivzt55SSd3smK3NBX_Q90RDdawrXz_pfZN7NVITNcsMsiTMtOBB-YOIErqcpVYH4TO5MhhFbvGfz-FEvdFcFzxnwfFPFaeTDWJTf93ZWZeEqm2CSvo2Qph3bfzKINQj8lGRkuS5TPHarh_LPthulAJWubCBnNm_e80KsApSROAMgUBhBYjQXRG8Gz-bG20pSWX9FwfdpIYDiS9g", + "payload": "" +} +2025-12-25 04:05:04,044:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:05:04,045:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:05:03 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJ0F0c8US7gAsK-ZVmH46UgOkbzCrLdx8V50gPmlbEdWY +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:05:04,045:DEBUG:acme.client:Storing nonce: fULB7aUJ0F0c8US7gAsK-ZVmH46UgOkbzCrLdx8V50gPmlbEdWY +2025-12-25 04:05:04,046:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:05:07,047:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:05:07,051:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSjBGMGM4VVM3Z0FzSy1aVm1INDZVZ09rYnpDckxkeDhWNTBnUG1sYkVkV1kiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "SL4_FUrHqN-GO642HhrfQ01y67gphF3HkgaLRUCE8Cw971g1smHxCooPETAkgcV2FM375rNwGAFOBlKYgXXh1T_vAcWpzlf-S31bis1BOKENqEbXWN6ObemMi99KANF9EGtSanWLzncGyPm7xgBQUQeo9DN_2ghOY0ehFOXVKmHyGZXLb4Z0PcCSXAhNzKR1tXWdz6uwJ1SiccnsGF6vw0l0fT8YZJhCr9rMZoQFUAgOIUn4817xa1LqwXTTtu4iA1ayMhRyjGw26sntHcs_s4g1yJrrIExo97eBNC3gTxVur339VXJA2GSgqNtXDmV-W4kBFH4QsVehZXJs4VinpQ", + "payload": "" +} +2025-12-25 04:05:07,218:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:05:07,219:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:05:07 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEqX5zZDGpTqGEsVhzHPVeGEt8Vltg0ClUSYpH1gy043M +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:05:07,219:DEBUG:acme.client:Storing nonce: 58tS3qjEqX5zZDGpTqGEsVhzHPVeGEt8Vltg0ClUSYpH1gy043M +2025-12-25 04:05:07,220:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:05:10,221:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:05:10,225:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRXFYNXpaREdwVHFHRXNWaHpIUFZlR0V0OFZsdGcwQ2xVU1lwSDFneTA0M00iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "GtKw_m32A0uxZgXtyDSSagZxqesJjbyKHiFzxIuq9i7j7IdllK8-qDs5xdTBVIYQbwuD2UPTCSFiKs-7toUVkoAu0SSfznFtJ1sb8VsuLxKMyLqHKD6yBkldSXObv4olpCSKSOtTQtgRNsoDwdjf2oDDcjCgpS0qvw9nkJCF0_TbjfH3URwDS-IgaYLN6bhnVR1o5q6AuQMqn7EvH_OoYMDI2a4FO6bswX7w-Fs4KR0b_F2lx_J7o3_Ac8ljY874l6pwMhD_hwy_ydSBwxwdLGJ-2BK8m_b14m6q4XuFlcXCt3t5TVq7MlnfrEpE8d_Q16GfnBheCPXh__v8hYWSrw", + "payload": "" +} +2025-12-25 04:05:10,382:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:05:10,383:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:05:10 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJVP0Vz96fZwUnBdg6NZXm6BuuH47vVaLOR26Gn2DHA1M +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:05:10,384:DEBUG:acme.client:Storing nonce: fULB7aUJVP0Vz96fZwUnBdg6NZXm6BuuH47vVaLOR26Gn2DHA1M +2025-12-25 04:05:10,384:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:05:13,385:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:05:13,389:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSlZQMFZ6OTZmWndVbkJkZzZOWlhtNkJ1dUg0N3ZWYUxPUjI2R24yREhBMU0iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "SQs09hIPYCaQJ20O_es7kd1x1Xo0jr_Gc2jrmHicxgmL-wnx2634G1dAwipI9b6SIBEImorCAbgYSHhuNG1E-QxDxi8NAjaNtU5vedTaGtaL7-v4sh6h80DLw_ttd9uWtxjOBYM9L57YtkxTuiJcmBs82u31fGjv-tUsKKuk25Ra-T8vJRJs9icJ7YRL4TKCTzS7LhyBuXXNkXTuiYhTWE5JQ481BSWnqGbh6ISBdJh8NTHlihxPjyWrr3O6Fcn_LfL43Yjt83-Yb6XQaXubIX4xbyU8GWBNYz-tQu0XkS-LkmYwzzTWClxROwGmoE4XnPAwx8X6EHOhMcjfhGEVMg", + "payload": "" +} +2025-12-25 04:05:13,544:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:05:13,544:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:05:13 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjENAupukVAZE2qWyY41KnaRS2Urdd8pWZICgfuWAiXKUE +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:05:13,545:DEBUG:acme.client:Storing nonce: 58tS3qjENAupukVAZE2qWyY41KnaRS2Urdd8pWZICgfuWAiXKUE +2025-12-25 04:05:13,545:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:05:16,546:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:05:16,550:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRU5BdXB1a1ZBWkUycVd5WTQxS25hUlMyVXJkZDhwV1pJQ2dmdVdBaVhLVUUiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "UphS6iGEc5m-0ZTfrk0KwLj6Wjxzs0cUoDabh1wE8waWpktHHMPr_XOWlag9RQU6y7pONKIneBNxReJzdR7UfKRPN_gtcrSy3UbPAiguSfC2IGMHoPygnstcUX0B7NMtHboUnSKv_TbZcKdVrqMh06QakFpPSYOG_HMaeZeXehJ1tF_LEX6aG0pXm6TzFJAZLgTVlBwjyQtS1dkpOGiYY70ExYboaxzNP0JnxqBnOgACqee2jIC_Nn5Th-DImrrJmdQWZpoN66XV25DCa4eSRSOx1xVuXt1Il7Ociz4VseZvE4uGgiXrW-D39lVXZKTdvRgzmmXywEHU-iScaHRFJQ", + "payload": "" +} +2025-12-25 04:05:16,707:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:05:16,708:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:05:16 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjE-qg5kgbEKn0IKxUBAZ4wGm2qa59hTWrOcuGD5aynTdU +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:05:16,708:DEBUG:acme.client:Storing nonce: 58tS3qjE-qg5kgbEKn0IKxUBAZ4wGm2qa59hTWrOcuGD5aynTdU +2025-12-25 04:05:16,709:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:05:19,710:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:05:19,714:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRS1xZzVrZ2JFS24wSUt4VUJBWjR3R20ycWE1OWhUV3JPY3VHRDVheW5UZFUiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "bRGoQjC06vX0l4zg65hCxvIAGi1gWKp8Gp46o-JBrZkS00NZzpwDb_nCYrof-F3gBux8SLGjfjgJ0q-6Ueh40A0XW6fi4JbJZ-bBTZ68KOvyziKAcSqaJ5YO6I8eH9XiN_s53BgFzFztyhraJiYEOLcLnYhFYRyMeC8lTUiOYssZ7_qohU_2vlvQvYCOQYA0gulS7U6lttXsM63VspFwkwShFJM8szaeCr4jurIyOvFU3ZVVhYMOrctQ7SW_9RJQ4_-UediwrFGuxhVBowOYwBqcHAw8Jhc7VMwmRt-9M3e4mEnM_eAfhaxml0n-FOh8RcFNNi7rvJUP0fK-SvRYaQ", + "payload": "" +} +2025-12-25 04:05:19,872:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:05:19,873:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:05:19 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEuq5kiAVjatXJCUJGg9sQ33ZgVOqLty7npwjK4RTxKas +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:05:19,873:DEBUG:acme.client:Storing nonce: 58tS3qjEuq5kiAVjatXJCUJGg9sQ33ZgVOqLty7npwjK4RTxKas +2025-12-25 04:05:19,874:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:05:22,875:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:05:22,878:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRXVxNWtpQVZqYXRYSkNVSkdnOXNRMzNaZ1ZPcUx0eTducHdqSzRSVHhLYXMiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "XZ0Qu-8IyQJaRv-Oo5nkyLzfYzmKeHAH8tm-yQ36DohIYFN9Rly0w732VYlLnM2Kb727IxzUR-OzqBd1Ovbltc4LMCmaG9JStagq5LbtEnVkP0u7lp1QuwH1h821xoxuMa6qcMxDjoYcepkct28fciHuHgNwvyp-Mz78z_BYAIF_qQK3GFO803PpFZHL55oGpqLrb2l-dC2V5CW-Ff9l8mUxYNcGuqw4SJrbC-8_xknDMt9sHY2TOnC043TMChAZ4A-QeeGCs2Fg2wKKkwSUscq84KOX7v9a9jWyVCt0f171Q77lj545UL39By6-CqWSn3RWJapmyNBAxW3lSP1TIw", + "payload": "" +} +2025-12-25 04:05:23,037:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:05:23,038:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:05:22 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjExujOxzSlAKmO0-L6vo7fm7E-gcXodYbehfeLVD-_NOE +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:05:23,038:DEBUG:acme.client:Storing nonce: 58tS3qjExujOxzSlAKmO0-L6vo7fm7E-gcXodYbehfeLVD-_NOE +2025-12-25 04:05:23,039:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:05:26,040:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:05:26,044:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRXh1ak94elNsQUttTzAtTDZ2bzdmbTdFLWdjWG9kWWJlaGZlTFZELV9OT0UiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "AlkCmzrkSR1i4opo_zc4JDv-d1xH13Erk9RqEuKVGqCU9hbIccJLQqujn8Hl8hrYZBEuvDD_otqYh89rG380CFN9UjDW8nYkWjw7uoF4InC2ie_icZEBBFy3CJ5WFF0n-zEsL6tkRghzQnVqN-0Yk_SY98-3Kl6lHq-BzQxZwfp4bScxsgTEbqYoGoN7zvU-CNF8LVnQe5v3MR1mZlFB2ZxfHixa4TO1zIKUmI5SX_My2sRY4V6P3lDIRAEEaVy3uw6R-WaMR6p1XnYcrq5HOFKi-h5Q2YLNopLlrsmzj7EgH8ms-p9G9LOUjN1Cl4pjT588cMu_np8_27PkT2W0KQ", + "payload": "" +} +2025-12-25 04:05:26,276:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:05:26,277:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:05:26 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEsl359Zuu0JZdfInq6vv6xsTn4wBO_n_gKplXLpQaKBs +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:05:26,277:DEBUG:acme.client:Storing nonce: 58tS3qjEsl359Zuu0JZdfInq6vv6xsTn4wBO_n_gKplXLpQaKBs +2025-12-25 04:05:26,278:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:05:29,279:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:05:29,283:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRXNsMzU5WnV1MEpaZGZJbnE2dnY2eHNUbjR3Qk9fbl9nS3BsWExwUWFLQnMiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "QJ0w_Y8IkJjk1PtgrqZyKv780wW6QzR_H9oei5UBnO5PDqGD3xgwdMGAJjcT9XeYv3Zt_tJ9LCNUMq9JdGcFUgpNf7qkbIZBt-e58hNtcNC5EiunyLD3XcEFeD9L-TwTsMOvRH5OW2mMe9QIDqZmIn9K6_PyqnFYcvIbj34zjO-H0pGCOKqDA4rviRZ4P4kq3mGH2UCfprm-VGNCzZ4hUQzjZD0uPTW13fA-ZM9JYAw-nXVibo4YA7Xe6AFa9wAjO7hhRkeJUov-lSwrZkMSvE7-yCfDDCYuhVDLmSt7tGp_5OaL4ZR30bhgyWCgiZWrIaycsWmyRrjQ1cgFp8ubSw", + "payload": "" +} +2025-12-25 04:05:29,440:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:05:29,440:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:05:29 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjE3D-TnO1lSY4ZaZjDVdGKuo0HnehuCLxlY4FIWwV4wFM +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:05:29,441:DEBUG:acme.client:Storing nonce: 58tS3qjE3D-TnO1lSY4ZaZjDVdGKuo0HnehuCLxlY4FIWwV4wFM +2025-12-25 04:05:29,441:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:05:32,442:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:05:32,446:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRTNELVRuTzFsU1k0WmFaakRWZEdLdW8wSG5laHVDTHhsWTRGSVd3VjR3Rk0iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "dz7mtIF4wYl31N38nDz9ep2_Zhdj-lACzB2xangBdbGlnPIx8idKgCjZzg6f6LTHNf0QTt_7FcehtMfEsENRRnE1DjD1LlJOUK0HniqfPSbVRCqxS8I5_arzSG-JS0yYUxCWbrA9QsGxmzVBw7xlUyxAdjdyeUIbeCt0JAWpEQbAFHkGvKhb91OI3c_F-YpHOcFtHaFGFYU_lY3OScfbQ_63G1pidRVqaaGINweAGDVFXx-6-fOrFqRJdA3Pi2iNeotqjvDEdrmSTL0Ecl-7CnZXRuMspiEdoAMKVvVL-olBk0JSHJAKhdckvHu98kfCH6vzx8M7Vv7l6juuIcJUrA", + "payload": "" +} +2025-12-25 04:05:32,615:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:05:32,615:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:05:32 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEN4WDCbQuzYFuHDi1A0N95ITbLD4iv9DqWP8beotT4mY +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:05:32,616:DEBUG:acme.client:Storing nonce: 58tS3qjEN4WDCbQuzYFuHDi1A0N95ITbLD4iv9DqWP8beotT4mY +2025-12-25 04:05:32,616:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:05:35,617:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:05:35,621:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRU40V0RDYlF1ellGdUhEaTFBME45NUlUYkxENGl2OURxV1A4YmVvdFQ0bVkiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "Sw4jKTQpatUw4i9EFCxN-Qb4vo978R5nqAtIkRzXggKLVdWHyfqTZq2y8mK70VDPZjnXZES2YESg4As_5PYElp_iH6wBIBdCWokIm7kXjUURh8SuOPll1uhlE7jPSoilM2dtKKFyojzh6olwzeveHOKAknZbKvnpqEB6AbNM35CS8AS9FurknT6UaCEIgn5fZsnkEDwi1y3QII1kV9YZitupHt3I8c9o9rm0q_35ZGPAiZ9TZqB1HRrInW5zjYZHDGSatLcK8_kdDN-bZEe4Jguq4moqfLh_5yYBqFE6B2FK-Wh53ACibqKoWCNeYipIlXn9hl4wBUYu65a307qimw", + "payload": "" +} +2025-12-25 04:05:35,777:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:05:35,778:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:05:35 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJccDE1kVKs0Dl3TMLWKhDZ1MtJBcBUjhyGU5le5AC6QQ +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:05:35,779:DEBUG:acme.client:Storing nonce: fULB7aUJccDE1kVKs0Dl3TMLWKhDZ1MtJBcBUjhyGU5le5AC6QQ +2025-12-25 04:05:35,779:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:05:38,780:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:05:38,783:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSmNjREUxa1ZLczBEbDNUTUxXS2hEWjFNdEpCY0JVamh5R1U1bGU1QUM2UVEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "A4jR_jQwhZEK2j7voi4DYeDAUK-CUgUy26Ue-D9GcMN17ONsn0vdjI6_IDbCb4cvXPDehkvqX8xy39brj8iyK5SXHjS3ReGI2Hy2RneULzM_Cdxkd8530zvMKyiTipOhKp2PAt31eqXJh3nLnvnn9owglnJaqERg1-CIWrLoMOWSFCj35gf159CN6eUjF9fbneVBay-ydT3con5eYyP4K0odp3cY4-WvXsf6t_osl2KJGWVC4HTaQzrmT3SDhI82jwuJYFbULhSR48wmmdd5PG9IIQmBuTYVMrycsyhPWlfLkiHkc9agfqQ4b017NX8JvulIibTtvcDRh-JXxgH5oQ", + "payload": "" +} +2025-12-25 04:05:38,938:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:05:38,939:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:05:38 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEXyOD4iJx_bW9z_9LmdIQh0oJyLevIzIr2N3S-sShmiI +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:05:38,940:DEBUG:acme.client:Storing nonce: 58tS3qjEXyOD4iJx_bW9z_9LmdIQh0oJyLevIzIr2N3S-sShmiI +2025-12-25 04:05:38,940:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:05:41,941:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:05:41,945:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRVh5T0Q0aUp4X2JXOXpfOUxtZElRaDBvSnlMZXZJeklyMk4zUy1zU2htaUkiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "lkz5kzTq2FwGqEaOcqc-yJzAkos2MXTSGYilWuYgmZ1zPKe3jdfPb_LhN9aKhkAlvAIO6_SRo85WK8h5Vjhr1BDED3KMtbtdO1jiun8zedfi6kn0Gc4SBS38ksYgdpH_4aWiMhlNfi5n9z6qCu2HhyOGEko6nfo1eEaYWyY7Vre4QCU-YtlLPpPKhXup9f_27xiOWQ9hLirTmZVqQTR_qBw3Wh-9-ZSnbYoiWLORqHqMV9zpEBpJdQk_tns633s1FPAvkl3G6eLxX6DLoP4CfcW1rFZX9q2GTPHkgQGl7QL6Ww95EuQKhqrOb2JSQXspqOi-Ko9N0ba2SoP0yELkMA", + "payload": "" +} +2025-12-25 04:05:42,101:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:05:42,102:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:05:42 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjE7OHvvsV9owlLbQOPN0Zm-6Km8TM100VtPNTel8OuUvE +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:05:42,103:DEBUG:acme.client:Storing nonce: 58tS3qjE7OHvvsV9owlLbQOPN0Zm-6Km8TM100VtPNTel8OuUvE +2025-12-25 04:05:42,103:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:05:45,104:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:05:45,108:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRTdPSHZ2c1Y5b3dsTGJRT1BOMFptLTZLbThUTTEwMFZ0UE5UZWw4T3VVdkUiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "MIKjkGiE-VD1qcxHbOv53tKJ6SHreBmnMT9VpQAy0xoRO1wZaXM9bf_vrxl6zlx50VFBzK0OiBigPhi32R1S3AkyWAIWRxTBVdhNWYP1Sus1e3Xuctj2aE_dH8WQCLDG0fVeRVZHqnjqAHWMbu_sYvU7O7fZmpUYz-ApUgJ_Q-jtTUOuMITGDJLiMGCCla3xyDqWzXG5IUCShy1w_uzun26-bMTCFzyarw1WIlvXnX4aDgh9rxNJYEwmCBzJMnrJ0WsgJoHKZX5pAB84w5Xoy22pKaE9n8X5_ZEmsBK4nw3ilSrr1KhnQpSH29TrWBzj4NHBjvThnESl5N0ZvSSQFQ", + "payload": "" +} +2025-12-25 04:05:45,263:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:05:45,264:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:05:45 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJvs1yC84_AmQj9M3siqyBKwLHJgVQHQbXhsLMtXME-h4 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:05:45,265:DEBUG:acme.client:Storing nonce: fULB7aUJvs1yC84_AmQj9M3siqyBKwLHJgVQHQbXhsLMtXME-h4 +2025-12-25 04:05:45,265:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:05:48,266:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:05:48,270:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSnZzMXlDODRfQW1RajlNM3NpcXlCS3dMSEpnVlFIUWJYaHNMTXRYTUUtaDQiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "VJp4F9b_ZCrxvhg3xFN3gEqPG2oQiC2D6-X4NqF3wakqg57c_R16hPgx6GPLyHiEEOzCeaQxc_E2ei5C-EKdtBIko4LkeFFhVlkaPKDuVtmbTp_1sH04-VZ9SDBJSyAXLkEV4spPUim248qbjiTwD-HIK4z40z8_7OdWAvDwGvup3BtWAD1VB6xrj8rjdNOrxpnHWYJbdE3B8ytWS3zpYJJTu5ynKxMF73YUx58G5q9dPM7C-6UU6HdtEd5zZmRvuXW46HyGmQyIgoixpl1hU4eEYZez5FTwHt4H7XrN1noNYoSuTKQO4xp3twJSwsaKqpbFHVzvBIT2nFDziPvjJA", + "payload": "" +} +2025-12-25 04:05:48,425:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:05:48,426:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:05:48 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEEkhs-yGXyKE0aH5sWL45wWfzsvp4n8RyV6DE8mY4wJA +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:05:48,433:DEBUG:acme.client:Storing nonce: 58tS3qjEEkhs-yGXyKE0aH5sWL45wWfzsvp4n8RyV6DE8mY4wJA +2025-12-25 04:05:48,433:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:05:51,434:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:05:51,438:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRUVraHMteUdYeUtFMGFINXNXTDQ1d1dmenN2cDRuOFJ5VjZERThtWTR3SkEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "YRzP5V6BsVUznXdkcFb4tRoYQKd7Mv72ilXgfzY9ohr73U2NPKErR5YwT2l5MD5iXAqCI72SmQvZXgp1mqwJhNxwwbK8TXlJHbMBvUjbDMEs_Y6SUiME50tbsLGsyo9ECC2wfZqbPXvHjtpdjwhnu6Bl8lNURA8QvRvcak1p4wWq-uGNbC2bSXl4xbNGccYHfWgcV7Ymer3g6lrMO2BZ1nYk5bdeYJLV37Qw0_sQd0ad_7pIXohhxqtB-W4FBmlkq-Rl6TvLr_R8VO0iiYJc2W8n_u3_TAVN9D2HjG6WsYf_b7itOUI7Dh8f14CpjOxmEaaFs0RLzlWSfA4IN4ZQXA", + "payload": "" +} +2025-12-25 04:05:51,594:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:05:51,595:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:05:51 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjE_Es8hRMsfUfYJIZ8mO41cu8Prmg5EoQ1VGTCD0e05BU +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:05:51,596:DEBUG:acme.client:Storing nonce: 58tS3qjE_Es8hRMsfUfYJIZ8mO41cu8Prmg5EoQ1VGTCD0e05BU +2025-12-25 04:05:51,596:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:05:54,597:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:05:54,601:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRV9FczhoUk1zZlVmWUpJWjhtTzQxY3U4UHJtZzVFb1ExVkdUQ0QwZTA1QlUiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "V9FUfbs0wH2S4eZ6jRzzdzEHNQ-eTPD5ZH8-bEMtXpWMv7SXmfzbdcWavUoFzbV_hMtfuVqe7yQfwAYDIuvSV2x9rjt4P7df70AOkfS1ft7CmmLpWY6BVN_BLzLEa0GtKk96QZPpSZDq1PWDnbnUycSULBin1IS63uPeybVDvEGEqs8ScRpky0O82Fl6u7Q-bzuuv4FQ1GcNETnggYLy5bvPhi8HWnLJPQDsmFU4keQqvcEp5X-dzQJaF_AX1rRyRLTLhhMOJilcuH0rc0m31SNtwUrrk0HcB0ICfnTmdLunXLaJmo9HMJvGBr7WeRRKagOlgKTRhm5zi4vT0Tb-3g", + "payload": "" +} +2025-12-25 04:05:54,769:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:05:54,770:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:05:54 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEcCNpBrCRybrpoYXZmkOQmRQvjhG4y8WpWVEggJPngPA +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:05:54,771:DEBUG:acme.client:Storing nonce: 58tS3qjEcCNpBrCRybrpoYXZmkOQmRQvjhG4y8WpWVEggJPngPA +2025-12-25 04:05:54,771:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:05:57,772:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:05:57,776:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRWNDTnBCckNSeWJycG9ZWFpta09RbVJRdmpoRzR5OFdwV1ZFZ2dKUG5nUEEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "indPjcD1AXKEGkCZQ8JnpY9vOUh1x6nacRveV2_ERjHoLZrTOs9wKf1GHSJW3ZpKauM-3IIv4K7QuKZ2GG394fHnLZPFpHcgDV_cONY_T9WtLsosTNznnUDBncKDQP2DxLbC_Rx6Pjq4Qiu--GfrjcEDfKjgPbpQIHG6DLN_D7IBjhP3mZo_QSDtS68QboYLzjPlJTI-YBGirqWLDwWJDgvYk37p0eEO0MqCe-Pxcta0siPQFFNBaTJ9yv6dusOGBQ_72M-GJg7cdS8sW3BOfPrTo0NITyIcizKThpF78KzhcTyVtHTzTKjO5UdOjgXiImuQRnvnv3ScUb3yAjNo9w", + "payload": "" +} +2025-12-25 04:05:57,932:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:05:57,933:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:05:57 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEBC03u2bwZZSUqvg-VYEuUU8VpzHWa5UjOgBw2x7kDHA +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:05:57,934:DEBUG:acme.client:Storing nonce: 58tS3qjEBC03u2bwZZSUqvg-VYEuUU8VpzHWa5UjOgBw2x7kDHA +2025-12-25 04:05:57,934:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:06:00,935:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:06:00,939:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRUJDMDN1MmJ3WlpTVXF2Zy1WWUV1VVU4VnB6SFdhNVVqT2dCdzJ4N2tESEEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "I6IakRlly2r0N2wLLFgXFUk_9EJmWSWdXPDdZHADNJ8ItCZ86tO2cZKj-UG2QckKL6r3JlVc1OkzDM4Mh9ipOwS90XLzDC6vC2kXS8PfyJmRtoTbY8lZ40nt22w21gAhNddcZlEEoz9z491jZRFQrCV723Z04kFqfYsml1kBUR7z2Ye3Znf1VyuVFTS3LzKsrms-npziC1KgbNq5-f1fMLTTy0thuE1UtkzynTGlzgRLfm26o8Xz7YqibJS3dHNu2YHzTlCMgcYY2DIPtDLKu4z4yN3RtwSFBXjukou0AMdqVD408-n42--yWdLmqVA82Y6aN1h_FGLYGklAf1wwoQ", + "payload": "" +} +2025-12-25 04:06:01,095:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:06:01,096:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:06:01 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJn9vcB-GOS7Y58U9J925rSOixyOKlmCH47qhjQEwdrC8 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:06:01,097:DEBUG:acme.client:Storing nonce: fULB7aUJn9vcB-GOS7Y58U9J925rSOixyOKlmCH47qhjQEwdrC8 +2025-12-25 04:06:01,097:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:06:04,098:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:06:04,102:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSm45dmNCLUdPUzdZNThVOUo5MjVyU09peHlPS2xtQ0g0N3FoalFFd2RyQzgiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "NqDa5NIyqmgkCqM9fcvyIdjDGzKDang-ULLNeGMNUq0tr8BfHCwF5-3CYoduTfPl6FtYNBgJFLZ3v-BPOXk6_cnEPFyeilmgtZTpJ-oyhXHwdSz2y_NtiA6wosjf-AVdb90gHdmYg1ZmmE5B-m47aQAReZnHbWjt3122Cv-tqAk2kFQjvZnodjsJ2zW5-ihU2nZ1Ki4qPj3o1KsEK7Uqc4oSWMmhTZLgMxcGjhyCiGMTitDLiuilvRZtbqinr8gxZUR15oh1BrUeQyaTuZfsmyP8bF-ihg09O4dQiwOCz0ABuub10R1zeByq-edkVIKc-8avVCGyVx_mmZDmyy3kMw", + "payload": "" +} +2025-12-25 04:06:04,258:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 823 +2025-12-25 04:06:04,259:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:06:04 GMT +Content-Type: application/json +Content-Length: 823 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEyqdPeuMJvoEgDrzW4fW6Go2kUgmv5tXqnlP-nU0Fu5o +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "pending", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/8KXjIg", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw", + "status": "pending", + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA" + } + ] +} +2025-12-25 04:06:04,259:DEBUG:acme.client:Storing nonce: 58tS3qjEyqdPeuMJvoEgDrzW4fW6Go2kUgmv5tXqnlP-nU0Fu5o +2025-12-25 04:06:04,260:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/5kmhBw', 'status': 'pending', 'token': 'IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA'} +2025-12-25 04:06:07,261:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 04:06:07,266:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632666504346: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRXlxZFBldU1Kdm9FZ0Ryelc0Zlc2R28ya1VnbXY1dFhxbmxQLW5VMEZ1NW8iLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNjY2NTA0MzQ2In0", + "signature": "IV30Wot9sRQDSeMtNhSbmLYSoqvccofXmjz5WsQakYpPxsbOW_bExRK9Ys9KV02ekU4T2K1anBJynGkgIMCs_p0RVWRMbWq4Mb4b3g5W4WUOrrt4wdmKNP8q5FVyprahCe-QihlGlp0glBtb8KogEzfW3jtsEpAlu6YDmbhSVJ5TVqJMHGpGfspcuDSvAvcmPLsbr7tF_iyTN4981A9Z9tQftCgQlhFDw0sRvciT8m0F51A0xzOD6HcreHr6rCdV4Vdlo_bT3WOCyPXQ5zBnldeSOAE_fByoNHTEQ_W3x08AzXNsbEyACpPnyyPcZfX9XBEmI0fWiRiDA_Uay9EBIA", + "payload": "" +} +2025-12-25 04:06:07,421:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632666504346 HTTP/1.1" 200 1028 +2025-12-25 04:06:07,422:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 04:06:07 GMT +Content-Type: application/json +Content-Length: 1028 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEzTvgt_IbI5YQTLjTMT_48XhhwUEsVFFsZgMuNR_y6vo +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "nas.profibot.hu" + }, + "status": "invalid", + "expires": "2026-01-01T04:04:33Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632666504346/_Sjvyw", + "status": "invalid", + "validated": "2025-12-25T04:04:34Z", + "error": { + "type": "urn:ietf:params:acme:error:dns", + "detail": "During secondary validation: While processing CAA for nas.profibot.hu: DNS problem: query timed out looking up CAA for nas.profibot.hu", + "status": 400 + }, + "token": "IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA", + "validationRecord": [ + { + "url": "http://nas.profibot.hu/.well-known/acme-challenge/IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA", + "hostname": "nas.profibot.hu", + "port": "80", + "addressesResolved": [ + "92.249.165.228" + ], + "addressUsed": "92.249.165.228" + } + ] + } + ] +} +2025-12-25 04:06:07,422:DEBUG:acme.client:Storing nonce: 58tS3qjEzTvgt_IbI5YQTLjTMT_48XhhwUEsVFFsZgMuNR_y6vo +2025-12-25 04:06:07,422:INFO:certbot._internal.auth_handler:Challenge failed for domain nas.profibot.hu +2025-12-25 04:06:07,423:INFO:certbot._internal.auth_handler:http-01 challenge for nas.profibot.hu +2025-12-25 04:06:07,423:DEBUG:certbot._internal.display.obj:Notifying user: +Certbot failed to authenticate some domains (authenticator: webroot). The Certificate Authority reported these problems: + Domain: nas.profibot.hu + Type: dns + Detail: During secondary validation: While processing CAA for nas.profibot.hu: DNS problem: query timed out looking up CAA for nas.profibot.hu + +Hint: The Certificate Authority failed to download the temporary challenge files created by Certbot. Ensure that the listed domains serve their content from the provided --webroot-path/-w and that files created there can be downloaded from the internet. + +2025-12-25 04:06:07,424:DEBUG:certbot._internal.error_handler:Encountered exception: +Traceback (most recent call last): + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/auth_handler.py", line 104, in handle_authorizations + self._poll_authorizations(authzrs, max_retries, max_time_mins, best_effort) + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/auth_handler.py", line 208, in _poll_authorizations + raise errors.AuthorizationError('Some challenges have failed.') +certbot.errors.AuthorizationError: Some challenges have failed. + +2025-12-25 04:06:07,424:DEBUG:certbot._internal.error_handler:Calling registered functions +2025-12-25 04:06:07,425:INFO:certbot._internal.auth_handler:Cleaning up challenges +2025-12-25 04:06:07,425:DEBUG:certbot._internal.plugins.webroot:Removing /data/letsencrypt-acme-challenge/.well-known/acme-challenge/IgudMLkJax-Ao-qh3W8Yweqle9mPOeVS1A-7ZffqrHA +2025-12-25 04:06:07,425:DEBUG:certbot._internal.plugins.webroot:All challenges cleaned up +2025-12-25 04:06:07,426:DEBUG:certbot._internal.log:Exiting abnormally: +Traceback (most recent call last): + File "/opt/certbot/bin/certbot", line 7, in + sys.exit(main()) + ^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/main.py", line 18, in main + return internal_main.main(cli_args) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 1850, in main + return config.func(config, plugins) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 1562, in certonly + lineage = _get_and_save_cert(le_client, config, domains, certname, lineage) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 141, in _get_and_save_cert + lineage = le_client.obtain_and_enroll_certificate(domains, certname) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 526, in obtain_and_enroll_certificate + cert, chain, key, _ = self.obtain_certificate(domains) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 427, in obtain_certificate + orderr = self._get_order_and_authorizations(csr.data, self.config.allow_subset_of_names) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 505, in _get_order_and_authorizations + authzr = self.auth_handler.handle_authorizations(orderr, self.config, best_effort) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/auth_handler.py", line 104, in handle_authorizations + self._poll_authorizations(authzrs, max_retries, max_time_mins, best_effort) + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/auth_handler.py", line 208, in _poll_authorizations + raise errors.AuthorizationError('Some challenges have failed.') +certbot.errors.AuthorizationError: Some challenges have failed. +2025-12-25 04:06:07,431:ERROR:certbot._internal.log:Some challenges have failed. diff --git a/proxy-manager/data/logs/letsencrypt.log.8 b/proxy-manager/data/logs/letsencrypt.log.8 new file mode 100755 index 0000000..b2594df --- /dev/null +++ b/proxy-manager/data/logs/letsencrypt.log.8 @@ -0,0 +1,555 @@ +2025-12-25 00:45:14,732:DEBUG:certbot._internal.main:certbot version: 5.1.0 +2025-12-25 00:45:14,732:DEBUG:certbot._internal.main:Location of certbot entry point: /opt/certbot/bin/certbot +2025-12-25 00:45:14,732:DEBUG:certbot._internal.main:Arguments: ['--config', '/etc/letsencrypt.ini', '--work-dir', '/tmp/letsencrypt-lib', '--logs-dir', '/data/logs', '--cert-name', 'npm-11', '--agree-tos', '--authenticator', 'webroot', '-m', 'kincses@gmail.com', '--preferred-challenges', 'http', '--domains', 'profibot.synology.me'] +2025-12-25 00:45:14,732:DEBUG:certbot._internal.main:Discovered plugins: PluginsRegistry(PluginEntryPoint#manual,PluginEntryPoint#null,PluginEntryPoint#standalone,PluginEntryPoint#webroot) +2025-12-25 00:45:14,742:DEBUG:certbot._internal.log:Root logging level set at 30 +2025-12-25 00:45:14,742:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2025-12-25 00:45:14,742:DEBUG:certbot._internal.plugins.selection:Single candidate plugin: * webroot +Description: Saves the necessary validation files to a .well-known/acme-challenge/ directory within the nominated webroot path. A separate HTTP server must be running and serving files from the webroot path. HTTP challenge only (wildcards not supported). +Interfaces: Authenticator, Plugin +Entry point: EntryPoint(name='webroot', value='certbot._internal.plugins.webroot:Authenticator', group='certbot.plugins') +Initialized: +Prep: True +2025-12-25 00:45:14,743:DEBUG:certbot._internal.plugins.selection:Selected authenticator and installer None +2025-12-25 00:45:14,743:INFO:certbot._internal.plugins.selection:Plugins selected: Authenticator webroot, Installer None +2025-12-25 00:45:14,780:DEBUG:certbot._internal.main:Picked account: +2025-12-25 00:45:14,780:DEBUG:acme.client:Sending GET request to https://acme-v02.api.letsencrypt.org/directory. +2025-12-25 00:45:14,781:DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org:443 +2025-12-25 00:45:15,252:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "GET /directory HTTP/1.1" 200 1033 +2025-12-25 00:45:15,253:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:45:15 GMT +Content-Type: application/json +Content-Length: 1033 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "BrbMn-lKfIw": "https://community.letsencrypt.org/t/adding-random-entries-to-the-directory/33417", + "keyChange": "https://acme-v02.api.letsencrypt.org/acme/key-change", + "meta": { + "caaIdentities": [ + "letsencrypt.org" + ], + "profiles": { + "classic": "https://letsencrypt.org/docs/profiles#classic", + "shortlived": "https://letsencrypt.org/docs/profiles#shortlived", + "tlsclient": "https://letsencrypt.org/docs/profiles#tlsclient", + "tlsserver": "https://letsencrypt.org/docs/profiles#tlsserver" + }, + "termsOfService": "https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf", + "website": "https://letsencrypt.org" + }, + "newAccount": "https://acme-v02.api.letsencrypt.org/acme/new-acct", + "newNonce": "https://acme-v02.api.letsencrypt.org/acme/new-nonce", + "newOrder": "https://acme-v02.api.letsencrypt.org/acme/new-order", + "renewalInfo": "https://acme-v02.api.letsencrypt.org/acme/renewal-info", + "revokeCert": "https://acme-v02.api.letsencrypt.org/acme/revoke-cert" +} +2025-12-25 00:45:15,254:DEBUG:certbot._internal.display.obj:Notifying user: Requesting a certificate for profibot.synology.me +2025-12-25 00:45:15,260:DEBUG:acme.client:Requesting fresh nonce +2025-12-25 00:45:15,260:DEBUG:acme.client:Sending HEAD request to https://acme-v02.api.letsencrypt.org/acme/new-nonce. +2025-12-25 00:45:15,414:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "HEAD /acme/new-nonce HTTP/1.1" 200 0 +2025-12-25 00:45:15,415:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:45:15 GMT +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEu8GVqPMnRBR0liVI7vS839AAzsgnCdFlQtNkVV14mVg +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + + +2025-12-25 00:45:15,416:DEBUG:acme.client:Storing nonce: 58tS3qjEu8GVqPMnRBR0liVI7vS839AAzsgnCdFlQtNkVV14mVg +2025-12-25 00:45:15,416:DEBUG:acme.client:JWS payload: +b'{\n "identifiers": [\n {\n "type": "dns",\n "value": "profibot.synology.me"\n }\n ]\n}' +2025-12-25 00:45:15,420:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/new-order: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRXU4R1ZxUE1uUkJSMGxpVkk3dlM4MzlBQXpzZ25DZEZsUXROa1ZWMTRtVmciLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL25ldy1vcmRlciJ9", + "signature": "lfN2Nri5e2alt2EwCpf1t-BucjemrkN-W3ycrCYke_Jac78O2PCekyHV0pIAnj3NvKpKQh4j5HpjRODuvUc52_oXxk_vG2m1brsQ8oyfki8wIznSk3JKH10VguFYXcZ0wWmUgdU6nSEiTdDK-gE31E3ZZqXe61RMohwMaf5tBmu_66JVW2SowHcy-oxDkzlfEgH4V5XrCwIDEqzFs8YAkBCT9uEaAdFFX9mYucaHjn-FJyoS70TRCYHqEGQaXzxtnio4zFq5aWosBDvKQme7-vMg_up6esvcG_Z6K6MboLukZNnm9PHfYjpPKuQ-KX4bIMN2ykcasfG28SGGS6bi2w", + "payload": "ewogICJpZGVudGlmaWVycyI6IFsKICAgIHsKICAgICAgInR5cGUiOiAiZG5zIiwKICAgICAgInZhbHVlIjogInByb2ZpYm90LnN5bm9sb2d5Lm1lIgogICAgfQogIF0KfQ" +} +2025-12-25 00:45:15,600:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/new-order HTTP/1.1" 201 354 +2025-12-25 00:45:15,601:DEBUG:acme.client:Received response: +HTTP 201 +Server: nginx +Date: Thu, 25 Dec 2025 00:45:15 GMT +Content-Type: application/json +Content-Length: 354 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/462377721906 +Replay-Nonce: 58tS3qjE9cT3jE41w3X4vTpAyQzO2Nx6SIuatmuTbgOMPy6w6tE +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "pending", + "expires": "2026-01-01T00:45:15Z", + "identifiers": [ + { + "type": "dns", + "value": "profibot.synology.me" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632593074936" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/462377721906" +} +2025-12-25 00:45:15,601:DEBUG:acme.client:Storing nonce: 58tS3qjE9cT3jE41w3X4vTpAyQzO2Nx6SIuatmuTbgOMPy6w6tE +2025-12-25 00:45:15,602:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 00:45:15,606:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632593074936: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRTljVDNqRTQxdzNYNHZUcEF5UXpPMk54NlNJdWF0bXVUYmdPTVB5Nnc2dEUiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTkzMDc0OTM2In0", + "signature": "i-KlMnAZBK5emucU8XT-QCGkqmI9XmMYuNKyx-XwBJEUM2hAHIbugbshRgiovDewiKnTaSrPZ_dVIqLoQGIWeOcGRNmINGVj_KQtl1-GNWNx97EiqgOx2g6WJn1hWFJ3jzcfkVqkorSJia-HitciCck6-QXz4RIa3V5vMLn8WavaVu5-RoMuxNHh27zdYacAoMjkyLjGIBULH7BZWcl26sZJ7hcb76CorOOF3DHppL3JMaxwat7HtyYXfrotGcSEqhgLKE30JEcKjkridXqRMuZ0t_Snyc7SAHsd7mNL8EExGjWeNT58jdgLB4b9nJkRpVtnF8BF4_tkF7as_XS-Gg", + "payload": "" +} +2025-12-25 00:45:15,763:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632593074936 HTTP/1.1" 200 828 +2025-12-25 00:45:15,764:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:45:15 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: 58tS3qjEeppAj6GjPVSORgmYjtxTOnnBIbTfo6_bLmpOhrifsxA +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "profibot.synology.me" + }, + "status": "pending", + "expires": "2026-01-01T00:45:15Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632593074936/7ckjww", + "status": "pending", + "token": "3p0V9lXhAarnKZPWlIMssUq9-LRtuHeqJw1pKt2nm_0" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632593074936/hh1ZKg", + "status": "pending", + "token": "3p0V9lXhAarnKZPWlIMssUq9-LRtuHeqJw1pKt2nm_0" + }, + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632593074936/F-gr-Q", + "status": "pending", + "token": "3p0V9lXhAarnKZPWlIMssUq9-LRtuHeqJw1pKt2nm_0" + } + ] +} +2025-12-25 00:45:15,765:DEBUG:acme.client:Storing nonce: 58tS3qjEeppAj6GjPVSORgmYjtxTOnnBIbTfo6_bLmpOhrifsxA +2025-12-25 00:45:15,765:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632593074936/F-gr-Q', 'status': 'pending', 'token': '3p0V9lXhAarnKZPWlIMssUq9-LRtuHeqJw1pKt2nm_0'} +2025-12-25 00:45:15,766:INFO:certbot._internal.auth_handler:Performing the following challenges: +2025-12-25 00:45:15,766:INFO:certbot._internal.auth_handler:http-01 challenge for profibot.synology.me +2025-12-25 00:45:15,767:INFO:certbot._internal.plugins.webroot:Using the webroot path /data/letsencrypt-acme-challenge for all unmatched domains. +2025-12-25 00:45:15,767:DEBUG:certbot._internal.plugins.webroot:Creating root challenges validation dir at /data/letsencrypt-acme-challenge/.well-known/acme-challenge +2025-12-25 00:45:15,769:DEBUG:certbot._internal.plugins.webroot:Attempting to save validation to /data/letsencrypt-acme-challenge/.well-known/acme-challenge/3p0V9lXhAarnKZPWlIMssUq9-LRtuHeqJw1pKt2nm_0 +2025-12-25 00:45:15,770:DEBUG:acme.client:JWS payload: +b'{}' +2025-12-25 00:45:15,774:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632593074936/7ckjww: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRWVwcEFqNkdqUFZTT1JnbVlqdHhUT25uQkliVGZvNl9iTG1wT2hyaWZzeEEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NoYWxsLzI5MDY0MzgxNzYvNjMyNTkzMDc0OTM2Lzdja2p3dyJ9", + "signature": "Hj49FONBszLn__REtRIRBX2Kdfwj-q3aosVsMIgR_khvDLJcs8eWoQAB-68mxUzoT1tKemixMm-KJhPEPgpd1zJ91nlq_cUEf0kJLXvXzKelNDlLl4y1t3SIt2VJhEeF_aYeBzYkmrvEa_rrm462Fa-hirj99bj657Uyf8_Pt18zJVrMw0TQPXnvXCqT7dIs62sZGcuTCyP31MuJT10IcEL6i7AGJGMmCssa5PuMJ69K2jQ2wfDY-ZF5bSgo7EN6XVvJVCqSzKYTVaCr1YtEs5q4QizQXW7F7GoENMGcDN6Zd5N_qA5DYCE9F9tZVL2kTxhWvPDYCzeXB5SlfBDQFw", + "payload": "e30" +} +2025-12-25 00:45:15,933:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/chall/2906438176/632593074936/7ckjww HTTP/1.1" 200 195 +2025-12-25 00:45:15,934:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:45:15 GMT +Content-Type: application/json +Content-Length: 195 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="up" +Location: https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632593074936/7ckjww +Replay-Nonce: 58tS3qjE3ksN2fusCl7m4Asl4bNNA0se9_HFpoQV-TcVdWKFb1c +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632593074936/7ckjww", + "status": "pending", + "token": "3p0V9lXhAarnKZPWlIMssUq9-LRtuHeqJw1pKt2nm_0" +} +2025-12-25 00:45:15,935:DEBUG:acme.client:Storing nonce: 58tS3qjE3ksN2fusCl7m4Asl4bNNA0se9_HFpoQV-TcVdWKFb1c +2025-12-25 00:45:15,936:INFO:certbot._internal.auth_handler:Waiting for verification... +2025-12-25 00:45:16,936:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 00:45:16,940:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632593074936: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICI1OHRTM3FqRTNrc04yZnVzQ2w3bTRBc2w0Yk5OQTBzZTlfSEZwb1FWLVRjVmRXS0ZiMWMiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTkzMDc0OTM2In0", + "signature": "cQy0FB4889CzmpwjcRQisazZMGNe1BY6ndY3aTlvJkmF4_-AQuJ1HSpAPgTBsUOxfZLuj7ldyJxt43bhN2LGl-pS0X1kZeFQOrL9tE0MlGj9BZZi7OHymCuMIYHj8cODhMtwCyD_q4NdjfKyL-F58W6TOHTiLZo-__y4oFBAH_3Y5XmKB3oEPdrYN6VYQZfZKtpiQLgLetdWNKjWIXwe9MazI3cXjlBj8e6rfCj24SnVSp5t6-sdpmrUJXTGhbgTj3aWAMH48eli8AFZdUOSV8K1lMvktwFIdUR_vaxLDq0im5h0KePwrTOSHToQEDym6C5g6sSPVOwrDtg0f4dD8A", + "payload": "" +} +2025-12-25 00:45:17,098:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632593074936 HTTP/1.1" 200 828 +2025-12-25 00:45:17,098:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:45:17 GMT +Content-Type: application/json +Content-Length: 828 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJrZog6TRl93Mz0BDgkHmlCGhifx_LtImHhK01QvN1GeI +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "profibot.synology.me" + }, + "status": "pending", + "expires": "2026-01-01T00:45:15Z", + "challenges": [ + { + "type": "tls-alpn-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632593074936/F-gr-Q", + "status": "pending", + "token": "3p0V9lXhAarnKZPWlIMssUq9-LRtuHeqJw1pKt2nm_0" + }, + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632593074936/7ckjww", + "status": "pending", + "token": "3p0V9lXhAarnKZPWlIMssUq9-LRtuHeqJw1pKt2nm_0" + }, + { + "type": "dns-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632593074936/hh1ZKg", + "status": "pending", + "token": "3p0V9lXhAarnKZPWlIMssUq9-LRtuHeqJw1pKt2nm_0" + } + ] +} +2025-12-25 00:45:17,099:DEBUG:acme.client:Storing nonce: fULB7aUJrZog6TRl93Mz0BDgkHmlCGhifx_LtImHhK01QvN1GeI +2025-12-25 00:45:17,099:DEBUG:acme.challenges:tls-alpn-01 was not recognized, full message: {'type': 'tls-alpn-01', 'url': 'https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632593074936/F-gr-Q', 'status': 'pending', 'token': '3p0V9lXhAarnKZPWlIMssUq9-LRtuHeqJw1pKt2nm_0'} +2025-12-25 00:45:20,099:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 00:45:20,103:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632593074936: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSnJab2c2VFJsOTNNejBCRGdrSG1sQ0doaWZ4X0x0SW1IaEswMVF2TjFHZUkiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2F1dGh6LzI5MDY0MzgxNzYvNjMyNTkzMDc0OTM2In0", + "signature": "c4w46yPHSu0azc-WIN9OeSW202bbYqEUlB6CenY-icU4Ix3QUOxzcWEQwKrB6iZFS4-L5RpPReoXH77A2GazB6_pnG8QoZBRcx1DsPuu76yaovmnR14GpfmtWbSFnQDa5HAAtNiXxD4wTOGQScYdbp1vzuMgLlPUOX9WQ4V1_S09jUtbiL_52yMeNbPinetB1RIfqLqx2iM4IDzPz38MfF_BzyCom_VFIn4fnRGz6f4AeHE6U3IuCFADtMpon44r0ufhacgxXT4gtGhFcMgLK2VIfl2K3ksUAYdngCBpWptzVjZTj7ThlhqQchLskhN0OgFDnxN7v31roESoQdBdHQ", + "payload": "" +} +2025-12-25 00:45:20,259:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/authz/2906438176/632593074936 HTTP/1.1" 200 785 +2025-12-25 00:45:20,260:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:45:20 GMT +Content-Type: application/json +Content-Length: 785 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: fULB7aUJ0HRQNhf743iqjk1qmIzuP8C_ShWAGNL40iUq8GeLQXA +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "identifier": { + "type": "dns", + "value": "profibot.synology.me" + }, + "status": "valid", + "expires": "2026-01-24T00:45:17Z", + "challenges": [ + { + "type": "http-01", + "url": "https://acme-v02.api.letsencrypt.org/acme/chall/2906438176/632593074936/7ckjww", + "status": "valid", + "validated": "2025-12-25T00:45:15Z", + "token": "3p0V9lXhAarnKZPWlIMssUq9-LRtuHeqJw1pKt2nm_0", + "validationRecord": [ + { + "url": "http://profibot.synology.me/.well-known/acme-challenge/3p0V9lXhAarnKZPWlIMssUq9-LRtuHeqJw1pKt2nm_0", + "hostname": "profibot.synology.me", + "port": "80", + "addressesResolved": [ + "92.249.165.228" + ], + "addressUsed": "92.249.165.228" + } + ] + } + ] +} +2025-12-25 00:45:20,261:DEBUG:acme.client:Storing nonce: fULB7aUJ0HRQNhf743iqjk1qmIzuP8C_ShWAGNL40iUq8GeLQXA +2025-12-25 00:45:20,262:DEBUG:certbot._internal.error_handler:Calling registered functions +2025-12-25 00:45:20,262:INFO:certbot._internal.auth_handler:Cleaning up challenges +2025-12-25 00:45:20,262:DEBUG:certbot._internal.plugins.webroot:Removing /data/letsencrypt-acme-challenge/.well-known/acme-challenge/3p0V9lXhAarnKZPWlIMssUq9-LRtuHeqJw1pKt2nm_0 +2025-12-25 00:45:20,263:DEBUG:certbot._internal.plugins.webroot:All challenges cleaned up +2025-12-25 00:45:20,263:DEBUG:certbot._internal.client:CSR: CSR(file=None, data=b'-----BEGIN CERTIFICATE REQUEST-----\nMIIBKjCBsQIBADAAMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAES76MaJ1SVjNnIOki\nD4nMJyugIJlBmTVDiZfSw616pmLBGQbxHnbmVDU7xH0eiTfGNTOxEIiMaWPEiiyd\n70OQQiYFHc0QJW47HlPSnt547rCNxuUbgzFIYN0o/OEb3F5MoDIwMAYJKoZIhvcN\nAQkOMSMwITAfBgNVHREEGDAWghRwcm9maWJvdC5zeW5vbG9neS5tZTAKBggqhkjO\nPQQDAgNoADBlAjEA4hfpRlOsPsiEfcTd1RmhjKCuwczvRJRKD7TyTOnzTuwsn29o\nMBL1ScMC6xa2dwE0AjAWfRG/F3nz+O4j9l4l2QkjWyL1OzuPzpEX4DDALhSBCyjO\nUOqLEDSnmbkblJNwjL8=\n-----END CERTIFICATE REQUEST-----\n', form='pem') +2025-12-25 00:45:20,264:DEBUG:certbot._internal.client:Will poll for certificate issuance until 2025-12-25 00:46:50.264445 +2025-12-25 00:45:20,265:DEBUG:acme.client:JWS payload: +b'{\n "csr": "MIIBKjCBsQIBADAAMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAES76MaJ1SVjNnIOkiD4nMJyugIJlBmTVDiZfSw616pmLBGQbxHnbmVDU7xH0eiTfGNTOxEIiMaWPEiiyd70OQQiYFHc0QJW47HlPSnt547rCNxuUbgzFIYN0o_OEb3F5MoDIwMAYJKoZIhvcNAQkOMSMwITAfBgNVHREEGDAWghRwcm9maWJvdC5zeW5vbG9neS5tZTAKBggqhkjOPQQDAgNoADBlAjEA4hfpRlOsPsiEfcTd1RmhjKCuwczvRJRKD7TyTOnzTuwsn29oMBL1ScMC6xa2dwE0AjAWfRG_F3nz-O4j9l4l2QkjWyL1OzuPzpEX4DDALhSBCyjOUOqLEDSnmbkblJNwjL8"\n}' +2025-12-25 00:45:20,269:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/462377721906: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSjBIUlFOaGY3NDNpcWprMXFtSXp1UDhDX1NoV0FHTkw0MGlVcThHZUxRWEEiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2ZpbmFsaXplLzI5MDY0MzgxNzYvNDYyMzc3NzIxOTA2In0", + "signature": "ikMwNaspH-6CPdgwDBXAFj-8W_OfXS1I00h4kpmrkAdSqBVe8pdbRhYaJprftqR7RxBezJ2-hEGE8FD2PMd7JZT0TPPngIzP3A7xneK9P6JFYPqBlluRVLV-eB4l0ikoud3WslbUcluhqBU6QWw3-S40tlaP8cySmzoSDC7g62d8uhn1YMEyVKDGq8e4B3aTdrf0dUAD7V-bW2VlCehpUYDNsC_LYbD99nsc_6O9Owu9RhmVRioB7DJvNBqucRT6u84auJBqvq6kYY5x8A5Ceddv73-4Ru1gnhjwzkoBlutPfAv76WJT1GmgwyCNPSygbLOPBnHrwybCHdFr1qJoaQ", + "payload": "ewogICJjc3IiOiAiTUlJQktqQ0JzUUlCQURBQU1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFUzc2TWFKMVNWak5uSU9raUQ0bk1KeXVnSUpsQm1UVkRpWmZTdzYxNnBtTEJHUWJ4SG5ibVZEVTd4SDBlaVRmR05UT3hFSWlNYVdQRWlpeWQ3ME9RUWlZRkhjMFFKVzQ3SGxQU250NTQ3ckNOeHVVYmd6RklZTjBvX09FYjNGNU1vREl3TUFZSktvWklodmNOQVFrT01TTXdJVEFmQmdOVkhSRUVHREFXZ2hSd2NtOW1hV0p2ZEM1emVXNXZiRzluZVM1dFpUQUtCZ2dxaGtqT1BRUURBZ05vQURCbEFqRUE0aGZwUmxPc1BzaUVmY1RkMVJtaGpLQ3V3Y3p2UkpSS0Q3VHlUT256VHV3c24yOW9NQkwxU2NNQzZ4YTJkd0UwQWpBV2ZSR19GM256LU80ajlsNGwyUWtqV3lMMU96dVB6cEVYNEREQUxoU0JDeWpPVU9xTEVEU25tYmtibEpOd2pMOCIKfQ" +} +2025-12-25 00:45:20,631:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/finalize/2906438176/462377721906 HTTP/1.1" 200 456 +2025-12-25 00:45:20,632:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:45:20 GMT +Content-Type: application/json +Content-Length: 456 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/462377721906 +Replay-Nonce: fULB7aUJ-rH_OyCE-E5ZtJhanuxXdsHOQkkbSXV2g34Z7ssu4O8 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "valid", + "expires": "2026-01-01T00:45:15Z", + "identifiers": [ + { + "type": "dns", + "value": "profibot.synology.me" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632593074936" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/462377721906", + "certificate": "https://acme-v02.api.letsencrypt.org/acme/cert/0597509b0af723368ea477bfd2174dcf7252" +} +2025-12-25 00:45:20,633:DEBUG:acme.client:Storing nonce: fULB7aUJ-rH_OyCE-E5ZtJhanuxXdsHOQkkbSXV2g34Z7ssu4O8 +2025-12-25 00:45:21,634:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 00:45:21,638:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/order/2906438176/462377721906: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSi1ySF9PeUNFLUU1WnRKaGFudXhYZHNIT1Fra2JTWFYyZzM0Wjdzc3U0TzgiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL29yZGVyLzI5MDY0MzgxNzYvNDYyMzc3NzIxOTA2In0", + "signature": "gcH_X0q1A2yItuw5p9D8v_FNJV-xiNtPGOsDa_Vj7Q8tFCwpNswe4pPcD25K_43iZwK44iYsADahAWuEVjaUZ7ly8JjwoT2Ts0-bCb6thf3E2fYtPFVEW1WG9Tv34eukJMRhSw8TpaRq0FylUbNJ3-J076Ts_bVky_V4Fse9-GpLj35e6lt-NIVwoT8Msw-OLqk4rmsV_D7lNhbpWq5XaOKN2Ursw2IHcSBqp_f6l8x352HCAMIZmZ_juBlA5rZxHyPN2XtbyuiFbPQflJ4oVpEwbyL0hPGsPVwiUogFjdE-Fr-TN7NPAo-ZJJY7c818Vh9paLqPsXrxMGR-9WGzlw", + "payload": "" +} +2025-12-25 00:45:21,793:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/order/2906438176/462377721906 HTTP/1.1" 200 456 +2025-12-25 00:45:21,794:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:45:21 GMT +Content-Type: application/json +Content-Length: 456 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Location: https://acme-v02.api.letsencrypt.org/acme/order/2906438176/462377721906 +Replay-Nonce: fULB7aUJ6xds_j6J3aLi7aB5nQu33v0ceG2CizAWfNcrl61RNxc +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "status": "valid", + "expires": "2026-01-01T00:45:15Z", + "identifiers": [ + { + "type": "dns", + "value": "profibot.synology.me" + } + ], + "authorizations": [ + "https://acme-v02.api.letsencrypt.org/acme/authz/2906438176/632593074936" + ], + "finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/2906438176/462377721906", + "certificate": "https://acme-v02.api.letsencrypt.org/acme/cert/0597509b0af723368ea477bfd2174dcf7252" +} +2025-12-25 00:45:21,795:DEBUG:acme.client:Storing nonce: fULB7aUJ6xds_j6J3aLi7aB5nQu33v0ceG2CizAWfNcrl61RNxc +2025-12-25 00:45:21,795:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 00:45:21,798:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/cert/0597509b0af723368ea477bfd2174dcf7252: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSjZ4ZHNfajZKM2FMaTdhQjVuUXUzM3YwY2VHMkNpekFXZk5jcmw2MVJOeGMiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NlcnQvMDU5NzUwOWIwYWY3MjMzNjhlYTQ3N2JmZDIxNzRkY2Y3MjUyIn0", + "signature": "BEpmnLjhcYp7E21eavUoI8vo-GsGLgOZJ8XhJhiZuexrDXmADrUJZXdZPKVxqG0API4qy5QAwuiO4Go7dhRUdstBjCM10THWENshuIkuFMIlA5g0i4T7CTeRTh-MZy8K38ejAWKRxoq1MZq85rOslIfLegwTt8ecG7xa56_Oav7IARUckvZQayW8Hmqttk0w_V5FLhZiK2R1ui22Yl1bOqAJVCHyJacqMSUAf5T45YStIs7IQKRcQ0_dhxRgI6cQSNaPrm8_xrdUFAxN7agtuQppfKiTSr0MHAHRl36HVddXgLxsxjHRMmqny0bZPu5HUFXMERnDhf7WoI7tLctDwA", + "payload": "" +} +2025-12-25 00:45:21,969:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/cert/0597509b0af723368ea477bfd2174dcf7252 HTTP/1.1" 200 2909 +2025-12-25 00:45:21,970:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:45:21 GMT +Content-Type: application/pem-certificate-chain +Content-Length: 2909 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="alternate" +Replay-Nonce: fULB7aUJOAh65itDs0Lc840KmzKHKWj2MmYrD9ImQIE_k89dBNU +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +-----BEGIN CERTIFICATE----- +MIIDszCCAzmgAwIBAgISBZdQmwr3IzaOpHe/0hdNz3JSMAoGCCqGSM49BAMDMDIx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF +ODAeFw0yNTEyMjQyMzQ2NTBaFw0yNjAzMjQyMzQ2NDlaMB8xHTAbBgNVBAMTFHBy +b2ZpYm90LnN5bm9sb2d5Lm1lMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAES76MaJ1S +VjNnIOkiD4nMJyugIJlBmTVDiZfSw616pmLBGQbxHnbmVDU7xH0eiTfGNTOxEIiM +aWPEiiyd70OQQiYFHc0QJW47HlPSnt547rCNxuUbgzFIYN0o/OEb3F5Mo4ICIzCC +Ah8wDgYDVR0PAQH/BAQDAgeAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcD +AjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBRJtFTgqwPCzZX8gmOZTsOPpQRLHzAf +BgNVHSMEGDAWgBSPDROi9i5+0VBsMxg4XVmOI3KRyjAyBggrBgEFBQcBAQQmMCQw +IgYIKwYBBQUHMAKGFmh0dHA6Ly9lOC5pLmxlbmNyLm9yZy8wHwYDVR0RBBgwFoIU +cHJvZmlib3Quc3lub2xvZ3kubWUwEwYDVR0gBAwwCjAIBgZngQwBAgEwLQYDVR0f +BCYwJDAioCCgHoYcaHR0cDovL2U4LmMubGVuY3Iub3JnLzgzLmNybDCCAQUGCisG +AQQB1nkCBAIEgfYEgfMA8QB2AGQRxGykEuyniRyiAi4AvKtPKAfUHjUnq+r+1QPJ +fc3wAAABm1L3po0AAAQDAEcwRQIhAIaBbekiGNH3VwK+0blluRg0ZF+TqlpYNS6n +gHVGknS5AiAlf4XqzsZ7R8ll9kuRuHQSvNJt2oWqbqhO/QYKOYyVvgB3ABaDLavw +qSUPD/A6pUX/yL/II9CHS/YEKSf45x8zE/X6AAABm1L3pssAAAQDAEgwRgIhALO+ +h8r/WKEmISSWiJN9NultaFsjdoo48Av1kaCIFr1qAiEAqagsPtEZaBoP3o2PjCiK +TaRpmAlz01MHB33/KtY+ypcwCgYIKoZIzj0EAwMDaAAwZQIxAJkyq8FKvLC1CccV +suvITXKzeEnMc1sqDeuA7GX7qV8u+uYh2WPhJR4Jmrr0G1Te/AIwan5OaiJCBi1B +mCBKjprv4A9a+nlRZPjDtCahyDSnGdhkDmGrIpmYG2RVFFP/nmQN +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIEVjCCAj6gAwIBAgIQY5WTY8JOcIJxWRi/w9ftVjANBgkqhkiG9w0BAQsFADBP +MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy +Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa +Fw0yNzAzMTIyMzU5NTlaMDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF +bmNyeXB0MQswCQYDVQQDEwJFODB2MBAGByqGSM49AgEGBSuBBAAiA2IABNFl8l7c +S7QMApzSsvru6WyrOq44ofTUOTIzxULUzDMMNMchIJBwXOhiLxxxs0LXeb5GDcHb +R6EToMffgSZjO9SNHfY9gjMy9vQr5/WWOrQTZxh7az6NSNnq3u2ubT6HTKOB+DCB +9TAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB +MBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFI8NE6L2Ln7RUGwzGDhdWY4j +cpHKMB8GA1UdIwQYMBaAFHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEB +BCYwJDAiBggrBgEFBQcwAoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzATBgNVHSAE +DDAKMAgGBmeBDAECATAnBgNVHR8EIDAeMBygGqAYhhZodHRwOi8veDEuYy5sZW5j +ci5vcmcvMA0GCSqGSIb3DQEBCwUAA4ICAQBnE0hGINKsCYWi0Xx1ygxD5qihEjZ0 +RI3tTZz1wuATH3ZwYPIp97kWEayanD1j0cDhIYzy4CkDo2jB8D5t0a6zZWzlr98d +AQFNh8uKJkIHdLShy+nUyeZxc5bNeMp1Lu0gSzE4McqfmNMvIpeiwWSYO9w82Ob8 +otvXcO2JUYi3svHIWRm3+707DUbL51XMcY2iZdlCq4Wa9nbuk3WTU4gr6LY8MzVA +aDQG2+4U3eJ6qUF10bBnR1uuVyDYs9RhrwucRVnfuDj29CMLTsplM5f5wSV5hUpm +Uwp/vV7M4w4aGunt74koX71n4EdagCsL/Yk5+mAQU0+tue0JOfAV/R6t1k+Xk9s2 +HMQFeoxppfzAVC04FdG9M+AC2JWxmFSt6BCuh3CEey3fE52Qrj9YM75rtvIjsm/1 +Hl+u//Wqxnu1ZQ4jpa+VpuZiGOlWrqSP9eogdOhCGisnyewWJwRQOqK16wiGyZeR +xs/Bekw65vwSIaVkBruPiTfMOo0Zh4gVa8/qJgMbJbyrwwG97z/PRgmLKCDl8z3d +tA0Z7qq7fta0Gl24uyuB05dqI5J1LvAzKuWdIjT1tP8qCoxSE/xpix8hX2dt3h+/ +jujUgFPFZ0EVZ0xSyBNRF3MboGZnYXFUxpNjTWPKpagDHJQmqrAcDmWJnMsFY3jS +u1igv3OefnWjSQ== +-----END CERTIFICATE----- + +2025-12-25 00:45:21,971:DEBUG:acme.client:Storing nonce: fULB7aUJOAh65itDs0Lc840KmzKHKWj2MmYrD9ImQIE_k89dBNU +2025-12-25 00:45:21,971:DEBUG:acme.client:JWS payload: +b'' +2025-12-25 00:45:21,975:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/cert/0597509b0af723368ea477bfd2174dcf7252/1: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJmVUxCN2FVSk9BaDY1aXREczBMYzg0MEttektIS1dqMk1tWXJEOUltUUlFX2s4OWRCTlUiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2NlcnQvMDU5NzUwOWIwYWY3MjMzNjhlYTQ3N2JmZDIxNzRkY2Y3MjUyLzEifQ", + "signature": "BP722I7eDwHcG3s75hqRmPZpcjOqgw3L5oXlEP_pm9ex4Bs3oPtnemyrnQzSYnx94cKpzldKb2npn36EwAmvPRF-Rlq7aKJDk7HZe5Cm5GM0s_a-VXKN9ACBlFsxmZP8clzb6GD7fhi8JlHbHcawtwJ7rTryqpW9gB4RX-uemW6e0ULYaicPdw10oRdnUvhXg99u55yPjYKXnnK3Q2GkhLr8TODYYrbsxKZuWgJv1MRkYbVYiKLVR1g9pjdi6wD3Bitw-83Wu0-aM4y-3i0zh_anKrriR5DAVvgqwUl0j5RTWAPyxyLXIMrpZJRu8212qFfkemf_d-hQGmk1Db1qOw", + "payload": "" +} +2025-12-25 00:45:22,133:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/cert/0597509b0af723368ea477bfd2174dcf7252/1 HTTP/1.1" 200 2344 +2025-12-25 00:45:22,133:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:45:22 GMT +Content-Type: application/pem-certificate-chain +Content-Length: 2344 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index", ;rel="alternate" +Replay-Nonce: fULB7aUJv71UoqiAy7y6JIBGSqx2utdEVh60TA0v0oC7Tlpflm8 +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +-----BEGIN CERTIFICATE----- +MIIDszCCAzmgAwIBAgISBZdQmwr3IzaOpHe/0hdNz3JSMAoGCCqGSM49BAMDMDIx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF +ODAeFw0yNTEyMjQyMzQ2NTBaFw0yNjAzMjQyMzQ2NDlaMB8xHTAbBgNVBAMTFHBy +b2ZpYm90LnN5bm9sb2d5Lm1lMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAES76MaJ1S +VjNnIOkiD4nMJyugIJlBmTVDiZfSw616pmLBGQbxHnbmVDU7xH0eiTfGNTOxEIiM +aWPEiiyd70OQQiYFHc0QJW47HlPSnt547rCNxuUbgzFIYN0o/OEb3F5Mo4ICIzCC +Ah8wDgYDVR0PAQH/BAQDAgeAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcD +AjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBRJtFTgqwPCzZX8gmOZTsOPpQRLHzAf +BgNVHSMEGDAWgBSPDROi9i5+0VBsMxg4XVmOI3KRyjAyBggrBgEFBQcBAQQmMCQw +IgYIKwYBBQUHMAKGFmh0dHA6Ly9lOC5pLmxlbmNyLm9yZy8wHwYDVR0RBBgwFoIU +cHJvZmlib3Quc3lub2xvZ3kubWUwEwYDVR0gBAwwCjAIBgZngQwBAgEwLQYDVR0f +BCYwJDAioCCgHoYcaHR0cDovL2U4LmMubGVuY3Iub3JnLzgzLmNybDCCAQUGCisG +AQQB1nkCBAIEgfYEgfMA8QB2AGQRxGykEuyniRyiAi4AvKtPKAfUHjUnq+r+1QPJ +fc3wAAABm1L3po0AAAQDAEcwRQIhAIaBbekiGNH3VwK+0blluRg0ZF+TqlpYNS6n +gHVGknS5AiAlf4XqzsZ7R8ll9kuRuHQSvNJt2oWqbqhO/QYKOYyVvgB3ABaDLavw +qSUPD/A6pUX/yL/II9CHS/YEKSf45x8zE/X6AAABm1L3pssAAAQDAEgwRgIhALO+ +h8r/WKEmISSWiJN9NultaFsjdoo48Av1kaCIFr1qAiEAqagsPtEZaBoP3o2PjCiK +TaRpmAlz01MHB33/KtY+ypcwCgYIKoZIzj0EAwMDaAAwZQIxAJkyq8FKvLC1CccV +suvITXKzeEnMc1sqDeuA7GX7qV8u+uYh2WPhJR4Jmrr0G1Te/AIwan5OaiJCBi1B +mCBKjprv4A9a+nlRZPjDtCahyDSnGdhkDmGrIpmYG2RVFFP/nmQN +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIICtTCCAjugAwIBAgIQfo8UX4exWTMtf9QIK4JraTAKBggqhkjOPQQDAzBPMQsw +CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg +R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yNDAzMTMwMDAwMDBaFw0y +NzAzMTIyMzU5NTlaMDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNy +eXB0MQswCQYDVQQDEwJFODB2MBAGByqGSM49AgEGBSuBBAAiA2IABNFl8l7cS7QM +ApzSsvru6WyrOq44ofTUOTIzxULUzDMMNMchIJBwXOhiLxxxs0LXeb5GDcHbR6ET +oMffgSZjO9SNHfY9gjMy9vQr5/WWOrQTZxh7az6NSNnq3u2ubT6HTKOB+DCB9TAO +BgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIG +A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFI8NE6L2Ln7RUGwzGDhdWY4jcpHK +MB8GA1UdIwQYMBaAFHxClq7eS0g7+pL4nozPbYupcjeVMDIGCCsGAQUFBwEBBCYw +JDAiBggrBgEFBQcwAoYWaHR0cDovL3gyLmkubGVuY3Iub3JnLzATBgNVHSAEDDAK +MAgGBmeBDAECATAnBgNVHR8EIDAeMBygGqAYhhZodHRwOi8veDIuYy5sZW5jci5v +cmcvMAoGCCqGSM49BAMDA2gAMGUCMQClsUNJdX36GE+o2yDf7L02m3P3ElVWRLls +5ZyLYPjcNamBxRB9gZYoj24mGZtP3GkCMASZcALg6kpScomqIIjVHXRUQ500cdl4 +4n7fhxwokLo/lVlO8YyHwAi7ejTHtvw9Vg== +-----END CERTIFICATE----- + +2025-12-25 00:45:22,134:DEBUG:acme.client:Storing nonce: fULB7aUJv71UoqiAy7y6JIBGSqx2utdEVh60TA0v0oC7Tlpflm8 +2025-12-25 00:45:22,136:INFO:certbot._internal.client:Non-standard path(s), might not work with crontab installed by your operating system package manager +2025-12-25 00:45:22,136:DEBUG:certbot._internal.storage:Creating directory /etc/letsencrypt/archive/npm-11. +2025-12-25 00:45:22,137:DEBUG:certbot._internal.storage:Creating directory /etc/letsencrypt/live/npm-11. +2025-12-25 00:45:22,138:DEBUG:certbot._internal.storage:Writing certificate to /etc/letsencrypt/live/npm-11/cert.pem. +2025-12-25 00:45:22,138:DEBUG:certbot._internal.storage:Writing private key to /etc/letsencrypt/live/npm-11/privkey.pem. +2025-12-25 00:45:22,138:DEBUG:certbot._internal.storage:Writing chain to /etc/letsencrypt/live/npm-11/chain.pem. +2025-12-25 00:45:22,138:DEBUG:certbot._internal.storage:Writing full chain to /etc/letsencrypt/live/npm-11/fullchain.pem. +2025-12-25 00:45:22,138:DEBUG:certbot._internal.storage:Writing README to /etc/letsencrypt/live/npm-11/README. +2025-12-25 00:45:22,146:DEBUG:certbot.configuration:Var account=e417a583de478a0cfdeed332c1113068 (set by user). +2025-12-25 00:45:22,146:DEBUG:certbot.configuration:Var key_type=ecdsa (set by user). +2025-12-25 00:45:22,146:DEBUG:certbot.configuration:Var elliptic_curve=secp384r1 (set by user). +2025-12-25 00:45:22,146:DEBUG:certbot.configuration:Var preferred_chain=ISRG Root X1 (set by user). +2025-12-25 00:45:22,146:DEBUG:certbot.configuration:Var pref_challs=['http-01'] (set by user). +2025-12-25 00:45:22,146:DEBUG:certbot.configuration:Var config_dir=/etc/letsencrypt (set by user). +2025-12-25 00:45:22,146:DEBUG:certbot.configuration:Var work_dir=/tmp/letsencrypt-lib (set by user). +2025-12-25 00:45:22,146:DEBUG:certbot.configuration:Var logs_dir=/data/logs (set by user). +2025-12-25 00:45:22,146:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2025-12-25 00:45:22,146:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2025-12-25 00:45:22,146:DEBUG:certbot.configuration:Var webroot_path=['/data/letsencrypt-acme-challenge'] (set by user). +2025-12-25 00:45:22,146:DEBUG:certbot.configuration:Var webroot_map={'profibot.synology.me': '/data/letsencrypt-acme-challenge'} (set by user). +2025-12-25 00:45:22,147:DEBUG:certbot._internal.display.obj:Notifying user: +Successfully received certificate. +Certificate is saved at: /etc/letsencrypt/live/npm-11/fullchain.pem +Key is saved at: /etc/letsencrypt/live/npm-11/privkey.pem +This certificate expires on 2026-03-24. +These files will be updated when the certificate renews. +2025-12-25 00:45:22,148:DEBUG:certbot._internal.display.obj:Notifying user: NEXT STEPS: +2025-12-25 00:45:22,148:DEBUG:certbot._internal.display.obj:Notifying user: - The certificate will need to be renewed before it expires. Certbot can automatically renew the certificate in the background, but you may need to take steps to enable that functionality. See https://certbot.org/renewal-setup for instructions. +2025-12-25 00:45:22,149:DEBUG:certbot._internal.display.obj:Notifying user: If you like Certbot, please consider supporting our work by: + * Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate + * Donating to EFF: https://eff.org/donate-le diff --git a/proxy-manager/data/logs/letsencrypt.log.9 b/proxy-manager/data/logs/letsencrypt.log.9 new file mode 100755 index 0000000..6082821 --- /dev/null +++ b/proxy-manager/data/logs/letsencrypt.log.9 @@ -0,0 +1,137 @@ +2025-12-25 00:27:04,269:DEBUG:certbot._internal.main:certbot version: 5.1.0 +2025-12-25 00:27:04,269:DEBUG:certbot._internal.main:Location of certbot entry point: /opt/certbot/bin/certbot +2025-12-25 00:27:04,269:DEBUG:certbot._internal.main:Arguments: ['--config', '/etc/letsencrypt.ini', '--work-dir', '/tmp/letsencrypt-lib', '--logs-dir', '/data/logs', '--cert-name', 'npm-10', '--agree-tos', '--authenticator', 'webroot', '-m', 'kincses@gmail.com', '--preferred-challenges', 'http', '--domains', 'NAS'] +2025-12-25 00:27:04,269:DEBUG:certbot._internal.main:Discovered plugins: PluginsRegistry(PluginEntryPoint#manual,PluginEntryPoint#null,PluginEntryPoint#standalone,PluginEntryPoint#webroot) +2025-12-25 00:27:04,279:DEBUG:certbot._internal.log:Root logging level set at 30 +2025-12-25 00:27:04,280:DEBUG:certbot._internal.plugins.selection:Requested authenticator webroot and installer None +2025-12-25 00:27:04,280:DEBUG:certbot._internal.plugins.selection:Single candidate plugin: * webroot +Description: Saves the necessary validation files to a .well-known/acme-challenge/ directory within the nominated webroot path. A separate HTTP server must be running and serving files from the webroot path. HTTP challenge only (wildcards not supported). +Interfaces: Authenticator, Plugin +Entry point: EntryPoint(name='webroot', value='certbot._internal.plugins.webroot:Authenticator', group='certbot.plugins') +Initialized: +Prep: True +2025-12-25 00:27:04,280:DEBUG:certbot._internal.plugins.selection:Selected authenticator and installer None +2025-12-25 00:27:04,280:INFO:certbot._internal.plugins.selection:Plugins selected: Authenticator webroot, Installer None +2025-12-25 00:27:04,317:DEBUG:certbot._internal.main:Picked account: +2025-12-25 00:27:04,317:DEBUG:acme.client:Sending GET request to https://acme-v02.api.letsencrypt.org/directory. +2025-12-25 00:27:04,319:DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org:443 +2025-12-25 00:27:04,752:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "GET /directory HTTP/1.1" 200 1033 +2025-12-25 00:27:04,753:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:27:04 GMT +Content-Type: application/json +Content-Length: 1033 +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + +{ + "Tlfqb6mw68E": "https://community.letsencrypt.org/t/adding-random-entries-to-the-directory/33417", + "keyChange": "https://acme-v02.api.letsencrypt.org/acme/key-change", + "meta": { + "caaIdentities": [ + "letsencrypt.org" + ], + "profiles": { + "classic": "https://letsencrypt.org/docs/profiles#classic", + "shortlived": "https://letsencrypt.org/docs/profiles#shortlived", + "tlsclient": "https://letsencrypt.org/docs/profiles#tlsclient", + "tlsserver": "https://letsencrypt.org/docs/profiles#tlsserver" + }, + "termsOfService": "https://letsencrypt.org/documents/LE-SA-v1.6-August-18-2025.pdf", + "website": "https://letsencrypt.org" + }, + "newAccount": "https://acme-v02.api.letsencrypt.org/acme/new-acct", + "newNonce": "https://acme-v02.api.letsencrypt.org/acme/new-nonce", + "newOrder": "https://acme-v02.api.letsencrypt.org/acme/new-order", + "renewalInfo": "https://acme-v02.api.letsencrypt.org/acme/renewal-info", + "revokeCert": "https://acme-v02.api.letsencrypt.org/acme/revoke-cert" +} +2025-12-25 00:27:04,754:DEBUG:certbot._internal.display.obj:Notifying user: Requesting a certificate for nas +2025-12-25 00:27:04,760:DEBUG:acme.client:Requesting fresh nonce +2025-12-25 00:27:04,760:DEBUG:acme.client:Sending HEAD request to https://acme-v02.api.letsencrypt.org/acme/new-nonce. +2025-12-25 00:27:04,904:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "HEAD /acme/new-nonce HTTP/1.1" 200 0 +2025-12-25 00:27:04,905:DEBUG:acme.client:Received response: +HTTP 200 +Server: nginx +Date: Thu, 25 Dec 2025 00:27:04 GMT +Connection: keep-alive +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: IijzadlS7jW4VsaUWGJUxUF7WVgLXG3f9YPiQyxdYqaNqDBUANE +X-Frame-Options: DENY +Strict-Transport-Security: max-age=604800 + + +2025-12-25 00:27:04,905:DEBUG:acme.client:Storing nonce: IijzadlS7jW4VsaUWGJUxUF7WVgLXG3f9YPiQyxdYqaNqDBUANE +2025-12-25 00:27:04,906:DEBUG:acme.client:JWS payload: +b'{\n "identifiers": [\n {\n "type": "dns",\n "value": "nas"\n }\n ]\n}' +2025-12-25 00:27:04,910:DEBUG:acme.client:Sending POST request to https://acme-v02.api.letsencrypt.org/acme/new-order: +{ + "protected": "eyJhbGciOiAiUlMyNTYiLCAia2lkIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL2FjY3QvMjkwNjQzODE3NiIsICJub25jZSI6ICJJaWp6YWRsUzdqVzRWc2FVV0dKVXhVRjdXVmdMWEczZjlZUGlReXhkWXFhTnFEQlVBTkUiLCAidXJsIjogImh0dHBzOi8vYWNtZS12MDIuYXBpLmxldHNlbmNyeXB0Lm9yZy9hY21lL25ldy1vcmRlciJ9", + "signature": "lb2vHfDE3JzPMYTwZSRVTKED0X-FIUR45GohsnELwt3aIuoQ2w6kVlO6fqQxaqBpjwg35QrhtPYMocBZYJw_YHCWM750UgTxE1QQgbMeiK8mgO1_dlvKn2hoAhx4TSErKhiDII6aBz9RrGCtjUsVCq6syACVl2DXhNC63fo9pG49CsMy7Hzu3U0s1klDQWNVf8XIDwAoHQomi7IWTQC3vA5kbXtvjtnwwgDJf3SFjkv4rf0DrvkkuK87tbzF0lUOdshBb7PV3LDWRXVbUHT296aD3zJDCLPuOACq5birBFDOtWiETyObEkAM0PVoIHxAW43r24nrityjsHnGG-mkTQ", + "payload": "ewogICJpZGVudGlmaWVycyI6IFsKICAgIHsKICAgICAgInR5cGUiOiAiZG5zIiwKICAgICAgInZhbHVlIjogIm5hcyIKICAgIH0KICBdCn0" +} +2025-12-25 00:27:05,053:DEBUG:urllib3.connectionpool:https://acme-v02.api.letsencrypt.org:443 "POST /acme/new-order HTTP/1.1" 400 187 +2025-12-25 00:27:05,053:DEBUG:acme.client:Received response: +HTTP 400 +Server: nginx +Date: Thu, 25 Dec 2025 00:27:04 GMT +Content-Type: application/problem+json +Content-Length: 187 +Connection: keep-alive +Boulder-Requester: 2906438176 +Cache-Control: public, max-age=0, no-cache +Link: ;rel="index" +Replay-Nonce: IijzadlS3tHSW5fpjrWY9TYZft_YFu_1arC1zzjLJY5GvWD7Mkw + +{ + "type": "urn:ietf:params:acme:error:rejectedIdentifier", + "detail": "Invalid identifiers requested :: Cannot issue for \"nas\": Domain name needs at least one dot", + "status": 400 +} +2025-12-25 00:27:05,055:DEBUG:certbot._internal.log:Exiting abnormally: +Traceback (most recent call last): + File "/opt/certbot/bin/certbot", line 7, in + sys.exit(main()) + ^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/main.py", line 18, in main + return internal_main.main(cli_args) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 1850, in main + return config.func(config, plugins) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 1562, in certonly + lineage = _get_and_save_cert(le_client, config, domains, certname, lineage) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/main.py", line 141, in _get_and_save_cert + lineage = le_client.obtain_and_enroll_certificate(domains, certname) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 526, in obtain_and_enroll_certificate + cert, chain, key, _ = self.obtain_certificate(domains) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 427, in obtain_certificate + orderr = self._get_order_and_authorizations(csr.data, self.config.allow_subset_of_names) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/certbot/_internal/client.py", line 487, in _get_order_and_authorizations + orderr = self.acme.new_order(csr_pem, profile=profile) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/acme/client.py", line 141, in new_order + response = self._post(self.directory['newOrder'], order) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/acme/client.py", line 467, in _post + return self.net.post(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/acme/client.py", line 818, in post + return self._post_once(*args, **kwargs) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/acme/client.py", line 833, in _post_once + response = self._check_response(response, content_type=content_type) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/opt/certbot/lib/python3.11/site-packages/acme/client.py", line 705, in _check_response + raise messages.Error.from_json(jobj) +acme.messages.Error: urn:ietf:params:acme:error:rejectedIdentifier :: The server will not issue certificates for the identifier :: Invalid identifiers requested :: Cannot issue for "nas": Domain name needs at least one dot +2025-12-25 00:27:05,061:ERROR:certbot._internal.log:An unexpected error occurred: +2025-12-25 00:27:05,061:ERROR:certbot._internal.log:Invalid identifiers requested :: Cannot issue for "nas": Domain name needs at least one dot diff --git a/proxy-manager/data/logs/proxy-host-1_access.log.1.gz b/proxy-manager/data/logs/proxy-host-1_access.log.1.gz new file mode 100755 index 0000000..8d9d072 Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-1_access.log.1.gz differ diff --git a/proxy-manager/data/logs/proxy-host-1_access.log.2.gz b/proxy-manager/data/logs/proxy-host-1_access.log.2.gz new file mode 100755 index 0000000..9974bad Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-1_access.log.2.gz differ diff --git a/proxy-manager/data/logs/proxy-host-1_access.log.3.gz b/proxy-manager/data/logs/proxy-host-1_access.log.3.gz new file mode 100755 index 0000000..554efcf Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-1_access.log.3.gz differ diff --git a/proxy-manager/data/logs/proxy-host-1_error.log.1.gz b/proxy-manager/data/logs/proxy-host-1_error.log.1.gz new file mode 100755 index 0000000..64b8cf3 Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-1_error.log.1.gz differ diff --git a/proxy-manager/data/logs/proxy-host-1_error.log.2.gz b/proxy-manager/data/logs/proxy-host-1_error.log.2.gz new file mode 100755 index 0000000..6601345 Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-1_error.log.2.gz differ diff --git a/proxy-manager/data/logs/proxy-host-1_error.log.3.gz b/proxy-manager/data/logs/proxy-host-1_error.log.3.gz new file mode 100755 index 0000000..5343061 Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-1_error.log.3.gz differ diff --git a/proxy-manager/data/logs/proxy-host-2_access.log.1.gz b/proxy-manager/data/logs/proxy-host-2_access.log.1.gz new file mode 100755 index 0000000..189a727 Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-2_access.log.1.gz differ diff --git a/proxy-manager/data/logs/proxy-host-2_access.log.2.gz b/proxy-manager/data/logs/proxy-host-2_access.log.2.gz new file mode 100755 index 0000000..1823709 Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-2_access.log.2.gz differ diff --git a/proxy-manager/data/logs/proxy-host-2_access.log.3.gz b/proxy-manager/data/logs/proxy-host-2_access.log.3.gz new file mode 100755 index 0000000..df0f8c3 Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-2_access.log.3.gz differ diff --git a/proxy-manager/data/logs/proxy-host-2_error.log.1.gz b/proxy-manager/data/logs/proxy-host-2_error.log.1.gz new file mode 100755 index 0000000..1149ccf Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-2_error.log.1.gz differ diff --git a/proxy-manager/data/logs/proxy-host-2_error.log.2.gz b/proxy-manager/data/logs/proxy-host-2_error.log.2.gz new file mode 100755 index 0000000..251186e Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-2_error.log.2.gz differ diff --git a/proxy-manager/data/logs/proxy-host-2_error.log.3.gz b/proxy-manager/data/logs/proxy-host-2_error.log.3.gz new file mode 100755 index 0000000..e1e9cd5 Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-2_error.log.3.gz differ diff --git a/proxy-manager/data/logs/proxy-host-3_access.log.1.gz b/proxy-manager/data/logs/proxy-host-3_access.log.1.gz new file mode 100755 index 0000000..fb20d36 Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-3_access.log.1.gz differ diff --git a/proxy-manager/data/logs/proxy-host-3_access.log.2.gz b/proxy-manager/data/logs/proxy-host-3_access.log.2.gz new file mode 100755 index 0000000..116add9 Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-3_access.log.2.gz differ diff --git a/proxy-manager/data/logs/proxy-host-3_access.log.3.gz b/proxy-manager/data/logs/proxy-host-3_access.log.3.gz new file mode 100755 index 0000000..c6daa4c Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-3_access.log.3.gz differ diff --git a/proxy-manager/data/logs/proxy-host-3_error.log.1.gz b/proxy-manager/data/logs/proxy-host-3_error.log.1.gz new file mode 100755 index 0000000..afb50cc Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-3_error.log.1.gz differ diff --git a/proxy-manager/data/logs/proxy-host-3_error.log.2.gz b/proxy-manager/data/logs/proxy-host-3_error.log.2.gz new file mode 100755 index 0000000..f799b9f Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-3_error.log.2.gz differ diff --git a/proxy-manager/data/logs/proxy-host-3_error.log.3.gz b/proxy-manager/data/logs/proxy-host-3_error.log.3.gz new file mode 100755 index 0000000..38ed34b Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-3_error.log.3.gz differ diff --git a/proxy-manager/data/logs/proxy-host-5_access.log.1.gz b/proxy-manager/data/logs/proxy-host-5_access.log.1.gz new file mode 100755 index 0000000..fb27f06 Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-5_access.log.1.gz differ diff --git a/proxy-manager/data/logs/proxy-host-5_access.log.2.gz b/proxy-manager/data/logs/proxy-host-5_access.log.2.gz new file mode 100755 index 0000000..c02d52c Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-5_access.log.2.gz differ diff --git a/proxy-manager/data/logs/proxy-host-5_access.log.3.gz b/proxy-manager/data/logs/proxy-host-5_access.log.3.gz new file mode 100755 index 0000000..26fc84d Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-5_access.log.3.gz differ diff --git a/proxy-manager/data/logs/proxy-host-5_error.log.1.gz b/proxy-manager/data/logs/proxy-host-5_error.log.1.gz new file mode 100755 index 0000000..5079c25 Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-5_error.log.1.gz differ diff --git a/proxy-manager/data/logs/proxy-host-5_error.log.2.gz b/proxy-manager/data/logs/proxy-host-5_error.log.2.gz new file mode 100755 index 0000000..99a1897 Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-5_error.log.2.gz differ diff --git a/proxy-manager/data/logs/proxy-host-5_error.log.3.gz b/proxy-manager/data/logs/proxy-host-5_error.log.3.gz new file mode 100755 index 0000000..c4bd519 Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-5_error.log.3.gz differ diff --git a/proxy-manager/data/logs/proxy-host-6_access.log.1.gz b/proxy-manager/data/logs/proxy-host-6_access.log.1.gz new file mode 100755 index 0000000..065a7ba Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-6_access.log.1.gz differ diff --git a/proxy-manager/data/logs/proxy-host-6_access.log.2.gz b/proxy-manager/data/logs/proxy-host-6_access.log.2.gz new file mode 100755 index 0000000..50783ba Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-6_access.log.2.gz differ diff --git a/proxy-manager/data/logs/proxy-host-6_access.log.3.gz b/proxy-manager/data/logs/proxy-host-6_access.log.3.gz new file mode 100755 index 0000000..6e5c362 Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-6_access.log.3.gz differ diff --git a/proxy-manager/data/logs/proxy-host-6_error.log.1.gz b/proxy-manager/data/logs/proxy-host-6_error.log.1.gz new file mode 100755 index 0000000..c69f7a5 Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-6_error.log.1.gz differ diff --git a/proxy-manager/data/logs/proxy-host-6_error.log.2.gz b/proxy-manager/data/logs/proxy-host-6_error.log.2.gz new file mode 100755 index 0000000..c1d2931 Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-6_error.log.2.gz differ diff --git a/proxy-manager/data/logs/proxy-host-6_error.log.3.gz b/proxy-manager/data/logs/proxy-host-6_error.log.3.gz new file mode 100755 index 0000000..6cd3e1d Binary files /dev/null and b/proxy-manager/data/logs/proxy-host-6_error.log.3.gz differ diff --git a/proxy-manager/data/nginx/proxy_host/1.conf b/proxy-manager/data/nginx/proxy_host/1.conf new file mode 100755 index 0000000..48116ce --- /dev/null +++ b/proxy-manager/data/nginx/proxy_host/1.conf @@ -0,0 +1,83 @@ +# ------------------------------------------------------------ +# db.profibot.hu +# ------------------------------------------------------------ + + + +map $scheme $hsts_header { + https "max-age=63072000; preload"; +} + +server { + set $forward_scheme http; + set $server "pgadmin_ui"; + set $port 80; + + listen 80; +listen [::]:80; + +listen 443 ssl; +listen [::]:443 ssl; + + + server_name db.profibot.hu; +http2 off; + + + # Let's Encrypt SSL + include conf.d/include/letsencrypt-acme-challenge.conf; + include conf.d/include/ssl-cache.conf; + include conf.d/include/ssl-ciphers.conf; + ssl_certificate /etc/letsencrypt/live/npm-14/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/npm-14/privkey.pem; + + + + + + + # Block Exploits + include conf.d/include/block-exploits.conf; + + + + + + + + # Force SSL + include conf.d/include/force-ssl.conf; + + + + + + access_log /data/logs/proxy-host-1_access.log proxy; + error_log /data/logs/proxy-host-1_error.log warn; + + + + + + + + location / { + + + + + + + + + + + + # Proxy! + include conf.d/include/proxy.conf; + } + + + # Custom + include /data/nginx/custom/server_proxy[.]conf; +} diff --git a/proxy-manager/data/nginx/proxy_host/10.conf b/proxy-manager/data/nginx/proxy_host/10.conf new file mode 100755 index 0000000..4ca1878 --- /dev/null +++ b/proxy-manager/data/nginx/proxy_host/10.conf @@ -0,0 +1,88 @@ +# ------------------------------------------------------------ +# terminal.profibot.hu +# ------------------------------------------------------------ + + + +map $scheme $hsts_header { + https "max-age=63072000; preload"; +} + +server { + set $forward_scheme https; + set $server "192.168.100.43"; + set $port 9090; + + listen 80; +listen [::]:80; + +listen 443 ssl; +listen [::]:443 ssl; + + + server_name terminal.profibot.hu; +http2 off; + + + # Let's Encrypt SSL + include conf.d/include/letsencrypt-acme-challenge.conf; + include conf.d/include/ssl-cache.conf; + include conf.d/include/ssl-ciphers.conf; + ssl_certificate /etc/letsencrypt/live/npm-18/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/npm-18/privkey.pem; + + + + + + + + + + + + + # Force SSL + include conf.d/include/force-ssl.conf; + + + + +proxy_set_header Upgrade $http_upgrade; +proxy_set_header Connection $http_connection; +proxy_http_version 1.1; + + + access_log /data/logs/proxy-host-10_access.log proxy; + error_log /data/logs/proxy-host-10_error.log warn; + + + + + + + + location / { + + + + + + + + + + + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $http_connection; + proxy_http_version 1.1; + + + # Proxy! + include conf.d/include/proxy.conf; + } + + + # Custom + include /data/nginx/custom/server_proxy[.]conf; +} diff --git a/proxy-manager/data/nginx/proxy_host/11.conf b/proxy-manager/data/nginx/proxy_host/11.conf new file mode 100755 index 0000000..64a81a9 --- /dev/null +++ b/proxy-manager/data/nginx/proxy_host/11.conf @@ -0,0 +1,89 @@ +# ------------------------------------------------------------ +# net.profibot.hu +# ------------------------------------------------------------ + + + +map $scheme $hsts_header { + https "max-age=63072000; preload"; +} + +server { + set $forward_scheme http; + set $server "127.17.0.1"; + set $port 81; + + listen 80; +listen [::]:80; + +listen 443 ssl; +listen [::]:443 ssl; + + + server_name net.profibot.hu; +http2 off; + + + # Let's Encrypt SSL + include conf.d/include/letsencrypt-acme-challenge.conf; + include conf.d/include/ssl-cache.conf; + include conf.d/include/ssl-ciphers.conf; + ssl_certificate /etc/letsencrypt/live/npm-19/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/npm-19/privkey.pem; + + + + + + + + + + + + + # Force SSL + include conf.d/include/force-ssl.conf; + + + + +proxy_set_header Upgrade $http_upgrade; +proxy_set_header Connection $http_connection; +proxy_http_version 1.1; + + + access_log /data/logs/proxy-host-11_access.log proxy; + error_log /data/logs/proxy-host-11_error.log warn; + + + + + + + + location / { + + + + + + + + + + + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $http_connection; + proxy_http_version 1.1; + + + # Proxy! + include conf.d/include/proxy.conf; + } + + + # Custom + include /data/nginx/custom/server_proxy[.]conf; +} + diff --git a/proxy-manager/data/nginx/proxy_host/2.conf b/proxy-manager/data/nginx/proxy_host/2.conf new file mode 100755 index 0000000..c580d70 --- /dev/null +++ b/proxy-manager/data/nginx/proxy_host/2.conf @@ -0,0 +1,91 @@ +# ------------------------------------------------------------ +# dev.profibot.hu +# ------------------------------------------------------------ + + + +map $scheme $hsts_header { + https "max-age=63072000; preload"; +} + +server { + set $forward_scheme http; + set $server "service_finder_api"; + set $port 8000; + + listen 80; +listen [::]:80; + +listen 443 ssl; +listen [::]:443 ssl; + + + server_name dev.profibot.hu; +http2 off; + + + # Let's Encrypt SSL + include conf.d/include/letsencrypt-acme-challenge.conf; + include conf.d/include/ssl-cache.conf; + include conf.d/include/ssl-ciphers.conf; + ssl_certificate /etc/letsencrypt/live/npm-4/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/npm-4/privkey.pem; + + + + + + + # Block Exploits + include conf.d/include/block-exploits.conf; + + + + + + + + # Force SSL + include conf.d/include/force-ssl.conf; + + + + +proxy_set_header Upgrade $http_upgrade; +proxy_set_header Connection $http_connection; +proxy_http_version 1.1; + + + access_log /data/logs/proxy-host-2_access.log proxy; + error_log /data/logs/proxy-host-2_error.log warn; + + + + + + + + location / { + + + + + + + + + + + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $http_connection; + proxy_http_version 1.1; + + + # Proxy! + include conf.d/include/proxy.conf; + } + + + # Custom + include /data/nginx/custom/server_proxy[.]conf; +} diff --git a/proxy-manager/data/nginx/proxy_host/3.conf b/proxy-manager/data/nginx/proxy_host/3.conf new file mode 100755 index 0000000..3592ae7 --- /dev/null +++ b/proxy-manager/data/nginx/proxy_host/3.conf @@ -0,0 +1,83 @@ +# ------------------------------------------------------------ +# Targetts.ddns.net +# ------------------------------------------------------------ + + + +map $scheme $hsts_header { + https "max-age=63072000; preload"; +} + +server { + set $forward_scheme http; + set $server "172.17.0.1"; + set $port 5050; + + listen 80; +listen [::]:80; + +listen 443 ssl; +listen [::]:443 ssl; + + + server_name Targetts.ddns.net; +http2 off; + + + # Let's Encrypt SSL + include conf.d/include/letsencrypt-acme-challenge.conf; + include conf.d/include/ssl-cache.conf; + include conf.d/include/ssl-ciphers.conf; + ssl_certificate /etc/letsencrypt/live/npm-5/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/npm-5/privkey.pem; + + + + + + + # Block Exploits + include conf.d/include/block-exploits.conf; + + + + + + + + # Force SSL + include conf.d/include/force-ssl.conf; + + + + + + access_log /data/logs/proxy-host-3_access.log proxy; + error_log /data/logs/proxy-host-3_error.log warn; + + + + + + + + location / { + + + + + + + + + + + + # Proxy! + include conf.d/include/proxy.conf; + } + + + # Custom + include /data/nginx/custom/server_proxy[.]conf; +} diff --git a/proxy-manager/data/nginx/proxy_host/5.conf b/proxy-manager/data/nginx/proxy_host/5.conf new file mode 100755 index 0000000..3d5b938 --- /dev/null +++ b/proxy-manager/data/nginx/proxy_host/5.conf @@ -0,0 +1,80 @@ +# ------------------------------------------------------------ +# profibot.synology.me +# ------------------------------------------------------------ + + + +map $scheme $hsts_header { + https "max-age=63072000; preload"; +} + +server { + set $forward_scheme https; + set $server "192.168.100.30"; + set $port 5001; + + listen 80; +listen [::]:80; + +listen 443 ssl; +listen [::]:443 ssl; + + + server_name profibot.synology.me; +http2 off; + + + # Let's Encrypt SSL + include conf.d/include/letsencrypt-acme-challenge.conf; + include conf.d/include/ssl-cache.conf; + include conf.d/include/ssl-ciphers.conf; + ssl_certificate /etc/letsencrypt/live/npm-11/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/npm-11/privkey.pem; + + + + + + + + + + + + + # Force SSL + include conf.d/include/force-ssl.conf; + + + + + + access_log /data/logs/proxy-host-5_access.log proxy; + error_log /data/logs/proxy-host-5_error.log warn; + + + + + + + + location / { + + + + + + + + + + + + # Proxy! + include conf.d/include/proxy.conf; + } + + + # Custom + include /data/nginx/custom/server_proxy[.]conf; +} diff --git a/proxy-manager/data/nginx/proxy_host/6.conf b/proxy-manager/data/nginx/proxy_host/6.conf new file mode 100755 index 0000000..b157244 --- /dev/null +++ b/proxy-manager/data/nginx/proxy_host/6.conf @@ -0,0 +1,92 @@ +# ------------------------------------------------------------ +# nas.profibot.hu +# ------------------------------------------------------------ + + + +map $scheme $hsts_header { + https "max-age=63072000; preload"; +} + +server { + set $forward_scheme https; + set $server "192.168.100.30"; + set $port 5001; + + listen 80; +listen [::]:80; + +listen 443 ssl; +listen [::]:443 ssl; + + + server_name nas.profibot.hu; + + http2 on; + + + # Let's Encrypt SSL + include conf.d/include/letsencrypt-acme-challenge.conf; + include conf.d/include/ssl-cache.conf; + include conf.d/include/ssl-ciphers.conf; + ssl_certificate /etc/letsencrypt/live/npm-13/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/npm-13/privkey.pem; + + + + + + + # Block Exploits + include conf.d/include/block-exploits.conf; + + + + + + + + # Force SSL + include conf.d/include/force-ssl.conf; + + + + +proxy_set_header Upgrade $http_upgrade; +proxy_set_header Connection $http_connection; +proxy_http_version 1.1; + + + access_log /data/logs/proxy-host-6_access.log proxy; + error_log /data/logs/proxy-host-6_error.log warn; + + + + + + + + location / { + + + + + + + + + + + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $http_connection; + proxy_http_version 1.1; + + + # Proxy! + include conf.d/include/proxy.conf; + } + + + # Custom + include /data/nginx/custom/server_proxy[.]conf; +} diff --git a/proxy-manager/data/nginx/proxy_host/7.conf b/proxy-manager/data/nginx/proxy_host/7.conf new file mode 100755 index 0000000..ca03798 --- /dev/null +++ b/proxy-manager/data/nginx/proxy_host/7.conf @@ -0,0 +1,59 @@ +# ------------------------------------------------------------ +# fimer.profibot.hu +# ------------------------------------------------------------ + + + +map $scheme $hsts_header { + https "max-age=63072000; preload"; +} + +server { + set $forward_scheme http; + set $server "192.168.100.6"; + set $port 80; + + listen 80; +listen [::]:80; + + + server_name fimer.profibot.hu; +http2 off; + + + + + + + + + + + + + access_log /data/logs/proxy-host-7_access.log proxy; + error_log /data/logs/proxy-host-7_error.log warn; + + + + + + + + location / { + + + + + + + + + # Proxy! + include conf.d/include/proxy.conf; + } + + + # Custom + include /data/nginx/custom/server_proxy[.]conf; +} diff --git a/proxy-manager/data/nginx/proxy_host/8.conf b/proxy-manager/data/nginx/proxy_host/8.conf new file mode 100755 index 0000000..2141c84 --- /dev/null +++ b/proxy-manager/data/nginx/proxy_host/8.conf @@ -0,0 +1,81 @@ +# ------------------------------------------------------------ +# code.profibot.hu +# ------------------------------------------------------------ + + + +map $scheme $hsts_header { + https "max-age=63072000; preload"; +} + +server { + set $forward_scheme http; + set $server "code-server"; + set $port 8080; + + listen 80; +listen [::]:80; + +listen 443 ssl; +listen [::]:443 ssl; + + + server_name code.profibot.hu; +http2 off; + + + # Let's Encrypt SSL + include conf.d/include/letsencrypt-acme-challenge.conf; + include conf.d/include/ssl-cache.conf; + include conf.d/include/ssl-ciphers.conf; + ssl_certificate /etc/letsencrypt/live/npm-15/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/npm-15/privkey.pem; + + + + + + + + + + + + + +proxy_set_header Upgrade $http_upgrade; +proxy_set_header Connection $http_connection; +proxy_http_version 1.1; + + + access_log /data/logs/proxy-host-8_access.log proxy; + error_log /data/logs/proxy-host-8_error.log warn; + + + + + + + + location / { + + + + + + + + + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $http_connection; + proxy_http_version 1.1; + + + # Proxy! + include conf.d/include/proxy.conf; + } + + + # Custom + include /data/nginx/custom/server_proxy[.]conf; +} diff --git a/proxy-manager/data/nginx/proxy_host/9.conf b/proxy-manager/data/nginx/proxy_host/9.conf new file mode 100755 index 0000000..6c5a527 --- /dev/null +++ b/proxy-manager/data/nginx/proxy_host/9.conf @@ -0,0 +1,74 @@ +# ------------------------------------------------------------ +# app.profibot.hu +# ------------------------------------------------------------ + + + +map $scheme $hsts_header { + https "max-age=63072000; preload"; +} + +server { + set $forward_scheme http; + set $server "service_finder_frontend"; + set $port 80; + + listen 80; +listen [::]:80; + +listen 443 ssl; +listen [::]:443 ssl; + + + server_name app.profibot.hu; +http2 off; + + + # Let's Encrypt SSL + include conf.d/include/letsencrypt-acme-challenge.conf; + include conf.d/include/ssl-cache.conf; + include conf.d/include/ssl-ciphers.conf; + ssl_certificate /etc/letsencrypt/live/npm-16/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/npm-16/privkey.pem; + + + + + + + + + + + + + + + access_log /data/logs/proxy-host-9_access.log proxy; + error_log /data/logs/proxy-host-9_error.log warn; + + + + + + + + location / { + + + + + + + + + + # Proxy! + include conf.d/include/proxy.conf; + } + + + # Custom + include /data/nginx/custom/server_proxy[.]conf; +} + diff --git a/proxy-manager/letsencrypt/renewal/npm-11.conf b/proxy-manager/letsencrypt/renewal/npm-11.conf new file mode 100755 index 0000000..8bf38f1 --- /dev/null +++ b/proxy-manager/letsencrypt/renewal/npm-11.conf @@ -0,0 +1,20 @@ +version = 5.1.0 +archive_dir = /etc/letsencrypt/archive/npm-11 +cert = /etc/letsencrypt/live/npm-11/cert.pem +privkey = /etc/letsencrypt/live/npm-11/privkey.pem +chain = /etc/letsencrypt/live/npm-11/chain.pem +fullchain = /etc/letsencrypt/live/npm-11/fullchain.pem +[renewalparams] +account = e417a583de478a0cfdeed332c1113068 +key_type = ecdsa +elliptic_curve = secp384r1 +preferred_chain = ISRG Root X1 +pref_challs = http-01, +config_dir = /etc/letsencrypt +work_dir = /tmp/letsencrypt-lib +logs_dir = /data/logs +authenticator = webroot +webroot_path = /data/letsencrypt-acme-challenge, +server = https://acme-v02.api.letsencrypt.org/directory +[[webroot_map]] +profibot.synology.me = /data/letsencrypt-acme-challenge diff --git a/proxy-manager/letsencrypt/renewal/npm-13.conf b/proxy-manager/letsencrypt/renewal/npm-13.conf new file mode 100755 index 0000000..df1b866 --- /dev/null +++ b/proxy-manager/letsencrypt/renewal/npm-13.conf @@ -0,0 +1,20 @@ +version = 5.1.0 +archive_dir = /etc/letsencrypt/archive/npm-13 +cert = /etc/letsencrypt/live/npm-13/cert.pem +privkey = /etc/letsencrypt/live/npm-13/privkey.pem +chain = /etc/letsencrypt/live/npm-13/chain.pem +fullchain = /etc/letsencrypt/live/npm-13/fullchain.pem +[renewalparams] +account = e417a583de478a0cfdeed332c1113068 +key_type = ecdsa +elliptic_curve = secp384r1 +preferred_chain = ISRG Root X1 +pref_challs = http-01, +config_dir = /etc/letsencrypt +work_dir = /tmp/letsencrypt-lib +logs_dir = /data/logs +authenticator = webroot +webroot_path = /data/letsencrypt-acme-challenge, +server = https://acme-v02.api.letsencrypt.org/directory +[[webroot_map]] +nas.profibot.hu = /data/letsencrypt-acme-challenge diff --git a/proxy-manager/letsencrypt/renewal/npm-14.conf b/proxy-manager/letsencrypt/renewal/npm-14.conf new file mode 100755 index 0000000..f080b23 --- /dev/null +++ b/proxy-manager/letsencrypt/renewal/npm-14.conf @@ -0,0 +1,20 @@ +version = 5.1.0 +archive_dir = /etc/letsencrypt/archive/npm-14 +cert = /etc/letsencrypt/live/npm-14/cert.pem +privkey = /etc/letsencrypt/live/npm-14/privkey.pem +chain = /etc/letsencrypt/live/npm-14/chain.pem +fullchain = /etc/letsencrypt/live/npm-14/fullchain.pem +[renewalparams] +account = e417a583de478a0cfdeed332c1113068 +key_type = ecdsa +elliptic_curve = secp384r1 +preferred_chain = ISRG Root X1 +pref_challs = http-01, +config_dir = /etc/letsencrypt +work_dir = /tmp/letsencrypt-lib +logs_dir = /data/logs +authenticator = webroot +webroot_path = /data/letsencrypt-acme-challenge, +server = https://acme-v02.api.letsencrypt.org/directory +[[webroot_map]] +db.profibot.hu = /data/letsencrypt-acme-challenge diff --git a/proxy-manager/letsencrypt/renewal/npm-15.conf b/proxy-manager/letsencrypt/renewal/npm-15.conf new file mode 100755 index 0000000..31f6415 --- /dev/null +++ b/proxy-manager/letsencrypt/renewal/npm-15.conf @@ -0,0 +1,20 @@ +version = 5.1.0 +archive_dir = /etc/letsencrypt/archive/npm-15 +cert = /etc/letsencrypt/live/npm-15/cert.pem +privkey = /etc/letsencrypt/live/npm-15/privkey.pem +chain = /etc/letsencrypt/live/npm-15/chain.pem +fullchain = /etc/letsencrypt/live/npm-15/fullchain.pem +[renewalparams] +account = e417a583de478a0cfdeed332c1113068 +key_type = ecdsa +elliptic_curve = secp384r1 +preferred_chain = ISRG Root X1 +pref_challs = http-01, +config_dir = /etc/letsencrypt +work_dir = /tmp/letsencrypt-lib +logs_dir = /data/logs +authenticator = webroot +webroot_path = /data/letsencrypt-acme-challenge, +server = https://acme-v02.api.letsencrypt.org/directory +[[webroot_map]] +code.profibot.hu = /data/letsencrypt-acme-challenge diff --git a/proxy-manager/letsencrypt/renewal/npm-16.conf b/proxy-manager/letsencrypt/renewal/npm-16.conf new file mode 100755 index 0000000..2017235 --- /dev/null +++ b/proxy-manager/letsencrypt/renewal/npm-16.conf @@ -0,0 +1,20 @@ +version = 5.1.0 +archive_dir = /etc/letsencrypt/archive/npm-16 +cert = /etc/letsencrypt/live/npm-16/cert.pem +privkey = /etc/letsencrypt/live/npm-16/privkey.pem +chain = /etc/letsencrypt/live/npm-16/chain.pem +fullchain = /etc/letsencrypt/live/npm-16/fullchain.pem +[renewalparams] +account = e417a583de478a0cfdeed332c1113068 +key_type = ecdsa +elliptic_curve = secp384r1 +preferred_chain = ISRG Root X1 +pref_challs = http-01, +config_dir = /etc/letsencrypt +work_dir = /tmp/letsencrypt-lib +logs_dir = /data/logs +authenticator = webroot +webroot_path = /data/letsencrypt-acme-challenge, +server = https://acme-v02.api.letsencrypt.org/directory +[[webroot_map]] +app.profibot.hu = /data/letsencrypt-acme-challenge diff --git a/proxy-manager/letsencrypt/renewal/npm-18.conf b/proxy-manager/letsencrypt/renewal/npm-18.conf new file mode 100755 index 0000000..564aea0 --- /dev/null +++ b/proxy-manager/letsencrypt/renewal/npm-18.conf @@ -0,0 +1,20 @@ +version = 5.1.0 +archive_dir = /etc/letsencrypt/archive/npm-18 +cert = /etc/letsencrypt/live/npm-18/cert.pem +privkey = /etc/letsencrypt/live/npm-18/privkey.pem +chain = /etc/letsencrypt/live/npm-18/chain.pem +fullchain = /etc/letsencrypt/live/npm-18/fullchain.pem +[renewalparams] +account = e417a583de478a0cfdeed332c1113068 +key_type = ecdsa +elliptic_curve = secp384r1 +preferred_chain = ISRG Root X1 +pref_challs = http-01, +config_dir = /etc/letsencrypt +work_dir = /tmp/letsencrypt-lib +logs_dir = /data/logs +authenticator = webroot +webroot_path = /data/letsencrypt-acme-challenge, +server = https://acme-v02.api.letsencrypt.org/directory +[[webroot_map]] +terminal.profibot.hu = /data/letsencrypt-acme-challenge diff --git a/proxy-manager/letsencrypt/renewal/npm-19.conf b/proxy-manager/letsencrypt/renewal/npm-19.conf new file mode 100755 index 0000000..0d2c602 --- /dev/null +++ b/proxy-manager/letsencrypt/renewal/npm-19.conf @@ -0,0 +1,20 @@ +version = 5.1.0 +archive_dir = /etc/letsencrypt/archive/npm-19 +cert = /etc/letsencrypt/live/npm-19/cert.pem +privkey = /etc/letsencrypt/live/npm-19/privkey.pem +chain = /etc/letsencrypt/live/npm-19/chain.pem +fullchain = /etc/letsencrypt/live/npm-19/fullchain.pem +[renewalparams] +account = e417a583de478a0cfdeed332c1113068 +key_type = ecdsa +elliptic_curve = secp384r1 +preferred_chain = ISRG Root X1 +pref_challs = http-01, +config_dir = /etc/letsencrypt +work_dir = /tmp/letsencrypt-lib +logs_dir = /data/logs +authenticator = webroot +webroot_path = /data/letsencrypt-acme-challenge, +server = https://acme-v02.api.letsencrypt.org/directory +[[webroot_map]] +net.profibot.hu = /data/letsencrypt-acme-challenge diff --git a/proxy-manager/letsencrypt/renewal/npm-4.conf b/proxy-manager/letsencrypt/renewal/npm-4.conf new file mode 100755 index 0000000..ca285d7 --- /dev/null +++ b/proxy-manager/letsencrypt/renewal/npm-4.conf @@ -0,0 +1,20 @@ +version = 5.1.0 +archive_dir = /etc/letsencrypt/archive/npm-4 +cert = /etc/letsencrypt/live/npm-4/cert.pem +privkey = /etc/letsencrypt/live/npm-4/privkey.pem +chain = /etc/letsencrypt/live/npm-4/chain.pem +fullchain = /etc/letsencrypt/live/npm-4/fullchain.pem +[renewalparams] +account = e417a583de478a0cfdeed332c1113068 +key_type = ecdsa +elliptic_curve = secp384r1 +preferred_chain = ISRG Root X1 +pref_challs = http-01, +config_dir = /etc/letsencrypt +work_dir = /tmp/letsencrypt-lib +logs_dir = /data/logs +authenticator = webroot +webroot_path = /data/letsencrypt-acme-challenge, +server = https://acme-v02.api.letsencrypt.org/directory +[[webroot_map]] +dev.profibot.hu = /data/letsencrypt-acme-challenge diff --git a/proxy-manager/letsencrypt/renewal/npm-5.conf b/proxy-manager/letsencrypt/renewal/npm-5.conf new file mode 100755 index 0000000..199040e --- /dev/null +++ b/proxy-manager/letsencrypt/renewal/npm-5.conf @@ -0,0 +1,20 @@ +version = 5.1.0 +archive_dir = /etc/letsencrypt/archive/npm-5 +cert = /etc/letsencrypt/live/npm-5/cert.pem +privkey = /etc/letsencrypt/live/npm-5/privkey.pem +chain = /etc/letsencrypt/live/npm-5/chain.pem +fullchain = /etc/letsencrypt/live/npm-5/fullchain.pem +[renewalparams] +account = e417a583de478a0cfdeed332c1113068 +key_type = ecdsa +elliptic_curve = secp384r1 +preferred_chain = ISRG Root X1 +pref_challs = http-01, +config_dir = /etc/letsencrypt +work_dir = /tmp/letsencrypt-lib +logs_dir = /data/logs +authenticator = webroot +webroot_path = /data/letsencrypt-acme-challenge, +server = https://acme-v02.api.letsencrypt.org/directory +[[webroot_map]] +targetts.ddns.net = /data/letsencrypt-acme-challenge diff --git a/proxy-manager/proxy_backup.tar.gz b/proxy-manager/proxy_backup.tar.gz new file mode 100755 index 0000000..f31e0f1 Binary files /dev/null and b/proxy-manager/proxy_backup.tar.gz differ diff --git a/redis/data/appendonlydir/appendonly.aof.1.base.rdb b/redis/data/appendonlydir/appendonly.aof.1.base.rdb new file mode 100755 index 0000000..d22135a Binary files /dev/null and b/redis/data/appendonlydir/appendonly.aof.1.base.rdb differ diff --git a/redis/data/appendonlydir/appendonly.aof.1.incr.aof b/redis/data/appendonlydir/appendonly.aof.1.incr.aof new file mode 100755 index 0000000..e69de29 diff --git a/redis/data/appendonlydir/appendonly.aof.manifest b/redis/data/appendonlydir/appendonly.aof.manifest new file mode 100755 index 0000000..7f8bb72 --- /dev/null +++ b/redis/data/appendonlydir/appendonly.aof.manifest @@ -0,0 +1,2 @@ +file appendonly.aof.1.base.rdb seq 1 type b +file appendonly.aof.1.incr.aof seq 1 type i diff --git a/redis/data/dump.rdb b/redis/data/dump.rdb new file mode 100755 index 0000000..ef896db Binary files /dev/null and b/redis/data/dump.rdb differ diff --git a/schema_dump.sql b/schema_dump.sql new file mode 100755 index 0000000..b7d1c22 --- /dev/null +++ b/schema_dump.sql @@ -0,0 +1,1196 @@ +-- +-- PostgreSQL database dump +-- + +\restrict YdyOBw7ea7r5Hbt0TOrTLOEM6ytHKswa16nmEwgUe7J82iI10joho1abUqa1Xas + +-- Dumped from database version 15.15 +-- Dumped by pg_dump version 15.15 + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +-- +-- Name: data; Type: SCHEMA; Schema: -; Owner: service_finder_app +-- + +CREATE SCHEMA data; + + +ALTER SCHEMA data OWNER TO service_finder_app; + +-- +-- Name: public; Type: SCHEMA; Schema: -; Owner: service_finder_app +-- + +-- *not* creating schema, since initdb creates it + + +ALTER SCHEMA public OWNER TO service_finder_app; + +-- +-- Name: companyrole; Type: TYPE; Schema: data; Owner: kincses +-- + +CREATE TYPE data.companyrole AS ENUM ( + 'owner', + 'manager', + 'driver' +); + + +ALTER TYPE data.companyrole OWNER TO kincses; + +-- +-- Name: equipment_source; Type: TYPE; Schema: data; Owner: kincses +-- + +CREATE TYPE data.equipment_source AS ENUM ( + 'factory', + 'aftermarket' +); + + +ALTER TYPE data.equipment_source OWNER TO kincses; + +-- +-- Name: expense_category_enum; Type: TYPE; Schema: data; Owner: kincses +-- + +CREATE TYPE data.expense_category_enum AS ENUM ( + 'PURCHASE_PRICE', + 'TRANSFER_TAX', + 'ADMIN_FEE', + 'VEHICLE_TAX', + 'INSURANCE', + 'REFUELING', + 'SERVICE', + 'PARKING', + 'TOLL', + 'FINE', + 'TUNING_ACCESSORIES', + 'OTHER' +); + + +ALTER TYPE data.expense_category_enum OWNER TO kincses; + +-- +-- Name: moderation_status_enum; Type: TYPE; Schema: data; Owner: kincses +-- + +CREATE TYPE data.moderation_status_enum AS ENUM ( + 'pending', + 'approved', + 'rejected' +); + + +ALTER TYPE data.moderation_status_enum OWNER TO kincses; + +-- +-- Name: source_type_enum; Type: TYPE; Schema: data; Owner: kincses +-- + +CREATE TYPE data.source_type_enum AS ENUM ( + 'manual', + 'ocr', + 'api_import' +); + + +ALTER TYPE data.source_type_enum OWNER TO kincses; + +-- +-- Name: tokentype; Type: TYPE; Schema: data; Owner: kincses +-- + +CREATE TYPE data.tokentype AS ENUM ( + 'email_verify', + 'password_reset', + 'api_key' +); + + +ALTER TYPE data.tokentype OWNER TO kincses; + +-- +-- Name: emailtype; Type: TYPE; Schema: public; Owner: kincses +-- + +CREATE TYPE public.emailtype AS ENUM ( + 'REGISTRATION', + 'PASSWORD_RESET', + 'GDPR_NOTICE' +); + + +ALTER TYPE public.emailtype OWNER TO kincses; + +-- +-- Name: orgtype; Type: TYPE; Schema: public; Owner: kincses +-- + +CREATE TYPE public.orgtype AS ENUM ( + 'PRIVATE', + 'COMPANY', + 'SERVICE' +); + + +ALTER TYPE public.orgtype OWNER TO kincses; + +-- +-- Name: orguserrole; Type: TYPE; Schema: public; Owner: kincses +-- + +CREATE TYPE public.orguserrole AS ENUM ( + 'OWNER', + 'ADMIN', + 'FLEET_MANAGER', + 'DRIVER', + 'owner', + 'manager', + 'driver', + 'service' +); + + +ALTER TYPE public.orguserrole OWNER TO kincses; + +-- +-- Name: uitheme; Type: TYPE; Schema: public; Owner: kincses +-- + +CREATE TYPE public.uitheme AS ENUM ( + 'LIGHT', + 'DARK', + 'SYSTEM' +); + + +ALTER TYPE public.uitheme OWNER TO kincses; + +-- +-- Name: userrole; Type: TYPE; Schema: public; Owner: kincses +-- + +CREATE TYPE public.userrole AS ENUM ( + 'OWNER', + 'ADMIN', + 'FLEET_MANAGER', + 'DRIVER' +); + + +ALTER TYPE public.userrole OWNER TO kincses; + +-- +-- Name: validationstatus; Type: TYPE; Schema: public; Owner: kincses +-- + +CREATE TYPE public.validationstatus AS ENUM ( + 'NOT_VALIDATED', + 'PENDING', + 'VALIDATED', + 'REJECTED' +); + + +ALTER TYPE public.validationstatus OWNER TO kincses; + +SET default_tablespace = ''; + +SET default_table_access_method = heap; + +-- +-- Name: audit_logs; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.audit_logs ( + id integer NOT NULL, + user_id integer, + action character varying(100) NOT NULL, + endpoint character varying(255), + method character varying(10), + ip_address character varying(45), + created_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP +); + + +ALTER TABLE data.audit_logs OWNER TO kincses; + +-- +-- Name: audit_logs_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.audit_logs_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.audit_logs_id_seq OWNER TO kincses; + +-- +-- Name: audit_logs_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.audit_logs_id_seq OWNED BY data.audit_logs.id; + + +-- +-- Name: companies; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.companies ( + id integer NOT NULL, + name character varying(255) NOT NULL, + tax_number character varying(50), + subscription_tier character varying(50) DEFAULT 'free'::character varying, + owner_id integer NOT NULL, + owner_person_id bigint +); + + +ALTER TABLE data.companies OWNER TO service_finder_app; + +-- +-- Name: companies_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.companies_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.companies_id_seq OWNER TO service_finder_app; + +-- +-- Name: companies_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.companies_id_seq OWNED BY data.companies.id; + + +-- +-- Name: company_members; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.company_members ( + id integer NOT NULL, + company_id integer NOT NULL, + user_id integer NOT NULL, + role character varying(50) DEFAULT 'driver'::data.companyrole, + can_edit_service boolean DEFAULT false, + can_see_costs boolean DEFAULT false, + is_active boolean DEFAULT true +); + + +ALTER TABLE data.company_members OWNER TO service_finder_app; + +-- +-- Name: company_members_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.company_members_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.company_members_id_seq OWNER TO service_finder_app; + +-- +-- Name: company_members_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.company_members_id_seq OWNED BY data.company_members.id; + + +-- +-- Name: engine_specs; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.engine_specs ( + id integer NOT NULL, + engine_code character varying(50), + fuel_type character varying(20), + power_kw integer, + battery_capacity_kwh numeric(10,2), + onboard_charger_kw numeric(5,2), + phases integer DEFAULT 3, + default_service_interval_km integer DEFAULT 15000, + default_service_interval_hours integer DEFAULT 500, + emissions_class character varying(20) +); + + +ALTER TABLE data.engine_specs OWNER TO service_finder_app; + +-- +-- Name: engine_specs_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.engine_specs_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.engine_specs_id_seq OWNER TO service_finder_app; + +-- +-- Name: engine_specs_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.engine_specs_id_seq OWNED BY data.engine_specs.id; + + +-- +-- Name: organization_members; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.organization_members ( + id integer NOT NULL, + organization_id integer, + user_id integer, + role character varying DEFAULT 'driver'::character varying +); + + +ALTER TABLE data.organization_members OWNER TO kincses; + +-- +-- Name: organization_members_id_seq; Type: SEQUENCE; Schema: data; Owner: kincses +-- + +CREATE SEQUENCE data.organization_members_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.organization_members_id_seq OWNER TO kincses; + +-- +-- Name: organization_members_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: kincses +-- + +ALTER SEQUENCE data.organization_members_id_seq OWNED BY data.organization_members.id; + + +-- +-- Name: organizations; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.organizations ( + id integer NOT NULL, + name character varying NOT NULL, + org_type public.orgtype, + founded_at date, + validation_status public.validationstatus, + owner_id integer, + ui_theme character varying, + created_at timestamp with time zone DEFAULT now(), + theme character varying DEFAULT 'system'::character varying, + is_active boolean DEFAULT true, + slug character varying(100), + country_code character(2) DEFAULT 'HU'::bpchar, + is_transferable boolean DEFAULT true +); + + +ALTER TABLE data.organizations OWNER TO service_finder_app; + +-- +-- Name: organizations_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.organizations_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.organizations_id_seq OWNER TO service_finder_app; + +-- +-- Name: organizations_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.organizations_id_seq OWNED BY data.organizations.id; + + +-- +-- Name: persons; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.persons ( + id bigint NOT NULL, + created_at timestamp with time zone DEFAULT now() NOT NULL, + updated_at timestamp with time zone, + is_active boolean DEFAULT true NOT NULL, + reputation_score numeric(10,2) DEFAULT 0 NOT NULL, + risk_level integer DEFAULT 0 NOT NULL, + id_uuid uuid DEFAULT gen_random_uuid(), + last_name character varying, + first_name character varying, + mothers_name character varying, + birth_place character varying, + birth_date timestamp without time zone, + identity_docs jsonb DEFAULT '{}'::jsonb, + medical_emergency jsonb DEFAULT '{}'::jsonb, + ice_contact jsonb DEFAULT '{}'::jsonb +); + + +ALTER TABLE data.persons OWNER TO service_finder_app; + +-- +-- Name: persons_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.persons_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.persons_id_seq OWNER TO service_finder_app; + +-- +-- Name: persons_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.persons_id_seq OWNED BY data.persons.id; + + +-- +-- Name: service_providers; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.service_providers ( + id integer NOT NULL, + name character varying(255) NOT NULL, + official_brand_partner boolean DEFAULT false, + technical_rating_pct integer DEFAULT 80, + social_rating_pct integer DEFAULT 80, + location_city character varying(100), + is_active boolean DEFAULT true, + service_type character varying(50), + search_tags text, + latitude numeric(10,8), + longitude numeric(11,8), + handled_vehicle_types jsonb DEFAULT '["passenger_car"]'::jsonb, + specialized_brands jsonb DEFAULT '[]'::jsonb, + verification_status character varying(20) DEFAULT 'pending'::character varying +); + + +ALTER TABLE data.service_providers OWNER TO service_finder_app; + +-- +-- Name: service_providers_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.service_providers_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.service_providers_id_seq OWNER TO service_finder_app; + +-- +-- Name: service_providers_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.service_providers_id_seq OWNED BY data.service_providers.id; + + +-- +-- Name: service_records; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.service_records ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + vehicle_id uuid, + provider_id integer, + service_date date NOT NULL, + usage_value numeric(15,2), + is_accident_repair boolean DEFAULT false, + repair_quality_pct integer DEFAULT 100, + parts_quality_index numeric(3,2) DEFAULT 1.0, + description text, + invoice_path text, + rating_impact_score integer DEFAULT 0 +); + + +ALTER TABLE data.service_records OWNER TO service_finder_app; + +-- +-- Name: system_settings; Type: TABLE; Schema: data; Owner: kincses +-- + +CREATE TABLE data.system_settings ( + key character varying(50) NOT NULL, + value jsonb, + description text +); + + +ALTER TABLE data.system_settings OWNER TO kincses; + +-- +-- Name: users; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.users ( + id integer NOT NULL, + email character varying NOT NULL, + birthday date, + is_active boolean, + is_banned boolean, + is_gdpr_deleted boolean, + previous_login_count integer, + created_at timestamp with time zone DEFAULT now(), + verified_at timestamp with time zone, + hashed_password character varying, + role character varying DEFAULT 'user'::character varying, + is_superuser boolean DEFAULT false, + is_company boolean DEFAULT false, + updated_at timestamp with time zone, + company_name character varying, + tax_number character varying, + region_code character varying DEFAULT 'HU'::character varying, + person_id bigint, + deleted_at timestamp with time zone, + is_deleted boolean DEFAULT false NOT NULL, + social_provider character varying(50), + social_id character varying(255) +); + + +ALTER TABLE data.users OWNER TO service_finder_app; + +-- +-- Name: users_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.users_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.users_id_seq OWNER TO service_finder_app; + +-- +-- Name: users_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.users_id_seq OWNED BY data.users.id; + + +-- +-- Name: vehicle_assignments; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.vehicle_assignments ( + id integer NOT NULL, + company_id integer NOT NULL, + vehicle_id integer NOT NULL, + driver_id integer NOT NULL, + start_date timestamp with time zone DEFAULT now(), + end_date timestamp with time zone, + notes character varying +); + + +ALTER TABLE data.vehicle_assignments OWNER TO service_finder_app; + +-- +-- Name: vehicle_assignments_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.vehicle_assignments_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.vehicle_assignments_id_seq OWNER TO service_finder_app; + +-- +-- Name: vehicle_assignments_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.vehicle_assignments_id_seq OWNED BY data.vehicle_assignments.id; + + +-- +-- Name: vehicle_brands; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.vehicle_brands ( + id integer NOT NULL, + name character varying NOT NULL, + origin_country character varying, + slug character varying, + country_code character varying, + category_id integer, + country_of_origin character varying(50), + is_active boolean DEFAULT true +); + + +ALTER TABLE data.vehicle_brands OWNER TO service_finder_app; + +-- +-- Name: vehicle_brands_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.vehicle_brands_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.vehicle_brands_id_seq OWNER TO service_finder_app; + +-- +-- Name: vehicle_brands_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.vehicle_brands_id_seq OWNED BY data.vehicle_brands.id; + + +-- +-- Name: vehicles; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.vehicles ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + current_company_id integer, + brand_id integer, + model_name character varying(100), + engine_spec_id integer, + identification_number character varying(50), + license_plate character varying(20), + tracking_mode character varying(10) DEFAULT 'km'::character varying, + current_rating_pct integer DEFAULT 100, + total_real_usage numeric(15,2) DEFAULT 0, + odometer_at_last_check numeric(15,2) DEFAULT 0, + custom_specs jsonb DEFAULT '{}'::jsonb, + factory_snapshot jsonb, + created_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP +); + + +ALTER TABLE data.vehicles OWNER TO service_finder_app; + +-- +-- Name: wallets; Type: TABLE; Schema: data; Owner: service_finder_app +-- + +CREATE TABLE data.wallets ( + id bigint NOT NULL, + user_id integer NOT NULL, + coin_balance numeric(18,2) DEFAULT 0.00, + xp_balance bigint DEFAULT 0, + created_at timestamp with time zone DEFAULT now(), + updated_at timestamp with time zone DEFAULT now() +); + + +ALTER TABLE data.wallets OWNER TO service_finder_app; + +-- +-- Name: wallets_id_seq; Type: SEQUENCE; Schema: data; Owner: service_finder_app +-- + +CREATE SEQUENCE data.wallets_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +ALTER TABLE data.wallets_id_seq OWNER TO service_finder_app; + +-- +-- Name: wallets_id_seq; Type: SEQUENCE OWNED BY; Schema: data; Owner: service_finder_app +-- + +ALTER SEQUENCE data.wallets_id_seq OWNED BY data.wallets.id; + + +-- +-- Name: alembic_version; Type: TABLE; Schema: public; Owner: service_finder_app +-- + +CREATE TABLE public.alembic_version ( + version_num character varying(32) NOT NULL +); + + +ALTER TABLE public.alembic_version OWNER TO service_finder_app; + +-- +-- Name: audit_logs id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.audit_logs ALTER COLUMN id SET DEFAULT nextval('data.audit_logs_id_seq'::regclass); + + +-- +-- Name: companies id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.companies ALTER COLUMN id SET DEFAULT nextval('data.companies_id_seq'::regclass); + + +-- +-- Name: company_members id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.company_members ALTER COLUMN id SET DEFAULT nextval('data.company_members_id_seq'::regclass); + + +-- +-- Name: engine_specs id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.engine_specs ALTER COLUMN id SET DEFAULT nextval('data.engine_specs_id_seq'::regclass); + + +-- +-- Name: organization_members id; Type: DEFAULT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.organization_members ALTER COLUMN id SET DEFAULT nextval('data.organization_members_id_seq'::regclass); + + +-- +-- Name: organizations id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.organizations ALTER COLUMN id SET DEFAULT nextval('data.organizations_id_seq'::regclass); + + +-- +-- Name: persons id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.persons ALTER COLUMN id SET DEFAULT nextval('data.persons_id_seq'::regclass); + + +-- +-- Name: service_providers id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_providers ALTER COLUMN id SET DEFAULT nextval('data.service_providers_id_seq'::regclass); + + +-- +-- Name: users id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.users ALTER COLUMN id SET DEFAULT nextval('data.users_id_seq'::regclass); + + +-- +-- Name: vehicle_assignments id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.vehicle_assignments ALTER COLUMN id SET DEFAULT nextval('data.vehicle_assignments_id_seq'::regclass); + + +-- +-- Name: vehicle_brands id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.vehicle_brands ALTER COLUMN id SET DEFAULT nextval('data.vehicle_brands_id_seq'::regclass); + + +-- +-- Name: wallets id; Type: DEFAULT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.wallets ALTER COLUMN id SET DEFAULT nextval('data.wallets_id_seq'::regclass); + + +-- +-- Name: audit_logs audit_logs_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.audit_logs + ADD CONSTRAINT audit_logs_pkey PRIMARY KEY (id); + + +-- +-- Name: companies companies_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.companies + ADD CONSTRAINT companies_pkey PRIMARY KEY (id); + + +-- +-- Name: company_members company_members_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.company_members + ADD CONSTRAINT company_members_pkey PRIMARY KEY (id); + + +-- +-- Name: engine_specs engine_specs_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.engine_specs + ADD CONSTRAINT engine_specs_pkey PRIMARY KEY (id); + + +-- +-- Name: organization_members organization_members_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.organization_members + ADD CONSTRAINT organization_members_pkey PRIMARY KEY (id); + + +-- +-- Name: organizations organizations_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.organizations + ADD CONSTRAINT organizations_pkey PRIMARY KEY (id); + + +-- +-- Name: persons persons_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.persons + ADD CONSTRAINT persons_pkey PRIMARY KEY (id); + + +-- +-- Name: service_providers service_providers_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_providers + ADD CONSTRAINT service_providers_pkey PRIMARY KEY (id); + + +-- +-- Name: service_records service_records_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.service_records + ADD CONSTRAINT service_records_pkey PRIMARY KEY (id); + + +-- +-- Name: system_settings system_settings_pkey; Type: CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.system_settings + ADD CONSTRAINT system_settings_pkey PRIMARY KEY (key); + + +-- +-- Name: users users_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.users + ADD CONSTRAINT users_pkey PRIMARY KEY (id); + + +-- +-- Name: vehicle_assignments vehicle_assignments_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.vehicle_assignments + ADD CONSTRAINT vehicle_assignments_pkey PRIMARY KEY (id); + + +-- +-- Name: vehicle_brands vehicle_brands_cat_name_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.vehicle_brands + ADD CONSTRAINT vehicle_brands_cat_name_key UNIQUE (category_id, name); + + +-- +-- Name: vehicle_brands vehicle_brands_name_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.vehicle_brands + ADD CONSTRAINT vehicle_brands_name_key UNIQUE (name); + + +-- +-- Name: vehicle_brands vehicle_brands_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.vehicle_brands + ADD CONSTRAINT vehicle_brands_pkey PRIMARY KEY (id); + + +-- +-- Name: vehicles vehicles_identification_number_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.vehicles + ADD CONSTRAINT vehicles_identification_number_key UNIQUE (identification_number); + + +-- +-- Name: vehicles vehicles_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.vehicles + ADD CONSTRAINT vehicles_pkey PRIMARY KEY (id); + + +-- +-- Name: wallets wallets_pkey; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.wallets + ADD CONSTRAINT wallets_pkey PRIMARY KEY (id); + + +-- +-- Name: wallets wallets_user_id_key; Type: CONSTRAINT; Schema: data; Owner: service_finder_app +-- + +ALTER TABLE ONLY data.wallets + ADD CONSTRAINT wallets_user_id_key UNIQUE (user_id); + + +-- +-- Name: alembic_version alembic_version_pkc; Type: CONSTRAINT; Schema: public; Owner: service_finder_app +-- + +ALTER TABLE ONLY public.alembic_version + ADD CONSTRAINT alembic_version_pkc PRIMARY KEY (version_num); + + +-- +-- Name: idx_engine_code; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX idx_engine_code ON data.engine_specs USING btree (engine_code); + + +-- +-- Name: idx_org_slug; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE UNIQUE INDEX idx_org_slug ON data.organizations USING btree (slug); + + +-- +-- Name: idx_user_email_active_only; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE UNIQUE INDEX idx_user_email_active_only ON data.users USING btree (email) WHERE ((is_deleted IS FALSE) AND (deleted_at IS NULL)); + + +-- +-- Name: idx_vb_slug; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE UNIQUE INDEX idx_vb_slug ON data.vehicle_brands USING btree (slug); + + +-- +-- Name: idx_vehicle_company; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX idx_vehicle_company ON data.vehicles USING btree (current_company_id); + + +-- +-- Name: idx_vehicle_plate; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX idx_vehicle_plate ON data.vehicles USING btree (license_plate); + + +-- +-- Name: idx_vehicle_vin; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX idx_vehicle_vin ON data.vehicles USING btree (identification_number); + + +-- +-- Name: ix_companies_owner_person_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_companies_owner_person_id ON data.companies USING btree (owner_person_id); + + +-- +-- Name: ix_data_organizations_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_organizations_id ON data.organizations USING btree (id); + + +-- +-- Name: ix_data_users_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_users_id ON data.users USING btree (id); + + +-- +-- Name: ix_data_vehicle_assignments_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_vehicle_assignments_id ON data.vehicle_assignments USING btree (id); + + +-- +-- Name: ix_data_vehicle_brands_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_data_vehicle_brands_id ON data.vehicle_brands USING btree (id); + + +-- +-- Name: ix_users_is_deleted; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_users_is_deleted ON data.users USING btree (is_deleted, deleted_at); + + +-- +-- Name: ix_users_person_id; Type: INDEX; Schema: data; Owner: service_finder_app +-- + +CREATE INDEX ix_users_person_id ON data.users USING btree (person_id); + + +-- +-- Name: organization_members organization_members_organization_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.organization_members + ADD CONSTRAINT organization_members_organization_id_fkey FOREIGN KEY (organization_id) REFERENCES data.organizations(id); + + +-- +-- Name: organization_members organization_members_user_id_fkey; Type: FK CONSTRAINT; Schema: data; Owner: kincses +-- + +ALTER TABLE ONLY data.organization_members + ADD CONSTRAINT organization_members_user_id_fkey FOREIGN KEY (user_id) REFERENCES data.users(id); + + +-- +-- Name: TABLE audit_logs; Type: ACL; Schema: data; Owner: kincses +-- + +GRANT SELECT,INSERT,DELETE,UPDATE ON TABLE data.audit_logs TO service_finder_app; + + +-- +-- Name: SEQUENCE audit_logs_id_seq; Type: ACL; Schema: data; Owner: kincses +-- + +GRANT ALL ON SEQUENCE data.audit_logs_id_seq TO service_finder_app; + + +-- +-- Name: TABLE organization_members; Type: ACL; Schema: data; Owner: kincses +-- + +GRANT SELECT,INSERT,DELETE,UPDATE ON TABLE data.organization_members TO service_finder_app; + + +-- +-- Name: SEQUENCE organization_members_id_seq; Type: ACL; Schema: data; Owner: kincses +-- + +GRANT ALL ON SEQUENCE data.organization_members_id_seq TO service_finder_app; + + +-- +-- Name: TABLE system_settings; Type: ACL; Schema: data; Owner: kincses +-- + +GRANT SELECT,INSERT,DELETE,UPDATE ON TABLE data.system_settings TO service_finder_app; + + +-- +-- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: data; Owner: kincses +-- + +ALTER DEFAULT PRIVILEGES FOR ROLE kincses IN SCHEMA data GRANT ALL ON SEQUENCES TO service_finder_app; + + +-- +-- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: data; Owner: kincses +-- + +ALTER DEFAULT PRIVILEGES FOR ROLE kincses IN SCHEMA data GRANT SELECT,INSERT,DELETE,UPDATE ON TABLES TO service_finder_app; + + +-- +-- PostgreSQL database dump complete +-- + +\unrestrict YdyOBw7ea7r5Hbt0TOrTLOEM6ytHKswa16nmEwgUe7J82iI10joho1abUqa1Xas + diff --git a/seed_discovery.py b/seed_discovery.py new file mode 100755 index 0000000..2f3c558 --- /dev/null +++ b/seed_discovery.py @@ -0,0 +1,12 @@ +# seed_discovery.py +async def seed(): + # Az RDW-től lekérjük az ÖSSZES egyedi márkát + url = "https://opendata.rdw.nl/resource/m9d7-ebf2.json?$select=distinct%20merk&$limit=50000" + async with httpx.AsyncClient() as client: + resp = await client.get(url) + makes = resp.json() + async with SessionLocal() as db: + for item in makes: + m = item['merk'].upper() + await db.execute(text("INSERT INTO data.catalog_discovery (make, model, source, status) VALUES (:m, 'ALL', 'global_seed', 'pending') ON CONFLICT DO NOTHING"), {"m": m}) + await db.commit() \ No newline at end of file diff --git a/static_previews/organizations/6/067b6c7b-0f4d-4a04-875e-9e85a5621c46_thumb.webp b/static_previews/organizations/6/067b6c7b-0f4d-4a04-875e-9e85a5621c46_thumb.webp new file mode 100755 index 0000000..eb8f0fa Binary files /dev/null and b/static_previews/organizations/6/067b6c7b-0f4d-4a04-875e-9e85a5621c46_thumb.webp differ diff --git a/tree.txt b/tree.txt new file mode 100755 index 0000000..997150e --- /dev/null +++ b/tree.txt @@ -0,0 +1,336 @@ +. +├── backups +│   ├── db_backup.tar.gz +│   ├── full_db_backup.sql +│   ├── service_finder_full.sql +│   └── sf_db_backup.tar.gz +├── dev +│   ├── profibot-master +│   │   └── main_log.md +│   ├── service_finder +│   │   ├── backend +│   │   │   ├── alembic.ini +│   │   │   ├── app +│   │   │   │   ├── api +│   │   │   │   │   ├── auth.py.old +│   │   │   │   │   ├── deps.py +│   │   │   │   │   ├── __pycache__ +│   │   │   │   │   │   └── deps.cpython-312.pyc +│   │   │   │   │   ├── recommend.py +│   │   │   │   │   └── v1 +│   │   │   │   │   ├── api.py +│   │   │   │   │   ├── endpoints +│   │   │   │   │   │   ├── admin.py +│   │   │   │   │   │   ├── assets.py +│   │   │   │   │   │   ├── auth.py +│   │   │   │   │   │   ├── billing.py +│   │   │   │   │   │   ├── catalog.py +│   │   │   │   │   │   ├── documents.py +│   │   │   │   │   │   ├── evidence.py +│   │   │   │   │   │   ├── expenses.py +│   │   │   │   │   │   ├── gamification.py +│   │   │   │   │   │   ├── notifications.py +│   │   │   │   │   │   ├── organizations.py +│   │   │   │   │   │   ├── providers.py +│   │   │   │   │   │   ├── __pycache__ +│   │   │   │   │   │   │   ├── admin.cpython-312.pyc +│   │   │   │   │   │   │   ├── assets.cpython-312.pyc +│   │   │   │   │   │   │   ├── auth.cpython-312.pyc +│   │   │   │   │   │   │   ├── catalog.cpython-312.pyc +│   │   │   │   │   │   │   ├── documents.cpython-312.pyc +│   │   │   │   │   │   │   ├── evidence.cpython-312.pyc +│   │   │   │   │   │   │   ├── expenses.cpython-312.pyc +│   │   │   │   │   │   │   ├── organizations.cpython-312.pyc +│   │   │   │   │   │   │   ├── services.cpython-312.pyc +│   │   │   │   │   │   │   └── social.cpython-312.pyc +│   │   │   │   │   │   ├── reports.py +│   │   │   │   │   │   ├── search.py +│   │   │   │   │   │   ├── services.py +│   │   │   │   │   │   ├── social.py +│   │   │   │   │   │   └── users.py +│   │   │   │   │   └── __pycache__ +│   │   │   │   │   └── api.cpython-312.pyc +│   │   │   │   ├── core +│   │   │   │   │   ├── config.py +│   │   │   │   │   ├── email.py +│   │   │   │   │   ├── i18n.py +│   │   │   │   │   ├── __init__.py +│   │   │   │   │   ├── __pycache__ +│   │   │   │   │   │   ├── config.cpython-312.pyc +│   │   │   │   │   │   ├── i18n.cpython-312.pyc +│   │   │   │   │   │   ├── __init__.cpython-312.pyc +│   │   │   │   │   │   └── security.cpython-312.pyc +│   │   │   │   │   ├── rbac.py +│   │   │   │   │   ├── security.py +│   │   │   │   │   └── validators.py +│   │   │   │   ├── crud +│   │   │   │   │   └── __init__.py +│   │   │   │   ├── database.py +│   │   │   │   ├── db +│   │   │   │   │   ├── base_class.py +│   │   │   │   │   ├── base.py +│   │   │   │   │   ├── context.py.old +│   │   │   │   │   ├── __init__.py +│   │   │   │   │   ├── middleware.py +│   │   │   │   │   ├── __pycache__ +│   │   │   │   │   │   ├── base_class.cpython-312.pyc +│   │   │   │   │   │   ├── __init__.cpython-312.pyc +│   │   │   │   │   │   └── session.cpython-312.pyc +│   │   │   │   │   └── session.py +│   │   │   │   ├── locales +│   │   │   │   │   └── hu.json +│   │   │   │   ├── main.py +│   │   │   │   ├── models +│   │   │   │   │   ├── address.py +│   │   │   │   │   ├── asset.py +│   │   │   │   │   ├── audit.py +│   │   │   │   │   ├── core_logic.py +│   │   │   │   │   ├── document.py +│   │   │   │   │   ├── gamification.py +│   │   │   │   │   ├── history.py +│   │   │   │   │   ├── identity.py +│   │   │   │   │   ├── __init__.py +│   │   │   │   │   ├── legal.py +│   │   │   │   │   ├── logistics.py +│   │   │   │   │   ├── organization.py +│   │   │   │   │   ├── __pycache__ +│   │   │   │   │   │   ├── address.cpython-312.pyc +│   │   │   │   │   │   ├── asset.cpython-312.pyc +│   │   │   │   │   │   ├── audit.cpython-312.pyc +│   │   │   │   │   │   ├── core_logic.cpython-312.pyc +│   │   │   │   │   │   ├── document.cpython-312.pyc +│   │   │   │   │   │   ├── gamification.cpython-312.pyc +│   │   │   │   │   │   ├── history.cpython-312.pyc +│   │   │   │   │   │   ├── identity.cpython-312.pyc +│   │   │   │   │   │   ├── __init__.cpython-312.pyc +│   │   │   │   │   │   ├── legal.cpython-312.pyc +│   │   │   │   │   │   ├── logistics.cpython-312.pyc +│   │   │   │   │   │   ├── organization.cpython-312.pyc +│   │   │   │   │   │   ├── security.cpython-312.pyc +│   │   │   │   │   │   ├── service.cpython-312.pyc +│   │   │   │   │   │   ├── social.cpython-312.pyc +│   │   │   │   │   │   ├── staged_data.cpython-312.pyc +│   │   │   │   │   │   ├── system.cpython-312.pyc +│   │   │   │   │   │   ├── translation.cpython-312.pyc +│   │   │   │   │   │   └── vehicle_definitions.cpython-312.pyc +│   │   │   │   │   ├── security.py +│   │   │   │   │   ├── service.py +│   │   │   │   │   ├── social.py +│   │   │   │   │   ├── staged_data.py +│   │   │   │   │   ├── system.py +│   │   │   │   │   ├── translation.py +│   │   │   │   │   └── vehicle_definitions.py +│   │   │   │   ├── __pycache__ +│   │   │   │   │   ├── check_api.cpython-312.pyc +│   │   │   │   │   ├── compare_schema.cpython-312.pyc +│   │   │   │   │   ├── database.cpython-312.pyc +│   │   │   │   │   ├── final_admin_fix.cpython-312.pyc +│   │   │   │   │   └── main.cpython-312.pyc +│   │   │   │   ├── schemas +│   │   │   │   │   ├── admin.py +│   │   │   │   │   ├── admin_security.py +│   │   │   │   │   ├── asset_cost.py +│   │   │   │   │   ├── asset.py +│   │   │   │   │   ├── auth.py +│   │   │   │   │   ├── evidence.py +│   │   │   │   │   ├── fleet.py +│   │   │   │   │   ├── organization.py +│   │   │   │   │   ├── __pycache__ +│   │   │   │   │   │   ├── asset_cost.cpython-312.pyc +│   │   │   │   │   │   ├── asset.cpython-312.pyc +│   │   │   │   │   │   ├── auth.cpython-312.pyc +│   │   │   │   │   │   ├── organization.cpython-312.pyc +│   │   │   │   │   │   └── social.cpython-312.pyc +│   │   │   │   │   ├── service_hunt.py +│   │   │   │   │   ├── service.py +│   │   │   │   │   ├── social.py +│   │   │   │   │   ├── token.py +│   │   │   │   │   ├── user.py +│   │   │   │   │   ├── vehicle_categories.py +│   │   │   │   │   └── vehicle.py.old +│   │   │   │   ├── scripts +│   │   │   │   │   ├── discovery_bot.py.veryold +│   │   │   │   │   ├── link_catalog_to_mdm.py +│   │   │   │   │   ├── morning_report.py +│   │   │   │   │   ├── __pycache__ +│   │   │   │   │   │   └── seed_system_params.cpython-312.pyc +│   │   │   │   │   ├── seed_system_params.py +│   │   │   │   │   └── seed_v1_9_system.py +│   │   │   │   ├── services +│   │   │   │   │   ├── ai_ocr_service.py +│   │   │   │   │   ├── ai_service1.1.0.py +│   │   │   │   │   ├── ai_service_googleApi_old.py +│   │   │   │   │   ├── ai_service.py +│   │   │   │   │   ├── asset_service.py +│   │   │   │   │   ├── auth_service.py +│   │   │   │   │   ├── auth_service.py.old_1 +│   │   │   │   │   ├── config_service.py +│   │   │   │   │   ├── cost_service.py +│   │   │   │   │   ├── document_service.py +│   │   │   │   │   ├── dvla_service.py +│   │   │   │   │   ├── email_manager.py +│   │   │   │   │   ├── fleet_service.py +│   │   │   │   │   ├── gamification_service.py +│   │   │   │   │   ├── geo_service.py +│   │   │   │   │   ├── image_processor.py +│   │   │   │   │   ├── maintenance_service.py +│   │   │   │   │   ├── matching_service.py +│   │   │   │   │   ├── media_service.py +│   │   │   │   │   ├── notification_service.py +│   │   │   │   │   ├── __pycache__ +│   │   │   │   │   │   ├── ai_service.cpython-312.pyc +│   │   │   │   │   │   ├── asset_service.cpython-312.pyc +│   │   │   │   │   │   ├── auth_service.cpython-312.pyc +│   │   │   │   │   │   ├── config_service.cpython-312.pyc +│   │   │   │   │   │   ├── cost_service.cpython-312.pyc +│   │   │   │   │   │   ├── document_service.cpython-312.pyc +│   │   │   │   │   │   ├── email_manager.cpython-312.pyc +│   │   │   │   │   │   ├── gamification_service.cpython-312.pyc +│   │   │   │   │   │   ├── geo_service.cpython-312.pyc +│   │   │   │   │   │   ├── security_service.cpython-312.pyc +│   │   │   │   │   │   ├── social_service.cpython-312.pyc +│   │   │   │   │   │   └── translation_service.cpython-312.pyc +│   │   │   │   │   ├── recon_bot.py +│   │   │   │   │   ├── robot_manager.py +│   │   │   │   │   ├── search_service.py +│   │   │   │   │   ├── security_service.py +│   │   │   │   │   ├── social_auth_service.py +│   │   │   │   │   ├── social_service.py +│   │   │   │   │   ├── storage_service.py +│   │   │   │   │   ├── translation.py +│   │   │   │   │   └── translation_service.py +│   │   │   │   ├── static +│   │   │   │   │   ├── dashboard.html +│   │   │   │   │   ├── login.html +│   │   │   │   │   └── register.html +│   │   │   │   ├── templates +│   │   │   │   │   └── emails +│   │   │   │   │   ├── en +│   │   │   │   │   │   ├── notification.html +│   │   │   │   │   │   ├── password_reset.html +│   │   │   │   │   │   └── registration.html +│   │   │   │   │   └── hu +│   │   │   │   │   ├── notification.html +│   │   │   │   │   ├── password_reset.html +│   │   │   │   │   └── registration.html +│   │   │   │   ├── test_outside +│   │   │   │   │   ├── rdw_api_test.py +│   │   │   │   │   ├── rdw_zt646p_test.py +│   │   │   │   │   ├── robot_dashboard.py +│   │   │   │   │   ├── rontgen_felkesz_adatok.py +│   │   │   │   │   ├── rontgen_skript.py +│   │   │   │   │   └── sql_listak_md +│   │   │   │   ├── tests_internal +│   │   │   │   │   ├── diagnostics +│   │   │   │   │   │   ├── check_api.py +│   │   │   │   │   │   ├── compare_schema.py +│   │   │   │   │   │   ├── diagnose_system.py +│   │   │   │   │   │   ├── __init__.py +│   │   │   │   │   │   └── __pycache__ +│   │   │   │   │   │   ├── check_api.cpython-312.pyc +│   │   │   │   │   │   ├── compare_schema.cpython-312.pyc +│   │   │   │   │   │   ├── diagnose_system.cpython-312.pyc +│   │   │   │   │   │   └── __init__.cpython-312.pyc +│   │   │   │   │   ├── fixes +│   │   │   │   │   │   ├── final_admin_fix.py +│   │   │   │   │   │   ├── __init__.py +│   │   │   │   │   │   └── __pycache__ +│   │   │   │   │   │   ├── final_admin_fix.cpython-312.pyc +│   │   │   │   │   │   └── __init__.cpython-312.pyc +│   │   │   │   │   ├── __init__.py +│   │   │   │   │   ├── __pycache__ +│   │   │   │   │   │   └── __init__.cpython-312.pyc +│   │   │   │   │   ├── README.md +│   │   │   │   │   ├── seeds +│   │   │   │   │   │   ├── __init__.py +│   │   │   │   │   │   ├── __pycache__ +│   │   │   │   │   │   │   ├── __init__.cpython-312.pyc +│   │   │   │   │   │   │   ├── seed_catalog.cpython-312.pyc +│   │   │   │   │   │   │   ├── seed_expertises.cpython-312.pyc +│   │   │   │   │   │   │   └── seed_system.cpython-312.pyc +│   │   │   │   │   │   ├── seed_catalog.py +│   │   │   │   │   │   ├── seed_data.py +│   │   │   │   │   │   ├── seed_expertises.py +│   │   │   │   │   │   ├── seed_honda.py +│   │   │   │   │   │   ├── seed_system.py +│   │   │   │   │   │   └── seed_test_scenario.py +│   │   │   │   │   ├── test_functional.py +│   │   │   │   │   ├── test_gamification_flow.py +│   │   │   │   │   └── test_postgis.py +│   │   │   │   └── workers +│   │   │   │   ├── ocr +│   │   │   │   │   ├── __pycache__ +│   │   │   │   │   │   └── robot_1_ocr_processor.cpython-312.pyc +│   │   │   │   │   └── robot_1_ocr_processor.py +│   │   │   │   ├── __pycache__ +│   │   │   │   │   ├── alchemist_v2_2.cpython-312.pyc +│   │   │   │   │   ├── catalog_robot.cpython-312.pyc +│   │   │   │   │   ├── researcher_v2_1.cpython-312.pyc +│   │   │   │   │   └── robot0_priority_setter.cpython-312.pyc +│   │   │   │   ├── README.md +│   │   │   │   ├── service +│   │   │   │   │   ├── service_robot_1_scout_osm.py +│   │   │   │   │   ├── service_robot_3_enricher.py +│   │   │   │   │   └── service_robot_4_validator_google.py +│   │   │   │   ├── system +│   │   │   │   │   └── system_robot_2_service_auditor.py +│   │   │   │   └── vehicle +│   │   │   │   ├── vehicle_robot_0_discovery_engine.py +│   │   │   │   ├── vehicle_robot_0_strategist.py +│   │   │   │   ├── vehicle_robot_1_catalog_hunter.py +│   │   │   │   ├── vehicle_robot_1_catalog_hunter.py.old1.0 +│   │   │   │   ├── vehicle_robot_1_catalog_hunter.py.old.1.7 +│   │   │   │   ├── vehicle_robot_2_researcher.py +│   │   │   │   ├── vehicle_robot_2_researcher.py.old +│   │   │   │   ├── vehicle_robot_3_alchemist_pro_1.0.0.py +│   │   │   │   ├── vehicle_robot_3_alchemist_pro.py +│   │   │   │   └── vehicle_robot_4_vin_auditor.py +│   │   │   ├── discovery_bot.py.old +│   │   │   ├── Dockerfile +│   │   │   ├── frontend +│   │   │   ├── full_discovery_bot.py +│   │   │   ├── requirements.txt +│   │   │   ├── scrapers +│   │   │   │   └── vehicle_master_data.py +│   │   │   ├── seed_data.py +│   │   │   ├── seed_discovery.py +│   │   │   ├── seed_models.py +│   │   │   ├── seed_passenger_cars.py +│   │   │   ├── seed_vehicles.py +│   │   │   ├── static +│   │   │   │   ├── locales +│   │   │   │   │   ├── en.json +│   │   │   │   │   └── hu.json +│   │   │   │   └── previews +│   │   │   ├── temp +│   │   │   │   └── uploads +│   │   │   └── test_robot.py +│   │   ├── backup_manager.sh +│   │   +│   │   ├── docker-compose_1.9.9.yml +│   │   ├── docker-compose_sentinel.yml +│   │   ├── docker-compose.yml +│   │   ├── docs +│   │   │   └── V02 +│   │   │   ├── 000_Fejlesztendő_pontok.md +│   │   │   ├── 00_Összefoglaló_2026.02.23.md +│   │   │   ├── 00_README.md +│   │   │   ├── 01_Project_Overview.md +│   │   │   ├── 02_Architecture.md +│   │   │   ├── 03_Infrastructure_Operations.md +│   │   │   ├── 04_TCO_Költség-Taxonómia_&_Telemetria.md +│   │   │   ├── 05_Identity_Auth.md +│   │   │   ├── 06_Database_MDM.md +│   │   │   ├── 07_API_Service.md +│   │   │   ├── 08_Marketplace_Ajánlatkérés_és_Időpontfoglalás.md +│   │   │   ├── 09_Evidence_Store_&_Robot 3_(OCR_AI).md +│   │   │   ├── 10_Economy_Social.md +│   │   │   ├── 11_B2B_Flotta_és_Szervezeti_Szerepkörök.md +│   │   │   ├── 12_Automated_Events_Notifications_2.0.md +│   │   │   ├── 13_Roadmap_Testing_Pitfalls_2.0.md +│   │   │   ├── 19_Permissions_Tiers_Branches_2.0.md +│   │   │   ├── 22_Robot_Ecosystem.md +│   │   │   └── 99_Adattarolás.md +│ +│  +├ diff --git a/vehicle.modelfile b/vehicle.modelfile new file mode 100755 index 0000000..add888a --- /dev/null +++ b/vehicle.modelfile @@ -0,0 +1,18 @@ +FROM qwen2.5:7b + +# Alacsony hőmérséklet = maximális precizitás +PARAMETER temperature 0.1 + +SYSTEM """ +Te egy autóipari adat-kinyerő robot vagy. +A feladatod, hogy a megadott szövegből kinyerd a technikai adatokat. +KIZÁRÓLAG tiszta JSON-ben válaszolhatsz. Ne írj magyarázatot. + +A várt formátum: +{ + "ccm": szám vagy null, + "kw": szám vagy null, + "euro_class": szám vagy null, + "fuel_type": "Benzin" | "Dízel" | "Elektromos" | null +} +"""